Add packages to optimize svgs dynamically

These packages will be used to dynamically optimize SVG images
during the build.

R=jacktfranklin@chromium.org

Bug: 1216402
Change-Id: I04e95aa7d79c9d67beaf8a7861182c52b16b7d0f
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2939992
Reviewed-by: Jack Franklin <jacktfranklin@chromium.org>
Commit-Queue: Tim van der Lippe <tvanderlippe@chromium.org>
diff --git a/node_modules/.bin/svgo b/node_modules/.bin/svgo
new file mode 120000
index 0000000..d6a228b
--- /dev/null
+++ b/node_modules/.bin/svgo
@@ -0,0 +1 @@
+../svgo/bin/svgo
\ No newline at end of file
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
index ac3f81a..32ce636 100644
--- a/node_modules/.package-lock.json
+++ b/node_modules/.package-lock.json
@@ -436,6 +436,15 @@
         "unist-util-find-all-after": "^3.0.2"
       }
     },
+    "node_modules/@trysound/sax": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz",
+      "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==",
+      "dev": true,
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
     "node_modules/@types/babel-types": {
       "version": "7.0.9",
       "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.9.tgz",
@@ -924,6 +933,36 @@
       "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
       "dev": true
     },
+    "node_modules/@web/rollup-plugin-import-meta-assets": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/@web/rollup-plugin-import-meta-assets/-/rollup-plugin-import-meta-assets-1.0.6.tgz",
+      "integrity": "sha512-S0dsxrdyA/MHM6NjK84uFy2pwjC11LGL1Bh085CRAbSDCWY94KiSz9rm0gYPzU533jWSHxpHL+8U49nO/GL6uA==",
+      "dev": true,
+      "dependencies": {
+        "@rollup/pluginutils": "^4.1.0",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.25.7"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz",
+      "integrity": "sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==",
+      "dev": true,
+      "dependencies": {
+        "estree-walker": "^2.0.1",
+        "picomatch": "^2.2.2"
+      },
+      "engines": {
+        "node": ">= 8.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^1.20.0||^2.0.0"
+      }
+    },
     "node_modules/abbrev": {
       "version": "1.0.9",
       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
@@ -1278,6 +1317,12 @@
       "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
       "dev": true
     },
+    "node_modules/boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+      "dev": true
+    },
     "node_modules/brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -1743,6 +1788,111 @@
         "node": ">= 8"
       }
     },
+    "node_modules/css-select": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-3.1.2.tgz",
+      "integrity": "sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA==",
+      "dev": true,
+      "dependencies": {
+        "boolbase": "^1.0.0",
+        "css-what": "^4.0.0",
+        "domhandler": "^4.0.0",
+        "domutils": "^2.4.3",
+        "nth-check": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/css-select/node_modules/dom-serializer": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
+      "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
+      "dev": true,
+      "dependencies": {
+        "domelementtype": "^2.0.1",
+        "domhandler": "^4.2.0",
+        "entities": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+      }
+    },
+    "node_modules/css-select/node_modules/domelementtype": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
+      "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ]
+    },
+    "node_modules/css-select/node_modules/domhandler": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz",
+      "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==",
+      "dev": true,
+      "dependencies": {
+        "domelementtype": "^2.2.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
+      }
+    },
+    "node_modules/css-select/node_modules/domutils": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.6.0.tgz",
+      "integrity": "sha512-y0BezHuy4MDYxh6OvolXYsH+1EMGmFbwv5FKW7ovwMG6zTPWqNPq3WF9ayZssFq+UlKdffGLbOEaghNdaOm1WA==",
+      "dev": true,
+      "dependencies": {
+        "dom-serializer": "^1.0.1",
+        "domelementtype": "^2.2.0",
+        "domhandler": "^4.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domutils?sponsor=1"
+      }
+    },
+    "node_modules/css-select/node_modules/entities": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/css-tree": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+      "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+      "dev": true,
+      "dependencies": {
+        "mdn-data": "2.0.14",
+        "source-map": "^0.6.1"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/css-what": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-4.0.0.tgz",
+      "integrity": "sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==",
+      "dev": true,
+      "engines": {
+        "node": ">= 6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
     "node_modules/cssesc": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
@@ -1755,6 +1905,18 @@
         "node": ">=4"
       }
     },
+    "node_modules/csso": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+      "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+      "dev": true,
+      "dependencies": {
+        "css-tree": "^1.1.2"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
     "node_modules/custom-event": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
@@ -4440,6 +4602,12 @@
       "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
       "dev": true
     },
+    "node_modules/mdn-data": {
+      "version": "2.0.14",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+      "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+      "dev": true
+    },
     "node_modules/media-typer": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -4974,6 +5142,18 @@
       "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=",
       "dev": true
     },
+    "node_modules/nth-check": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz",
+      "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==",
+      "dev": true,
+      "dependencies": {
+        "boolbase": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/nth-check?sponsor=1"
+      }
+    },
     "node_modules/num2fraction": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
@@ -6336,6 +6516,12 @@
       "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
       "dev": true
     },
+    "node_modules/stable": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+      "dev": true
+    },
     "node_modules/statuses": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
@@ -6729,6 +6915,106 @@
       "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
       "dev": true
     },
+    "node_modules/svgo": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.0.tgz",
+      "integrity": "sha512-fz4IKjNO6HDPgIQxu4IxwtubtbSfGEAJUq/IXyTPIkGhWck/faiiwfkvsB8LnBkKLvSoyNNIY6d13lZprJMc9Q==",
+      "dev": true,
+      "dependencies": {
+        "@trysound/sax": "0.1.1",
+        "chalk": "^4.1.0",
+        "commander": "^7.1.0",
+        "css-select": "^3.1.2",
+        "css-tree": "^1.1.2",
+        "csso": "^4.2.0",
+        "stable": "^0.1.8"
+      },
+      "bin": {
+        "svgo": "bin/svgo"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/svgo/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/svgo/node_modules/chalk": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+      "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/svgo/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/svgo/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true
+    },
+    "node_modules/svgo/node_modules/commander": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/svgo/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/svgo/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/table": {
       "version": "6.7.0",
       "resolved": "https://registry.npmjs.org/table/-/table-6.7.0.tgz",
diff --git a/node_modules/@trysound/sax/LICENSE b/node_modules/@trysound/sax/LICENSE
new file mode 100644
index 0000000..19129e3
--- /dev/null
+++ b/node_modules/@trysound/sax/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/@trysound/sax/README.md b/node_modules/@trysound/sax/README.md
new file mode 100644
index 0000000..c43d2ac
--- /dev/null
+++ b/node_modules/@trysound/sax/README.md
@@ -0,0 +1,202 @@
+# svg/sax
+
+A maintained fork of [sax-js](https://github.com/isaacs/sax-js) sax-style parser for XML and HTML.
+
+Designed with [node](http://nodejs.org/) in mind, but should work fine in
+the browser or other CommonJS implementations.
+
+## What This Is
+
+* A very simple tool to parse through an XML string.
+* A stepping stone to a streaming HTML parser.
+* A handy way to deal with RSS and other mostly-ok-but-kinda-broken XML
+  docs.
+
+## What This Is (probably) Not
+
+* An HTML Parser - That's a fine goal, but this isn't it.  It's just
+  XML.
+* A DOM Builder - You can use it to build an object model out of XML,
+  but it doesn't do that out of the box.
+* XSLT - No DOM = no querying.
+* 100% Compliant with (some other SAX implementation) - Most SAX
+  implementations are in Java and do a lot more than this does.
+* An XML Validator - It does a little validation when in strict mode, but
+  not much.
+* A Schema-Aware XSD Thing - Schemas are an exercise in fetishistic
+  masochism.
+* A DTD-aware Thing - Fetching DTDs is a much bigger job.
+
+## Regarding `<!DOCTYPE`s and `<!ENTITY`s
+
+The parser will handle the basic XML entities in text nodes and attribute
+values: `&amp; &lt; &gt; &apos; &quot;`. It's possible to define additional
+entities in XML by putting them in the DTD. This parser doesn't do anything
+with that. If you want to listen to the `ondoctype` event, and then fetch
+the doctypes, and read the entities and add them to `parser.ENTITIES`, then
+be my guest.
+
+Unknown entities will fail in strict mode, and in loose mode, will pass
+through unmolested.
+
+## Usage
+
+```javascript
+var sax = require("./lib/sax"),
+  strict = true, // set to false for html-mode
+  parser = sax.parser(strict);
+
+parser.onerror = function (e) {
+  // an error happened.
+};
+parser.ontext = function (t) {
+  // got some text.  t is the string of text.
+};
+parser.onopentag = function (node) {
+  // opened a tag.  node has "name" and "attributes"
+};
+parser.onattribute = function (attr) {
+  // an attribute.  attr has "name" and "value"
+};
+parser.onend = function () {
+  // parser stream is done, and ready to have more stuff written to it.
+};
+
+parser.write('<xml>Hello, <who name="world">world</who>!</xml>').close();
+```
+
+
+## Arguments
+
+Pass the following arguments to the parser function.  All are optional.
+
+`strict` - Boolean. Whether or not to be a jerk. Default: `false`.
+
+`opt` - Object bag of settings regarding string formatting.  All default to `false`.
+
+Settings supported:
+
+* `trim` - Boolean. Whether or not to trim text and comment nodes.
+* `normalize` - Boolean. If true, then turn any whitespace into a single
+  space.
+* `lowercase` - Boolean. If true, then lowercase tag names and attribute names
+  in loose mode, rather than uppercasing them.
+* `xmlns` - Boolean. If true, then namespaces are supported.
+* `position` - Boolean. If false, then don't track line/col/position.
+* `strictEntities` - Boolean. If true, only parse [predefined XML
+  entities](http://www.w3.org/TR/REC-xml/#sec-predefined-ent)
+  (`&amp;`, `&apos;`, `&gt;`, `&lt;`, and `&quot;`)
+
+## Methods
+
+`write` - Write bytes onto the stream. You don't have to do this all at
+once. You can keep writing as much as you want.
+
+`close` - Close the stream. Once closed, no more data may be written until
+it is done processing the buffer, which is signaled by the `end` event.
+
+`resume` - To gracefully handle errors, assign a listener to the `error`
+event. Then, when the error is taken care of, you can call `resume` to
+continue parsing. Otherwise, the parser will not continue while in an error
+state.
+
+## Members
+
+At all times, the parser object will have the following members:
+
+`line`, `column`, `position` - Indications of the position in the XML
+document where the parser currently is looking.
+
+`startTagPosition` - Indicates the position where the current tag starts.
+
+`closed` - Boolean indicating whether or not the parser can be written to.
+If it's `true`, then wait for the `ready` event to write again.
+
+`strict` - Boolean indicating whether or not the parser is a jerk.
+
+`opt` - Any options passed into the constructor.
+
+`tag` - The current tag being dealt with.
+
+And a bunch of other stuff that you probably shouldn't touch.
+
+## Events
+
+All events emit with a single argument. To listen to an event, assign a
+function to `on<eventname>`. Functions get executed in the this-context of
+the parser object. The list of supported events are also in the exported
+`EVENTS` array.
+
+`error` - Indication that something bad happened. The error will be hanging
+out on `parser.error`, and must be deleted before parsing can continue. By
+listening to this event, you can keep an eye on that kind of stuff. Note:
+this happens *much* more in strict mode. Argument: instance of `Error`.
+
+`text` - Text node. Argument: string of text.
+
+`doctype` - The `<!DOCTYPE` declaration. Argument: doctype string.
+
+`processinginstruction` - Stuff like `<?xml foo="blerg" ?>`. Argument:
+object with `name` and `body` members. Attributes are not parsed, as
+processing instructions have implementation dependent semantics.
+
+`sgmldeclaration` - Random SGML declarations. Stuff like `<!ENTITY p>`
+would trigger this kind of event. This is a weird thing to support, so it
+might go away at some point. SAX isn't intended to be used to parse SGML,
+after all.
+
+`opentagstart` - Emitted immediately when the tag name is available,
+but before any attributes are encountered.  Argument: object with a
+`name` field and an empty `attributes` set.  Note that this is the
+same object that will later be emitted in the `opentag` event.
+
+`opentag` - An opening tag. Argument: object with `name` and `attributes`.
+In non-strict mode, tag names are uppercased, unless the `lowercase`
+option is set.  If the `xmlns` option is set, then it will contain
+namespace binding information on the `ns` member, and will have a
+`local`, `prefix`, and `uri` member.
+
+`closetag` - A closing tag. In loose mode, tags are auto-closed if their
+parent closes. In strict mode, well-formedness is enforced. Note that
+self-closing tags will have `closeTag` emitted immediately after `openTag`.
+Argument: tag name.
+
+`attribute` - An attribute node.  Argument: object with `name` and `value`.
+In non-strict mode, attribute names are uppercased, unless the `lowercase`
+option is set.  If the `xmlns` option is set, it will also contains namespace
+information.
+
+`comment` - A comment node.  Argument: the string of the comment.
+
+`opencdata` - The opening tag of a `<![CDATA[` block.
+
+`cdata` - The text of a `<![CDATA[` block. Since `<![CDATA[` blocks can get
+quite large, this event may fire multiple times for a single block, if it
+is broken up into multiple `write()`s. Argument: the string of random
+character data.
+
+`closecdata` - The closing tag (`]]>`) of a `<![CDATA[` block.
+
+`opennamespace` - If the `xmlns` option is set, then this event will
+signal the start of a new namespace binding.
+
+`closenamespace` - If the `xmlns` option is set, then this event will
+signal the end of a namespace binding.
+
+`end` - Indication that the closed stream has ended.
+
+`ready` - Indication that the stream has reset, and is ready to be written
+to.
+
+`noscript` - In non-strict mode, `<script>` tags trigger a `"script"`
+event, and their contents are not checked for special xml characters.
+If you pass `noscript: true`, then this behavior is suppressed.
+
+## Reporting Problems
+
+It's best to write a failing test if you find an issue.  I will always
+accept pull requests with failing tests if they demonstrate intended
+behavior, but it is very hard to figure out what issue you're describing
+without a test.  Writing a test is also the best way for you yourself
+to figure out if you really understand the issue you think you have with
+sax-js.
diff --git a/node_modules/@trysound/sax/lib/sax.js b/node_modules/@trysound/sax/lib/sax.js
new file mode 100644
index 0000000..7b4b1c7
--- /dev/null
+++ b/node_modules/@trysound/sax/lib/sax.js
@@ -0,0 +1,1411 @@
+;(function (sax) { // wrapper for non-node envs
+  sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
+  sax.SAXParser = SAXParser
+
+  // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
+  // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
+  // since that's the earliest that a buffer overrun could occur.  This way, checks are
+  // as rare as required, but as often as necessary to ensure never crossing this bound.
+  // Furthermore, buffers are only tested at most once per write(), so passing a very
+  // large string into write() might have undesirable effects, but this is manageable by
+  // the caller, so it is assumed to be safe.  Thus, a call to write() may, in the extreme
+  // edge case, result in creating at most one complete copy of the string passed in.
+  // Set to Infinity to have unlimited buffers.
+  sax.MAX_BUFFER_LENGTH = 64 * 1024
+
+  var buffers = [
+    'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',
+    'procInstName', 'procInstBody', 'entity', 'attribName',
+    'attribValue', 'cdata', 'script'
+  ]
+
+  sax.EVENTS = [
+    'text',
+    'processinginstruction',
+    'sgmldeclaration',
+    'doctype',
+    'comment',
+    'opentagstart',
+    'attribute',
+    'opentag',
+    'closetag',
+    'opencdata',
+    'cdata',
+    'closecdata',
+    'error',
+    'end',
+    'ready',
+    'script',
+    'opennamespace',
+    'closenamespace'
+  ]
+
+  function SAXParser (strict, opt) {
+    if (!(this instanceof SAXParser)) {
+      return new SAXParser(strict, opt)
+    }
+
+    var parser = this
+    clearBuffers(parser)
+    parser.q = parser.c = ''
+    parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
+    parser.opt = opt || {}
+    parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags
+    parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'
+    parser.tags = []
+    parser.closed = parser.closedRoot = parser.sawRoot = false
+    parser.tag = parser.error = null
+    parser.strict = !!strict
+    parser.noscript = !!(strict || parser.opt.noscript)
+    parser.state = S.BEGIN
+    parser.strictEntities = parser.opt.strictEntities
+    parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)
+    parser.attribList = []
+
+    // namespaces form a prototype chain.
+    // it always points at the current tag,
+    // which protos to its parent tag.
+    if (parser.opt.xmlns) {
+      parser.ns = Object.create(rootNS)
+    }
+
+    // mostly just for error reporting
+    parser.trackPosition = parser.opt.position !== false
+    if (parser.trackPosition) {
+      parser.position = parser.line = parser.column = 0
+    }
+    emit(parser, 'onready')
+  }
+
+  if (!Object.create) {
+    Object.create = function (o) {
+      function F () {}
+      F.prototype = o
+      var newf = new F()
+      return newf
+    }
+  }
+
+  if (!Object.keys) {
+    Object.keys = function (o) {
+      var a = []
+      for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
+      return a
+    }
+  }
+
+  function checkBufferLength (parser) {
+    var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
+    var maxActual = 0
+    for (var i = 0, l = buffers.length; i < l; i++) {
+      var len = parser[buffers[i]].length
+      if (len > maxAllowed) {
+        // Text/cdata nodes can get big, and since they're buffered,
+        // we can get here under normal conditions.
+        // Avoid issues by emitting the text node now,
+        // so at least it won't get any bigger.
+        switch (buffers[i]) {
+          case 'textNode':
+            closeText(parser)
+            break
+
+          case 'cdata':
+            emitNode(parser, 'oncdata', parser.cdata)
+            parser.cdata = ''
+            break
+
+          case 'script':
+            emitNode(parser, 'onscript', parser.script)
+            parser.script = ''
+            break
+
+          default:
+            error(parser, 'Max buffer length exceeded: ' + buffers[i])
+        }
+      }
+      maxActual = Math.max(maxActual, len)
+    }
+    // schedule the next check for the earliest possible buffer overrun.
+    var m = sax.MAX_BUFFER_LENGTH - maxActual
+    parser.bufferCheckPosition = m + parser.position
+  }
+
+  function clearBuffers (parser) {
+    for (var i = 0, l = buffers.length; i < l; i++) {
+      parser[buffers[i]] = ''
+    }
+  }
+
+  function flushBuffers (parser) {
+    closeText(parser)
+    if (parser.cdata !== '') {
+      emitNode(parser, 'oncdata', parser.cdata)
+      parser.cdata = ''
+    }
+    if (parser.script !== '') {
+      emitNode(parser, 'onscript', parser.script)
+      parser.script = ''
+    }
+  }
+
+  SAXParser.prototype = {
+    end: function () { end(this) },
+    write: write,
+    resume: function () { this.error = null; return this },
+    close: function () { return this.write(null) },
+    flush: function () { flushBuffers(this) }
+  }
+
+  // this really needs to be replaced with character classes.
+  // XML allows all manner of ridiculous numbers and digits.
+  var CDATA = '[CDATA['
+  var DOCTYPE = 'DOCTYPE'
+  var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'
+  var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'
+  var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }
+
+  // http://www.w3.org/TR/REC-xml/#NT-NameStartChar
+  // This implementation works on strings, a single character at a time
+  // as such, it cannot ever support astral-plane characters (10000-EFFFF)
+  // without a significant breaking change to either this  parser, or the
+  // JavaScript language.  Implementation of an emoji-capable xml parser
+  // is left as an exercise for the reader.
+  var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
+
+  var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/
+
+  var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
+  var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/
+
+  function isWhitespace (c) {
+    return c === ' ' || c === '\n' || c === '\r' || c === '\t'
+  }
+
+  function isQuote (c) {
+    return c === '"' || c === '\''
+  }
+
+  function isAttribEnd (c) {
+    return c === '>' || isWhitespace(c)
+  }
+
+  function isMatch (regex, c) {
+    return regex.test(c)
+  }
+
+  function notMatch (regex, c) {
+    return !isMatch(regex, c)
+  }
+
+  var S = 0
+  sax.STATE = {
+    BEGIN: S++, // leading byte order mark or whitespace
+    BEGIN_WHITESPACE: S++, // leading whitespace
+    TEXT: S++, // general stuff
+    TEXT_ENTITY: S++, // &amp and such.
+    OPEN_WAKA: S++, // <
+    SGML_DECL: S++, // <!BLARG
+    SGML_DECL_QUOTED: S++, // <!BLARG foo "bar
+    DOCTYPE: S++, // <!DOCTYPE
+    DOCTYPE_QUOTED: S++, // <!DOCTYPE "//blah
+    DOCTYPE_DTD: S++, // <!DOCTYPE "//blah" [ ...
+    DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE "//blah" [ "foo
+    COMMENT_STARTING: S++, // <!-
+    COMMENT: S++, // <!--
+    COMMENT_ENDING: S++, // <!-- blah -
+    COMMENT_ENDED: S++, // <!-- blah --
+    CDATA: S++, // <![CDATA[ something
+    CDATA_ENDING: S++, // ]
+    CDATA_ENDING_2: S++, // ]]
+    PROC_INST: S++, // <?hi
+    PROC_INST_BODY: S++, // <?hi there
+    PROC_INST_ENDING: S++, // <?hi "there" ?
+    OPEN_TAG: S++, // <strong
+    OPEN_TAG_SLASH: S++, // <strong /
+    ATTRIB: S++, // <a
+    ATTRIB_NAME: S++, // <a foo
+    ATTRIB_NAME_SAW_WHITE: S++, // <a foo _
+    ATTRIB_VALUE: S++, // <a foo=
+    ATTRIB_VALUE_QUOTED: S++, // <a foo="bar
+    ATTRIB_VALUE_CLOSED: S++, // <a foo="bar"
+    ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar
+    ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar="&quot;"
+    ATTRIB_VALUE_ENTITY_U: S++, // <foo bar=&quot
+    CLOSE_TAG: S++, // </a
+    CLOSE_TAG_SAW_WHITE: S++, // </a   >
+    SCRIPT: S++, // <script> ...
+    SCRIPT_ENDING: S++ // <script> ... <
+  }
+
+  sax.XML_ENTITIES = {
+    'amp': '&',
+    'gt': '>',
+    'lt': '<',
+    'quot': '"',
+    'apos': "'"
+  }
+
+  sax.ENTITIES = {
+    'amp': '&',
+    'gt': '>',
+    'lt': '<',
+    'quot': '"',
+    'apos': "'",
+    'AElig': 198,
+    'Aacute': 193,
+    'Acirc': 194,
+    'Agrave': 192,
+    'Aring': 197,
+    'Atilde': 195,
+    'Auml': 196,
+    'Ccedil': 199,
+    'ETH': 208,
+    'Eacute': 201,
+    'Ecirc': 202,
+    'Egrave': 200,
+    'Euml': 203,
+    'Iacute': 205,
+    'Icirc': 206,
+    'Igrave': 204,
+    'Iuml': 207,
+    'Ntilde': 209,
+    'Oacute': 211,
+    'Ocirc': 212,
+    'Ograve': 210,
+    'Oslash': 216,
+    'Otilde': 213,
+    'Ouml': 214,
+    'THORN': 222,
+    'Uacute': 218,
+    'Ucirc': 219,
+    'Ugrave': 217,
+    'Uuml': 220,
+    'Yacute': 221,
+    'aacute': 225,
+    'acirc': 226,
+    'aelig': 230,
+    'agrave': 224,
+    'aring': 229,
+    'atilde': 227,
+    'auml': 228,
+    'ccedil': 231,
+    'eacute': 233,
+    'ecirc': 234,
+    'egrave': 232,
+    'eth': 240,
+    'euml': 235,
+    'iacute': 237,
+    'icirc': 238,
+    'igrave': 236,
+    'iuml': 239,
+    'ntilde': 241,
+    'oacute': 243,
+    'ocirc': 244,
+    'ograve': 242,
+    'oslash': 248,
+    'otilde': 245,
+    'ouml': 246,
+    'szlig': 223,
+    'thorn': 254,
+    'uacute': 250,
+    'ucirc': 251,
+    'ugrave': 249,
+    'uuml': 252,
+    'yacute': 253,
+    'yuml': 255,
+    'copy': 169,
+    'reg': 174,
+    'nbsp': 160,
+    'iexcl': 161,
+    'cent': 162,
+    'pound': 163,
+    'curren': 164,
+    'yen': 165,
+    'brvbar': 166,
+    'sect': 167,
+    'uml': 168,
+    'ordf': 170,
+    'laquo': 171,
+    'not': 172,
+    'shy': 173,
+    'macr': 175,
+    'deg': 176,
+    'plusmn': 177,
+    'sup1': 185,
+    'sup2': 178,
+    'sup3': 179,
+    'acute': 180,
+    'micro': 181,
+    'para': 182,
+    'middot': 183,
+    'cedil': 184,
+    'ordm': 186,
+    'raquo': 187,
+    'frac14': 188,
+    'frac12': 189,
+    'frac34': 190,
+    'iquest': 191,
+    'times': 215,
+    'divide': 247,
+    'OElig': 338,
+    'oelig': 339,
+    'Scaron': 352,
+    'scaron': 353,
+    'Yuml': 376,
+    'fnof': 402,
+    'circ': 710,
+    'tilde': 732,
+    'Alpha': 913,
+    'Beta': 914,
+    'Gamma': 915,
+    'Delta': 916,
+    'Epsilon': 917,
+    'Zeta': 918,
+    'Eta': 919,
+    'Theta': 920,
+    'Iota': 921,
+    'Kappa': 922,
+    'Lambda': 923,
+    'Mu': 924,
+    'Nu': 925,
+    'Xi': 926,
+    'Omicron': 927,
+    'Pi': 928,
+    'Rho': 929,
+    'Sigma': 931,
+    'Tau': 932,
+    'Upsilon': 933,
+    'Phi': 934,
+    'Chi': 935,
+    'Psi': 936,
+    'Omega': 937,
+    'alpha': 945,
+    'beta': 946,
+    'gamma': 947,
+    'delta': 948,
+    'epsilon': 949,
+    'zeta': 950,
+    'eta': 951,
+    'theta': 952,
+    'iota': 953,
+    'kappa': 954,
+    'lambda': 955,
+    'mu': 956,
+    'nu': 957,
+    'xi': 958,
+    'omicron': 959,
+    'pi': 960,
+    'rho': 961,
+    'sigmaf': 962,
+    'sigma': 963,
+    'tau': 964,
+    'upsilon': 965,
+    'phi': 966,
+    'chi': 967,
+    'psi': 968,
+    'omega': 969,
+    'thetasym': 977,
+    'upsih': 978,
+    'piv': 982,
+    'ensp': 8194,
+    'emsp': 8195,
+    'thinsp': 8201,
+    'zwnj': 8204,
+    'zwj': 8205,
+    'lrm': 8206,
+    'rlm': 8207,
+    'ndash': 8211,
+    'mdash': 8212,
+    'lsquo': 8216,
+    'rsquo': 8217,
+    'sbquo': 8218,
+    'ldquo': 8220,
+    'rdquo': 8221,
+    'bdquo': 8222,
+    'dagger': 8224,
+    'Dagger': 8225,
+    'bull': 8226,
+    'hellip': 8230,
+    'permil': 8240,
+    'prime': 8242,
+    'Prime': 8243,
+    'lsaquo': 8249,
+    'rsaquo': 8250,
+    'oline': 8254,
+    'frasl': 8260,
+    'euro': 8364,
+    'image': 8465,
+    'weierp': 8472,
+    'real': 8476,
+    'trade': 8482,
+    'alefsym': 8501,
+    'larr': 8592,
+    'uarr': 8593,
+    'rarr': 8594,
+    'darr': 8595,
+    'harr': 8596,
+    'crarr': 8629,
+    'lArr': 8656,
+    'uArr': 8657,
+    'rArr': 8658,
+    'dArr': 8659,
+    'hArr': 8660,
+    'forall': 8704,
+    'part': 8706,
+    'exist': 8707,
+    'empty': 8709,
+    'nabla': 8711,
+    'isin': 8712,
+    'notin': 8713,
+    'ni': 8715,
+    'prod': 8719,
+    'sum': 8721,
+    'minus': 8722,
+    'lowast': 8727,
+    'radic': 8730,
+    'prop': 8733,
+    'infin': 8734,
+    'ang': 8736,
+    'and': 8743,
+    'or': 8744,
+    'cap': 8745,
+    'cup': 8746,
+    'int': 8747,
+    'there4': 8756,
+    'sim': 8764,
+    'cong': 8773,
+    'asymp': 8776,
+    'ne': 8800,
+    'equiv': 8801,
+    'le': 8804,
+    'ge': 8805,
+    'sub': 8834,
+    'sup': 8835,
+    'nsub': 8836,
+    'sube': 8838,
+    'supe': 8839,
+    'oplus': 8853,
+    'otimes': 8855,
+    'perp': 8869,
+    'sdot': 8901,
+    'lceil': 8968,
+    'rceil': 8969,
+    'lfloor': 8970,
+    'rfloor': 8971,
+    'lang': 9001,
+    'rang': 9002,
+    'loz': 9674,
+    'spades': 9824,
+    'clubs': 9827,
+    'hearts': 9829,
+    'diams': 9830
+  }
+
+  Object.keys(sax.ENTITIES).forEach(function (key) {
+    var e = sax.ENTITIES[key]
+    var s = typeof e === 'number' ? String.fromCharCode(e) : e
+    sax.ENTITIES[key] = s
+  })
+
+  for (var s in sax.STATE) {
+    sax.STATE[sax.STATE[s]] = s
+  }
+
+  // shorthand
+  S = sax.STATE
+
+  function emit (parser, event, data) {
+    parser[event] && parser[event](data)
+  }
+
+  function emitNode (parser, nodeType, data) {
+    if (parser.textNode) closeText(parser)
+    emit(parser, nodeType, data)
+  }
+
+  function closeText (parser) {
+    parser.textNode = textopts(parser.opt, parser.textNode)
+    if (parser.textNode) emit(parser, 'ontext', parser.textNode)
+    parser.textNode = ''
+  }
+
+  function textopts (opt, text) {
+    if (opt.trim) text = text.trim()
+    if (opt.normalize) text = text.replace(/\s+/g, ' ')
+    return text
+  }
+
+  function error (parser, er) {
+    closeText(parser)
+    if (parser.trackPosition) {
+      er += '\nLine: ' + parser.line +
+        '\nColumn: ' + parser.column +
+        '\nChar: ' + parser.c
+    }
+    er = new Error(er)
+    parser.error = er
+    emit(parser, 'onerror', er)
+    return parser
+  }
+
+  function end (parser) {
+    if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')
+    if ((parser.state !== S.BEGIN) &&
+      (parser.state !== S.BEGIN_WHITESPACE) &&
+      (parser.state !== S.TEXT)) {
+      error(parser, 'Unexpected end')
+    }
+    closeText(parser)
+    parser.c = ''
+    parser.closed = true
+    emit(parser, 'onend')
+    SAXParser.call(parser, parser.strict, parser.opt)
+    return parser
+  }
+
+  function strictFail (parser, message) {
+    if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {
+      throw new Error('bad call to strictFail')
+    }
+    if (parser.strict) {
+      error(parser, message)
+    }
+  }
+
+  function newTag (parser) {
+    if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()
+    var parent = parser.tags[parser.tags.length - 1] || parser
+    var tag = parser.tag = { name: parser.tagName, attributes: {} }
+
+    // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar"
+    if (parser.opt.xmlns) {
+      tag.ns = parent.ns
+    }
+    parser.attribList.length = 0
+    emitNode(parser, 'onopentagstart', tag)
+  }
+
+  function qname (name, attribute) {
+    var i = name.indexOf(':')
+    var qualName = i < 0 ? [ '', name ] : name.split(':')
+    var prefix = qualName[0]
+    var local = qualName[1]
+
+    // <x "xmlns"="http://foo">
+    if (attribute && name === 'xmlns') {
+      prefix = 'xmlns'
+      local = ''
+    }
+
+    return { prefix: prefix, local: local }
+  }
+
+  function attrib (parser) {
+    if (!parser.strict) {
+      parser.attribName = parser.attribName[parser.looseCase]()
+    }
+
+    if (parser.attribList.indexOf(parser.attribName) !== -1 ||
+      parser.tag.attributes.hasOwnProperty(parser.attribName)) {
+      parser.attribName = parser.attribValue = ''
+      return
+    }
+
+    if (parser.opt.xmlns) {
+      var qn = qname(parser.attribName, true)
+      var prefix = qn.prefix
+      var local = qn.local
+
+      if (prefix === 'xmlns') {
+        // namespace binding attribute. push the binding into scope
+        if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {
+          strictFail(parser,
+            'xml: prefix must be bound to ' + XML_NAMESPACE + '\n' +
+            'Actual: ' + parser.attribValue)
+        } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {
+          strictFail(parser,
+            'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\n' +
+            'Actual: ' + parser.attribValue)
+        } else {
+          var tag = parser.tag
+          var parent = parser.tags[parser.tags.length - 1] || parser
+          if (tag.ns === parent.ns) {
+            tag.ns = Object.create(parent.ns)
+          }
+          tag.ns[local] = parser.attribValue
+        }
+      }
+
+      // defer onattribute events until all attributes have been seen
+      // so any new bindings can take effect. preserve attribute order
+      // so deferred events can be emitted in document order
+      parser.attribList.push([parser.attribName, parser.attribValue])
+    } else {
+      // in non-xmlns mode, we can emit the event right away
+      parser.tag.attributes[parser.attribName] = parser.attribValue
+      emitNode(parser, 'onattribute', {
+        name: parser.attribName,
+        value: parser.attribValue
+      })
+    }
+
+    parser.attribName = parser.attribValue = ''
+  }
+
+  function openTag (parser, selfClosing) {
+    if (parser.opt.xmlns) {
+      // emit namespace binding events
+      var tag = parser.tag
+
+      // add namespace info to tag
+      var qn = qname(parser.tagName)
+      tag.prefix = qn.prefix
+      tag.local = qn.local
+      tag.uri = tag.ns[qn.prefix] || ''
+
+      if (tag.prefix && !tag.uri) {
+        strictFail(parser, 'Unbound namespace prefix: ' +
+          JSON.stringify(parser.tagName))
+        tag.uri = qn.prefix
+      }
+
+      var parent = parser.tags[parser.tags.length - 1] || parser
+      if (tag.ns && parent.ns !== tag.ns) {
+        Object.keys(tag.ns).forEach(function (p) {
+          emitNode(parser, 'onopennamespace', {
+            prefix: p,
+            uri: tag.ns[p]
+          })
+        })
+      }
+
+      // handle deferred onattribute events
+      // Note: do not apply default ns to attributes:
+      //   http://www.w3.org/TR/REC-xml-names/#defaulting
+      for (var i = 0, l = parser.attribList.length; i < l; i++) {
+        var nv = parser.attribList[i]
+        var name = nv[0]
+        var value = nv[1]
+        var qualName = qname(name, true)
+        var prefix = qualName.prefix
+        var local = qualName.local
+        var uri = prefix === '' ? '' : (tag.ns[prefix] || '')
+        var a = {
+          name: name,
+          value: value,
+          prefix: prefix,
+          local: local,
+          uri: uri
+        }
+
+        // if there's any attributes with an undefined namespace,
+        // then fail on them now.
+        if (prefix && prefix !== 'xmlns' && !uri) {
+          strictFail(parser, 'Unbound namespace prefix: ' +
+            JSON.stringify(prefix))
+          a.uri = prefix
+        }
+        parser.tag.attributes[name] = a
+        emitNode(parser, 'onattribute', a)
+      }
+      parser.attribList.length = 0
+    }
+
+    parser.tag.isSelfClosing = !!selfClosing
+
+    // process the tag
+    parser.sawRoot = true
+    parser.tags.push(parser.tag)
+    emitNode(parser, 'onopentag', parser.tag)
+    if (!selfClosing) {
+      // special case for <script> in non-strict mode.
+      if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {
+        parser.state = S.SCRIPT
+      } else {
+        parser.state = S.TEXT
+      }
+      parser.tag = null
+      parser.tagName = ''
+    }
+    parser.attribName = parser.attribValue = ''
+    parser.attribList.length = 0
+  }
+
+  function closeTag (parser) {
+    if (!parser.tagName) {
+      strictFail(parser, 'Weird empty close tag.')
+      parser.textNode += '</>'
+      parser.state = S.TEXT
+      return
+    }
+
+    if (parser.script) {
+      if (parser.tagName !== 'script') {
+        parser.script += '</' + parser.tagName + '>'
+        parser.tagName = ''
+        parser.state = S.SCRIPT
+        return
+      }
+      emitNode(parser, 'onscript', parser.script)
+      parser.script = ''
+    }
+
+    // first make sure that the closing tag actually exists.
+    // <a><b></c></b></a> will close everything, otherwise.
+    var t = parser.tags.length
+    var tagName = parser.tagName
+    if (!parser.strict) {
+      tagName = tagName[parser.looseCase]()
+    }
+    var closeTo = tagName
+    while (t--) {
+      var close = parser.tags[t]
+      if (close.name !== closeTo) {
+        // fail the first time in strict mode
+        strictFail(parser, 'Unexpected close tag')
+      } else {
+        break
+      }
+    }
+
+    // didn't find it.  we already failed for strict, so just abort.
+    if (t < 0) {
+      strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)
+      parser.textNode += '</' + parser.tagName + '>'
+      parser.state = S.TEXT
+      return
+    }
+    parser.tagName = tagName
+    var s = parser.tags.length
+    while (s-- > t) {
+      var tag = parser.tag = parser.tags.pop()
+      parser.tagName = parser.tag.name
+      emitNode(parser, 'onclosetag', parser.tagName)
+
+      var x = {}
+      for (var i in tag.ns) {
+        x[i] = tag.ns[i]
+      }
+
+      var parent = parser.tags[parser.tags.length - 1] || parser
+      if (parser.opt.xmlns && tag.ns !== parent.ns) {
+        // remove namespace bindings introduced by tag
+        Object.keys(tag.ns).forEach(function (p) {
+          var n = tag.ns[p]
+          emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })
+        })
+      }
+    }
+    if (t === 0) parser.closedRoot = true
+    parser.tagName = parser.attribValue = parser.attribName = ''
+    parser.attribList.length = 0
+    parser.state = S.TEXT
+  }
+
+  function parseEntity (parser) {
+    var entity = parser.entity
+    var entityLC = entity.toLowerCase()
+    var num
+    var numStr = ''
+
+    if (parser.ENTITIES[entity]) {
+      return parser.ENTITIES[entity]
+    }
+    if (parser.ENTITIES[entityLC]) {
+      return parser.ENTITIES[entityLC]
+    }
+    entity = entityLC
+    if (entity.charAt(0) === '#') {
+      if (entity.charAt(1) === 'x') {
+        entity = entity.slice(2)
+        num = parseInt(entity, 16)
+        numStr = num.toString(16)
+      } else {
+        entity = entity.slice(1)
+        num = parseInt(entity, 10)
+        numStr = num.toString(10)
+      }
+    }
+    entity = entity.replace(/^0+/, '')
+    if (isNaN(num) || numStr.toLowerCase() !== entity) {
+      strictFail(parser, 'Invalid character entity')
+      return '&' + parser.entity + ';'
+    }
+
+    return String.fromCodePoint(num)
+  }
+
+  function beginWhiteSpace (parser, c) {
+    if (c === '<') {
+      parser.state = S.OPEN_WAKA
+      parser.startTagPosition = parser.position
+    } else if (!isWhitespace(c)) {
+      // have to process this as a text node.
+      // weird, but happens.
+      strictFail(parser, 'Non-whitespace before first tag.')
+      parser.textNode = c
+      parser.state = S.TEXT
+    }
+  }
+
+  function charAt (chunk, i) {
+    var result = ''
+    if (i < chunk.length) {
+      result = chunk.charAt(i)
+    }
+    return result
+  }
+
+  function write (chunk) {
+    var parser = this
+    if (this.error) {
+      throw this.error
+    }
+    if (parser.closed) {
+      return error(parser,
+        'Cannot write after close. Assign an onready handler.')
+    }
+    if (chunk === null) {
+      return end(parser)
+    }
+    if (typeof chunk === 'object') {
+      chunk = chunk.toString()
+    }
+    var i = 0
+    var c = ''
+    while (true) {
+      c = charAt(chunk, i++)
+      parser.c = c
+
+      if (!c) {
+        break
+      }
+
+      if (parser.trackPosition) {
+        parser.position++
+        if (c === '\n') {
+          parser.line++
+          parser.column = 0
+        } else {
+          parser.column++
+        }
+      }
+
+      switch (parser.state) {
+        case S.BEGIN:
+          parser.state = S.BEGIN_WHITESPACE
+          if (c === '\uFEFF') {
+            continue
+          }
+          beginWhiteSpace(parser, c)
+          continue
+
+        case S.BEGIN_WHITESPACE:
+          beginWhiteSpace(parser, c)
+          continue
+
+        case S.TEXT:
+          if (parser.sawRoot && !parser.closedRoot) {
+            var starti = i - 1
+            while (c && c !== '<' && c !== '&') {
+              c = charAt(chunk, i++)
+              if (c && parser.trackPosition) {
+                parser.position++
+                if (c === '\n') {
+                  parser.line++
+                  parser.column = 0
+                } else {
+                  parser.column++
+                }
+              }
+            }
+            parser.textNode += chunk.substring(starti, i - 1)
+          }
+          if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {
+            parser.state = S.OPEN_WAKA
+            parser.startTagPosition = parser.position
+          } else {
+            if (!isWhitespace(c) && (!parser.sawRoot || parser.closedRoot)) {
+              strictFail(parser, 'Text data outside of root node.')
+            }
+            if (c === '&') {
+              parser.state = S.TEXT_ENTITY
+            } else {
+              parser.textNode += c
+            }
+          }
+          continue
+
+        case S.SCRIPT:
+          // only non-strict
+          if (c === '<') {
+            parser.state = S.SCRIPT_ENDING
+          } else {
+            parser.script += c
+          }
+          continue
+
+        case S.SCRIPT_ENDING:
+          if (c === '/') {
+            parser.state = S.CLOSE_TAG
+          } else {
+            parser.script += '<' + c
+            parser.state = S.SCRIPT
+          }
+          continue
+
+        case S.OPEN_WAKA:
+          // either a /, ?, !, or text is coming next.
+          if (c === '!') {
+            parser.state = S.SGML_DECL
+            parser.sgmlDecl = ''
+          } else if (isWhitespace(c)) {
+            // wait for it...
+          } else if (isMatch(nameStart, c)) {
+            parser.state = S.OPEN_TAG
+            parser.tagName = c
+          } else if (c === '/') {
+            parser.state = S.CLOSE_TAG
+            parser.tagName = ''
+          } else if (c === '?') {
+            parser.state = S.PROC_INST
+            parser.procInstName = parser.procInstBody = ''
+          } else {
+            strictFail(parser, 'Unencoded <')
+            // if there was some whitespace, then add that in.
+            if (parser.startTagPosition + 1 < parser.position) {
+              var pad = parser.position - parser.startTagPosition
+              c = new Array(pad).join(' ') + c
+            }
+            parser.textNode += '<' + c
+            parser.state = S.TEXT
+          }
+          continue
+
+        case S.SGML_DECL:
+          if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {
+            emitNode(parser, 'onopencdata')
+            parser.state = S.CDATA
+            parser.sgmlDecl = ''
+            parser.cdata = ''
+          } else if (parser.sgmlDecl + c === '--') {
+            parser.state = S.COMMENT
+            parser.comment = ''
+            parser.sgmlDecl = ''
+          } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {
+            parser.state = S.DOCTYPE
+            if (parser.doctype || parser.sawRoot) {
+              strictFail(parser,
+                'Inappropriately located doctype declaration')
+            }
+            parser.doctype = ''
+            parser.sgmlDecl = ''
+          } else if (c === '>') {
+            emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)
+            parser.sgmlDecl = ''
+            parser.state = S.TEXT
+          } else if (isQuote(c)) {
+            parser.state = S.SGML_DECL_QUOTED
+            parser.sgmlDecl += c
+          } else {
+            parser.sgmlDecl += c
+          }
+          continue
+
+        case S.SGML_DECL_QUOTED:
+          if (c === parser.q) {
+            parser.state = S.SGML_DECL
+            parser.q = ''
+          }
+          parser.sgmlDecl += c
+          continue
+
+        case S.DOCTYPE:
+          if (c === '>') {
+            parser.state = S.TEXT
+            emitNode(parser, 'ondoctype', parser.doctype)
+            parser.doctype = true // just remember that we saw it.
+          } else {
+            parser.doctype += c
+            if (c === '[') {
+              parser.state = S.DOCTYPE_DTD
+            } else if (isQuote(c)) {
+              parser.state = S.DOCTYPE_QUOTED
+              parser.q = c
+            }
+          }
+          continue
+
+        case S.DOCTYPE_QUOTED:
+          parser.doctype += c
+          if (c === parser.q) {
+            parser.q = ''
+            parser.state = S.DOCTYPE
+          }
+          continue
+
+        case S.DOCTYPE_DTD:
+          parser.doctype += c
+          if (c === ']') {
+            parser.state = S.DOCTYPE
+          } else if (isQuote(c)) {
+            parser.state = S.DOCTYPE_DTD_QUOTED
+            parser.q = c
+          }
+          continue
+
+        case S.DOCTYPE_DTD_QUOTED:
+          parser.doctype += c
+          if (c === parser.q) {
+            parser.state = S.DOCTYPE_DTD
+            parser.q = ''
+          }
+          continue
+
+        case S.COMMENT:
+          if (c === '-') {
+            parser.state = S.COMMENT_ENDING
+          } else {
+            parser.comment += c
+          }
+          continue
+
+        case S.COMMENT_ENDING:
+          if (c === '-') {
+            parser.state = S.COMMENT_ENDED
+            parser.comment = textopts(parser.opt, parser.comment)
+            if (parser.comment) {
+              emitNode(parser, 'oncomment', parser.comment)
+            }
+            parser.comment = ''
+          } else {
+            parser.comment += '-' + c
+            parser.state = S.COMMENT
+          }
+          continue
+
+        case S.COMMENT_ENDED:
+          if (c !== '>') {
+            strictFail(parser, 'Malformed comment')
+            // allow <!-- blah -- bloo --> in non-strict mode,
+            // which is a comment of " blah -- bloo "
+            parser.comment += '--' + c
+            parser.state = S.COMMENT
+          } else {
+            parser.state = S.TEXT
+          }
+          continue
+
+        case S.CDATA:
+          if (c === ']') {
+            parser.state = S.CDATA_ENDING
+          } else {
+            parser.cdata += c
+          }
+          continue
+
+        case S.CDATA_ENDING:
+          if (c === ']') {
+            parser.state = S.CDATA_ENDING_2
+          } else {
+            parser.cdata += ']' + c
+            parser.state = S.CDATA
+          }
+          continue
+
+        case S.CDATA_ENDING_2:
+          if (c === '>') {
+            if (parser.cdata) {
+              emitNode(parser, 'oncdata', parser.cdata)
+            }
+            emitNode(parser, 'onclosecdata')
+            parser.cdata = ''
+            parser.state = S.TEXT
+          } else if (c === ']') {
+            parser.cdata += ']'
+          } else {
+            parser.cdata += ']]' + c
+            parser.state = S.CDATA
+          }
+          continue
+
+        case S.PROC_INST:
+          if (c === '?') {
+            parser.state = S.PROC_INST_ENDING
+          } else if (isWhitespace(c)) {
+            parser.state = S.PROC_INST_BODY
+          } else {
+            parser.procInstName += c
+          }
+          continue
+
+        case S.PROC_INST_BODY:
+          if (!parser.procInstBody && isWhitespace(c)) {
+            continue
+          } else if (c === '?') {
+            parser.state = S.PROC_INST_ENDING
+          } else {
+            parser.procInstBody += c
+          }
+          continue
+
+        case S.PROC_INST_ENDING:
+          if (c === '>') {
+            emitNode(parser, 'onprocessinginstruction', {
+              name: parser.procInstName,
+              body: parser.procInstBody
+            })
+            parser.procInstName = parser.procInstBody = ''
+            parser.state = S.TEXT
+          } else {
+            parser.procInstBody += '?' + c
+            parser.state = S.PROC_INST_BODY
+          }
+          continue
+
+        case S.OPEN_TAG:
+          if (isMatch(nameBody, c)) {
+            parser.tagName += c
+          } else {
+            newTag(parser)
+            if (c === '>') {
+              openTag(parser)
+            } else if (c === '/') {
+              parser.state = S.OPEN_TAG_SLASH
+            } else {
+              if (!isWhitespace(c)) {
+                strictFail(parser, 'Invalid character in tag name')
+              }
+              parser.state = S.ATTRIB
+            }
+          }
+          continue
+
+        case S.OPEN_TAG_SLASH:
+          if (c === '>') {
+            openTag(parser, true)
+            closeTag(parser)
+          } else {
+            strictFail(parser, 'Forward-slash in opening tag not followed by >')
+            parser.state = S.ATTRIB
+          }
+          continue
+
+        case S.ATTRIB:
+          // haven't read the attribute name yet.
+          if (isWhitespace(c)) {
+            continue
+          } else if (c === '>') {
+            openTag(parser)
+          } else if (c === '/') {
+            parser.state = S.OPEN_TAG_SLASH
+          } else if (isMatch(nameStart, c)) {
+            parser.attribName = c
+            parser.attribValue = ''
+            parser.state = S.ATTRIB_NAME
+          } else {
+            strictFail(parser, 'Invalid attribute name')
+          }
+          continue
+
+        case S.ATTRIB_NAME:
+          if (c === '=') {
+            parser.state = S.ATTRIB_VALUE
+          } else if (c === '>') {
+            strictFail(parser, 'Attribute without value')
+            parser.attribValue = parser.attribName
+            attrib(parser)
+            openTag(parser)
+          } else if (isWhitespace(c)) {
+            parser.state = S.ATTRIB_NAME_SAW_WHITE
+          } else if (isMatch(nameBody, c)) {
+            parser.attribName += c
+          } else {
+            strictFail(parser, 'Invalid attribute name')
+          }
+          continue
+
+        case S.ATTRIB_NAME_SAW_WHITE:
+          if (c === '=') {
+            parser.state = S.ATTRIB_VALUE
+          } else if (isWhitespace(c)) {
+            continue
+          } else {
+            strictFail(parser, 'Attribute without value')
+            parser.tag.attributes[parser.attribName] = ''
+            parser.attribValue = ''
+            emitNode(parser, 'onattribute', {
+              name: parser.attribName,
+              value: ''
+            })
+            parser.attribName = ''
+            if (c === '>') {
+              openTag(parser)
+            } else if (isMatch(nameStart, c)) {
+              parser.attribName = c
+              parser.state = S.ATTRIB_NAME
+            } else {
+              strictFail(parser, 'Invalid attribute name')
+              parser.state = S.ATTRIB
+            }
+          }
+          continue
+
+        case S.ATTRIB_VALUE:
+          if (isWhitespace(c)) {
+            continue
+          } else if (isQuote(c)) {
+            parser.q = c
+            parser.state = S.ATTRIB_VALUE_QUOTED
+          } else {
+            strictFail(parser, 'Unquoted attribute value')
+            parser.state = S.ATTRIB_VALUE_UNQUOTED
+            parser.attribValue = c
+          }
+          continue
+
+        case S.ATTRIB_VALUE_QUOTED:
+          if (c !== parser.q) {
+            if (c === '&') {
+              parser.state = S.ATTRIB_VALUE_ENTITY_Q
+            } else {
+              parser.attribValue += c
+            }
+            continue
+          }
+          attrib(parser)
+          parser.q = ''
+          parser.state = S.ATTRIB_VALUE_CLOSED
+          continue
+
+        case S.ATTRIB_VALUE_CLOSED:
+          if (isWhitespace(c)) {
+            parser.state = S.ATTRIB
+          } else if (c === '>') {
+            openTag(parser)
+          } else if (c === '/') {
+            parser.state = S.OPEN_TAG_SLASH
+          } else if (isMatch(nameStart, c)) {
+            strictFail(parser, 'No whitespace between attributes')
+            parser.attribName = c
+            parser.attribValue = ''
+            parser.state = S.ATTRIB_NAME
+          } else {
+            strictFail(parser, 'Invalid attribute name')
+          }
+          continue
+
+        case S.ATTRIB_VALUE_UNQUOTED:
+          if (!isAttribEnd(c)) {
+            if (c === '&') {
+              parser.state = S.ATTRIB_VALUE_ENTITY_U
+            } else {
+              parser.attribValue += c
+            }
+            continue
+          }
+          attrib(parser)
+          if (c === '>') {
+            openTag(parser)
+          } else {
+            parser.state = S.ATTRIB
+          }
+          continue
+
+        case S.CLOSE_TAG:
+          if (!parser.tagName) {
+            if (isWhitespace(c)) {
+              continue
+            } else if (notMatch(nameStart, c)) {
+              if (parser.script) {
+                parser.script += '</' + c
+                parser.state = S.SCRIPT
+              } else {
+                strictFail(parser, 'Invalid tagname in closing tag.')
+              }
+            } else {
+              parser.tagName = c
+            }
+          } else if (c === '>') {
+            closeTag(parser)
+          } else if (isMatch(nameBody, c)) {
+            parser.tagName += c
+          } else if (parser.script) {
+            parser.script += '</' + parser.tagName
+            parser.tagName = ''
+            parser.state = S.SCRIPT
+          } else {
+            if (!isWhitespace(c)) {
+              strictFail(parser, 'Invalid tagname in closing tag')
+            }
+            parser.state = S.CLOSE_TAG_SAW_WHITE
+          }
+          continue
+
+        case S.CLOSE_TAG_SAW_WHITE:
+          if (isWhitespace(c)) {
+            continue
+          }
+          if (c === '>') {
+            closeTag(parser)
+          } else {
+            strictFail(parser, 'Invalid characters in closing tag')
+          }
+          continue
+
+        case S.TEXT_ENTITY:
+        case S.ATTRIB_VALUE_ENTITY_Q:
+        case S.ATTRIB_VALUE_ENTITY_U:
+          var returnState
+          var buffer
+          switch (parser.state) {
+            case S.TEXT_ENTITY:
+              returnState = S.TEXT
+              buffer = 'textNode'
+              break
+
+            case S.ATTRIB_VALUE_ENTITY_Q:
+              returnState = S.ATTRIB_VALUE_QUOTED
+              buffer = 'attribValue'
+              break
+
+            case S.ATTRIB_VALUE_ENTITY_U:
+              returnState = S.ATTRIB_VALUE_UNQUOTED
+              buffer = 'attribValue'
+              break
+          }
+
+          if (c === ';') {
+            var parsedEntity = parseEntity(parser)
+
+            // Custom entities can contain tags, so we potentially need to parse the result
+            if (parser.state === S.TEXT_ENTITY && !sax.ENTITIES[parser.entity] && parsedEntity !== '&' + parser.entity + ';') {
+              chunk = chunk.slice(0, i) + parsedEntity + chunk.slice(i)
+            } else {
+              parser[buffer] += parsedEntity
+            }
+
+            parser.entity = ''
+            parser.state = returnState
+          } else if (isMatch(parser.entity.length ? entityBody : entityStart, c)) {
+            parser.entity += c
+          } else {
+            strictFail(parser, 'Invalid character in entity name')
+            parser[buffer] += '&' + parser.entity + c
+            parser.entity = ''
+            parser.state = returnState
+          }
+
+          continue
+
+        default:
+          throw new Error(parser, 'Unknown state: ' + parser.state)
+      }
+    } // while
+
+    if (parser.position >= parser.bufferCheckPosition) {
+      checkBufferLength(parser)
+    }
+    return parser
+  }
+})(typeof exports === 'undefined' ? this.sax = {} : exports)
diff --git a/node_modules/@trysound/sax/package.json b/node_modules/@trysound/sax/package.json
new file mode 100644
index 0000000..5a21f5e
--- /dev/null
+++ b/node_modules/@trysound/sax/package.json
@@ -0,0 +1,30 @@
+{
+  "version": "0.1.1",
+  "name": "@trysound/sax",
+  "description": "An evented streaming XML parser in JavaScript",
+  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
+  "repository": "git://github.com/svg/sax.git",
+  "license": "ISC",
+  "contributors": [
+    {
+      "name": "Bogdan Chadkin",
+      "email": "trysound@yandex.ru",
+      "url": "http://github.com/TrySound"
+    }
+  ],
+  "main": "lib/sax.js",
+  "files": [
+    "lib"
+  ],
+  "engines": {
+    "node": ">=10.13.0"
+  },
+  "scripts": {
+    "test": "tap test/*.js --cov -j4",
+    "lint": "standard -F test/*.js lib/*.js"
+  },
+  "devDependencies": {
+    "standard": "^8.6.0",
+    "tap": "^10.5.1"
+  }
+}
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/CHANGELOG.md b/node_modules/@web/rollup-plugin-import-meta-assets/CHANGELOG.md
new file mode 100644
index 0000000..3a9a0de
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/CHANGELOG.md
@@ -0,0 +1,45 @@
+# @web/rollup-plugin-import-meta-assets
+
+## 1.0.6
+
+### Patch Changes
+
+- b77e5d16: fix(rollup-plugin-import-meta-assets): skip unnecessary sourcemap generation
+
+## 1.0.5
+
+### Patch Changes
+
+- 7fd7a799: fix(rollup-plugin-import-meta-assets): fix outputted sourcemaps
+
+## 1.0.4
+
+### Patch Changes
+
+- 5bb5dd0: fix type reference
+
+## 1.0.3
+
+### Patch Changes
+
+- 279f756: ---
+
+  fix warn() code when error was caught
+
+## 1.0.2
+
+### Patch Changes
+
+- 68e24b6: publish correct entrypoint
+
+## 1.0.1
+
+### Patch Changes
+
+- fd9fe56: publish files
+
+## 1.0.0
+
+### Major Changes
+
+- 401e225: First release
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/README.md b/node_modules/@web/rollup-plugin-import-meta-assets/README.md
new file mode 100644
index 0000000..17d811c
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/README.md
@@ -0,0 +1,50 @@
+# Rollup Plugin import-meta-assets
+
+Rollup plugin that detects assets references relative to modules using patterns such as `new URL('./assets/my-img.png', import.meta.url)`.
+
+The referenced assets are added to the rollup pipeline, allowing them to be transformed and hash the filenames.
+
+## How it works
+
+A common pattern is to import an asset to get the URL of it after bundling:
+
+```js
+import myImg from './assets/my-img.png';
+```
+
+This doesn't work in the browser without transformation. This plugin makes it possible to use an identical pattern using `import.meta.url` which does work in the browser:
+
+```js
+const myImg = new URL('./assets/my-img.png', import.meta.url);
+```
+
+## Install
+
+Using npm:
+
+```
+npm install @web/rollup-plugin-import-meta-assets --save-dev
+```
+
+## Usage
+
+Create a rollup.config.js [configuration file](https://www.rollupjs.org/guide/en/#configuration-files) and import the plugin:
+
+```js
+import { importMetaAssets } from '@web/rollup-plugin-import-meta-assets';
+
+export default {
+  input: 'src/index.js',
+  output: {
+    dir: 'output',
+    format: 'es',
+  },
+  plugins: [importMetaAssets()],
+};
+```
+
+Then call `rollup` either via the [CLI](https://www.rollupjs.org/guide/en/#command-line-reference) or the [API](https://www.rollupjs.org/guide/en/#javascript-api).
+
+## Documentation
+
+See [our website](https://modern-web.dev/docs/building/rollup-plugin-import-meta-assets/) for full documentation.
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/dist/index.d.ts b/node_modules/@web/rollup-plugin-import-meta-assets/dist/index.d.ts
new file mode 100644
index 0000000..83e1dad
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/dist/index.d.ts
@@ -0,0 +1,3 @@
+declare const _exports: typeof import("./rollup-plugin-import-meta-assets");
+export = _exports;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/dist/index.d.ts.map b/node_modules/@web/rollup-plugin-import-meta-assets/dist/index.d.ts.map
new file mode 100644
index 0000000..6e08bd5
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.js"],"names":[],"mappings":""}
\ No newline at end of file
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/dist/rollup-plugin-import-meta-assets.d.ts b/node_modules/@web/rollup-plugin-import-meta-assets/dist/rollup-plugin-import-meta-assets.d.ts
new file mode 100644
index 0000000..730ed43
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/dist/rollup-plugin-import-meta-assets.d.ts
@@ -0,0 +1,18 @@
+/**
+ * Detects assets references relative to modules using patterns such as `new URL('./path/to/asset.ext', import.meta.url)`.
+ * The assets are added to the rollup pipeline, allowing them to be transformed and hash the filenames.
+ *
+ * @param {object} options
+ * @param {string|string[]} [options.include] A picomatch pattern, or array of patterns, which specifies the files in the build the plugin should operate on. By default all files are targeted.
+ * @param {string|string[]} [options.exclude] A picomatch pattern, or array of patterns, which specifies the files in the build the plugin should _ignore_. By default no files are ignored.
+ * @param {boolean} [options.warnOnError] By default, the plugin quits the build process when it encounters an error. If you set this option to true, it will throw a warning instead and leave the code untouched.
+ * @param {function} [options.transform] A function to transform assets.
+ * @return {import('rollup').Plugin} A Rollup Plugin
+ */
+export function importMetaAssets({ include, exclude, warnOnError, transform }?: {
+    include: string | string[] | undefined;
+    exclude: string | string[] | undefined;
+    warnOnError: boolean | undefined;
+    transform: Function | undefined;
+}): import('rollup').Plugin;
+//# sourceMappingURL=rollup-plugin-import-meta-assets.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/dist/rollup-plugin-import-meta-assets.d.ts.map b/node_modules/@web/rollup-plugin-import-meta-assets/dist/rollup-plugin-import-meta-assets.d.ts.map
new file mode 100644
index 0000000..a89f3e2
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/dist/rollup-plugin-import-meta-assets.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"rollup-plugin-import-meta-assets.d.ts","sourceRoot":"","sources":["../src/rollup-plugin-import-meta-assets.js"],"names":[],"mappings":"AA0CA;;;;;;;;;;GAUG;AACH;IANqC,OAAO;IACP,OAAO;IACf,WAAW;IACV,SAAS;IAC3B,OAAO,QAAQ,EAAE,MAAM,CA2DlC"}
\ No newline at end of file
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/index.mjs b/node_modules/@web/rollup-plugin-import-meta-assets/index.mjs
new file mode 100644
index 0000000..6304b07
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/index.mjs
@@ -0,0 +1,5 @@
+import cjsEntrypoint from './src/rollup-plugin-import-meta-assets.js';
+
+const { importMetaAssets } = cjsEntrypoint;
+
+export { importMetaAssets };
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/CHANGELOG.md b/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/CHANGELOG.md
new file mode 100755
index 0000000..fbf20b5
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/CHANGELOG.md
@@ -0,0 +1,357 @@
+# @rollup/pluginutils ChangeLog
+
+## v4.1.0
+
+_2020-10-27_
+
+### Bugfixes
+
+- fix: attach scope object to for-loop (#616)
+
+### Features
+
+- feat: normalizePath (#550)
+
+### Updates
+
+- refactor: improve readability of attachScopes test (#551)
+
+## v4.0.0
+
+_2020-08-13_
+
+### Breaking Changes
+
+- fix!: don't add cwd to absolute or patterns that start with a glob (#517)
+
+### Bugfixes
+
+- fix: resolve relative paths starting with "./" (#180)
+
+### Features
+
+- feat: add native node es modules support (#419)
+
+### Updates
+
+- docs: Correct minimatch to picomatch (#525)
+- chore: update dependencies (9f56d37)
+- refactor: replace micromatch with picomatch. (#306)
+- chore: Don't bundle micromatch (#220)
+- chore: add missing typescript devDep (238b140)
+- chore: Use readonly arrays, add TSDoc (#187)
+- chore: Use typechecking (2ae08eb)
+
+## v3.1.0
+
+_2020-06-05_
+
+### Bugfixes
+
+- fix: resolve relative paths starting with "./" (#180)
+
+### Features
+
+- feat: add native node es modules support (#419)
+
+### Updates
+
+- refactor: replace micromatch with picomatch. (#306)
+- chore: Don't bundle micromatch (#220)
+- chore: add missing typescript devDep (238b140)
+- chore: Use readonly arrays, add TSDoc (#187)
+- chore: Use typechecking (2ae08eb)
+
+## v3.0.10
+
+_2020-05-02_
+
+### Bugfixes
+
+- fix: resolve relative paths starting with "./" (#180)
+
+### Updates
+
+- refactor: replace micromatch with picomatch. (#306)
+- chore: Don't bundle micromatch (#220)
+- chore: add missing typescript devDep (238b140)
+- chore: Use readonly arrays, add TSDoc (#187)
+- chore: Use typechecking (2ae08eb)
+
+## v3.0.9
+
+_2020-04-12_
+
+### Updates
+
+- chore: support Rollup v2
+
+## v3.0.8
+
+_2020-02-01_
+
+### Bugfixes
+
+- fix: resolve relative paths starting with "./" (#180)
+
+### Updates
+
+- chore: add missing typescript devDep (238b140)
+- chore: Use readonly arrays, add TSDoc (#187)
+- chore: Use typechecking (2ae08eb)
+
+## v3.0.7
+
+_2020-02-01_
+
+### Bugfixes
+
+- fix: resolve relative paths starting with "./" (#180)
+
+### Updates
+
+- chore: Use readonly arrays, add TSDoc (#187)
+- chore: Use typechecking (2ae08eb)
+
+## v3.0.6
+
+_2020-01-27_
+
+### Bugfixes
+
+- fix: resolve relative paths starting with "./" (#180)
+
+## v3.0.5
+
+_2020-01-25_
+
+### Bugfixes
+
+- fix: bring back named exports (#176)
+
+## v3.0.4
+
+_2020-01-10_
+
+### Bugfixes
+
+- fix: keep for(const..) out of scope (#151)
+
+## v3.0.3
+
+_2020-01-07_
+
+### Bugfixes
+
+- fix: createFilter Windows regression (#141)
+
+### Updates
+
+- test: fix windows path failure (0a0de65)
+- chore: fix test script (5eae320)
+
+## v3.0.2
+
+_2020-01-04_
+
+### Bugfixes
+
+- fix: makeLegalIdentifier - potentially unsafe input for blacklisted identifier (#116)
+
+### Updates
+
+- docs: Fix documented type of createFilter's include/exclude (#123)
+- chore: update minor linting correction (bcbf9d2)
+
+## 3.0.1
+
+- fix: Escape glob characters in folder (#84)
+
+## 3.0.0
+
+_2019-11-25_
+
+- **Breaking:** Minimum compatible Rollup version is 1.20.0
+- **Breaking:** Minimum supported Node version is 8.0.0
+- Published as @rollup/plugins-image
+
+## 2.8.2
+
+_2019-09-13_
+
+- Handle optional catch parameter in attachScopes ([#70](https://github.com/rollup/rollup-pluginutils/pulls/70))
+
+## 2.8.1
+
+_2019-06-04_
+
+- Support serialization of many edge cases ([#64](https://github.com/rollup/rollup-pluginutils/issues/64))
+
+## 2.8.0
+
+_2019-05-30_
+
+- Bundle updated micromatch dependency ([#60](https://github.com/rollup/rollup-pluginutils/issues/60))
+
+## 2.7.1
+
+_2019-05-17_
+
+- Do not ignore files with a leading "." in createFilter ([#62](https://github.com/rollup/rollup-pluginutils/issues/62))
+
+## 2.7.0
+
+_2019-05-15_
+
+- Add `resolve` option to createFilter ([#59](https://github.com/rollup/rollup-pluginutils/issues/59))
+
+## 2.6.0
+
+_2019-04-04_
+
+- Add `extractAssignedNames` ([#59](https://github.com/rollup/rollup-pluginutils/issues/59))
+- Provide dedicated TypeScript typings file ([#58](https://github.com/rollup/rollup-pluginutils/issues/58))
+
+## 2.5.0
+
+_2019-03-18_
+
+- Generalize dataToEsm type ([#55](https://github.com/rollup/rollup-pluginutils/issues/55))
+- Handle empty keys in dataToEsm ([#56](https://github.com/rollup/rollup-pluginutils/issues/56))
+
+## 2.4.1
+
+_2019-02-16_
+
+- Remove unnecessary dependency
+
+## 2.4.0
+
+_2019-02-16_
+Update dependencies to solve micromatch vulnerability ([#53](https://github.com/rollup/rollup-pluginutils/issues/53))
+
+## 2.3.3
+
+_2018-09-19_
+
+- Revert micromatch update ([#43](https://github.com/rollup/rollup-pluginutils/issues/43))
+
+## 2.3.2
+
+_2018-09-18_
+
+- Bumb micromatch dependency ([#36](https://github.com/rollup/rollup-pluginutils/issues/36))
+- Bumb dependencies ([#41](https://github.com/rollup/rollup-pluginutils/issues/41))
+- Split up tests ([#40](https://github.com/rollup/rollup-pluginutils/issues/40))
+
+## 2.3.1
+
+_2018-08-06_
+
+- Fixed ObjectPattern scope in attachScopes to recognise { ...rest } syntax ([#37](https://github.com/rollup/rollup-pluginutils/issues/37))
+
+## 2.3.0
+
+_2018-05-21_
+
+- Add option to not generate named exports ([#32](https://github.com/rollup/rollup-pluginutils/issues/32))
+
+## 2.2.1
+
+_2018-05-21_
+
+- Support `null` serialization ([#34](https://github.com/rollup/rollup-pluginutils/issues/34))
+
+## 2.2.0
+
+_2018-05-11_
+
+- Improve white-space handling in `dataToEsm` and add `prepare` script ([#31](https://github.com/rollup/rollup-pluginutils/issues/31))
+
+## 2.1.1
+
+_2018-05-09_
+
+- Update dependencies
+
+## 2.1.0
+
+_2018-05-08_
+
+- Add `dataToEsm` helper to create named exports from objects ([#29](https://github.com/rollup/rollup-pluginutils/issues/29))
+- Support literal keys in object patterns ([#27](https://github.com/rollup/rollup-pluginutils/issues/27))
+- Support function declarations without id in `attachScopes` ([#28](https://github.com/rollup/rollup-pluginutils/issues/28))
+
+## 2.0.1
+
+_2017-01-03_
+
+- Don't add extension to file with trailing dot ([#14](https://github.com/rollup/rollup-pluginutils/issues/14))
+
+## 2.0.0
+
+_2017-01-03_
+
+- Use `micromatch` instead of `minimatch` ([#19](https://github.com/rollup/rollup-pluginutils/issues/19))
+- Allow `createFilter` to take regexes ([#5](https://github.com/rollup/rollup-pluginutils/issues/5))
+
+## 1.5.2
+
+_2016-08-29_
+
+- Treat `arguments` as a reserved word ([#10](https://github.com/rollup/rollup-pluginutils/issues/10))
+
+## 1.5.1
+
+_2016-06-24_
+
+- Add all declarators in a var declaration to scope, not just the first
+
+## 1.5.0
+
+_2016-06-07_
+
+- Exclude IDs with null character (`\0`)
+
+## 1.4.0
+
+_2016-06-07_
+
+- Workaround minimatch issue ([#6](https://github.com/rollup/rollup-pluginutils/pull/6))
+- Exclude non-string IDs in `createFilter`
+
+## 1.3.1
+
+_2015-12-16_
+
+- Build with Rollup directly, rather than via Gobble
+
+## 1.3.0
+
+_2015-12-16_
+
+- Use correct path separator on Windows
+
+## 1.2.0
+
+_2015-11-02_
+
+- Add `attachScopes` and `makeLegalIdentifier`
+
+## 1.1.0
+
+2015-10-24\*
+
+- Add `addExtension` function
+
+## 1.0.1
+
+_2015-10-24_
+
+- Include dist files in package
+
+## 1.0.0
+
+_2015-10-24_
+
+- First release
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/LICENSE b/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/LICENSE
new file mode 100644
index 0000000..5e46702
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2019 RollupJS Plugin Contributors (https://github.com/rollup/plugins/graphs/contributors)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/README.md b/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/README.md
new file mode 100755
index 0000000..91dc81a
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/README.md
@@ -0,0 +1,255 @@
+[npm]: https://img.shields.io/npm/v/@rollup/pluginutils
+[npm-url]: https://www.npmjs.com/package/@rollup/pluginutils
+[size]: https://packagephobia.now.sh/badge?p=@rollup/pluginutils
+[size-url]: https://packagephobia.now.sh/result?p=@rollup/pluginutils
+
+[![npm][npm]][npm-url]
+[![size][size]][size-url]
+[![libera manifesto](https://img.shields.io/badge/libera-manifesto-lightgrey.svg)](https://liberamanifesto.com)
+
+# @rollup/pluginutils
+
+A set of utility functions commonly used by 🍣 Rollup plugins.
+
+## Requirements
+
+This plugin requires an [LTS](https://github.com/nodejs/Release) Node version (v8.0.0+) and Rollup v1.20.0+.
+
+## Install
+
+Using npm:
+
+```console
+npm install @rollup/pluginutils --save-dev
+```
+
+## Usage
+
+```js
+import utils from '@rollup/pluginutils';
+//...
+```
+
+## API
+
+Available utility functions are listed below:
+
+_Note: Parameter names immediately followed by a `?` indicate that the parameter is optional._
+
+### addExtension
+
+Adds an extension to a module ID if one does not exist.
+
+Parameters: `(filename: String, ext?: String)`<br>
+Returns: `String`
+
+```js
+import { addExtension } from '@rollup/pluginutils';
+
+export default function myPlugin(options = {}) {
+  return {
+    resolveId(code, id) {
+      // only adds an extension if there isn't one already
+      id = addExtension(id); // `foo` -> `foo.js`, `foo.js` -> `foo.js`
+      id = addExtension(id, '.myext'); // `foo` -> `foo.myext`, `foo.js` -> `foo.js`
+    }
+  };
+}
+```
+
+### attachScopes
+
+Attaches `Scope` objects to the relevant nodes of an AST. Each `Scope` object has a `scope.contains(name)` method that returns `true` if a given name is defined in the current scope or a parent scope.
+
+Parameters: `(ast: Node, propertyName?: String)`<br>
+Returns: `Object`
+
+See [rollup-plugin-inject](https://github.com/rollup/rollup-plugin-inject) or [rollup-plugin-commonjs](https://github.com/rollup/rollup-plugin-commonjs) for an example of usage.
+
+```js
+import { attachScopes } from '@rollup/pluginutils';
+import { walk } from 'estree-walker';
+
+export default function myPlugin(options = {}) {
+  return {
+    transform(code) {
+      const ast = this.parse(code);
+
+      let scope = attachScopes(ast, 'scope');
+
+      walk(ast, {
+        enter(node) {
+          if (node.scope) scope = node.scope;
+
+          if (!scope.contains('foo')) {
+            // `foo` is not defined, so if we encounter it,
+            // we assume it's a global
+          }
+        },
+        leave(node) {
+          if (node.scope) scope = scope.parent;
+        }
+      });
+    }
+  };
+}
+```
+
+### createFilter
+
+Constructs a filter function which can be used to determine whether or not certain modules should be operated upon.
+
+Parameters: `(include?: <picomatch>, exclude?: <picomatch>, options?: Object)`<br>
+Returns: `String`
+
+#### `include` and `exclude`
+
+Type: `String | RegExp | Array[...String|RegExp]`<br>
+
+A valid [`picomatch`](https://github.com/micromatch/picomatch#globbing-features) pattern, or array of patterns. If `options.include` is omitted or has zero length, filter will return `true` by default. Otherwise, an ID must match one or more of the `picomatch` patterns, and must not match any of the `options.exclude` patterns.
+
+Note that `picomatch` patterns are very similar to [`minimatch`](https://github.com/isaacs/minimatch#readme) patterns, and in most use cases, they are interchangeable. If you have more specific pattern matching needs, you can view [this comparison table](https://github.com/micromatch/picomatch#library-comparisons) to learn more about where the libraries differ.
+
+#### `options`
+
+##### `resolve`
+
+Type: `String | Boolean | null`
+
+Optionally resolves the patterns against a directory other than `process.cwd()`. If a `String` is specified, then the value will be used as the base directory. Relative paths will be resolved against `process.cwd()` first. If `false`, then the patterns will not be resolved against any directory. This can be useful if you want to create a filter for virtual module names.
+
+#### Usage
+
+```js
+import { createFilter } from '@rollup/pluginutils';
+
+export default function myPlugin(options = {}) {
+  // assume that the myPlugin accepts options of `options.include` and `options.exclude`
+  var filter = createFilter(options.include, options.exclude, {
+    resolve: '/my/base/dir'
+  });
+
+  return {
+    transform(code, id) {
+      if (!filter(id)) return;
+
+      // proceed with the transformation...
+    }
+  };
+}
+```
+
+### dataToEsm
+
+Transforms objects into tree-shakable ES Module imports.
+
+Parameters: `(data: Object)`<br>
+Returns: `String`
+
+#### `data`
+
+Type: `Object`
+
+An object to transform into an ES module.
+
+#### Usage
+
+```js
+import { dataToEsm } from '@rollup/pluginutils';
+
+const esModuleSource = dataToEsm(
+  {
+    custom: 'data',
+    to: ['treeshake']
+  },
+  {
+    compact: false,
+    indent: '\t',
+    preferConst: false,
+    objectShorthand: false,
+    namedExports: true
+  }
+);
+/*
+Outputs the string ES module source:
+  export const custom = 'data';
+  export const to = ['treeshake'];
+  export default { custom, to };
+*/
+```
+
+### extractAssignedNames
+
+Extracts the names of all assignment targets based upon specified patterns.
+
+Parameters: `(param: Node)`<br>
+Returns: `Array[...String]`
+
+#### `param`
+
+Type: `Node`
+
+An `acorn` AST Node.
+
+#### Usage
+
+```js
+import { extractAssignedNames } from '@rollup/pluginutils';
+import { walk } from 'estree-walker';
+
+export default function myPlugin(options = {}) {
+  return {
+    transform(code) {
+      const ast = this.parse(code);
+
+      walk(ast, {
+        enter(node) {
+          if (node.type === 'VariableDeclarator') {
+            const declaredNames = extractAssignedNames(node.id);
+            // do something with the declared names
+            // e.g. for `const {x, y: z} = ...` => declaredNames = ['x', 'z']
+          }
+        }
+      });
+    }
+  };
+}
+```
+
+### makeLegalIdentifier
+
+Constructs a bundle-safe identifier from a `String`.
+
+Parameters: `(str: String)`<br>
+Returns: `String`
+
+#### Usage
+
+```js
+import { makeLegalIdentifier } from '@rollup/pluginutils';
+
+makeLegalIdentifier('foo-bar'); // 'foo_bar'
+makeLegalIdentifier('typeof'); // '_typeof'
+```
+
+### normalizePath
+
+Converts path separators to forward slash.
+
+Parameters: `(filename: String)`<br>
+Returns: `String`
+
+#### Usage
+
+```js
+import { normalizePath } from '@rollup/pluginutils';
+
+normalizePath('foo\\bar'); // 'foo/bar'
+normalizePath('foo/bar'); // 'foo/bar'
+```
+
+## Meta
+
+[CONTRIBUTING](/.github/CONTRIBUTING.md)
+
+[LICENSE (MIT)](/LICENSE)
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/dist/cjs/index.js b/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/dist/cjs/index.js
new file mode 100644
index 0000000..5d7024c
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/dist/cjs/index.js
@@ -0,0 +1,467 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+var path = require('path');
+var pm = require('picomatch');
+
+function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
+
+var pm__default = /*#__PURE__*/_interopDefaultLegacy(pm);
+
+const addExtension = function addExtension(filename, ext = '.js') {
+    let result = `${filename}`;
+    if (!path.extname(filename))
+        result += ext;
+    return result;
+};
+
+class WalkerBase {constructor() { WalkerBase.prototype.__init.call(this);WalkerBase.prototype.__init2.call(this);WalkerBase.prototype.__init3.call(this);WalkerBase.prototype.__init4.call(this); }
+	 __init() {this.should_skip = false;}
+	 __init2() {this.should_remove = false;}
+	 __init3() {this.replacement = null;}
+
+	 __init4() {this.context = {
+		skip: () => (this.should_skip = true),
+		remove: () => (this.should_remove = true),
+		replace: (node) => (this.replacement = node)
+	};}
+
+	 replace(parent, prop, index, node) {
+		if (parent) {
+			if (index !== null) {
+				parent[prop][index] = node;
+			} else {
+				parent[prop] = node;
+			}
+		}
+	}
+
+	 remove(parent, prop, index) {
+		if (parent) {
+			if (index !== null) {
+				parent[prop].splice(index, 1);
+			} else {
+				delete parent[prop];
+			}
+		}
+	}
+}
+
+class SyncWalkerClass extends WalkerBase {
+	
+	
+
+	constructor(walker) {
+		super();
+		this.enter = walker.enter;
+		this.leave = walker.leave;
+	}
+
+	 visit(
+		node,
+		parent,
+		enter,
+		leave,
+		prop,
+		index
+	) {
+		if (node) {
+			if (enter) {
+				const _should_skip = this.should_skip;
+				const _should_remove = this.should_remove;
+				const _replacement = this.replacement;
+				this.should_skip = false;
+				this.should_remove = false;
+				this.replacement = null;
+
+				enter.call(this.context, node, parent, prop, index);
+
+				if (this.replacement) {
+					node = this.replacement;
+					this.replace(parent, prop, index, node);
+				}
+
+				if (this.should_remove) {
+					this.remove(parent, prop, index);
+				}
+
+				const skipped = this.should_skip;
+				const removed = this.should_remove;
+
+				this.should_skip = _should_skip;
+				this.should_remove = _should_remove;
+				this.replacement = _replacement;
+
+				if (skipped) return node;
+				if (removed) return null;
+			}
+
+			for (const key in node) {
+				const value = (node )[key];
+
+				if (typeof value !== "object") {
+					continue;
+				} else if (Array.isArray(value)) {
+					for (let i = 0; i < value.length; i += 1) {
+						if (value[i] !== null && typeof value[i].type === 'string') {
+							if (!this.visit(value[i], node, enter, leave, key, i)) {
+								// removed
+								i--;
+							}
+						}
+					}
+				} else if (value !== null && typeof value.type === "string") {
+					this.visit(value, node, enter, leave, key, null);
+				}
+			}
+
+			if (leave) {
+				const _replacement = this.replacement;
+				const _should_remove = this.should_remove;
+				this.replacement = null;
+				this.should_remove = false;
+
+				leave.call(this.context, node, parent, prop, index);
+
+				if (this.replacement) {
+					node = this.replacement;
+					this.replace(parent, prop, index, node);
+				}
+
+				if (this.should_remove) {
+					this.remove(parent, prop, index);
+				}
+
+				const removed = this.should_remove;
+
+				this.replacement = _replacement;
+				this.should_remove = _should_remove;
+
+				if (removed) return null;
+			}
+		}
+
+		return node;
+	}
+}
+
+function walk(ast, walker) {
+	const instance = new SyncWalkerClass(walker);
+	return instance.visit(ast, null, walker.enter, walker.leave);
+}
+
+const extractors = {
+    ArrayPattern(names, param) {
+        for (const element of param.elements) {
+            if (element)
+                extractors[element.type](names, element);
+        }
+    },
+    AssignmentPattern(names, param) {
+        extractors[param.left.type](names, param.left);
+    },
+    Identifier(names, param) {
+        names.push(param.name);
+    },
+    MemberExpression() { },
+    ObjectPattern(names, param) {
+        for (const prop of param.properties) {
+            // @ts-ignore Typescript reports that this is not a valid type
+            if (prop.type === 'RestElement') {
+                extractors.RestElement(names, prop);
+            }
+            else {
+                extractors[prop.value.type](names, prop.value);
+            }
+        }
+    },
+    RestElement(names, param) {
+        extractors[param.argument.type](names, param.argument);
+    }
+};
+const extractAssignedNames = function extractAssignedNames(param) {
+    const names = [];
+    extractors[param.type](names, param);
+    return names;
+};
+
+const blockDeclarations = {
+    const: true,
+    let: true
+};
+class Scope {
+    constructor(options = {}) {
+        this.parent = options.parent;
+        this.isBlockScope = !!options.block;
+        this.declarations = Object.create(null);
+        if (options.params) {
+            options.params.forEach((param) => {
+                extractAssignedNames(param).forEach((name) => {
+                    this.declarations[name] = true;
+                });
+            });
+        }
+    }
+    addDeclaration(node, isBlockDeclaration, isVar) {
+        if (!isBlockDeclaration && this.isBlockScope) {
+            // it's a `var` or function node, and this
+            // is a block scope, so we need to go up
+            this.parent.addDeclaration(node, isBlockDeclaration, isVar);
+        }
+        else if (node.id) {
+            extractAssignedNames(node.id).forEach((name) => {
+                this.declarations[name] = true;
+            });
+        }
+    }
+    contains(name) {
+        return this.declarations[name] || (this.parent ? this.parent.contains(name) : false);
+    }
+}
+const attachScopes = function attachScopes(ast, propertyName = 'scope') {
+    let scope = new Scope();
+    walk(ast, {
+        enter(n, parent) {
+            const node = n;
+            // function foo () {...}
+            // class Foo {...}
+            if (/(Function|Class)Declaration/.test(node.type)) {
+                scope.addDeclaration(node, false, false);
+            }
+            // var foo = 1
+            if (node.type === 'VariableDeclaration') {
+                const { kind } = node;
+                const isBlockDeclaration = blockDeclarations[kind];
+                node.declarations.forEach((declaration) => {
+                    scope.addDeclaration(declaration, isBlockDeclaration, true);
+                });
+            }
+            let newScope;
+            // create new function scope
+            if (/Function/.test(node.type)) {
+                const func = node;
+                newScope = new Scope({
+                    parent: scope,
+                    block: false,
+                    params: func.params
+                });
+                // named function expressions - the name is considered
+                // part of the function's scope
+                if (func.type === 'FunctionExpression' && func.id) {
+                    newScope.addDeclaration(func, false, false);
+                }
+            }
+            // create new for scope
+            if (/For(In|Of)?Statement/.test(node.type)) {
+                newScope = new Scope({
+                    parent: scope,
+                    block: true
+                });
+            }
+            // create new block scope
+            if (node.type === 'BlockStatement' && !/Function/.test(parent.type)) {
+                newScope = new Scope({
+                    parent: scope,
+                    block: true
+                });
+            }
+            // catch clause has its own block scope
+            if (node.type === 'CatchClause') {
+                newScope = new Scope({
+                    parent: scope,
+                    params: node.param ? [node.param] : [],
+                    block: true
+                });
+            }
+            if (newScope) {
+                Object.defineProperty(node, propertyName, {
+                    value: newScope,
+                    configurable: true
+                });
+                scope = newScope;
+            }
+        },
+        leave(n) {
+            const node = n;
+            if (node[propertyName])
+                scope = scope.parent;
+        }
+    });
+    return scope;
+};
+
+// Helper since Typescript can't detect readonly arrays with Array.isArray
+function isArray(arg) {
+    return Array.isArray(arg);
+}
+function ensureArray(thing) {
+    if (isArray(thing))
+        return thing;
+    if (thing == null)
+        return [];
+    return [thing];
+}
+
+const normalizePath = function (filename) {
+    return filename.split(path.win32.sep).join(path.posix.sep);
+};
+
+function getMatcherString(id, resolutionBase) {
+    if (resolutionBase === false || path.isAbsolute(id) || id.startsWith('*')) {
+        return id;
+    }
+    // resolve('') is valid and will default to process.cwd()
+    const basePath = normalizePath(path.resolve(resolutionBase || ''))
+        // escape all possible (posix + win) path characters that might interfere with regex
+        .replace(/[-^$*+?.()|[\]{}]/g, '\\$&');
+    // Note that we use posix.join because:
+    // 1. the basePath has been normalized to use /
+    // 2. the incoming glob (id) matcher, also uses /
+    // otherwise Node will force backslash (\) on windows
+    return path.posix.join(basePath, id);
+}
+const createFilter = function createFilter(include, exclude, options) {
+    const resolutionBase = options && options.resolve;
+    const getMatcher = (id) => id instanceof RegExp
+        ? id
+        : {
+            test: (what) => {
+                // this refactor is a tad overly verbose but makes for easy debugging
+                const pattern = getMatcherString(id, resolutionBase);
+                const fn = pm__default['default'](pattern, { dot: true });
+                const result = fn(what);
+                return result;
+            }
+        };
+    const includeMatchers = ensureArray(include).map(getMatcher);
+    const excludeMatchers = ensureArray(exclude).map(getMatcher);
+    return function result(id) {
+        if (typeof id !== 'string')
+            return false;
+        if (/\0/.test(id))
+            return false;
+        const pathId = normalizePath(id);
+        for (let i = 0; i < excludeMatchers.length; ++i) {
+            const matcher = excludeMatchers[i];
+            if (matcher.test(pathId))
+                return false;
+        }
+        for (let i = 0; i < includeMatchers.length; ++i) {
+            const matcher = includeMatchers[i];
+            if (matcher.test(pathId))
+                return true;
+        }
+        return !includeMatchers.length;
+    };
+};
+
+const reservedWords = 'break case class catch const continue debugger default delete do else export extends finally for function if import in instanceof let new return super switch this throw try typeof var void while with yield enum await implements package protected static interface private public';
+const builtins = 'arguments Infinity NaN undefined null true false eval uneval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Symbol Error EvalError InternalError RangeError ReferenceError SyntaxError TypeError URIError Number Math Date String RegExp Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array Map Set WeakMap WeakSet SIMD ArrayBuffer DataView JSON Promise Generator GeneratorFunction Reflect Proxy Intl';
+const forbiddenIdentifiers = new Set(`${reservedWords} ${builtins}`.split(' '));
+forbiddenIdentifiers.add('');
+const makeLegalIdentifier = function makeLegalIdentifier(str) {
+    let identifier = str
+        .replace(/-(\w)/g, (_, letter) => letter.toUpperCase())
+        .replace(/[^$_a-zA-Z0-9]/g, '_');
+    if (/\d/.test(identifier[0]) || forbiddenIdentifiers.has(identifier)) {
+        identifier = `_${identifier}`;
+    }
+    return identifier || '_';
+};
+
+function stringify(obj) {
+    return (JSON.stringify(obj) || 'undefined').replace(/[\u2028\u2029]/g, (char) => `\\u${`000${char.charCodeAt(0).toString(16)}`.slice(-4)}`);
+}
+function serializeArray(arr, indent, baseIndent) {
+    let output = '[';
+    const separator = indent ? `\n${baseIndent}${indent}` : '';
+    for (let i = 0; i < arr.length; i++) {
+        const key = arr[i];
+        output += `${i > 0 ? ',' : ''}${separator}${serialize(key, indent, baseIndent + indent)}`;
+    }
+    return `${output}${indent ? `\n${baseIndent}` : ''}]`;
+}
+function serializeObject(obj, indent, baseIndent) {
+    let output = '{';
+    const separator = indent ? `\n${baseIndent}${indent}` : '';
+    const entries = Object.entries(obj);
+    for (let i = 0; i < entries.length; i++) {
+        const [key, value] = entries[i];
+        const stringKey = makeLegalIdentifier(key) === key ? key : stringify(key);
+        output += `${i > 0 ? ',' : ''}${separator}${stringKey}:${indent ? ' ' : ''}${serialize(value, indent, baseIndent + indent)}`;
+    }
+    return `${output}${indent ? `\n${baseIndent}` : ''}}`;
+}
+function serialize(obj, indent, baseIndent) {
+    if (obj === Infinity)
+        return 'Infinity';
+    if (obj === -Infinity)
+        return '-Infinity';
+    if (obj === 0 && 1 / obj === -Infinity)
+        return '-0';
+    if (obj instanceof Date)
+        return `new Date(${obj.getTime()})`;
+    if (obj instanceof RegExp)
+        return obj.toString();
+    if (obj !== obj)
+        return 'NaN'; // eslint-disable-line no-self-compare
+    if (Array.isArray(obj))
+        return serializeArray(obj, indent, baseIndent);
+    if (obj === null)
+        return 'null';
+    if (typeof obj === 'object')
+        return serializeObject(obj, indent, baseIndent);
+    return stringify(obj);
+}
+const dataToEsm = function dataToEsm(data, options = {}) {
+    const t = options.compact ? '' : 'indent' in options ? options.indent : '\t';
+    const _ = options.compact ? '' : ' ';
+    const n = options.compact ? '' : '\n';
+    const declarationType = options.preferConst ? 'const' : 'var';
+    if (options.namedExports === false ||
+        typeof data !== 'object' ||
+        Array.isArray(data) ||
+        data instanceof Date ||
+        data instanceof RegExp ||
+        data === null) {
+        const code = serialize(data, options.compact ? null : t, '');
+        const magic = _ || (/^[{[\-\/]/.test(code) ? '' : ' '); // eslint-disable-line no-useless-escape
+        return `export default${magic}${code};`;
+    }
+    let namedExportCode = '';
+    const defaultExportRows = [];
+    for (const [key, value] of Object.entries(data)) {
+        if (key === makeLegalIdentifier(key)) {
+            if (options.objectShorthand)
+                defaultExportRows.push(key);
+            else
+                defaultExportRows.push(`${key}:${_}${key}`);
+            namedExportCode += `export ${declarationType} ${key}${_}=${_}${serialize(value, options.compact ? null : t, '')};${n}`;
+        }
+        else {
+            defaultExportRows.push(`${stringify(key)}:${_}${serialize(value, options.compact ? null : t, '')}`);
+        }
+    }
+    return `${namedExportCode}export default${_}{${n}${t}${defaultExportRows.join(`,${n}${t}`)}${n}};${n}`;
+};
+
+// TODO: remove this in next major
+var index = {
+    addExtension,
+    attachScopes,
+    createFilter,
+    dataToEsm,
+    extractAssignedNames,
+    makeLegalIdentifier,
+    normalizePath
+};
+
+exports.addExtension = addExtension;
+exports.attachScopes = attachScopes;
+exports.createFilter = createFilter;
+exports.dataToEsm = dataToEsm;
+exports.default = index;
+exports.extractAssignedNames = extractAssignedNames;
+exports.makeLegalIdentifier = makeLegalIdentifier;
+exports.normalizePath = normalizePath;
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/dist/es/index.js b/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/dist/es/index.js
new file mode 100644
index 0000000..f46e608
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/dist/es/index.js
@@ -0,0 +1,453 @@
+import { extname, isAbsolute, posix, resolve , win32} from 'path';
+import pm from 'picomatch';
+
+const addExtension = function addExtension(filename, ext = '.js') {
+    let result = `${filename}`;
+    if (!extname(filename))
+        result += ext;
+    return result;
+};
+
+class WalkerBase {constructor() { WalkerBase.prototype.__init.call(this);WalkerBase.prototype.__init2.call(this);WalkerBase.prototype.__init3.call(this);WalkerBase.prototype.__init4.call(this); }
+	 __init() {this.should_skip = false;}
+	 __init2() {this.should_remove = false;}
+	 __init3() {this.replacement = null;}
+
+	 __init4() {this.context = {
+		skip: () => (this.should_skip = true),
+		remove: () => (this.should_remove = true),
+		replace: (node) => (this.replacement = node)
+	};}
+
+	 replace(parent, prop, index, node) {
+		if (parent) {
+			if (index !== null) {
+				parent[prop][index] = node;
+			} else {
+				parent[prop] = node;
+			}
+		}
+	}
+
+	 remove(parent, prop, index) {
+		if (parent) {
+			if (index !== null) {
+				parent[prop].splice(index, 1);
+			} else {
+				delete parent[prop];
+			}
+		}
+	}
+}
+
+class SyncWalkerClass extends WalkerBase {
+	
+	
+
+	constructor(walker) {
+		super();
+		this.enter = walker.enter;
+		this.leave = walker.leave;
+	}
+
+	 visit(
+		node,
+		parent,
+		enter,
+		leave,
+		prop,
+		index
+	) {
+		if (node) {
+			if (enter) {
+				const _should_skip = this.should_skip;
+				const _should_remove = this.should_remove;
+				const _replacement = this.replacement;
+				this.should_skip = false;
+				this.should_remove = false;
+				this.replacement = null;
+
+				enter.call(this.context, node, parent, prop, index);
+
+				if (this.replacement) {
+					node = this.replacement;
+					this.replace(parent, prop, index, node);
+				}
+
+				if (this.should_remove) {
+					this.remove(parent, prop, index);
+				}
+
+				const skipped = this.should_skip;
+				const removed = this.should_remove;
+
+				this.should_skip = _should_skip;
+				this.should_remove = _should_remove;
+				this.replacement = _replacement;
+
+				if (skipped) return node;
+				if (removed) return null;
+			}
+
+			for (const key in node) {
+				const value = (node )[key];
+
+				if (typeof value !== "object") {
+					continue;
+				} else if (Array.isArray(value)) {
+					for (let i = 0; i < value.length; i += 1) {
+						if (value[i] !== null && typeof value[i].type === 'string') {
+							if (!this.visit(value[i], node, enter, leave, key, i)) {
+								// removed
+								i--;
+							}
+						}
+					}
+				} else if (value !== null && typeof value.type === "string") {
+					this.visit(value, node, enter, leave, key, null);
+				}
+			}
+
+			if (leave) {
+				const _replacement = this.replacement;
+				const _should_remove = this.should_remove;
+				this.replacement = null;
+				this.should_remove = false;
+
+				leave.call(this.context, node, parent, prop, index);
+
+				if (this.replacement) {
+					node = this.replacement;
+					this.replace(parent, prop, index, node);
+				}
+
+				if (this.should_remove) {
+					this.remove(parent, prop, index);
+				}
+
+				const removed = this.should_remove;
+
+				this.replacement = _replacement;
+				this.should_remove = _should_remove;
+
+				if (removed) return null;
+			}
+		}
+
+		return node;
+	}
+}
+
+function walk(ast, walker) {
+	const instance = new SyncWalkerClass(walker);
+	return instance.visit(ast, null, walker.enter, walker.leave);
+}
+
+const extractors = {
+    ArrayPattern(names, param) {
+        for (const element of param.elements) {
+            if (element)
+                extractors[element.type](names, element);
+        }
+    },
+    AssignmentPattern(names, param) {
+        extractors[param.left.type](names, param.left);
+    },
+    Identifier(names, param) {
+        names.push(param.name);
+    },
+    MemberExpression() { },
+    ObjectPattern(names, param) {
+        for (const prop of param.properties) {
+            // @ts-ignore Typescript reports that this is not a valid type
+            if (prop.type === 'RestElement') {
+                extractors.RestElement(names, prop);
+            }
+            else {
+                extractors[prop.value.type](names, prop.value);
+            }
+        }
+    },
+    RestElement(names, param) {
+        extractors[param.argument.type](names, param.argument);
+    }
+};
+const extractAssignedNames = function extractAssignedNames(param) {
+    const names = [];
+    extractors[param.type](names, param);
+    return names;
+};
+
+const blockDeclarations = {
+    const: true,
+    let: true
+};
+class Scope {
+    constructor(options = {}) {
+        this.parent = options.parent;
+        this.isBlockScope = !!options.block;
+        this.declarations = Object.create(null);
+        if (options.params) {
+            options.params.forEach((param) => {
+                extractAssignedNames(param).forEach((name) => {
+                    this.declarations[name] = true;
+                });
+            });
+        }
+    }
+    addDeclaration(node, isBlockDeclaration, isVar) {
+        if (!isBlockDeclaration && this.isBlockScope) {
+            // it's a `var` or function node, and this
+            // is a block scope, so we need to go up
+            this.parent.addDeclaration(node, isBlockDeclaration, isVar);
+        }
+        else if (node.id) {
+            extractAssignedNames(node.id).forEach((name) => {
+                this.declarations[name] = true;
+            });
+        }
+    }
+    contains(name) {
+        return this.declarations[name] || (this.parent ? this.parent.contains(name) : false);
+    }
+}
+const attachScopes = function attachScopes(ast, propertyName = 'scope') {
+    let scope = new Scope();
+    walk(ast, {
+        enter(n, parent) {
+            const node = n;
+            // function foo () {...}
+            // class Foo {...}
+            if (/(Function|Class)Declaration/.test(node.type)) {
+                scope.addDeclaration(node, false, false);
+            }
+            // var foo = 1
+            if (node.type === 'VariableDeclaration') {
+                const { kind } = node;
+                const isBlockDeclaration = blockDeclarations[kind];
+                node.declarations.forEach((declaration) => {
+                    scope.addDeclaration(declaration, isBlockDeclaration, true);
+                });
+            }
+            let newScope;
+            // create new function scope
+            if (/Function/.test(node.type)) {
+                const func = node;
+                newScope = new Scope({
+                    parent: scope,
+                    block: false,
+                    params: func.params
+                });
+                // named function expressions - the name is considered
+                // part of the function's scope
+                if (func.type === 'FunctionExpression' && func.id) {
+                    newScope.addDeclaration(func, false, false);
+                }
+            }
+            // create new for scope
+            if (/For(In|Of)?Statement/.test(node.type)) {
+                newScope = new Scope({
+                    parent: scope,
+                    block: true
+                });
+            }
+            // create new block scope
+            if (node.type === 'BlockStatement' && !/Function/.test(parent.type)) {
+                newScope = new Scope({
+                    parent: scope,
+                    block: true
+                });
+            }
+            // catch clause has its own block scope
+            if (node.type === 'CatchClause') {
+                newScope = new Scope({
+                    parent: scope,
+                    params: node.param ? [node.param] : [],
+                    block: true
+                });
+            }
+            if (newScope) {
+                Object.defineProperty(node, propertyName, {
+                    value: newScope,
+                    configurable: true
+                });
+                scope = newScope;
+            }
+        },
+        leave(n) {
+            const node = n;
+            if (node[propertyName])
+                scope = scope.parent;
+        }
+    });
+    return scope;
+};
+
+// Helper since Typescript can't detect readonly arrays with Array.isArray
+function isArray(arg) {
+    return Array.isArray(arg);
+}
+function ensureArray(thing) {
+    if (isArray(thing))
+        return thing;
+    if (thing == null)
+        return [];
+    return [thing];
+}
+
+const normalizePath = function (filename) {
+    return filename.split(win32.sep).join(posix.sep);
+};
+
+function getMatcherString(id, resolutionBase) {
+    if (resolutionBase === false || isAbsolute(id) || id.startsWith('*')) {
+        return id;
+    }
+    // resolve('') is valid and will default to process.cwd()
+    const basePath = normalizePath(resolve(resolutionBase || ''))
+        // escape all possible (posix + win) path characters that might interfere with regex
+        .replace(/[-^$*+?.()|[\]{}]/g, '\\$&');
+    // Note that we use posix.join because:
+    // 1. the basePath has been normalized to use /
+    // 2. the incoming glob (id) matcher, also uses /
+    // otherwise Node will force backslash (\) on windows
+    return posix.join(basePath, id);
+}
+const createFilter = function createFilter(include, exclude, options) {
+    const resolutionBase = options && options.resolve;
+    const getMatcher = (id) => id instanceof RegExp
+        ? id
+        : {
+            test: (what) => {
+                // this refactor is a tad overly verbose but makes for easy debugging
+                const pattern = getMatcherString(id, resolutionBase);
+                const fn = pm(pattern, { dot: true });
+                const result = fn(what);
+                return result;
+            }
+        };
+    const includeMatchers = ensureArray(include).map(getMatcher);
+    const excludeMatchers = ensureArray(exclude).map(getMatcher);
+    return function result(id) {
+        if (typeof id !== 'string')
+            return false;
+        if (/\0/.test(id))
+            return false;
+        const pathId = normalizePath(id);
+        for (let i = 0; i < excludeMatchers.length; ++i) {
+            const matcher = excludeMatchers[i];
+            if (matcher.test(pathId))
+                return false;
+        }
+        for (let i = 0; i < includeMatchers.length; ++i) {
+            const matcher = includeMatchers[i];
+            if (matcher.test(pathId))
+                return true;
+        }
+        return !includeMatchers.length;
+    };
+};
+
+const reservedWords = 'break case class catch const continue debugger default delete do else export extends finally for function if import in instanceof let new return super switch this throw try typeof var void while with yield enum await implements package protected static interface private public';
+const builtins = 'arguments Infinity NaN undefined null true false eval uneval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Symbol Error EvalError InternalError RangeError ReferenceError SyntaxError TypeError URIError Number Math Date String RegExp Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array Map Set WeakMap WeakSet SIMD ArrayBuffer DataView JSON Promise Generator GeneratorFunction Reflect Proxy Intl';
+const forbiddenIdentifiers = new Set(`${reservedWords} ${builtins}`.split(' '));
+forbiddenIdentifiers.add('');
+const makeLegalIdentifier = function makeLegalIdentifier(str) {
+    let identifier = str
+        .replace(/-(\w)/g, (_, letter) => letter.toUpperCase())
+        .replace(/[^$_a-zA-Z0-9]/g, '_');
+    if (/\d/.test(identifier[0]) || forbiddenIdentifiers.has(identifier)) {
+        identifier = `_${identifier}`;
+    }
+    return identifier || '_';
+};
+
+function stringify(obj) {
+    return (JSON.stringify(obj) || 'undefined').replace(/[\u2028\u2029]/g, (char) => `\\u${`000${char.charCodeAt(0).toString(16)}`.slice(-4)}`);
+}
+function serializeArray(arr, indent, baseIndent) {
+    let output = '[';
+    const separator = indent ? `\n${baseIndent}${indent}` : '';
+    for (let i = 0; i < arr.length; i++) {
+        const key = arr[i];
+        output += `${i > 0 ? ',' : ''}${separator}${serialize(key, indent, baseIndent + indent)}`;
+    }
+    return `${output}${indent ? `\n${baseIndent}` : ''}]`;
+}
+function serializeObject(obj, indent, baseIndent) {
+    let output = '{';
+    const separator = indent ? `\n${baseIndent}${indent}` : '';
+    const entries = Object.entries(obj);
+    for (let i = 0; i < entries.length; i++) {
+        const [key, value] = entries[i];
+        const stringKey = makeLegalIdentifier(key) === key ? key : stringify(key);
+        output += `${i > 0 ? ',' : ''}${separator}${stringKey}:${indent ? ' ' : ''}${serialize(value, indent, baseIndent + indent)}`;
+    }
+    return `${output}${indent ? `\n${baseIndent}` : ''}}`;
+}
+function serialize(obj, indent, baseIndent) {
+    if (obj === Infinity)
+        return 'Infinity';
+    if (obj === -Infinity)
+        return '-Infinity';
+    if (obj === 0 && 1 / obj === -Infinity)
+        return '-0';
+    if (obj instanceof Date)
+        return `new Date(${obj.getTime()})`;
+    if (obj instanceof RegExp)
+        return obj.toString();
+    if (obj !== obj)
+        return 'NaN'; // eslint-disable-line no-self-compare
+    if (Array.isArray(obj))
+        return serializeArray(obj, indent, baseIndent);
+    if (obj === null)
+        return 'null';
+    if (typeof obj === 'object')
+        return serializeObject(obj, indent, baseIndent);
+    return stringify(obj);
+}
+const dataToEsm = function dataToEsm(data, options = {}) {
+    const t = options.compact ? '' : 'indent' in options ? options.indent : '\t';
+    const _ = options.compact ? '' : ' ';
+    const n = options.compact ? '' : '\n';
+    const declarationType = options.preferConst ? 'const' : 'var';
+    if (options.namedExports === false ||
+        typeof data !== 'object' ||
+        Array.isArray(data) ||
+        data instanceof Date ||
+        data instanceof RegExp ||
+        data === null) {
+        const code = serialize(data, options.compact ? null : t, '');
+        const magic = _ || (/^[{[\-\/]/.test(code) ? '' : ' '); // eslint-disable-line no-useless-escape
+        return `export default${magic}${code};`;
+    }
+    let namedExportCode = '';
+    const defaultExportRows = [];
+    for (const [key, value] of Object.entries(data)) {
+        if (key === makeLegalIdentifier(key)) {
+            if (options.objectShorthand)
+                defaultExportRows.push(key);
+            else
+                defaultExportRows.push(`${key}:${_}${key}`);
+            namedExportCode += `export ${declarationType} ${key}${_}=${_}${serialize(value, options.compact ? null : t, '')};${n}`;
+        }
+        else {
+            defaultExportRows.push(`${stringify(key)}:${_}${serialize(value, options.compact ? null : t, '')}`);
+        }
+    }
+    return `${namedExportCode}export default${_}{${n}${t}${defaultExportRows.join(`,${n}${t}`)}${n}};${n}`;
+};
+
+// TODO: remove this in next major
+var index = {
+    addExtension,
+    attachScopes,
+    createFilter,
+    dataToEsm,
+    extractAssignedNames,
+    makeLegalIdentifier,
+    normalizePath
+};
+
+export default index;
+export { addExtension, attachScopes, createFilter, dataToEsm, extractAssignedNames, makeLegalIdentifier, normalizePath };
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/dist/es/package.json b/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/dist/es/package.json
new file mode 100644
index 0000000..3dbc1ca
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/dist/es/package.json
@@ -0,0 +1,3 @@
+{
+  "type": "module"
+}
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/package.json b/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/package.json
new file mode 100644
index 0000000..d6e704a
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/package.json
@@ -0,0 +1,93 @@
+{
+  "name": "@rollup/pluginutils",
+  "version": "4.1.0",
+  "publishConfig": {
+    "access": "public"
+  },
+  "description": "A set of utility functions commonly used by Rollup plugins",
+  "license": "MIT",
+  "repository": "rollup/plugins",
+  "author": "Rich Harris <richard.a.harris@gmail.com>",
+  "homepage": "https://github.com/rollup/plugins/tree/master/packages/pluginutils#readme",
+  "bugs": {
+    "url": "https://github.com/rollup/plugins/issues"
+  },
+  "main": "./dist/cjs/index.js",
+  "module": "./dist/es/index.js",
+  "type": "commonjs",
+  "exports": {
+    "require": "./dist/cjs/index.js",
+    "import": "./dist/es/index.js"
+  },
+  "engines": {
+    "node": ">= 8.0.0"
+  },
+  "scripts": {
+    "build": "rollup -c",
+    "ci:coverage": "nyc pnpm run test && nyc report --reporter=text-lcov > coverage.lcov",
+    "ci:lint": "pnpm run build && pnpm run lint",
+    "ci:lint:commits": "commitlint --from=${CIRCLE_BRANCH} --to=${CIRCLE_SHA1}",
+    "ci:test": "pnpm run test -- --verbose",
+    "lint": "pnpm run lint:js && pnpm run lint:docs && pnpm run lint:package",
+    "lint:docs": "prettier --single-quote --arrow-parens avoid --trailing-comma none --write README.md",
+    "lint:js": "eslint --fix --cache src test types --ext .js,.ts",
+    "lint:package": "prettier --write package.json --plugin=prettier-plugin-package",
+    "prebuild": "del-cli dist",
+    "prepare": "pnpm run build",
+    "prepublishOnly": "pnpm run lint && pnpm run build",
+    "pretest": "pnpm run build -- --sourcemap",
+    "test": "ava"
+  },
+  "files": [
+    "dist",
+    "types",
+    "README.md",
+    "LICENSE"
+  ],
+  "keywords": [
+    "rollup",
+    "plugin",
+    "utils"
+  ],
+  "peerDependencies": {
+    "rollup": "^1.20.0||^2.0.0"
+  },
+  "dependencies": {
+    "estree-walker": "^2.0.1",
+    "picomatch": "^2.2.2"
+  },
+  "devDependencies": {
+    "@rollup/plugin-commonjs": "^14.0.0",
+    "@rollup/plugin-node-resolve": "^8.4.0",
+    "@rollup/plugin-typescript": "^5.0.2",
+    "@types/estree": "0.0.45",
+    "@types/node": "^14.0.26",
+    "@types/picomatch": "^2.2.1",
+    "acorn": "^8.0.4",
+    "rollup": "^2.23.0"
+  },
+  "types": "types/index.d.ts",
+  "ava": {
+    "babel": {
+      "compileEnhancements": false
+    },
+    "extensions": [
+      "ts"
+    ],
+    "require": [
+      "ts-node/register"
+    ],
+    "files": [
+      "!**/fixtures/**",
+      "!**/helpers/**",
+      "!**/recipes/**",
+      "!**/types.ts"
+    ]
+  },
+  "nyc": {
+    "extension": [
+      ".js",
+      ".ts"
+    ]
+  }
+}
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/types/index.d.ts b/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/types/index.d.ts
new file mode 100755
index 0000000..39f7ab8
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/node_modules/@rollup/pluginutils/types/index.d.ts
@@ -0,0 +1,93 @@
+// eslint-disable-next-line import/no-unresolved
+import { BaseNode } from 'estree';
+
+export interface AttachedScope {
+  parent?: AttachedScope;
+  isBlockScope: boolean;
+  declarations: { [key: string]: boolean };
+  addDeclaration(node: BaseNode, isBlockDeclaration: boolean, isVar: boolean): void;
+  contains(name: string): boolean;
+}
+
+export interface DataToEsmOptions {
+  compact?: boolean;
+  indent?: string;
+  namedExports?: boolean;
+  objectShorthand?: boolean;
+  preferConst?: boolean;
+}
+
+/**
+ * A valid `minimatch` pattern, or array of patterns.
+ */
+export type FilterPattern = ReadonlyArray<string | RegExp> | string | RegExp | null;
+
+/**
+ * Adds an extension to a module ID if one does not exist.
+ */
+export function addExtension(filename: string, ext?: string): string;
+
+/**
+ * Attaches `Scope` objects to the relevant nodes of an AST.
+ * Each `Scope` object has a `scope.contains(name)` method that returns `true`
+ * if a given name is defined in the current scope or a parent scope.
+ */
+export function attachScopes(ast: BaseNode, propertyName?: string): AttachedScope;
+
+/**
+ * Constructs a filter function which can be used to determine whether or not
+ * certain modules should be operated upon.
+ * @param include If `include` is omitted or has zero length, filter will return `true` by default.
+ * @param exclude ID must not match any of the `exclude` patterns.
+ * @param options Optionally resolves the patterns against a directory other than `process.cwd()`.
+ * If a `string` is specified, then the value will be used as the base directory.
+ * Relative paths will be resolved against `process.cwd()` first.
+ * If `false`, then the patterns will not be resolved against any directory.
+ * This can be useful if you want to create a filter for virtual module names.
+ */
+export function createFilter(
+  include?: FilterPattern,
+  exclude?: FilterPattern,
+  options?: { resolve?: string | false | null }
+): (id: string | unknown) => boolean;
+
+/**
+ * Transforms objects into tree-shakable ES Module imports.
+ * @param data An object to transform into an ES module.
+ */
+export function dataToEsm(data: unknown, options?: DataToEsmOptions): string;
+
+/**
+ * Extracts the names of all assignment targets based upon specified patterns.
+ * @param param An `acorn` AST Node.
+ */
+export function extractAssignedNames(param: BaseNode): string[];
+
+/**
+ * Constructs a bundle-safe identifier from a `string`.
+ */
+export function makeLegalIdentifier(str: string): string;
+
+/**
+ * Converts path separators to forward slash.
+ */
+export function normalizePath(filename: string): string;
+
+export type AddExtension = typeof addExtension;
+export type AttachScopes = typeof attachScopes;
+export type CreateFilter = typeof createFilter;
+export type ExtractAssignedNames = typeof extractAssignedNames;
+export type MakeLegalIdentifier = typeof makeLegalIdentifier;
+export type NormalizePath = typeof normalizePath;
+export type DataToEsm = typeof dataToEsm;
+
+declare const defaultExport: {
+  addExtension: AddExtension;
+  attachScopes: AttachScopes;
+  createFilter: CreateFilter;
+  dataToEsm: DataToEsm;
+  extractAssignedNames: ExtractAssignedNames;
+  makeLegalIdentifier: MakeLegalIdentifier;
+  normalizePath: NormalizePath;
+};
+export default defaultExport;
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/package.json b/node_modules/@web/rollup-plugin-import-meta-assets/package.json
new file mode 100644
index 0000000..0dc9389
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/package.json
@@ -0,0 +1,49 @@
+{
+  "name": "@web/rollup-plugin-import-meta-assets",
+  "version": "1.0.6",
+  "publishConfig": {
+    "access": "public"
+  },
+  "description": "Rollup plugin that detects assets references relative to modules using patterns such as `new URL('./path/to/asset.ext', import.meta.url)`. The assets are added to the rollup pipeline, allowing them to be transformed and hash the filenames.",
+  "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/modernweb-dev/web.git",
+    "directory": "packages/rollup-plugin-import-meta-assets"
+  },
+  "author": "modern-web",
+  "homepage": "https://github.com/modernweb-dev/web/tree/master/packages/rollup-plugin-import-meta-assets",
+  "main": "src/index.js",
+  "exports": {
+    ".": {
+      "import": "./index.mjs",
+      "require": "./src/index.js"
+    }
+  },
+  "engines": {
+    "node": ">=10.0.0"
+  },
+  "scripts": {
+    "test": "npm run test:node",
+    "test:node": "mocha test/**/*.test.js test/*.test.js",
+    "test:update-snapshots": "mocha test/**/*.test.js test/*.test.js --update-snapshots",
+    "test:watch": "npm run test:node -- --watch"
+  },
+  "files": [
+    "*.js",
+    "*.mjs",
+    "dist",
+    "src"
+  ],
+  "keywords": [
+    "rollup",
+    "plugin",
+    "import-meta"
+  ],
+  "dependencies": {
+    "@rollup/pluginutils": "^4.1.0",
+    "estree-walker": "^2.0.2",
+    "magic-string": "^0.25.7"
+  },
+  "types": "dist/index"
+}
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/src/index.js b/node_modules/@web/rollup-plugin-import-meta-assets/src/index.js
new file mode 100644
index 0000000..0a92518
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/src/index.js
@@ -0,0 +1,3 @@
+/* eslint-disable @typescript-eslint/ban-ts-comment */
+// @ts-nocheck
+module.exports = require('./rollup-plugin-import-meta-assets');
diff --git a/node_modules/@web/rollup-plugin-import-meta-assets/src/rollup-plugin-import-meta-assets.js b/node_modules/@web/rollup-plugin-import-meta-assets/src/rollup-plugin-import-meta-assets.js
new file mode 100644
index 0000000..9d871ed
--- /dev/null
+++ b/node_modules/@web/rollup-plugin-import-meta-assets/src/rollup-plugin-import-meta-assets.js
@@ -0,0 +1,113 @@
+/* eslint-disable @typescript-eslint/ban-ts-comment */
+// @ts-nocheck
+'use strict';
+
+const fs = require('fs');
+const path = require('path');
+const { createFilter } = require('@rollup/pluginutils');
+const { asyncWalk } = require('estree-walker');
+const MagicString = require('magic-string');
+
+/**
+ * Extract the relative path from an AST node representing this kind of expression `new URL('./path/to/asset.ext', import.meta.url)`.
+ *
+ * @param {import('estree').Node} node - The AST node
+ * @returns {string} The relative path
+ */
+function getRelativeAssetPath(node) {
+  const browserPath = node.arguments[0].value;
+  return browserPath.split('/').join(path.sep);
+}
+
+/**
+ * Checks if a AST node represents this kind of expression: `new URL('./path/to/asset.ext', import.meta.url)`.
+ *
+ * @param {import('estree').Node} node - The AST node
+ * @returns {boolean}
+ */
+function isNewUrlImportMetaUrl(node) {
+  return (
+    node.type === 'NewExpression' &&
+    node.callee.type === 'Identifier' &&
+    node.callee.name === 'URL' &&
+    node.arguments.length === 2 &&
+    node.arguments[0].type === 'Literal' &&
+    typeof getRelativeAssetPath(node) === 'string' &&
+    node.arguments[1].type === 'MemberExpression' &&
+    node.arguments[1].object.type === 'MetaProperty' &&
+    node.arguments[1].property.type === 'Identifier' &&
+    node.arguments[1].property.name === 'url'
+  );
+}
+
+/**
+ * Detects assets references relative to modules using patterns such as `new URL('./path/to/asset.ext', import.meta.url)`.
+ * The assets are added to the rollup pipeline, allowing them to be transformed and hash the filenames.
+ *
+ * @param {object} options
+ * @param {string|string[]} [options.include] A picomatch pattern, or array of patterns, which specifies the files in the build the plugin should operate on. By default all files are targeted.
+ * @param {string|string[]} [options.exclude] A picomatch pattern, or array of patterns, which specifies the files in the build the plugin should _ignore_. By default no files are ignored.
+ * @param {boolean} [options.warnOnError] By default, the plugin quits the build process when it encounters an error. If you set this option to true, it will throw a warning instead and leave the code untouched.
+ * @param {function} [options.transform] A function to transform assets.
+ * @return {import('rollup').Plugin} A Rollup Plugin
+ */
+function importMetaAssets({ include, exclude, warnOnError, transform } = {}) {
+  const filter = createFilter(include, exclude);
+
+  return {
+    name: 'rollup-plugin-import-meta-assets',
+
+    async transform(code, id) {
+      if (!filter(id)) {
+        return null;
+      }
+
+      const ast = this.parse(code);
+      const magicString = new MagicString(code);
+      let modifiedCode = false;
+
+      await asyncWalk(ast, {
+        enter: async node => {
+          if (isNewUrlImportMetaUrl(node)) {
+            const absoluteScriptDir = path.dirname(id);
+            const relativeAssetPath = getRelativeAssetPath(node);
+            const absoluteAssetPath = path.resolve(absoluteScriptDir, relativeAssetPath);
+            const assetName = path.basename(absoluteAssetPath);
+
+            try {
+              const assetContents = await fs.promises.readFile(absoluteAssetPath);
+              const transformedAssetContents =
+                transform != null
+                  ? await transform(assetContents, absoluteAssetPath)
+                  : assetContents;
+              const ref = this.emitFile({
+                type: 'asset',
+                name: assetName,
+                source: transformedAssetContents,
+              });
+              magicString.overwrite(
+                node.arguments[0].start,
+                node.arguments[0].end,
+                `import.meta.ROLLUP_FILE_URL_${ref}`,
+              );
+              modifiedCode = true;
+            } catch (error) {
+              if (warnOnError) {
+                this.warn(error, node.arguments[0].start);
+              } else {
+                this.error(error, node.arguments[0].start);
+              }
+            }
+          }
+        },
+      });
+
+      return {
+        code: magicString.toString(),
+        map: modifiedCode ? magicString.generateMap({ hires: true }) : null,
+      };
+    },
+  };
+}
+
+module.exports = { importMetaAssets };
diff --git a/node_modules/boolbase/README.md b/node_modules/boolbase/README.md
new file mode 100644
index 0000000..85eefa5
--- /dev/null
+++ b/node_modules/boolbase/README.md
@@ -0,0 +1,10 @@
+#boolbase
+This very simple module provides two basic functions, one that always returns true (`trueFunc`) and one that always returns false (`falseFunc`).
+
+###WTF?
+
+By having only a single instance of these functions around, it's possible to do some nice optimizations. Eg. [`CSSselect`](https://github.com/fb55/CSSselect) uses these functions to determine whether a selector won't match any elements. If that's the case, the DOM doesn't even have to be touched.
+
+###And why is this a separate module?
+
+I'm trying to modularize `CSSselect` and most modules depend on these functions. IMHO, having a separate module is the easiest solution to this problem.
\ No newline at end of file
diff --git a/node_modules/boolbase/index.js b/node_modules/boolbase/index.js
new file mode 100644
index 0000000..8799fd9
--- /dev/null
+++ b/node_modules/boolbase/index.js
@@ -0,0 +1,8 @@
+module.exports = {
+	trueFunc: function trueFunc(){
+		return true;
+	},
+	falseFunc: function falseFunc(){
+		return false;
+	}
+};
\ No newline at end of file
diff --git a/node_modules/boolbase/package.json b/node_modules/boolbase/package.json
new file mode 100644
index 0000000..78330a8
--- /dev/null
+++ b/node_modules/boolbase/package.json
@@ -0,0 +1,23 @@
+{
+  "name": "boolbase",
+  "version": "1.0.0",
+  "description": "two functions: One that returns true, one that returns false",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/fb55/boolbase"
+  },
+  "keywords": [
+    "boolean",
+    "function"
+  ],
+  "author": "Felix Boehm <me@feedic.com>",
+  "license": "ISC",
+  "bugs": {
+    "url": "https://github.com/fb55/boolbase/issues"
+  },
+  "homepage": "https://github.com/fb55/boolbase"
+}
diff --git a/node_modules/css-select/LICENSE b/node_modules/css-select/LICENSE
new file mode 100644
index 0000000..c464f86
--- /dev/null
+++ b/node_modules/css-select/LICENSE
@@ -0,0 +1,11 @@
+Copyright (c) Felix Böhm
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/css-select/README.md b/node_modules/css-select/README.md
new file mode 100644
index 0000000..dc49f04
--- /dev/null
+++ b/node_modules/css-select/README.md
@@ -0,0 +1,259 @@
+# css-select [![NPM version](http://img.shields.io/npm/v/css-select.svg)](https://npmjs.org/package/css-select) [![Build Status](https://travis-ci.com/fb55/css-select.svg?branch=master)](http://travis-ci.com/fb55/css-select) [![Downloads](https://img.shields.io/npm/dm/css-select.svg)](https://npmjs.org/package/css-select) [![Coverage](https://coveralls.io/repos/fb55/css-select/badge.svg?branch=master)](https://coveralls.io/r/fb55/css-select)
+
+a CSS selector compiler/engine
+
+## What?
+
+css-select turns CSS selectors into functions that tests if elements match them. When searching for elements, testing is executed "from the top", similar to how browsers execute CSS selectors.
+
+In its default configuration, css-select queries the DOM structure of the [`domhandler`](https://github.com/fb55/domhandler) module (also known as htmlparser2 DOM).
+It uses [`domutils`](https://github.com/fb55/domutils) as its default adapter over the DOM structure. See Options below for details on querying alternative DOM structures.
+
+**Features:**
+
+-   Full implementation of CSS3 selectors
+-   Partial implementation of jQuery/Sizzle extensions
+-   Very high test coverage
+-   Pretty good performance
+
+## Why?
+
+The traditional approach of executing CSS selectors, named left-to-right execution, is to execute every component of the selector in order, from left to right _(duh)_. The execution of the selector `a b` for example will first query for `a` elements, then search these for `b` elements. (That's the approach of eg. [`Sizzle`](https://github.com/jquery/sizzle), [`nwmatcher`](https://github.com/dperini/nwmatcher/) and [`qwery`](https://github.com/ded/qwery).)
+
+While this works, it has some downsides: Children of `a`s will be checked multiple times; first, to check if they are also `a`s, then, for every superior `a` once, if they are `b`s. Using [Big O notation](http://en.wikipedia.org/wiki/Big_O_notation), that would be `O(n^(k+1))`, where `k` is the number of descendant selectors (that's the space in the example above).
+
+The far more efficient approach is to first look for `b` elements, then check if they have superior `a` elements: Using big O notation again, that would be `O(n)`. That's called right-to-left execution.
+
+And that's what css-select does – and why it's quite performant.
+
+## How does it work?
+
+By building a stack of functions.
+
+_Wait, what?_
+
+Okay, so let's suppose we want to compile the selector `a b` again, for right-to-left execution. We start by _parsing_ the selector, which means we turn the selector into an array of the building-blocks of the selector, so we can distinguish them easily. That's what the [`css-what`](https://github.com/fb55/css-what) module is for, if you want to have a look.
+
+Anyway, after parsing, we end up with an array like this one:
+
+```js
+[
+    { type: "tag", name: "a" },
+    { type: "descendant" },
+    { type: "tag", name: "b" },
+];
+```
+
+Actually, this array is wrapped in another array, but that's another story (involving commas in selectors).
+
+Now that we know the meaning of every part of the selector, we can compile it. That's where it becomes interesting.
+
+The basic idea is to turn every part of the selector into a function, which takes an element as its only argument. The function checks whether a passed element matches its part of the selector: If it does, the element is passed to the next turned-into-a-function part of the selector, which does the same. If an element is accepted by all parts of the selector, it _matches_ the selector and double rainbow ALL THE WAY.
+
+As said before, we want to do right-to-left execution with all the big O improvements nonsense, so elements are passed from the rightmost part of the selector (`b` in our example) to the leftmost (~~which would be `c`~~ of course `a`).
+
+_//TODO: More in-depth description. Implementation details. Build a spaceship._
+
+## API
+
+```js
+const CSSselect = require("css-select");
+```
+
+**Note:** css-select throws errors when invalid selectors are passed to it, contrary to the behavior in browsers, which swallow them. This is done to aid with writing css selectors, but can be unexpected when processing arbitrary strings.
+
+#### `CSSselect.selectAll(query, elems, options)`
+
+Queries `elems`, returns an array containing all matches.
+
+-   `query` can be either a CSS selector or a function.
+-   `elems` can be either an array of elements, or a single element. If it is an element, its children will be queried.
+-   `options` is described below.
+
+Aliases: `default` export, `CSSselect.iterate(query, elems)`.
+
+#### `CSSselect.compile(query)`
+
+Compiles the query, returns a function.
+
+#### `CSSselect.is(elem, query, options)`
+
+Tests whether or not an element is matched by `query`. `query` can be either a CSS selector or a function.
+
+#### `CSSselect.selectOne(query, elems, options)`
+
+Arguments are the same as for `CSSselect.selectAll(query, elems)`.
+Only returns the first match, or `null` if there was no match.
+
+### Options
+
+-   `xmlMode`: When enabled, tag names will be case-sensitive. Default: `false`.
+-   `strict`: Limits the module to only use CSS3 selectors. Default: `false`.
+-   `rootFunc`: The last function in the stack, will be called with the last element that's looked at. Should return `true`.
+-   `adapter`: The adapter to use when interacting with the backing DOM structure. By default it uses [`domutils`](https://github.com/fb55/domutils).
+
+#### Custom Adapters
+
+A custom adapter must implement the following functions:
+
+```
+isTag, existsOne, getAttributeValue, getChildren, getName, getParent,
+getSiblings, getText, hasAttrib, removeSubsets, findAll, findOne
+```
+
+The method signature notation used below should be fairly intuitive - if not,
+see the [`TypeScript`](https://www.typescriptlang.org/) docs, as it is very similar to both of those.
+You may also want to look at [`domutils`](https://github.com/fb55/domutils) to see the default
+implementation, or at [`css-select-browser-adapter`](https://github.com/nrkn/css-select-browser-adapter/blob/master/index.js)
+for an implementation backed by the DOM.
+
+```ts
+interface Adapter<Node, ElementNode extends Node> {
+    /**
+     *  Is the node a tag?
+     */
+    isTag: (node: Node) => node is ElementNode;
+
+    /**
+     * Does at least one of passed element nodes pass the test predicate?
+     */
+    existsOne: (test: Predicate<ElementNode>, elems: Node[]) => boolean;
+
+    /**
+     * Get the attribute value.
+     */
+    getAttributeValue: (elem: ElementNode, name: string) => string | undefined;
+
+    /**
+     * Get the node's children
+     */
+    getChildren: (node: Node) => Node[];
+
+    /**
+     * Get the name of the tag
+     */
+    getName: (elem: ElementNode) => string;
+
+    /**
+     * Get the parent of the node
+     */
+    getParent: (node: ElementNode) => ElementNode | null;
+
+    /**
+     * Get the siblings of the node. Note that unlike jQuery's `siblings` method,
+     * this is expected to include the current node as well
+     */
+    getSiblings: (node: Node) => Node[];
+
+    /**
+     * Get the text content of the node, and its children if it has any.
+     */
+    getText: (node: Node) => string;
+
+    /**
+     * Does the element have the named attribute?
+     */
+    hasAttrib: (elem: ElementNode, name: string) => boolean;
+
+    /**
+     * Takes an array of nodes, and removes any duplicates, as well as any
+     * nodes whose ancestors are also in the array.
+     */
+    removeSubsets: (nodes: Node[]) => Node[];
+
+    /**
+     * Finds all of the element nodes in the array that match the test predicate,
+     * as well as any of their children that match it.
+     */
+    findAll: (test: Predicate<ElementNode>, nodes: Node[]) => ElementNode[];
+
+    /**
+     * Finds the first node in the array that matches the test predicate, or one
+     * of its children.
+     */
+    findOne: (
+        test: Predicate<ElementNode>,
+        elems: Node[]
+    ) => ElementNode | null;
+
+    /**
+     * The adapter can also optionally include an equals method, if your DOM
+     * structure needs a custom equality test to compare two objects which refer
+     * to the same underlying node. If not provided, `css-select` will fall back to
+     * `a === b`.
+     */
+    equals?: (a: Node, b: Node) => boolean;
+
+    /**
+     * Is the element in hovered state?
+     */
+    isHovered?: (elem: ElementNode) => boolean;
+
+    /**
+     * Is the element in visited state?
+     */
+    isVisited?: (elem: ElementNode) => boolean;
+
+    /**
+     * Is the element in active state?
+     */
+    isActive?: (elem: ElementNode) => boolean;
+}
+```
+
+## Supported selectors
+
+_As defined by CSS 4 and / or jQuery._
+
+-   Universal (`*`)
+-   Tag (`<tagname>`)
+-   Descendant (``)
+-   Child (`>`)
+-   Parent (`<`) \*
+-   Sibling (`+`)
+-   Adjacent (`~`)
+-   Attribute (`[attr=foo]`), with supported comparisons:
+    -   `[attr]` (existential)
+    -   `=`
+    -   `~=`
+    -   `|=`
+    -   `*=`
+    -   `^=`
+    -   `$=`
+    -   `!=` \*
+    -   Also, `i` can be added after the comparison to make the comparison case-insensitive (eg. `[attr=foo i]`) \*
+-   Pseudos:
+    -   `:not`
+    -   `:contains` \*
+    -   `:icontains` \* (case-insensitive version of `:contains`)
+    -   `:has` \*
+    -   `:root`
+    -   `:empty`
+    -   `:parent` \*
+    -   `:[first|last]-child[-of-type]`
+    -   `:only-of-type`, `:only-child`
+    -   `:nth-[last-]child[-of-type]`
+    -   `:link`, `:any-link`
+    -   `:visited`, `:hover`, `:active` \* (these depend on optional Adapter methods, so these will work only if implemented in Adapter)
+    -   `:selected` \*, `:checked`
+    -   `:enabled`, `:disabled`
+    -   `:required`, `:optional`
+    -   `:header`, `:button`, `:input`, `:text`, `:checkbox`, `:file`, `:password`, `:reset`, `:radio` etc. \*
+    -   `:matches`, `:is` \*
+
+**\***: Not part of CSS3
+
+---
+
+License: BSD-2-Clause
+
+## Security contact information
+
+To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security).
+Tidelift will coordinate the fix and disclosure.
+
+## `css-select` for enterprise
+
+Available as part of the Tidelift Subscription
+
+The maintainers of `css-select` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-css-select?utm_source=npm-css-select&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
diff --git a/node_modules/css-select/lib/attributes.d.ts b/node_modules/css-select/lib/attributes.d.ts
new file mode 100644
index 0000000..bcbc396
--- /dev/null
+++ b/node_modules/css-select/lib/attributes.d.ts
@@ -0,0 +1,7 @@
+import { CompiledQuery, InternalOptions } from "./types";
+import type { AttributeSelector, AttributeAction } from "css-what";
+/**
+ * Attribute selectors
+ */
+export declare const attributeRules: Record<AttributeAction, <Node, ElementNode extends Node>(next: CompiledQuery<ElementNode>, data: AttributeSelector, options: InternalOptions<Node, ElementNode>) => CompiledQuery<ElementNode>>;
+//# sourceMappingURL=attributes.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/lib/attributes.d.ts.map b/node_modules/css-select/lib/attributes.d.ts.map
new file mode 100644
index 0000000..08120b8
--- /dev/null
+++ b/node_modules/css-select/lib/attributes.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"attributes.d.ts","sourceRoot":"","sources":["../src/attributes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAanE;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAC/B,eAAe,EACf,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI,EAC3B,IAAI,EAAE,aAAa,CAAC,WAAW,CAAC,EAChC,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,KAC1C,aAAa,CAAC,WAAW,CAAC,CA0JlC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/css-select/lib/attributes.js b/node_modules/css-select/lib/attributes.js
new file mode 100644
index 0000000..e30a609
--- /dev/null
+++ b/node_modules/css-select/lib/attributes.js
@@ -0,0 +1,160 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.attributeRules = void 0;
+var boolbase_1 = require("boolbase");
+/**
+ * All reserved characters in a regex, used for escaping.
+ *
+ * Taken from XRegExp, (c) 2007-2020 Steven Levithan under the MIT license
+ * https://github.com/slevithan/xregexp/blob/95eeebeb8fac8754d54eafe2b4743661ac1cf028/src/xregexp.js#L794
+ */
+var reChars = /[-[\]{}()*+?.,\\^$|#\s]/g;
+function escapeRegex(value) {
+    return value.replace(reChars, "\\$&");
+}
+/**
+ * Attribute selectors
+ */
+exports.attributeRules = {
+    equals: function (next, data, _a) {
+        var adapter = _a.adapter;
+        var name = data.name;
+        var value = data.value;
+        if (data.ignoreCase) {
+            value = value.toLowerCase();
+            return function (elem) {
+                var _a;
+                return ((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.toLowerCase()) ===
+                    value && next(elem);
+            };
+        }
+        return function (elem) {
+            return adapter.getAttributeValue(elem, name) === value && next(elem);
+        };
+    },
+    hyphen: function (next, data, _a) {
+        var adapter = _a.adapter;
+        var name = data.name;
+        var value = data.value;
+        var len = value.length;
+        if (data.ignoreCase) {
+            value = value.toLowerCase();
+            return function hyphenIC(elem) {
+                var attr = adapter.getAttributeValue(elem, name);
+                return (attr != null &&
+                    (attr.length === len || attr.charAt(len) === "-") &&
+                    attr.substr(0, len).toLowerCase() === value &&
+                    next(elem));
+            };
+        }
+        return function hyphen(elem) {
+            var attr = adapter.getAttributeValue(elem, name);
+            return (attr != null &&
+                attr.substr(0, len) === value &&
+                (attr.length === len || attr.charAt(len) === "-") &&
+                next(elem));
+        };
+    },
+    element: function (next, _a, _b) {
+        var name = _a.name, value = _a.value, ignoreCase = _a.ignoreCase;
+        var adapter = _b.adapter;
+        if (/\s/.test(value)) {
+            return boolbase_1.falseFunc;
+        }
+        var regex = new RegExp("(?:^|\\s)" + escapeRegex(value) + "(?:$|\\s)", ignoreCase ? "i" : "");
+        return function element(elem) {
+            var attr = adapter.getAttributeValue(elem, name);
+            return attr != null && regex.test(attr) && next(elem);
+        };
+    },
+    exists: function (next, _a, _b) {
+        var name = _a.name;
+        var adapter = _b.adapter;
+        return function (elem) { return adapter.hasAttrib(elem, name) && next(elem); };
+    },
+    start: function (next, data, _a) {
+        var adapter = _a.adapter;
+        var name = data.name;
+        var value = data.value;
+        var len = value.length;
+        if (len === 0) {
+            return boolbase_1.falseFunc;
+        }
+        if (data.ignoreCase) {
+            value = value.toLowerCase();
+            return function (elem) {
+                var _a;
+                return ((_a = adapter
+                    .getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.substr(0, len).toLowerCase()) === value && next(elem);
+            };
+        }
+        return function (elem) {
+            var _a;
+            return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.startsWith(value)) &&
+                next(elem);
+        };
+    },
+    end: function (next, data, _a) {
+        var adapter = _a.adapter;
+        var name = data.name;
+        var value = data.value;
+        var len = -value.length;
+        if (len === 0) {
+            return boolbase_1.falseFunc;
+        }
+        if (data.ignoreCase) {
+            value = value.toLowerCase();
+            return function (elem) {
+                var _a;
+                return ((_a = adapter
+                    .getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.substr(len).toLowerCase()) === value && next(elem);
+            };
+        }
+        return function (elem) {
+            var _a;
+            return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.endsWith(value)) &&
+                next(elem);
+        };
+    },
+    any: function (next, data, _a) {
+        var adapter = _a.adapter;
+        var name = data.name, value = data.value;
+        if (value === "") {
+            return boolbase_1.falseFunc;
+        }
+        if (data.ignoreCase) {
+            var regex_1 = new RegExp(escapeRegex(value), "i");
+            return function anyIC(elem) {
+                var attr = adapter.getAttributeValue(elem, name);
+                return attr != null && regex_1.test(attr) && next(elem);
+            };
+        }
+        return function (elem) {
+            var _a;
+            return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.includes(value)) &&
+                next(elem);
+        };
+    },
+    not: function (next, data, _a) {
+        var adapter = _a.adapter;
+        var name = data.name;
+        var value = data.value;
+        if (value === "") {
+            return function (elem) {
+                return !!adapter.getAttributeValue(elem, name) && next(elem);
+            };
+        }
+        else if (data.ignoreCase) {
+            value = value.toLowerCase();
+            return function (elem) {
+                var attr = adapter.getAttributeValue(elem, name);
+                return (attr != null &&
+                    attr.toLocaleLowerCase() !== value &&
+                    next(elem));
+            };
+        }
+        return function (elem) {
+            return adapter.getAttributeValue(elem, name) !== value && next(elem);
+        };
+    },
+};
diff --git a/node_modules/css-select/lib/compile.d.ts b/node_modules/css-select/lib/compile.d.ts
new file mode 100644
index 0000000..4658b61
--- /dev/null
+++ b/node_modules/css-select/lib/compile.d.ts
@@ -0,0 +1,13 @@
+import { InternalSelector } from "./types";
+import type { CompiledQuery, InternalOptions } from "./types";
+/**
+ * Compiles a selector to an executable function.
+ *
+ * @param selector Selector to compile.
+ * @param options Compilation options.
+ * @param context Optional context for the selector.
+ */
+export declare function compile<Node, ElementNode extends Node>(selector: string, options: InternalOptions<Node, ElementNode>, context?: ElementNode[]): CompiledQuery<ElementNode>;
+export declare function compileUnsafe<Node, ElementNode extends Node>(selector: string, options: InternalOptions<Node, ElementNode>, context?: ElementNode[] | ElementNode): CompiledQuery<ElementNode>;
+export declare function compileToken<Node, ElementNode extends Node>(token: InternalSelector[][], options: InternalOptions<Node, ElementNode>, context?: ElementNode[] | ElementNode): CompiledQuery<ElementNode>;
+//# sourceMappingURL=compile.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/lib/compile.d.ts.map b/node_modules/css-select/lib/compile.d.ts.map
new file mode 100644
index 0000000..c4a4ead
--- /dev/null
+++ b/node_modules/css-select/lib/compile.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAU3C,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE9D;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI,EAClD,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,EAC3C,OAAO,CAAC,EAAE,WAAW,EAAE,GACxB,aAAa,CAAC,WAAW,CAAC,CAG5B;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI,EACxD,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,EAC3C,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,WAAW,GACtC,aAAa,CAAC,WAAW,CAAC,CAG5B;AA6CD,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI,EACvD,KAAK,EAAE,gBAAgB,EAAE,EAAE,EAC3B,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,EAC3C,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,WAAW,GACtC,aAAa,CAAC,WAAW,CAAC,CA2C5B"}
\ No newline at end of file
diff --git a/node_modules/css-select/lib/compile.js b/node_modules/css-select/lib/compile.js
new file mode 100644
index 0000000..1c08a32
--- /dev/null
+++ b/node_modules/css-select/lib/compile.js
@@ -0,0 +1,115 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.compileToken = exports.compileUnsafe = exports.compile = void 0;
+var css_what_1 = require("css-what");
+var boolbase_1 = require("boolbase");
+var sort_1 = __importDefault(require("./sort"));
+var procedure_1 = require("./procedure");
+var general_1 = require("./general");
+var subselects_1 = require("./pseudo-selectors/subselects");
+/**
+ * Compiles a selector to an executable function.
+ *
+ * @param selector Selector to compile.
+ * @param options Compilation options.
+ * @param context Optional context for the selector.
+ */
+function compile(selector, options, context) {
+    var next = compileUnsafe(selector, options, context);
+    return subselects_1.ensureIsTag(next, options.adapter);
+}
+exports.compile = compile;
+function compileUnsafe(selector, options, context) {
+    var token = css_what_1.parse(selector, options);
+    return compileToken(token, options, context);
+}
+exports.compileUnsafe = compileUnsafe;
+function includesScopePseudo(t) {
+    return (t.type === "pseudo" &&
+        (t.name === "scope" ||
+            (Array.isArray(t.data) &&
+                t.data.some(function (data) { return data.some(includesScopePseudo); }))));
+}
+var DESCENDANT_TOKEN = { type: "descendant" };
+var FLEXIBLE_DESCENDANT_TOKEN = {
+    type: "_flexibleDescendant",
+};
+var SCOPE_TOKEN = { type: "pseudo", name: "scope", data: null };
+/*
+ * CSS 4 Spec (Draft): 3.3.1. Absolutizing a Scope-relative Selector
+ * http://www.w3.org/TR/selectors4/#absolutizing
+ */
+function absolutize(token, _a, context) {
+    var adapter = _a.adapter;
+    // TODO Use better check if the context is a document
+    var hasContext = !!(context === null || context === void 0 ? void 0 : context.every(function (e) {
+        var parent = adapter.getParent(e);
+        return e === subselects_1.PLACEHOLDER_ELEMENT || !!(parent && adapter.isTag(parent));
+    }));
+    for (var _i = 0, token_1 = token; _i < token_1.length; _i++) {
+        var t = token_1[_i];
+        if (t.length > 0 && procedure_1.isTraversal(t[0]) && t[0].type !== "descendant") {
+            // Don't continue in else branch
+        }
+        else if (hasContext && !t.some(includesScopePseudo)) {
+            t.unshift(DESCENDANT_TOKEN);
+        }
+        else {
+            continue;
+        }
+        t.unshift(SCOPE_TOKEN);
+    }
+}
+function compileToken(token, options, context) {
+    var _a;
+    token = token.filter(function (t) { return t.length > 0; });
+    token.forEach(sort_1.default);
+    context = (_a = options.context) !== null && _a !== void 0 ? _a : context;
+    var isArrayContext = Array.isArray(context);
+    var finalContext = context && (Array.isArray(context) ? context : [context]);
+    absolutize(token, options, finalContext);
+    var shouldTestNextSiblings = false;
+    var query = token
+        .map(function (rules) {
+        if (rules.length >= 2) {
+            var first = rules[0], second = rules[1];
+            if (first.type !== "pseudo" || first.name !== "scope") {
+                // Ignore
+            }
+            else if (isArrayContext && second.type === "descendant") {
+                rules[1] = FLEXIBLE_DESCENDANT_TOKEN;
+            }
+            else if (second.type === "adjacent" ||
+                second.type === "sibling") {
+                shouldTestNextSiblings = true;
+            }
+        }
+        return compileRules(rules, options, finalContext);
+    })
+        .reduce(reduceRules, boolbase_1.falseFunc);
+    query.shouldTestNextSiblings = shouldTestNextSiblings;
+    return query;
+}
+exports.compileToken = compileToken;
+function compileRules(rules, options, context) {
+    var _a;
+    return rules.reduce(function (previous, rule) {
+        return previous === boolbase_1.falseFunc
+            ? boolbase_1.falseFunc
+            : general_1.compileGeneralSelector(previous, rule, options, context, compileToken);
+    }, (_a = options.rootFunc) !== null && _a !== void 0 ? _a : boolbase_1.trueFunc);
+}
+function reduceRules(a, b) {
+    if (b === boolbase_1.falseFunc || a === boolbase_1.trueFunc) {
+        return a;
+    }
+    if (a === boolbase_1.falseFunc || b === boolbase_1.trueFunc) {
+        return b;
+    }
+    return function combine(elem) {
+        return a(elem) || b(elem);
+    };
+}
diff --git a/node_modules/css-select/lib/general.d.ts b/node_modules/css-select/lib/general.d.ts
new file mode 100644
index 0000000..e1f6f76
--- /dev/null
+++ b/node_modules/css-select/lib/general.d.ts
@@ -0,0 +1,3 @@
+import type { CompiledQuery, InternalOptions, InternalSelector, CompileToken } from "./types";
+export declare function compileGeneralSelector<Node, ElementNode extends Node>(next: CompiledQuery<ElementNode>, selector: InternalSelector, options: InternalOptions<Node, ElementNode>, context: ElementNode[] | undefined, compileToken: CompileToken<Node, ElementNode>): CompiledQuery<ElementNode>;
+//# sourceMappingURL=general.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/lib/general.d.ts.map b/node_modules/css-select/lib/general.d.ts.map
new file mode 100644
index 0000000..d825f5e
--- /dev/null
+++ b/node_modules/css-select/lib/general.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"general.d.ts","sourceRoot":"","sources":["../src/general.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACR,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,YAAY,EACf,MAAM,SAAS,CAAC;AAMjB,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI,EACjE,IAAI,EAAE,aAAa,CAAC,WAAW,CAAC,EAChC,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,EAC3C,OAAO,EAAE,WAAW,EAAE,GAAG,SAAS,EAClC,YAAY,EAAE,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,GAC9C,aAAa,CAAC,WAAW,CAAC,CAmI5B"}
\ No newline at end of file
diff --git a/node_modules/css-select/lib/general.js b/node_modules/css-select/lib/general.js
new file mode 100644
index 0000000..f11c9ad
--- /dev/null
+++ b/node_modules/css-select/lib/general.js
@@ -0,0 +1,111 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.compileGeneralSelector = void 0;
+var attributes_1 = require("./attributes");
+var pseudo_selectors_1 = require("./pseudo-selectors");
+/*
+ * All available rules
+ */
+function compileGeneralSelector(next, selector, options, context, compileToken) {
+    var adapter = options.adapter, equals = options.equals;
+    switch (selector.type) {
+        case "pseudo-element":
+            throw new Error("Pseudo-elements are not supported by css-select");
+        case "attribute":
+            if (options.strict &&
+                (selector.ignoreCase || selector.action === "not")) {
+                throw new Error("Unsupported attribute selector");
+            }
+            return attributes_1.attributeRules[selector.action](next, selector, options);
+        case "pseudo":
+            return pseudo_selectors_1.compilePseudoSelector(next, selector, options, context, compileToken);
+        // Tags
+        case "tag":
+            return function tag(elem) {
+                return adapter.getName(elem) === selector.name && next(elem);
+            };
+        // Traversal
+        case "descendant":
+            if (options.cacheResults === false ||
+                typeof WeakSet === "undefined") {
+                return function descendant(elem) {
+                    var current = elem;
+                    while ((current = adapter.getParent(current))) {
+                        if (adapter.isTag(current) && next(current)) {
+                            return true;
+                        }
+                    }
+                    return false;
+                };
+            }
+            // @ts-expect-error `ElementNode` is not extending object
+            // eslint-disable-next-line no-case-declarations
+            var isFalseCache_1 = new WeakSet();
+            return function cachedDescendant(elem) {
+                var current = elem;
+                while ((current = adapter.getParent(current))) {
+                    if (!isFalseCache_1.has(current)) {
+                        if (adapter.isTag(current) && next(current)) {
+                            return true;
+                        }
+                        isFalseCache_1.add(current);
+                    }
+                }
+                return false;
+            };
+        case "_flexibleDescendant":
+            // Include element itself, only used while querying an array
+            return function flexibleDescendant(elem) {
+                var current = elem;
+                do {
+                    if (adapter.isTag(current) && next(current))
+                        return true;
+                } while ((current = adapter.getParent(current)));
+                return false;
+            };
+        case "parent":
+            if (options.strict) {
+                throw new Error("Parent selector isn't part of CSS3");
+            }
+            return function parent(elem) {
+                return adapter
+                    .getChildren(elem)
+                    .some(function (elem) { return adapter.isTag(elem) && next(elem); });
+            };
+        case "child":
+            return function child(elem) {
+                var parent = adapter.getParent(elem);
+                return !!parent && adapter.isTag(parent) && next(parent);
+            };
+        case "sibling":
+            return function sibling(elem) {
+                var siblings = adapter.getSiblings(elem);
+                for (var i = 0; i < siblings.length; i++) {
+                    var currentSibling = siblings[i];
+                    if (equals(elem, currentSibling))
+                        break;
+                    if (adapter.isTag(currentSibling) && next(currentSibling)) {
+                        return true;
+                    }
+                }
+                return false;
+            };
+        case "adjacent":
+            return function adjacent(elem) {
+                var siblings = adapter.getSiblings(elem);
+                var lastElement;
+                for (var i = 0; i < siblings.length; i++) {
+                    var currentSibling = siblings[i];
+                    if (equals(elem, currentSibling))
+                        break;
+                    if (adapter.isTag(currentSibling)) {
+                        lastElement = currentSibling;
+                    }
+                }
+                return !!lastElement && next(lastElement);
+            };
+        case "universal":
+            return next;
+    }
+}
+exports.compileGeneralSelector = compileGeneralSelector;
diff --git a/node_modules/css-select/lib/index.d.ts b/node_modules/css-select/lib/index.d.ts
new file mode 100644
index 0000000..ef482cb
--- /dev/null
+++ b/node_modules/css-select/lib/index.d.ts
@@ -0,0 +1,49 @@
+import type { CompiledQuery, Options, Query, Adapter } from "./types";
+export type { Options };
+/**
+ * Compiles the query, returns a function.
+ */
+export declare const compile: <Node_1, ElementNode extends Node_1>(selector: string, options?: Options<ElementNode, ElementNode> | undefined, context?: ElementNode[] | undefined) => CompiledQuery<ElementNode>;
+export declare const _compileUnsafe: <Node_1, ElementNode extends Node_1>(selector: string, options?: Options<ElementNode, ElementNode> | undefined, context?: ElementNode[] | undefined) => CompiledQuery<ElementNode>;
+export declare const _compileToken: <Node_1, ElementNode extends Node_1>(selector: import("./types").InternalSelector[][], options?: Options<ElementNode, ElementNode> | undefined, context?: ElementNode[] | undefined) => CompiledQuery<ElementNode>;
+export declare function prepareContext<Node, ElementNode extends Node>(elems: ElementNode | ElementNode[], adapter: Adapter<Node, ElementNode>, shouldTestNextSiblings?: boolean): Node[];
+/**
+ * @template Node The generic Node type for the DOM adapter being used.
+ * @template ElementNode The Node type for elements for the DOM adapter being used.
+ * @param elems Elements to query. If it is an element, its children will be queried..
+ * @param query can be either a CSS selector string or a compiled query function.
+ * @param [options] options for querying the document.
+ * @see compile for supported selector queries.
+ * @returns All matching elements.
+ *
+ */
+export declare const selectAll: <Node_1, ElementNode extends Node_1>(query: Query<ElementNode>, elements: ElementNode | ElementNode[], options?: Options<Node_1, ElementNode> | undefined) => ElementNode[];
+/**
+ * @template Node The generic Node type for the DOM adapter being used.
+ * @template ElementNode The Node type for elements for the DOM adapter being used.
+ * @param elems Elements to query. If it is an element, its children will be queried..
+ * @param query can be either a CSS selector string or a compiled query function.
+ * @param [options] options for querying the document.
+ * @see compile for supported selector queries.
+ * @returns the first match, or null if there was no match.
+ */
+export declare const selectOne: <Node_1, ElementNode extends Node_1>(query: Query<ElementNode>, elements: ElementNode | ElementNode[], options?: Options<Node_1, ElementNode> | undefined) => ElementNode | null;
+/**
+ * Tests whether or not an element is matched by query.
+ *
+ * @template Node The generic Node type for the DOM adapter being used.
+ * @template ElementNode The Node type for elements for the DOM adapter being used.
+ * @param elem The element to test if it matches the query.
+ * @param query can be either a CSS selector string or a compiled query function.
+ * @param [options] options for querying the document.
+ * @see compile for supported selector queries.
+ * @returns
+ */
+export declare function is<Node, ElementNode extends Node>(elem: ElementNode, query: Query<ElementNode>, options?: Options<Node, ElementNode>): boolean;
+/**
+ * Alias for selectAll(query, elems, options).
+ * @see [compile] for supported selector queries.
+ */
+export default selectAll;
+export { filters, pseudos } from "./pseudo-selectors";
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/lib/index.d.ts.map b/node_modules/css-select/lib/index.d.ts.map
new file mode 100644
index 0000000..769461a
--- /dev/null
+++ b/node_modules/css-select/lib/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACR,aAAa,EACb,OAAO,EAEP,KAAK,EACL,OAAO,EAEV,MAAM,SAAS,CAAC;AAGjB,YAAY,EAAE,OAAO,EAAE,CAAC;AA0CxB;;GAEG;AACH,eAAO,MAAM,OAAO,oLAA0B,CAAC;AAC/C,eAAO,MAAM,cAAc,oLAA6B,CAAC;AACzD,eAAO,MAAM,aAAa,oNAA4B,CAAC;AA6BvD,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI,EACzD,KAAK,EAAE,WAAW,GAAG,WAAW,EAAE,EAClC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,EACnC,sBAAsB,UAAQ,GAC/B,IAAI,EAAE,CAYR;AAgBD;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,6KASrB,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,kLASrB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,EAAE,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI,EAC7C,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,EACzB,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,GACrC,OAAO,CAKT;AAED;;;GAGG;AACH,eAAe,SAAS,CAAC;AAGzB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC"}
\ No newline at end of file
diff --git a/node_modules/css-select/lib/index.js b/node_modules/css-select/lib/index.js
new file mode 100644
index 0000000..42d7f43
--- /dev/null
+++ b/node_modules/css-select/lib/index.js
@@ -0,0 +1,143 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.pseudos = exports.filters = exports.is = exports.selectOne = exports.selectAll = exports.prepareContext = exports._compileToken = exports._compileUnsafe = exports.compile = void 0;
+var DomUtils = __importStar(require("domutils"));
+var boolbase_1 = require("boolbase");
+var compile_1 = require("./compile");
+var subselects_1 = require("./pseudo-selectors/subselects");
+var defaultEquals = function (a, b) { return a === b; };
+var defaultOptions = {
+    adapter: DomUtils,
+    equals: defaultEquals,
+};
+function convertOptionFormats(options) {
+    var _a, _b, _c, _d;
+    /*
+     * We force one format of options to the other one.
+     */
+    // @ts-expect-error Default options may have incompatible `Node` / `ElementNode`.
+    var opts = options !== null && options !== void 0 ? options : defaultOptions;
+    // @ts-expect-error Same as above.
+    (_a = opts.adapter) !== null && _a !== void 0 ? _a : (opts.adapter = DomUtils);
+    // @ts-expect-error `equals` does not exist on `Options`
+    (_b = opts.equals) !== null && _b !== void 0 ? _b : (opts.equals = (_d = (_c = opts.adapter) === null || _c === void 0 ? void 0 : _c.equals) !== null && _d !== void 0 ? _d : defaultEquals);
+    return opts;
+}
+function wrapCompile(func) {
+    return function addAdapter(selector, options, context) {
+        var opts = convertOptionFormats(options);
+        return func(selector, opts, context);
+    };
+}
+/**
+ * Compiles the query, returns a function.
+ */
+exports.compile = wrapCompile(compile_1.compile);
+exports._compileUnsafe = wrapCompile(compile_1.compileUnsafe);
+exports._compileToken = wrapCompile(compile_1.compileToken);
+function getSelectorFunc(searchFunc) {
+    return function select(query, elements, options) {
+        var opts = convertOptionFormats(options);
+        if (typeof query !== "function") {
+            query = compile_1.compileUnsafe(query, opts, elements);
+        }
+        var filteredElements = prepareContext(elements, opts.adapter, query.shouldTestNextSiblings);
+        return searchFunc(query, filteredElements, opts);
+    };
+}
+function prepareContext(elems, adapter, shouldTestNextSiblings) {
+    if (shouldTestNextSiblings === void 0) { shouldTestNextSiblings = false; }
+    /*
+     * Add siblings if the query requires them.
+     * See https://github.com/fb55/css-select/pull/43#issuecomment-225414692
+     */
+    if (shouldTestNextSiblings) {
+        elems = appendNextSiblings(elems, adapter);
+    }
+    return Array.isArray(elems)
+        ? adapter.removeSubsets(elems)
+        : adapter.getChildren(elems);
+}
+exports.prepareContext = prepareContext;
+function appendNextSiblings(elem, adapter) {
+    // Order matters because jQuery seems to check the children before the siblings
+    var elems = Array.isArray(elem) ? elem.slice(0) : [elem];
+    for (var i = 0; i < elems.length; i++) {
+        var nextSiblings = subselects_1.getNextSiblings(elems[i], adapter);
+        elems.push.apply(elems, nextSiblings);
+    }
+    return elems;
+}
+/**
+ * @template Node The generic Node type for the DOM adapter being used.
+ * @template ElementNode The Node type for elements for the DOM adapter being used.
+ * @param elems Elements to query. If it is an element, its children will be queried..
+ * @param query can be either a CSS selector string or a compiled query function.
+ * @param [options] options for querying the document.
+ * @see compile for supported selector queries.
+ * @returns All matching elements.
+ *
+ */
+exports.selectAll = getSelectorFunc(function (query, elems, options) {
+    return query === boolbase_1.falseFunc || !elems || elems.length === 0
+        ? []
+        : options.adapter.findAll(query, elems);
+});
+/**
+ * @template Node The generic Node type for the DOM adapter being used.
+ * @template ElementNode The Node type for elements for the DOM adapter being used.
+ * @param elems Elements to query. If it is an element, its children will be queried..
+ * @param query can be either a CSS selector string or a compiled query function.
+ * @param [options] options for querying the document.
+ * @see compile for supported selector queries.
+ * @returns the first match, or null if there was no match.
+ */
+exports.selectOne = getSelectorFunc(function (query, elems, options) {
+    return query === boolbase_1.falseFunc || !elems || elems.length === 0
+        ? null
+        : options.adapter.findOne(query, elems);
+});
+/**
+ * Tests whether or not an element is matched by query.
+ *
+ * @template Node The generic Node type for the DOM adapter being used.
+ * @template ElementNode The Node type for elements for the DOM adapter being used.
+ * @param elem The element to test if it matches the query.
+ * @param query can be either a CSS selector string or a compiled query function.
+ * @param [options] options for querying the document.
+ * @see compile for supported selector queries.
+ * @returns
+ */
+function is(elem, query, options) {
+    var opts = convertOptionFormats(options);
+    return (typeof query === "function" ? query : compile_1.compile(query, opts))(elem);
+}
+exports.is = is;
+/**
+ * Alias for selectAll(query, elems, options).
+ * @see [compile] for supported selector queries.
+ */
+exports.default = exports.selectAll;
+// Export filters and pseudos to allow users to supply their own.
+var pseudo_selectors_1 = require("./pseudo-selectors");
+Object.defineProperty(exports, "filters", { enumerable: true, get: function () { return pseudo_selectors_1.filters; } });
+Object.defineProperty(exports, "pseudos", { enumerable: true, get: function () { return pseudo_selectors_1.pseudos; } });
diff --git a/node_modules/css-select/lib/procedure.d.ts b/node_modules/css-select/lib/procedure.d.ts
new file mode 100644
index 0000000..a911623
--- /dev/null
+++ b/node_modules/css-select/lib/procedure.d.ts
@@ -0,0 +1,5 @@
+import type { Traversal } from "css-what";
+import type { InternalSelector } from "./types";
+export declare const procedure: Record<InternalSelector["type"], number>;
+export declare function isTraversal(t: InternalSelector): t is Traversal;
+//# sourceMappingURL=procedure.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/lib/procedure.d.ts.map b/node_modules/css-select/lib/procedure.d.ts.map
new file mode 100644
index 0000000..fb47658
--- /dev/null
+++ b/node_modules/css-select/lib/procedure.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"procedure.d.ts","sourceRoot":"","sources":["../src/procedure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,CAY9D,CAAC;AAEF,wBAAgB,WAAW,CAAC,CAAC,EAAE,gBAAgB,GAAG,CAAC,IAAI,SAAS,CAE/D"}
\ No newline at end of file
diff --git a/node_modules/css-select/lib/procedure.js b/node_modules/css-select/lib/procedure.js
new file mode 100644
index 0000000..d28f368
--- /dev/null
+++ b/node_modules/css-select/lib/procedure.js
@@ -0,0 +1,20 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isTraversal = exports.procedure = void 0;
+exports.procedure = {
+    universal: 50,
+    tag: 30,
+    attribute: 1,
+    pseudo: 0,
+    "pseudo-element": 0,
+    descendant: -1,
+    child: -1,
+    parent: -1,
+    sibling: -1,
+    adjacent: -1,
+    _flexibleDescendant: -1,
+};
+function isTraversal(t) {
+    return exports.procedure[t.type] < 0;
+}
+exports.isTraversal = isTraversal;
diff --git a/node_modules/css-select/lib/pseudo-selectors/filters.d.ts b/node_modules/css-select/lib/pseudo-selectors/filters.d.ts
new file mode 100644
index 0000000..f3a2804
--- /dev/null
+++ b/node_modules/css-select/lib/pseudo-selectors/filters.d.ts
@@ -0,0 +1,4 @@
+import type { CompiledQuery, InternalOptions } from "../types";
+export declare type Filter = <Node, ElementNode extends Node>(next: CompiledQuery<ElementNode>, text: string, options: InternalOptions<Node, ElementNode>, context?: ElementNode[]) => CompiledQuery<ElementNode>;
+export declare const filters: Record<string, Filter>;
+//# sourceMappingURL=filters.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/lib/pseudo-selectors/filters.d.ts.map b/node_modules/css-select/lib/pseudo-selectors/filters.d.ts.map
new file mode 100644
index 0000000..3daa2ef
--- /dev/null
+++ b/node_modules/css-select/lib/pseudo-selectors/filters.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/pseudo-selectors/filters.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAW,MAAM,UAAU,CAAC;AAGxE,oBAAY,MAAM,GAAG,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI,EAChD,IAAI,EAAE,aAAa,CAAC,WAAW,CAAC,EAChC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,EAC3C,OAAO,CAAC,EAAE,WAAW,EAAE,KACtB,aAAa,CAAC,WAAW,CAAC,CAAC;AA6BhC,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgL1C,CAAC"}
\ No newline at end of file
diff --git a/node_modules/css-select/lib/pseudo-selectors/filters.js b/node_modules/css-select/lib/pseudo-selectors/filters.js
new file mode 100644
index 0000000..e4767d9
--- /dev/null
+++ b/node_modules/css-select/lib/pseudo-selectors/filters.js
@@ -0,0 +1,189 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.filters = void 0;
+var nth_check_1 = __importDefault(require("nth-check"));
+var boolbase_1 = require("boolbase");
+var attributes_1 = require("../attributes");
+var checkAttrib = attributes_1.attributeRules.equals;
+function getAttribFunc(name, value) {
+    var data = {
+        type: "attribute",
+        action: "equals",
+        ignoreCase: false,
+        namespace: null,
+        name: name,
+        value: value,
+    };
+    return function attribFunc(next, _rule, options) {
+        return checkAttrib(next, data, options);
+    };
+}
+function getChildFunc(next, adapter) {
+    return function (elem) {
+        var parent = adapter.getParent(elem);
+        return !!parent && adapter.isTag(parent) && next(elem);
+    };
+}
+exports.filters = {
+    contains: function (next, text, _a) {
+        var adapter = _a.adapter;
+        return function contains(elem) {
+            return next(elem) && adapter.getText(elem).includes(text);
+        };
+    },
+    icontains: function (next, text, _a) {
+        var adapter = _a.adapter;
+        var itext = text.toLowerCase();
+        return function icontains(elem) {
+            return (next(elem) &&
+                adapter.getText(elem).toLowerCase().includes(itext));
+        };
+    },
+    // Location specific methods
+    "nth-child": function (next, rule, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var func = nth_check_1.default(rule);
+        if (func === boolbase_1.falseFunc)
+            return boolbase_1.falseFunc;
+        if (func === boolbase_1.trueFunc)
+            return getChildFunc(next, adapter);
+        return function nthChild(elem) {
+            var siblings = adapter.getSiblings(elem);
+            var pos = 0;
+            for (var i = 0; i < siblings.length; i++) {
+                if (equals(elem, siblings[i]))
+                    break;
+                if (adapter.isTag(siblings[i])) {
+                    pos++;
+                }
+            }
+            return func(pos) && next(elem);
+        };
+    },
+    "nth-last-child": function (next, rule, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var func = nth_check_1.default(rule);
+        if (func === boolbase_1.falseFunc)
+            return boolbase_1.falseFunc;
+        if (func === boolbase_1.trueFunc)
+            return getChildFunc(next, adapter);
+        return function nthLastChild(elem) {
+            var siblings = adapter.getSiblings(elem);
+            var pos = 0;
+            for (var i = siblings.length - 1; i >= 0; i--) {
+                if (equals(elem, siblings[i]))
+                    break;
+                if (adapter.isTag(siblings[i])) {
+                    pos++;
+                }
+            }
+            return func(pos) && next(elem);
+        };
+    },
+    "nth-of-type": function (next, rule, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var func = nth_check_1.default(rule);
+        if (func === boolbase_1.falseFunc)
+            return boolbase_1.falseFunc;
+        if (func === boolbase_1.trueFunc)
+            return getChildFunc(next, adapter);
+        return function nthOfType(elem) {
+            var siblings = adapter.getSiblings(elem);
+            var pos = 0;
+            for (var i = 0; i < siblings.length; i++) {
+                var currentSibling = siblings[i];
+                if (equals(elem, currentSibling))
+                    break;
+                if (adapter.isTag(currentSibling) &&
+                    adapter.getName(currentSibling) === adapter.getName(elem)) {
+                    pos++;
+                }
+            }
+            return func(pos) && next(elem);
+        };
+    },
+    "nth-last-of-type": function (next, rule, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var func = nth_check_1.default(rule);
+        if (func === boolbase_1.falseFunc)
+            return boolbase_1.falseFunc;
+        if (func === boolbase_1.trueFunc)
+            return getChildFunc(next, adapter);
+        return function nthLastOfType(elem) {
+            var siblings = adapter.getSiblings(elem);
+            var pos = 0;
+            for (var i = siblings.length - 1; i >= 0; i--) {
+                var currentSibling = siblings[i];
+                if (equals(elem, currentSibling))
+                    break;
+                if (adapter.isTag(currentSibling) &&
+                    adapter.getName(currentSibling) === adapter.getName(elem)) {
+                    pos++;
+                }
+            }
+            return func(pos) && next(elem);
+        };
+    },
+    // TODO determine the actual root element
+    root: function (next, _rule, _a) {
+        var adapter = _a.adapter;
+        return function (elem) {
+            var parent = adapter.getParent(elem);
+            return (parent == null || !adapter.isTag(parent)) && next(elem);
+        };
+    },
+    scope: function (next, rule, options, context) {
+        var equals = options.equals;
+        if (!context || context.length === 0) {
+            // Equivalent to :root
+            return exports.filters.root(next, rule, options);
+        }
+        if (context.length === 1) {
+            // NOTE: can't be unpacked, as :has uses this for side-effects
+            return function (elem) { return equals(context[0], elem) && next(elem); };
+        }
+        return function (elem) { return context.includes(elem) && next(elem); };
+    },
+    // JQuery extensions (others follow as pseudos)
+    checkbox: getAttribFunc("type", "checkbox"),
+    file: getAttribFunc("type", "file"),
+    password: getAttribFunc("type", "password"),
+    radio: getAttribFunc("type", "radio"),
+    reset: getAttribFunc("type", "reset"),
+    image: getAttribFunc("type", "image"),
+    submit: getAttribFunc("type", "submit"),
+    // Dynamic state pseudos. These depend on optional Adapter methods.
+    hover: function (next, _rule, _a) {
+        var adapter = _a.adapter;
+        var isHovered = adapter.isHovered;
+        if (typeof isHovered !== "function") {
+            return boolbase_1.falseFunc;
+        }
+        return function hover(elem) {
+            return isHovered(elem) && next(elem);
+        };
+    },
+    visited: function (next, _rule, _a) {
+        var adapter = _a.adapter;
+        var isVisited = adapter.isVisited;
+        if (typeof isVisited !== "function") {
+            return boolbase_1.falseFunc;
+        }
+        return function visited(elem) {
+            return isVisited(elem) && next(elem);
+        };
+    },
+    active: function (next, _rule, _a) {
+        var adapter = _a.adapter;
+        var isActive = adapter.isActive;
+        if (typeof isActive !== "function") {
+            return boolbase_1.falseFunc;
+        }
+        return function active(elem) {
+            return isActive(elem) && next(elem);
+        };
+    },
+};
diff --git a/node_modules/css-select/lib/pseudo-selectors/index.d.ts b/node_modules/css-select/lib/pseudo-selectors/index.d.ts
new file mode 100644
index 0000000..5b1d54b
--- /dev/null
+++ b/node_modules/css-select/lib/pseudo-selectors/index.d.ts
@@ -0,0 +1,7 @@
+import type { CompiledQuery, InternalOptions, CompileToken } from "../types";
+import type { PseudoSelector } from "css-what";
+import { filters } from "./filters";
+import { pseudos } from "./pseudos";
+export { filters, pseudos };
+export declare function compilePseudoSelector<Node, ElementNode extends Node>(next: CompiledQuery<ElementNode>, selector: PseudoSelector, options: InternalOptions<Node, ElementNode>, context: ElementNode[] | undefined, compileToken: CompileToken<Node, ElementNode>): CompiledQuery<ElementNode>;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/lib/pseudo-selectors/index.d.ts.map b/node_modules/css-select/lib/pseudo-selectors/index.d.ts.map
new file mode 100644
index 0000000..677a6d7
--- /dev/null
+++ b/node_modules/css-select/lib/pseudo-selectors/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pseudo-selectors/index.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAoB,MAAM,WAAW,CAAC;AAGtD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAK5B,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI,EAChE,IAAI,EAAE,aAAa,CAAC,WAAW,CAAC,EAChC,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,EAC3C,OAAO,EAAE,WAAW,EAAE,GAAG,SAAS,EAClC,YAAY,EAAE,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,GAC9C,aAAa,CAAC,WAAW,CAAC,CAwB5B"}
\ No newline at end of file
diff --git a/node_modules/css-select/lib/pseudo-selectors/index.js b/node_modules/css-select/lib/pseudo-selectors/index.js
new file mode 100644
index 0000000..a3d6e2d
--- /dev/null
+++ b/node_modules/css-select/lib/pseudo-selectors/index.js
@@ -0,0 +1,48 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.compilePseudoSelector = exports.pseudos = exports.filters = void 0;
+/*
+ * Pseudo selectors
+ *
+ * Pseudo selectors are available in three forms:
+ *
+ * 1. Filters are called when the selector is compiled and return a function
+ *  that has to return either false, or the results of `next()`.
+ * 2. Pseudos are called on execution. They have to return a boolean.
+ * 3. Subselects work like filters, but have an embedded selector that will be run separately.
+ *
+ * Filters are great if you want to do some pre-processing, or change the call order
+ * of `next()` and your code.
+ * Pseudos should be used to implement simple checks.
+ */
+var boolbase_1 = require("boolbase");
+var filters_1 = require("./filters");
+Object.defineProperty(exports, "filters", { enumerable: true, get: function () { return filters_1.filters; } });
+var pseudos_1 = require("./pseudos");
+Object.defineProperty(exports, "pseudos", { enumerable: true, get: function () { return pseudos_1.pseudos; } });
+var subselects_1 = require("./subselects");
+// FIXME This is pretty hacky
+var reCSS3 = /^(?:(?:nth|last|first|only)-(?:child|of-type)|root|empty|(?:en|dis)abled|checked|not)$/;
+function compilePseudoSelector(next, selector, options, context, compileToken) {
+    var name = selector.name, data = selector.data;
+    if (options.strict && !reCSS3.test(name)) {
+        throw new Error(":" + name + " isn't part of CSS3");
+    }
+    if (Array.isArray(data)) {
+        return subselects_1.subselects[name](next, data, options, context, compileToken);
+    }
+    if (name in filters_1.filters) {
+        return filters_1.filters[name](next, data, options, context);
+    }
+    if (name in pseudos_1.pseudos) {
+        var pseudo_1 = pseudos_1.pseudos[name];
+        pseudos_1.verifyPseudoArgs(pseudo_1, name, data);
+        return pseudo_1 === boolbase_1.falseFunc
+            ? boolbase_1.falseFunc
+            : next === boolbase_1.trueFunc
+                ? function (elem) { return pseudo_1(elem, options, data); }
+                : function (elem) { return pseudo_1(elem, options, data) && next(elem); };
+    }
+    throw new Error("unmatched pseudo-class :" + name);
+}
+exports.compilePseudoSelector = compilePseudoSelector;
diff --git a/node_modules/css-select/lib/pseudo-selectors/pseudos.d.ts b/node_modules/css-select/lib/pseudo-selectors/pseudos.d.ts
new file mode 100644
index 0000000..afd483f
--- /dev/null
+++ b/node_modules/css-select/lib/pseudo-selectors/pseudos.d.ts
@@ -0,0 +1,6 @@
+import { PseudoSelector } from "css-what";
+import type { InternalOptions } from "../types";
+export declare type Pseudo = <Node, ElementNode extends Node>(elem: ElementNode, options: InternalOptions<Node, ElementNode>, subselect?: ElementNode | string | null) => boolean;
+export declare const pseudos: Record<string, Pseudo>;
+export declare function verifyPseudoArgs(func: Pseudo, name: string, subselect: PseudoSelector["data"]): void;
+//# sourceMappingURL=pseudos.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/lib/pseudo-selectors/pseudos.d.ts.map b/node_modules/css-select/lib/pseudo-selectors/pseudos.d.ts.map
new file mode 100644
index 0000000..737846e
--- /dev/null
+++ b/node_modules/css-select/lib/pseudo-selectors/pseudos.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"pseudos.d.ts","sourceRoot":"","sources":["../../src/pseudo-selectors/pseudos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,oBAAY,MAAM,GAAG,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI,EAChD,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,EAC3C,SAAS,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,KACtC,OAAO,CAAC;AAKb,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA+L1C,CAAC;AAYF,wBAAgB,gBAAgB,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,GAClC,IAAI,CAYN"}
\ No newline at end of file
diff --git a/node_modules/css-select/lib/pseudo-selectors/pseudos.js b/node_modules/css-select/lib/pseudo-selectors/pseudos.js
new file mode 100644
index 0000000..efd30fc
--- /dev/null
+++ b/node_modules/css-select/lib/pseudo-selectors/pseudos.js
@@ -0,0 +1,207 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.verifyPseudoArgs = exports.pseudos = void 0;
+var isLinkTag = namePseudo(["a", "area", "link"]);
+// While filters are precompiled, pseudos get called when they are needed
+exports.pseudos = {
+    empty: function (elem, _a) {
+        var adapter = _a.adapter;
+        return !adapter.getChildren(elem).some(function (elem) {
+            // FIXME: `getText` call is potentially expensive.
+            return adapter.isTag(elem) || adapter.getText(elem) !== "";
+        });
+    },
+    "first-child": function (elem, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var firstChild = adapter
+            .getSiblings(elem)
+            .find(function (elem) { return adapter.isTag(elem); });
+        return firstChild != null && equals(elem, firstChild);
+    },
+    "last-child": function (elem, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var siblings = adapter.getSiblings(elem);
+        for (var i = siblings.length - 1; i >= 0; i--) {
+            if (equals(elem, siblings[i]))
+                return true;
+            if (adapter.isTag(siblings[i]))
+                break;
+        }
+        return false;
+    },
+    "first-of-type": function (elem, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var siblings = adapter.getSiblings(elem);
+        var elemName = adapter.getName(elem);
+        for (var i = 0; i < siblings.length; i++) {
+            var currentSibling = siblings[i];
+            if (equals(elem, currentSibling))
+                return true;
+            if (adapter.isTag(currentSibling) &&
+                adapter.getName(currentSibling) === elemName) {
+                break;
+            }
+        }
+        return false;
+    },
+    "last-of-type": function (elem, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var siblings = adapter.getSiblings(elem);
+        var elemName = adapter.getName(elem);
+        for (var i = siblings.length - 1; i >= 0; i--) {
+            var currentSibling = siblings[i];
+            if (equals(elem, currentSibling))
+                return true;
+            if (adapter.isTag(currentSibling) &&
+                adapter.getName(currentSibling) === elemName) {
+                break;
+            }
+        }
+        return false;
+    },
+    "only-of-type": function (elem, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        var elemName = adapter.getName(elem);
+        return adapter
+            .getSiblings(elem)
+            .every(function (sibling) {
+            return equals(elem, sibling) ||
+                !adapter.isTag(sibling) ||
+                adapter.getName(sibling) !== elemName;
+        });
+    },
+    "only-child": function (elem, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        return adapter
+            .getSiblings(elem)
+            .every(function (sibling) { return equals(elem, sibling) || !adapter.isTag(sibling); });
+    },
+    // :matches(a, area, link)[href]
+    "any-link": function (elem, options) {
+        return (isLinkTag(elem, options) && options.adapter.hasAttrib(elem, "href"));
+    },
+    // :any-link:not(:visited)
+    link: function (elem, options) {
+        var _a, _b;
+        return (((_b = (_a = options.adapter).isVisited) === null || _b === void 0 ? void 0 : _b.call(_a, elem)) !== true &&
+            exports.pseudos["any-link"](elem, options));
+    },
+    /*
+     * Forms
+     * to consider: :target
+     */
+    // :matches([selected], select:not([multiple]):not(> option[selected]) > option:first-of-type)
+    selected: function (elem, _a) {
+        var adapter = _a.adapter, equals = _a.equals;
+        if (adapter.hasAttrib(elem, "selected"))
+            return true;
+        else if (adapter.getName(elem) !== "option")
+            return false;
+        // The first <option> in a <select> is also selected
+        var parent = adapter.getParent(elem);
+        if (!parent ||
+            !adapter.isTag(parent) ||
+            adapter.getName(parent) !== "select" ||
+            adapter.hasAttrib(parent, "multiple")) {
+            return false;
+        }
+        var siblings = adapter.getChildren(parent);
+        var sawElem = false;
+        for (var i = 0; i < siblings.length; i++) {
+            var currentSibling = siblings[i];
+            if (adapter.isTag(currentSibling)) {
+                if (equals(elem, currentSibling)) {
+                    sawElem = true;
+                }
+                else if (!sawElem) {
+                    return false;
+                }
+                else if (adapter.hasAttrib(currentSibling, "selected")) {
+                    return false;
+                }
+            }
+        }
+        return sawElem;
+    },
+    /*
+     * https://html.spec.whatwg.org/multipage/scripting.html#disabled-elements
+     * :matches(
+     *   :matches(button, input, select, textarea, menuitem, optgroup, option)[disabled],
+     *   optgroup[disabled] > option),
+     *  fieldset[disabled] * //TODO not child of first <legend>
+     * )
+     */
+    disabled: function (elem, _a) {
+        var adapter = _a.adapter;
+        return adapter.hasAttrib(elem, "disabled");
+    },
+    enabled: function (elem, _a) {
+        var adapter = _a.adapter;
+        return !adapter.hasAttrib(elem, "disabled");
+    },
+    // :matches(:matches(:radio, :checkbox)[checked], :selected) (TODO menuitem)
+    checked: function (elem, options) {
+        return (options.adapter.hasAttrib(elem, "checked") ||
+            exports.pseudos.selected(elem, options));
+    },
+    // :matches(input, select, textarea)[required]
+    required: function (elem, _a) {
+        var adapter = _a.adapter;
+        return adapter.hasAttrib(elem, "required");
+    },
+    // :matches(input, select, textarea):not([required])
+    optional: function (elem, _a) {
+        var adapter = _a.adapter;
+        return !adapter.hasAttrib(elem, "required");
+    },
+    // JQuery extensions
+    // :not(:empty)
+    parent: function (elem, options) {
+        return !exports.pseudos.empty(elem, options);
+    },
+    // :matches(h1, h2, h3, h4, h5, h6)
+    header: namePseudo(["h1", "h2", "h3", "h4", "h5", "h6"]),
+    // :matches(button, input[type=button])
+    button: function (elem, _a) {
+        var adapter = _a.adapter;
+        var name = adapter.getName(elem);
+        return (name === "button" ||
+            (name === "input" &&
+                adapter.getAttributeValue(elem, "type") === "button"));
+    },
+    // :matches(input, textarea, select, button)
+    input: namePseudo(["input", "textarea", "select", "button"]),
+    // `input:matches(:not([type!='']), [type='text' i])`
+    text: function (elem, _a) {
+        var adapter = _a.adapter;
+        var type = adapter.getAttributeValue(elem, "type");
+        return (adapter.getName(elem) === "input" &&
+            (!type || type.toLowerCase() === "text"));
+    },
+};
+function namePseudo(names) {
+    if (typeof Set !== "undefined") {
+        var nameSet_1 = new Set(names);
+        return function (elem, _a) {
+            var adapter = _a.adapter;
+            return nameSet_1.has(adapter.getName(elem));
+        };
+    }
+    return function (elem, _a) {
+        var adapter = _a.adapter;
+        return names.includes(adapter.getName(elem));
+    };
+}
+function verifyPseudoArgs(func, name, subselect) {
+    if (subselect === null) {
+        if (func.length > 2 && name !== "scope") {
+            throw new Error("pseudo-selector :" + name + " requires an argument");
+        }
+    }
+    else {
+        if (func.length === 2) {
+            throw new Error("pseudo-selector :" + name + " doesn't have any arguments");
+        }
+    }
+}
+exports.verifyPseudoArgs = verifyPseudoArgs;
diff --git a/node_modules/css-select/lib/pseudo-selectors/subselects.d.ts b/node_modules/css-select/lib/pseudo-selectors/subselects.d.ts
new file mode 100644
index 0000000..202ad88
--- /dev/null
+++ b/node_modules/css-select/lib/pseudo-selectors/subselects.d.ts
@@ -0,0 +1,10 @@
+import { CompileToken } from "./../types";
+import type { Selector } from "css-what";
+import type { CompiledQuery, InternalOptions, Adapter } from "../types";
+/** Used as a placeholder for :has. Will be replaced with the actual element. */
+export declare const PLACEHOLDER_ELEMENT: {};
+export declare function ensureIsTag<Node, ElementNode extends Node>(next: CompiledQuery<ElementNode>, adapter: Adapter<Node, ElementNode>): CompiledQuery<ElementNode>;
+export declare type Subselect = <Node, ElementNode extends Node>(next: CompiledQuery<ElementNode>, subselect: Selector[][], options: InternalOptions<Node, ElementNode>, context: ElementNode[] | undefined, compileToken: CompileToken<Node, ElementNode>) => CompiledQuery<ElementNode>;
+export declare function getNextSiblings<Node, ElementNode extends Node>(elem: Node, adapter: Adapter<Node, ElementNode>): ElementNode[];
+export declare const subselects: Record<string, Subselect>;
+//# sourceMappingURL=subselects.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/lib/pseudo-selectors/subselects.d.ts.map b/node_modules/css-select/lib/pseudo-selectors/subselects.d.ts.map
new file mode 100644
index 0000000..3eb4c6e
--- /dev/null
+++ b/node_modules/css-select/lib/pseudo-selectors/subselects.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"subselects.d.ts","sourceRoot":"","sources":["../../src/pseudo-selectors/subselects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGxE,gFAAgF;AAChF,eAAO,MAAM,mBAAmB,IAAK,CAAC;AAMtC,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI,EACtD,IAAI,EAAE,aAAa,CAAC,WAAW,CAAC,EAChC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,GACpC,aAAa,CAAC,WAAW,CAAC,CAG5B;AAED,oBAAY,SAAS,GAAG,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI,EACnD,IAAI,EAAE,aAAa,CAAC,WAAW,CAAC,EAChC,SAAS,EAAE,QAAQ,EAAE,EAAE,EACvB,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,EAC3C,OAAO,EAAE,WAAW,EAAE,GAAG,SAAS,EAClC,YAAY,EAAE,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,KAC5C,aAAa,CAAC,WAAW,CAAC,CAAC;AAEhC,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI,EAC1D,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,GACpC,WAAW,EAAE,CAMf;AAOD,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAkGhD,CAAC"}
\ No newline at end of file
diff --git a/node_modules/css-select/lib/pseudo-selectors/subselects.js b/node_modules/css-select/lib/pseudo-selectors/subselects.js
new file mode 100644
index 0000000..ee0d47a
--- /dev/null
+++ b/node_modules/css-select/lib/pseudo-selectors/subselects.js
@@ -0,0 +1,117 @@
+"use strict";
+var __spreadArrays = (this && this.__spreadArrays) || function () {
+    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
+    for (var r = Array(s), k = 0, i = 0; i < il; i++)
+        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
+            r[k] = a[j];
+    return r;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.subselects = exports.getNextSiblings = exports.ensureIsTag = exports.PLACEHOLDER_ELEMENT = void 0;
+var boolbase_1 = require("boolbase");
+var procedure_1 = require("../procedure");
+/** Used as a placeholder for :has. Will be replaced with the actual element. */
+exports.PLACEHOLDER_ELEMENT = {};
+function containsTraversal(t) {
+    return t.some(procedure_1.isTraversal);
+}
+function ensureIsTag(next, adapter) {
+    if (next === boolbase_1.falseFunc)
+        return next;
+    return function (elem) { return adapter.isTag(elem) && next(elem); };
+}
+exports.ensureIsTag = ensureIsTag;
+function getNextSiblings(elem, adapter) {
+    var siblings = adapter.getSiblings(elem);
+    if (siblings.length <= 1)
+        return [];
+    var elemIndex = siblings.indexOf(elem);
+    if (elemIndex < 0 || elemIndex === siblings.length - 1)
+        return [];
+    return siblings.slice(elemIndex + 1).filter(adapter.isTag);
+}
+exports.getNextSiblings = getNextSiblings;
+/*
+ * :not, :has and :matches have to compile selectors
+ * doing this in src/pseudos.ts would lead to circular dependencies,
+ * so we add them here
+ */
+exports.subselects = {
+    /**
+     * `:is` is an alias for `:matches`.
+     */
+    is: function (next, token, options, context, compileToken) {
+        return exports.subselects.matches(next, token, options, context, compileToken);
+    },
+    matches: function (next, token, options, context, compileToken) {
+        var opts = {
+            xmlMode: !!options.xmlMode,
+            strict: !!options.strict,
+            adapter: options.adapter,
+            equals: options.equals,
+            rootFunc: next,
+        };
+        return compileToken(token, opts, context);
+    },
+    not: function (next, token, options, context, compileToken) {
+        var opts = {
+            xmlMode: !!options.xmlMode,
+            strict: !!options.strict,
+            adapter: options.adapter,
+            equals: options.equals,
+        };
+        if (opts.strict) {
+            if (token.length > 1 || token.some(containsTraversal)) {
+                throw new Error("complex selectors in :not aren't allowed in strict mode");
+            }
+        }
+        var func = compileToken(token, opts, context);
+        if (func === boolbase_1.falseFunc)
+            return next;
+        if (func === boolbase_1.trueFunc)
+            return boolbase_1.falseFunc;
+        return function not(elem) {
+            return !func(elem) && next(elem);
+        };
+    },
+    has: function (next, subselect, options, _context, compileToken) {
+        var adapter = options.adapter;
+        var opts = {
+            xmlMode: !!options.xmlMode,
+            strict: !!options.strict,
+            adapter: adapter,
+            equals: options.equals,
+        };
+        // @ts-expect-error Uses an array as a pointer to the current element (side effects)
+        var context = subselect.some(containsTraversal)
+            ? [exports.PLACEHOLDER_ELEMENT]
+            : undefined;
+        var compiled = compileToken(subselect, opts, context);
+        if (compiled === boolbase_1.falseFunc)
+            return boolbase_1.falseFunc;
+        if (compiled === boolbase_1.trueFunc) {
+            return function (elem) {
+                return adapter.getChildren(elem).some(adapter.isTag) && next(elem);
+            };
+        }
+        var hasElement = ensureIsTag(compiled, adapter);
+        var _a = compiled.shouldTestNextSiblings, shouldTestNextSiblings = _a === void 0 ? false : _a;
+        /*
+         * `shouldTestNextSiblings` will only be true if the query starts with
+         * a traversal (sibling or adjacent). That means we will always have a context.
+         */
+        if (context) {
+            return function (elem) {
+                context[0] = elem;
+                var childs = adapter.getChildren(elem);
+                var nextElements = shouldTestNextSiblings
+                    ? __spreadArrays(childs, getNextSiblings(elem, adapter)) : childs;
+                return (next(elem) && adapter.existsOne(hasElement, nextElements));
+            };
+        }
+        return function (elem) {
+            return next(elem) &&
+                adapter.existsOne(hasElement, adapter.getChildren(elem));
+        };
+    },
+};
diff --git a/node_modules/css-select/lib/sort.d.ts b/node_modules/css-select/lib/sort.d.ts
new file mode 100644
index 0000000..d5b9c6e
--- /dev/null
+++ b/node_modules/css-select/lib/sort.d.ts
@@ -0,0 +1,10 @@
+import type { InternalSelector } from "./types";
+/**
+ * Sort the parts of the passed selector,
+ * as there is potential for optimization
+ * (some types of selectors are faster than others)
+ *
+ * @param arr Selector to sort
+ */
+export default function sortByProcedure(arr: InternalSelector[]): void;
+//# sourceMappingURL=sort.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/lib/sort.d.ts.map b/node_modules/css-select/lib/sort.d.ts.map
new file mode 100644
index 0000000..f55e27b
--- /dev/null
+++ b/node_modules/css-select/lib/sort.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"sort.d.ts","sourceRoot":"","sources":["../src/sort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAehD;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAerE"}
\ No newline at end of file
diff --git a/node_modules/css-select/lib/sort.js b/node_modules/css-select/lib/sort.js
new file mode 100644
index 0000000..ae01830
--- /dev/null
+++ b/node_modules/css-select/lib/sort.js
@@ -0,0 +1,84 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var procedure_1 = require("./procedure");
+var attributes = {
+    exists: 10,
+    equals: 8,
+    not: 7,
+    start: 6,
+    end: 6,
+    any: 5,
+    hyphen: 4,
+    element: 4,
+};
+/**
+ * Sort the parts of the passed selector,
+ * as there is potential for optimization
+ * (some types of selectors are faster than others)
+ *
+ * @param arr Selector to sort
+ */
+function sortByProcedure(arr) {
+    var procs = arr.map(getProcedure);
+    for (var i = 1; i < arr.length; i++) {
+        var procNew = procs[i];
+        if (procNew < 0)
+            continue;
+        for (var j = i - 1; j >= 0 && procNew < procs[j]; j--) {
+            var token = arr[j + 1];
+            arr[j + 1] = arr[j];
+            arr[j] = token;
+            procs[j + 1] = procs[j];
+            procs[j] = procNew;
+        }
+    }
+}
+exports.default = sortByProcedure;
+function getProcedure(token) {
+    var proc = procedure_1.procedure[token.type];
+    if (token.type === "attribute") {
+        proc = attributes[token.action];
+        if (proc === attributes.equals && token.name === "id") {
+            // Prefer ID selectors (eg. #ID)
+            proc = 9;
+        }
+        if (token.ignoreCase) {
+            /*
+             * IgnoreCase adds some overhead, prefer "normal" token
+             * this is a binary operation, to ensure it's still an int
+             */
+            proc >>= 1;
+        }
+    }
+    else if (token.type === "pseudo") {
+        if (!token.data) {
+            proc = 3;
+        }
+        else if (token.name === "has" || token.name === "contains") {
+            proc = 0; // Expensive in any case
+        }
+        else if (Array.isArray(token.data)) {
+            // "matches" and "not"
+            proc = 0;
+            for (var i = 0; i < token.data.length; i++) {
+                // TODO better handling of complex selectors
+                if (token.data[i].length !== 1)
+                    continue;
+                var cur = getProcedure(token.data[i][0]);
+                // Avoid executing :has or :contains
+                if (cur === 0) {
+                    proc = 0;
+                    break;
+                }
+                if (cur > proc)
+                    proc = cur;
+            }
+            if (token.data.length > 1 && proc > 0)
+                proc -= 1;
+        }
+        else {
+            proc = 1;
+        }
+    }
+    return proc;
+}
diff --git a/node_modules/css-select/lib/types.d.ts b/node_modules/css-select/lib/types.d.ts
new file mode 100644
index 0000000..07f1253
--- /dev/null
+++ b/node_modules/css-select/lib/types.d.ts
@@ -0,0 +1,121 @@
+import type { Selector } from "css-what";
+export declare type InternalSelector = Selector | {
+    type: "_flexibleDescendant";
+};
+export declare type Predicate<Value> = (v: Value) => boolean;
+export interface Adapter<Node, ElementNode extends Node> {
+    /**
+     *  Is the node a tag?
+     */
+    isTag: (node: Node) => node is ElementNode;
+    /**
+     * Does at least one of passed element nodes pass the test predicate?
+     */
+    existsOne: (test: Predicate<ElementNode>, elems: Node[]) => boolean;
+    /**
+     * Get the attribute value.
+     */
+    getAttributeValue: (elem: ElementNode, name: string) => string | undefined;
+    /**
+     * Get the node's children
+     */
+    getChildren: (node: Node) => Node[];
+    /**
+     * Get the name of the tag
+     */
+    getName: (elem: ElementNode) => string;
+    /**
+     * Get the parent of the node
+     */
+    getParent: (node: ElementNode) => ElementNode | null;
+    /**
+     * Get the siblings of the node. Note that unlike jQuery's `siblings` method,
+     * this is expected to include the current node as well
+     */
+    getSiblings: (node: Node) => Node[];
+    /**
+     * Get the text content of the node, and its children if it has any.
+     */
+    getText: (node: Node) => string;
+    /**
+     * Does the element have the named attribute?
+     */
+    hasAttrib: (elem: ElementNode, name: string) => boolean;
+    /**
+     * Takes an array of nodes, and removes any duplicates, as well as any
+     * nodes whose ancestors are also in the array.
+     */
+    removeSubsets: (nodes: Node[]) => Node[];
+    /**
+     * Finds all of the element nodes in the array that match the test predicate,
+     * as well as any of their children that match it.
+     */
+    findAll: (test: Predicate<ElementNode>, nodes: Node[]) => ElementNode[];
+    /**
+     * Finds the first node in the array that matches the test predicate, or one
+     * of its children.
+     */
+    findOne: (test: Predicate<ElementNode>, elems: Node[]) => ElementNode | null;
+    /**
+     * The adapter can also optionally include an equals method, if your DOM
+     * structure needs a custom equality test to compare two objects which refer
+     * to the same underlying node. If not provided, `css-select` will fall back to
+     * `a === b`.
+     */
+    equals?: (a: Node, b: Node) => boolean;
+    /**
+     * Is the element in hovered state?
+     */
+    isHovered?: (elem: ElementNode) => boolean;
+    /**
+     * Is the element in visited state?
+     */
+    isVisited?: (elem: ElementNode) => boolean;
+    /**
+     * Is the element in active state?
+     */
+    isActive?: (elem: ElementNode) => boolean;
+}
+export interface Options<Node, ElementNode extends Node> {
+    /**
+     * When enabled, tag names will be case-sensitive. Default: false.
+     */
+    xmlMode?: boolean;
+    /**
+     * Limits the module to only use CSS3 selectors. Default: false.
+     */
+    strict?: boolean;
+    /**
+     * The last function in the stack, will be called with the last element
+     * that's looked at.
+     */
+    rootFunc?: (element: ElementNode) => boolean;
+    /**
+     * The adapter to use when interacting with the backing DOM structure. By
+     * default it uses the `domutils` module.
+     */
+    adapter?: Adapter<Node, ElementNode>;
+    /**
+     * The context of the current query. Used to limit the scope of searches.
+     * Can be matched directly using the `:scope` pseudo-selector.
+     */
+    context?: ElementNode | ElementNode[];
+    /**
+     * Allow css-select to cache results for some selectors, sometimes greatly
+     * improving querying performance. Disable this if your document can
+     * change in between queries with the same compiled selector.
+     * Defaults to `true`.
+     */
+    cacheResults?: boolean;
+}
+export interface InternalOptions<Node, ElementNode extends Node> extends Options<Node, ElementNode> {
+    adapter: Adapter<Node, ElementNode>;
+    equals: (a: Node, b: Node) => boolean;
+}
+export interface CompiledQuery<ElementNode> {
+    (node: ElementNode): boolean;
+    shouldTestNextSiblings?: boolean;
+}
+export declare type Query<ElementNode> = string | CompiledQuery<ElementNode>;
+export declare type CompileToken<Node, ElementNode extends Node> = (token: InternalSelector[][], options: InternalOptions<Node, ElementNode>, context?: ElementNode[]) => CompiledQuery<ElementNode>;
+//# sourceMappingURL=types.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/lib/types.d.ts.map b/node_modules/css-select/lib/types.d.ts.map
new file mode 100644
index 0000000..8c28db3
--- /dev/null
+++ b/node_modules/css-select/lib/types.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,oBAAY,gBAAgB,GAAG,QAAQ,GAAG;IAAE,IAAI,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAE1E,oBAAY,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC;AACrD,MAAM,WAAW,OAAO,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI;IACnD;;OAEG;IACH,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI,WAAW,CAAC;IAE3C;;OAEG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,OAAO,CAAC;IAEpE;;OAEG;IACH,iBAAiB,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAE3E;;OAEG;IACH,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;IAEpC;;OAEG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,MAAM,CAAC;IAEvC;;OAEG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,WAAW,GAAG,IAAI,CAAC;IAErD;;;OAGG;IACH,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;IAEpC;;OAEG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IAEhC;;OAEG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAExD;;;OAGG;IACH,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;IAEzC;;;OAGG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,CAAC;IAExE;;;OAGG;IACH,OAAO,EAAE,CACL,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,EAC5B,KAAK,EAAE,IAAI,EAAE,KACZ,WAAW,GAAG,IAAI,CAAC;IAExB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC;IAEvC;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC;IAE3C;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC;IAE3C;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC;CAC7C;AAED,MAAM,WAAW,OAAO,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI;IACnD;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;IAC7C;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACrC;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,GAAG,WAAW,EAAE,CAAC;IACtC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B;AAGD,MAAM,WAAW,eAAe,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI,CAC3D,SAAQ,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACpC,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC;CACzC;AAED,MAAM,WAAW,aAAa,CAAC,WAAW;IACtC,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAC7B,sBAAsB,CAAC,EAAE,OAAO,CAAC;CACpC;AACD,oBAAY,KAAK,CAAC,WAAW,IAAI,MAAM,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;AACrE,oBAAY,YAAY,CAAC,IAAI,EAAE,WAAW,SAAS,IAAI,IAAI,CACvD,KAAK,EAAE,gBAAgB,EAAE,EAAE,EAC3B,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,EAC3C,OAAO,CAAC,EAAE,WAAW,EAAE,KACtB,aAAa,CAAC,WAAW,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/css-select/lib/types.js b/node_modules/css-select/lib/types.js
new file mode 100644
index 0000000..c8ad2e5
--- /dev/null
+++ b/node_modules/css-select/lib/types.js
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/node_modules/css-select/node_modules/dom-serializer/LICENSE b/node_modules/css-select/node_modules/dom-serializer/LICENSE
new file mode 100644
index 0000000..3d241a8
--- /dev/null
+++ b/node_modules/css-select/node_modules/dom-serializer/LICENSE
@@ -0,0 +1,11 @@
+License
+
+(The MIT License)
+
+Copyright (c) 2014 The cheeriojs contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/css-select/node_modules/dom-serializer/README.md b/node_modules/css-select/node_modules/dom-serializer/README.md
new file mode 100644
index 0000000..9ef0eec
--- /dev/null
+++ b/node_modules/css-select/node_modules/dom-serializer/README.md
@@ -0,0 +1,97 @@
+# dom-serializer [![Build Status](https://travis-ci.com/cheeriojs/dom-serializer.svg?branch=master)](https://travis-ci.com/cheeriojs/dom-serializer)
+
+Renders a [domhandler](https://github.com/fb55/domhandler) DOM node or an array of domhandler DOM nodes to a string.
+
+```js
+import render from "dom-serializer";
+
+// OR
+
+const render = require("dom-serializer").default;
+```
+
+# API
+
+## `render`
+
+▸ **render**(`node`: Node \| Node[], `options?`: [_Options_](#Options)): _string_
+
+Renders a DOM node or an array of DOM nodes to a string.
+
+Can be thought of as the equivalent of the `outerHTML` of the passed node(s).
+
+#### Parameters:
+
+| Name      | Type                               | Default value | Description                    |
+| :-------- | :--------------------------------- | :------------ | :----------------------------- |
+| `node`    | Node \| Node[]                     | -             | Node to be rendered.           |
+| `options` | [_DomSerializerOptions_](#Options) | {}            | Changes serialization behavior |
+
+**Returns:** _string_
+
+## Options
+
+### `decodeEntities`
+
+• `Optional` **decodeEntities**: _boolean_
+
+Encode characters that are either reserved in HTML or XML, or are outside of the ASCII range.
+
+**`default`** true
+
+---
+
+### `emptyAttrs`
+
+• `Optional` **emptyAttrs**: _boolean_
+
+Print an empty attribute's value.
+
+**`default`** xmlMode
+
+**`example`** With <code>emptyAttrs: false</code>: <code>&lt;input checked&gt;</code>
+
+**`example`** With <code>emptyAttrs: true</code>: <code>&lt;input checked=""&gt;</code>
+
+---
+
+### `selfClosingTags`
+
+• `Optional` **selfClosingTags**: _boolean_
+
+Print self-closing tags for tags without contents.
+
+**`default`** xmlMode
+
+**`example`** With <code>selfClosingTags: false</code>: <code>&lt;foo&gt;&lt;/foo&gt;</code>
+
+**`example`** With <code>selfClosingTags: true</code>: <code>&lt;foo /&gt;</code>
+
+---
+
+### `xmlMode`
+
+• `Optional` **xmlMode**: _boolean_ \| _"foreign"_
+
+Treat the input as an XML document; enables the `emptyAttrs` and `selfClosingTags` options.
+
+If the value is `"foreign"`, it will try to correct mixed-case attribute names.
+
+**`default`** false
+
+---
+
+## Ecosystem
+
+| Name                                                          | Description                                             |
+| ------------------------------------------------------------- | ------------------------------------------------------- |
+| [htmlparser2](https://github.com/fb55/htmlparser2)            | Fast & forgiving HTML/XML parser                        |
+| [domhandler](https://github.com/fb55/domhandler)              | Handler for htmlparser2 that turns documents into a DOM |
+| [domutils](https://github.com/fb55/domutils)                  | Utilities for working with domhandler's DOM             |
+| [css-select](https://github.com/fb55/css-select)              | CSS selector engine, compatible with domhandler's DOM   |
+| [cheerio](https://github.com/cheeriojs/cheerio)               | The jQuery API for domhandler's DOM                     |
+| [dom-serializer](https://github.com/cheeriojs/dom-serializer) | Serializer for domhandler's DOM                         |
+
+---
+
+LICENSE: MIT
diff --git a/node_modules/css-select/node_modules/dom-serializer/lib/foreignNames.d.ts b/node_modules/css-select/node_modules/dom-serializer/lib/foreignNames.d.ts
new file mode 100644
index 0000000..a8b0938
--- /dev/null
+++ b/node_modules/css-select/node_modules/dom-serializer/lib/foreignNames.d.ts
@@ -0,0 +1,3 @@
+export declare const elementNames: Map<string, string>;
+export declare const attributeNames: Map<string, string>;
+//# sourceMappingURL=foreignNames.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/dom-serializer/lib/foreignNames.d.ts.map b/node_modules/css-select/node_modules/dom-serializer/lib/foreignNames.d.ts.map
new file mode 100644
index 0000000..50e4f26
--- /dev/null
+++ b/node_modules/css-select/node_modules/dom-serializer/lib/foreignNames.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"foreignNames.d.ts","sourceRoot":"","sources":["../src/foreignNames.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,qBAsCvB,CAAC;AACH,eAAO,MAAM,cAAc,qBA4DzB,CAAC"}
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/dom-serializer/lib/foreignNames.js b/node_modules/css-select/node_modules/dom-serializer/lib/foreignNames.js
new file mode 100644
index 0000000..966253e
--- /dev/null
+++ b/node_modules/css-select/node_modules/dom-serializer/lib/foreignNames.js
@@ -0,0 +1,103 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.attributeNames = exports.elementNames = void 0;
+exports.elementNames = new Map([
+    ["altglyph", "altGlyph"],
+    ["altglyphdef", "altGlyphDef"],
+    ["altglyphitem", "altGlyphItem"],
+    ["animatecolor", "animateColor"],
+    ["animatemotion", "animateMotion"],
+    ["animatetransform", "animateTransform"],
+    ["clippath", "clipPath"],
+    ["feblend", "feBlend"],
+    ["fecolormatrix", "feColorMatrix"],
+    ["fecomponenttransfer", "feComponentTransfer"],
+    ["fecomposite", "feComposite"],
+    ["feconvolvematrix", "feConvolveMatrix"],
+    ["fediffuselighting", "feDiffuseLighting"],
+    ["fedisplacementmap", "feDisplacementMap"],
+    ["fedistantlight", "feDistantLight"],
+    ["fedropshadow", "feDropShadow"],
+    ["feflood", "feFlood"],
+    ["fefunca", "feFuncA"],
+    ["fefuncb", "feFuncB"],
+    ["fefuncg", "feFuncG"],
+    ["fefuncr", "feFuncR"],
+    ["fegaussianblur", "feGaussianBlur"],
+    ["feimage", "feImage"],
+    ["femerge", "feMerge"],
+    ["femergenode", "feMergeNode"],
+    ["femorphology", "feMorphology"],
+    ["feoffset", "feOffset"],
+    ["fepointlight", "fePointLight"],
+    ["fespecularlighting", "feSpecularLighting"],
+    ["fespotlight", "feSpotLight"],
+    ["fetile", "feTile"],
+    ["feturbulence", "feTurbulence"],
+    ["foreignobject", "foreignObject"],
+    ["glyphref", "glyphRef"],
+    ["lineargradient", "linearGradient"],
+    ["radialgradient", "radialGradient"],
+    ["textpath", "textPath"],
+]);
+exports.attributeNames = new Map([
+    ["definitionurl", "definitionURL"],
+    ["attributename", "attributeName"],
+    ["attributetype", "attributeType"],
+    ["basefrequency", "baseFrequency"],
+    ["baseprofile", "baseProfile"],
+    ["calcmode", "calcMode"],
+    ["clippathunits", "clipPathUnits"],
+    ["diffuseconstant", "diffuseConstant"],
+    ["edgemode", "edgeMode"],
+    ["filterunits", "filterUnits"],
+    ["glyphref", "glyphRef"],
+    ["gradienttransform", "gradientTransform"],
+    ["gradientunits", "gradientUnits"],
+    ["kernelmatrix", "kernelMatrix"],
+    ["kernelunitlength", "kernelUnitLength"],
+    ["keypoints", "keyPoints"],
+    ["keysplines", "keySplines"],
+    ["keytimes", "keyTimes"],
+    ["lengthadjust", "lengthAdjust"],
+    ["limitingconeangle", "limitingConeAngle"],
+    ["markerheight", "markerHeight"],
+    ["markerunits", "markerUnits"],
+    ["markerwidth", "markerWidth"],
+    ["maskcontentunits", "maskContentUnits"],
+    ["maskunits", "maskUnits"],
+    ["numoctaves", "numOctaves"],
+    ["pathlength", "pathLength"],
+    ["patterncontentunits", "patternContentUnits"],
+    ["patterntransform", "patternTransform"],
+    ["patternunits", "patternUnits"],
+    ["pointsatx", "pointsAtX"],
+    ["pointsaty", "pointsAtY"],
+    ["pointsatz", "pointsAtZ"],
+    ["preservealpha", "preserveAlpha"],
+    ["preserveaspectratio", "preserveAspectRatio"],
+    ["primitiveunits", "primitiveUnits"],
+    ["refx", "refX"],
+    ["refy", "refY"],
+    ["repeatcount", "repeatCount"],
+    ["repeatdur", "repeatDur"],
+    ["requiredextensions", "requiredExtensions"],
+    ["requiredfeatures", "requiredFeatures"],
+    ["specularconstant", "specularConstant"],
+    ["specularexponent", "specularExponent"],
+    ["spreadmethod", "spreadMethod"],
+    ["startoffset", "startOffset"],
+    ["stddeviation", "stdDeviation"],
+    ["stitchtiles", "stitchTiles"],
+    ["surfacescale", "surfaceScale"],
+    ["systemlanguage", "systemLanguage"],
+    ["tablevalues", "tableValues"],
+    ["targetx", "targetX"],
+    ["targety", "targetY"],
+    ["textlength", "textLength"],
+    ["viewbox", "viewBox"],
+    ["viewtarget", "viewTarget"],
+    ["xchannelselector", "xChannelSelector"],
+    ["ychannelselector", "yChannelSelector"],
+    ["zoomandpan", "zoomAndPan"],
+]);
diff --git a/node_modules/css-select/node_modules/dom-serializer/lib/index.d.ts b/node_modules/css-select/node_modules/dom-serializer/lib/index.d.ts
new file mode 100644
index 0000000..84f6d16
--- /dev/null
+++ b/node_modules/css-select/node_modules/dom-serializer/lib/index.d.ts
@@ -0,0 +1,43 @@
+import type { Node } from "domhandler";
+export interface DomSerializerOptions {
+    /**
+     * Print an empty attribute's value.
+     *
+     * @default xmlMode
+     * @example With <code>emptyAttrs: false</code>: <code>&lt;input checked&gt;</code>
+     * @example With <code>emptyAttrs: true</code>: <code>&lt;input checked=""&gt;</code>
+     */
+    emptyAttrs?: boolean;
+    /**
+     * Print self-closing tags for tags without contents.
+     *
+     * @default xmlMode
+     * @example With <code>selfClosingTags: false</code>: <code>&lt;foo&gt;&lt;/foo&gt;</code>
+     * @example With <code>selfClosingTags: true</code>: <code>&lt;foo /&gt;</code>
+     */
+    selfClosingTags?: boolean;
+    /**
+     * Treat the input as an XML document; enables the `emptyAttrs` and `selfClosingTags` options.
+     *
+     * If the value is `"foreign"`, it will try to correct mixed-case attribute names.
+     *
+     * @default false
+     */
+    xmlMode?: boolean | "foreign";
+    /**
+     * Encode characters that are either reserved in HTML or XML, or are outside of the ASCII range.
+     *
+     * @default true
+     */
+    decodeEntities?: boolean;
+}
+/**
+ * Renders a DOM node or an array of DOM nodes to a string.
+ *
+ * Can be thought of as the equivalent of the `outerHTML` of the passed node(s).
+ *
+ * @param node Node to be rendered.
+ * @param options Changes serialization behavior
+ */
+export default function render(node: Node | ArrayLike<Node>, options?: DomSerializerOptions): string;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/dom-serializer/lib/index.d.ts.map b/node_modules/css-select/node_modules/dom-serializer/lib/index.d.ts.map
new file mode 100644
index 0000000..c04bdd4
--- /dev/null
+++ b/node_modules/css-select/node_modules/dom-serializer/lib/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAuC,MAAM,YAAY,CAAC;AAW5E,MAAM,WAAW,oBAAoB;IACnC;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAqED;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,MAAM,CAC5B,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,EAC5B,OAAO,GAAE,oBAAyB,GACjC,MAAM,CAUR"}
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/dom-serializer/lib/index.js b/node_modules/css-select/node_modules/dom-serializer/lib/index.js
new file mode 100644
index 0000000..a5e1f93
--- /dev/null
+++ b/node_modules/css-select/node_modules/dom-serializer/lib/index.js
@@ -0,0 +1,211 @@
+"use strict";
+var __assign = (this && this.__assign) || function () {
+    __assign = Object.assign || function(t) {
+        for (var s, i = 1, n = arguments.length; i < n; i++) {
+            s = arguments[i];
+            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+                t[p] = s[p];
+        }
+        return t;
+    };
+    return __assign.apply(this, arguments);
+};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+/*
+ * Module dependencies
+ */
+var ElementType = __importStar(require("domelementtype"));
+var entities_1 = require("entities");
+/**
+ * Mixed-case SVG and MathML tags & attributes
+ * recognized by the HTML parser.
+ *
+ * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign
+ */
+var foreignNames_1 = require("./foreignNames");
+var unencodedElements = new Set([
+    "style",
+    "script",
+    "xmp",
+    "iframe",
+    "noembed",
+    "noframes",
+    "plaintext",
+    "noscript",
+]);
+/**
+ * Format attributes
+ */
+function formatAttributes(attributes, opts) {
+    if (!attributes)
+        return;
+    return Object.keys(attributes)
+        .map(function (key) {
+        var _a, _b;
+        var value = (_a = attributes[key]) !== null && _a !== void 0 ? _a : "";
+        if (opts.xmlMode === "foreign") {
+            /* Fix up mixed-case attribute names */
+            key = (_b = foreignNames_1.attributeNames.get(key)) !== null && _b !== void 0 ? _b : key;
+        }
+        if (!opts.emptyAttrs && !opts.xmlMode && value === "") {
+            return key;
+        }
+        return key + "=\"" + (opts.decodeEntities !== false
+            ? entities_1.encodeXML(value)
+            : value.replace(/"/g, "&quot;")) + "\"";
+    })
+        .join(" ");
+}
+/**
+ * Self-enclosing tags
+ */
+var singleTag = new Set([
+    "area",
+    "base",
+    "basefont",
+    "br",
+    "col",
+    "command",
+    "embed",
+    "frame",
+    "hr",
+    "img",
+    "input",
+    "isindex",
+    "keygen",
+    "link",
+    "meta",
+    "param",
+    "source",
+    "track",
+    "wbr",
+]);
+/**
+ * Renders a DOM node or an array of DOM nodes to a string.
+ *
+ * Can be thought of as the equivalent of the `outerHTML` of the passed node(s).
+ *
+ * @param node Node to be rendered.
+ * @param options Changes serialization behavior
+ */
+function render(node, options) {
+    if (options === void 0) { options = {}; }
+    var nodes = "length" in node ? node : [node];
+    var output = "";
+    for (var i = 0; i < nodes.length; i++) {
+        output += renderNode(nodes[i], options);
+    }
+    return output;
+}
+exports.default = render;
+function renderNode(node, options) {
+    switch (node.type) {
+        case ElementType.Root:
+            return render(node.children, options);
+        case ElementType.Directive:
+        case ElementType.Doctype:
+            return renderDirective(node);
+        case ElementType.Comment:
+            return renderComment(node);
+        case ElementType.CDATA:
+            return renderCdata(node);
+        case ElementType.Script:
+        case ElementType.Style:
+        case ElementType.Tag:
+            return renderTag(node, options);
+        case ElementType.Text:
+            return renderText(node, options);
+    }
+}
+var foreignModeIntegrationPoints = new Set([
+    "mi",
+    "mo",
+    "mn",
+    "ms",
+    "mtext",
+    "annotation-xml",
+    "foreignObject",
+    "desc",
+    "title",
+]);
+var foreignElements = new Set(["svg", "math"]);
+function renderTag(elem, opts) {
+    var _a;
+    // Handle SVG / MathML in HTML
+    if (opts.xmlMode === "foreign") {
+        /* Fix up mixed-case element names */
+        elem.name = (_a = foreignNames_1.elementNames.get(elem.name)) !== null && _a !== void 0 ? _a : elem.name;
+        /* Exit foreign mode at integration points */
+        if (elem.parent &&
+            foreignModeIntegrationPoints.has(elem.parent.name)) {
+            opts = __assign(__assign({}, opts), { xmlMode: false });
+        }
+    }
+    if (!opts.xmlMode && foreignElements.has(elem.name)) {
+        opts = __assign(__assign({}, opts), { xmlMode: "foreign" });
+    }
+    var tag = "<" + elem.name;
+    var attribs = formatAttributes(elem.attribs, opts);
+    if (attribs) {
+        tag += " " + attribs;
+    }
+    if (elem.children.length === 0 &&
+        (opts.xmlMode
+            ? // In XML mode or foreign mode, and user hasn't explicitly turned off self-closing tags
+                opts.selfClosingTags !== false
+            : // User explicitly asked for self-closing tags, even in HTML mode
+                opts.selfClosingTags && singleTag.has(elem.name))) {
+        if (!opts.xmlMode)
+            tag += " ";
+        tag += "/>";
+    }
+    else {
+        tag += ">";
+        if (elem.children.length > 0) {
+            tag += render(elem.children, opts);
+        }
+        if (opts.xmlMode || !singleTag.has(elem.name)) {
+            tag += "</" + elem.name + ">";
+        }
+    }
+    return tag;
+}
+function renderDirective(elem) {
+    return "<" + elem.data + ">";
+}
+function renderText(elem, opts) {
+    var data = elem.data || "";
+    // If entities weren't decoded, no need to encode them back
+    if (opts.decodeEntities !== false &&
+        !(!opts.xmlMode &&
+            elem.parent &&
+            unencodedElements.has(elem.parent.name))) {
+        data = entities_1.encodeXML(data);
+    }
+    return data;
+}
+function renderCdata(elem) {
+    return "<![CDATA[" + elem.children[0].data + "]]>";
+}
+function renderComment(elem) {
+    return "<!--" + elem.data + "-->";
+}
diff --git a/node_modules/css-select/node_modules/dom-serializer/package.json b/node_modules/css-select/node_modules/dom-serializer/package.json
new file mode 100644
index 0000000..942931e
--- /dev/null
+++ b/node_modules/css-select/node_modules/dom-serializer/package.json
@@ -0,0 +1,55 @@
+{
+  "name": "dom-serializer",
+  "version": "1.3.2",
+  "description": "render domhandler DOM nodes to a string",
+  "author": "Felix Boehm <me@feedic.com>",
+  "sideEffects": false,
+  "keywords": [
+    "html",
+    "xml",
+    "render"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/cheeriojs/dom-renderer.git"
+  },
+  "main": "lib/index.js",
+  "types": "lib/index.d.ts",
+  "files": [
+    "lib/**/*"
+  ],
+  "dependencies": {
+    "domelementtype": "^2.0.1",
+    "domhandler": "^4.2.0",
+    "entities": "^2.0.0"
+  },
+  "devDependencies": {
+    "@types/jest": "^26.0.23",
+    "@types/node": "^15.3.0",
+    "@typescript-eslint/eslint-plugin": "^4.23.0",
+    "@typescript-eslint/parser": "^4.23.0",
+    "cheerio": "^1.0.0-rc.9",
+    "coveralls": "^3.0.5",
+    "eslint": "^7.26.0",
+    "eslint-config-prettier": "^8.3.0",
+    "htmlparser2": "^6.1.0",
+    "jest": "^26.0.1",
+    "prettier": "^2.3.0",
+    "ts-jest": "^26.5.6",
+    "typescript": "^4.0.2"
+  },
+  "scripts": {
+    "test": "jest --coverage && npm run lint",
+    "coverage": "cat coverage/lcov.info | coveralls",
+    "lint": "eslint src",
+    "format": "prettier --write '**/*.{ts,md,json}'",
+    "build": "tsc",
+    "prepare": "npm run build"
+  },
+  "jest": {
+    "preset": "ts-jest",
+    "testEnvironment": "node"
+  },
+  "funding": "https://github.com/cheeriojs/dom-serializer?sponsor=1",
+  "license": "MIT"
+}
diff --git a/node_modules/css-select/node_modules/domelementtype/LICENSE b/node_modules/css-select/node_modules/domelementtype/LICENSE
new file mode 100644
index 0000000..c464f86
--- /dev/null
+++ b/node_modules/css-select/node_modules/domelementtype/LICENSE
@@ -0,0 +1,11 @@
+Copyright (c) Felix Böhm
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/css-select/node_modules/domelementtype/lib/index.d.ts b/node_modules/css-select/node_modules/domelementtype/lib/index.d.ts
new file mode 100644
index 0000000..72fa4f8
--- /dev/null
+++ b/node_modules/css-select/node_modules/domelementtype/lib/index.d.ts
@@ -0,0 +1,48 @@
+/** Types of elements found in htmlparser2's DOM */
+export declare enum ElementType {
+    /** Type for the root element of a document */
+    Root = "root",
+    /** Type for Text */
+    Text = "text",
+    /** Type for <? ... ?> */
+    Directive = "directive",
+    /** Type for <!-- ... --> */
+    Comment = "comment",
+    /** Type for <script> tags */
+    Script = "script",
+    /** Type for <style> tags */
+    Style = "style",
+    /** Type for Any tag */
+    Tag = "tag",
+    /** Type for <![CDATA[ ... ]]> */
+    CDATA = "cdata",
+    /** Type for <!doctype ...> */
+    Doctype = "doctype"
+}
+/**
+ * Tests whether an element is a tag or not.
+ *
+ * @param elem Element to test
+ */
+export declare function isTag(elem: {
+    type: ElementType;
+}): boolean;
+/** Type for the root element of a document */
+export declare const Root = ElementType.Root;
+/** Type for Text */
+export declare const Text = ElementType.Text;
+/** Type for <? ... ?> */
+export declare const Directive = ElementType.Directive;
+/** Type for <!-- ... --> */
+export declare const Comment = ElementType.Comment;
+/** Type for <script> tags */
+export declare const Script = ElementType.Script;
+/** Type for <style> tags */
+export declare const Style = ElementType.Style;
+/** Type for Any tag */
+export declare const Tag = ElementType.Tag;
+/** Type for <![CDATA[ ... ]]> */
+export declare const CDATA = ElementType.CDATA;
+/** Type for <!doctype ...> */
+export declare const Doctype = ElementType.Doctype;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domelementtype/lib/index.d.ts.map b/node_modules/css-select/node_modules/domelementtype/lib/index.d.ts.map
new file mode 100644
index 0000000..a581ba6
--- /dev/null
+++ b/node_modules/css-select/node_modules/domelementtype/lib/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,oBAAY,WAAW;IACnB,8CAA8C;IAC9C,IAAI,SAAS;IACb,oBAAoB;IACpB,IAAI,SAAS;IACb,yBAAyB;IACzB,SAAS,cAAc;IACvB,4BAA4B;IAC5B,OAAO,YAAY;IACnB,6BAA6B;IAC7B,MAAM,WAAW;IACjB,4BAA4B;IAC5B,KAAK,UAAU;IACf,uBAAuB;IACvB,GAAG,QAAQ;IACX,iCAAiC;IACjC,KAAK,UAAU;IACf,8BAA8B;IAC9B,OAAO,YAAY;CACtB;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GAAG,OAAO,CAM1D;AAGD,8CAA8C;AAC9C,eAAO,MAAM,IAAI,mBAAmB,CAAC;AACrC,oBAAoB;AACpB,eAAO,MAAM,IAAI,mBAAmB,CAAC;AACrC,yBAAyB;AACzB,eAAO,MAAM,SAAS,wBAAwB,CAAC;AAC/C,4BAA4B;AAC5B,eAAO,MAAM,OAAO,sBAAsB,CAAC;AAC3C,6BAA6B;AAC7B,eAAO,MAAM,MAAM,qBAAqB,CAAC;AACzC,4BAA4B;AAC5B,eAAO,MAAM,KAAK,oBAAoB,CAAC;AACvC,uBAAuB;AACvB,eAAO,MAAM,GAAG,kBAAkB,CAAC;AACnC,iCAAiC;AACjC,eAAO,MAAM,KAAK,oBAAoB,CAAC;AACvC,8BAA8B;AAC9B,eAAO,MAAM,OAAO,sBAAsB,CAAC"}
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domelementtype/lib/index.js b/node_modules/css-select/node_modules/domelementtype/lib/index.js
new file mode 100644
index 0000000..b0ebcb1
--- /dev/null
+++ b/node_modules/css-select/node_modules/domelementtype/lib/index.js
@@ -0,0 +1,55 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Doctype = exports.CDATA = exports.Tag = exports.Style = exports.Script = exports.Comment = exports.Directive = exports.Text = exports.Root = exports.isTag = exports.ElementType = void 0;
+/** Types of elements found in htmlparser2's DOM */
+var ElementType;
+(function (ElementType) {
+    /** Type for the root element of a document */
+    ElementType["Root"] = "root";
+    /** Type for Text */
+    ElementType["Text"] = "text";
+    /** Type for <? ... ?> */
+    ElementType["Directive"] = "directive";
+    /** Type for <!-- ... --> */
+    ElementType["Comment"] = "comment";
+    /** Type for <script> tags */
+    ElementType["Script"] = "script";
+    /** Type for <style> tags */
+    ElementType["Style"] = "style";
+    /** Type for Any tag */
+    ElementType["Tag"] = "tag";
+    /** Type for <![CDATA[ ... ]]> */
+    ElementType["CDATA"] = "cdata";
+    /** Type for <!doctype ...> */
+    ElementType["Doctype"] = "doctype";
+})(ElementType = exports.ElementType || (exports.ElementType = {}));
+/**
+ * Tests whether an element is a tag or not.
+ *
+ * @param elem Element to test
+ */
+function isTag(elem) {
+    return (elem.type === ElementType.Tag ||
+        elem.type === ElementType.Script ||
+        elem.type === ElementType.Style);
+}
+exports.isTag = isTag;
+// Exports for backwards compatibility
+/** Type for the root element of a document */
+exports.Root = ElementType.Root;
+/** Type for Text */
+exports.Text = ElementType.Text;
+/** Type for <? ... ?> */
+exports.Directive = ElementType.Directive;
+/** Type for <!-- ... --> */
+exports.Comment = ElementType.Comment;
+/** Type for <script> tags */
+exports.Script = ElementType.Script;
+/** Type for <style> tags */
+exports.Style = ElementType.Style;
+/** Type for Any tag */
+exports.Tag = ElementType.Tag;
+/** Type for <![CDATA[ ... ]]> */
+exports.CDATA = ElementType.CDATA;
+/** Type for <!doctype ...> */
+exports.Doctype = ElementType.Doctype;
diff --git a/node_modules/css-select/node_modules/domelementtype/package.json b/node_modules/css-select/node_modules/domelementtype/package.json
new file mode 100644
index 0000000..38b01c3
--- /dev/null
+++ b/node_modules/css-select/node_modules/domelementtype/package.json
@@ -0,0 +1,45 @@
+{
+  "name": "domelementtype",
+  "version": "2.2.0",
+  "description": "all the types of nodes in htmlparser2's dom",
+  "author": "Felix Boehm <me@feedic.com>",
+  "license": "BSD-2-Clause",
+  "funding": [
+    {
+      "type": "github",
+      "url": "https://github.com/sponsors/fb55"
+    }
+  ],
+  "sideEffects": false,
+  "main": "lib/index.js",
+  "types": "lib/index.d.ts",
+  "files": [
+    "lib/**/*"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/fb55/domelementtype.git"
+  },
+  "keywords": [
+    "dom",
+    "htmlparser2"
+  ],
+  "scripts": {
+    "test": "npm run lint && prettier --check **/*.{ts,json,md}",
+    "lint": "eslint src",
+    "format": "prettier --write **/*.{ts,json,md}",
+    "build": "tsc",
+    "prepare": "npm run build"
+  },
+  "prettier": {
+    "tabWidth": 4
+  },
+  "devDependencies": {
+    "@typescript-eslint/eslint-plugin": "^4.1.0",
+    "@typescript-eslint/parser": "^4.1.0",
+    "eslint": "^7.9.0",
+    "eslint-config-prettier": "^6.0.0",
+    "prettier": "^2.1.1",
+    "typescript": "^4.0.2"
+  }
+}
diff --git a/node_modules/css-select/node_modules/domelementtype/readme.md b/node_modules/css-select/node_modules/domelementtype/readme.md
new file mode 100644
index 0000000..4eadc07
--- /dev/null
+++ b/node_modules/css-select/node_modules/domelementtype/readme.md
@@ -0,0 +1 @@
+All the types of nodes in htmlparser2's DOM.
diff --git a/node_modules/css-select/node_modules/domhandler/LICENSE b/node_modules/css-select/node_modules/domhandler/LICENSE
new file mode 100644
index 0000000..c464f86
--- /dev/null
+++ b/node_modules/css-select/node_modules/domhandler/LICENSE
@@ -0,0 +1,11 @@
+Copyright (c) Felix Böhm
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/css-select/node_modules/domhandler/lib/index.d.ts b/node_modules/css-select/node_modules/domhandler/lib/index.d.ts
new file mode 100644
index 0000000..8990751
--- /dev/null
+++ b/node_modules/css-select/node_modules/domhandler/lib/index.d.ts
@@ -0,0 +1,86 @@
+import { DataNode, Document , Element, Node, NodeWithChildren} from "./node";
+
+export * from "./node";
+export interface DomHandlerOptions {
+    /**
+     * Add a `startIndex` property to nodes.
+     * When the parser is used in a non-streaming fashion, `startIndex` is an integer
+     * indicating the position of the start of the node in the document.
+     *
+     * @default false
+     */
+    withStartIndices?: boolean;
+    /**
+     * Add an `endIndex` property to nodes.
+     * When the parser is used in a non-streaming fashion, `endIndex` is an integer
+     * indicating the position of the end of the node in the document.
+     *
+     * @default false
+     */
+    withEndIndices?: boolean;
+    /**
+     * Replace all whitespace with single spaces.
+     *
+     * **Note:** Enabling this might break your markup.
+     *
+     * @default false
+     * @deprecated
+     */
+    normalizeWhitespace?: boolean;
+    /**
+     * Treat the markup as XML.
+     *
+     * @default false
+     */
+    xmlMode?: boolean;
+}
+interface ParserInterface {
+    startIndex: number | null;
+    endIndex: number | null;
+}
+declare type Callback = (error: Error | null, dom: Node[]) => void;
+declare type ElementCallback = (element: Element) => void;
+export declare class DomHandler {
+    /** The elements of the DOM */
+    dom: Node[];
+    /** The root element for the DOM */
+    root: Document;
+    /** Called once parsing has completed. */
+    private readonly callback;
+    /** Settings for the handler. */
+    private readonly options;
+    /** Callback whenever a tag is closed. */
+    private readonly elementCB;
+    /** Indicated whether parsing has been completed. */
+    private done;
+    /** Stack of open tags. */
+    protected tagStack: NodeWithChildren[];
+    /** A data node that is still being written to. */
+    protected lastNode: DataNode | null;
+    /** Reference to the parser instance. Used for location information. */
+    private parser;
+    /**
+     * @param callback Called once parsing has completed.
+     * @param options Settings for the handler.
+     * @param elementCB Callback whenever a tag is closed.
+     */
+    constructor(callback?: Callback | null, options?: DomHandlerOptions | null, elementCB?: ElementCallback);
+    onparserinit(parser: ParserInterface): void;
+    onreset(): void;
+    onend(): void;
+    onerror(error: Error): void;
+    onclosetag(): void;
+    onopentag(name: string, attribs: {
+        [key: string]: string;
+    }): void;
+    ontext(data: string): void;
+    oncomment(data: string): void;
+    oncommentend(): void;
+    oncdatastart(): void;
+    oncdataend(): void;
+    onprocessinginstruction(name: string, data: string): void;
+    protected handleCallback(error: Error | null): void;
+    protected addNode(node: Node): void;
+}
+export default DomHandler;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domhandler/lib/index.d.ts.map b/node_modules/css-select/node_modules/domhandler/lib/index.d.ts.map
new file mode 100644
index 0000000..1e1cd56
--- /dev/null
+++ b/node_modules/css-select/node_modules/domhandler/lib/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACH,IAAI,EACJ,OAAO,EACP,QAAQ,EAGR,gBAAgB,EAChB,QAAQ,EAEX,MAAM,QAAQ,CAAC;AAEhB,cAAc,QAAQ,CAAC;AAIvB,MAAM,WAAW,iBAAiB;IAC9B;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AASD,UAAU,eAAe;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,aAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAC3D,aAAK,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;AAElD,qBAAa,UAAU;IACnB,8BAA8B;IACvB,GAAG,EAAE,IAAI,EAAE,CAAM;IAExB,mCAAmC;IAC5B,IAAI,WAA0B;IAErC,yCAAyC;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAE3C,gCAAgC;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAE5C,yCAAyC;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IAEnD,oDAAoD;IACpD,OAAO,CAAC,IAAI,CAAS;IAErB,0BAA0B;IAC1B,SAAS,CAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAe;IAErD,kDAAkD;IAClD,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAQ;IAE3C,uEAAuE;IACvE,OAAO,CAAC,MAAM,CAAgC;IAE9C;;;;OAIG;gBAEC,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI,EAClC,SAAS,CAAC,EAAE,eAAe;IAiBxB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAK3C,OAAO,IAAI,IAAI;IAUf,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAI3B,UAAU,IAAI,IAAI;IAYlB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,IAAI;IAOjE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAwB1B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAW7B,YAAY,IAAI,IAAI;IAIpB,YAAY,IAAI,IAAI;IAUpB,UAAU,IAAI,IAAI;IAIlB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAKhE,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,IAAI;IAQnD,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;CAwBtC;AAED,eAAe,UAAU,CAAC"}
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domhandler/lib/index.js b/node_modules/css-select/node_modules/domhandler/lib/index.js
new file mode 100644
index 0000000..73b34e4
--- /dev/null
+++ b/node_modules/css-select/node_modules/domhandler/lib/index.js
@@ -0,0 +1,169 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DomHandler = void 0;
+var domelementtype_1 = require("domelementtype");
+var node_1 = require("./node");
+__exportStar(require("./node"), exports);
+var reWhitespace = /\s+/g;
+// Default options
+var defaultOpts = {
+    normalizeWhitespace: false,
+    withStartIndices: false,
+    withEndIndices: false,
+};
+var DomHandler = /** @class */ (function () {
+    /**
+     * @param callback Called once parsing has completed.
+     * @param options Settings for the handler.
+     * @param elementCB Callback whenever a tag is closed.
+     */
+    function DomHandler(callback, options, elementCB) {
+        /** The elements of the DOM */
+        this.dom = [];
+        /** The root element for the DOM */
+        this.root = new node_1.Document(this.dom);
+        /** Indicated whether parsing has been completed. */
+        this.done = false;
+        /** Stack of open tags. */
+        this.tagStack = [this.root];
+        /** A data node that is still being written to. */
+        this.lastNode = null;
+        /** Reference to the parser instance. Used for location information. */
+        this.parser = null;
+        // Make it possible to skip arguments, for backwards-compatibility
+        if (typeof options === "function") {
+            elementCB = options;
+            options = defaultOpts;
+        }
+        if (typeof callback === "object") {
+            options = callback;
+            callback = undefined;
+        }
+        this.callback = callback !== null && callback !== void 0 ? callback : null;
+        this.options = options !== null && options !== void 0 ? options : defaultOpts;
+        this.elementCB = elementCB !== null && elementCB !== void 0 ? elementCB : null;
+    }
+    DomHandler.prototype.onparserinit = function (parser) {
+        this.parser = parser;
+    };
+    // Resets the handler back to starting state
+    DomHandler.prototype.onreset = function () {
+        var _a;
+        this.dom = [];
+        this.root = new node_1.Document(this.dom);
+        this.done = false;
+        this.tagStack = [this.root];
+        this.lastNode = null;
+        this.parser = (_a = this.parser) !== null && _a !== void 0 ? _a : null;
+    };
+    // Signals the handler that parsing is done
+    DomHandler.prototype.onend = function () {
+        if (this.done)
+            return;
+        this.done = true;
+        this.parser = null;
+        this.handleCallback(null);
+    };
+    DomHandler.prototype.onerror = function (error) {
+        this.handleCallback(error);
+    };
+    DomHandler.prototype.onclosetag = function () {
+        this.lastNode = null;
+        var elem = this.tagStack.pop();
+        if (this.options.withEndIndices) {
+            elem.endIndex = this.parser.endIndex;
+        }
+        if (this.elementCB)
+            this.elementCB(elem);
+    };
+    DomHandler.prototype.onopentag = function (name, attribs) {
+        var type = this.options.xmlMode ? domelementtype_1.ElementType.Tag : undefined;
+        var element = new node_1.Element(name, attribs, undefined, type);
+        this.addNode(element);
+        this.tagStack.push(element);
+    };
+    DomHandler.prototype.ontext = function (data) {
+        var normalizeWhitespace = this.options.normalizeWhitespace;
+        var lastNode = this.lastNode;
+        if (lastNode && lastNode.type === domelementtype_1.ElementType.Text) {
+            if (normalizeWhitespace) {
+                lastNode.data = (lastNode.data + data).replace(reWhitespace, " ");
+            }
+            else {
+                lastNode.data += data;
+            }
+        }
+        else {
+            if (normalizeWhitespace) {
+                data = data.replace(reWhitespace, " ");
+            }
+            var node = new node_1.Text(data);
+            this.addNode(node);
+            this.lastNode = node;
+        }
+    };
+    DomHandler.prototype.oncomment = function (data) {
+        if (this.lastNode && this.lastNode.type === domelementtype_1.ElementType.Comment) {
+            this.lastNode.data += data;
+            return;
+        }
+        var node = new node_1.Comment(data);
+        this.addNode(node);
+        this.lastNode = node;
+    };
+    DomHandler.prototype.oncommentend = function () {
+        this.lastNode = null;
+    };
+    DomHandler.prototype.oncdatastart = function () {
+        var text = new node_1.Text("");
+        var node = new node_1.NodeWithChildren(domelementtype_1.ElementType.CDATA, [text]);
+        this.addNode(node);
+        text.parent = node;
+        this.lastNode = text;
+    };
+    DomHandler.prototype.oncdataend = function () {
+        this.lastNode = null;
+    };
+    DomHandler.prototype.onprocessinginstruction = function (name, data) {
+        var node = new node_1.ProcessingInstruction(name, data);
+        this.addNode(node);
+    };
+    DomHandler.prototype.handleCallback = function (error) {
+        if (typeof this.callback === "function") {
+            this.callback(error, this.dom);
+        }
+        else if (error) {
+            throw error;
+        }
+    };
+    DomHandler.prototype.addNode = function (node) {
+        var parent = this.tagStack[this.tagStack.length - 1];
+        var previousSibling = parent.children[parent.children.length - 1];
+        if (this.options.withStartIndices) {
+            node.startIndex = this.parser.startIndex;
+        }
+        if (this.options.withEndIndices) {
+            node.endIndex = this.parser.endIndex;
+        }
+        parent.children.push(node);
+        if (previousSibling) {
+            node.prev = previousSibling;
+            previousSibling.next = node;
+        }
+        node.parent = parent;
+        this.lastNode = null;
+    };
+    return DomHandler;
+}());
+exports.DomHandler = DomHandler;
+exports.default = DomHandler;
diff --git a/node_modules/css-select/node_modules/domhandler/lib/node.d.ts b/node_modules/css-select/node_modules/domhandler/lib/node.d.ts
new file mode 100644
index 0000000..f9b7f0e
--- /dev/null
+++ b/node_modules/css-select/node_modules/domhandler/lib/node.d.ts
@@ -0,0 +1,148 @@
+import { ElementType } from "domelementtype";
+/**
+ * This object will be used as the prototype for Nodes when creating a
+ * DOM-Level-1-compliant structure.
+ */
+export declare class Node {
+    type: ElementType;
+    /** Parent of the node */
+    parent: NodeWithChildren | null;
+    /** Previous sibling */
+    prev: Node | null;
+    /** Next sibling */
+    next: Node | null;
+    /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */
+    startIndex: number | null;
+    /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */
+    endIndex: number | null;
+    /**
+     *
+     * @param type The type of the node.
+     */
+    constructor(type: ElementType);
+    get nodeType(): number;
+    get parentNode(): NodeWithChildren | null;
+    set parentNode(parent: NodeWithChildren | null);
+    get previousSibling(): Node | null;
+    set previousSibling(prev: Node | null);
+    get nextSibling(): Node | null;
+    set nextSibling(next: Node | null);
+    /**
+     * Clone this node, and optionally its children.
+     *
+     * @param recursive Clone child nodes as well.
+     * @returns A clone of the node.
+     */
+    cloneNode<T extends Node>(this: T, recursive?: boolean): T;
+}
+export declare class DataNode extends Node {
+    data: string;
+    /**
+     * @param type The type of the node
+     * @param data The content of the data node
+     */
+    constructor(type: ElementType.Comment | ElementType.Text | ElementType.Directive, data: string);
+    get nodeValue(): string;
+    set nodeValue(data: string);
+}
+export declare class Text extends DataNode {
+    constructor(data: string);
+}
+export declare class Comment extends DataNode {
+    constructor(data: string);
+}
+export declare class ProcessingInstruction extends DataNode {
+    name: string;
+    constructor(name: string, data: string);
+    "x-name"?: string;
+    "x-publicId"?: string;
+    "x-systemId"?: string;
+}
+/**
+ * A `Node` that can have children.
+ */
+export declare class NodeWithChildren extends Node {
+    children: Node[];
+    /**
+     * @param type Type of the node.
+     * @param children Children of the node. Only certain node types can have children.
+     */
+    constructor(type: ElementType.Root | ElementType.CDATA | ElementType.Script | ElementType.Style | ElementType.Tag, children: Node[]);
+    get firstChild(): Node | null;
+    get lastChild(): Node | null;
+    get childNodes(): Node[];
+    set childNodes(children: Node[]);
+}
+export declare class Document extends NodeWithChildren {
+    constructor(children: Node[]);
+    "x-mode"?: "no-quirks" | "quirks" | "limited-quirks";
+}
+interface Attribute {
+    name: string;
+    value: string;
+    namespace?: string;
+    prefix?: string;
+}
+export declare class Element extends NodeWithChildren {
+    name: string;
+    attribs: {
+        [name: string]: string;
+    };
+    /**
+     * @param name Name of the tag, eg. `div`, `span`.
+     * @param attribs Object mapping attribute names to attribute values.
+     * @param children Children of the node.
+     */
+    constructor(name: string, attribs: {
+        [name: string]: string;
+    }, children?: Node[], type?: ElementType.Tag | ElementType.Script | ElementType.Style);
+    get tagName(): string;
+    set tagName(name: string);
+    get attributes(): Attribute[];
+    "x-attribsNamespace"?: Record<string, string>;
+    "x-attribsPrefix"?: Record<string, string>;
+}
+/**
+ * @param node Node to check.
+ * @returns `true` if the node is a `Element`, `false` otherwise.
+ */
+export declare function isTag(node: Node): node is Element;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node has the type `CDATA`, `false` otherwise.
+ */
+export declare function isCDATA(node: Node): node is NodeWithChildren;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node has the type `Text`, `false` otherwise.
+ */
+export declare function isText(node: Node): node is DataNode;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node has the type `Comment`, `false` otherwise.
+ */
+export declare function isComment(node: Node): node is DataNode;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node has the type `ProcessingInstruction`, `false` otherwise.
+ */
+export declare function isDirective(node: Node): node is ProcessingInstruction;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node has the type `ProcessingInstruction`, `false` otherwise.
+ */
+export declare function isDocument(node: Node): node is Document;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node is a `NodeWithChildren` (has children), `false` otherwise.
+ */
+export declare function hasChildren(node: Node): node is NodeWithChildren;
+/**
+ * Clone a node, and optionally its children.
+ *
+ * @param recursive Clone child nodes as well.
+ * @returns A clone of the node.
+ */
+export declare function cloneNode<T extends Node>(node: T, recursive?: boolean): T;
+export {};
+//# sourceMappingURL=node.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domhandler/lib/node.d.ts.map b/node_modules/css-select/node_modules/domhandler/lib/node.d.ts.map
new file mode 100644
index 0000000..59f54f8
--- /dev/null
+++ b/node_modules/css-select/node_modules/domhandler/lib/node.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,gBAAgB,CAAC;AAahE;;;GAGG;AACH,qBAAa,IAAI;IAoBM,IAAI,EAAE,WAAW;IAnBpC,yBAAyB;IACzB,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAEvC,uBAAuB;IACvB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAQ;IAEzB,mBAAmB;IACnB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAQ;IAEzB,2FAA2F;IAC3F,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEjC,uFAAuF;IACvF,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B;;;OAGG;gBACgB,IAAI,EAAE,WAAW;IAGpC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAGD,IAAI,UAAU,IAAI,gBAAgB,GAAG,IAAI,CAExC;IAED,IAAI,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,EAE7C;IAED,IAAI,eAAe,IAAI,IAAI,GAAG,IAAI,CAEjC;IAED,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAEpC;IAED,IAAI,WAAW,IAAI,IAAI,GAAG,IAAI,CAE7B;IAED,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAEhC;IAED;;;;;OAKG;IACH,SAAS,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,UAAQ,GAAG,CAAC;CAG3D;AAED,qBAAa,QAAS,SAAQ,IAAI;IAOnB,IAAI,EAAE,MAAM;IANvB;;;OAGG;gBAEC,IAAI,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,SAAS,EAC7D,IAAI,EAAE,MAAM;IAKvB,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,SAAS,CAAC,IAAI,EAAE,MAAM,EAEzB;CACJ;AAED,qBAAa,IAAK,SAAQ,QAAQ;gBAClB,IAAI,EAAE,MAAM;CAG3B;AAED,qBAAa,OAAQ,SAAQ,QAAQ;gBACrB,IAAI,EAAE,MAAM;CAG3B;AAED,qBAAa,qBAAsB,SAAQ,QAAQ;IAC5B,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAI7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,IAAI;IAY3B,QAAQ,EAAE,IAAI,EAAE;IAX3B;;;OAGG;gBAEC,IAAI,EACE,WAAW,CAAC,IAAI,GAChB,WAAW,CAAC,KAAK,GACjB,WAAW,CAAC,MAAM,GAClB,WAAW,CAAC,KAAK,GACjB,WAAW,CAAC,GAAG,EACd,QAAQ,EAAE,IAAI,EAAE;IAM3B,IAAI,UAAU,IAAI,IAAI,GAAG,IAAI,CAE5B;IAED,IAAI,SAAS,IAAI,IAAI,GAAG,IAAI,CAI3B;IAED,IAAI,UAAU,IAAI,IAAI,EAAE,CAEvB;IAED,IAAI,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,EAE9B;CACJ;AAED,qBAAa,QAAS,SAAQ,gBAAgB;gBAC9B,QAAQ,EAAE,IAAI,EAAE;IAI5B,QAAQ,CAAC,EAAE,WAAW,GAAG,QAAQ,GAAG,gBAAgB,CAAC;CACxD;AAED,UAAU,SAAS;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AACD,qBAAa,OAAQ,SAAQ,gBAAgB;IAO9B,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE;IAP9C;;;;OAIG;gBAEQ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,EAC1C,QAAQ,GAAE,IAAI,EAAO,EACrB,IAAI,GACE,WAAW,CAAC,GAAG,GACf,WAAW,CAAC,MAAM,GAClB,WAAW,CAAC,KAIG;IAMzB,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,EAEvB;IAED,IAAI,UAAU,IAAI,SAAS,EAAE,CAO5B;IAED,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9C;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,OAAO,CAEjD;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,gBAAgB,CAE5D;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,QAAQ,CAEnD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,QAAQ,CAEtD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,qBAAqB,CAErE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,QAAQ,CAEvD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,gBAAgB,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,UAAQ,GAAG,CAAC,CAoDvE"}
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domhandler/lib/node.js b/node_modules/css-select/node_modules/domhandler/lib/node.js
new file mode 100644
index 0000000..000e87f
--- /dev/null
+++ b/node_modules/css-select/node_modules/domhandler/lib/node.js
@@ -0,0 +1,390 @@
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = function (d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+    return function (d, b) {
+        if (typeof b !== "function" && b !== null)
+            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+var __assign = (this && this.__assign) || function () {
+    __assign = Object.assign || function(t) {
+        for (var s, i = 1, n = arguments.length; i < n; i++) {
+            s = arguments[i];
+            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+                t[p] = s[p];
+        }
+        return t;
+    };
+    return __assign.apply(this, arguments);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.cloneNode = exports.hasChildren = exports.isDocument = exports.isDirective = exports.isComment = exports.isText = exports.isCDATA = exports.isTag = exports.Element = exports.Document = exports.NodeWithChildren = exports.ProcessingInstruction = exports.Comment = exports.Text = exports.DataNode = exports.Node = void 0;
+var domelementtype_1 = require("domelementtype");
+var nodeTypes = new Map([
+    [domelementtype_1.ElementType.Tag, 1],
+    [domelementtype_1.ElementType.Script, 1],
+    [domelementtype_1.ElementType.Style, 1],
+    [domelementtype_1.ElementType.Directive, 1],
+    [domelementtype_1.ElementType.Text, 3],
+    [domelementtype_1.ElementType.CDATA, 4],
+    [domelementtype_1.ElementType.Comment, 8],
+    [domelementtype_1.ElementType.Root, 9],
+]);
+/**
+ * This object will be used as the prototype for Nodes when creating a
+ * DOM-Level-1-compliant structure.
+ */
+var Node = /** @class */ (function () {
+    /**
+     *
+     * @param type The type of the node.
+     */
+    function Node(type) {
+        this.type = type;
+        /** Parent of the node */
+        this.parent = null;
+        /** Previous sibling */
+        this.prev = null;
+        /** Next sibling */
+        this.next = null;
+        /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */
+        this.startIndex = null;
+        /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */
+        this.endIndex = null;
+    }
+    Object.defineProperty(Node.prototype, "nodeType", {
+        // Read-only aliases
+        get: function () {
+            var _a;
+            return (_a = nodeTypes.get(this.type)) !== null && _a !== void 0 ? _a : 1;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "parentNode", {
+        // Read-write aliases for properties
+        get: function () {
+            return this.parent;
+        },
+        set: function (parent) {
+            this.parent = parent;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "previousSibling", {
+        get: function () {
+            return this.prev;
+        },
+        set: function (prev) {
+            this.prev = prev;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Node.prototype, "nextSibling", {
+        get: function () {
+            return this.next;
+        },
+        set: function (next) {
+            this.next = next;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    /**
+     * Clone this node, and optionally its children.
+     *
+     * @param recursive Clone child nodes as well.
+     * @returns A clone of the node.
+     */
+    Node.prototype.cloneNode = function (recursive) {
+        if (recursive === void 0) { recursive = false; }
+        return cloneNode(this, recursive);
+    };
+    return Node;
+}());
+exports.Node = Node;
+var DataNode = /** @class */ (function (_super) {
+    __extends(DataNode, _super);
+    /**
+     * @param type The type of the node
+     * @param data The content of the data node
+     */
+    function DataNode(type, data) {
+        var _this = _super.call(this, type) || this;
+        _this.data = data;
+        return _this;
+    }
+    Object.defineProperty(DataNode.prototype, "nodeValue", {
+        get: function () {
+            return this.data;
+        },
+        set: function (data) {
+            this.data = data;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    return DataNode;
+}(Node));
+exports.DataNode = DataNode;
+var Text = /** @class */ (function (_super) {
+    __extends(Text, _super);
+    function Text(data) {
+        return _super.call(this, domelementtype_1.ElementType.Text, data) || this;
+    }
+    return Text;
+}(DataNode));
+exports.Text = Text;
+var Comment = /** @class */ (function (_super) {
+    __extends(Comment, _super);
+    function Comment(data) {
+        return _super.call(this, domelementtype_1.ElementType.Comment, data) || this;
+    }
+    return Comment;
+}(DataNode));
+exports.Comment = Comment;
+var ProcessingInstruction = /** @class */ (function (_super) {
+    __extends(ProcessingInstruction, _super);
+    function ProcessingInstruction(name, data) {
+        var _this = _super.call(this, domelementtype_1.ElementType.Directive, data) || this;
+        _this.name = name;
+        return _this;
+    }
+    return ProcessingInstruction;
+}(DataNode));
+exports.ProcessingInstruction = ProcessingInstruction;
+/**
+ * A `Node` that can have children.
+ */
+var NodeWithChildren = /** @class */ (function (_super) {
+    __extends(NodeWithChildren, _super);
+    /**
+     * @param type Type of the node.
+     * @param children Children of the node. Only certain node types can have children.
+     */
+    function NodeWithChildren(type, children) {
+        var _this = _super.call(this, type) || this;
+        _this.children = children;
+        return _this;
+    }
+    Object.defineProperty(NodeWithChildren.prototype, "firstChild", {
+        // Aliases
+        get: function () {
+            var _a;
+            return (_a = this.children[0]) !== null && _a !== void 0 ? _a : null;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(NodeWithChildren.prototype, "lastChild", {
+        get: function () {
+            return this.children.length > 0
+                ? this.children[this.children.length - 1]
+                : null;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(NodeWithChildren.prototype, "childNodes", {
+        get: function () {
+            return this.children;
+        },
+        set: function (children) {
+            this.children = children;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    return NodeWithChildren;
+}(Node));
+exports.NodeWithChildren = NodeWithChildren;
+var Document = /** @class */ (function (_super) {
+    __extends(Document, _super);
+    function Document(children) {
+        return _super.call(this, domelementtype_1.ElementType.Root, children) || this;
+    }
+    return Document;
+}(NodeWithChildren));
+exports.Document = Document;
+var Element = /** @class */ (function (_super) {
+    __extends(Element, _super);
+    /**
+     * @param name Name of the tag, eg. `div`, `span`.
+     * @param attribs Object mapping attribute names to attribute values.
+     * @param children Children of the node.
+     */
+    function Element(name, attribs, children, type) {
+        if (children === void 0) { children = []; }
+        if (type === void 0) { type = name === "script"
+            ? domelementtype_1.ElementType.Script
+            : name === "style"
+                ? domelementtype_1.ElementType.Style
+                : domelementtype_1.ElementType.Tag; }
+        var _this = _super.call(this, type, children) || this;
+        _this.name = name;
+        _this.attribs = attribs;
+        return _this;
+    }
+    Object.defineProperty(Element.prototype, "tagName", {
+        // DOM Level 1 aliases
+        get: function () {
+            return this.name;
+        },
+        set: function (name) {
+            this.name = name;
+        },
+        enumerable: false,
+        configurable: true
+    });
+    Object.defineProperty(Element.prototype, "attributes", {
+        get: function () {
+            var _this = this;
+            return Object.keys(this.attribs).map(function (name) {
+                var _a, _b;
+                return ({
+                    name: name,
+                    value: _this.attribs[name],
+                    namespace: (_a = _this["x-attribsNamespace"]) === null || _a === void 0 ? void 0 : _a[name],
+                    prefix: (_b = _this["x-attribsPrefix"]) === null || _b === void 0 ? void 0 : _b[name],
+                });
+            });
+        },
+        enumerable: false,
+        configurable: true
+    });
+    return Element;
+}(NodeWithChildren));
+exports.Element = Element;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node is a `Element`, `false` otherwise.
+ */
+function isTag(node) {
+    return domelementtype_1.isTag(node);
+}
+exports.isTag = isTag;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node has the type `CDATA`, `false` otherwise.
+ */
+function isCDATA(node) {
+    return node.type === domelementtype_1.ElementType.CDATA;
+}
+exports.isCDATA = isCDATA;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node has the type `Text`, `false` otherwise.
+ */
+function isText(node) {
+    return node.type === domelementtype_1.ElementType.Text;
+}
+exports.isText = isText;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node has the type `Comment`, `false` otherwise.
+ */
+function isComment(node) {
+    return node.type === domelementtype_1.ElementType.Comment;
+}
+exports.isComment = isComment;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node has the type `ProcessingInstruction`, `false` otherwise.
+ */
+function isDirective(node) {
+    return node.type === domelementtype_1.ElementType.Directive;
+}
+exports.isDirective = isDirective;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node has the type `ProcessingInstruction`, `false` otherwise.
+ */
+function isDocument(node) {
+    return node.type === domelementtype_1.ElementType.Root;
+}
+exports.isDocument = isDocument;
+/**
+ * @param node Node to check.
+ * @returns `true` if the node is a `NodeWithChildren` (has children), `false` otherwise.
+ */
+function hasChildren(node) {
+    return Object.prototype.hasOwnProperty.call(node, "children");
+}
+exports.hasChildren = hasChildren;
+/**
+ * Clone a node, and optionally its children.
+ *
+ * @param recursive Clone child nodes as well.
+ * @returns A clone of the node.
+ */
+function cloneNode(node, recursive) {
+    if (recursive === void 0) { recursive = false; }
+    var result;
+    if (isText(node)) {
+        result = new Text(node.data);
+    }
+    else if (isComment(node)) {
+        result = new Comment(node.data);
+    }
+    else if (isTag(node)) {
+        var children = recursive ? cloneChildren(node.children) : [];
+        var clone_1 = new Element(node.name, __assign({}, node.attribs), children);
+        children.forEach(function (child) { return (child.parent = clone_1); });
+        if (node["x-attribsNamespace"]) {
+            clone_1["x-attribsNamespace"] = __assign({}, node["x-attribsNamespace"]);
+        }
+        if (node["x-attribsPrefix"]) {
+            clone_1["x-attribsPrefix"] = __assign({}, node["x-attribsPrefix"]);
+        }
+        result = clone_1;
+    }
+    else if (isCDATA(node)) {
+        var children = recursive ? cloneChildren(node.children) : [];
+        var clone_2 = new NodeWithChildren(domelementtype_1.ElementType.CDATA, children);
+        children.forEach(function (child) { return (child.parent = clone_2); });
+        result = clone_2;
+    }
+    else if (isDocument(node)) {
+        var children = recursive ? cloneChildren(node.children) : [];
+        var clone_3 = new Document(children);
+        children.forEach(function (child) { return (child.parent = clone_3); });
+        if (node["x-mode"]) {
+            clone_3["x-mode"] = node["x-mode"];
+        }
+        result = clone_3;
+    }
+    else if (isDirective(node)) {
+        var instruction = new ProcessingInstruction(node.name, node.data);
+        if (node["x-name"] != null) {
+            instruction["x-name"] = node["x-name"];
+            instruction["x-publicId"] = node["x-publicId"];
+            instruction["x-systemId"] = node["x-systemId"];
+        }
+        result = instruction;
+    }
+    else {
+        throw new Error("Not implemented yet: " + node.type);
+    }
+    result.startIndex = node.startIndex;
+    result.endIndex = node.endIndex;
+    return result;
+}
+exports.cloneNode = cloneNode;
+function cloneChildren(childs) {
+    var children = childs.map(function (child) { return cloneNode(child, true); });
+    for (var i = 1; i < children.length; i++) {
+        children[i].prev = children[i - 1];
+        children[i - 1].next = children[i];
+    }
+    return children;
+}
diff --git a/node_modules/css-select/node_modules/domhandler/package.json b/node_modules/css-select/node_modules/domhandler/package.json
new file mode 100644
index 0000000..a2ec002
--- /dev/null
+++ b/node_modules/css-select/node_modules/domhandler/package.json
@@ -0,0 +1,59 @@
+{
+  "name": "domhandler",
+  "version": "4.2.0",
+  "description": "Handler for htmlparser2 that turns pages into a dom",
+  "author": "Felix Boehm <me@feedic.com>",
+  "funding": {
+    "url": "https://github.com/fb55/domhandler?sponsor=1"
+  },
+  "license": "BSD-2-Clause",
+  "main": "lib/index.js",
+  "types": "lib/index.d.ts",
+  "sideEffects": false,
+  "files": [
+    "lib"
+  ],
+  "scripts": {
+    "test": "jest --coverage && npm run lint",
+    "coverage": "cat coverage/lcov.info | coveralls",
+    "lint": "eslint src",
+    "format": "prettier --write '**/*.{ts,md,json}'",
+    "build": "tsc",
+    "prepare": "npm run build"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/fb55/domhandler.git"
+  },
+  "keywords": [
+    "dom",
+    "htmlparser2"
+  ],
+  "engines": {
+    "node": ">= 4"
+  },
+  "dependencies": {
+    "domelementtype": "^2.2.0"
+  },
+  "devDependencies": {
+    "@types/jest": "^26.0.0",
+    "@types/node": "^14.0.9",
+    "@typescript-eslint/eslint-plugin": "^4.1.0",
+    "@typescript-eslint/parser": "^4.1.0",
+    "coveralls": "^3.0.5",
+    "eslint": "^7.9.0",
+    "eslint-config-prettier": "^8.1.0",
+    "htmlparser2": "^6.0.0",
+    "jest": "^26.0.1",
+    "prettier": "^2.0.5",
+    "ts-jest": "^26.1.0",
+    "typescript": "^4.0.2"
+  },
+  "jest": {
+    "preset": "ts-jest",
+    "testEnvironment": "node"
+  },
+  "prettier": {
+    "tabWidth": 4
+  }
+}
diff --git a/node_modules/css-select/node_modules/domhandler/readme.md b/node_modules/css-select/node_modules/domhandler/readme.md
new file mode 100644
index 0000000..781eb38
--- /dev/null
+++ b/node_modules/css-select/node_modules/domhandler/readme.md
@@ -0,0 +1,163 @@
+# domhandler [![Build Status](https://travis-ci.com/fb55/domhandler.svg?branch=master)](https://travis-ci.com/fb55/domhandler)
+
+The DOM handler creates a tree containing all nodes of a page.
+The tree can be manipulated using the [domutils](https://github.com/fb55/domutils)
+or [cheerio](https://github.com/cheeriojs/cheerio) libraries and
+rendered using [dom-serializer](https://github.com/cheeriojs/dom-serializer) .
+
+## Usage
+
+```javascript
+const handler = new DomHandler([ <func> callback(err, dom), ] [ <obj> options ]);
+// const parser = new Parser(handler[, options]);
+```
+
+Available options are described below.
+
+## Example
+
+```javascript
+const { Parser } = require("htmlparser2");
+const { DomHandler } = require("domhandler");
+const rawHtml =
+    "Xyz <script language= javascript>var foo = '<<bar>>';</script><!--<!-- Waah! -- -->";
+const handler = new DomHandler((error, dom) => {
+    if (error) {
+        // Handle error
+    } else {
+        // Parsing completed, do something
+        console.log(dom);
+    }
+});
+const parser = new Parser(handler);
+parser.write(rawHtml);
+parser.end();
+```
+
+Output:
+
+```javascript
+[
+    {
+        data: "Xyz ",
+        type: "text",
+    },
+    {
+        type: "script",
+        name: "script",
+        attribs: {
+            language: "javascript",
+        },
+        children: [
+            {
+                data: "var foo = '<bar>';<",
+                type: "text",
+            },
+        ],
+    },
+    {
+        data: "<!-- Waah! -- ",
+        type: "comment",
+    },
+];
+```
+
+## Option: `withStartIndices`
+
+Add a `startIndex` property to nodes.
+When the parser is used in a non-streaming fashion, `startIndex` is an integer
+indicating the position of the start of the node in the document.
+The default value is `false`.
+
+## Option: `withEndIndices`
+
+Add an `endIndex` property to nodes.
+When the parser is used in a non-streaming fashion, `endIndex` is an integer
+indicating the position of the end of the node in the document.
+The default value is `false`.
+
+## Option: `normalizeWhitespace` _(deprecated)_
+
+Replace all whitespace with single spaces.
+The default value is `false`.
+
+**Note:** Enabling this might break your markup.
+
+For the following examples, this HTML will be used:
+
+```html
+<font> <br />this is the text <font></font></font>
+```
+
+### Example: `normalizeWhitespace: true`
+
+```javascript
+[
+    {
+        type: "tag",
+        name: "font",
+        children: [
+            {
+                data: " ",
+                type: "text",
+            },
+            {
+                type: "tag",
+                name: "br",
+            },
+            {
+                data: "this is the text ",
+                type: "text",
+            },
+            {
+                type: "tag",
+                name: "font",
+            },
+        ],
+    },
+];
+```
+
+### Example: `normalizeWhitespace: false`
+
+```javascript
+[
+    {
+        type: "tag",
+        name: "font",
+        children: [
+            {
+                data: "\n\t",
+                type: "text",
+            },
+            {
+                type: "tag",
+                name: "br",
+            },
+            {
+                data: "this is the text\n",
+                type: "text",
+            },
+            {
+                type: "tag",
+                name: "font",
+            },
+        ],
+    },
+];
+```
+
+---
+
+License: BSD-2-Clause
+
+## Security contact information
+
+To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security).
+Tidelift will coordinate the fix and disclosure.
+
+## `domhandler` for enterprise
+
+Available as part of the Tidelift Subscription
+
+The maintainers of `domhandler` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-domhandler?utm_source=npm-domhandler&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
diff --git a/node_modules/css-select/node_modules/domutils/LICENSE b/node_modules/css-select/node_modules/domutils/LICENSE
new file mode 100644
index 0000000..c464f86
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/LICENSE
@@ -0,0 +1,11 @@
+Copyright (c) Felix Böhm
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/css-select/node_modules/domutils/lib/helpers.d.ts b/node_modules/css-select/node_modules/domutils/lib/helpers.d.ts
new file mode 100644
index 0000000..61b282f
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/helpers.d.ts
@@ -0,0 +1,51 @@
+import { Node } from "domhandler";
+/**
+ * Given an array of nodes, remove any member that is contained by another.
+ *
+ * @param nodes Nodes to filter.
+ * @returns Remaining nodes that aren't subtrees of each other.
+ */
+export declare function removeSubsets(nodes: Node[]): Node[];
+export declare const enum DocumentPosition {
+    DISCONNECTED = 1,
+    PRECEDING = 2,
+    FOLLOWING = 4,
+    CONTAINS = 8,
+    CONTAINED_BY = 16
+}
+/**
+ * Compare the position of one node against another node in any other document.
+ * The return value is a bitmask with the following values:
+ *
+ * Document order:
+ * > There is an ordering, document order, defined on all the nodes in the
+ * > document corresponding to the order in which the first character of the
+ * > XML representation of each node occurs in the XML representation of the
+ * > document after expansion of general entities. Thus, the document element
+ * > node will be the first node. Element nodes occur before their children.
+ * > Thus, document order orders element nodes in order of the occurrence of
+ * > their start-tag in the XML (after expansion of entities). The attribute
+ * > nodes of an element occur after the element and before its children. The
+ * > relative order of attribute nodes is implementation-dependent./
+ *
+ * Source:
+ * http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order
+ *
+ * @param nodeA The first node to use in the comparison
+ * @param nodeB The second node to use in the comparison
+ * @returns A bitmask describing the input nodes' relative position.
+ *
+ * See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for
+ * a description of these values.
+ */
+export declare function compareDocumentPosition(nodeA: Node, nodeB: Node): number;
+/**
+ * Sort an array of nodes based on their relative position in the document and
+ * remove any duplicate nodes. If the array contains nodes that do not belong
+ * to the same document, sort order is unspecified.
+ *
+ * @param nodes Array of DOM nodes.
+ * @returns Collection of unique nodes, sorted in document order.
+ */
+export declare function uniqueSort<T extends Node>(nodes: T[]): T[];
+//# sourceMappingURL=helpers.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domutils/lib/helpers.d.ts.map b/node_modules/css-select/node_modules/domutils/lib/helpers.d.ts.map
new file mode 100644
index 0000000..3c0b410
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/helpers.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,IAAI,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CA6BnD;AAGD,0BAAkB,gBAAgB;IAC9B,YAAY,IAAI;IAChB,SAAS,IAAI;IACb,SAAS,IAAI;IACb,QAAQ,IAAI;IACZ,YAAY,KAAK;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM,CA4CxE;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAc1D"}
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domutils/lib/helpers.js b/node_modules/css-select/node_modules/domutils/lib/helpers.js
new file mode 100644
index 0000000..a522766
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/helpers.js
@@ -0,0 +1,125 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.uniqueSort = exports.compareDocumentPosition = exports.removeSubsets = void 0;
+var domhandler_1 = require("domhandler");
+/**
+ * Given an array of nodes, remove any member that is contained by another.
+ *
+ * @param nodes Nodes to filter.
+ * @returns Remaining nodes that aren't subtrees of each other.
+ */
+function removeSubsets(nodes) {
+    var idx = nodes.length;
+    /*
+     * Check if each node (or one of its ancestors) is already contained in the
+     * array.
+     */
+    while (--idx >= 0) {
+        var node = nodes[idx];
+        /*
+         * Remove the node if it is not unique.
+         * We are going through the array from the end, so we only
+         * have to check nodes that preceed the node under consideration in the array.
+         */
+        if (idx > 0 && nodes.lastIndexOf(node, idx - 1) >= 0) {
+            nodes.splice(idx, 1);
+            continue;
+        }
+        for (var ancestor = node.parent; ancestor; ancestor = ancestor.parent) {
+            if (nodes.includes(ancestor)) {
+                nodes.splice(idx, 1);
+                break;
+            }
+        }
+    }
+    return nodes;
+}
+exports.removeSubsets = removeSubsets;
+/**
+ * Compare the position of one node against another node in any other document.
+ * The return value is a bitmask with the following values:
+ *
+ * Document order:
+ * > There is an ordering, document order, defined on all the nodes in the
+ * > document corresponding to the order in which the first character of the
+ * > XML representation of each node occurs in the XML representation of the
+ * > document after expansion of general entities. Thus, the document element
+ * > node will be the first node. Element nodes occur before their children.
+ * > Thus, document order orders element nodes in order of the occurrence of
+ * > their start-tag in the XML (after expansion of entities). The attribute
+ * > nodes of an element occur after the element and before its children. The
+ * > relative order of attribute nodes is implementation-dependent./
+ *
+ * Source:
+ * http://www.w3.org/TR/DOM-Level-3-Core/glossary.html#dt-document-order
+ *
+ * @param nodeA The first node to use in the comparison
+ * @param nodeB The second node to use in the comparison
+ * @returns A bitmask describing the input nodes' relative position.
+ *
+ * See http://dom.spec.whatwg.org/#dom-node-comparedocumentposition for
+ * a description of these values.
+ */
+function compareDocumentPosition(nodeA, nodeB) {
+    var aParents = [];
+    var bParents = [];
+    if (nodeA === nodeB) {
+        return 0;
+    }
+    var current = domhandler_1.hasChildren(nodeA) ? nodeA : nodeA.parent;
+    while (current) {
+        aParents.unshift(current);
+        current = current.parent;
+    }
+    current = domhandler_1.hasChildren(nodeB) ? nodeB : nodeB.parent;
+    while (current) {
+        bParents.unshift(current);
+        current = current.parent;
+    }
+    var maxIdx = Math.min(aParents.length, bParents.length);
+    var idx = 0;
+    while (idx < maxIdx && aParents[idx] === bParents[idx]) {
+        idx++;
+    }
+    if (idx === 0) {
+        return 1 /* DISCONNECTED */;
+    }
+    var sharedParent = aParents[idx - 1];
+    var siblings = sharedParent.children;
+    var aSibling = aParents[idx];
+    var bSibling = bParents[idx];
+    if (siblings.indexOf(aSibling) > siblings.indexOf(bSibling)) {
+        if (sharedParent === nodeB) {
+            return 4 /* FOLLOWING */ | 16 /* CONTAINED_BY */;
+        }
+        return 4 /* FOLLOWING */;
+    }
+    if (sharedParent === nodeA) {
+        return 2 /* PRECEDING */ | 8 /* CONTAINS */;
+    }
+    return 2 /* PRECEDING */;
+}
+exports.compareDocumentPosition = compareDocumentPosition;
+/**
+ * Sort an array of nodes based on their relative position in the document and
+ * remove any duplicate nodes. If the array contains nodes that do not belong
+ * to the same document, sort order is unspecified.
+ *
+ * @param nodes Array of DOM nodes.
+ * @returns Collection of unique nodes, sorted in document order.
+ */
+function uniqueSort(nodes) {
+    nodes = nodes.filter(function (node, i, arr) { return !arr.includes(node, i + 1); });
+    nodes.sort(function (a, b) {
+        var relative = compareDocumentPosition(a, b);
+        if (relative & 2 /* PRECEDING */) {
+            return -1;
+        }
+        else if (relative & 4 /* FOLLOWING */) {
+            return 1;
+        }
+        return 0;
+    });
+    return nodes;
+}
+exports.uniqueSort = uniqueSort;
diff --git a/node_modules/css-select/node_modules/domutils/lib/index.d.ts b/node_modules/css-select/node_modules/domutils/lib/index.d.ts
new file mode 100644
index 0000000..0423a58
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/index.d.ts
@@ -0,0 +1,8 @@
+export * from "./stringify";
+export * from "./traversal";
+export * from "./manipulation";
+export * from "./querying";
+export * from "./legacy";
+export * from "./helpers";
+export { isTag, isCDATA, isText, isComment, isDocument, hasChildren, } from "domhandler";
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domutils/lib/index.d.ts.map b/node_modules/css-select/node_modules/domutils/lib/index.d.ts.map
new file mode 100644
index 0000000..8f4f83f
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,OAAO,EACH,KAAK,EACL,OAAO,EACP,MAAM,EACN,SAAS,EACT,UAAU,EACV,WAAW,GACd,MAAM,YAAY,CAAC"}
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domutils/lib/index.js b/node_modules/css-select/node_modules/domutils/lib/index.js
new file mode 100644
index 0000000..883af21
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/index.js
@@ -0,0 +1,26 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.hasChildren = exports.isDocument = exports.isComment = exports.isText = exports.isCDATA = exports.isTag = void 0;
+__exportStar(require("./stringify"), exports);
+__exportStar(require("./traversal"), exports);
+__exportStar(require("./manipulation"), exports);
+__exportStar(require("./querying"), exports);
+__exportStar(require("./legacy"), exports);
+__exportStar(require("./helpers"), exports);
+var domhandler_1 = require("domhandler");
+Object.defineProperty(exports, "isTag", { enumerable: true, get: function () { return domhandler_1.isTag; } });
+Object.defineProperty(exports, "isCDATA", { enumerable: true, get: function () { return domhandler_1.isCDATA; } });
+Object.defineProperty(exports, "isText", { enumerable: true, get: function () { return domhandler_1.isText; } });
+Object.defineProperty(exports, "isComment", { enumerable: true, get: function () { return domhandler_1.isComment; } });
+Object.defineProperty(exports, "isDocument", { enumerable: true, get: function () { return domhandler_1.isDocument; } });
+Object.defineProperty(exports, "hasChildren", { enumerable: true, get: function () { return domhandler_1.hasChildren; } });
diff --git a/node_modules/css-select/node_modules/domutils/lib/legacy.d.ts b/node_modules/css-select/node_modules/domutils/lib/legacy.d.ts
new file mode 100644
index 0000000..acbc6be
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/legacy.d.ts
@@ -0,0 +1,48 @@
+import { ElementType } from "domelementtype";
+import { Element , Node} from "domhandler";
+
+interface TestElementOpts {
+    tag_name?: string | ((name: string) => boolean);
+    tag_type?: string | ((name: string) => boolean);
+    tag_contains?: string | ((data?: string) => boolean);
+    [attributeName: string]: undefined | string | ((attributeValue: string) => boolean);
+}
+/**
+ * @param options An object describing nodes to look for.
+ * @param node The element to test.
+ * @returns Whether the element matches the description in `options`.
+ */
+export declare function testElement(options: TestElementOpts, node: Node): boolean;
+/**
+ * @param options An object describing nodes to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes that match `options`.
+ */
+export declare function getElements(options: TestElementOpts, nodes: Node | Node[], recurse: boolean, limit?: number): Node[];
+/**
+ * @param id The unique ID attribute value to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @returns The node with the supplied ID.
+ */
+export declare function getElementById(id: string | ((id: string) => boolean), nodes: Node | Node[], recurse?: boolean): Element | null;
+/**
+ * @param tagName Tag name to search for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes with the supplied `tagName`.
+ */
+export declare function getElementsByTagName(tagName: string | ((name: string) => boolean), nodes: Node | Node[], recurse?: boolean, limit?: number): Element[];
+/**
+ * @param type Element type to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes with the supplied `type`.
+ */
+export declare function getElementsByTagType(type: ElementType | ((type: ElementType) => boolean), nodes: Node | Node[], recurse?: boolean, limit?: number): Node[];
+export {};
+//# sourceMappingURL=legacy.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domutils/lib/legacy.d.ts.map b/node_modules/css-select/node_modules/domutils/lib/legacy.d.ts.map
new file mode 100644
index 0000000..9f0d3ce
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/legacy.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../src/legacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAK7C,UAAU,eAAe;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IAChD,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IACrD,CAAC,aAAa,EAAE,MAAM,GAChB,SAAS,GACT,MAAM,GACN,CAAC,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;CAC/C;AAsED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAGzE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACvB,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,EACpB,OAAO,EAAE,OAAO,EAChB,KAAK,SAAW,GACjB,IAAI,EAAE,CAGR;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC1B,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,EACtC,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,EACpB,OAAO,UAAO,GACf,OAAO,GAAG,IAAI,CAGhB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAChC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,EAC7C,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,EACpB,OAAO,UAAO,EACd,KAAK,SAAW,GACjB,OAAO,EAAE,CAEX;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,WAAW,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,EACpD,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,EACpB,OAAO,UAAO,EACd,KAAK,SAAW,GACjB,IAAI,EAAE,CAER"}
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domutils/lib/legacy.js b/node_modules/css-select/node_modules/domutils/lib/legacy.js
new file mode 100644
index 0000000..10d62ab
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/legacy.js
@@ -0,0 +1,124 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getElementsByTagType = exports.getElementsByTagName = exports.getElementById = exports.getElements = exports.testElement = void 0;
+var domhandler_1 = require("domhandler");
+var querying_1 = require("./querying");
+var Checks = {
+    tag_name: function (name) {
+        if (typeof name === "function") {
+            return function (elem) { return domhandler_1.isTag(elem) && name(elem.name); };
+        }
+        else if (name === "*") {
+            return domhandler_1.isTag;
+        }
+        return function (elem) { return domhandler_1.isTag(elem) && elem.name === name; };
+    },
+    tag_type: function (type) {
+        if (typeof type === "function") {
+            return function (elem) { return type(elem.type); };
+        }
+        return function (elem) { return elem.type === type; };
+    },
+    tag_contains: function (data) {
+        if (typeof data === "function") {
+            return function (elem) { return domhandler_1.isText(elem) && data(elem.data); };
+        }
+        return function (elem) { return domhandler_1.isText(elem) && elem.data === data; };
+    },
+};
+/**
+ * @param attrib Attribute to check.
+ * @param value Attribute value to look for.
+ * @returns A function to check whether the a node has an attribute with a particular value.
+ */
+function getAttribCheck(attrib, value) {
+    if (typeof value === "function") {
+        return function (elem) { return domhandler_1.isTag(elem) && value(elem.attribs[attrib]); };
+    }
+    return function (elem) { return domhandler_1.isTag(elem) && elem.attribs[attrib] === value; };
+}
+/**
+ * @param a First function to combine.
+ * @param b Second function to combine.
+ * @returns A function taking a node and returning `true` if either
+ * of the input functions returns `true` for the node.
+ */
+function combineFuncs(a, b) {
+    return function (elem) { return a(elem) || b(elem); };
+}
+/**
+ * @param options An object describing nodes to look for.
+ * @returns A function executing all checks in `options` and returning `true`
+ * if any of them match a node.
+ */
+function compileTest(options) {
+    var funcs = Object.keys(options).map(function (key) {
+        var value = options[key];
+        return key in Checks
+            ? Checks[key](value)
+            : getAttribCheck(key, value);
+    });
+    return funcs.length === 0 ? null : funcs.reduce(combineFuncs);
+}
+/**
+ * @param options An object describing nodes to look for.
+ * @param node The element to test.
+ * @returns Whether the element matches the description in `options`.
+ */
+function testElement(options, node) {
+    var test = compileTest(options);
+    return test ? test(node) : true;
+}
+exports.testElement = testElement;
+/**
+ * @param options An object describing nodes to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes that match `options`.
+ */
+function getElements(options, nodes, recurse, limit) {
+    if (limit === void 0) { limit = Infinity; }
+    var test = compileTest(options);
+    return test ? querying_1.filter(test, nodes, recurse, limit) : [];
+}
+exports.getElements = getElements;
+/**
+ * @param id The unique ID attribute value to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @returns The node with the supplied ID.
+ */
+function getElementById(id, nodes, recurse) {
+    if (recurse === void 0) { recurse = true; }
+    if (!Array.isArray(nodes))
+        nodes = [nodes];
+    return querying_1.findOne(getAttribCheck("id", id), nodes, recurse);
+}
+exports.getElementById = getElementById;
+/**
+ * @param tagName Tag name to search for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes with the supplied `tagName`.
+ */
+function getElementsByTagName(tagName, nodes, recurse, limit) {
+    if (recurse === void 0) { recurse = true; }
+    if (limit === void 0) { limit = Infinity; }
+    return querying_1.filter(Checks.tag_name(tagName), nodes, recurse, limit);
+}
+exports.getElementsByTagName = getElementsByTagName;
+/**
+ * @param type Element type to look for.
+ * @param nodes Nodes to search through.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes with the supplied `type`.
+ */
+function getElementsByTagType(type, nodes, recurse, limit) {
+    if (recurse === void 0) { recurse = true; }
+    if (limit === void 0) { limit = Infinity; }
+    return querying_1.filter(Checks.tag_type(type), nodes, recurse, limit);
+}
+exports.getElementsByTagType = getElementsByTagType;
diff --git a/node_modules/css-select/node_modules/domutils/lib/manipulation.d.ts b/node_modules/css-select/node_modules/domutils/lib/manipulation.d.ts
new file mode 100644
index 0000000..0950619
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/manipulation.d.ts
@@ -0,0 +1,43 @@
+import type { Node, Element } from "domhandler";
+/**
+ * Remove an element from the dom
+ *
+ * @param elem The element to be removed
+ */
+export declare function removeElement(elem: Node): void;
+/**
+ * Replace an element in the dom
+ *
+ * @param elem The element to be replaced
+ * @param replacement The element to be added
+ */
+export declare function replaceElement(elem: Node, replacement: Node): void;
+/**
+ * Append a child to an element.
+ *
+ * @param elem The element to append to.
+ * @param child The element to be added as a child.
+ */
+export declare function appendChild(elem: Element, child: Node): void;
+/**
+ * Append an element after another.
+ *
+ * @param elem The element to append after.
+ * @param next The element be added.
+ */
+export declare function append(elem: Node, next: Node): void;
+/**
+ * Prepend a child to an element.
+ *
+ * @param elem The element to prepend before.
+ * @param child The element to be added as a child.
+ */
+export declare function prependChild(elem: Element, child: Node): void;
+/**
+ * Prepend an element before another.
+ *
+ * @param elem The element to prepend before.
+ * @param prev The element be added.
+ */
+export declare function prepend(elem: Node, prev: Node): void;
+//# sourceMappingURL=manipulation.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domutils/lib/manipulation.d.ts.map b/node_modules/css-select/node_modules/domutils/lib/manipulation.d.ts.map
new file mode 100644
index 0000000..a302120
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/manipulation.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"manipulation.d.ts","sourceRoot":"","sources":["../src/manipulation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAQ9C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,GAAG,IAAI,CAgBlE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI,CAa5D;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAoBnD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI,CAa7D;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAiBpD"}
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domutils/lib/manipulation.js b/node_modules/css-select/node_modules/domutils/lib/manipulation.js
new file mode 100644
index 0000000..f7c77ef
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/manipulation.js
@@ -0,0 +1,129 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.prepend = exports.prependChild = exports.append = exports.appendChild = exports.replaceElement = exports.removeElement = void 0;
+/**
+ * Remove an element from the dom
+ *
+ * @param elem The element to be removed
+ */
+function removeElement(elem) {
+    if (elem.prev)
+        elem.prev.next = elem.next;
+    if (elem.next)
+        elem.next.prev = elem.prev;
+    if (elem.parent) {
+        var childs = elem.parent.children;
+        childs.splice(childs.lastIndexOf(elem), 1);
+    }
+}
+exports.removeElement = removeElement;
+/**
+ * Replace an element in the dom
+ *
+ * @param elem The element to be replaced
+ * @param replacement The element to be added
+ */
+function replaceElement(elem, replacement) {
+    var prev = (replacement.prev = elem.prev);
+    if (prev) {
+        prev.next = replacement;
+    }
+    var next = (replacement.next = elem.next);
+    if (next) {
+        next.prev = replacement;
+    }
+    var parent = (replacement.parent = elem.parent);
+    if (parent) {
+        var childs = parent.children;
+        childs[childs.lastIndexOf(elem)] = replacement;
+    }
+}
+exports.replaceElement = replaceElement;
+/**
+ * Append a child to an element.
+ *
+ * @param elem The element to append to.
+ * @param child The element to be added as a child.
+ */
+function appendChild(elem, child) {
+    removeElement(child);
+    child.next = null;
+    child.parent = elem;
+    if (elem.children.push(child) > 1) {
+        var sibling = elem.children[elem.children.length - 2];
+        sibling.next = child;
+        child.prev = sibling;
+    }
+    else {
+        child.prev = null;
+    }
+}
+exports.appendChild = appendChild;
+/**
+ * Append an element after another.
+ *
+ * @param elem The element to append after.
+ * @param next The element be added.
+ */
+function append(elem, next) {
+    removeElement(next);
+    var parent = elem.parent;
+    var currNext = elem.next;
+    next.next = currNext;
+    next.prev = elem;
+    elem.next = next;
+    next.parent = parent;
+    if (currNext) {
+        currNext.prev = next;
+        if (parent) {
+            var childs = parent.children;
+            childs.splice(childs.lastIndexOf(currNext), 0, next);
+        }
+    }
+    else if (parent) {
+        parent.children.push(next);
+    }
+}
+exports.append = append;
+/**
+ * Prepend a child to an element.
+ *
+ * @param elem The element to prepend before.
+ * @param child The element to be added as a child.
+ */
+function prependChild(elem, child) {
+    removeElement(child);
+    child.parent = elem;
+    child.prev = null;
+    if (elem.children.unshift(child) !== 1) {
+        var sibling = elem.children[1];
+        sibling.prev = child;
+        child.next = sibling;
+    }
+    else {
+        child.next = null;
+    }
+}
+exports.prependChild = prependChild;
+/**
+ * Prepend an element before another.
+ *
+ * @param elem The element to prepend before.
+ * @param prev The element be added.
+ */
+function prepend(elem, prev) {
+    removeElement(prev);
+    var parent = elem.parent;
+    if (parent) {
+        var childs = parent.children;
+        childs.splice(childs.indexOf(elem), 0, prev);
+    }
+    if (elem.prev) {
+        elem.prev.next = prev;
+    }
+    prev.parent = parent;
+    prev.prev = elem.prev;
+    prev.next = elem;
+    elem.prev = prev;
+}
+exports.prepend = prepend;
diff --git a/node_modules/css-select/node_modules/domutils/lib/querying.d.ts b/node_modules/css-select/node_modules/domutils/lib/querying.d.ts
new file mode 100644
index 0000000..a633c32
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/querying.d.ts
@@ -0,0 +1,56 @@
+import { Element , Node} from "domhandler";
+
+/**
+ * Search a node and its children for nodes passing a test function.
+ *
+ * @param test Function to test nodes on.
+ * @param node Node to search. Will be included in the result set if it matches.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes passing `test`.
+ */
+export declare function filter(test: (elem: Node) => boolean, node: Node | Node[], recurse?: boolean, limit?: number): Node[];
+/**
+ * Search an array of node and its children for nodes passing a test function.
+ *
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes passing `test`.
+ */
+export declare function find(test: (elem: Node) => boolean, nodes: Node[], recurse: boolean, limit: number): Node[];
+/**
+ * Finds the first element inside of an array that matches a test function.
+ *
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns The first node in the array that passes `test`.
+ */
+export declare function findOneChild(test: (elem: Node) => boolean, nodes: Node[]): Node | undefined;
+/**
+ * Finds one element in a tree that passes a test.
+ *
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @param recurse Also consider child nodes.
+ * @returns The first child node that passes `test`.
+ */
+export declare function findOne(test: (elem: Element) => boolean, nodes: Node[], recurse?: boolean): Element | null;
+/**
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns Whether a tree of nodes contains at least one node passing a test.
+ */
+export declare function existsOne(test: (elem: Element) => boolean, nodes: Node[]): boolean;
+/**
+ * Search and array of nodes and its children for nodes passing a test function.
+ *
+ * Same as `find`, only with less options, leading to reduced complexity.
+ *
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns All nodes passing `test`.
+ */
+export declare function findAll(test: (elem: Element) => boolean, nodes: Node[]): Element[];
+//# sourceMappingURL=querying.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domutils/lib/querying.d.ts.map b/node_modules/css-select/node_modules/domutils/lib/querying.d.ts.map
new file mode 100644
index 0000000..983fd51
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/querying.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"querying.d.ts","sourceRoot":"","sources":["../src/querying.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE/D;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAClB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,EAC7B,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,EACnB,OAAO,UAAO,EACd,KAAK,SAAW,GACjB,IAAI,EAAE,CAGR;AAED;;;;;;;;GAQG;AACH,wBAAgB,IAAI,CAChB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,EAC7B,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,GACd,IAAI,EAAE,CAkBR;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CACxB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,EAC7B,KAAK,EAAE,IAAI,EAAE,GACd,IAAI,GAAG,SAAS,CAElB;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACnB,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,EAChC,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,UAAO,GACf,OAAO,GAAG,IAAI,CAehB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACrB,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,EAChC,KAAK,EAAE,IAAI,EAAE,GACd,OAAO,CAQT;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CACnB,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,EAChC,KAAK,EAAE,IAAI,EAAE,GACd,OAAO,EAAE,CAYX"}
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domutils/lib/querying.js b/node_modules/css-select/node_modules/domutils/lib/querying.js
new file mode 100644
index 0000000..8a193e8
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/querying.js
@@ -0,0 +1,126 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.findAll = exports.existsOne = exports.findOne = exports.findOneChild = exports.find = exports.filter = void 0;
+var domhandler_1 = require("domhandler");
+/**
+ * Search a node and its children for nodes passing a test function.
+ *
+ * @param test Function to test nodes on.
+ * @param node Node to search. Will be included in the result set if it matches.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes passing `test`.
+ */
+function filter(test, node, recurse, limit) {
+    if (recurse === void 0) { recurse = true; }
+    if (limit === void 0) { limit = Infinity; }
+    if (!Array.isArray(node))
+        node = [node];
+    return find(test, node, recurse, limit);
+}
+exports.filter = filter;
+/**
+ * Search an array of node and its children for nodes passing a test function.
+ *
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @param recurse Also consider child nodes.
+ * @param limit Maximum number of nodes to return.
+ * @returns All nodes passing `test`.
+ */
+function find(test, nodes, recurse, limit) {
+    var result = [];
+    for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
+        var elem = nodes_1[_i];
+        if (test(elem)) {
+            result.push(elem);
+            if (--limit <= 0)
+                break;
+        }
+        if (recurse && domhandler_1.hasChildren(elem) && elem.children.length > 0) {
+            var children = find(test, elem.children, recurse, limit);
+            result.push.apply(result, children);
+            limit -= children.length;
+            if (limit <= 0)
+                break;
+        }
+    }
+    return result;
+}
+exports.find = find;
+/**
+ * Finds the first element inside of an array that matches a test function.
+ *
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns The first node in the array that passes `test`.
+ */
+function findOneChild(test, nodes) {
+    return nodes.find(test);
+}
+exports.findOneChild = findOneChild;
+/**
+ * Finds one element in a tree that passes a test.
+ *
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @param recurse Also consider child nodes.
+ * @returns The first child node that passes `test`.
+ */
+function findOne(test, nodes, recurse) {
+    if (recurse === void 0) { recurse = true; }
+    var elem = null;
+    for (var i = 0; i < nodes.length && !elem; i++) {
+        var checked = nodes[i];
+        if (!domhandler_1.isTag(checked)) {
+            continue;
+        }
+        else if (test(checked)) {
+            elem = checked;
+        }
+        else if (recurse && checked.children.length > 0) {
+            elem = findOne(test, checked.children);
+        }
+    }
+    return elem;
+}
+exports.findOne = findOne;
+/**
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns Whether a tree of nodes contains at least one node passing a test.
+ */
+function existsOne(test, nodes) {
+    return nodes.some(function (checked) {
+        return domhandler_1.isTag(checked) &&
+            (test(checked) ||
+                (checked.children.length > 0 &&
+                    existsOne(test, checked.children)));
+    });
+}
+exports.existsOne = existsOne;
+/**
+ * Search and array of nodes and its children for nodes passing a test function.
+ *
+ * Same as `find`, only with less options, leading to reduced complexity.
+ *
+ * @param test Function to test nodes on.
+ * @param nodes Array of nodes to search.
+ * @returns All nodes passing `test`.
+ */
+function findAll(test, nodes) {
+    var _a;
+    var result = [];
+    var stack = nodes.filter(domhandler_1.isTag);
+    var elem;
+    while ((elem = stack.shift())) {
+        var children = (_a = elem.children) === null || _a === void 0 ? void 0 : _a.filter(domhandler_1.isTag);
+        if (children && children.length > 0) {
+            stack.unshift.apply(stack, children);
+        }
+        if (test(elem))
+            result.push(elem);
+    }
+    return result;
+}
+exports.findAll = findAll;
diff --git a/node_modules/css-select/node_modules/domutils/lib/stringify.d.ts b/node_modules/css-select/node_modules/domutils/lib/stringify.d.ts
new file mode 100644
index 0000000..28c4296
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/stringify.d.ts
@@ -0,0 +1,25 @@
+import { DomSerializerOptions } from "dom-serializer";
+import { Node } from "domhandler";
+
+/**
+ * @param node Node to get the outer HTML of.
+ * @param options Options for serialization.
+ * @deprecated Use the `dom-serializer` module directly.
+ * @returns `node`'s outer HTML.
+ */
+export declare function getOuterHTML(node: Node | Node[], options?: DomSerializerOptions): string;
+/**
+ * @param node Node to get the inner HTML of.
+ * @param options Options for serialization.
+ * @deprecated Use the `dom-serializer` module directly.
+ * @returns `node`'s inner HTML.
+ */
+export declare function getInnerHTML(node: Node, options?: DomSerializerOptions): string;
+/**
+ * Get a node's inner text.
+ *
+ * @param node Node to get the inner text of.
+ * @returns `node`'s inner text.
+ */
+export declare function getText(node: Node | Node[]): string;
+//# sourceMappingURL=stringify.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domutils/lib/stringify.d.ts.map b/node_modules/css-select/node_modules/domutils/lib/stringify.d.ts.map
new file mode 100644
index 0000000..bf39478
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/stringify.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"stringify.d.ts","sourceRoot":"","sources":["../src/stringify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,IAAI,EAAE,MAAM,YAAY,CAAC;AACvE,OAAmB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAElE;;;;;GAKG;AACH,wBAAgB,YAAY,CACxB,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,EACnB,OAAO,CAAC,EAAE,oBAAoB,GAC/B,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CACxB,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,oBAAoB,GAC/B,MAAM,CAIR;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,MAAM,CAMnD"}
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domutils/lib/stringify.js b/node_modules/css-select/node_modules/domutils/lib/stringify.js
new file mode 100644
index 0000000..d5a89b5
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/stringify.js
@@ -0,0 +1,48 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getText = exports.getInnerHTML = exports.getOuterHTML = void 0;
+var domhandler_1 = require("domhandler");
+var dom_serializer_1 = __importDefault(require("dom-serializer"));
+/**
+ * @param node Node to get the outer HTML of.
+ * @param options Options for serialization.
+ * @deprecated Use the `dom-serializer` module directly.
+ * @returns `node`'s outer HTML.
+ */
+function getOuterHTML(node, options) {
+    return dom_serializer_1.default(node, options);
+}
+exports.getOuterHTML = getOuterHTML;
+/**
+ * @param node Node to get the inner HTML of.
+ * @param options Options for serialization.
+ * @deprecated Use the `dom-serializer` module directly.
+ * @returns `node`'s inner HTML.
+ */
+function getInnerHTML(node, options) {
+    return domhandler_1.hasChildren(node)
+        ? node.children.map(function (node) { return getOuterHTML(node, options); }).join("")
+        : "";
+}
+exports.getInnerHTML = getInnerHTML;
+/**
+ * Get a node's inner text.
+ *
+ * @param node Node to get the inner text of.
+ * @returns `node`'s inner text.
+ */
+function getText(node) {
+    if (Array.isArray(node))
+        return node.map(getText).join("");
+    if (domhandler_1.isTag(node))
+        return node.name === "br" ? "\n" : getText(node.children);
+    if (domhandler_1.isCDATA(node))
+        return getText(node.children);
+    if (domhandler_1.isText(node))
+        return node.data;
+    return "";
+}
+exports.getText = getText;
diff --git a/node_modules/css-select/node_modules/domutils/lib/traversal.d.ts b/node_modules/css-select/node_modules/domutils/lib/traversal.d.ts
new file mode 100644
index 0000000..d6aab83
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/traversal.d.ts
@@ -0,0 +1,60 @@
+import { Element, Node, NodeWithChildren } from "domhandler";
+
+/**
+ * Get a node's children.
+ *
+ * @param elem Node to get the children of.
+ * @returns `elem`'s children, or an empty array.
+ */
+export declare function getChildren(elem: Node): Node[];
+export declare function getParent(elem: Element): Element | null;
+export declare function getParent(elem: Node): NodeWithChildren | null;
+/**
+ * Gets an elements siblings, including the element itself.
+ *
+ * Attempts to get the children through the element's parent first.
+ * If we don't have a parent (the element is a root node),
+ * we walk the element's `prev` & `next` to get all remaining nodes.
+ *
+ * @param elem Element to get the siblings of.
+ * @returns `elem`'s siblings.
+ */
+export declare function getSiblings(elem: Node): Node[];
+/**
+ * Gets an attribute from an element.
+ *
+ * @param elem Element to check.
+ * @param name Attribute name to retrieve.
+ * @returns The element's attribute value, or `undefined`.
+ */
+export declare function getAttributeValue(elem: Element, name: string): string | undefined;
+/**
+ * Checks whether an element has an attribute.
+ *
+ * @param elem Element to check.
+ * @param name Attribute name to look for.
+ * @returns Returns whether `elem` has the attribute `name`.
+ */
+export declare function hasAttrib(elem: Element, name: string): boolean;
+/**
+ * Get the tag name of an element.
+ *
+ * @param elem The element to get the name for.
+ * @returns The tag name of `elem`.
+ */
+export declare function getName(elem: Element): string;
+/**
+ * Returns the next element sibling of a node.
+ *
+ * @param elem The element to get the next sibling of.
+ * @returns `elem`'s next sibling that is a tag.
+ */
+export declare function nextElementSibling(elem: Node): Element | null;
+/**
+ * Returns the previous element sibling of a node.
+ *
+ * @param elem The element to get the previous sibling of.
+ * @returns `elem`'s previous sibling that is a tag.
+ */
+export declare function prevElementSibling(elem: Node): Element | null;
+//# sourceMappingURL=traversal.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domutils/lib/traversal.d.ts.map b/node_modules/css-select/node_modules/domutils/lib/traversal.d.ts.map
new file mode 100644
index 0000000..0309d33
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/traversal.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"traversal.d.ts","sourceRoot":"","sources":["../src/traversal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGpE;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,CAE9C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;AACzD,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,gBAAgB,GAAG,IAAI,CAAC;AAW/D;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,CAe9C;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,MAAM,GACb,MAAM,GAAG,SAAS,CAEpB;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAM9D;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE7C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,IAAI,CAI7D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,IAAI,CAI7D"}
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/domutils/lib/traversal.js b/node_modules/css-select/node_modules/domutils/lib/traversal.js
new file mode 100644
index 0000000..5975ee8
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/lib/traversal.js
@@ -0,0 +1,117 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.prevElementSibling = exports.nextElementSibling = exports.getName = exports.hasAttrib = exports.getAttributeValue = exports.getSiblings = exports.getParent = exports.getChildren = void 0;
+var domhandler_1 = require("domhandler");
+var emptyArray = [];
+/**
+ * Get a node's children.
+ *
+ * @param elem Node to get the children of.
+ * @returns `elem`'s children, or an empty array.
+ */
+function getChildren(elem) {
+    var _a;
+    return (_a = elem.children) !== null && _a !== void 0 ? _a : emptyArray;
+}
+exports.getChildren = getChildren;
+/**
+ * Get a node's parent.
+ *
+ * @param elem Node to get the parent of.
+ * @returns `elem`'s parent node.
+ */
+function getParent(elem) {
+    return elem.parent || null;
+}
+exports.getParent = getParent;
+/**
+ * Gets an elements siblings, including the element itself.
+ *
+ * Attempts to get the children through the element's parent first.
+ * If we don't have a parent (the element is a root node),
+ * we walk the element's `prev` & `next` to get all remaining nodes.
+ *
+ * @param elem Element to get the siblings of.
+ * @returns `elem`'s siblings.
+ */
+function getSiblings(elem) {
+    var _a, _b;
+    var parent = getParent(elem);
+    if (parent != null)
+        return getChildren(parent);
+    var siblings = [elem];
+    var prev = elem.prev, next = elem.next;
+    while (prev != null) {
+        siblings.unshift(prev);
+        (_a = prev, prev = _a.prev);
+    }
+    while (next != null) {
+        siblings.push(next);
+        (_b = next, next = _b.next);
+    }
+    return siblings;
+}
+exports.getSiblings = getSiblings;
+/**
+ * Gets an attribute from an element.
+ *
+ * @param elem Element to check.
+ * @param name Attribute name to retrieve.
+ * @returns The element's attribute value, or `undefined`.
+ */
+function getAttributeValue(elem, name) {
+    var _a;
+    return (_a = elem.attribs) === null || _a === void 0 ? void 0 : _a[name];
+}
+exports.getAttributeValue = getAttributeValue;
+/**
+ * Checks whether an element has an attribute.
+ *
+ * @param elem Element to check.
+ * @param name Attribute name to look for.
+ * @returns Returns whether `elem` has the attribute `name`.
+ */
+function hasAttrib(elem, name) {
+    return (elem.attribs != null &&
+        Object.prototype.hasOwnProperty.call(elem.attribs, name) &&
+        elem.attribs[name] != null);
+}
+exports.hasAttrib = hasAttrib;
+/**
+ * Get the tag name of an element.
+ *
+ * @param elem The element to get the name for.
+ * @returns The tag name of `elem`.
+ */
+function getName(elem) {
+    return elem.name;
+}
+exports.getName = getName;
+/**
+ * Returns the next element sibling of a node.
+ *
+ * @param elem The element to get the next sibling of.
+ * @returns `elem`'s next sibling that is a tag.
+ */
+function nextElementSibling(elem) {
+    var _a;
+    var next = elem.next;
+    while (next !== null && !domhandler_1.isTag(next))
+        (_a = next, next = _a.next);
+    return next;
+}
+exports.nextElementSibling = nextElementSibling;
+/**
+ * Returns the previous element sibling of a node.
+ *
+ * @param elem The element to get the previous sibling of.
+ * @returns `elem`'s previous sibling that is a tag.
+ */
+function prevElementSibling(elem) {
+    var _a;
+    var prev = elem.prev;
+    while (prev !== null && !domhandler_1.isTag(prev))
+        (_a = prev, prev = _a.prev);
+    return prev;
+}
+exports.prevElementSibling = prevElementSibling;
diff --git a/node_modules/css-select/node_modules/domutils/package.json b/node_modules/css-select/node_modules/domutils/package.json
new file mode 100644
index 0000000..6cbba0f
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/package.json
@@ -0,0 +1,66 @@
+{
+  "name": "domutils",
+  "version": "2.6.0",
+  "description": "Utilities for working with htmlparser2's dom",
+  "author": "Felix Boehm <me@feedic.com>",
+  "funding": {
+    "url": "https://github.com/fb55/domutils?sponsor=1"
+  },
+  "license": "BSD-2-Clause",
+  "sideEffects": false,
+  "main": "lib/index.js",
+  "types": "lib/index.d.ts",
+  "files": [
+    "lib/**/*"
+  ],
+  "scripts": {
+    "test": "jest --coverage && npm run lint",
+    "coverage": "cat coverage/lcov.info | coveralls",
+    "lint": "npm run lint:es && npm run lint:prettier",
+    "lint:es": "eslint --ignore-path .gitignore .",
+    "lint:prettier": "npm run prettier -- --check",
+    "format": "npm run format:es && npm run format:prettier",
+    "format:es": "npm run lint:es -- --fix",
+    "format:prettier": "npm run prettier -- --write",
+    "prettier": "prettier \"**/*.{ts,md,json,yml}\" --ignore-path .gitignore",
+    "build": "tsc",
+    "build:docs": "typedoc --hideGenerator --exclude \"**/*+(index|.spec).ts\" src",
+    "prepare": "npm run build"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/fb55/domutils.git"
+  },
+  "keywords": [
+    "dom",
+    "htmlparser2"
+  ],
+  "dependencies": {
+    "dom-serializer": "^1.0.1",
+    "domelementtype": "^2.2.0",
+    "domhandler": "^4.2.0"
+  },
+  "devDependencies": {
+    "@types/jest": "^26.0.0",
+    "@types/node": "^14.0.5",
+    "@typescript-eslint/eslint-plugin": "^4.1.0",
+    "@typescript-eslint/parser": "^4.1.0",
+    "coveralls": "^3.0.5",
+    "eslint": "^7.0.0",
+    "eslint-config-prettier": "^8.1.0",
+    "eslint-plugin-jsdoc": "^32.0.2",
+    "htmlparser2": "~6.1.0",
+    "jest": "^26.0.1",
+    "prettier": "^2.0.5",
+    "ts-jest": "^26.0.0",
+    "typedoc": "^0.20.5",
+    "typescript": "^4.0.2"
+  },
+  "jest": {
+    "preset": "ts-jest",
+    "testEnvironment": "node"
+  },
+  "prettier": {
+    "tabWidth": 4
+  }
+}
diff --git a/node_modules/css-select/node_modules/domutils/readme.md b/node_modules/css-select/node_modules/domutils/readme.md
new file mode 100644
index 0000000..95883b5
--- /dev/null
+++ b/node_modules/css-select/node_modules/domutils/readme.md
@@ -0,0 +1,31 @@
+# domutils [![Build Status](https://travis-ci.com/fb55/domutils.svg?branch=master)](https://travis-ci.com/fb55/domutils)
+
+Utilities for working with [htmlparser2](https://github.com/fb55/htmlparser2)'s DOM.
+
+All functions are exported as a single module. Look [through the docs](https://domutils.js.org/modules.html) to see what is available.
+
+## Ecosystem
+
+| Name                                                          | Description                                             |
+| ------------------------------------------------------------- | ------------------------------------------------------- |
+| [htmlparser2](https://github.com/fb55/htmlparser2)            | Fast & forgiving HTML/XML parser                        |
+| [domhandler](https://github.com/fb55/domhandler)              | Handler for htmlparser2 that turns documents into a DOM |
+| [domutils](https://github.com/fb55/domutils)                  | Utilities for working with domhandler's DOM             |
+| [css-select](https://github.com/fb55/css-select)              | CSS selector engine, compatible with domhandler's DOM   |
+| [cheerio](https://github.com/cheeriojs/cheerio)               | The jQuery API for domhandler's DOM                     |
+| [dom-serializer](https://github.com/cheeriojs/dom-serializer) | Serializer for domhandler's DOM                         |
+
+---
+
+License: BSD-2-Clause
+
+## Security contact information
+
+To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security).
+Tidelift will coordinate the fix and disclosure.
+
+## `domutils` for enterprise
+
+Available as part of the Tidelift Subscription
+
+The maintainers of `domutils` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-domutils?utm_source=npm-domutils&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
diff --git a/node_modules/css-select/node_modules/entities/LICENSE b/node_modules/css-select/node_modules/entities/LICENSE
new file mode 100644
index 0000000..c464f86
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/LICENSE
@@ -0,0 +1,11 @@
+Copyright (c) Felix Böhm
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/css-select/node_modules/entities/lib/decode.d.ts b/node_modules/css-select/node_modules/entities/lib/decode.d.ts
new file mode 100644
index 0000000..4d3df42
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/lib/decode.d.ts
@@ -0,0 +1,5 @@
+export declare const decodeXML: (str: string) => string;
+export declare const decodeHTMLStrict: (str: string) => string;
+export declare type MapType = Record<string, string>;
+export declare const decodeHTML: (str: string) => string;
+//# sourceMappingURL=decode.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/entities/lib/decode.d.ts.map b/node_modules/css-select/node_modules/entities/lib/decode.d.ts.map
new file mode 100644
index 0000000..ebcf133
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/lib/decode.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"decode.d.ts","sourceRoot":"","sources":["../src/decode.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,SAAS,QAOL,MAAM,WAP0B,CAAC;AAClD,eAAO,MAAM,gBAAgB,QAMZ,MAAM,WANoC,CAAC;AAE5D,oBAAY,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAS7C,eAAO,MAAM,UAAU,QAyBN,MAAM,WACnB,CAAC"}
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/entities/lib/decode.js b/node_modules/css-select/node_modules/entities/lib/decode.js
new file mode 100644
index 0000000..5f9c1f2
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/lib/decode.js
@@ -0,0 +1,53 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.decodeHTML = exports.decodeHTMLStrict = exports.decodeXML = void 0;
+var entities_json_1 = __importDefault(require("./maps/entities.json"));
+var legacy_json_1 = __importDefault(require("./maps/legacy.json"));
+var xml_json_1 = __importDefault(require("./maps/xml.json"));
+var decode_codepoint_1 = __importDefault(require("./decode_codepoint"));
+var strictEntityRe = /&(?:[a-zA-Z0-9]+|#[xX][\da-fA-F]+|#\d+);/g;
+exports.decodeXML = getStrictDecoder(xml_json_1.default);
+exports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);
+function getStrictDecoder(map) {
+    var replace = getReplacer(map);
+    return function (str) { return String(str).replace(strictEntityRe, replace); };
+}
+var sorter = function (a, b) { return (a < b ? 1 : -1); };
+exports.decodeHTML = (function () {
+    var legacy = Object.keys(legacy_json_1.default).sort(sorter);
+    var keys = Object.keys(entities_json_1.default).sort(sorter);
+    for (var i = 0, j = 0; i < keys.length; i++) {
+        if (legacy[j] === keys[i]) {
+            keys[i] += ";?";
+            j++;
+        }
+        else {
+            keys[i] += ";";
+        }
+    }
+    var re = new RegExp("&(?:" + keys.join("|") + "|#[xX][\\da-fA-F]+;?|#\\d+;?)", "g");
+    var replace = getReplacer(entities_json_1.default);
+    function replacer(str) {
+        if (str.substr(-1) !== ";")
+            str += ";";
+        return replace(str);
+    }
+    // TODO consider creating a merged map
+    return function (str) { return String(str).replace(re, replacer); };
+})();
+function getReplacer(map) {
+    return function replace(str) {
+        if (str.charAt(1) === "#") {
+            var secondChar = str.charAt(2);
+            if (secondChar === "X" || secondChar === "x") {
+                return decode_codepoint_1.default(parseInt(str.substr(3), 16));
+            }
+            return decode_codepoint_1.default(parseInt(str.substr(2), 10));
+        }
+        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
+        return map[str.slice(1, -1)] || str;
+    };
+}
diff --git a/node_modules/css-select/node_modules/entities/lib/decode_codepoint.d.ts b/node_modules/css-select/node_modules/entities/lib/decode_codepoint.d.ts
new file mode 100644
index 0000000..6b72eaa
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/lib/decode_codepoint.d.ts
@@ -0,0 +1,2 @@
+export default function decodeCodePoint(codePoint: number): string;
+//# sourceMappingURL=decode_codepoint.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/entities/lib/decode_codepoint.d.ts.map b/node_modules/css-select/node_modules/entities/lib/decode_codepoint.d.ts.map
new file mode 100644
index 0000000..b765ae0
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/lib/decode_codepoint.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"decode_codepoint.d.ts","sourceRoot":"","sources":["../src/decode_codepoint.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAUjE"}
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/entities/lib/decode_codepoint.js b/node_modules/css-select/node_modules/entities/lib/decode_codepoint.js
new file mode 100644
index 0000000..63efe19
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/lib/decode_codepoint.js
@@ -0,0 +1,30 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var decode_json_1 = __importDefault(require("./maps/decode.json"));
+// Adapted from https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119
+var fromCodePoint = 
+// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+String.fromCodePoint ||
+    function (codePoint) {
+        var output = "";
+        if (codePoint > 0xffff) {
+            codePoint -= 0x10000;
+            output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800);
+            codePoint = 0xdc00 | (codePoint & 0x3ff);
+        }
+        output += String.fromCharCode(codePoint);
+        return output;
+    };
+function decodeCodePoint(codePoint) {
+    if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) {
+        return "\uFFFD";
+    }
+    if (codePoint in decode_json_1.default) {
+        codePoint = decode_json_1.default[codePoint];
+    }
+    return fromCodePoint(codePoint);
+}
+exports.default = decodeCodePoint;
diff --git a/node_modules/css-select/node_modules/entities/lib/encode.d.ts b/node_modules/css-select/node_modules/entities/lib/encode.d.ts
new file mode 100644
index 0000000..8e346d8
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/lib/encode.d.ts
@@ -0,0 +1,47 @@
+/**
+ * Encodes all non-ASCII characters, as well as characters not valid in XML
+ * documents using XML entities.
+ *
+ * If a character has no equivalent entity, a
+ * numeric hexadecimal reference (eg. `&#xfc;`) will be used.
+ */
+export declare const encodeXML: (data: string) => string;
+/**
+ * Encodes all entities and non-ASCII characters in the input.
+ *
+ * This includes characters that are valid ASCII characters in HTML documents.
+ * For example `#` will be encoded as `&num;`. To get a more compact output,
+ * consider using the `encodeNonAsciiHTML` function.
+ *
+ * If a character has no equivalent entity, a
+ * numeric hexadecimal reference (eg. `&#xfc;`) will be used.
+ */
+export declare const encodeHTML: (data: string) => string;
+/**
+ * Encodes all non-ASCII characters, as well as characters not valid in HTML
+ * documents using HTML entities.
+ *
+ * If a character has no equivalent entity, a
+ * numeric hexadecimal reference (eg. `&#xfc;`) will be used.
+ */
+export declare const encodeNonAsciiHTML: (data: string) => string;
+/**
+ * Encodes all non-ASCII characters, as well as characters not valid in XML
+ * documents using numeric hexadecimal reference (eg. `&#xfc;`).
+ *
+ * Have a look at `escapeUTF8` if you want a more concise output at the expense
+ * of reduced transportability.
+ *
+ * @param data String to escape.
+ */
+export declare function escape(data: string): string;
+/**
+ * Encodes all characters not valid in XML documents using numeric hexadecimal
+ * reference (eg. `&#xfc;`).
+ *
+ * Note that the output will be character-set dependent.
+ *
+ * @param data String to escape.
+ */
+export declare function escapeUTF8(data: string): string;
+//# sourceMappingURL=encode.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/entities/lib/encode.d.ts.map b/node_modules/css-select/node_modules/entities/lib/encode.d.ts.map
new file mode 100644
index 0000000..0b075fd
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/lib/encode.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../src/encode.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,SAwIJ,MAAM,WAxI4B,CAAC;AAOrD;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,SAkFL,MAAM,WAlFuC,CAAC;AAChE;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,SA+Gb,MAAM,WA/GsC,CAAC;AAqF/D;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C"}
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/entities/lib/encode.js b/node_modules/css-select/node_modules/entities/lib/encode.js
new file mode 100644
index 0000000..d11b238
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/lib/encode.js
@@ -0,0 +1,136 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = void 0;
+var xml_json_1 = __importDefault(require("./maps/xml.json"));
+var inverseXML = getInverseObj(xml_json_1.default);
+var xmlReplacer = getInverseReplacer(inverseXML);
+/**
+ * Encodes all non-ASCII characters, as well as characters not valid in XML
+ * documents using XML entities.
+ *
+ * If a character has no equivalent entity, a
+ * numeric hexadecimal reference (eg. `&#xfc;`) will be used.
+ */
+exports.encodeXML = getASCIIEncoder(inverseXML);
+var entities_json_1 = __importDefault(require("./maps/entities.json"));
+var inverseHTML = getInverseObj(entities_json_1.default);
+var htmlReplacer = getInverseReplacer(inverseHTML);
+/**
+ * Encodes all entities and non-ASCII characters in the input.
+ *
+ * This includes characters that are valid ASCII characters in HTML documents.
+ * For example `#` will be encoded as `&num;`. To get a more compact output,
+ * consider using the `encodeNonAsciiHTML` function.
+ *
+ * If a character has no equivalent entity, a
+ * numeric hexadecimal reference (eg. `&#xfc;`) will be used.
+ */
+exports.encodeHTML = getInverse(inverseHTML, htmlReplacer);
+/**
+ * Encodes all non-ASCII characters, as well as characters not valid in HTML
+ * documents using HTML entities.
+ *
+ * If a character has no equivalent entity, a
+ * numeric hexadecimal reference (eg. `&#xfc;`) will be used.
+ */
+exports.encodeNonAsciiHTML = getASCIIEncoder(inverseHTML);
+function getInverseObj(obj) {
+    return Object.keys(obj)
+        .sort()
+        .reduce(function (inverse, name) {
+        inverse[obj[name]] = "&" + name + ";";
+        return inverse;
+    }, {});
+}
+function getInverseReplacer(inverse) {
+    var single = [];
+    var multiple = [];
+    for (var _i = 0, _a = Object.keys(inverse); _i < _a.length; _i++) {
+        var k = _a[_i];
+        if (k.length === 1) {
+            // Add value to single array
+            single.push("\\" + k);
+        }
+        else {
+            // Add value to multiple array
+            multiple.push(k);
+        }
+    }
+    // Add ranges to single characters.
+    single.sort();
+    for (var start = 0; start < single.length - 1; start++) {
+        // Find the end of a run of characters
+        var end = start;
+        while (end < single.length - 1 &&
+            single[end].charCodeAt(1) + 1 === single[end + 1].charCodeAt(1)) {
+            end += 1;
+        }
+        var count = 1 + end - start;
+        // We want to replace at least three characters
+        if (count < 3)
+            continue;
+        single.splice(start, count, single[start] + "-" + single[end]);
+    }
+    multiple.unshift("[" + single.join("") + "]");
+    return new RegExp(multiple.join("|"), "g");
+}
+// /[^\0-\x7F]/gu
+var reNonASCII = /(?:[\x80-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g;
+var getCodePoint = 
+// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+String.prototype.codePointAt != null
+    ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+        function (str) { return str.codePointAt(0); }
+    : // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
+        function (c) {
+            return (c.charCodeAt(0) - 0xd800) * 0x400 +
+                c.charCodeAt(1) -
+                0xdc00 +
+                0x10000;
+        };
+function singleCharReplacer(c) {
+    return "&#x" + (c.length > 1 ? getCodePoint(c) : c.charCodeAt(0))
+        .toString(16)
+        .toUpperCase() + ";";
+}
+function getInverse(inverse, re) {
+    return function (data) {
+        return data
+            .replace(re, function (name) { return inverse[name]; })
+            .replace(reNonASCII, singleCharReplacer);
+    };
+}
+var reEscapeChars = new RegExp(xmlReplacer.source + "|" + reNonASCII.source, "g");
+/**
+ * Encodes all non-ASCII characters, as well as characters not valid in XML
+ * documents using numeric hexadecimal reference (eg. `&#xfc;`).
+ *
+ * Have a look at `escapeUTF8` if you want a more concise output at the expense
+ * of reduced transportability.
+ *
+ * @param data String to escape.
+ */
+function escape(data) {
+    return data.replace(reEscapeChars, singleCharReplacer);
+}
+exports.escape = escape;
+/**
+ * Encodes all characters not valid in XML documents using numeric hexadecimal
+ * reference (eg. `&#xfc;`).
+ *
+ * Note that the output will be character-set dependent.
+ *
+ * @param data String to escape.
+ */
+function escapeUTF8(data) {
+    return data.replace(xmlReplacer, singleCharReplacer);
+}
+exports.escapeUTF8 = escapeUTF8;
+function getASCIIEncoder(obj) {
+    return function (data) {
+        return data.replace(reEscapeChars, function (c) { return obj[c] || singleCharReplacer(c); });
+    };
+}
diff --git a/node_modules/css-select/node_modules/entities/lib/index.d.ts b/node_modules/css-select/node_modules/entities/lib/index.d.ts
new file mode 100644
index 0000000..68c8cd5
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/lib/index.d.ts
@@ -0,0 +1,27 @@
+/**
+ * Decodes a string with entities.
+ *
+ * @param data String to decode.
+ * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.
+ * @deprecated Use `decodeXML` or `decodeHTML` directly.
+ */
+export declare function decode(data: string, level?: number): string;
+/**
+ * Decodes a string with entities. Does not allow missing trailing semicolons for entities.
+ *
+ * @param data String to decode.
+ * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.
+ * @deprecated Use `decodeHTMLStrict` or `decodeXML` directly.
+ */
+export declare function decodeStrict(data: string, level?: number): string;
+/**
+ * Encodes a string with entities.
+ *
+ * @param data String to encode.
+ * @param level Optional level to encode at. 0 = XML, 1 = HTML. Default is 0.
+ * @deprecated Use `encodeHTML`, `encodeXML` or `encodeNonAsciiHTML` directly.
+ */
+export declare function encode(data: string, level?: number): string;
+export { encodeXML, encodeHTML, encodeNonAsciiHTML, escape, escapeUTF8, encodeHTML as encodeHTML4, encodeHTML as encodeHTML5, } from "./encode";
+export { decodeXML, decodeHTML, decodeHTMLStrict, decodeHTML as decodeHTML4, decodeHTML as decodeHTML5, decodeHTMLStrict as decodeHTML4Strict, decodeHTMLStrict as decodeHTML5Strict, decodeXML as decodeXMLStrict, } from "./decode";
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/entities/lib/index.d.ts.map b/node_modules/css-select/node_modules/entities/lib/index.d.ts.map
new file mode 100644
index 0000000..24b32ca
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/lib/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,OAAO,EACH,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,MAAM,EACN,UAAU,EAEV,UAAU,IAAI,WAAW,EACzB,UAAU,IAAI,WAAW,GAC5B,MAAM,UAAU,CAAC;AAElB,OAAO,EACH,SAAS,EACT,UAAU,EACV,gBAAgB,EAEhB,UAAU,IAAI,WAAW,EACzB,UAAU,IAAI,WAAW,EACzB,gBAAgB,IAAI,iBAAiB,EACrC,gBAAgB,IAAI,iBAAiB,EACrC,SAAS,IAAI,eAAe,GAC/B,MAAM,UAAU,CAAC"}
\ No newline at end of file
diff --git a/node_modules/css-select/node_modules/entities/lib/index.js b/node_modules/css-select/node_modules/entities/lib/index.js
new file mode 100644
index 0000000..1b8c3da
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/lib/index.js
@@ -0,0 +1,57 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.decodeXMLStrict = exports.decodeHTML5Strict = exports.decodeHTML4Strict = exports.decodeHTML5 = exports.decodeHTML4 = exports.decodeHTMLStrict = exports.decodeHTML = exports.decodeXML = exports.encodeHTML5 = exports.encodeHTML4 = exports.escapeUTF8 = exports.escape = exports.encodeNonAsciiHTML = exports.encodeHTML = exports.encodeXML = exports.encode = exports.decodeStrict = exports.decode = void 0;
+var decode_1 = require("./decode");
+var encode_1 = require("./encode");
+/**
+ * Decodes a string with entities.
+ *
+ * @param data String to decode.
+ * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.
+ * @deprecated Use `decodeXML` or `decodeHTML` directly.
+ */
+function decode(data, level) {
+    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTML)(data);
+}
+exports.decode = decode;
+/**
+ * Decodes a string with entities. Does not allow missing trailing semicolons for entities.
+ *
+ * @param data String to decode.
+ * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0.
+ * @deprecated Use `decodeHTMLStrict` or `decodeXML` directly.
+ */
+function decodeStrict(data, level) {
+    return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTMLStrict)(data);
+}
+exports.decodeStrict = decodeStrict;
+/**
+ * Encodes a string with entities.
+ *
+ * @param data String to encode.
+ * @param level Optional level to encode at. 0 = XML, 1 = HTML. Default is 0.
+ * @deprecated Use `encodeHTML`, `encodeXML` or `encodeNonAsciiHTML` directly.
+ */
+function encode(data, level) {
+    return (!level || level <= 0 ? encode_1.encodeXML : encode_1.encodeHTML)(data);
+}
+exports.encode = encode;
+var encode_2 = require("./encode");
+Object.defineProperty(exports, "encodeXML", { enumerable: true, get: function () { return encode_2.encodeXML; } });
+Object.defineProperty(exports, "encodeHTML", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
+Object.defineProperty(exports, "encodeNonAsciiHTML", { enumerable: true, get: function () { return encode_2.encodeNonAsciiHTML; } });
+Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return encode_2.escape; } });
+Object.defineProperty(exports, "escapeUTF8", { enumerable: true, get: function () { return encode_2.escapeUTF8; } });
+// Legacy aliases (deprecated)
+Object.defineProperty(exports, "encodeHTML4", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
+Object.defineProperty(exports, "encodeHTML5", { enumerable: true, get: function () { return encode_2.encodeHTML; } });
+var decode_2 = require("./decode");
+Object.defineProperty(exports, "decodeXML", { enumerable: true, get: function () { return decode_2.decodeXML; } });
+Object.defineProperty(exports, "decodeHTML", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
+Object.defineProperty(exports, "decodeHTMLStrict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
+// Legacy aliases (deprecated)
+Object.defineProperty(exports, "decodeHTML4", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
+Object.defineProperty(exports, "decodeHTML5", { enumerable: true, get: function () { return decode_2.decodeHTML; } });
+Object.defineProperty(exports, "decodeHTML4Strict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
+Object.defineProperty(exports, "decodeHTML5Strict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } });
+Object.defineProperty(exports, "decodeXMLStrict", { enumerable: true, get: function () { return decode_2.decodeXML; } });
diff --git a/node_modules/css-select/node_modules/entities/lib/maps/decode.json b/node_modules/css-select/node_modules/entities/lib/maps/decode.json
new file mode 100644
index 0000000..80ef449
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/lib/maps/decode.json
@@ -0,0 +1 @@
+{"0":65533,"128":8364,"130":8218,"131":402,"132":8222,"133":8230,"134":8224,"135":8225,"136":710,"137":8240,"138":352,"139":8249,"140":338,"142":381,"145":8216,"146":8217,"147":8220,"148":8221,"149":8226,"150":8211,"151":8212,"152":732,"153":8482,"154":353,"155":8250,"156":339,"158":382,"159":376}
diff --git a/node_modules/css-select/node_modules/entities/lib/maps/entities.json b/node_modules/css-select/node_modules/entities/lib/maps/entities.json
new file mode 100644
index 0000000..c5b1c4e
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/lib/maps/entities.json
@@ -0,0 +1 @@
+{"Aacute":"Á","aacute":"á","Abreve":"Ă","abreve":"ă","ac":"∾","acd":"∿","acE":"∾̳","Acirc":"Â","acirc":"â","acute":"´","Acy":"А","acy":"а","AElig":"Æ","aelig":"æ","af":"⁡","Afr":"𝔄","afr":"𝔞","Agrave":"À","agrave":"à","alefsym":"ℵ","aleph":"ℵ","Alpha":"Α","alpha":"α","Amacr":"Ā","amacr":"ā","amalg":"⨿","amp":"&","AMP":"&","andand":"⩕","And":"⩓","and":"∧","andd":"⩜","andslope":"⩘","andv":"⩚","ang":"∠","ange":"⦤","angle":"∠","angmsdaa":"⦨","angmsdab":"⦩","angmsdac":"⦪","angmsdad":"⦫","angmsdae":"⦬","angmsdaf":"⦭","angmsdag":"⦮","angmsdah":"⦯","angmsd":"∡","angrt":"∟","angrtvb":"⊾","angrtvbd":"⦝","angsph":"∢","angst":"Å","angzarr":"⍼","Aogon":"Ą","aogon":"ą","Aopf":"𝔸","aopf":"𝕒","apacir":"⩯","ap":"≈","apE":"⩰","ape":"≊","apid":"≋","apos":"'","ApplyFunction":"⁡","approx":"≈","approxeq":"≊","Aring":"Å","aring":"å","Ascr":"𝒜","ascr":"𝒶","Assign":"≔","ast":"*","asymp":"≈","asympeq":"≍","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","awconint":"∳","awint":"⨑","backcong":"≌","backepsilon":"϶","backprime":"‵","backsim":"∽","backsimeq":"⋍","Backslash":"∖","Barv":"⫧","barvee":"⊽","barwed":"⌅","Barwed":"⌆","barwedge":"⌅","bbrk":"⎵","bbrktbrk":"⎶","bcong":"≌","Bcy":"Б","bcy":"б","bdquo":"„","becaus":"∵","because":"∵","Because":"∵","bemptyv":"⦰","bepsi":"϶","bernou":"ℬ","Bernoullis":"ℬ","Beta":"Β","beta":"β","beth":"ℶ","between":"≬","Bfr":"𝔅","bfr":"𝔟","bigcap":"⋂","bigcirc":"◯","bigcup":"⋃","bigodot":"⨀","bigoplus":"⨁","bigotimes":"⨂","bigsqcup":"⨆","bigstar":"★","bigtriangledown":"▽","bigtriangleup":"△","biguplus":"⨄","bigvee":"⋁","bigwedge":"⋀","bkarow":"⤍","blacklozenge":"⧫","blacksquare":"▪","blacktriangle":"▴","blacktriangledown":"▾","blacktriangleleft":"◂","blacktriangleright":"▸","blank":"␣","blk12":"▒","blk14":"░","blk34":"▓","block":"█","bne":"=⃥","bnequiv":"≡⃥","bNot":"⫭","bnot":"⌐","Bopf":"𝔹","bopf":"𝕓","bot":"⊥","bottom":"⊥","bowtie":"⋈","boxbox":"⧉","boxdl":"┐","boxdL":"╕","boxDl":"╖","boxDL":"╗","boxdr":"┌","boxdR":"╒","boxDr":"╓","boxDR":"╔","boxh":"─","boxH":"═","boxhd":"┬","boxHd":"╤","boxhD":"╥","boxHD":"╦","boxhu":"┴","boxHu":"╧","boxhU":"╨","boxHU":"╩","boxminus":"⊟","boxplus":"⊞","boxtimes":"⊠","boxul":"┘","boxuL":"╛","boxUl":"╜","boxUL":"╝","boxur":"└","boxuR":"╘","boxUr":"╙","boxUR":"╚","boxv":"│","boxV":"║","boxvh":"┼","boxvH":"╪","boxVh":"╫","boxVH":"╬","boxvl":"┤","boxvL":"╡","boxVl":"╢","boxVL":"╣","boxvr":"├","boxvR":"╞","boxVr":"╟","boxVR":"╠","bprime":"‵","breve":"˘","Breve":"˘","brvbar":"¦","bscr":"𝒷","Bscr":"ℬ","bsemi":"⁏","bsim":"∽","bsime":"⋍","bsolb":"⧅","bsol":"\\","bsolhsub":"⟈","bull":"•","bullet":"•","bump":"≎","bumpE":"⪮","bumpe":"≏","Bumpeq":"≎","bumpeq":"≏","Cacute":"Ć","cacute":"ć","capand":"⩄","capbrcup":"⩉","capcap":"⩋","cap":"∩","Cap":"⋒","capcup":"⩇","capdot":"⩀","CapitalDifferentialD":"ⅅ","caps":"∩︀","caret":"⁁","caron":"ˇ","Cayleys":"ℭ","ccaps":"⩍","Ccaron":"Č","ccaron":"č","Ccedil":"Ç","ccedil":"ç","Ccirc":"Ĉ","ccirc":"ĉ","Cconint":"∰","ccups":"⩌","ccupssm":"⩐","Cdot":"Ċ","cdot":"ċ","cedil":"¸","Cedilla":"¸","cemptyv":"⦲","cent":"¢","centerdot":"·","CenterDot":"·","cfr":"𝔠","Cfr":"ℭ","CHcy":"Ч","chcy":"ч","check":"✓","checkmark":"✓","Chi":"Χ","chi":"χ","circ":"ˆ","circeq":"≗","circlearrowleft":"↺","circlearrowright":"↻","circledast":"⊛","circledcirc":"⊚","circleddash":"⊝","CircleDot":"⊙","circledR":"®","circledS":"Ⓢ","CircleMinus":"⊖","CirclePlus":"⊕","CircleTimes":"⊗","cir":"○","cirE":"⧃","cire":"≗","cirfnint":"⨐","cirmid":"⫯","cirscir":"⧂","ClockwiseContourIntegral":"∲","CloseCurlyDoubleQuote":"”","CloseCurlyQuote":"’","clubs":"♣","clubsuit":"♣","colon":":","Colon":"∷","Colone":"⩴","colone":"≔","coloneq":"≔","comma":",","commat":"@","comp":"∁","compfn":"∘","complement":"∁","complexes":"ℂ","cong":"≅","congdot":"⩭","Congruent":"≡","conint":"∮","Conint":"∯","ContourIntegral":"∮","copf":"𝕔","Copf":"ℂ","coprod":"∐","Coproduct":"∐","copy":"©","COPY":"©","copysr":"℗","CounterClockwiseContourIntegral":"∳","crarr":"↵","cross":"✗","Cross":"⨯","Cscr":"𝒞","cscr":"𝒸","csub":"⫏","csube":"⫑","csup":"⫐","csupe":"⫒","ctdot":"⋯","cudarrl":"⤸","cudarrr":"⤵","cuepr":"⋞","cuesc":"⋟","cularr":"↶","cularrp":"⤽","cupbrcap":"⩈","cupcap":"⩆","CupCap":"≍","cup":"∪","Cup":"⋓","cupcup":"⩊","cupdot":"⊍","cupor":"⩅","cups":"∪︀","curarr":"↷","curarrm":"⤼","curlyeqprec":"⋞","curlyeqsucc":"⋟","curlyvee":"⋎","curlywedge":"⋏","curren":"¤","curvearrowleft":"↶","curvearrowright":"↷","cuvee":"⋎","cuwed":"⋏","cwconint":"∲","cwint":"∱","cylcty":"⌭","dagger":"†","Dagger":"‡","daleth":"ℸ","darr":"↓","Darr":"↡","dArr":"⇓","dash":"‐","Dashv":"⫤","dashv":"⊣","dbkarow":"⤏","dblac":"˝","Dcaron":"Ď","dcaron":"ď","Dcy":"Д","dcy":"д","ddagger":"‡","ddarr":"⇊","DD":"ⅅ","dd":"ⅆ","DDotrahd":"⤑","ddotseq":"⩷","deg":"°","Del":"∇","Delta":"Δ","delta":"δ","demptyv":"⦱","dfisht":"⥿","Dfr":"𝔇","dfr":"𝔡","dHar":"⥥","dharl":"⇃","dharr":"⇂","DiacriticalAcute":"´","DiacriticalDot":"˙","DiacriticalDoubleAcute":"˝","DiacriticalGrave":"`","DiacriticalTilde":"˜","diam":"⋄","diamond":"⋄","Diamond":"⋄","diamondsuit":"♦","diams":"♦","die":"¨","DifferentialD":"ⅆ","digamma":"ϝ","disin":"⋲","div":"÷","divide":"÷","divideontimes":"⋇","divonx":"⋇","DJcy":"Ђ","djcy":"ђ","dlcorn":"⌞","dlcrop":"⌍","dollar":"$","Dopf":"𝔻","dopf":"𝕕","Dot":"¨","dot":"˙","DotDot":"⃜","doteq":"≐","doteqdot":"≑","DotEqual":"≐","dotminus":"∸","dotplus":"∔","dotsquare":"⊡","doublebarwedge":"⌆","DoubleContourIntegral":"∯","DoubleDot":"¨","DoubleDownArrow":"⇓","DoubleLeftArrow":"⇐","DoubleLeftRightArrow":"⇔","DoubleLeftTee":"⫤","DoubleLongLeftArrow":"⟸","DoubleLongLeftRightArrow":"⟺","DoubleLongRightArrow":"⟹","DoubleRightArrow":"⇒","DoubleRightTee":"⊨","DoubleUpArrow":"⇑","DoubleUpDownArrow":"⇕","DoubleVerticalBar":"∥","DownArrowBar":"⤓","downarrow":"↓","DownArrow":"↓","Downarrow":"⇓","DownArrowUpArrow":"⇵","DownBreve":"̑","downdownarrows":"⇊","downharpoonleft":"⇃","downharpoonright":"⇂","DownLeftRightVector":"⥐","DownLeftTeeVector":"⥞","DownLeftVectorBar":"⥖","DownLeftVector":"↽","DownRightTeeVector":"⥟","DownRightVectorBar":"⥗","DownRightVector":"⇁","DownTeeArrow":"↧","DownTee":"⊤","drbkarow":"⤐","drcorn":"⌟","drcrop":"⌌","Dscr":"𝒟","dscr":"𝒹","DScy":"Ѕ","dscy":"ѕ","dsol":"⧶","Dstrok":"Đ","dstrok":"đ","dtdot":"⋱","dtri":"▿","dtrif":"▾","duarr":"⇵","duhar":"⥯","dwangle":"⦦","DZcy":"Џ","dzcy":"џ","dzigrarr":"⟿","Eacute":"É","eacute":"é","easter":"⩮","Ecaron":"Ě","ecaron":"ě","Ecirc":"Ê","ecirc":"ê","ecir":"≖","ecolon":"≕","Ecy":"Э","ecy":"э","eDDot":"⩷","Edot":"Ė","edot":"ė","eDot":"≑","ee":"ⅇ","efDot":"≒","Efr":"𝔈","efr":"𝔢","eg":"⪚","Egrave":"È","egrave":"è","egs":"⪖","egsdot":"⪘","el":"⪙","Element":"∈","elinters":"⏧","ell":"ℓ","els":"⪕","elsdot":"⪗","Emacr":"Ē","emacr":"ē","empty":"∅","emptyset":"∅","EmptySmallSquare":"◻","emptyv":"∅","EmptyVerySmallSquare":"▫","emsp13":" ","emsp14":" ","emsp":" ","ENG":"Ŋ","eng":"ŋ","ensp":" ","Eogon":"Ę","eogon":"ę","Eopf":"𝔼","eopf":"𝕖","epar":"⋕","eparsl":"⧣","eplus":"⩱","epsi":"ε","Epsilon":"Ε","epsilon":"ε","epsiv":"ϵ","eqcirc":"≖","eqcolon":"≕","eqsim":"≂","eqslantgtr":"⪖","eqslantless":"⪕","Equal":"⩵","equals":"=","EqualTilde":"≂","equest":"≟","Equilibrium":"⇌","equiv":"≡","equivDD":"⩸","eqvparsl":"⧥","erarr":"⥱","erDot":"≓","escr":"ℯ","Escr":"ℰ","esdot":"≐","Esim":"⩳","esim":"≂","Eta":"Η","eta":"η","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","euro":"€","excl":"!","exist":"∃","Exists":"∃","expectation":"ℰ","exponentiale":"ⅇ","ExponentialE":"ⅇ","fallingdotseq":"≒","Fcy":"Ф","fcy":"ф","female":"♀","ffilig":"ffi","fflig":"ff","ffllig":"ffl","Ffr":"𝔉","ffr":"𝔣","filig":"fi","FilledSmallSquare":"◼","FilledVerySmallSquare":"▪","fjlig":"fj","flat":"♭","fllig":"fl","fltns":"▱","fnof":"ƒ","Fopf":"𝔽","fopf":"𝕗","forall":"∀","ForAll":"∀","fork":"⋔","forkv":"⫙","Fouriertrf":"ℱ","fpartint":"⨍","frac12":"½","frac13":"⅓","frac14":"¼","frac15":"⅕","frac16":"⅙","frac18":"⅛","frac23":"⅔","frac25":"⅖","frac34":"¾","frac35":"⅗","frac38":"⅜","frac45":"⅘","frac56":"⅚","frac58":"⅝","frac78":"⅞","frasl":"⁄","frown":"⌢","fscr":"𝒻","Fscr":"ℱ","gacute":"ǵ","Gamma":"Γ","gamma":"γ","Gammad":"Ϝ","gammad":"ϝ","gap":"⪆","Gbreve":"Ğ","gbreve":"ğ","Gcedil":"Ģ","Gcirc":"Ĝ","gcirc":"ĝ","Gcy":"Г","gcy":"г","Gdot":"Ġ","gdot":"ġ","ge":"≥","gE":"≧","gEl":"⪌","gel":"⋛","geq":"≥","geqq":"≧","geqslant":"⩾","gescc":"⪩","ges":"⩾","gesdot":"⪀","gesdoto":"⪂","gesdotol":"⪄","gesl":"⋛︀","gesles":"⪔","Gfr":"𝔊","gfr":"𝔤","gg":"≫","Gg":"⋙","ggg":"⋙","gimel":"ℷ","GJcy":"Ѓ","gjcy":"ѓ","gla":"⪥","gl":"≷","glE":"⪒","glj":"⪤","gnap":"⪊","gnapprox":"⪊","gne":"⪈","gnE":"≩","gneq":"⪈","gneqq":"≩","gnsim":"⋧","Gopf":"𝔾","gopf":"𝕘","grave":"`","GreaterEqual":"≥","GreaterEqualLess":"⋛","GreaterFullEqual":"≧","GreaterGreater":"⪢","GreaterLess":"≷","GreaterSlantEqual":"⩾","GreaterTilde":"≳","Gscr":"𝒢","gscr":"ℊ","gsim":"≳","gsime":"⪎","gsiml":"⪐","gtcc":"⪧","gtcir":"⩺","gt":">","GT":">","Gt":"≫","gtdot":"⋗","gtlPar":"⦕","gtquest":"⩼","gtrapprox":"⪆","gtrarr":"⥸","gtrdot":"⋗","gtreqless":"⋛","gtreqqless":"⪌","gtrless":"≷","gtrsim":"≳","gvertneqq":"≩︀","gvnE":"≩︀","Hacek":"ˇ","hairsp":" ","half":"½","hamilt":"ℋ","HARDcy":"Ъ","hardcy":"ъ","harrcir":"⥈","harr":"↔","hArr":"⇔","harrw":"↭","Hat":"^","hbar":"ℏ","Hcirc":"Ĥ","hcirc":"ĥ","hearts":"♥","heartsuit":"♥","hellip":"…","hercon":"⊹","hfr":"𝔥","Hfr":"ℌ","HilbertSpace":"ℋ","hksearow":"⤥","hkswarow":"⤦","hoarr":"⇿","homtht":"∻","hookleftarrow":"↩","hookrightarrow":"↪","hopf":"𝕙","Hopf":"ℍ","horbar":"―","HorizontalLine":"─","hscr":"𝒽","Hscr":"ℋ","hslash":"ℏ","Hstrok":"Ħ","hstrok":"ħ","HumpDownHump":"≎","HumpEqual":"≏","hybull":"⁃","hyphen":"‐","Iacute":"Í","iacute":"í","ic":"⁣","Icirc":"Î","icirc":"î","Icy":"И","icy":"и","Idot":"İ","IEcy":"Е","iecy":"е","iexcl":"¡","iff":"⇔","ifr":"𝔦","Ifr":"ℑ","Igrave":"Ì","igrave":"ì","ii":"ⅈ","iiiint":"⨌","iiint":"∭","iinfin":"⧜","iiota":"℩","IJlig":"IJ","ijlig":"ij","Imacr":"Ī","imacr":"ī","image":"ℑ","ImaginaryI":"ⅈ","imagline":"ℐ","imagpart":"ℑ","imath":"ı","Im":"ℑ","imof":"⊷","imped":"Ƶ","Implies":"⇒","incare":"℅","in":"∈","infin":"∞","infintie":"⧝","inodot":"ı","intcal":"⊺","int":"∫","Int":"∬","integers":"ℤ","Integral":"∫","intercal":"⊺","Intersection":"⋂","intlarhk":"⨗","intprod":"⨼","InvisibleComma":"⁣","InvisibleTimes":"⁢","IOcy":"Ё","iocy":"ё","Iogon":"Į","iogon":"į","Iopf":"𝕀","iopf":"𝕚","Iota":"Ι","iota":"ι","iprod":"⨼","iquest":"¿","iscr":"𝒾","Iscr":"ℐ","isin":"∈","isindot":"⋵","isinE":"⋹","isins":"⋴","isinsv":"⋳","isinv":"∈","it":"⁢","Itilde":"Ĩ","itilde":"ĩ","Iukcy":"І","iukcy":"і","Iuml":"Ï","iuml":"ï","Jcirc":"Ĵ","jcirc":"ĵ","Jcy":"Й","jcy":"й","Jfr":"𝔍","jfr":"𝔧","jmath":"ȷ","Jopf":"𝕁","jopf":"𝕛","Jscr":"𝒥","jscr":"𝒿","Jsercy":"Ј","jsercy":"ј","Jukcy":"Є","jukcy":"є","Kappa":"Κ","kappa":"κ","kappav":"ϰ","Kcedil":"Ķ","kcedil":"ķ","Kcy":"К","kcy":"к","Kfr":"𝔎","kfr":"𝔨","kgreen":"ĸ","KHcy":"Х","khcy":"х","KJcy":"Ќ","kjcy":"ќ","Kopf":"𝕂","kopf":"𝕜","Kscr":"𝒦","kscr":"𝓀","lAarr":"⇚","Lacute":"Ĺ","lacute":"ĺ","laemptyv":"⦴","lagran":"ℒ","Lambda":"Λ","lambda":"λ","lang":"⟨","Lang":"⟪","langd":"⦑","langle":"⟨","lap":"⪅","Laplacetrf":"ℒ","laquo":"«","larrb":"⇤","larrbfs":"⤟","larr":"←","Larr":"↞","lArr":"⇐","larrfs":"⤝","larrhk":"↩","larrlp":"↫","larrpl":"⤹","larrsim":"⥳","larrtl":"↢","latail":"⤙","lAtail":"⤛","lat":"⪫","late":"⪭","lates":"⪭︀","lbarr":"⤌","lBarr":"⤎","lbbrk":"❲","lbrace":"{","lbrack":"[","lbrke":"⦋","lbrksld":"⦏","lbrkslu":"⦍","Lcaron":"Ľ","lcaron":"ľ","Lcedil":"Ļ","lcedil":"ļ","lceil":"⌈","lcub":"{","Lcy":"Л","lcy":"л","ldca":"⤶","ldquo":"“","ldquor":"„","ldrdhar":"⥧","ldrushar":"⥋","ldsh":"↲","le":"≤","lE":"≦","LeftAngleBracket":"⟨","LeftArrowBar":"⇤","leftarrow":"←","LeftArrow":"←","Leftarrow":"⇐","LeftArrowRightArrow":"⇆","leftarrowtail":"↢","LeftCeiling":"⌈","LeftDoubleBracket":"⟦","LeftDownTeeVector":"⥡","LeftDownVectorBar":"⥙","LeftDownVector":"⇃","LeftFloor":"⌊","leftharpoondown":"↽","leftharpoonup":"↼","leftleftarrows":"⇇","leftrightarrow":"↔","LeftRightArrow":"↔","Leftrightarrow":"⇔","leftrightarrows":"⇆","leftrightharpoons":"⇋","leftrightsquigarrow":"↭","LeftRightVector":"⥎","LeftTeeArrow":"↤","LeftTee":"⊣","LeftTeeVector":"⥚","leftthreetimes":"⋋","LeftTriangleBar":"⧏","LeftTriangle":"⊲","LeftTriangleEqual":"⊴","LeftUpDownVector":"⥑","LeftUpTeeVector":"⥠","LeftUpVectorBar":"⥘","LeftUpVector":"↿","LeftVectorBar":"⥒","LeftVector":"↼","lEg":"⪋","leg":"⋚","leq":"≤","leqq":"≦","leqslant":"⩽","lescc":"⪨","les":"⩽","lesdot":"⩿","lesdoto":"⪁","lesdotor":"⪃","lesg":"⋚︀","lesges":"⪓","lessapprox":"⪅","lessdot":"⋖","lesseqgtr":"⋚","lesseqqgtr":"⪋","LessEqualGreater":"⋚","LessFullEqual":"≦","LessGreater":"≶","lessgtr":"≶","LessLess":"⪡","lesssim":"≲","LessSlantEqual":"⩽","LessTilde":"≲","lfisht":"⥼","lfloor":"⌊","Lfr":"𝔏","lfr":"𝔩","lg":"≶","lgE":"⪑","lHar":"⥢","lhard":"↽","lharu":"↼","lharul":"⥪","lhblk":"▄","LJcy":"Љ","ljcy":"љ","llarr":"⇇","ll":"≪","Ll":"⋘","llcorner":"⌞","Lleftarrow":"⇚","llhard":"⥫","lltri":"◺","Lmidot":"Ŀ","lmidot":"ŀ","lmoustache":"⎰","lmoust":"⎰","lnap":"⪉","lnapprox":"⪉","lne":"⪇","lnE":"≨","lneq":"⪇","lneqq":"≨","lnsim":"⋦","loang":"⟬","loarr":"⇽","lobrk":"⟦","longleftarrow":"⟵","LongLeftArrow":"⟵","Longleftarrow":"⟸","longleftrightarrow":"⟷","LongLeftRightArrow":"⟷","Longleftrightarrow":"⟺","longmapsto":"⟼","longrightarrow":"⟶","LongRightArrow":"⟶","Longrightarrow":"⟹","looparrowleft":"↫","looparrowright":"↬","lopar":"⦅","Lopf":"𝕃","lopf":"𝕝","loplus":"⨭","lotimes":"⨴","lowast":"∗","lowbar":"_","LowerLeftArrow":"↙","LowerRightArrow":"↘","loz":"◊","lozenge":"◊","lozf":"⧫","lpar":"(","lparlt":"⦓","lrarr":"⇆","lrcorner":"⌟","lrhar":"⇋","lrhard":"⥭","lrm":"‎","lrtri":"⊿","lsaquo":"‹","lscr":"𝓁","Lscr":"ℒ","lsh":"↰","Lsh":"↰","lsim":"≲","lsime":"⪍","lsimg":"⪏","lsqb":"[","lsquo":"‘","lsquor":"‚","Lstrok":"Ł","lstrok":"ł","ltcc":"⪦","ltcir":"⩹","lt":"<","LT":"<","Lt":"≪","ltdot":"⋖","lthree":"⋋","ltimes":"⋉","ltlarr":"⥶","ltquest":"⩻","ltri":"◃","ltrie":"⊴","ltrif":"◂","ltrPar":"⦖","lurdshar":"⥊","luruhar":"⥦","lvertneqq":"≨︀","lvnE":"≨︀","macr":"¯","male":"♂","malt":"✠","maltese":"✠","Map":"⤅","map":"↦","mapsto":"↦","mapstodown":"↧","mapstoleft":"↤","mapstoup":"↥","marker":"▮","mcomma":"⨩","Mcy":"М","mcy":"м","mdash":"—","mDDot":"∺","measuredangle":"∡","MediumSpace":" ","Mellintrf":"ℳ","Mfr":"𝔐","mfr":"𝔪","mho":"℧","micro":"µ","midast":"*","midcir":"⫰","mid":"∣","middot":"·","minusb":"⊟","minus":"−","minusd":"∸","minusdu":"⨪","MinusPlus":"∓","mlcp":"⫛","mldr":"…","mnplus":"∓","models":"⊧","Mopf":"𝕄","mopf":"𝕞","mp":"∓","mscr":"𝓂","Mscr":"ℳ","mstpos":"∾","Mu":"Μ","mu":"μ","multimap":"⊸","mumap":"⊸","nabla":"∇","Nacute":"Ń","nacute":"ń","nang":"∠⃒","nap":"≉","napE":"⩰̸","napid":"≋̸","napos":"ʼn","napprox":"≉","natural":"♮","naturals":"ℕ","natur":"♮","nbsp":" ","nbump":"≎̸","nbumpe":"≏̸","ncap":"⩃","Ncaron":"Ň","ncaron":"ň","Ncedil":"Ņ","ncedil":"ņ","ncong":"≇","ncongdot":"⩭̸","ncup":"⩂","Ncy":"Н","ncy":"н","ndash":"–","nearhk":"⤤","nearr":"↗","neArr":"⇗","nearrow":"↗","ne":"≠","nedot":"≐̸","NegativeMediumSpace":"​","NegativeThickSpace":"​","NegativeThinSpace":"​","NegativeVeryThinSpace":"​","nequiv":"≢","nesear":"⤨","nesim":"≂̸","NestedGreaterGreater":"≫","NestedLessLess":"≪","NewLine":"\n","nexist":"∄","nexists":"∄","Nfr":"𝔑","nfr":"𝔫","ngE":"≧̸","nge":"≱","ngeq":"≱","ngeqq":"≧̸","ngeqslant":"⩾̸","nges":"⩾̸","nGg":"⋙̸","ngsim":"≵","nGt":"≫⃒","ngt":"≯","ngtr":"≯","nGtv":"≫̸","nharr":"↮","nhArr":"⇎","nhpar":"⫲","ni":"∋","nis":"⋼","nisd":"⋺","niv":"∋","NJcy":"Њ","njcy":"њ","nlarr":"↚","nlArr":"⇍","nldr":"‥","nlE":"≦̸","nle":"≰","nleftarrow":"↚","nLeftarrow":"⇍","nleftrightarrow":"↮","nLeftrightarrow":"⇎","nleq":"≰","nleqq":"≦̸","nleqslant":"⩽̸","nles":"⩽̸","nless":"≮","nLl":"⋘̸","nlsim":"≴","nLt":"≪⃒","nlt":"≮","nltri":"⋪","nltrie":"⋬","nLtv":"≪̸","nmid":"∤","NoBreak":"⁠","NonBreakingSpace":" ","nopf":"𝕟","Nopf":"ℕ","Not":"⫬","not":"¬","NotCongruent":"≢","NotCupCap":"≭","NotDoubleVerticalBar":"∦","NotElement":"∉","NotEqual":"≠","NotEqualTilde":"≂̸","NotExists":"∄","NotGreater":"≯","NotGreaterEqual":"≱","NotGreaterFullEqual":"≧̸","NotGreaterGreater":"≫̸","NotGreaterLess":"≹","NotGreaterSlantEqual":"⩾̸","NotGreaterTilde":"≵","NotHumpDownHump":"≎̸","NotHumpEqual":"≏̸","notin":"∉","notindot":"⋵̸","notinE":"⋹̸","notinva":"∉","notinvb":"⋷","notinvc":"⋶","NotLeftTriangleBar":"⧏̸","NotLeftTriangle":"⋪","NotLeftTriangleEqual":"⋬","NotLess":"≮","NotLessEqual":"≰","NotLessGreater":"≸","NotLessLess":"≪̸","NotLessSlantEqual":"⩽̸","NotLessTilde":"≴","NotNestedGreaterGreater":"⪢̸","NotNestedLessLess":"⪡̸","notni":"∌","notniva":"∌","notnivb":"⋾","notnivc":"⋽","NotPrecedes":"⊀","NotPrecedesEqual":"⪯̸","NotPrecedesSlantEqual":"⋠","NotReverseElement":"∌","NotRightTriangleBar":"⧐̸","NotRightTriangle":"⋫","NotRightTriangleEqual":"⋭","NotSquareSubset":"⊏̸","NotSquareSubsetEqual":"⋢","NotSquareSuperset":"⊐̸","NotSquareSupersetEqual":"⋣","NotSubset":"⊂⃒","NotSubsetEqual":"⊈","NotSucceeds":"⊁","NotSucceedsEqual":"⪰̸","NotSucceedsSlantEqual":"⋡","NotSucceedsTilde":"≿̸","NotSuperset":"⊃⃒","NotSupersetEqual":"⊉","NotTilde":"≁","NotTildeEqual":"≄","NotTildeFullEqual":"≇","NotTildeTilde":"≉","NotVerticalBar":"∤","nparallel":"∦","npar":"∦","nparsl":"⫽⃥","npart":"∂̸","npolint":"⨔","npr":"⊀","nprcue":"⋠","nprec":"⊀","npreceq":"⪯̸","npre":"⪯̸","nrarrc":"⤳̸","nrarr":"↛","nrArr":"⇏","nrarrw":"↝̸","nrightarrow":"↛","nRightarrow":"⇏","nrtri":"⋫","nrtrie":"⋭","nsc":"⊁","nsccue":"⋡","nsce":"⪰̸","Nscr":"𝒩","nscr":"𝓃","nshortmid":"∤","nshortparallel":"∦","nsim":"≁","nsime":"≄","nsimeq":"≄","nsmid":"∤","nspar":"∦","nsqsube":"⋢","nsqsupe":"⋣","nsub":"⊄","nsubE":"⫅̸","nsube":"⊈","nsubset":"⊂⃒","nsubseteq":"⊈","nsubseteqq":"⫅̸","nsucc":"⊁","nsucceq":"⪰̸","nsup":"⊅","nsupE":"⫆̸","nsupe":"⊉","nsupset":"⊃⃒","nsupseteq":"⊉","nsupseteqq":"⫆̸","ntgl":"≹","Ntilde":"Ñ","ntilde":"ñ","ntlg":"≸","ntriangleleft":"⋪","ntrianglelefteq":"⋬","ntriangleright":"⋫","ntrianglerighteq":"⋭","Nu":"Ν","nu":"ν","num":"#","numero":"№","numsp":" ","nvap":"≍⃒","nvdash":"⊬","nvDash":"⊭","nVdash":"⊮","nVDash":"⊯","nvge":"≥⃒","nvgt":">⃒","nvHarr":"⤄","nvinfin":"⧞","nvlArr":"⤂","nvle":"≤⃒","nvlt":"<⃒","nvltrie":"⊴⃒","nvrArr":"⤃","nvrtrie":"⊵⃒","nvsim":"∼⃒","nwarhk":"⤣","nwarr":"↖","nwArr":"⇖","nwarrow":"↖","nwnear":"⤧","Oacute":"Ó","oacute":"ó","oast":"⊛","Ocirc":"Ô","ocirc":"ô","ocir":"⊚","Ocy":"О","ocy":"о","odash":"⊝","Odblac":"Ő","odblac":"ő","odiv":"⨸","odot":"⊙","odsold":"⦼","OElig":"Œ","oelig":"œ","ofcir":"⦿","Ofr":"𝔒","ofr":"𝔬","ogon":"˛","Ograve":"Ò","ograve":"ò","ogt":"⧁","ohbar":"⦵","ohm":"Ω","oint":"∮","olarr":"↺","olcir":"⦾","olcross":"⦻","oline":"‾","olt":"⧀","Omacr":"Ō","omacr":"ō","Omega":"Ω","omega":"ω","Omicron":"Ο","omicron":"ο","omid":"⦶","ominus":"⊖","Oopf":"𝕆","oopf":"𝕠","opar":"⦷","OpenCurlyDoubleQuote":"“","OpenCurlyQuote":"‘","operp":"⦹","oplus":"⊕","orarr":"↻","Or":"⩔","or":"∨","ord":"⩝","order":"ℴ","orderof":"ℴ","ordf":"ª","ordm":"º","origof":"⊶","oror":"⩖","orslope":"⩗","orv":"⩛","oS":"Ⓢ","Oscr":"𝒪","oscr":"ℴ","Oslash":"Ø","oslash":"ø","osol":"⊘","Otilde":"Õ","otilde":"õ","otimesas":"⨶","Otimes":"⨷","otimes":"⊗","Ouml":"Ö","ouml":"ö","ovbar":"⌽","OverBar":"‾","OverBrace":"⏞","OverBracket":"⎴","OverParenthesis":"⏜","para":"¶","parallel":"∥","par":"∥","parsim":"⫳","parsl":"⫽","part":"∂","PartialD":"∂","Pcy":"П","pcy":"п","percnt":"%","period":".","permil":"‰","perp":"⊥","pertenk":"‱","Pfr":"𝔓","pfr":"𝔭","Phi":"Φ","phi":"φ","phiv":"ϕ","phmmat":"ℳ","phone":"☎","Pi":"Π","pi":"π","pitchfork":"⋔","piv":"ϖ","planck":"ℏ","planckh":"ℎ","plankv":"ℏ","plusacir":"⨣","plusb":"⊞","pluscir":"⨢","plus":"+","plusdo":"∔","plusdu":"⨥","pluse":"⩲","PlusMinus":"±","plusmn":"±","plussim":"⨦","plustwo":"⨧","pm":"±","Poincareplane":"ℌ","pointint":"⨕","popf":"𝕡","Popf":"ℙ","pound":"£","prap":"⪷","Pr":"⪻","pr":"≺","prcue":"≼","precapprox":"⪷","prec":"≺","preccurlyeq":"≼","Precedes":"≺","PrecedesEqual":"⪯","PrecedesSlantEqual":"≼","PrecedesTilde":"≾","preceq":"⪯","precnapprox":"⪹","precneqq":"⪵","precnsim":"⋨","pre":"⪯","prE":"⪳","precsim":"≾","prime":"′","Prime":"″","primes":"ℙ","prnap":"⪹","prnE":"⪵","prnsim":"⋨","prod":"∏","Product":"∏","profalar":"⌮","profline":"⌒","profsurf":"⌓","prop":"∝","Proportional":"∝","Proportion":"∷","propto":"∝","prsim":"≾","prurel":"⊰","Pscr":"𝒫","pscr":"𝓅","Psi":"Ψ","psi":"ψ","puncsp":" ","Qfr":"𝔔","qfr":"𝔮","qint":"⨌","qopf":"𝕢","Qopf":"ℚ","qprime":"⁗","Qscr":"𝒬","qscr":"𝓆","quaternions":"ℍ","quatint":"⨖","quest":"?","questeq":"≟","quot":"\"","QUOT":"\"","rAarr":"⇛","race":"∽̱","Racute":"Ŕ","racute":"ŕ","radic":"√","raemptyv":"⦳","rang":"⟩","Rang":"⟫","rangd":"⦒","range":"⦥","rangle":"⟩","raquo":"»","rarrap":"⥵","rarrb":"⇥","rarrbfs":"⤠","rarrc":"⤳","rarr":"→","Rarr":"↠","rArr":"⇒","rarrfs":"⤞","rarrhk":"↪","rarrlp":"↬","rarrpl":"⥅","rarrsim":"⥴","Rarrtl":"⤖","rarrtl":"↣","rarrw":"↝","ratail":"⤚","rAtail":"⤜","ratio":"∶","rationals":"ℚ","rbarr":"⤍","rBarr":"⤏","RBarr":"⤐","rbbrk":"❳","rbrace":"}","rbrack":"]","rbrke":"⦌","rbrksld":"⦎","rbrkslu":"⦐","Rcaron":"Ř","rcaron":"ř","Rcedil":"Ŗ","rcedil":"ŗ","rceil":"⌉","rcub":"}","Rcy":"Р","rcy":"р","rdca":"⤷","rdldhar":"⥩","rdquo":"”","rdquor":"”","rdsh":"↳","real":"ℜ","realine":"ℛ","realpart":"ℜ","reals":"ℝ","Re":"ℜ","rect":"▭","reg":"®","REG":"®","ReverseElement":"∋","ReverseEquilibrium":"⇋","ReverseUpEquilibrium":"⥯","rfisht":"⥽","rfloor":"⌋","rfr":"𝔯","Rfr":"ℜ","rHar":"⥤","rhard":"⇁","rharu":"⇀","rharul":"⥬","Rho":"Ρ","rho":"ρ","rhov":"ϱ","RightAngleBracket":"⟩","RightArrowBar":"⇥","rightarrow":"→","RightArrow":"→","Rightarrow":"⇒","RightArrowLeftArrow":"⇄","rightarrowtail":"↣","RightCeiling":"⌉","RightDoubleBracket":"⟧","RightDownTeeVector":"⥝","RightDownVectorBar":"⥕","RightDownVector":"⇂","RightFloor":"⌋","rightharpoondown":"⇁","rightharpoonup":"⇀","rightleftarrows":"⇄","rightleftharpoons":"⇌","rightrightarrows":"⇉","rightsquigarrow":"↝","RightTeeArrow":"↦","RightTee":"⊢","RightTeeVector":"⥛","rightthreetimes":"⋌","RightTriangleBar":"⧐","RightTriangle":"⊳","RightTriangleEqual":"⊵","RightUpDownVector":"⥏","RightUpTeeVector":"⥜","RightUpVectorBar":"⥔","RightUpVector":"↾","RightVectorBar":"⥓","RightVector":"⇀","ring":"˚","risingdotseq":"≓","rlarr":"⇄","rlhar":"⇌","rlm":"‏","rmoustache":"⎱","rmoust":"⎱","rnmid":"⫮","roang":"⟭","roarr":"⇾","robrk":"⟧","ropar":"⦆","ropf":"𝕣","Ropf":"ℝ","roplus":"⨮","rotimes":"⨵","RoundImplies":"⥰","rpar":")","rpargt":"⦔","rppolint":"⨒","rrarr":"⇉","Rrightarrow":"⇛","rsaquo":"›","rscr":"𝓇","Rscr":"ℛ","rsh":"↱","Rsh":"↱","rsqb":"]","rsquo":"’","rsquor":"’","rthree":"⋌","rtimes":"⋊","rtri":"▹","rtrie":"⊵","rtrif":"▸","rtriltri":"⧎","RuleDelayed":"⧴","ruluhar":"⥨","rx":"℞","Sacute":"Ś","sacute":"ś","sbquo":"‚","scap":"⪸","Scaron":"Š","scaron":"š","Sc":"⪼","sc":"≻","sccue":"≽","sce":"⪰","scE":"⪴","Scedil":"Ş","scedil":"ş","Scirc":"Ŝ","scirc":"ŝ","scnap":"⪺","scnE":"⪶","scnsim":"⋩","scpolint":"⨓","scsim":"≿","Scy":"С","scy":"с","sdotb":"⊡","sdot":"⋅","sdote":"⩦","searhk":"⤥","searr":"↘","seArr":"⇘","searrow":"↘","sect":"§","semi":";","seswar":"⤩","setminus":"∖","setmn":"∖","sext":"✶","Sfr":"𝔖","sfr":"𝔰","sfrown":"⌢","sharp":"♯","SHCHcy":"Щ","shchcy":"щ","SHcy":"Ш","shcy":"ш","ShortDownArrow":"↓","ShortLeftArrow":"←","shortmid":"∣","shortparallel":"∥","ShortRightArrow":"→","ShortUpArrow":"↑","shy":"­","Sigma":"Σ","sigma":"σ","sigmaf":"ς","sigmav":"ς","sim":"∼","simdot":"⩪","sime":"≃","simeq":"≃","simg":"⪞","simgE":"⪠","siml":"⪝","simlE":"⪟","simne":"≆","simplus":"⨤","simrarr":"⥲","slarr":"←","SmallCircle":"∘","smallsetminus":"∖","smashp":"⨳","smeparsl":"⧤","smid":"∣","smile":"⌣","smt":"⪪","smte":"⪬","smtes":"⪬︀","SOFTcy":"Ь","softcy":"ь","solbar":"⌿","solb":"⧄","sol":"/","Sopf":"𝕊","sopf":"𝕤","spades":"♠","spadesuit":"♠","spar":"∥","sqcap":"⊓","sqcaps":"⊓︀","sqcup":"⊔","sqcups":"⊔︀","Sqrt":"√","sqsub":"⊏","sqsube":"⊑","sqsubset":"⊏","sqsubseteq":"⊑","sqsup":"⊐","sqsupe":"⊒","sqsupset":"⊐","sqsupseteq":"⊒","square":"□","Square":"□","SquareIntersection":"⊓","SquareSubset":"⊏","SquareSubsetEqual":"⊑","SquareSuperset":"⊐","SquareSupersetEqual":"⊒","SquareUnion":"⊔","squarf":"▪","squ":"□","squf":"▪","srarr":"→","Sscr":"𝒮","sscr":"𝓈","ssetmn":"∖","ssmile":"⌣","sstarf":"⋆","Star":"⋆","star":"☆","starf":"★","straightepsilon":"ϵ","straightphi":"ϕ","strns":"¯","sub":"⊂","Sub":"⋐","subdot":"⪽","subE":"⫅","sube":"⊆","subedot":"⫃","submult":"⫁","subnE":"⫋","subne":"⊊","subplus":"⪿","subrarr":"⥹","subset":"⊂","Subset":"⋐","subseteq":"⊆","subseteqq":"⫅","SubsetEqual":"⊆","subsetneq":"⊊","subsetneqq":"⫋","subsim":"⫇","subsub":"⫕","subsup":"⫓","succapprox":"⪸","succ":"≻","succcurlyeq":"≽","Succeeds":"≻","SucceedsEqual":"⪰","SucceedsSlantEqual":"≽","SucceedsTilde":"≿","succeq":"⪰","succnapprox":"⪺","succneqq":"⪶","succnsim":"⋩","succsim":"≿","SuchThat":"∋","sum":"∑","Sum":"∑","sung":"♪","sup1":"¹","sup2":"²","sup3":"³","sup":"⊃","Sup":"⋑","supdot":"⪾","supdsub":"⫘","supE":"⫆","supe":"⊇","supedot":"⫄","Superset":"⊃","SupersetEqual":"⊇","suphsol":"⟉","suphsub":"⫗","suplarr":"⥻","supmult":"⫂","supnE":"⫌","supne":"⊋","supplus":"⫀","supset":"⊃","Supset":"⋑","supseteq":"⊇","supseteqq":"⫆","supsetneq":"⊋","supsetneqq":"⫌","supsim":"⫈","supsub":"⫔","supsup":"⫖","swarhk":"⤦","swarr":"↙","swArr":"⇙","swarrow":"↙","swnwar":"⤪","szlig":"ß","Tab":"\t","target":"⌖","Tau":"Τ","tau":"τ","tbrk":"⎴","Tcaron":"Ť","tcaron":"ť","Tcedil":"Ţ","tcedil":"ţ","Tcy":"Т","tcy":"т","tdot":"⃛","telrec":"⌕","Tfr":"𝔗","tfr":"𝔱","there4":"∴","therefore":"∴","Therefore":"∴","Theta":"Θ","theta":"θ","thetasym":"ϑ","thetav":"ϑ","thickapprox":"≈","thicksim":"∼","ThickSpace":"  ","ThinSpace":" ","thinsp":" ","thkap":"≈","thksim":"∼","THORN":"Þ","thorn":"þ","tilde":"˜","Tilde":"∼","TildeEqual":"≃","TildeFullEqual":"≅","TildeTilde":"≈","timesbar":"⨱","timesb":"⊠","times":"×","timesd":"⨰","tint":"∭","toea":"⤨","topbot":"⌶","topcir":"⫱","top":"⊤","Topf":"𝕋","topf":"𝕥","topfork":"⫚","tosa":"⤩","tprime":"‴","trade":"™","TRADE":"™","triangle":"▵","triangledown":"▿","triangleleft":"◃","trianglelefteq":"⊴","triangleq":"≜","triangleright":"▹","trianglerighteq":"⊵","tridot":"◬","trie":"≜","triminus":"⨺","TripleDot":"⃛","triplus":"⨹","trisb":"⧍","tritime":"⨻","trpezium":"⏢","Tscr":"𝒯","tscr":"𝓉","TScy":"Ц","tscy":"ц","TSHcy":"Ћ","tshcy":"ћ","Tstrok":"Ŧ","tstrok":"ŧ","twixt":"≬","twoheadleftarrow":"↞","twoheadrightarrow":"↠","Uacute":"Ú","uacute":"ú","uarr":"↑","Uarr":"↟","uArr":"⇑","Uarrocir":"⥉","Ubrcy":"Ў","ubrcy":"ў","Ubreve":"Ŭ","ubreve":"ŭ","Ucirc":"Û","ucirc":"û","Ucy":"У","ucy":"у","udarr":"⇅","Udblac":"Ű","udblac":"ű","udhar":"⥮","ufisht":"⥾","Ufr":"𝔘","ufr":"𝔲","Ugrave":"Ù","ugrave":"ù","uHar":"⥣","uharl":"↿","uharr":"↾","uhblk":"▀","ulcorn":"⌜","ulcorner":"⌜","ulcrop":"⌏","ultri":"◸","Umacr":"Ū","umacr":"ū","uml":"¨","UnderBar":"_","UnderBrace":"⏟","UnderBracket":"⎵","UnderParenthesis":"⏝","Union":"⋃","UnionPlus":"⊎","Uogon":"Ų","uogon":"ų","Uopf":"𝕌","uopf":"𝕦","UpArrowBar":"⤒","uparrow":"↑","UpArrow":"↑","Uparrow":"⇑","UpArrowDownArrow":"⇅","updownarrow":"↕","UpDownArrow":"↕","Updownarrow":"⇕","UpEquilibrium":"⥮","upharpoonleft":"↿","upharpoonright":"↾","uplus":"⊎","UpperLeftArrow":"↖","UpperRightArrow":"↗","upsi":"υ","Upsi":"ϒ","upsih":"ϒ","Upsilon":"Υ","upsilon":"υ","UpTeeArrow":"↥","UpTee":"⊥","upuparrows":"⇈","urcorn":"⌝","urcorner":"⌝","urcrop":"⌎","Uring":"Ů","uring":"ů","urtri":"◹","Uscr":"𝒰","uscr":"𝓊","utdot":"⋰","Utilde":"Ũ","utilde":"ũ","utri":"▵","utrif":"▴","uuarr":"⇈","Uuml":"Ü","uuml":"ü","uwangle":"⦧","vangrt":"⦜","varepsilon":"ϵ","varkappa":"ϰ","varnothing":"∅","varphi":"ϕ","varpi":"ϖ","varpropto":"∝","varr":"↕","vArr":"⇕","varrho":"ϱ","varsigma":"ς","varsubsetneq":"⊊︀","varsubsetneqq":"⫋︀","varsupsetneq":"⊋︀","varsupsetneqq":"⫌︀","vartheta":"ϑ","vartriangleleft":"⊲","vartriangleright":"⊳","vBar":"⫨","Vbar":"⫫","vBarv":"⫩","Vcy":"В","vcy":"в","vdash":"⊢","vDash":"⊨","Vdash":"⊩","VDash":"⊫","Vdashl":"⫦","veebar":"⊻","vee":"∨","Vee":"⋁","veeeq":"≚","vellip":"⋮","verbar":"|","Verbar":"‖","vert":"|","Vert":"‖","VerticalBar":"∣","VerticalLine":"|","VerticalSeparator":"❘","VerticalTilde":"≀","VeryThinSpace":" ","Vfr":"𝔙","vfr":"𝔳","vltri":"⊲","vnsub":"⊂⃒","vnsup":"⊃⃒","Vopf":"𝕍","vopf":"𝕧","vprop":"∝","vrtri":"⊳","Vscr":"𝒱","vscr":"𝓋","vsubnE":"⫋︀","vsubne":"⊊︀","vsupnE":"⫌︀","vsupne":"⊋︀","Vvdash":"⊪","vzigzag":"⦚","Wcirc":"Ŵ","wcirc":"ŵ","wedbar":"⩟","wedge":"∧","Wedge":"⋀","wedgeq":"≙","weierp":"℘","Wfr":"𝔚","wfr":"𝔴","Wopf":"𝕎","wopf":"𝕨","wp":"℘","wr":"≀","wreath":"≀","Wscr":"𝒲","wscr":"𝓌","xcap":"⋂","xcirc":"◯","xcup":"⋃","xdtri":"▽","Xfr":"𝔛","xfr":"𝔵","xharr":"⟷","xhArr":"⟺","Xi":"Ξ","xi":"ξ","xlarr":"⟵","xlArr":"⟸","xmap":"⟼","xnis":"⋻","xodot":"⨀","Xopf":"𝕏","xopf":"𝕩","xoplus":"⨁","xotime":"⨂","xrarr":"⟶","xrArr":"⟹","Xscr":"𝒳","xscr":"𝓍","xsqcup":"⨆","xuplus":"⨄","xutri":"△","xvee":"⋁","xwedge":"⋀","Yacute":"Ý","yacute":"ý","YAcy":"Я","yacy":"я","Ycirc":"Ŷ","ycirc":"ŷ","Ycy":"Ы","ycy":"ы","yen":"¥","Yfr":"𝔜","yfr":"𝔶","YIcy":"Ї","yicy":"ї","Yopf":"𝕐","yopf":"𝕪","Yscr":"𝒴","yscr":"𝓎","YUcy":"Ю","yucy":"ю","yuml":"ÿ","Yuml":"Ÿ","Zacute":"Ź","zacute":"ź","Zcaron":"Ž","zcaron":"ž","Zcy":"З","zcy":"з","Zdot":"Ż","zdot":"ż","zeetrf":"ℨ","ZeroWidthSpace":"​","Zeta":"Ζ","zeta":"ζ","zfr":"𝔷","Zfr":"ℨ","ZHcy":"Ж","zhcy":"ж","zigrarr":"⇝","zopf":"𝕫","Zopf":"ℤ","Zscr":"𝒵","zscr":"𝓏","zwj":"‍","zwnj":"‌"}
diff --git a/node_modules/css-select/node_modules/entities/lib/maps/legacy.json b/node_modules/css-select/node_modules/entities/lib/maps/legacy.json
new file mode 100644
index 0000000..43dbea6
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/lib/maps/legacy.json
@@ -0,0 +1 @@
+{"Aacute":"Á","aacute":"á","Acirc":"Â","acirc":"â","acute":"´","AElig":"Æ","aelig":"æ","Agrave":"À","agrave":"à","amp":"&","AMP":"&","Aring":"Å","aring":"å","Atilde":"Ã","atilde":"ã","Auml":"Ä","auml":"ä","brvbar":"¦","Ccedil":"Ç","ccedil":"ç","cedil":"¸","cent":"¢","copy":"©","COPY":"©","curren":"¤","deg":"°","divide":"÷","Eacute":"É","eacute":"é","Ecirc":"Ê","ecirc":"ê","Egrave":"È","egrave":"è","ETH":"Ð","eth":"ð","Euml":"Ë","euml":"ë","frac12":"½","frac14":"¼","frac34":"¾","gt":">","GT":">","Iacute":"Í","iacute":"í","Icirc":"Î","icirc":"î","iexcl":"¡","Igrave":"Ì","igrave":"ì","iquest":"¿","Iuml":"Ï","iuml":"ï","laquo":"«","lt":"<","LT":"<","macr":"¯","micro":"µ","middot":"·","nbsp":" ","not":"¬","Ntilde":"Ñ","ntilde":"ñ","Oacute":"Ó","oacute":"ó","Ocirc":"Ô","ocirc":"ô","Ograve":"Ò","ograve":"ò","ordf":"ª","ordm":"º","Oslash":"Ø","oslash":"ø","Otilde":"Õ","otilde":"õ","Ouml":"Ö","ouml":"ö","para":"¶","plusmn":"±","pound":"£","quot":"\"","QUOT":"\"","raquo":"»","reg":"®","REG":"®","sect":"§","shy":"­","sup1":"¹","sup2":"²","sup3":"³","szlig":"ß","THORN":"Þ","thorn":"þ","times":"×","Uacute":"Ú","uacute":"ú","Ucirc":"Û","ucirc":"û","Ugrave":"Ù","ugrave":"ù","uml":"¨","Uuml":"Ü","uuml":"ü","Yacute":"Ý","yacute":"ý","yen":"¥","yuml":"ÿ"}
diff --git a/node_modules/css-select/node_modules/entities/lib/maps/xml.json b/node_modules/css-select/node_modules/entities/lib/maps/xml.json
new file mode 100644
index 0000000..de8db10
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/lib/maps/xml.json
@@ -0,0 +1 @@
+{"amp":"&","apos":"'","gt":">","lt":"<","quot":"\""}
diff --git a/node_modules/css-select/node_modules/entities/package.json b/node_modules/css-select/node_modules/entities/package.json
new file mode 100644
index 0000000..7660032
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/package.json
@@ -0,0 +1,64 @@
+{
+  "name": "entities",
+  "version": "2.2.0",
+  "description": "Encode & decode XML and HTML entities with ease",
+  "author": "Felix Boehm <me@feedic.com>",
+  "funding": "https://github.com/fb55/entities?sponsor=1",
+  "sideEffects": false,
+  "keywords": [
+    "entity",
+    "decoding",
+    "encoding",
+    "html",
+    "xml",
+    "html entities"
+  ],
+  "directories": {
+    "lib": "lib/"
+  },
+  "main": "lib/index.js",
+  "types": "lib/index.d.ts",
+  "files": [
+    "lib/**/*"
+  ],
+  "devDependencies": {
+    "@types/jest": "^26.0.0",
+    "@types/node": "^14.11.8",
+    "@typescript-eslint/eslint-plugin": "^4.4.1",
+    "@typescript-eslint/parser": "^4.4.1",
+    "coveralls": "*",
+    "eslint": "^7.11.0",
+    "eslint-config-prettier": "^7.0.0",
+    "eslint-plugin-node": "^11.1.0",
+    "jest": "^26.5.3",
+    "prettier": "^2.0.5",
+    "ts-jest": "^26.1.0",
+    "typescript": "^4.0.2"
+  },
+  "scripts": {
+    "test": "jest --coverage && npm run lint",
+    "coverage": "cat coverage/lcov.info | coveralls",
+    "lint": "npm run lint:es && npm run lint:prettier",
+    "lint:es": "eslint .",
+    "lint:prettier": "npm run prettier -- --check",
+    "format": "npm run format:es && npm run format:prettier",
+    "format:es": "npm run lint:es -- --fix",
+    "format:prettier": "npm run prettier -- --write",
+    "prettier": "prettier '**/*.{ts,md,json,yml}'",
+    "build": "tsc && cp -r src/maps lib",
+    "prepare": "npm run build"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/fb55/entities.git"
+  },
+  "license": "BSD-2-Clause",
+  "jest": {
+    "preset": "ts-jest",
+    "testEnvironment": "node"
+  },
+  "prettier": {
+    "tabWidth": 4,
+    "proseWrap": "always"
+  }
+}
diff --git a/node_modules/css-select/node_modules/entities/readme.md b/node_modules/css-select/node_modules/entities/readme.md
new file mode 100644
index 0000000..f69264a
--- /dev/null
+++ b/node_modules/css-select/node_modules/entities/readme.md
@@ -0,0 +1,57 @@
+# entities [![NPM version](http://img.shields.io/npm/v/entities.svg)](https://npmjs.org/package/entities) [![Downloads](https://img.shields.io/npm/dm/entities.svg)](https://npmjs.org/package/entities) [![Build Status](http://img.shields.io/travis/fb55/entities.svg)](http://travis-ci.org/fb55/entities) [![Coverage](http://img.shields.io/coveralls/fb55/entities.svg)](https://coveralls.io/r/fb55/entities)
+
+Encode & decode HTML & XML entities with ease & speed.
+
+## How to…
+
+### …install `entities`
+
+    npm install entities
+
+### …use `entities`
+
+```javascript
+const entities = require("entities");
+
+//encoding
+entities.escape("&#38;"); // "&#x26;#38;"
+entities.encodeXML("&#38;"); // "&amp;#38;"
+entities.encodeHTML("&#38;"); // "&amp;&num;38&semi;"
+
+//decoding
+entities.decodeXML("asdf &amp; &#xFF; &#xFC; &apos;"); // "asdf & ÿ ü '"
+entities.decodeHTML("asdf &amp; &yuml; &uuml; &apos;"); // "asdf & ÿ ü '"
+```
+
+## Performance
+
+This is how `entities` compares to other libraries on a very basic benchmark
+(see `scripts/benchmark.ts`, for 10,000,000 iterations):
+
+| Library        | `decode` performance | `encode` performance | Bundle size                                                                |
+| -------------- | -------------------- | -------------------- | -------------------------------------------------------------------------- |
+| entities       | 10.809s              | 17.683s              | ![npm bundle size](https://img.shields.io/bundlephobia/min/entities)       |
+| html-entities  | 14.029s              | 22.670s              | ![npm bundle size](https://img.shields.io/bundlephobia/min/html-entities)  |
+| he             | 16.163s              | 44.010s              | ![npm bundle size](https://img.shields.io/bundlephobia/min/he)             |
+| parse-entities | 28.507s              | N/A                  | ![npm bundle size](https://img.shields.io/bundlephobia/min/parse-entities) |
+
+---
+
+License: BSD-2-Clause
+
+## Security contact information
+
+To report a security vulnerability, please use the
+[Tidelift security contact](https://tidelift.com/security). Tidelift will
+coordinate the fix and disclosure.
+
+## `entities` for enterprise
+
+Available as part of the Tidelift Subscription
+
+The maintainers of `entities` and thousands of other packages are working with
+Tidelift to deliver commercial support and maintenance for the open source
+dependencies you use to build your applications. Save time, reduce risk, and
+improve code health, while paying the maintainers of the exact dependencies you
+use.
+[Learn more.](https://tidelift.com/subscription/pkg/npm-entities?utm_source=npm-entities&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
diff --git a/node_modules/css-select/package.json b/node_modules/css-select/package.json
new file mode 100644
index 0000000..092f254
--- /dev/null
+++ b/node_modules/css-select/package.json
@@ -0,0 +1,69 @@
+{
+  "name": "css-select",
+  "version": "3.1.2",
+  "description": "a CSS selector compiler/engine",
+  "author": "Felix Boehm <me@feedic.com>",
+  "funding": {
+    "url": "https://github.com/sponsors/fb55"
+  },
+  "keywords": [
+    "css",
+    "selector",
+    "sizzle"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/fb55/css-select.git"
+  },
+  "main": "lib/index.js",
+  "types": "lib/index.d.ts",
+  "files": [
+    "lib"
+  ],
+  "dependencies": {
+    "boolbase": "^1.0.0",
+    "css-what": "^4.0.0",
+    "domhandler": "^4.0.0",
+    "domutils": "^2.4.3",
+    "nth-check": "^2.0.0"
+  },
+  "devDependencies": {
+    "@types/jest": "^26.0.14",
+    "@types/node": "^14.0.5",
+    "@typescript-eslint/eslint-plugin": "^4.1.0",
+    "@typescript-eslint/parser": "^4.1.0",
+    "cheerio-soupselect": "^0.1.1",
+    "coveralls": "^3.0.2",
+    "eslint": "^7.9.0",
+    "eslint-config-prettier": "^7.0.0",
+    "htmlparser2": "^6.0.0",
+    "jest": "^26.4.2",
+    "prettier": "^2.1.2",
+    "ts-jest": "^26.4.0",
+    "typescript": "^4.0.2"
+  },
+  "scripts": {
+    "test": "jest --coverage && npm run lint",
+    "coverage": "cat coverage/lcov.info | coveralls",
+    "lint": "npm run lint:es && npm run lint:prettier",
+    "lint:es": "eslint src",
+    "lint:prettier": "npm run prettier -- --check",
+    "format": "npm run format:es && npm run format:prettier",
+    "format:es": "npm run lint:es -- --fix",
+    "format:prettier": "npm run prettier -- --write",
+    "prettier": "prettier '**/*.{ts,md,json,yml}'",
+    "build": "tsc",
+    "prepare": "npm run build"
+  },
+  "license": "BSD-2-Clause",
+  "prettier": {
+    "tabWidth": 4
+  },
+  "jest": {
+    "preset": "ts-jest",
+    "testEnvironment": "node",
+    "testMatch": [
+      "<rootDir>/test/*.ts"
+    ]
+  }
+}
diff --git a/node_modules/css-tree/CHANGELOG.md b/node_modules/css-tree/CHANGELOG.md
new file mode 100644
index 0000000..31051c5
--- /dev/null
+++ b/node_modules/css-tree/CHANGELOG.md
@@ -0,0 +1,590 @@
+## 1.1.3 (March 31, 2021)
+
+- Fixed matching on CSS wide keywords for at-rule's prelude and descriptors
+- Added `fit-content` to `width` property patch as browsers are supported it as a keyword (nonstandard), but spec defines it as a function
+- Fixed parsing a value contains parentheses or brackets and `parseValue` option is set to `false`, in that case `!important` was included into a value but must not (#155)
+
+## 1.1.2 (November 26, 2020)
+
+- Rolled back to use spread syntax in object literals since it not supported by nodejs < 8.3 (#145)
+
+## 1.1.1 (November 18, 2020)
+
+- Fixed edge cases in mismatch location computation for `SyntaxMatchError`
+
+## 1.1.0 (November 17, 2020)
+
+- Bumped `mdn-data` to 2.0.14
+- Extended `fork()` method to allow append syntax instead of overriding for `types`, `properties` and `atrules`, e.g. `csstree.fork({ types: { color: '| foo | bar' } })`
+- Extended lexer API for validation
+    - Added `Lexer#checkAtruleName(atruleName)`, `Lexer#checkAtrulePrelude(atruleName, prelude)`, `Lexer#checkAtruleDescriptorName(atruleName, descriptorName)` and `Lexer#checkPropertyName(propertyName)`
+    - Added `Lexer#getAtrule(atruleName, fallbackBasename)` method
+    - Extended `Lexer#getAtrulePrelude()` and `Lexer#getProperty()` methods to take `fallbackBasename` parameter
+    - Improved `SyntaxMatchError` location details
+    - Changed error messages
+
+## 1.0.1 (November 11, 2020)
+
+- Fixed edge cases for parsing of custom property value with a single whitespace when `parseCustomProperty:true`
+
+## 1.0.0 (October 27, 2020)
+
+- Added `onComment` option to parser config
+- Added support for `break` and `skip` values in `walk()` to control traversal
+- Added `List#reduce()` and `List#reduceRight()` methods
+- Bumped `mdn-data` to 2.0.12
+- Exposed version of the lib (i.e. `import { version } from 'css-tree'`)
+- Fixed `Lexer#dump()` to dump atrules syntaxes as well
+- Fixed matching comma separated `<urange>` list (#135)
+- Renamed `HexColor` node type into `Hash`
+- Removed `element()` specific parsing rules
+- Removed `dist/default-syntax.json` from package
+
+## 1.0.0-alpha.39 (December 5, 2019)
+
+- Fixed walker with `visit: "Declaration"` to iterate `DeclarationList` (#114)
+
+## 1.0.0-alpha.38 (November 25, 2019)
+
+- Bumped `mdn-data` to `2.0.6`
+- Added initial implmentation for at-rule matching via `Lexer#matchAtrulePrelude()` and `Lexer#matchAtruleDescriptor()` methods
+- Added `-moz-control-character-visibility`, `-ms-grid-columns`, `-ms-grid-rows` and `-ms-hyphenate-limit-last` properties to patch (#111)
+- Added `flow`, `flow-root` and `table-caption` values to patched `display` (#112)
+
+## 1.0.0-alpha.37 (October 22, 2019)
+
+- Bumped `source-map` version to `^0.6.1` to fix source map generation inconsistency across node.js versions due to mappings sorting bug and v8 moving to [a stable Array#sort](https://v8.dev/blog/array-sort) ([fix commit](https://github.com/mozilla/source-map/commit/f35a2e4212dd025cb5e1fc219e7ac8a4b96c2cc9) in `source-map`)
+
+## 1.0.0-alpha.36 (October 13, 2019)
+
+- Dropped support for Node < 8
+- Updated dev deps (fixed `npm audit` issues)
+- Reworked build pipeline
+    - Package provides `dist/csstree.js` and `dist/csstree.min.js` now (instead of single `dist/csstree.js` that was a min version)
+    - Bundle size (min version) reduced from 191Kb to 158Kb due to some optimisations
+- Definition syntax
+    - Renamed `grammar` into `definitionSyntax` (named per spec)
+    - Added `compact` option to `generate()` method to avoid formatting (spaces) when possible
+- Lexer
+    - Changed `dump()` method to produce syntaxes in compact form by default
+
+## 1.0.0-alpha.35 (October 7, 2019)
+
+- Walker
+    - Changed implementation to avoid runtime compilation due to CSP issues (see #91, #109)
+    - Added `find()`, `findLast()` and `findAll()` methods (e.g. `csstree.find(ast, node => node.type === 'ClassSelector')`)
+
+## 1.0.0-alpha.34 (July 27, 2019)
+
+- Tokenizer
+    - Added `isBOM()` function
+    - Added `charCodeCategory()` function
+    - Removed `firstCharOffset()` function (use `isBOM()` instead)
+    - Removed `CHARCODE` dictionary
+    - Removed `INPUT_STREAM_CODE*` dictionaries
+- Lexer
+    - Allowed comments in matching value (just ignore them like whitespaces)
+    - Increased iteration count in value matching from 10k up to 15k
+    - Fixed missed `debugger` (#104)
+
+## 1.0.0-alpha.33 (July 11, 2019)
+
+- Lexer
+    - Fixed low priority productions matching by changing an approach for robust one (#103)
+
+## 1.0.0-alpha.32 (July 11, 2019)
+
+- Lexer
+    - Fixed low priority productions matching in long `||-` and `&&-` groups (#103)
+
+## 1.0.0-alpha.31 (July 11, 2019)
+
+- Bumped `mdn/data` to `2.0.4` (#99)
+- Lexer
+    - Added [bracketed range notation](https://drafts.csswg.org/css-values-4/#numeric-ranges) support and related refactoring
+    - Removed `<number-zero-one>`, `<number-one-or-greater>` and `<positive-integer>` from generic types. In fact, types moved to patch, because those types can be expressed in a regular grammar due to bracketed range notation implemented
+    - Added support for multiple token string matching
+    - Improved `<custom-ident>` production matching to claim the keyword only if no other unfulfilled production can claim it (#101)
+    - Improved `<length>` production matching to claim "unitless zero" only if no other unfulfilled production can claim it
+    - Changed lexer's constructor to prevent generic types override when used
+    - Fixed large `||`- and `&&`-group matching, matching continues from the beginning on term match (#85)
+    - Fixed checking that value has `var()` occurrences when value is a string (such values can't be matched on syntax currently and fail with specific error that can be used for ignorance in validation tools)
+    - Fixed `<declaration-value>` and `<any-value>` matching when a value contains a function, parentheses or braces
+
+## 1.0.0-alpha.30 (July 3, 2019)
+
+- Bumped `mdn/data` to `~2.0.3`
+    - Removed type removals from `mdn/data` due to lack of some generic types and specific lexer restictions (since lexer was reworked, see below)
+    - Reduced and updated patches
+- Tokenizer
+    - Reworked tokenizer itself to compliment [CSS Syntax Module Level 3](https://drafts.csswg.org/css-syntax/#tokenization)
+    - `Tokenizer` class splitted into several abstractions:
+        - Added `TokenStream` class
+        - Added `OffsetToLocation` class
+        - Added `tokenize()` function that creates `TokenStream` instance for given string or updates a `TokenStream` instance passed as second parameter
+        - Removed `Tokenizer` class
+    - Removed `Raw` token type
+    - Renamed `Identifier` token type to `Ident`
+    - Added token types: `Hash`, `BadString`, `BadUrl`, `Delim`, `Percentage`, `Dimension`, `Colon`, `Semicolon`, `Comma`, `LeftSquareBracket`, `RightSquareBracket`, `LeftParenthesis`, `RightParenthesis`, `LeftCurlyBracket`, `RightCurlyBracket`
+    - Replaced `Punctuator` with `Delim` token type, that excludes specific characters with its own token type like `Colon`, `Semicolon` etc
+    - Removed `findCommentEnd`, `findStringEnd`, `findDecimalNumberEnd`, `findNumberEnd`, `findEscapeEnd`, `findIdentifierEnd` and `findUrlRawEnd` helper function
+    - Removed `SYMBOL_TYPE`, `PUNCTUATION` and `STOP_URL_RAW` dictionaries
+    - Added `isDigit`, `isHexDigit`, `isUppercaseLetter`, `isLowercaseLetter`, `isLetter`, `isNonAscii`, `isNameStart`, `isName`, `isNonPrintable`, `isNewline`, `isWhiteSpace`, `isValidEscape`, `isIdentifierStart`, `isNumberStart`, `consumeEscaped`, `consumeName`, `consumeNumber` and `consumeBadUrlRemnants` helper functions
+- Parser
+    - Changed parsing algorithms to work with new token type set
+    - Changed `HexColor` consumption in way to relax checking a value, i.e. now `value` is a sequence of one or more name chars
+    - Added `&` as a property hack
+    - Relaxed `var()` parsing to only check that a first arguments is an identifier (not a custom property name as before)
+- Lexer
+    - Reworked syntax matching to relay on token set only (having AST is optional now)
+    - Extended `Lexer#match()`, `Lexer#matchType()` and `Lexer#matchProperty()` methods to take a string as value, beside AST as a value
+    - Extended `Lexer#match()` method to take a string as a syntax, beside of syntax descriptor
+    - Reworked generic types:
+        - Removed `<attr()>`, `<url>` (moved to patch) and `<progid>` types
+        - Added types:
+            - Related to token types: `<ident-token>`, `<function-token>`, `<at-keyword-token>`, `<hash-token>`, `<string-token>`, `<bad-string-token>`, `<url-token>`, `<bad-url-token>`, `<delim-token>`, `<number-token>`, `<percentage-token>`, `<dimension-token>`, `<whitespace-token>`, `<CDO-token>`, `<CDC-token>`, `<colon-token>`, `<semicolon-token>`, `<comma-token>`, `<[-token>`, `<]-token>`, `<(-token>`, `<)-token>`, `<{-token>` and `<}-token>`
+            - Complex types: `<an-plus-b>`, `<urange>`, `<custom-property-name>`, `<declaration-value>`, `<any-value>` and `<zero>`
+        - Renamed `<unicode-range>` to `<urange>` as per spec
+        - Renamed `<expression>` (IE legacy extension) to `<-ms-legacy-expression>` and may to be removed in next releases
+
+## 1.0.0-alpha.29 (May 30, 2018)
+
+- Lexer
+    - Syntax matching was completely reworked. Now it's token-based and uses state machine. Public API has not changed. However, some internal data structures have changed. Most significal change in syntax match result tree structure, it's became token-based instead of node-based.
+    - Grammar
+        - Changed grammar tree format:
+            - Added `Token` node type to represent a single code point (`<delim-token>`)
+            - Added `Multiplier` that wraps a single node (`term` property)
+            - Added `AtKeyword` to represent `<at-keyword-token>`
+            - Removed `Slash` and `Percent` node types, they are replaced for a node with `Token` type
+            - Changed `Function` to represent `<function-token>` with no children
+            - Removed `multiplier` property from `Group`
+        - Changed `generate()` method:
+            - Method takes an `options` as second argument now (`generate(node, forceBraces, decorator)` -> `generate(node, options)`). Two options are supported: `forceBraces` and `decorator`
+            - When a second parameter is a function it treats as `decorate` option value, i.e. `generate(node, fn)` -> `generate(node, { decorate: fn })`
+            - Decorate function invokes with additional parameter – a reference to a node
+- Tokenizer
+    - Renamed `Atrule` const to `AtKeyword`
+
+## 1.0.0-alpha.28 (February 19, 2018)
+
+- Renamed `lexer.grammar.translate()` method into `generate()`
+- Fixed `<'-webkit-font-smoothing'>` and `<'-moz-osx-font-smoothing'>` syntaxes (#75)
+- Added vendor keywords for `<'overflow'>` property syntax (#76)
+- Pinned `mdn-data` to `~1.1.0` and fixed issues with some updated property syntaxes
+
+## 1.0.0-alpha.27 (January 14, 2018)
+
+- Generator
+    - Changed node's `generate()` methods invocation, methods now take a node as a single argument and context (i.e. `this`) that have methods: `chunk()`, `node()` and `children()`
+    - Renamed `translate()` to `generate()` and changed to take `options` argument
+    - Removed `translateMarkup(ast, enter, leave)` method, use `generate(ast, { decorator: (handlers) => { ... }})` instead
+    - Removed `translateWithSourceMap(ast)`, use `generate(ast, { sourceMap: true })` instead
+    - Changed to support for children as an array
+- Walker
+    - Changed `walk()` to take an `options` argument instead of handler, with `enter`, `leave`, `visit` and `reverse` options (`walk(ast, fn)` is still works and equivalent to `walk(ast, { enter: fn })`)
+    - Removed `walkUp(ast, fn)`, use `walk(ast, { leave: fn })`
+    - Removed `walkRules(ast, fn)`, use `walk(ast, { visit: 'Rule', enter: fn })` instead
+    - Removed `walkRulesRight(ast, fn)`, use `walk(ast, { visit: 'Rule', reverse: true, enter: fn })` instead
+    - Removed `walkDeclarations(ast, fn)`, use `walk(ast, { visit: 'Declaration', enter: fn })` instead
+    - Changed to support for children as array in most cases (`reverse: true` will fail on arrays since they have no `forEachRight()` method)
+- Misc
+    - List
+        - Added `List#forEach()` method
+        - Added `List#forEachRight()` method
+        - Added `List#filter()` method
+        - Changed `List#map()` method to return a `List` instance instead of `Array`
+        - Added `List#push()` method, similar to `List#appendData()` but returns nothing
+        - Added `List#pop()` method
+        - Added `List#unshift()` method, similar to `List#prependData()` but returns nothing
+        - Added `List#shift()` method
+        - Added `List#prependList()` method
+        - Changed `List#insert()`, `List#insertData()`, `List#appendList()` and `List#insertList()` methods to return a list that performed an operation
+    - Changed `keyword()` method
+        - Changed `name` field to include a vendor prefix
+        - Added `basename` field to contain a name without a vendor prefix
+        - Added `custom` field that contain a `true` when keyword is a custom property reference
+    - Changed `property()` method
+        - Changed `name` field to include a vendor prefix
+        - Added `basename` field to contain a name without any prefixes, i.e. a hack and a vendor prefix
+    - Added `vendorPrefix()` method
+    - Added `isCustomProperty()` method
+
+## 1.0.0-alpha.26 (November 9, 2017)
+
+- Tokenizer
+    - Added `Tokenizer#isBalanceEdge()` method
+    - Removed `Tokenizer.endsWith()` method
+- Parser
+    - Made the parser tolerant to errors by default
+    - Removed `tolerant` parser option (no parsing modes anymore)
+    - Removed `property` parser option (a value parsing does not depend on property name anymore)
+    - Canceled error for a handing semicolon in a block
+    - Canceled error for unclosed `Brackets`, `Function` and `Parentheses` when EOF is reached
+    - Fixed error when prelude ends with a comment for at-rules with custom prelude consumer
+    - Relaxed at-rule parsing:
+        - Canceled error when EOF is reached after a prelude
+        - Canceled error for an at-rule with custom block consumer when at-rule has no block (just don't apply consumer in that case)
+        - Canceled error on at-rule parsing when it occurs outside prelude or block (at-rule is converting to `Raw` node)
+        - Allowed for any at-rule to have a prelude and a block, even if it's invalid per at-rule syntax (the responsibility for this check is moved to lexer, since it's possible to construct a AST with such errors)
+    - Made a declaration value a safe parsing point (i.e. error on value parsing lead to a value is turning into `Raw` node, not a declaration as before)
+    - Excluded surrounding white spaces and comments from a `Raw` node that represents a declaration value
+    - Changed `Value` parse handler to return a node only with type `Value` (previously it returned a `Raw` node in some cases)
+    - Fixed issue with `onParseError()` is not invoked for errors occured on selector or declaration value parsing in some cases
+    - Changed using of `onParseError()` to stop parsing if handler throws an exception
+- Lexer
+    - Changed `grammar.walk()` to invoke passed handler on entering to node rather than on leaving the node
+    - Improved `grammar.walk()` to take a walk handler pair as an object, i.e. `walk(node, { enter: fn, leave: fn })`
+    - Changed `Lexer#match*()` methods to take a node of any type, but with a `children` field
+    - Added `Lexer#match(syntax, node)` method
+    - Fixed `Lexer#matchType()` method to stop return a positive result for the CSS wide keywords
+
+## 1.0.0-alpha25 (October 9, 2017)
+
+- Parser
+    - Added fallback node as argument to `onParseError()` handler
+    - Fixed raw consuming in tolerant mode when selector is invalid (greedy consuming and redundant warnings)
+    - Fixed exception in tolerant mode caused by unknown at-rule with unclosed block
+    - Changed handling of semicolons:
+        - Hanging semicolon inside declaration blocks raise an error or turns into a `Raw` node in tolerant mode instead of being ignored
+        - Semicolon outside of declaration blocks opens a `Rule` node as part of selector instead of being ignored
+    - Aligned `parseAtrulePrelude` behaviour to `parseRulePrelude`
+        - Removed `Raw` node wraping into `AtrulePrelude` when `parseAtrulePrelude` is disabled
+        - Removed error emitting when at-rule has a custom prelude customer but no prelude is found (it should be validated by a lexer later)
+- Generator
+    - Fixed performance issue with `translateWithSourceMap()`, flattening the string (because of mixing building string and indexing into it) turned it into a quadratic algorithm (approximate numbers can be found in [the quiz created by this case](https://gist.github.com/lahmatiy/ea25d0e623d88ca9848384b5707d52d9))
+- Added support for a single solidus hack for `property()`
+- Minor fixes for custom errors
+
+## 1.0.0-alpha24 (September 14, 2017)
+
+- Improved CSSTree to be stable for standart build-in objects extension (#58)
+- Parser
+    - Renamed rule's `selector` to `prelude`. The reasons: [spec names this part so](https://www.w3.org/TR/css-syntax-3/#qualified-rule), and this branch can contain not only a selector (`SelectorList`) but also a raw payload (`Raw`). What's changed:
+        - Renamed `Rule.selector` to `Rule.prelude`
+        - Renamed `parseSelector` parser option to `parseRulePrelude`
+        - Removed option for selector parse in `SelectorList`
+- Lexer
+    - Fixed undefined positions in a error when match a syntax to empty or white space only value
+    - Improved `Lexer#checkStructure()`
+        - Return a warning as an object with node reference and message
+        - No exception on unknown node type, return a warning instead
+
+## 1.0.0-alpha23 (September 10, 2017)
+
+- Fixed `Tokenizer#getRawLength()`'s false positive balance match to the end of input in some cases (#56)
+- Rename walker's entry point methods to be the same as CSSTree exposed methods (i.e. `walk()`, `walkUp()` etc)
+- Rename at-rule's `expression` to `prelude` (since [spec names it so](https://www.w3.org/TR/css-syntax-3/#at-rule))
+    - `AtruleExpression` node type → `AtrulePrelude`
+    - `Atrule.expression` field → `Atrule.prelude`
+    - `parseAtruleExpression` parser's option → `parseAtrulePrelude`
+    - `atruleExpression` parse context → `atrulePrelude`
+    - `atruleExpression` walk context reference → `atrulePrelude`
+
+## 1.0.0-alpha22 (September 8, 2017)
+
+- Parser
+    - Fixed exception on parsing of unclosed `{}-block` in tolerant mode
+    - Added tolerant mode support for `DeclarationList`
+    - Added standalone entry point, i.e. default parser can be used via `require('css-tree/lib/parser')` (#47)
+- Generator
+    - Changed generator to produce `+n` when `AnPlusB.a` is `+1` to be "round-trip" with parser
+    - Added standalone entry point, i.e. default generators can be used via `require('css-tree/lib/generator')`
+- Walker
+    - Added standalone entry point, i.e. default walkers can be used via `require('css-tree/lib/walker')` (#47)
+- Lexer
+    - Added `default` keyword to the list of invalid values for `<custom-ident>` (since it reversed per [spec](https://www.w3.org/TR/css-values/#custom-idents))
+- Convertors (`toPlainObject()` and `fromPlainObject()`) moved to `lib/convertor` (entry point is `require('css-tree/lib/convertor')`)
+
+## 1.0.0-alpha21 (September 5, 2017)
+
+- Tokenizer
+    - Added `Raw` token type
+    - Improved tokenization of `url()` with raw as url to be more spec complient
+    - Added `Tokenizer#balance` array computation on token layout
+    - Added `Tokenizer#getRawLength()` to compute a raw length with respect of block balance
+    - Added `Tokenizer#getTokenStart(offset)` method to get token start offset by token index
+    - Added `idx` and `balance` fields to each token of `Tokenizer#dump()` method result
+- Parser
+    - Added `onParseError` option
+    - Reworked node parsers that consume a `Raw` node to use a new approach. Since now a `Raw` node builds in `parser#Raw()` function only
+    - Changed semantic of `parser#Raw()`, it takes 5 parameters now (it might to be changed in future)
+    - Changed `parser#tolerantParse()` to pass a start token index to fallback function instead of source offset
+    - Fixed `AtruleExpression` consuming in tolerant mode
+    - Atrule handler to convert an empty `AtruleExpression` node into `null`
+    - Changed `AtruleExpression` handler to always return a node (before it could return a `null` in some cases)
+- Lexer
+    - Fixed comma match node for `#` multiplier
+    - Added reference name to `SyntaxReferenceError`
+- Additional fixes on custom errors
+- Reduced possible corruption of base config by `syntax.fork()`
+
+## 1.0.0-alpha20 (August 28, 2017)
+
+- Tokenizer
+    - Added `Atrule` token type (`<at-rule-token>` per spec)
+    - Added `Function` token type (`<function-token>` per spec)
+    - Added `Url` token type
+    - Replaced `Tokenizer#getTypes()` method with `Tokenizer#dump()` to get all tokens as an array
+    - Renamed `Tokenizer.TYPE.Whitespace` to `Tokenizer.TYPE.WhiteSpace`
+    - Renamed `Tokenizer.findWhitespaceEnd()` to `Tokenizer.findWhiteSpaceEnd()`
+- Parser
+    - Added initial implementation of tollerant mode (turn on by passing `tolerant: true` option). In this mode parse errors are never occour and any invalid part of CSS turns into a `Raw` node. Current safe points: `Atrule`, `AtruleExpression`, `Rule`, `Selector` and `Declaration`. Feature is experimental and further improvements are planned.
+    - Changed `Atrule.expression` to contain a `AtruleExpression` node or `null` only (other node types is wrapping into a `AtruleExpression` node)
+    - Renamed `AttributeSelector.operator` to `AttributeSelector.matcher`
+- Generator
+    - `translate()` method is now can take a function as second argument, that recieves every generated chunk. When no function is passed, default handler is used, it concats all the chunks and method returns a string.
+- Lexer
+    - Used [mdn/data](https://github.com/mdn/data) package as source of lexer's grammar instead of local dictionaries
+    - Added `x` unit to `<resolution>` generic type
+    - Improved match tree:
+        - Omited Group (sequences) match nodes
+        - Omited empty match nodes (for terms with `zero or more` multipliers)
+        - Added `ASTNode` node type to contain a reference to AST node
+        - Fixed node duplication (uncompleted match were added to tree)
+        - Added AST node reference in match nodes
+        - Added comma match node by `#` multiplier
+    - Grammar
+        - Changed `translate()` function to get a handler as third argument (optional). That handler recieves result of node traslation and can be used for decoration purposes. See [example](https://github.com/csstree/docs/blob/04c65af44477b5ea05feb373482898122b2a4528/docs/syntax.html#L619-L627)
+        - Added `SyntaxParseError` to grammar export
+        - Reworked group and multipliers representation in syntax tree:
+            - Replaced `Sequence` for `Group` node type (`Sequence` node type removed)
+            - Added `explicit` boolean property for `Group`
+            - Only groups can have a multiplier now (other node types is wrapping into a single term implicit group when multiplier is applied)
+            - Renamed `nonEmpty` Group's property to `disallowEmpty`
+            - Added optimisation for syntax tree by dropping redundant root `Group` when it contains a single `Group` term (return this `Group` as a result)
+    - Changed lexer's match functionality
+        - Changed `Lexer#matchProperty()` and `Lexer#matchType()` to return an object instead of match tree. A match tree stores in `matched` field when AST is matched to grammar successfully, otherwise an error in `error` field. The result object also has some methods to test AST node against a match tree: `getTrace()`, `isType()`, `isProperty()` and `isKeyword()`
+        - Added `Lexer#matchDeclaration()` method
+        - Removed `Lexer#lastMatchError` (error stores in match result object in `error` field)
+    - Added initial implementation of search for AST segments (new lexer methods: `Lexer#findValueSegments()`, `Lexer#findDeclarationValueSegments()` and `Lexer#findAllSegments`)
+    - Implemented `SyntaxReferenceError` for unknown property and type references
+- Renamed field in resulting object of `property()` function: `variable` → `custom`
+- Fixed issue with readonly properties (e.g. `line` and `column`) of `Error` and exception on attempt to write in iOS Safari
+
+## 1.0.0-alpha19 (April 24, 2017)
+
+- Extended `List` class with new methods:
+    - `List#prepend(item)`
+    - `List#prependData(data)`
+    - `List#insertData(data)`
+    - `List#insertList(list)`
+    - `List#replace(item, itemOrList)`
+
+## 1.0.0-alpha18 (April 3, 2017)
+
+- Added `atrule` walk context (#39)
+- Changed a result of generate method for `AnPlusB`, `AttributeSelector`, `Function`, `MediaFeature` and `Ratio` ([1e95877](https://github.com/csstree/csstree/commit/1e9587710efa8e9338bcf0bc794b4b45f286231d))
+- Fixed typo in `List` exception messages (@strarsis, #42)
+- Improved tokenizer to convert an input to a string
+
+## 1.0.0-alpha17 (March 13, 2017)
+
+- Implemented new concept of `syntax`
+    - Changed main `exports` to expose a default syntax
+    - Defined initial [CSS syntax](lib/syntax/default.js)
+    - Implemented `createSyntax()` method to create a new syntax from scratch
+    - Implemented `fork()` method to create a new syntax based on given via extension
+- Parser
+    - Implemented `mediaQueryList` and `mediaQuery` parsing contexts
+    - Implemented `CDO` and `CDC` node types
+    - Implemented additional declaration property prefix hacks (`#` and `+`)
+    - Added support for UTF-16LE BOM
+    - Added support for `@font-face` at-rule
+    - Added `chroma()` to legacy IE filter functions
+    - Improved `HexColor` to consume hex only
+    - Improved support for `\0` and `\9` hacks (#2)
+    - Relaxed number check for `Ratio` terms
+        - Allowed fractal values as a `Ratio` term
+        - Disallowed zero number as a `Ratio` term
+    - Changed important clause parsing
+        - Allowed any identifier for important (to support hacks like `!ie`)
+        - Store `true` for `important` field in case identifier equals to `important` and string otherwise
+    - Fixed parse error formatted message rendering to take into account tabs
+    - Removed exposing of `Parser` class
+    - Removed `readSelectorSequence()`, `readSequenceFallback()` and `readSelectorSequenceFallback` methods
+    - Used single universal sequence consumer for `AtruleExpression`, `Selector` and `Value`
+- Generator
+    - Reworked generator to use auto-generated functions based on syntax definition (additional work to be done in next releases)
+    - Implemented `translateMarkup(ast, before, after)` method for complex cases
+    - Reworked `translateWithSourceMap` to be more flexible (based on `translateMarkup`, additional work to be done in next releases)
+- Walker
+    - Reworked walker to use auto-generated function based on syntax definition (additional work to be done in next releases)
+- Lexer
+    - Prepared for better extensibility (additional work to be done in next releases)
+    - Implemented `checkStructure(ast)` method to check AST structure based on syntax definition
+    - Update syntax dictionaries to latest `mdn/data`
+        - Add missing `<'offset-position'>` syntax
+        - Extended `<position>` property with `-webkit-sticky` (@sergejmueller, #37)
+    - Improved mismatch error position
+- Implemented script (`gen:syntax`) to generate AST format reference page (`docs/ast.md`) using syntax definition
+
+## 1.0.0-alpha16 (February 12, 2017)
+
+- Exposed `Parser` class
+- Added `startOffset` option to `Tokenizer` (constructor and `setSource()` method)
+- Added fallback functions for default (`readSequenceFallback`) and selector (`readSelectorSequenceFallback`) sequence readers
+- Fixed edge cases for `AnPlusB`
+- Fixed wrong whitespace ignoring in `Selector` consumer
+
+## 1.0.0-alpha15 (February 8, 2017)
+
+- Fixed broken `atruleExpression` context
+- Fixed vendor prefix detection in `keyword()` and `property()`
+- Fixed `property()` to not lowercase custom property names
+- Added `variable` boolean flag in `property()` result
+- Renamed `scanner` into `tokenizer`
+- Ranamed `syntax` into `lexer`
+- Moved `docs/*.html` files to [csstree/docs](https://github.com/csstree/docs) repo
+- Added `element()` function for `Value` context (`-moz-element()` supported as well)
+- Merged `Universal` node type into `Type`
+- Renamed node types:
+    - `Id` -> `IdSelector`
+    - `Class` -> `ClassSelector`
+    - `Type` -> `TypeSelector`
+    - `Attribute` -> `AttributeSelector`
+    - `PseudoClass` -> `PseudoClassSelector`
+    - `PseudoElement` -> `PseudoElementSelector`
+    - `Hash` -> `HexColor`
+    - `Space` -> `WhiteSpace`
+    - `An+B` -> `AnPlusB`
+- Removed `Progid` node type
+- Relaxed `MediaQuery` consumer to not validate syntax on parse and to include whitespaces in children sequence as is
+- Added `WhiteSpace.value` property to store whitespace sequence
+- Implemented parser options to specify what should be parsed in details (when option is `false` some part of CSS represents as balanced `Raw`):
+    - `parseAtruleExpression` – to parse at-rule expressions (`true` by default)
+    - `parseSelector` – to parse rule's selector (`true` by default)
+    - `parseValue` - to parse declaration's value (`true` by default)
+    - `parseCustomProperty` – to parse value and fallback of custom property (`false` by default)
+- Changed tokenization to stick leading hyphen minus to identifier token
+- Changed selector parsing:
+    - Don't convert spaces into descendant combinator
+    - Don't validate selector structure on parsing (selectors may be checked by lexer later)
+- Initial refactoring of [docs](https://github.com/csstree/csstree/blob/master/docs)
+- Various improvements and fixes
+
+## 1.0.0-alpha14 (February 3, 2017)
+
+- Implemented `DeclarationList`, `MediaQueryList`, `MediaQuery`, `MediaFeature` and `Ratio` node types
+- Implemented `declarationList` context (useful to parse HTML `style` attribute content)
+- Implemented custom consumers for `@import`, `@media`, `@page` and `@supports` at-rules
+- Implemented `atrule` option for `parse()` config, is used for `atruleExpession` context to specify custom consumer for at-rule if any
+- Added `Scanner#skipWS()`, `Scanner#eatNonWS()`, `Scanner#consume()` and `Scanner#consumeNonWS()` helper methods
+- Added custom consumers for known functional-pseudos, consume unknown functional-pseudo content as balanced `Raw`
+- Allowed any `PseudoElement` to be a functional-pseudo (#33)
+- Improved walker implementations to reduce GC thrashing by reusing cursors
+- Changed `Atrule.block` to contain a `Block` node type only if any
+- Changed `Block.loc` positions to include curly brackets
+- Changed `Atrule.expression` to store a `null` if no expression
+- Changed parser to use `StyleSheet` node type only for top level node (when context is `stylesheet`, that's by default)
+- Changed `Parentheses`, `Brackets` and `Function` consumers to use passed sequence reader instead of its own
+- Changed `Value` and `AtruleExpression` consumers to use common sequence reader (that reader was used by `Value` consumer before)
+- Changed default sequence reader to exclude storage of spaces around `Comma`
+- Changed processing of custom properties:
+    - Consume declaration value as balanced `Raw`
+    - Consume `var()` fallback value as balanced `Raw`
+    - Validate first argument of `var()` starts with double dash
+    - Custom property's value and fallback includes spaces around
+- Fixed `Nth` to have a `loc` property
+- Fixed `SelectorList.loc` and `Selector.loc` positions to exclude spaces
+- Fixed issue Browserify build fail with `default-syntax.json` is not found error (#32, @philschatz)
+- Disallowed `Type` selector starting with dash (parser throws an error in this case now)
+- Disallowed empty selectors for `Rule` (not sure if it's correct but looks reasonable)
+- Removed `>>` combinator support until any browser support (no signals about that yet)
+- Removed `PseudoElement.legacy` property
+- Removed special case for `:before`, `:after`, `:first-letter` and `:first-line` to represent them as `PseudoElement`, now those pseudos are represented as `PseudoClass` nodes
+- Removed deprecated `Syntax#match()` method
+- Parser was splitted into modules and related changes, one step closer to an extensible parser
+- Various fixes and improvements, all changes have negligible impact on performance
+
+## 1.0.0-alpha13 (January 19, 2017)
+
+- Changed location storing in `SyntaxMatchError`
+    - Changed property to store mismatch offset to `mismatchOffset`
+    - Changed `offset` property to store bad node offset in source CSS if any
+    - Added `loc` property that stores bad node `loc` if any
+
+## 1.0.0-alpha12 (January 19, 2017)
+
+- Fixed `Syntax#matchProperty()` method to always return a positive result for custom properties since syntax is never defined for them (#31)
+- Implemented `fromPlainObject()` and `toPlainObject()` to convert plain object to AST or AST to plain object (currently converts `List` <-> `Array`)
+
+## 1.0.0-alpha11 (January 18, 2017)
+
+- Added support for `:matches(<selector-list>)` (#28)
+- Added support for `:has(<relative-selector-list>)`
+- Added support for `::slotted(<compound-selector>)`
+- Implemented `Brackets` node type
+- Implemented basic support for at-rule inside rule block (#24)
+- Renamed `Selector` node type to `SelectorList`
+- Renamed `SimpleSelector` node type to `Selector`
+- Renamed `UnicodeRange.name` property to `UnicodeRange.value`
+- Replaced `Negation` node type for regular `PseudoClass`
+- Unified name of node property to store nested nodes, it always `children` now:
+    - `StyleSheet.rules` -> `StyleSheet.children`
+    - `SelectorList.selectors` -> `SelectorList.children`
+    - `Block.declarations` -> `Block.children`
+    - `*.sequence` -> `*.children`
+- Fixed edge cases in parsing `Hex` and `UnicodeRange` when number not an integer
+- Changed `nth-` pseudos parsing
+    - Implemented `An+B` node type to represent expressions like `2n + 1` or `-3n`
+    - Fixed edge cases when `a` or `b` is not an integer
+    - Changed `odd` and `even` keywords processing, keywords are storing as `Identifier` node type now
+    - Changed `Nth` node type format to store a `nth`-query and an optional `selector`
+    - Implemented `of` clause for `nth-` pseudos (a.e. `:nth-child(2n + 1 of li, img)`)
+    - Limited `Nth` parsing rules to `:nth-child()`, `:nth-last-child()`, `:nth-of-type()` and `:nth-last-of-type()` pseudos
+- Changed the way to store locations
+    - Renamed `info` node property to `loc`
+    - Changed format of `loc` to store `start` and `end` positions
+
+## 1.0.0-alpha10 (January 11, 2017)
+
+- Reworked `Scanner` to be a single point to its functionality
+- Exposed `Scanner` class to be useful for external projects
+- Changed `walk()` function behaviour to traverse AST nodes in natural order
+- Implemented `walkUp()` function to traverse AST nodes from deepest to parent (behaves as `walk()` before)
+
+## 1.0.0-alpha9 (December 21, 2016)
+
+- Fixed `<angle>` generic according to specs that allow a `<number>` equals to zero to be used as valid value (#30)
+
+## 1.0.0-alpha8 (November 11, 2016)
+
+- Fixed `Scanner#skip()` issue method when cursor is moving to the end of source
+- Simplified `Progid` node
+- Changed behaviour for bad selector processing, now parsing fails instead of selector ignoring
+- Fixed `<id-selector>` generic syntax
+- Added `q` unit for `<length>` generic syntax
+- Refactored syntax parser (performance)
+- Reduced startup time by implementing lazy syntax parsing (default syntax doesn't parse on module load)
+- Updated syntax dictionaries and used [`mdn/data`](https://github.com/mdn/data) instead of `Template:CSSData`
+- Renamed `syntax.stringify()` method to `syntax.translate()`
+- Simplified generic syntax functions, those functions receive a single AST node for checking and should return `true` or `false`
+- Added exception for values that contains `var()`, those values are always valid for now
+- Added more tests and increase code coverage to `98.5%`
+
+## 1.0.0-alpha7 (October 7, 2016)
+
+- Added support for explicit descendant combinator (`>>`)
+- Implemented `Type` and `Universal` type nodes
+- Improved `Number` parsing by including sign and exponent (#26)
+- Parse `before`, `after`, `first-letter` and `first-line` pseudos with single colon as `PseudoElement`
+- Changed `FunctionalPseudo` node type to `PseudoClass`
+- Fixed attribute selector name parsing (namespace edge cases)
+- Fixed location calculation for specified offset when `eof` is reached
+- Added more non-standard colors (#25)
+- Removed obsolete `Syntax#getAll()` method
+- Fixed various edge cases, code clean up and performance improvements
+
+## 1.0.0-alpha6 (September 23, 2016)
+
+- More accurate positions for syntax mismatch errors
+- Added [`apple`](https://webkit.org/blog/3709/using-the-system-font-in-web-content/) specific font keywords (#20)
+- Changed `Property` node stucture from object to string
+- Renamed `Ruleset` node type to `Rule`
+- Removed `Argument` node type
+- Fixed `Dimension` and `Percentage` position computation
+- Fixed bad selector parsing (temporary solution)
+- Fixed location computation for CSS with very long lines that may lead to really long parsing with `positions:true` (even freeze)
+- Fixed `line` and `column` computation for `SyntaxMatch` error
+- Improved performance of parsing and translation. Now CSSTree is under 10ms in [PostCSS benchmark](https://github.com/postcss/benchmark).
diff --git a/node_modules/css-tree/LICENSE b/node_modules/css-tree/LICENSE
new file mode 100644
index 0000000..bf9d7ce
--- /dev/null
+++ b/node_modules/css-tree/LICENSE
@@ -0,0 +1,19 @@
+Copyright (C) 2016-2019 by Roman Dvornov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/css-tree/README.md b/node_modules/css-tree/README.md
new file mode 100644
index 0000000..f69d14a
--- /dev/null
+++ b/node_modules/css-tree/README.md
@@ -0,0 +1,130 @@
+<img align="right" width="111" height="111"
+     alt="CSSTree logo"
+     src="https://cloud.githubusercontent.com/assets/270491/19243723/6f9136c6-8f21-11e6-82ac-eeeee4c6c452.png"/>
+
+# CSSTree
+
+[![NPM version](https://img.shields.io/npm/v/css-tree.svg)](https://www.npmjs.com/package/css-tree)
+[![Build Status](https://travis-ci.org/csstree/csstree.svg?branch=master)](https://travis-ci.org/csstree/csstree)
+[![Coverage Status](https://coveralls.io/repos/github/csstree/csstree/badge.svg?branch=master)](https://coveralls.io/github/csstree/csstree?branch=master)
+[![NPM Downloads](https://img.shields.io/npm/dm/css-tree.svg)](https://www.npmjs.com/package/css-tree)
+[![Twitter](https://img.shields.io/badge/Twitter-@csstree-blue.svg)](https://twitter.com/csstree)
+
+CSSTree is a tool set for CSS: [fast](https://github.com/postcss/benchmark) detailed parser (CSS → AST), walker (AST traversal), generator (AST → CSS) and lexer (validation and matching) based on specs and browser implementations. The main goal is to be efficient and W3C specs compliant, with focus on CSS analyzing and source-to-source transforming tasks.
+
+> NOTE: The library isn't in final shape and needs further improvements (e.g. AST format and API are subjects to change in next major versions). However it's stable enough and used by projects like [CSSO](https://github.com/css/csso) (CSS minifier) and [SVGO](https://github.com/svg/svgo) (SVG optimizer) in production.
+
+## Features
+
+- **Detailed parsing with an adjustable level of detail**
+
+  By default CSSTree parses CSS as detailed as possible, i.e. each single logical part is representing with its own AST node (see [AST format](docs/ast.md) for all possible node types). The parsing detail level can be changed through [parser options](docs/parsing.md#parsesource-options), for example, you can disable parsing of selectors or declaration values for component parts.
+
+- **Tolerant to errors by design**
+
+  Parser behaves as [spec says](https://www.w3.org/TR/css-syntax-3/#error-handling): "When errors occur in CSS, the parser attempts to recover gracefully, throwing away only the minimum amount of content before returning to parsing as normal". The only thing the parser departs from the specification is that it doesn't throw away bad content, but wraps it in a special node type (`Raw`) that allows processing it later.
+
+- **Fast and efficient**
+
+  CSSTree is created with focus on performance and effective memory consumption. Therefore it's [one of the fastest CSS parsers](https://github.com/postcss/benchmark) at the moment.
+
+- **Syntax validation**
+
+  The build-in lexer can test CSS against syntaxes defined by W3C. CSSTree uses [mdn/data](https://github.com/mdn/data/) as a basis for lexer's dictionaries and extends it with vendor specific and legacy syntaxes. Lexer can only check the declaration values currently, but this feature will be extended to other parts of the CSS in the future.
+
+## Documentation
+
+- [AST format](docs/ast.md)
+- [Parsing CSS → AST](docs/parsing.md)
+  - [parse(source[, options])](docs/parsing.md#parsesource-options)
+- [Serialization AST → CSS](docs/generate.md)
+  - [generate(ast[, options])](docs/generate.md#generateast-options)
+- [AST traversal](docs/traversal.md)
+  - [walk(ast, options)](docs/traversal.md#walkast-options)
+  - [find(ast, fn)](docs/traversal.md#findast-fn)
+  - [findLast(ast, fn)](docs/traversal.md#findlastast-fn)
+  - [findAll(ast, fn)](docs/traversal.md#findallast-fn)
+- [Utils for AST](docs/utils.md)
+  - [property(name)](docs/utils.md#propertyname)
+  - [keyword(name)](docs/utils.md#keywordname)
+  - [clone(ast)](docs/utils.md#cloneast)
+  - [fromPlainObject(object)](docs/utils.md#fromplainobjectobject)
+  - [toPlainObject(ast)](docs/utils.md#toplainobjectast)
+- [Value Definition Syntax](docs/definition-syntax.md)
+  - [parse(source)](docs/definition-syntax.md#parsesource)
+  - [walk(node, options, context)](docs/definition-syntax.md#walknode-options-context)
+  - [generate(node, options)](docs/definition-syntax.md#generatenode-options)
+  - [AST format](docs/definition-syntax.md#ast-format)
+
+## Tools
+
+* [AST Explorer](https://astexplorer.net/#/gist/244e2fb4da940df52bf0f4b94277db44/e79aff44611020b22cfd9708f3a99ce09b7d67a8) – explore CSSTree AST format with zero setup
+* [CSS syntax reference](https://csstree.github.io/docs/syntax.html)
+* [CSS syntax validator](https://csstree.github.io/docs/validator.html)
+
+## Related projects
+
+* [csstree-validator](https://github.com/csstree/validator) – NPM package to validate CSS
+* [stylelint-csstree-validator](https://github.com/csstree/stylelint-validator) – plugin for stylelint to validate CSS
+* [Grunt plugin](https://github.com/sergejmueller/grunt-csstree-validator)
+* [Gulp plugin](https://github.com/csstree/gulp-csstree)
+* [Sublime plugin](https://github.com/csstree/SublimeLinter-contrib-csstree)
+* [VS Code plugin](https://github.com/csstree/vscode-plugin)
+* [Atom plugin](https://github.com/csstree/atom-plugin)
+
+## Usage
+
+Install with npm:
+
+```
+> npm install css-tree
+```
+
+Basic usage:
+
+```js
+var csstree = require('css-tree');
+
+// parse CSS to AST
+var ast = csstree.parse('.example { world: "!" }');
+
+// traverse AST and modify it
+csstree.walk(ast, function(node) {
+    if (node.type === 'ClassSelector' && node.name === 'example') {
+        node.name = 'hello';
+    }
+});
+
+// generate CSS from AST
+console.log(csstree.generate(ast));
+// .hello{world:"!"}
+```
+
+Syntax matching:
+
+```js
+// parse CSS to AST as a declaration value
+var ast = csstree.parse('red 1px solid', { context: 'value' });
+
+// match to syntax of `border` property
+var matchResult = csstree.lexer.matchProperty('border', ast);
+
+// check first value node is a <color>
+console.log(matchResult.isType(ast.children.first(), 'color'));
+// true
+
+// get a type list matched to a node
+console.log(matchResult.getTrace(ast.children.first()));
+// [ { type: 'Property', name: 'border' },
+//   { type: 'Type', name: 'color' },
+//   { type: 'Type', name: 'named-color' },
+//   { type: 'Keyword', name: 'red' } ]
+```
+
+## Top level API
+
+![API map](https://cdn.rawgit.com/csstree/csstree/1.0/docs/api-map.svg)
+
+## License
+
+MIT
diff --git a/node_modules/css-tree/data/index.js b/node_modules/css-tree/data/index.js
new file mode 100755
index 0000000..ff56c24
--- /dev/null
+++ b/node_modules/css-tree/data/index.js
@@ -0,0 +1,103 @@
+const mdnAtrules = require('mdn-data/css/at-rules.json');
+const mdnProperties = require('mdn-data/css/properties.json');
+const mdnSyntaxes = require('mdn-data/css/syntaxes.json');
+const patch = require('./patch.json');
+const extendSyntax = /^\s*\|\s*/;
+
+function preprocessAtrules(dict) {
+    const result = Object.create(null);
+
+    for (const atruleName in dict) {
+        const atrule = dict[atruleName];
+        let descriptors = null;
+
+        if (atrule.descriptors) {
+            descriptors = Object.create(null);
+
+            for (const descriptor in atrule.descriptors) {
+                descriptors[descriptor] = atrule.descriptors[descriptor].syntax;
+            }
+        }
+
+        result[atruleName.substr(1)] = {
+            prelude: atrule.syntax.trim().match(/^@\S+\s+([^;\{]*)/)[1].trim() || null,
+            descriptors
+        };
+    }
+
+    return result;
+}
+
+function patchDictionary(dict, patchDict) {
+    const result = {};
+
+    // copy all syntaxes for an original dict
+    for (const key in dict) {
+        result[key] = dict[key].syntax || dict[key];
+    }
+
+    // apply a patch
+    for (const key in patchDict) {
+        if (key in dict) {
+            if (patchDict[key].syntax) {
+                result[key] = extendSyntax.test(patchDict[key].syntax)
+                    ? result[key] + ' ' + patchDict[key].syntax.trim()
+                    : patchDict[key].syntax;
+            } else {
+                delete result[key];
+            }
+        } else {
+            if (patchDict[key].syntax) {
+                result[key] = patchDict[key].syntax.replace(extendSyntax, '');
+            }
+        }
+    }
+
+    return result;
+}
+
+function unpackSyntaxes(dict) {
+    const result = {};
+
+    for (const key in dict) {
+        result[key] = dict[key].syntax;
+    }
+
+    return result;
+}
+
+function patchAtrules(dict, patchDict) {
+    const result = {};
+
+    // copy all syntaxes for an original dict
+    for (const key in dict) {
+        const patchDescriptors = (patchDict[key] && patchDict[key].descriptors) || null;
+
+        result[key] = {
+            prelude: key in patchDict && 'prelude' in patchDict[key]
+                ? patchDict[key].prelude
+                : dict[key].prelude || null,
+            descriptors: dict[key].descriptors
+                ? patchDictionary(dict[key].descriptors, patchDescriptors || {})
+                : patchDescriptors && unpackSyntaxes(patchDescriptors)
+        };
+    }
+
+    // apply a patch
+    for (const key in patchDict) {
+        if (!hasOwnProperty.call(dict, key)) {
+            result[key] = {
+                prelude: patchDict[key].prelude || null,
+                descriptors: patchDict[key].descriptors && unpackSyntaxes(patchDict[key].descriptors)
+            };
+        }
+    }
+
+    return result;
+}
+
+module.exports = {
+    types: patchDictionary(mdnSyntaxes, patch.syntaxes),
+    atrules: patchAtrules(preprocessAtrules(mdnAtrules), patch.atrules),
+    properties: patchDictionary(mdnProperties, patch.properties)
+};
diff --git a/node_modules/css-tree/data/patch.json b/node_modules/css-tree/data/patch.json
new file mode 100644
index 0000000..6b91136
--- /dev/null
+++ b/node_modules/css-tree/data/patch.json
@@ -0,0 +1,721 @@
+{
+    "atrules": {
+        "charset": {
+            "prelude": "<string>"
+        },
+        "font-face": {
+            "descriptors": {
+                "unicode-range": {
+                    "comment": "replaces <unicode-range>, an old production name",
+                    "syntax": "<urange>#"
+                }
+            }
+        }
+    },
+    "properties": {
+        "-moz-background-clip": {
+            "comment": "deprecated syntax in old Firefox, https://developer.mozilla.org/en/docs/Web/CSS/background-clip",
+            "syntax": "padding | border"
+        },
+        "-moz-border-radius-bottomleft": {
+            "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/border-bottom-left-radius",
+            "syntax": "<'border-bottom-left-radius'>"
+        },
+        "-moz-border-radius-bottomright": {
+            "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/border-bottom-right-radius",
+            "syntax": "<'border-bottom-right-radius'>"
+        },
+        "-moz-border-radius-topleft": {
+            "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/border-top-left-radius",
+            "syntax": "<'border-top-left-radius'>"
+        },
+        "-moz-border-radius-topright": {
+            "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/border-bottom-right-radius",
+            "syntax": "<'border-bottom-right-radius'>"
+        },
+        "-moz-control-character-visibility": {
+            "comment": "firefox specific keywords, https://bugzilla.mozilla.org/show_bug.cgi?id=947588",
+            "syntax": "visible | hidden"
+        },
+        "-moz-osx-font-smoothing": {
+            "comment": "misssed old syntax https://developer.mozilla.org/en-US/docs/Web/CSS/font-smooth",
+            "syntax": "auto | grayscale"
+        },
+        "-moz-user-select": {
+            "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/user-select",
+            "syntax": "none | text | all | -moz-none"
+        },
+        "-ms-flex-align": {
+            "comment": "misssed old syntax implemented in IE, https://www.w3.org/TR/2012/WD-css3-flexbox-20120322/#flex-align",
+            "syntax": "start | end | center | baseline | stretch"
+        },
+        "-ms-flex-item-align": {
+            "comment": "misssed old syntax implemented in IE, https://www.w3.org/TR/2012/WD-css3-flexbox-20120322/#flex-align",
+            "syntax": "auto | start | end | center | baseline | stretch"
+        },
+        "-ms-flex-line-pack": {
+            "comment": "misssed old syntax implemented in IE, https://www.w3.org/TR/2012/WD-css3-flexbox-20120322/#flex-line-pack",
+            "syntax": "start | end | center | justify | distribute | stretch"
+        },
+        "-ms-flex-negative": {
+            "comment": "misssed old syntax implemented in IE; TODO: find references for comfirmation",
+            "syntax": "<'flex-shrink'>"
+        },
+        "-ms-flex-pack": {
+            "comment": "misssed old syntax implemented in IE, https://www.w3.org/TR/2012/WD-css3-flexbox-20120322/#flex-pack",
+            "syntax": "start | end | center | justify | distribute"
+        },
+        "-ms-flex-order": {
+            "comment": "misssed old syntax implemented in IE; https://msdn.microsoft.com/en-us/library/jj127303(v=vs.85).aspx",
+            "syntax": "<integer>"
+        },
+        "-ms-flex-positive": {
+            "comment": "misssed old syntax implemented in IE; TODO: find references for comfirmation",
+            "syntax": "<'flex-grow'>"
+        },
+        "-ms-flex-preferred-size": {
+            "comment": "misssed old syntax implemented in IE; TODO: find references for comfirmation",
+            "syntax": "<'flex-basis'>"
+        },
+        "-ms-interpolation-mode": {
+            "comment": "https://msdn.microsoft.com/en-us/library/ff521095(v=vs.85).aspx",
+            "syntax": "nearest-neighbor | bicubic"
+        },
+        "-ms-grid-column-align": {
+            "comment": "add this property first since it uses as fallback for flexbox, https://msdn.microsoft.com/en-us/library/windows/apps/hh466338.aspx",
+            "syntax": "start | end | center | stretch"
+        },
+        "-ms-grid-row-align": {
+            "comment": "add this property first since it uses as fallback for flexbox, https://msdn.microsoft.com/en-us/library/windows/apps/hh466348.aspx",
+            "syntax": "start | end | center | stretch"
+        },
+        "-ms-hyphenate-limit-last": {
+            "comment": "misssed old syntax implemented in IE; https://www.w3.org/TR/css-text-4/#hyphenate-line-limits",
+            "syntax": "none | always | column | page | spread"
+        },
+        "-webkit-appearance": {
+            "comment": "webkit specific keywords",
+            "references": [
+                "http://css-infos.net/property/-webkit-appearance"
+            ],
+            "syntax": "none | button | button-bevel | caps-lock-indicator | caret | checkbox | default-button | inner-spin-button | listbox | listitem | media-controls-background | media-controls-fullscreen-background | media-current-time-display | media-enter-fullscreen-button | media-exit-fullscreen-button | media-fullscreen-button | media-mute-button | media-overlay-play-button | media-play-button | media-seek-back-button | media-seek-forward-button | media-slider | media-sliderthumb | media-time-remaining-display | media-toggle-closed-captions-button | media-volume-slider | media-volume-slider-container | media-volume-sliderthumb | menulist | menulist-button | menulist-text | menulist-textfield | meter | progress-bar | progress-bar-value | push-button | radio | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbargripper-horizontal | scrollbargripper-vertical | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical | searchfield | searchfield-cancel-button | searchfield-decoration | searchfield-results-button | searchfield-results-decoration | slider-horizontal | slider-vertical | sliderthumb-horizontal | sliderthumb-vertical | square-button | textarea | textfield | -apple-pay-button"
+        },
+        "-webkit-background-clip": {
+            "comment": "https://developer.mozilla.org/en/docs/Web/CSS/background-clip",
+            "syntax": "[ <box> | border | padding | content | text ]#"
+        },
+        "-webkit-column-break-after": {
+            "comment": "added, http://help.dottoro.com/lcrthhhv.php",
+            "syntax": "always | auto | avoid"
+        },
+        "-webkit-column-break-before": {
+            "comment": "added, http://help.dottoro.com/lcxquvkf.php",
+            "syntax": "always | auto | avoid"
+        },
+        "-webkit-column-break-inside": {
+            "comment": "added, http://help.dottoro.com/lclhnthl.php",
+            "syntax": "always | auto | avoid"
+        },
+        "-webkit-font-smoothing": {
+            "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/font-smooth",
+            "syntax": "auto | none | antialiased | subpixel-antialiased"
+        },
+        "-webkit-mask-box-image": {
+            "comment": "missed; https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-mask-box-image",
+            "syntax": "[ <url> | <gradient> | none ] [ <length-percentage>{4} <-webkit-mask-box-repeat>{2} ]?"
+        },
+        "-webkit-print-color-adjust": {
+            "comment": "missed",
+            "references": [
+                "https://developer.mozilla.org/en/docs/Web/CSS/-webkit-print-color-adjust"
+            ],
+            "syntax": "economy | exact"
+        },
+        "-webkit-text-security": {
+            "comment": "missed; http://help.dottoro.com/lcbkewgt.php",
+            "syntax": "none | circle | disc | square"
+        },
+        "-webkit-user-drag": {
+            "comment": "missed; http://help.dottoro.com/lcbixvwm.php",
+            "syntax": "none | element | auto"
+        },
+        "-webkit-user-select": {
+            "comment": "auto is supported by old webkit, https://developer.mozilla.org/en-US/docs/Web/CSS/user-select",
+            "syntax": "auto | none | text | all"
+        },
+        "alignment-baseline": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/text.html#AlignmentBaselineProperty"
+            ],
+            "syntax": "auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical"
+        },
+        "baseline-shift": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/text.html#BaselineShiftProperty"
+            ],
+            "syntax": "baseline | sub | super | <svg-length>"
+        },
+        "behavior": {
+            "comment": "added old IE property https://msdn.microsoft.com/en-us/library/ms530723(v=vs.85).aspx",
+            "syntax": "<url>+"
+        },
+        "clip-rule": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/masking.html#ClipRuleProperty"
+            ],
+            "syntax": "nonzero | evenodd"
+        },
+        "cue": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "<'cue-before'> <'cue-after'>?"
+        },
+        "cue-after": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "<url> <decibel>? | none"
+        },
+        "cue-before": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "<url> <decibel>? | none"
+        },
+        "cursor": {
+            "comment": "added legacy keywords: hand, -webkit-grab. -webkit-grabbing, -webkit-zoom-in, -webkit-zoom-out, -moz-grab, -moz-grabbing, -moz-zoom-in, -moz-zoom-out",
+            "references": [
+                "https://www.sitepoint.com/css3-cursor-styles/"
+            ],
+            "syntax": "[ [ <url> [ <x> <y> ]? , ]* [ auto | default | none | context-menu | help | pointer | progress | wait | cell | crosshair | text | vertical-text | alias | copy | move | no-drop | not-allowed | e-resize | n-resize | ne-resize | nw-resize | s-resize | se-resize | sw-resize | w-resize | ew-resize | ns-resize | nesw-resize | nwse-resize | col-resize | row-resize | all-scroll | zoom-in | zoom-out | grab | grabbing | hand | -webkit-grab | -webkit-grabbing | -webkit-zoom-in | -webkit-zoom-out | -moz-grab | -moz-grabbing | -moz-zoom-in | -moz-zoom-out ] ]"
+        },
+        "display": {
+            "comment": "extended with -ms-flexbox",
+            "syntax": "| <-non-standard-display>"
+        },
+        "position": {
+            "comment": "extended with -webkit-sticky",
+            "syntax": "| -webkit-sticky"
+        },
+        "dominant-baseline": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/text.html#DominantBaselineProperty"
+            ],
+            "syntax": "auto | use-script | no-change | reset-size | ideographic | alphabetic | hanging | mathematical | central | middle | text-after-edge | text-before-edge"
+        },
+        "image-rendering": {
+            "comment": "extended with <-non-standard-image-rendering>, added SVG keywords optimizeSpeed and optimizeQuality",
+            "references": [
+                "https://developer.mozilla.org/en/docs/Web/CSS/image-rendering",
+                "https://www.w3.org/TR/SVG/painting.html#ImageRenderingProperty"
+            ],
+            "syntax": "| optimizeSpeed | optimizeQuality | <-non-standard-image-rendering>"
+        },
+        "fill": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/painting.html#FillProperty"
+            ],
+            "syntax": "<paint>"
+        },
+        "fill-opacity": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/painting.html#FillProperty"
+            ],
+            "syntax": "<number-zero-one>"
+        },
+        "fill-rule": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/painting.html#FillProperty"
+            ],
+            "syntax": "nonzero | evenodd"
+        },
+        "filter": {
+            "comment": "extend with IE legacy syntaxes",
+            "syntax": "| <-ms-filter-function-list>"
+        },
+        "glyph-orientation-horizontal": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/text.html#GlyphOrientationHorizontalProperty"
+            ],
+            "syntax": "<angle>"
+        },
+        "glyph-orientation-vertical": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/text.html#GlyphOrientationVerticalProperty"
+            ],
+            "syntax": "<angle>"
+        },
+        "kerning": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/text.html#KerningProperty"
+            ],
+            "syntax": "auto | <svg-length>"
+        },
+        "letter-spacing": {
+            "comment": "fix syntax <length> -> <length-percentage>",
+            "references": [
+                "https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/letter-spacing"
+            ],
+            "syntax": "normal | <length-percentage>"
+        },
+        "marker": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/painting.html#MarkerProperties"
+            ],
+            "syntax": "none | <url>"
+        },
+        "marker-end": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/painting.html#MarkerProperties"
+            ],
+            "syntax": "none | <url>"
+        },
+        "marker-mid": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/painting.html#MarkerProperties"
+            ],
+            "syntax": "none | <url>"
+        },
+        "marker-start": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/painting.html#MarkerProperties"
+            ],
+            "syntax": "none | <url>"
+        },
+        "max-width": {
+            "comment": "fix auto -> none (https://github.com/mdn/data/pull/431); extend by non-standard width keywords https://developer.mozilla.org/en-US/docs/Web/CSS/max-width",
+            "syntax": "none | <length-percentage> | min-content | max-content | fit-content(<length-percentage>) | <-non-standard-width>"
+        },
+        "width": {
+            "comment": "per spec fit-content should be a function, however browsers are supporting it as a keyword (https://github.com/csstree/stylelint-validator/issues/29)",
+            "syntax": "| fit-content | -moz-fit-content | -webkit-fit-content"
+        },
+        "min-width": {
+            "comment": "extend by non-standard width keywords https://developer.mozilla.org/en-US/docs/Web/CSS/width",
+            "syntax": "auto | <length-percentage> | min-content | max-content | fit-content(<length-percentage>) | <-non-standard-width>"
+        },
+        "overflow": {
+            "comment": "extend by vendor keywords https://developer.mozilla.org/en-US/docs/Web/CSS/overflow",
+            "syntax": "| <-non-standard-overflow>"
+        },
+        "pause": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "<'pause-before'> <'pause-after'>?"
+        },
+        "pause-after": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "<time> | none | x-weak | weak | medium | strong | x-strong"
+        },
+        "pause-before": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "<time> | none | x-weak | weak | medium | strong | x-strong"
+        },
+        "rest": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "<'rest-before'> <'rest-after'>?"
+        },
+        "rest-after": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "<time> | none | x-weak | weak | medium | strong | x-strong"
+        },
+        "rest-before": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "<time> | none | x-weak | weak | medium | strong | x-strong"
+        },
+        "shape-rendering": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/painting.html#ShapeRenderingPropert"
+            ],
+            "syntax": "auto | optimizeSpeed | crispEdges | geometricPrecision"
+        },
+        "src": {
+            "comment": "added @font-face's src property https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/src",
+            "syntax": "[ <url> [ format( <string># ) ]? | local( <family-name> ) ]#"
+        },
+        "speak": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "auto | none | normal"
+        },
+        "speak-as": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "normal | spell-out || digits || [ literal-punctuation | no-punctuation ]"
+        },
+        "stroke": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
+            ],
+            "syntax": "<paint>"
+        },
+        "stroke-dasharray": {
+            "comment": "added SVG property; a list of comma and/or white space separated <length>s and <percentage>s",
+            "references": [
+                "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
+            ],
+            "syntax": "none | [ <svg-length>+ ]#"
+        },
+        "stroke-dashoffset": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
+            ],
+            "syntax": "<svg-length>"
+        },
+        "stroke-linecap": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
+            ],
+            "syntax": "butt | round | square"
+        },
+        "stroke-linejoin": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
+            ],
+            "syntax": "miter | round | bevel"
+        },
+        "stroke-miterlimit": {
+            "comment": "added SVG property (<miterlimit> = <number-one-or-greater>) ",
+            "references": [
+                "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
+            ],
+            "syntax": "<number-one-or-greater>"
+        },
+        "stroke-opacity": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
+            ],
+            "syntax": "<number-zero-one>"
+        },
+        "stroke-width": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
+            ],
+            "syntax": "<svg-length>"
+        },
+        "text-anchor": {
+            "comment": "added SVG property",
+            "references": [
+                "https://www.w3.org/TR/SVG/text.html#TextAlignmentProperties"
+            ],
+            "syntax": "start | middle | end"
+        },
+        "unicode-bidi": {
+            "comment": "added prefixed keywords https://developer.mozilla.org/en-US/docs/Web/CSS/unicode-bidi",
+            "syntax": "| -moz-isolate | -moz-isolate-override | -moz-plaintext | -webkit-isolate | -webkit-isolate-override | -webkit-plaintext"
+        },
+        "unicode-range": {
+            "comment": "added missed property https://developer.mozilla.org/en-US/docs/Web/CSS/%40font-face/unicode-range",
+            "syntax": "<urange>#"
+        },
+        "voice-balance": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "<number> | left | center | right | leftwards | rightwards"
+        },
+        "voice-duration": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "auto | <time>"
+        },
+        "voice-family": {
+            "comment": "<name> -> <family-name>, https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "[ [ <family-name> | <generic-voice> ] , ]* [ <family-name> | <generic-voice> ] | preserve"
+        },
+        "voice-pitch": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "<frequency> && absolute | [ [ x-low | low | medium | high | x-high ] || [ <frequency> | <semitones> | <percentage> ] ]"
+        },
+        "voice-range": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "<frequency> && absolute | [ [ x-low | low | medium | high | x-high ] || [ <frequency> | <semitones> | <percentage> ] ]"
+        },
+        "voice-rate": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "[ normal | x-slow | slow | medium | fast | x-fast ] || <percentage>"
+        },
+        "voice-stress": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "normal | strong | moderate | none | reduced"
+        },
+        "voice-volume": {
+            "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+            "syntax": "silent | [ [ x-soft | soft | medium | loud | x-loud ] || <decibel> ]"
+        },
+        "writing-mode": {
+            "comment": "extend with SVG keywords",
+            "syntax": "| <svg-writing-mode>"
+        }
+    },
+    "syntaxes": {
+        "-legacy-gradient": {
+            "comment": "added collection of legacy gradient syntaxes",
+            "syntax": "<-webkit-gradient()> | <-legacy-linear-gradient> | <-legacy-repeating-linear-gradient> | <-legacy-radial-gradient> | <-legacy-repeating-radial-gradient>"
+        },
+        "-legacy-linear-gradient": {
+            "comment": "like standard syntax but w/o `to` keyword https://developer.mozilla.org/en-US/docs/Web/CSS/linear-gradient",
+            "syntax": "-moz-linear-gradient( <-legacy-linear-gradient-arguments> ) | -webkit-linear-gradient( <-legacy-linear-gradient-arguments> ) | -o-linear-gradient( <-legacy-linear-gradient-arguments> )"
+        },
+        "-legacy-repeating-linear-gradient": {
+            "comment": "like standard syntax but w/o `to` keyword https://developer.mozilla.org/en-US/docs/Web/CSS/linear-gradient",
+            "syntax": "-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> ) | -webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> ) | -o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )"
+        },
+        "-legacy-linear-gradient-arguments": {
+            "comment": "like standard syntax but w/o `to` keyword https://developer.mozilla.org/en-US/docs/Web/CSS/linear-gradient",
+            "syntax": "[ <angle> | <side-or-corner> ]? , <color-stop-list>"
+        },
+        "-legacy-radial-gradient": {
+            "comment": "deprecated syntax that implemented by some browsers https://www.w3.org/TR/2011/WD-css3-images-20110908/#radial-gradients",
+            "syntax": "-moz-radial-gradient( <-legacy-radial-gradient-arguments> ) | -webkit-radial-gradient( <-legacy-radial-gradient-arguments> ) | -o-radial-gradient( <-legacy-radial-gradient-arguments> )"
+        },
+        "-legacy-repeating-radial-gradient": {
+            "comment": "deprecated syntax that implemented by some browsers https://www.w3.org/TR/2011/WD-css3-images-20110908/#radial-gradients",
+            "syntax": "-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> ) | -webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> ) | -o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )"
+        },
+        "-legacy-radial-gradient-arguments": {
+            "comment": "deprecated syntax that implemented by some browsers https://www.w3.org/TR/2011/WD-css3-images-20110908/#radial-gradients",
+            "syntax": "[ <position> , ]? [ [ [ <-legacy-radial-gradient-shape> || <-legacy-radial-gradient-size> ] | [ <length> | <percentage> ]{2} ] , ]? <color-stop-list>"
+        },
+        "-legacy-radial-gradient-size": {
+            "comment": "before a standard it contains 2 extra keywords (`contain` and `cover`) https://www.w3.org/TR/2011/WD-css3-images-20110908/#ltsize",
+            "syntax": "closest-side | closest-corner | farthest-side | farthest-corner | contain | cover"
+        },
+        "-legacy-radial-gradient-shape": {
+            "comment": "define to double sure it doesn't extends in future https://www.w3.org/TR/2011/WD-css3-images-20110908/#ltshape",
+            "syntax": "circle | ellipse"
+        },
+        "-non-standard-font": {
+            "comment": "non standard fonts",
+            "references": [
+                "https://webkit.org/blog/3709/using-the-system-font-in-web-content/"
+            ],
+            "syntax": "-apple-system-body | -apple-system-headline | -apple-system-subheadline | -apple-system-caption1 | -apple-system-caption2 | -apple-system-footnote | -apple-system-short-body | -apple-system-short-headline | -apple-system-short-subheadline | -apple-system-short-caption1 | -apple-system-short-footnote | -apple-system-tall-body"
+        },
+        "-non-standard-color": {
+            "comment": "non standard colors",
+            "references": [
+                "http://cssdot.ru/%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_CSS/color-i305.html",
+                "https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Mozilla_Color_Preference_Extensions"
+            ],
+            "syntax": "-moz-ButtonDefault | -moz-ButtonHoverFace | -moz-ButtonHoverText | -moz-CellHighlight | -moz-CellHighlightText | -moz-Combobox | -moz-ComboboxText | -moz-Dialog | -moz-DialogText | -moz-dragtargetzone | -moz-EvenTreeRow | -moz-Field | -moz-FieldText | -moz-html-CellHighlight | -moz-html-CellHighlightText | -moz-mac-accentdarkestshadow | -moz-mac-accentdarkshadow | -moz-mac-accentface | -moz-mac-accentlightesthighlight | -moz-mac-accentlightshadow | -moz-mac-accentregularhighlight | -moz-mac-accentregularshadow | -moz-mac-chrome-active | -moz-mac-chrome-inactive | -moz-mac-focusring | -moz-mac-menuselect | -moz-mac-menushadow | -moz-mac-menutextselect | -moz-MenuHover | -moz-MenuHoverText | -moz-MenuBarText | -moz-MenuBarHoverText | -moz-nativehyperlinktext | -moz-OddTreeRow | -moz-win-communicationstext | -moz-win-mediatext | -moz-activehyperlinktext | -moz-default-background-color | -moz-default-color | -moz-hyperlinktext | -moz-visitedhyperlinktext | -webkit-activelink | -webkit-focus-ring-color | -webkit-link | -webkit-text"
+        },
+        "-non-standard-image-rendering": {
+            "comment": "non-standard keywords http://phrogz.net/tmp/canvas_image_zoom.html",
+            "syntax": "optimize-contrast | -moz-crisp-edges | -o-crisp-edges | -webkit-optimize-contrast"
+        },
+        "-non-standard-overflow": {
+            "comment": "non-standard keywords https://developer.mozilla.org/en-US/docs/Web/CSS/overflow",
+            "syntax": "-moz-scrollbars-none | -moz-scrollbars-horizontal | -moz-scrollbars-vertical | -moz-hidden-unscrollable"
+        },
+        "-non-standard-width": {
+            "comment": "non-standard keywords https://developer.mozilla.org/en-US/docs/Web/CSS/width",
+            "syntax": "fill-available | min-intrinsic | intrinsic | -moz-available | -moz-fit-content | -moz-min-content | -moz-max-content | -webkit-min-content | -webkit-max-content"
+        },
+        "-webkit-gradient()": {
+            "comment": "first Apple proposal gradient syntax https://webkit.org/blog/175/introducing-css-gradients/ - TODO: simplify when after match algorithm improvement ( [, point, radius | , point] -> [, radius]? , point )",
+            "syntax": "-webkit-gradient( <-webkit-gradient-type>, <-webkit-gradient-point> [, <-webkit-gradient-point> | , <-webkit-gradient-radius>, <-webkit-gradient-point> ] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )"
+        },
+        "-webkit-gradient-color-stop": {
+            "comment": "first Apple proposal gradient syntax https://webkit.org/blog/175/introducing-css-gradients/",
+            "syntax": "from( <color> ) | color-stop( [ <number-zero-one> | <percentage> ] , <color> ) | to( <color> )"
+        },
+        "-webkit-gradient-point": {
+            "comment": "first Apple proposal gradient syntax https://webkit.org/blog/175/introducing-css-gradients/",
+            "syntax": "[ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ]"
+        },
+        "-webkit-gradient-radius": {
+            "comment": "first Apple proposal gradient syntax https://webkit.org/blog/175/introducing-css-gradients/",
+            "syntax": "<length> | <percentage>"
+        },
+        "-webkit-gradient-type": {
+            "comment": "first Apple proposal gradient syntax https://webkit.org/blog/175/introducing-css-gradients/",
+            "syntax": "linear | radial"
+        },
+        "-webkit-mask-box-repeat": {
+            "comment": "missed; https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-mask-box-image",
+            "syntax": "repeat | stretch | round"
+        },
+        "-webkit-mask-clip-style": {
+            "comment": "missed; there is no enough information about `-webkit-mask-clip` property, but looks like all those keywords are working",
+            "syntax": "border | border-box | padding | padding-box | content | content-box | text"
+        },
+        "-ms-filter-function-list": {
+            "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/-ms-filter",
+            "syntax": "<-ms-filter-function>+"
+        },
+        "-ms-filter-function": {
+            "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/-ms-filter",
+            "syntax": "<-ms-filter-function-progid> | <-ms-filter-function-legacy>"
+        },
+        "-ms-filter-function-progid": {
+            "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/-ms-filter",
+            "syntax": "'progid:' [ <ident-token> '.' ]* [ <ident-token> | <function-token> <any-value>? ) ]"
+        },
+        "-ms-filter-function-legacy": {
+            "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/-ms-filter",
+            "syntax": "<ident-token> | <function-token> <any-value>? )"
+        },
+        "-ms-filter": {
+            "syntax": "<string>"
+        },
+        "age": {
+            "comment": "https://www.w3.org/TR/css3-speech/#voice-family",
+            "syntax": "child | young | old"
+        },
+        "attr-name": {
+            "syntax": "<wq-name>"
+        },
+        "attr-fallback": {
+            "syntax": "<any-value>"
+        },
+        "border-radius": {
+            "comment": "missed, https://drafts.csswg.org/css-backgrounds-3/#the-border-radius",
+            "syntax": "<length-percentage>{1,2}"
+        },
+        "bottom": {
+            "comment": "missed; not sure we should add it, but no others except `shape` is using it so it's ok for now; https://drafts.fxtf.org/css-masking-1/#funcdef-clip-rect",
+            "syntax": "<length> | auto"
+        },
+        "content-list": {
+            "comment": "missed -> https://drafts.csswg.org/css-content/#typedef-content-list (document-url, <target> and leader() is omitted util stabilization)",
+            "syntax": "[ <string> | contents | <image> | <quote> | <target> | <leader()> | <attr()> | counter( <ident>, <'list-style-type'>? ) ]+"
+        },
+        "element()": {
+            "comment": "https://drafts.csswg.org/css-gcpm/#element-syntax & https://drafts.csswg.org/css-images-4/#element-notation",
+            "syntax": "element( <custom-ident> , [ first | start | last | first-except ]? ) | element( <id-selector> )"
+        },
+        "generic-voice": {
+            "comment": "https://www.w3.org/TR/css3-speech/#voice-family",
+            "syntax": "[ <age>? <gender> <integer>? ]"
+        },
+        "gender": {
+            "comment": "https://www.w3.org/TR/css3-speech/#voice-family",
+            "syntax": "male | female | neutral"
+        },
+        "generic-family": {
+            "comment": "added -apple-system",
+            "references": [
+                "https://webkit.org/blog/3709/using-the-system-font-in-web-content/"
+            ],
+            "syntax": "| -apple-system"
+        },
+        "gradient": {
+            "comment": "added legacy syntaxes support",
+            "syntax": "| <-legacy-gradient>"
+        },
+        "left": {
+            "comment": "missed; not sure we should add it, but no others except `shape` is using it so it's ok for now; https://drafts.fxtf.org/css-masking-1/#funcdef-clip-rect",
+            "syntax": "<length> | auto"
+        },
+        "mask-image": {
+            "comment": "missed; https://drafts.fxtf.org/css-masking-1/#the-mask-image",
+            "syntax": "<mask-reference>#"
+        },
+        "name-repeat": {
+            "comment": "missed, and looks like obsolete, keep it as is since other property syntaxes should be changed too; https://www.w3.org/TR/2015/WD-css-grid-1-20150917/#typedef-name-repeat",
+            "syntax": "repeat( [ <positive-integer> | auto-fill ], <line-names>+)"
+        },
+        "named-color": {
+            "comment": "added non standard color names",
+            "syntax": "| <-non-standard-color>"
+        },
+        "paint": {
+            "comment": "used by SVG https://www.w3.org/TR/SVG/painting.html#SpecifyingPaint",
+            "syntax": "none | <color> | <url> [ none | <color> ]? | context-fill | context-stroke"
+        },
+        "page-size": {
+            "comment": "https://www.w3.org/TR/css-page-3/#typedef-page-size-page-size",
+            "syntax": "A5 | A4 | A3 | B5 | B4 | JIS-B5 | JIS-B4 | letter | legal | ledger"
+        },
+        "ratio": {
+            "comment": "missed, https://drafts.csswg.org/mediaqueries-4/#typedef-ratio",
+            "syntax": "<integer> / <integer>"
+        },
+        "right": {
+            "comment": "missed; not sure we should add it, but no others except `shape` is using it so it's ok for now; https://drafts.fxtf.org/css-masking-1/#funcdef-clip-rect",
+            "syntax": "<length> | auto"
+        },
+        "shape": {
+            "comment": "missed spaces in function body and add backwards compatible syntax",
+            "syntax": "rect( <top>, <right>, <bottom>, <left> ) | rect( <top> <right> <bottom> <left> )"
+        },
+        "svg-length": {
+            "comment": "All coordinates and lengths in SVG can be specified with or without a unit identifier",
+            "references": [
+                "https://www.w3.org/TR/SVG11/coords.html#Units"
+            ],
+            "syntax": "<percentage> | <length> | <number>"
+        },
+        "svg-writing-mode": {
+            "comment": "SVG specific keywords (deprecated for CSS)",
+            "references": [
+                "https://developer.mozilla.org/en/docs/Web/CSS/writing-mode",
+                "https://www.w3.org/TR/SVG/text.html#WritingModeProperty"
+            ],
+            "syntax": "lr-tb | rl-tb | tb-rl | lr | rl | tb"
+        },
+        "top": {
+            "comment": "missed; not sure we should add it, but no others except `shape` is using it so it's ok for now; https://drafts.fxtf.org/css-masking-1/#funcdef-clip-rect",
+            "syntax": "<length> | auto"
+        },
+        "track-group": {
+            "comment": "used by old grid-columns and grid-rows syntax v0",
+            "syntax": "'(' [ <string>* <track-minmax> <string>* ]+ ')' [ '[' <positive-integer> ']' ]? | <track-minmax>"
+        },
+        "track-list-v0": {
+            "comment": "used by old grid-columns and grid-rows syntax v0",
+            "syntax": "[ <string>* <track-group> <string>* ]+ | none"
+        },
+        "track-minmax": {
+            "comment": "used by old grid-columns and grid-rows syntax v0",
+            "syntax": "minmax( <track-breadth> , <track-breadth> ) | auto | <track-breadth> | fit-content"
+        },
+        "x": {
+            "comment": "missed; not sure we should add it, but no others except `cursor` is using it so it's ok for now; https://drafts.csswg.org/css-ui-3/#cursor",
+            "syntax": "<number>"
+        },
+        "y": {
+            "comment": "missed; not sure we should add it, but no others except `cursor` is using so it's ok for now; https://drafts.csswg.org/css-ui-3/#cursor",
+            "syntax": "<number>"
+        },
+        "declaration": {
+            "comment": "missed, restored by https://drafts.csswg.org/css-syntax",
+            "syntax": "<ident-token> : <declaration-value>? [ '!' important ]?"
+        },
+        "declaration-list": {
+            "comment": "missed, restored by https://drafts.csswg.org/css-syntax",
+            "syntax": "[ <declaration>? ';' ]* <declaration>?"
+        },
+        "url": {
+            "comment": "https://drafts.csswg.org/css-values-4/#urls",
+            "syntax": "url( <string> <url-modifier>* ) | <url-token>"
+        },
+        "url-modifier": {
+            "comment": "https://drafts.csswg.org/css-values-4/#typedef-url-modifier",
+            "syntax": "<ident> | <function-token> <any-value> )"
+        },
+        "number-zero-one": {
+            "syntax": "<number [0,1]>"
+        },
+        "number-one-or-greater": {
+            "syntax": "<number [1,∞]>"
+        },
+        "positive-integer": {
+            "syntax": "<integer [0,∞]>"
+        },
+        "-non-standard-display": {
+            "syntax": "-ms-inline-flexbox | -ms-grid | -ms-inline-grid | -webkit-flex | -webkit-inline-flex | -webkit-box | -webkit-inline-box | -moz-inline-stack | -moz-box | -moz-inline-box"
+        }
+    }
+}
diff --git a/node_modules/css-tree/dist/csstree.js b/node_modules/css-tree/dist/csstree.js
new file mode 100644
index 0000000..9333729
--- /dev/null
+++ b/node_modules/css-tree/dist/csstree.js
@@ -0,0 +1,12606 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, global.csstree = factory());
+}(this, (function () { 'use strict';
+
+    //
+    //                              list
+    //                            ┌──────┐
+    //             ┌──────────────┼─head │
+    //             │              │ tail─┼──────────────┐
+    //             │              └──────┘              │
+    //             ▼                                    ▼
+    //            item        item        item        item
+    //          ┌──────┐    ┌──────┐    ┌──────┐    ┌──────┐
+    //  null ◀──┼─prev │◀───┼─prev │◀───┼─prev │◀───┼─prev │
+    //          │ next─┼───▶│ next─┼───▶│ next─┼───▶│ next─┼──▶ null
+    //          ├──────┤    ├──────┤    ├──────┤    ├──────┤
+    //          │ data │    │ data │    │ data │    │ data │
+    //          └──────┘    └──────┘    └──────┘    └──────┘
+    //
+
+    function createItem(data) {
+        return {
+            prev: null,
+            next: null,
+            data: data
+        };
+    }
+
+    function allocateCursor(node, prev, next) {
+        var cursor;
+
+        if (cursors !== null) {
+            cursor = cursors;
+            cursors = cursors.cursor;
+            cursor.prev = prev;
+            cursor.next = next;
+            cursor.cursor = node.cursor;
+        } else {
+            cursor = {
+                prev: prev,
+                next: next,
+                cursor: node.cursor
+            };
+        }
+
+        node.cursor = cursor;
+
+        return cursor;
+    }
+
+    function releaseCursor(node) {
+        var cursor = node.cursor;
+
+        node.cursor = cursor.cursor;
+        cursor.prev = null;
+        cursor.next = null;
+        cursor.cursor = cursors;
+        cursors = cursor;
+    }
+
+    var cursors = null;
+    var List = function() {
+        this.cursor = null;
+        this.head = null;
+        this.tail = null;
+    };
+
+    List.createItem = createItem;
+    List.prototype.createItem = createItem;
+
+    List.prototype.updateCursors = function(prevOld, prevNew, nextOld, nextNew) {
+        var cursor = this.cursor;
+
+        while (cursor !== null) {
+            if (cursor.prev === prevOld) {
+                cursor.prev = prevNew;
+            }
+
+            if (cursor.next === nextOld) {
+                cursor.next = nextNew;
+            }
+
+            cursor = cursor.cursor;
+        }
+    };
+
+    List.prototype.getSize = function() {
+        var size = 0;
+        var cursor = this.head;
+
+        while (cursor) {
+            size++;
+            cursor = cursor.next;
+        }
+
+        return size;
+    };
+
+    List.prototype.fromArray = function(array) {
+        var cursor = null;
+
+        this.head = null;
+
+        for (var i = 0; i < array.length; i++) {
+            var item = createItem(array[i]);
+
+            if (cursor !== null) {
+                cursor.next = item;
+            } else {
+                this.head = item;
+            }
+
+            item.prev = cursor;
+            cursor = item;
+        }
+
+        this.tail = cursor;
+
+        return this;
+    };
+
+    List.prototype.toArray = function() {
+        var cursor = this.head;
+        var result = [];
+
+        while (cursor) {
+            result.push(cursor.data);
+            cursor = cursor.next;
+        }
+
+        return result;
+    };
+
+    List.prototype.toJSON = List.prototype.toArray;
+
+    List.prototype.isEmpty = function() {
+        return this.head === null;
+    };
+
+    List.prototype.first = function() {
+        return this.head && this.head.data;
+    };
+
+    List.prototype.last = function() {
+        return this.tail && this.tail.data;
+    };
+
+    List.prototype.each = function(fn, context) {
+        var item;
+
+        if (context === undefined) {
+            context = this;
+        }
+
+        // push cursor
+        var cursor = allocateCursor(this, null, this.head);
+
+        while (cursor.next !== null) {
+            item = cursor.next;
+            cursor.next = item.next;
+
+            fn.call(context, item.data, item, this);
+        }
+
+        // pop cursor
+        releaseCursor(this);
+    };
+
+    List.prototype.forEach = List.prototype.each;
+
+    List.prototype.eachRight = function(fn, context) {
+        var item;
+
+        if (context === undefined) {
+            context = this;
+        }
+
+        // push cursor
+        var cursor = allocateCursor(this, this.tail, null);
+
+        while (cursor.prev !== null) {
+            item = cursor.prev;
+            cursor.prev = item.prev;
+
+            fn.call(context, item.data, item, this);
+        }
+
+        // pop cursor
+        releaseCursor(this);
+    };
+
+    List.prototype.forEachRight = List.prototype.eachRight;
+
+    List.prototype.reduce = function(fn, initialValue, context) {
+        var item;
+
+        if (context === undefined) {
+            context = this;
+        }
+
+        // push cursor
+        var cursor = allocateCursor(this, null, this.head);
+        var acc = initialValue;
+
+        while (cursor.next !== null) {
+            item = cursor.next;
+            cursor.next = item.next;
+
+            acc = fn.call(context, acc, item.data, item, this);
+        }
+
+        // pop cursor
+        releaseCursor(this);
+
+        return acc;
+    };
+
+    List.prototype.reduceRight = function(fn, initialValue, context) {
+        var item;
+
+        if (context === undefined) {
+            context = this;
+        }
+
+        // push cursor
+        var cursor = allocateCursor(this, this.tail, null);
+        var acc = initialValue;
+
+        while (cursor.prev !== null) {
+            item = cursor.prev;
+            cursor.prev = item.prev;
+
+            acc = fn.call(context, acc, item.data, item, this);
+        }
+
+        // pop cursor
+        releaseCursor(this);
+
+        return acc;
+    };
+
+    List.prototype.nextUntil = function(start, fn, context) {
+        if (start === null) {
+            return;
+        }
+
+        var item;
+
+        if (context === undefined) {
+            context = this;
+        }
+
+        // push cursor
+        var cursor = allocateCursor(this, null, start);
+
+        while (cursor.next !== null) {
+            item = cursor.next;
+            cursor.next = item.next;
+
+            if (fn.call(context, item.data, item, this)) {
+                break;
+            }
+        }
+
+        // pop cursor
+        releaseCursor(this);
+    };
+
+    List.prototype.prevUntil = function(start, fn, context) {
+        if (start === null) {
+            return;
+        }
+
+        var item;
+
+        if (context === undefined) {
+            context = this;
+        }
+
+        // push cursor
+        var cursor = allocateCursor(this, start, null);
+
+        while (cursor.prev !== null) {
+            item = cursor.prev;
+            cursor.prev = item.prev;
+
+            if (fn.call(context, item.data, item, this)) {
+                break;
+            }
+        }
+
+        // pop cursor
+        releaseCursor(this);
+    };
+
+    List.prototype.some = function(fn, context) {
+        var cursor = this.head;
+
+        if (context === undefined) {
+            context = this;
+        }
+
+        while (cursor !== null) {
+            if (fn.call(context, cursor.data, cursor, this)) {
+                return true;
+            }
+
+            cursor = cursor.next;
+        }
+
+        return false;
+    };
+
+    List.prototype.map = function(fn, context) {
+        var result = new List();
+        var cursor = this.head;
+
+        if (context === undefined) {
+            context = this;
+        }
+
+        while (cursor !== null) {
+            result.appendData(fn.call(context, cursor.data, cursor, this));
+            cursor = cursor.next;
+        }
+
+        return result;
+    };
+
+    List.prototype.filter = function(fn, context) {
+        var result = new List();
+        var cursor = this.head;
+
+        if (context === undefined) {
+            context = this;
+        }
+
+        while (cursor !== null) {
+            if (fn.call(context, cursor.data, cursor, this)) {
+                result.appendData(cursor.data);
+            }
+            cursor = cursor.next;
+        }
+
+        return result;
+    };
+
+    List.prototype.clear = function() {
+        this.head = null;
+        this.tail = null;
+    };
+
+    List.prototype.copy = function() {
+        var result = new List();
+        var cursor = this.head;
+
+        while (cursor !== null) {
+            result.insert(createItem(cursor.data));
+            cursor = cursor.next;
+        }
+
+        return result;
+    };
+
+    List.prototype.prepend = function(item) {
+        //      head
+        //    ^
+        // item
+        this.updateCursors(null, item, this.head, item);
+
+        // insert to the beginning of the list
+        if (this.head !== null) {
+            // new item <- first item
+            this.head.prev = item;
+
+            // new item -> first item
+            item.next = this.head;
+        } else {
+            // if list has no head, then it also has no tail
+            // in this case tail points to the new item
+            this.tail = item;
+        }
+
+        // head always points to new item
+        this.head = item;
+
+        return this;
+    };
+
+    List.prototype.prependData = function(data) {
+        return this.prepend(createItem(data));
+    };
+
+    List.prototype.append = function(item) {
+        return this.insert(item);
+    };
+
+    List.prototype.appendData = function(data) {
+        return this.insert(createItem(data));
+    };
+
+    List.prototype.insert = function(item, before) {
+        if (before !== undefined && before !== null) {
+            // prev   before
+            //      ^
+            //     item
+            this.updateCursors(before.prev, item, before, item);
+
+            if (before.prev === null) {
+                // insert to the beginning of list
+                if (this.head !== before) {
+                    throw new Error('before doesn\'t belong to list');
+                }
+
+                // since head points to before therefore list doesn't empty
+                // no need to check tail
+                this.head = item;
+                before.prev = item;
+                item.next = before;
+
+                this.updateCursors(null, item);
+            } else {
+
+                // insert between two items
+                before.prev.next = item;
+                item.prev = before.prev;
+
+                before.prev = item;
+                item.next = before;
+            }
+        } else {
+            // tail
+            //      ^
+            //      item
+            this.updateCursors(this.tail, item, null, item);
+
+            // insert to the ending of the list
+            if (this.tail !== null) {
+                // last item -> new item
+                this.tail.next = item;
+
+                // last item <- new item
+                item.prev = this.tail;
+            } else {
+                // if list has no tail, then it also has no head
+                // in this case head points to new item
+                this.head = item;
+            }
+
+            // tail always points to new item
+            this.tail = item;
+        }
+
+        return this;
+    };
+
+    List.prototype.insertData = function(data, before) {
+        return this.insert(createItem(data), before);
+    };
+
+    List.prototype.remove = function(item) {
+        //      item
+        //       ^
+        // prev     next
+        this.updateCursors(item, item.prev, item, item.next);
+
+        if (item.prev !== null) {
+            item.prev.next = item.next;
+        } else {
+            if (this.head !== item) {
+                throw new Error('item doesn\'t belong to list');
+            }
+
+            this.head = item.next;
+        }
+
+        if (item.next !== null) {
+            item.next.prev = item.prev;
+        } else {
+            if (this.tail !== item) {
+                throw new Error('item doesn\'t belong to list');
+            }
+
+            this.tail = item.prev;
+        }
+
+        item.prev = null;
+        item.next = null;
+
+        return item;
+    };
+
+    List.prototype.push = function(data) {
+        this.insert(createItem(data));
+    };
+
+    List.prototype.pop = function() {
+        if (this.tail !== null) {
+            return this.remove(this.tail);
+        }
+    };
+
+    List.prototype.unshift = function(data) {
+        this.prepend(createItem(data));
+    };
+
+    List.prototype.shift = function() {
+        if (this.head !== null) {
+            return this.remove(this.head);
+        }
+    };
+
+    List.prototype.prependList = function(list) {
+        return this.insertList(list, this.head);
+    };
+
+    List.prototype.appendList = function(list) {
+        return this.insertList(list);
+    };
+
+    List.prototype.insertList = function(list, before) {
+        // ignore empty lists
+        if (list.head === null) {
+            return this;
+        }
+
+        if (before !== undefined && before !== null) {
+            this.updateCursors(before.prev, list.tail, before, list.head);
+
+            // insert in the middle of dist list
+            if (before.prev !== null) {
+                // before.prev <-> list.head
+                before.prev.next = list.head;
+                list.head.prev = before.prev;
+            } else {
+                this.head = list.head;
+            }
+
+            before.prev = list.tail;
+            list.tail.next = before;
+        } else {
+            this.updateCursors(this.tail, list.tail, null, list.head);
+
+            // insert to end of the list
+            if (this.tail !== null) {
+                // if destination list has a tail, then it also has a head,
+                // but head doesn't change
+
+                // dest tail -> source head
+                this.tail.next = list.head;
+
+                // dest tail <- source head
+                list.head.prev = this.tail;
+            } else {
+                // if list has no a tail, then it also has no a head
+                // in this case points head to new item
+                this.head = list.head;
+            }
+
+            // tail always start point to new item
+            this.tail = list.tail;
+        }
+
+        list.head = null;
+        list.tail = null;
+
+        return this;
+    };
+
+    List.prototype.replace = function(oldItem, newItemOrList) {
+        if ('head' in newItemOrList) {
+            this.insertList(newItemOrList, oldItem);
+        } else {
+            this.insert(newItemOrList, oldItem);
+        }
+
+        this.remove(oldItem);
+    };
+
+    var List_1 = List;
+
+    var createCustomError = function createCustomError(name, message) {
+        // use Object.create(), because some VMs prevent setting line/column otherwise
+        // (iOS Safari 10 even throws an exception)
+        var error = Object.create(SyntaxError.prototype);
+        var errorStack = new Error();
+
+        error.name = name;
+        error.message = message;
+
+        Object.defineProperty(error, 'stack', {
+            get: function() {
+                return (errorStack.stack || '').replace(/^(.+\n){1,3}/, name + ': ' + message + '\n');
+            }
+        });
+
+        return error;
+    };
+
+    var MAX_LINE_LENGTH = 100;
+    var OFFSET_CORRECTION = 60;
+    var TAB_REPLACEMENT = '    ';
+
+    function sourceFragment(error, extraLines) {
+        function processLines(start, end) {
+            return lines.slice(start, end).map(function(line, idx) {
+                var num = String(start + idx + 1);
+
+                while (num.length < maxNumLength) {
+                    num = ' ' + num;
+                }
+
+                return num + ' |' + line;
+            }).join('\n');
+        }
+
+        var lines = error.source.split(/\r\n?|\n|\f/);
+        var line = error.line;
+        var column = error.column;
+        var startLine = Math.max(1, line - extraLines) - 1;
+        var endLine = Math.min(line + extraLines, lines.length + 1);
+        var maxNumLength = Math.max(4, String(endLine).length) + 1;
+        var cutLeft = 0;
+
+        // column correction according to replaced tab before column
+        column += (TAB_REPLACEMENT.length - 1) * (lines[line - 1].substr(0, column - 1).match(/\t/g) || []).length;
+
+        if (column > MAX_LINE_LENGTH) {
+            cutLeft = column - OFFSET_CORRECTION + 3;
+            column = OFFSET_CORRECTION - 2;
+        }
+
+        for (var i = startLine; i <= endLine; i++) {
+            if (i >= 0 && i < lines.length) {
+                lines[i] = lines[i].replace(/\t/g, TAB_REPLACEMENT);
+                lines[i] =
+                    (cutLeft > 0 && lines[i].length > cutLeft ? '\u2026' : '') +
+                    lines[i].substr(cutLeft, MAX_LINE_LENGTH - 2) +
+                    (lines[i].length > cutLeft + MAX_LINE_LENGTH - 1 ? '\u2026' : '');
+            }
+        }
+
+        return [
+            processLines(startLine, line),
+            new Array(column + maxNumLength + 2).join('-') + '^',
+            processLines(line, endLine)
+        ].filter(Boolean).join('\n');
+    }
+
+    var SyntaxError$1 = function(message, source, offset, line, column) {
+        var error = createCustomError('SyntaxError', message);
+
+        error.source = source;
+        error.offset = offset;
+        error.line = line;
+        error.column = column;
+
+        error.sourceFragment = function(extraLines) {
+            return sourceFragment(error, isNaN(extraLines) ? 0 : extraLines);
+        };
+        Object.defineProperty(error, 'formattedMessage', {
+            get: function() {
+                return (
+                    'Parse error: ' + error.message + '\n' +
+                    sourceFragment(error, 2)
+                );
+            }
+        });
+
+        // for backward capability
+        error.parseError = {
+            offset: offset,
+            line: line,
+            column: column
+        };
+
+        return error;
+    };
+
+    var _SyntaxError = SyntaxError$1;
+
+    // CSS Syntax Module Level 3
+    // https://www.w3.org/TR/css-syntax-3/
+    var TYPE = {
+        EOF: 0,                 // <EOF-token>
+        Ident: 1,               // <ident-token>
+        Function: 2,            // <function-token>
+        AtKeyword: 3,           // <at-keyword-token>
+        Hash: 4,                // <hash-token>
+        String: 5,              // <string-token>
+        BadString: 6,           // <bad-string-token>
+        Url: 7,                 // <url-token>
+        BadUrl: 8,              // <bad-url-token>
+        Delim: 9,               // <delim-token>
+        Number: 10,             // <number-token>
+        Percentage: 11,         // <percentage-token>
+        Dimension: 12,          // <dimension-token>
+        WhiteSpace: 13,         // <whitespace-token>
+        CDO: 14,                // <CDO-token>
+        CDC: 15,                // <CDC-token>
+        Colon: 16,              // <colon-token>     :
+        Semicolon: 17,          // <semicolon-token> ;
+        Comma: 18,              // <comma-token>     ,
+        LeftSquareBracket: 19,  // <[-token>
+        RightSquareBracket: 20, // <]-token>
+        LeftParenthesis: 21,    // <(-token>
+        RightParenthesis: 22,   // <)-token>
+        LeftCurlyBracket: 23,   // <{-token>
+        RightCurlyBracket: 24,  // <}-token>
+        Comment: 25
+    };
+
+    var NAME = Object.keys(TYPE).reduce(function(result, key) {
+        result[TYPE[key]] = key;
+        return result;
+    }, {});
+
+    var _const = {
+        TYPE: TYPE,
+        NAME: NAME
+    };
+
+    var EOF = 0;
+
+    // https://drafts.csswg.org/css-syntax-3/
+    // § 4.2. Definitions
+
+    // digit
+    // A code point between U+0030 DIGIT ZERO (0) and U+0039 DIGIT NINE (9).
+    function isDigit(code) {
+        return code >= 0x0030 && code <= 0x0039;
+    }
+
+    // hex digit
+    // A digit, or a code point between U+0041 LATIN CAPITAL LETTER A (A) and U+0046 LATIN CAPITAL LETTER F (F),
+    // or a code point between U+0061 LATIN SMALL LETTER A (a) and U+0066 LATIN SMALL LETTER F (f).
+    function isHexDigit(code) {
+        return (
+            isDigit(code) || // 0 .. 9
+            (code >= 0x0041 && code <= 0x0046) || // A .. F
+            (code >= 0x0061 && code <= 0x0066)    // a .. f
+        );
+    }
+
+    // uppercase letter
+    // A code point between U+0041 LATIN CAPITAL LETTER A (A) and U+005A LATIN CAPITAL LETTER Z (Z).
+    function isUppercaseLetter(code) {
+        return code >= 0x0041 && code <= 0x005A;
+    }
+
+    // lowercase letter
+    // A code point between U+0061 LATIN SMALL LETTER A (a) and U+007A LATIN SMALL LETTER Z (z).
+    function isLowercaseLetter(code) {
+        return code >= 0x0061 && code <= 0x007A;
+    }
+
+    // letter
+    // An uppercase letter or a lowercase letter.
+    function isLetter(code) {
+        return isUppercaseLetter(code) || isLowercaseLetter(code);
+    }
+
+    // non-ASCII code point
+    // A code point with a value equal to or greater than U+0080 <control>.
+    function isNonAscii(code) {
+        return code >= 0x0080;
+    }
+
+    // name-start code point
+    // A letter, a non-ASCII code point, or U+005F LOW LINE (_).
+    function isNameStart(code) {
+        return isLetter(code) || isNonAscii(code) || code === 0x005F;
+    }
+
+    // name code point
+    // A name-start code point, a digit, or U+002D HYPHEN-MINUS (-).
+    function isName(code) {
+        return isNameStart(code) || isDigit(code) || code === 0x002D;
+    }
+
+    // non-printable code point
+    // A code point between U+0000 NULL and U+0008 BACKSPACE, or U+000B LINE TABULATION,
+    // or a code point between U+000E SHIFT OUT and U+001F INFORMATION SEPARATOR ONE, or U+007F DELETE.
+    function isNonPrintable(code) {
+        return (
+            (code >= 0x0000 && code <= 0x0008) ||
+            (code === 0x000B) ||
+            (code >= 0x000E && code <= 0x001F) ||
+            (code === 0x007F)
+        );
+    }
+
+    // newline
+    // U+000A LINE FEED. Note that U+000D CARRIAGE RETURN and U+000C FORM FEED are not included in this definition,
+    // as they are converted to U+000A LINE FEED during preprocessing.
+    // TODO: we doesn't do a preprocessing, so check a code point for U+000D CARRIAGE RETURN and U+000C FORM FEED
+    function isNewline(code) {
+        return code === 0x000A || code === 0x000D || code === 0x000C;
+    }
+
+    // whitespace
+    // A newline, U+0009 CHARACTER TABULATION, or U+0020 SPACE.
+    function isWhiteSpace(code) {
+        return isNewline(code) || code === 0x0020 || code === 0x0009;
+    }
+
+    // § 4.3.8. Check if two code points are a valid escape
+    function isValidEscape(first, second) {
+        // If the first code point is not U+005C REVERSE SOLIDUS (\), return false.
+        if (first !== 0x005C) {
+            return false;
+        }
+
+        // Otherwise, if the second code point is a newline or EOF, return false.
+        if (isNewline(second) || second === EOF) {
+            return false;
+        }
+
+        // Otherwise, return true.
+        return true;
+    }
+
+    // § 4.3.9. Check if three code points would start an identifier
+    function isIdentifierStart(first, second, third) {
+        // Look at the first code point:
+
+        // U+002D HYPHEN-MINUS
+        if (first === 0x002D) {
+            // If the second code point is a name-start code point or a U+002D HYPHEN-MINUS,
+            // or the second and third code points are a valid escape, return true. Otherwise, return false.
+            return (
+                isNameStart(second) ||
+                second === 0x002D ||
+                isValidEscape(second, third)
+            );
+        }
+
+        // name-start code point
+        if (isNameStart(first)) {
+            // Return true.
+            return true;
+        }
+
+        // U+005C REVERSE SOLIDUS (\)
+        if (first === 0x005C) {
+            // If the first and second code points are a valid escape, return true. Otherwise, return false.
+            return isValidEscape(first, second);
+        }
+
+        // anything else
+        // Return false.
+        return false;
+    }
+
+    // § 4.3.10. Check if three code points would start a number
+    function isNumberStart(first, second, third) {
+        // Look at the first code point:
+
+        // U+002B PLUS SIGN (+)
+        // U+002D HYPHEN-MINUS (-)
+        if (first === 0x002B || first === 0x002D) {
+            // If the second code point is a digit, return true.
+            if (isDigit(second)) {
+                return 2;
+            }
+
+            // Otherwise, if the second code point is a U+002E FULL STOP (.)
+            // and the third code point is a digit, return true.
+            // Otherwise, return false.
+            return second === 0x002E && isDigit(third) ? 3 : 0;
+        }
+
+        // U+002E FULL STOP (.)
+        if (first === 0x002E) {
+            // If the second code point is a digit, return true. Otherwise, return false.
+            return isDigit(second) ? 2 : 0;
+        }
+
+        // digit
+        if (isDigit(first)) {
+            // Return true.
+            return 1;
+        }
+
+        // anything else
+        // Return false.
+        return 0;
+    }
+
+    //
+    // Misc
+    //
+
+    // detect BOM (https://en.wikipedia.org/wiki/Byte_order_mark)
+    function isBOM(code) {
+        // UTF-16BE
+        if (code === 0xFEFF) {
+            return 1;
+        }
+
+        // UTF-16LE
+        if (code === 0xFFFE) {
+            return 1;
+        }
+
+        return 0;
+    }
+
+    // Fast code category
+    //
+    // https://drafts.csswg.org/css-syntax/#tokenizer-definitions
+    // > non-ASCII code point
+    // >   A code point with a value equal to or greater than U+0080 <control>
+    // > name-start code point
+    // >   A letter, a non-ASCII code point, or U+005F LOW LINE (_).
+    // > name code point
+    // >   A name-start code point, a digit, or U+002D HYPHEN-MINUS (-)
+    // That means only ASCII code points has a special meaning and we define a maps for 0..127 codes only
+    var CATEGORY = new Array(0x80);
+    charCodeCategory.Eof = 0x80;
+    charCodeCategory.WhiteSpace = 0x82;
+    charCodeCategory.Digit = 0x83;
+    charCodeCategory.NameStart = 0x84;
+    charCodeCategory.NonPrintable = 0x85;
+
+    for (var i = 0; i < CATEGORY.length; i++) {
+        switch (true) {
+            case isWhiteSpace(i):
+                CATEGORY[i] = charCodeCategory.WhiteSpace;
+                break;
+
+            case isDigit(i):
+                CATEGORY[i] = charCodeCategory.Digit;
+                break;
+
+            case isNameStart(i):
+                CATEGORY[i] = charCodeCategory.NameStart;
+                break;
+
+            case isNonPrintable(i):
+                CATEGORY[i] = charCodeCategory.NonPrintable;
+                break;
+
+            default:
+                CATEGORY[i] = i || charCodeCategory.Eof;
+        }
+    }
+
+    function charCodeCategory(code) {
+        return code < 0x80 ? CATEGORY[code] : charCodeCategory.NameStart;
+    }
+    var charCodeDefinitions = {
+        isDigit: isDigit,
+        isHexDigit: isHexDigit,
+        isUppercaseLetter: isUppercaseLetter,
+        isLowercaseLetter: isLowercaseLetter,
+        isLetter: isLetter,
+        isNonAscii: isNonAscii,
+        isNameStart: isNameStart,
+        isName: isName,
+        isNonPrintable: isNonPrintable,
+        isNewline: isNewline,
+        isWhiteSpace: isWhiteSpace,
+        isValidEscape: isValidEscape,
+        isIdentifierStart: isIdentifierStart,
+        isNumberStart: isNumberStart,
+
+        isBOM: isBOM,
+        charCodeCategory: charCodeCategory
+    };
+
+    var isDigit$1 = charCodeDefinitions.isDigit;
+    var isHexDigit$1 = charCodeDefinitions.isHexDigit;
+    var isUppercaseLetter$1 = charCodeDefinitions.isUppercaseLetter;
+    var isName$1 = charCodeDefinitions.isName;
+    var isWhiteSpace$1 = charCodeDefinitions.isWhiteSpace;
+    var isValidEscape$1 = charCodeDefinitions.isValidEscape;
+
+    function getCharCode(source, offset) {
+        return offset < source.length ? source.charCodeAt(offset) : 0;
+    }
+
+    function getNewlineLength(source, offset, code) {
+        if (code === 13 /* \r */ && getCharCode(source, offset + 1) === 10 /* \n */) {
+            return 2;
+        }
+
+        return 1;
+    }
+
+    function cmpChar(testStr, offset, referenceCode) {
+        var code = testStr.charCodeAt(offset);
+
+        // code.toLowerCase() for A..Z
+        if (isUppercaseLetter$1(code)) {
+            code = code | 32;
+        }
+
+        return code === referenceCode;
+    }
+
+    function cmpStr(testStr, start, end, referenceStr) {
+        if (end - start !== referenceStr.length) {
+            return false;
+        }
+
+        if (start < 0 || end > testStr.length) {
+            return false;
+        }
+
+        for (var i = start; i < end; i++) {
+            var testCode = testStr.charCodeAt(i);
+            var referenceCode = referenceStr.charCodeAt(i - start);
+
+            // testCode.toLowerCase() for A..Z
+            if (isUppercaseLetter$1(testCode)) {
+                testCode = testCode | 32;
+            }
+
+            if (testCode !== referenceCode) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    function findWhiteSpaceStart(source, offset) {
+        for (; offset >= 0; offset--) {
+            if (!isWhiteSpace$1(source.charCodeAt(offset))) {
+                break;
+            }
+        }
+
+        return offset + 1;
+    }
+
+    function findWhiteSpaceEnd(source, offset) {
+        for (; offset < source.length; offset++) {
+            if (!isWhiteSpace$1(source.charCodeAt(offset))) {
+                break;
+            }
+        }
+
+        return offset;
+    }
+
+    function findDecimalNumberEnd(source, offset) {
+        for (; offset < source.length; offset++) {
+            if (!isDigit$1(source.charCodeAt(offset))) {
+                break;
+            }
+        }
+
+        return offset;
+    }
+
+    // § 4.3.7. Consume an escaped code point
+    function consumeEscaped(source, offset) {
+        // It assumes that the U+005C REVERSE SOLIDUS (\) has already been consumed and
+        // that the next input code point has already been verified to be part of a valid escape.
+        offset += 2;
+
+        // hex digit
+        if (isHexDigit$1(getCharCode(source, offset - 1))) {
+            // Consume as many hex digits as possible, but no more than 5.
+            // Note that this means 1-6 hex digits have been consumed in total.
+            for (var maxOffset = Math.min(source.length, offset + 5); offset < maxOffset; offset++) {
+                if (!isHexDigit$1(getCharCode(source, offset))) {
+                    break;
+                }
+            }
+
+            // If the next input code point is whitespace, consume it as well.
+            var code = getCharCode(source, offset);
+            if (isWhiteSpace$1(code)) {
+                offset += getNewlineLength(source, offset, code);
+            }
+        }
+
+        return offset;
+    }
+
+    // §4.3.11. Consume a name
+    // Note: This algorithm does not do the verification of the first few code points that are necessary
+    // to ensure the returned code points would constitute an <ident-token>. If that is the intended use,
+    // ensure that the stream starts with an identifier before calling this algorithm.
+    function consumeName(source, offset) {
+        // Let result initially be an empty string.
+        // Repeatedly consume the next input code point from the stream:
+        for (; offset < source.length; offset++) {
+            var code = source.charCodeAt(offset);
+
+            // name code point
+            if (isName$1(code)) {
+                // Append the code point to result.
+                continue;
+            }
+
+            // the stream starts with a valid escape
+            if (isValidEscape$1(code, getCharCode(source, offset + 1))) {
+                // Consume an escaped code point. Append the returned code point to result.
+                offset = consumeEscaped(source, offset) - 1;
+                continue;
+            }
+
+            // anything else
+            // Reconsume the current input code point. Return result.
+            break;
+        }
+
+        return offset;
+    }
+
+    // §4.3.12. Consume a number
+    function consumeNumber(source, offset) {
+        var code = source.charCodeAt(offset);
+
+        // 2. If the next input code point is U+002B PLUS SIGN (+) or U+002D HYPHEN-MINUS (-),
+        // consume it and append it to repr.
+        if (code === 0x002B || code === 0x002D) {
+            code = source.charCodeAt(offset += 1);
+        }
+
+        // 3. While the next input code point is a digit, consume it and append it to repr.
+        if (isDigit$1(code)) {
+            offset = findDecimalNumberEnd(source, offset + 1);
+            code = source.charCodeAt(offset);
+        }
+
+        // 4. If the next 2 input code points are U+002E FULL STOP (.) followed by a digit, then:
+        if (code === 0x002E && isDigit$1(source.charCodeAt(offset + 1))) {
+            // 4.1 Consume them.
+            // 4.2 Append them to repr.
+            code = source.charCodeAt(offset += 2);
+
+            // 4.3 Set type to "number".
+            // TODO
+
+            // 4.4 While the next input code point is a digit, consume it and append it to repr.
+
+            offset = findDecimalNumberEnd(source, offset);
+        }
+
+        // 5. If the next 2 or 3 input code points are U+0045 LATIN CAPITAL LETTER E (E)
+        // or U+0065 LATIN SMALL LETTER E (e), ... , followed by a digit, then:
+        if (cmpChar(source, offset, 101 /* e */)) {
+            var sign = 0;
+            code = source.charCodeAt(offset + 1);
+
+            // ... optionally followed by U+002D HYPHEN-MINUS (-) or U+002B PLUS SIGN (+) ...
+            if (code === 0x002D || code === 0x002B) {
+                sign = 1;
+                code = source.charCodeAt(offset + 2);
+            }
+
+            // ... followed by a digit
+            if (isDigit$1(code)) {
+                // 5.1 Consume them.
+                // 5.2 Append them to repr.
+
+                // 5.3 Set type to "number".
+                // TODO
+
+                // 5.4 While the next input code point is a digit, consume it and append it to repr.
+                offset = findDecimalNumberEnd(source, offset + 1 + sign + 1);
+            }
+        }
+
+        return offset;
+    }
+
+    // § 4.3.14. Consume the remnants of a bad url
+    // ... its sole use is to consume enough of the input stream to reach a recovery point
+    // where normal tokenizing can resume.
+    function consumeBadUrlRemnants(source, offset) {
+        // Repeatedly consume the next input code point from the stream:
+        for (; offset < source.length; offset++) {
+            var code = source.charCodeAt(offset);
+
+            // U+0029 RIGHT PARENTHESIS ())
+            // EOF
+            if (code === 0x0029) {
+                // Return.
+                offset++;
+                break;
+            }
+
+            if (isValidEscape$1(code, getCharCode(source, offset + 1))) {
+                // Consume an escaped code point.
+                // Note: This allows an escaped right parenthesis ("\)") to be encountered
+                // without ending the <bad-url-token>. This is otherwise identical to
+                // the "anything else" clause.
+                offset = consumeEscaped(source, offset);
+            }
+        }
+
+        return offset;
+    }
+
+    var utils = {
+        consumeEscaped: consumeEscaped,
+        consumeName: consumeName,
+        consumeNumber: consumeNumber,
+        consumeBadUrlRemnants: consumeBadUrlRemnants,
+
+        cmpChar: cmpChar,
+        cmpStr: cmpStr,
+
+        getNewlineLength: getNewlineLength,
+        findWhiteSpaceStart: findWhiteSpaceStart,
+        findWhiteSpaceEnd: findWhiteSpaceEnd
+    };
+
+    var TYPE$1 = _const.TYPE;
+    var NAME$1 = _const.NAME;
+
+
+    var cmpStr$1 = utils.cmpStr;
+
+    var EOF$1 = TYPE$1.EOF;
+    var WHITESPACE = TYPE$1.WhiteSpace;
+    var COMMENT = TYPE$1.Comment;
+
+    var OFFSET_MASK = 0x00FFFFFF;
+    var TYPE_SHIFT = 24;
+
+    var TokenStream = function() {
+        this.offsetAndType = null;
+        this.balance = null;
+
+        this.reset();
+    };
+
+    TokenStream.prototype = {
+        reset: function() {
+            this.eof = false;
+            this.tokenIndex = -1;
+            this.tokenType = 0;
+            this.tokenStart = this.firstCharOffset;
+            this.tokenEnd = this.firstCharOffset;
+        },
+
+        lookupType: function(offset) {
+            offset += this.tokenIndex;
+
+            if (offset < this.tokenCount) {
+                return this.offsetAndType[offset] >> TYPE_SHIFT;
+            }
+
+            return EOF$1;
+        },
+        lookupOffset: function(offset) {
+            offset += this.tokenIndex;
+
+            if (offset < this.tokenCount) {
+                return this.offsetAndType[offset - 1] & OFFSET_MASK;
+            }
+
+            return this.source.length;
+        },
+        lookupValue: function(offset, referenceStr) {
+            offset += this.tokenIndex;
+
+            if (offset < this.tokenCount) {
+                return cmpStr$1(
+                    this.source,
+                    this.offsetAndType[offset - 1] & OFFSET_MASK,
+                    this.offsetAndType[offset] & OFFSET_MASK,
+                    referenceStr
+                );
+            }
+
+            return false;
+        },
+        getTokenStart: function(tokenIndex) {
+            if (tokenIndex === this.tokenIndex) {
+                return this.tokenStart;
+            }
+
+            if (tokenIndex > 0) {
+                return tokenIndex < this.tokenCount
+                    ? this.offsetAndType[tokenIndex - 1] & OFFSET_MASK
+                    : this.offsetAndType[this.tokenCount] & OFFSET_MASK;
+            }
+
+            return this.firstCharOffset;
+        },
+
+        // TODO: -> skipUntilBalanced
+        getRawLength: function(startToken, mode) {
+            var cursor = startToken;
+            var balanceEnd;
+            var offset = this.offsetAndType[Math.max(cursor - 1, 0)] & OFFSET_MASK;
+            var type;
+
+            loop:
+            for (; cursor < this.tokenCount; cursor++) {
+                balanceEnd = this.balance[cursor];
+
+                // stop scanning on balance edge that points to offset before start token
+                if (balanceEnd < startToken) {
+                    break loop;
+                }
+
+                type = this.offsetAndType[cursor] >> TYPE_SHIFT;
+
+                // check token is stop type
+                switch (mode(type, this.source, offset)) {
+                    case 1:
+                        break loop;
+
+                    case 2:
+                        cursor++;
+                        break loop;
+
+                    default:
+                        // fast forward to the end of balanced block
+                        if (this.balance[balanceEnd] === cursor) {
+                            cursor = balanceEnd;
+                        }
+
+                        offset = this.offsetAndType[cursor] & OFFSET_MASK;
+                }
+            }
+
+            return cursor - this.tokenIndex;
+        },
+        isBalanceEdge: function(pos) {
+            return this.balance[this.tokenIndex] < pos;
+        },
+        isDelim: function(code, offset) {
+            if (offset) {
+                return (
+                    this.lookupType(offset) === TYPE$1.Delim &&
+                    this.source.charCodeAt(this.lookupOffset(offset)) === code
+                );
+            }
+
+            return (
+                this.tokenType === TYPE$1.Delim &&
+                this.source.charCodeAt(this.tokenStart) === code
+            );
+        },
+
+        getTokenValue: function() {
+            return this.source.substring(this.tokenStart, this.tokenEnd);
+        },
+        getTokenLength: function() {
+            return this.tokenEnd - this.tokenStart;
+        },
+        substrToCursor: function(start) {
+            return this.source.substring(start, this.tokenStart);
+        },
+
+        skipWS: function() {
+            for (var i = this.tokenIndex, skipTokenCount = 0; i < this.tokenCount; i++, skipTokenCount++) {
+                if ((this.offsetAndType[i] >> TYPE_SHIFT) !== WHITESPACE) {
+                    break;
+                }
+            }
+
+            if (skipTokenCount > 0) {
+                this.skip(skipTokenCount);
+            }
+        },
+        skipSC: function() {
+            while (this.tokenType === WHITESPACE || this.tokenType === COMMENT) {
+                this.next();
+            }
+        },
+        skip: function(tokenCount) {
+            var next = this.tokenIndex + tokenCount;
+
+            if (next < this.tokenCount) {
+                this.tokenIndex = next;
+                this.tokenStart = this.offsetAndType[next - 1] & OFFSET_MASK;
+                next = this.offsetAndType[next];
+                this.tokenType = next >> TYPE_SHIFT;
+                this.tokenEnd = next & OFFSET_MASK;
+            } else {
+                this.tokenIndex = this.tokenCount;
+                this.next();
+            }
+        },
+        next: function() {
+            var next = this.tokenIndex + 1;
+
+            if (next < this.tokenCount) {
+                this.tokenIndex = next;
+                this.tokenStart = this.tokenEnd;
+                next = this.offsetAndType[next];
+                this.tokenType = next >> TYPE_SHIFT;
+                this.tokenEnd = next & OFFSET_MASK;
+            } else {
+                this.tokenIndex = this.tokenCount;
+                this.eof = true;
+                this.tokenType = EOF$1;
+                this.tokenStart = this.tokenEnd = this.source.length;
+            }
+        },
+
+        forEachToken(fn) {
+            for (var i = 0, offset = this.firstCharOffset; i < this.tokenCount; i++) {
+                var start = offset;
+                var item = this.offsetAndType[i];
+                var end = item & OFFSET_MASK;
+                var type = item >> TYPE_SHIFT;
+
+                offset = end;
+
+                fn(type, start, end, i);
+            }
+        },
+
+        dump() {
+            var tokens = new Array(this.tokenCount);
+
+            this.forEachToken((type, start, end, index) => {
+                tokens[index] = {
+                    idx: index,
+                    type: NAME$1[type],
+                    chunk: this.source.substring(start, end),
+                    balance: this.balance[index]
+                };
+            });
+
+            return tokens;
+        }
+    };
+
+    var TokenStream_1 = TokenStream;
+
+    function noop(value) {
+        return value;
+    }
+
+    function generateMultiplier(multiplier) {
+        if (multiplier.min === 0 && multiplier.max === 0) {
+            return '*';
+        }
+
+        if (multiplier.min === 0 && multiplier.max === 1) {
+            return '?';
+        }
+
+        if (multiplier.min === 1 && multiplier.max === 0) {
+            return multiplier.comma ? '#' : '+';
+        }
+
+        if (multiplier.min === 1 && multiplier.max === 1) {
+            return '';
+        }
+
+        return (
+            (multiplier.comma ? '#' : '') +
+            (multiplier.min === multiplier.max
+                ? '{' + multiplier.min + '}'
+                : '{' + multiplier.min + ',' + (multiplier.max !== 0 ? multiplier.max : '') + '}'
+            )
+        );
+    }
+
+    function generateTypeOpts(node) {
+        switch (node.type) {
+            case 'Range':
+                return (
+                    ' [' +
+                    (node.min === null ? '-∞' : node.min) +
+                    ',' +
+                    (node.max === null ? '∞' : node.max) +
+                    ']'
+                );
+
+            default:
+                throw new Error('Unknown node type `' + node.type + '`');
+        }
+    }
+
+    function generateSequence(node, decorate, forceBraces, compact) {
+        var combinator = node.combinator === ' ' || compact ? node.combinator : ' ' + node.combinator + ' ';
+        var result = node.terms.map(function(term) {
+            return generate(term, decorate, forceBraces, compact);
+        }).join(combinator);
+
+        if (node.explicit || forceBraces) {
+            result = (compact || result[0] === ',' ? '[' : '[ ') + result + (compact ? ']' : ' ]');
+        }
+
+        return result;
+    }
+
+    function generate(node, decorate, forceBraces, compact) {
+        var result;
+
+        switch (node.type) {
+            case 'Group':
+                result =
+                    generateSequence(node, decorate, forceBraces, compact) +
+                    (node.disallowEmpty ? '!' : '');
+                break;
+
+            case 'Multiplier':
+                // return since node is a composition
+                return (
+                    generate(node.term, decorate, forceBraces, compact) +
+                    decorate(generateMultiplier(node), node)
+                );
+
+            case 'Type':
+                result = '<' + node.name + (node.opts ? decorate(generateTypeOpts(node.opts), node.opts) : '') + '>';
+                break;
+
+            case 'Property':
+                result = '<\'' + node.name + '\'>';
+                break;
+
+            case 'Keyword':
+                result = node.name;
+                break;
+
+            case 'AtKeyword':
+                result = '@' + node.name;
+                break;
+
+            case 'Function':
+                result = node.name + '(';
+                break;
+
+            case 'String':
+            case 'Token':
+                result = node.value;
+                break;
+
+            case 'Comma':
+                result = ',';
+                break;
+
+            default:
+                throw new Error('Unknown node type `' + node.type + '`');
+        }
+
+        return decorate(result, node);
+    }
+
+    var generate_1 = function(node, options) {
+        var decorate = noop;
+        var forceBraces = false;
+        var compact = false;
+
+        if (typeof options === 'function') {
+            decorate = options;
+        } else if (options) {
+            forceBraces = Boolean(options.forceBraces);
+            compact = Boolean(options.compact);
+            if (typeof options.decorate === 'function') {
+                decorate = options.decorate;
+            }
+        }
+
+        return generate(node, decorate, forceBraces, compact);
+    };
+
+    const defaultLoc = { offset: 0, line: 1, column: 1 };
+
+    function locateMismatch(matchResult, node) {
+        const tokens = matchResult.tokens;
+        const longestMatch = matchResult.longestMatch;
+        const mismatchNode = longestMatch < tokens.length ? tokens[longestMatch].node || null : null;
+        const badNode = mismatchNode !== node ? mismatchNode : null;
+        let mismatchOffset = 0;
+        let mismatchLength = 0;
+        let entries = 0;
+        let css = '';
+        let start;
+        let end;
+
+        for (let i = 0; i < tokens.length; i++) {
+            const token = tokens[i].value;
+
+            if (i === longestMatch) {
+                mismatchLength = token.length;
+                mismatchOffset = css.length;
+            }
+
+            if (badNode !== null && tokens[i].node === badNode) {
+                if (i <= longestMatch) {
+                    entries++;
+                } else {
+                    entries = 0;
+                }
+            }
+
+            css += token;
+        }
+
+        if (longestMatch === tokens.length || entries > 1) { // last
+            start = fromLoc(badNode || node, 'end') || buildLoc(defaultLoc, css);
+            end = buildLoc(start);
+        } else {
+            start = fromLoc(badNode, 'start') ||
+                buildLoc(fromLoc(node, 'start') || defaultLoc, css.slice(0, mismatchOffset));
+            end = fromLoc(badNode, 'end') ||
+                buildLoc(start, css.substr(mismatchOffset, mismatchLength));
+        }
+
+        return {
+            css,
+            mismatchOffset,
+            mismatchLength,
+            start,
+            end
+        };
+    }
+
+    function fromLoc(node, point) {
+        const value = node && node.loc && node.loc[point];
+
+        if (value) {
+            return 'line' in value ? buildLoc(value) : value;
+        }
+
+        return null;
+    }
+
+    function buildLoc({ offset, line, column }, extra) {
+        const loc = {
+            offset,
+            line,
+            column
+        };
+
+        if (extra) {
+            const lines = extra.split(/\n|\r\n?|\f/);
+
+            loc.offset += extra.length;
+            loc.line += lines.length - 1;
+            loc.column = lines.length === 1 ? loc.column + extra.length : lines.pop().length + 1;
+        }
+
+        return loc;
+    }
+
+    const SyntaxReferenceError = function(type, referenceName) {
+        const error = createCustomError(
+            'SyntaxReferenceError',
+            type + (referenceName ? ' `' + referenceName + '`' : '')
+        );
+
+        error.reference = referenceName;
+
+        return error;
+    };
+
+    const SyntaxMatchError = function(message, syntax, node, matchResult) {
+        const error = createCustomError('SyntaxMatchError', message);
+        const {
+            css,
+            mismatchOffset,
+            mismatchLength,
+            start,
+            end
+        } = locateMismatch(matchResult, node);
+
+        error.rawMessage = message;
+        error.syntax = syntax ? generate_1(syntax) : '<generic>';
+        error.css = css;
+        error.mismatchOffset = mismatchOffset;
+        error.mismatchLength = mismatchLength;
+        error.message = message + '\n' +
+            '  syntax: ' + error.syntax + '\n' +
+            '   value: ' + (css || '<empty string>') + '\n' +
+            '  --------' + new Array(error.mismatchOffset + 1).join('-') + '^';
+
+        Object.assign(error, start);
+        error.loc = {
+            source: (node && node.loc && node.loc.source) || '<unknown>',
+            start,
+            end
+        };
+
+        return error;
+    };
+
+    var error = {
+        SyntaxReferenceError,
+        SyntaxMatchError
+    };
+
+    var hasOwnProperty = Object.prototype.hasOwnProperty;
+    var keywords = Object.create(null);
+    var properties = Object.create(null);
+    var HYPHENMINUS = 45; // '-'.charCodeAt()
+
+    function isCustomProperty(str, offset) {
+        offset = offset || 0;
+
+        return str.length - offset >= 2 &&
+               str.charCodeAt(offset) === HYPHENMINUS &&
+               str.charCodeAt(offset + 1) === HYPHENMINUS;
+    }
+
+    function getVendorPrefix(str, offset) {
+        offset = offset || 0;
+
+        // verdor prefix should be at least 3 chars length
+        if (str.length - offset >= 3) {
+            // vendor prefix starts with hyper minus following non-hyper minus
+            if (str.charCodeAt(offset) === HYPHENMINUS &&
+                str.charCodeAt(offset + 1) !== HYPHENMINUS) {
+                // vendor prefix should contain a hyper minus at the ending
+                var secondDashIndex = str.indexOf('-', offset + 2);
+
+                if (secondDashIndex !== -1) {
+                    return str.substring(offset, secondDashIndex + 1);
+                }
+            }
+        }
+
+        return '';
+    }
+
+    function getKeywordDescriptor(keyword) {
+        if (hasOwnProperty.call(keywords, keyword)) {
+            return keywords[keyword];
+        }
+
+        var name = keyword.toLowerCase();
+
+        if (hasOwnProperty.call(keywords, name)) {
+            return keywords[keyword] = keywords[name];
+        }
+
+        var custom = isCustomProperty(name, 0);
+        var vendor = !custom ? getVendorPrefix(name, 0) : '';
+
+        return keywords[keyword] = Object.freeze({
+            basename: name.substr(vendor.length),
+            name: name,
+            vendor: vendor,
+            prefix: vendor,
+            custom: custom
+        });
+    }
+
+    function getPropertyDescriptor(property) {
+        if (hasOwnProperty.call(properties, property)) {
+            return properties[property];
+        }
+
+        var name = property;
+        var hack = property[0];
+
+        if (hack === '/') {
+            hack = property[1] === '/' ? '//' : '/';
+        } else if (hack !== '_' &&
+                   hack !== '*' &&
+                   hack !== '$' &&
+                   hack !== '#' &&
+                   hack !== '+' &&
+                   hack !== '&') {
+            hack = '';
+        }
+
+        var custom = isCustomProperty(name, hack.length);
+
+        // re-use result when possible (the same as for lower case)
+        if (!custom) {
+            name = name.toLowerCase();
+            if (hasOwnProperty.call(properties, name)) {
+                return properties[property] = properties[name];
+            }
+        }
+
+        var vendor = !custom ? getVendorPrefix(name, hack.length) : '';
+        var prefix = name.substr(0, hack.length + vendor.length);
+
+        return properties[property] = Object.freeze({
+            basename: name.substr(prefix.length),
+            name: name.substr(hack.length),
+            hack: hack,
+            vendor: vendor,
+            prefix: prefix,
+            custom: custom
+        });
+    }
+
+    var names = {
+        keyword: getKeywordDescriptor,
+        property: getPropertyDescriptor,
+        isCustomProperty: isCustomProperty,
+        vendorPrefix: getVendorPrefix
+    };
+
+    var MIN_SIZE = 16 * 1024;
+    var SafeUint32Array = typeof Uint32Array !== 'undefined' ? Uint32Array : Array; // fallback on Array when TypedArray is not supported
+
+    var adoptBuffer = function adoptBuffer(buffer, size) {
+        if (buffer === null || buffer.length < size) {
+            return new SafeUint32Array(Math.max(size + 1024, MIN_SIZE));
+        }
+
+        return buffer;
+    };
+
+    var TYPE$2 = _const.TYPE;
+
+
+    var isNewline$1 = charCodeDefinitions.isNewline;
+    var isName$2 = charCodeDefinitions.isName;
+    var isValidEscape$2 = charCodeDefinitions.isValidEscape;
+    var isNumberStart$1 = charCodeDefinitions.isNumberStart;
+    var isIdentifierStart$1 = charCodeDefinitions.isIdentifierStart;
+    var charCodeCategory$1 = charCodeDefinitions.charCodeCategory;
+    var isBOM$1 = charCodeDefinitions.isBOM;
+
+
+    var cmpStr$2 = utils.cmpStr;
+    var getNewlineLength$1 = utils.getNewlineLength;
+    var findWhiteSpaceEnd$1 = utils.findWhiteSpaceEnd;
+    var consumeEscaped$1 = utils.consumeEscaped;
+    var consumeName$1 = utils.consumeName;
+    var consumeNumber$1 = utils.consumeNumber;
+    var consumeBadUrlRemnants$1 = utils.consumeBadUrlRemnants;
+
+    var OFFSET_MASK$1 = 0x00FFFFFF;
+    var TYPE_SHIFT$1 = 24;
+
+    function tokenize(source, stream) {
+        function getCharCode(offset) {
+            return offset < sourceLength ? source.charCodeAt(offset) : 0;
+        }
+
+        // § 4.3.3. Consume a numeric token
+        function consumeNumericToken() {
+            // Consume a number and let number be the result.
+            offset = consumeNumber$1(source, offset);
+
+            // If the next 3 input code points would start an identifier, then:
+            if (isIdentifierStart$1(getCharCode(offset), getCharCode(offset + 1), getCharCode(offset + 2))) {
+                // Create a <dimension-token> with the same value and type flag as number, and a unit set initially to the empty string.
+                // Consume a name. Set the <dimension-token>’s unit to the returned value.
+                // Return the <dimension-token>.
+                type = TYPE$2.Dimension;
+                offset = consumeName$1(source, offset);
+                return;
+            }
+
+            // Otherwise, if the next input code point is U+0025 PERCENTAGE SIGN (%), consume it.
+            if (getCharCode(offset) === 0x0025) {
+                // Create a <percentage-token> with the same value as number, and return it.
+                type = TYPE$2.Percentage;
+                offset++;
+                return;
+            }
+
+            // Otherwise, create a <number-token> with the same value and type flag as number, and return it.
+            type = TYPE$2.Number;
+        }
+
+        // § 4.3.4. Consume an ident-like token
+        function consumeIdentLikeToken() {
+            const nameStartOffset = offset;
+
+            // Consume a name, and let string be the result.
+            offset = consumeName$1(source, offset);
+
+            // If string’s value is an ASCII case-insensitive match for "url",
+            // and the next input code point is U+0028 LEFT PARENTHESIS ((), consume it.
+            if (cmpStr$2(source, nameStartOffset, offset, 'url') && getCharCode(offset) === 0x0028) {
+                // While the next two input code points are whitespace, consume the next input code point.
+                offset = findWhiteSpaceEnd$1(source, offset + 1);
+
+                // If the next one or two input code points are U+0022 QUOTATION MARK ("), U+0027 APOSTROPHE ('),
+                // or whitespace followed by U+0022 QUOTATION MARK (") or U+0027 APOSTROPHE ('),
+                // then create a <function-token> with its value set to string and return it.
+                if (getCharCode(offset) === 0x0022 ||
+                    getCharCode(offset) === 0x0027) {
+                    type = TYPE$2.Function;
+                    offset = nameStartOffset + 4;
+                    return;
+                }
+
+                // Otherwise, consume a url token, and return it.
+                consumeUrlToken();
+                return;
+            }
+
+            // Otherwise, if the next input code point is U+0028 LEFT PARENTHESIS ((), consume it.
+            // Create a <function-token> with its value set to string and return it.
+            if (getCharCode(offset) === 0x0028) {
+                type = TYPE$2.Function;
+                offset++;
+                return;
+            }
+
+            // Otherwise, create an <ident-token> with its value set to string and return it.
+            type = TYPE$2.Ident;
+        }
+
+        // § 4.3.5. Consume a string token
+        function consumeStringToken(endingCodePoint) {
+            // This algorithm may be called with an ending code point, which denotes the code point
+            // that ends the string. If an ending code point is not specified,
+            // the current input code point is used.
+            if (!endingCodePoint) {
+                endingCodePoint = getCharCode(offset++);
+            }
+
+            // Initially create a <string-token> with its value set to the empty string.
+            type = TYPE$2.String;
+
+            // Repeatedly consume the next input code point from the stream:
+            for (; offset < source.length; offset++) {
+                var code = source.charCodeAt(offset);
+
+                switch (charCodeCategory$1(code)) {
+                    // ending code point
+                    case endingCodePoint:
+                        // Return the <string-token>.
+                        offset++;
+                        return;
+
+                    // EOF
+                    case charCodeCategory$1.Eof:
+                        // This is a parse error. Return the <string-token>.
+                        return;
+
+                    // newline
+                    case charCodeCategory$1.WhiteSpace:
+                        if (isNewline$1(code)) {
+                            // This is a parse error. Reconsume the current input code point,
+                            // create a <bad-string-token>, and return it.
+                            offset += getNewlineLength$1(source, offset, code);
+                            type = TYPE$2.BadString;
+                            return;
+                        }
+                        break;
+
+                    // U+005C REVERSE SOLIDUS (\)
+                    case 0x005C:
+                        // If the next input code point is EOF, do nothing.
+                        if (offset === source.length - 1) {
+                            break;
+                        }
+
+                        var nextCode = getCharCode(offset + 1);
+
+                        // Otherwise, if the next input code point is a newline, consume it.
+                        if (isNewline$1(nextCode)) {
+                            offset += getNewlineLength$1(source, offset + 1, nextCode);
+                        } else if (isValidEscape$2(code, nextCode)) {
+                            // Otherwise, (the stream starts with a valid escape) consume
+                            // an escaped code point and append the returned code point to
+                            // the <string-token>’s value.
+                            offset = consumeEscaped$1(source, offset) - 1;
+                        }
+                        break;
+
+                    // anything else
+                    // Append the current input code point to the <string-token>’s value.
+                }
+            }
+        }
+
+        // § 4.3.6. Consume a url token
+        // Note: This algorithm assumes that the initial "url(" has already been consumed.
+        // This algorithm also assumes that it’s being called to consume an "unquoted" value, like url(foo).
+        // A quoted value, like url("foo"), is parsed as a <function-token>. Consume an ident-like token
+        // automatically handles this distinction; this algorithm shouldn’t be called directly otherwise.
+        function consumeUrlToken() {
+            // Initially create a <url-token> with its value set to the empty string.
+            type = TYPE$2.Url;
+
+            // Consume as much whitespace as possible.
+            offset = findWhiteSpaceEnd$1(source, offset);
+
+            // Repeatedly consume the next input code point from the stream:
+            for (; offset < source.length; offset++) {
+                var code = source.charCodeAt(offset);
+
+                switch (charCodeCategory$1(code)) {
+                    // U+0029 RIGHT PARENTHESIS ())
+                    case 0x0029:
+                        // Return the <url-token>.
+                        offset++;
+                        return;
+
+                    // EOF
+                    case charCodeCategory$1.Eof:
+                        // This is a parse error. Return the <url-token>.
+                        return;
+
+                    // whitespace
+                    case charCodeCategory$1.WhiteSpace:
+                        // Consume as much whitespace as possible.
+                        offset = findWhiteSpaceEnd$1(source, offset);
+
+                        // If the next input code point is U+0029 RIGHT PARENTHESIS ()) or EOF,
+                        // consume it and return the <url-token>
+                        // (if EOF was encountered, this is a parse error);
+                        if (getCharCode(offset) === 0x0029 || offset >= source.length) {
+                            if (offset < source.length) {
+                                offset++;
+                            }
+                            return;
+                        }
+
+                        // otherwise, consume the remnants of a bad url, create a <bad-url-token>,
+                        // and return it.
+                        offset = consumeBadUrlRemnants$1(source, offset);
+                        type = TYPE$2.BadUrl;
+                        return;
+
+                    // U+0022 QUOTATION MARK (")
+                    // U+0027 APOSTROPHE (')
+                    // U+0028 LEFT PARENTHESIS (()
+                    // non-printable code point
+                    case 0x0022:
+                    case 0x0027:
+                    case 0x0028:
+                    case charCodeCategory$1.NonPrintable:
+                        // This is a parse error. Consume the remnants of a bad url,
+                        // create a <bad-url-token>, and return it.
+                        offset = consumeBadUrlRemnants$1(source, offset);
+                        type = TYPE$2.BadUrl;
+                        return;
+
+                    // U+005C REVERSE SOLIDUS (\)
+                    case 0x005C:
+                        // If the stream starts with a valid escape, consume an escaped code point and
+                        // append the returned code point to the <url-token>’s value.
+                        if (isValidEscape$2(code, getCharCode(offset + 1))) {
+                            offset = consumeEscaped$1(source, offset) - 1;
+                            break;
+                        }
+
+                        // Otherwise, this is a parse error. Consume the remnants of a bad url,
+                        // create a <bad-url-token>, and return it.
+                        offset = consumeBadUrlRemnants$1(source, offset);
+                        type = TYPE$2.BadUrl;
+                        return;
+
+                    // anything else
+                    // Append the current input code point to the <url-token>’s value.
+                }
+            }
+        }
+
+        if (!stream) {
+            stream = new TokenStream_1();
+        }
+
+        // ensure source is a string
+        source = String(source || '');
+
+        var sourceLength = source.length;
+        var offsetAndType = adoptBuffer(stream.offsetAndType, sourceLength + 1); // +1 because of eof-token
+        var balance = adoptBuffer(stream.balance, sourceLength + 1);
+        var tokenCount = 0;
+        var start = isBOM$1(getCharCode(0));
+        var offset = start;
+        var balanceCloseType = 0;
+        var balanceStart = 0;
+        var balancePrev = 0;
+
+        // https://drafts.csswg.org/css-syntax-3/#consume-token
+        // § 4.3.1. Consume a token
+        while (offset < sourceLength) {
+            var code = source.charCodeAt(offset);
+            var type = 0;
+
+            balance[tokenCount] = sourceLength;
+
+            switch (charCodeCategory$1(code)) {
+                // whitespace
+                case charCodeCategory$1.WhiteSpace:
+                    // Consume as much whitespace as possible. Return a <whitespace-token>.
+                    type = TYPE$2.WhiteSpace;
+                    offset = findWhiteSpaceEnd$1(source, offset + 1);
+                    break;
+
+                // U+0022 QUOTATION MARK (")
+                case 0x0022:
+                    // Consume a string token and return it.
+                    consumeStringToken();
+                    break;
+
+                // U+0023 NUMBER SIGN (#)
+                case 0x0023:
+                    // If the next input code point is a name code point or the next two input code points are a valid escape, then:
+                    if (isName$2(getCharCode(offset + 1)) || isValidEscape$2(getCharCode(offset + 1), getCharCode(offset + 2))) {
+                        // Create a <hash-token>.
+                        type = TYPE$2.Hash;
+
+                        // If the next 3 input code points would start an identifier, set the <hash-token>’s type flag to "id".
+                        // if (isIdentifierStart(getCharCode(offset + 1), getCharCode(offset + 2), getCharCode(offset + 3))) {
+                        //     // TODO: set id flag
+                        // }
+
+                        // Consume a name, and set the <hash-token>’s value to the returned string.
+                        offset = consumeName$1(source, offset + 1);
+
+                        // Return the <hash-token>.
+                    } else {
+                        // Otherwise, return a <delim-token> with its value set to the current input code point.
+                        type = TYPE$2.Delim;
+                        offset++;
+                    }
+
+                    break;
+
+                // U+0027 APOSTROPHE (')
+                case 0x0027:
+                    // Consume a string token and return it.
+                    consumeStringToken();
+                    break;
+
+                // U+0028 LEFT PARENTHESIS (()
+                case 0x0028:
+                    // Return a <(-token>.
+                    type = TYPE$2.LeftParenthesis;
+                    offset++;
+                    break;
+
+                // U+0029 RIGHT PARENTHESIS ())
+                case 0x0029:
+                    // Return a <)-token>.
+                    type = TYPE$2.RightParenthesis;
+                    offset++;
+                    break;
+
+                // U+002B PLUS SIGN (+)
+                case 0x002B:
+                    // If the input stream starts with a number, ...
+                    if (isNumberStart$1(code, getCharCode(offset + 1), getCharCode(offset + 2))) {
+                        // ... reconsume the current input code point, consume a numeric token, and return it.
+                        consumeNumericToken();
+                    } else {
+                        // Otherwise, return a <delim-token> with its value set to the current input code point.
+                        type = TYPE$2.Delim;
+                        offset++;
+                    }
+                    break;
+
+                // U+002C COMMA (,)
+                case 0x002C:
+                    // Return a <comma-token>.
+                    type = TYPE$2.Comma;
+                    offset++;
+                    break;
+
+                // U+002D HYPHEN-MINUS (-)
+                case 0x002D:
+                    // If the input stream starts with a number, reconsume the current input code point, consume a numeric token, and return it.
+                    if (isNumberStart$1(code, getCharCode(offset + 1), getCharCode(offset + 2))) {
+                        consumeNumericToken();
+                    } else {
+                        // Otherwise, if the next 2 input code points are U+002D HYPHEN-MINUS U+003E GREATER-THAN SIGN (->), consume them and return a <CDC-token>.
+                        if (getCharCode(offset + 1) === 0x002D &&
+                            getCharCode(offset + 2) === 0x003E) {
+                            type = TYPE$2.CDC;
+                            offset = offset + 3;
+                        } else {
+                            // Otherwise, if the input stream starts with an identifier, ...
+                            if (isIdentifierStart$1(code, getCharCode(offset + 1), getCharCode(offset + 2))) {
+                                // ... reconsume the current input code point, consume an ident-like token, and return it.
+                                consumeIdentLikeToken();
+                            } else {
+                                // Otherwise, return a <delim-token> with its value set to the current input code point.
+                                type = TYPE$2.Delim;
+                                offset++;
+                            }
+                        }
+                    }
+                    break;
+
+                // U+002E FULL STOP (.)
+                case 0x002E:
+                    // If the input stream starts with a number, ...
+                    if (isNumberStart$1(code, getCharCode(offset + 1), getCharCode(offset + 2))) {
+                        // ... reconsume the current input code point, consume a numeric token, and return it.
+                        consumeNumericToken();
+                    } else {
+                        // Otherwise, return a <delim-token> with its value set to the current input code point.
+                        type = TYPE$2.Delim;
+                        offset++;
+                    }
+
+                    break;
+
+                // U+002F SOLIDUS (/)
+                case 0x002F:
+                    // If the next two input code point are U+002F SOLIDUS (/) followed by a U+002A ASTERISK (*),
+                    if (getCharCode(offset + 1) === 0x002A) {
+                        // ... consume them and all following code points up to and including the first U+002A ASTERISK (*)
+                        // followed by a U+002F SOLIDUS (/), or up to an EOF code point.
+                        type = TYPE$2.Comment;
+                        offset = source.indexOf('*/', offset + 2) + 2;
+                        if (offset === 1) {
+                            offset = source.length;
+                        }
+                    } else {
+                        type = TYPE$2.Delim;
+                        offset++;
+                    }
+                    break;
+
+                // U+003A COLON (:)
+                case 0x003A:
+                    // Return a <colon-token>.
+                    type = TYPE$2.Colon;
+                    offset++;
+                    break;
+
+                // U+003B SEMICOLON (;)
+                case 0x003B:
+                    // Return a <semicolon-token>.
+                    type = TYPE$2.Semicolon;
+                    offset++;
+                    break;
+
+                // U+003C LESS-THAN SIGN (<)
+                case 0x003C:
+                    // If the next 3 input code points are U+0021 EXCLAMATION MARK U+002D HYPHEN-MINUS U+002D HYPHEN-MINUS (!--), ...
+                    if (getCharCode(offset + 1) === 0x0021 &&
+                        getCharCode(offset + 2) === 0x002D &&
+                        getCharCode(offset + 3) === 0x002D) {
+                        // ... consume them and return a <CDO-token>.
+                        type = TYPE$2.CDO;
+                        offset = offset + 4;
+                    } else {
+                        // Otherwise, return a <delim-token> with its value set to the current input code point.
+                        type = TYPE$2.Delim;
+                        offset++;
+                    }
+
+                    break;
+
+                // U+0040 COMMERCIAL AT (@)
+                case 0x0040:
+                    // If the next 3 input code points would start an identifier, ...
+                    if (isIdentifierStart$1(getCharCode(offset + 1), getCharCode(offset + 2), getCharCode(offset + 3))) {
+                        // ... consume a name, create an <at-keyword-token> with its value set to the returned value, and return it.
+                        type = TYPE$2.AtKeyword;
+                        offset = consumeName$1(source, offset + 1);
+                    } else {
+                        // Otherwise, return a <delim-token> with its value set to the current input code point.
+                        type = TYPE$2.Delim;
+                        offset++;
+                    }
+
+                    break;
+
+                // U+005B LEFT SQUARE BRACKET ([)
+                case 0x005B:
+                    // Return a <[-token>.
+                    type = TYPE$2.LeftSquareBracket;
+                    offset++;
+                    break;
+
+                // U+005C REVERSE SOLIDUS (\)
+                case 0x005C:
+                    // If the input stream starts with a valid escape, ...
+                    if (isValidEscape$2(code, getCharCode(offset + 1))) {
+                        // ... reconsume the current input code point, consume an ident-like token, and return it.
+                        consumeIdentLikeToken();
+                    } else {
+                        // Otherwise, this is a parse error. Return a <delim-token> with its value set to the current input code point.
+                        type = TYPE$2.Delim;
+                        offset++;
+                    }
+                    break;
+
+                // U+005D RIGHT SQUARE BRACKET (])
+                case 0x005D:
+                    // Return a <]-token>.
+                    type = TYPE$2.RightSquareBracket;
+                    offset++;
+                    break;
+
+                // U+007B LEFT CURLY BRACKET ({)
+                case 0x007B:
+                    // Return a <{-token>.
+                    type = TYPE$2.LeftCurlyBracket;
+                    offset++;
+                    break;
+
+                // U+007D RIGHT CURLY BRACKET (})
+                case 0x007D:
+                    // Return a <}-token>.
+                    type = TYPE$2.RightCurlyBracket;
+                    offset++;
+                    break;
+
+                // digit
+                case charCodeCategory$1.Digit:
+                    // Reconsume the current input code point, consume a numeric token, and return it.
+                    consumeNumericToken();
+                    break;
+
+                // name-start code point
+                case charCodeCategory$1.NameStart:
+                    // Reconsume the current input code point, consume an ident-like token, and return it.
+                    consumeIdentLikeToken();
+                    break;
+
+                // EOF
+                case charCodeCategory$1.Eof:
+                    // Return an <EOF-token>.
+                    break;
+
+                // anything else
+                default:
+                    // Return a <delim-token> with its value set to the current input code point.
+                    type = TYPE$2.Delim;
+                    offset++;
+            }
+
+            switch (type) {
+                case balanceCloseType:
+                    balancePrev = balanceStart & OFFSET_MASK$1;
+                    balanceStart = balance[balancePrev];
+                    balanceCloseType = balanceStart >> TYPE_SHIFT$1;
+                    balance[tokenCount] = balancePrev;
+                    balance[balancePrev++] = tokenCount;
+                    for (; balancePrev < tokenCount; balancePrev++) {
+                        if (balance[balancePrev] === sourceLength) {
+                            balance[balancePrev] = tokenCount;
+                        }
+                    }
+                    break;
+
+                case TYPE$2.LeftParenthesis:
+                case TYPE$2.Function:
+                    balance[tokenCount] = balanceStart;
+                    balanceCloseType = TYPE$2.RightParenthesis;
+                    balanceStart = (balanceCloseType << TYPE_SHIFT$1) | tokenCount;
+                    break;
+
+                case TYPE$2.LeftSquareBracket:
+                    balance[tokenCount] = balanceStart;
+                    balanceCloseType = TYPE$2.RightSquareBracket;
+                    balanceStart = (balanceCloseType << TYPE_SHIFT$1) | tokenCount;
+                    break;
+
+                case TYPE$2.LeftCurlyBracket:
+                    balance[tokenCount] = balanceStart;
+                    balanceCloseType = TYPE$2.RightCurlyBracket;
+                    balanceStart = (balanceCloseType << TYPE_SHIFT$1) | tokenCount;
+                    break;
+            }
+
+            offsetAndType[tokenCount++] = (type << TYPE_SHIFT$1) | offset;
+        }
+
+        // finalize buffers
+        offsetAndType[tokenCount] = (TYPE$2.EOF << TYPE_SHIFT$1) | offset; // <EOF-token>
+        balance[tokenCount] = sourceLength;
+        balance[sourceLength] = sourceLength; // prevents false positive balance match with any token
+        while (balanceStart !== 0) {
+            balancePrev = balanceStart & OFFSET_MASK$1;
+            balanceStart = balance[balancePrev];
+            balance[balancePrev] = sourceLength;
+        }
+
+        // update stream
+        stream.source = source;
+        stream.firstCharOffset = start;
+        stream.offsetAndType = offsetAndType;
+        stream.tokenCount = tokenCount;
+        stream.balance = balance;
+        stream.reset();
+        stream.next();
+
+        return stream;
+    }
+
+    // extend tokenizer with constants
+    Object.keys(_const).forEach(function(key) {
+        tokenize[key] = _const[key];
+    });
+
+    // extend tokenizer with static methods from utils
+    Object.keys(charCodeDefinitions).forEach(function(key) {
+        tokenize[key] = charCodeDefinitions[key];
+    });
+    Object.keys(utils).forEach(function(key) {
+        tokenize[key] = utils[key];
+    });
+
+    var tokenizer = tokenize;
+
+    var isDigit$2 = tokenizer.isDigit;
+    var cmpChar$1 = tokenizer.cmpChar;
+    var TYPE$3 = tokenizer.TYPE;
+
+    var DELIM = TYPE$3.Delim;
+    var WHITESPACE$1 = TYPE$3.WhiteSpace;
+    var COMMENT$1 = TYPE$3.Comment;
+    var IDENT = TYPE$3.Ident;
+    var NUMBER = TYPE$3.Number;
+    var DIMENSION = TYPE$3.Dimension;
+    var PLUSSIGN = 0x002B;    // U+002B PLUS SIGN (+)
+    var HYPHENMINUS$1 = 0x002D; // U+002D HYPHEN-MINUS (-)
+    var N = 0x006E;           // U+006E LATIN SMALL LETTER N (n)
+    var DISALLOW_SIGN = true;
+    var ALLOW_SIGN = false;
+
+    function isDelim(token, code) {
+        return token !== null && token.type === DELIM && token.value.charCodeAt(0) === code;
+    }
+
+    function skipSC(token, offset, getNextToken) {
+        while (token !== null && (token.type === WHITESPACE$1 || token.type === COMMENT$1)) {
+            token = getNextToken(++offset);
+        }
+
+        return offset;
+    }
+
+    function checkInteger(token, valueOffset, disallowSign, offset) {
+        if (!token) {
+            return 0;
+        }
+
+        var code = token.value.charCodeAt(valueOffset);
+
+        if (code === PLUSSIGN || code === HYPHENMINUS$1) {
+            if (disallowSign) {
+                // Number sign is not allowed
+                return 0;
+            }
+            valueOffset++;
+        }
+
+        for (; valueOffset < token.value.length; valueOffset++) {
+            if (!isDigit$2(token.value.charCodeAt(valueOffset))) {
+                // Integer is expected
+                return 0;
+            }
+        }
+
+        return offset + 1;
+    }
+
+    // ... <signed-integer>
+    // ... ['+' | '-'] <signless-integer>
+    function consumeB(token, offset_, getNextToken) {
+        var sign = false;
+        var offset = skipSC(token, offset_, getNextToken);
+
+        token = getNextToken(offset);
+
+        if (token === null) {
+            return offset_;
+        }
+
+        if (token.type !== NUMBER) {
+            if (isDelim(token, PLUSSIGN) || isDelim(token, HYPHENMINUS$1)) {
+                sign = true;
+                offset = skipSC(getNextToken(++offset), offset, getNextToken);
+                token = getNextToken(offset);
+
+                if (token === null && token.type !== NUMBER) {
+                    return 0;
+                }
+            } else {
+                return offset_;
+            }
+        }
+
+        if (!sign) {
+            var code = token.value.charCodeAt(0);
+            if (code !== PLUSSIGN && code !== HYPHENMINUS$1) {
+                // Number sign is expected
+                return 0;
+            }
+        }
+
+        return checkInteger(token, sign ? 0 : 1, sign, offset);
+    }
+
+    // An+B microsyntax https://www.w3.org/TR/css-syntax-3/#anb
+    var genericAnPlusB = function anPlusB(token, getNextToken) {
+        /* eslint-disable brace-style*/
+        var offset = 0;
+
+        if (!token) {
+            return 0;
+        }
+
+        // <integer>
+        if (token.type === NUMBER) {
+            return checkInteger(token, 0, ALLOW_SIGN, offset); // b
+        }
+
+        // -n
+        // -n <signed-integer>
+        // -n ['+' | '-'] <signless-integer>
+        // -n- <signless-integer>
+        // <dashndashdigit-ident>
+        else if (token.type === IDENT && token.value.charCodeAt(0) === HYPHENMINUS$1) {
+            // expect 1st char is N
+            if (!cmpChar$1(token.value, 1, N)) {
+                return 0;
+            }
+
+            switch (token.value.length) {
+                // -n
+                // -n <signed-integer>
+                // -n ['+' | '-'] <signless-integer>
+                case 2:
+                    return consumeB(getNextToken(++offset), offset, getNextToken);
+
+                // -n- <signless-integer>
+                case 3:
+                    if (token.value.charCodeAt(2) !== HYPHENMINUS$1) {
+                        return 0;
+                    }
+
+                    offset = skipSC(getNextToken(++offset), offset, getNextToken);
+                    token = getNextToken(offset);
+
+                    return checkInteger(token, 0, DISALLOW_SIGN, offset);
+
+                // <dashndashdigit-ident>
+                default:
+                    if (token.value.charCodeAt(2) !== HYPHENMINUS$1) {
+                        return 0;
+                    }
+
+                    return checkInteger(token, 3, DISALLOW_SIGN, offset);
+            }
+        }
+
+        // '+'? n
+        // '+'? n <signed-integer>
+        // '+'? n ['+' | '-'] <signless-integer>
+        // '+'? n- <signless-integer>
+        // '+'? <ndashdigit-ident>
+        else if (token.type === IDENT || (isDelim(token, PLUSSIGN) && getNextToken(offset + 1).type === IDENT)) {
+            // just ignore a plus
+            if (token.type !== IDENT) {
+                token = getNextToken(++offset);
+            }
+
+            if (token === null || !cmpChar$1(token.value, 0, N)) {
+                return 0;
+            }
+
+            switch (token.value.length) {
+                // '+'? n
+                // '+'? n <signed-integer>
+                // '+'? n ['+' | '-'] <signless-integer>
+                case 1:
+                    return consumeB(getNextToken(++offset), offset, getNextToken);
+
+                // '+'? n- <signless-integer>
+                case 2:
+                    if (token.value.charCodeAt(1) !== HYPHENMINUS$1) {
+                        return 0;
+                    }
+
+                    offset = skipSC(getNextToken(++offset), offset, getNextToken);
+                    token = getNextToken(offset);
+
+                    return checkInteger(token, 0, DISALLOW_SIGN, offset);
+
+                // '+'? <ndashdigit-ident>
+                default:
+                    if (token.value.charCodeAt(1) !== HYPHENMINUS$1) {
+                        return 0;
+                    }
+
+                    return checkInteger(token, 2, DISALLOW_SIGN, offset);
+            }
+        }
+
+        // <ndashdigit-dimension>
+        // <ndash-dimension> <signless-integer>
+        // <n-dimension>
+        // <n-dimension> <signed-integer>
+        // <n-dimension> ['+' | '-'] <signless-integer>
+        else if (token.type === DIMENSION) {
+            var code = token.value.charCodeAt(0);
+            var sign = code === PLUSSIGN || code === HYPHENMINUS$1 ? 1 : 0;
+
+            for (var i = sign; i < token.value.length; i++) {
+                if (!isDigit$2(token.value.charCodeAt(i))) {
+                    break;
+                }
+            }
+
+            if (i === sign) {
+                // Integer is expected
+                return 0;
+            }
+
+            if (!cmpChar$1(token.value, i, N)) {
+                return 0;
+            }
+
+            // <n-dimension>
+            // <n-dimension> <signed-integer>
+            // <n-dimension> ['+' | '-'] <signless-integer>
+            if (i + 1 === token.value.length) {
+                return consumeB(getNextToken(++offset), offset, getNextToken);
+            } else {
+                if (token.value.charCodeAt(i + 1) !== HYPHENMINUS$1) {
+                    return 0;
+                }
+
+                // <ndash-dimension> <signless-integer>
+                if (i + 2 === token.value.length) {
+                    offset = skipSC(getNextToken(++offset), offset, getNextToken);
+                    token = getNextToken(offset);
+
+                    return checkInteger(token, 0, DISALLOW_SIGN, offset);
+                }
+                // <ndashdigit-dimension>
+                else {
+                    return checkInteger(token, i + 2, DISALLOW_SIGN, offset);
+                }
+            }
+        }
+
+        return 0;
+    };
+
+    var isHexDigit$2 = tokenizer.isHexDigit;
+    var cmpChar$2 = tokenizer.cmpChar;
+    var TYPE$4 = tokenizer.TYPE;
+
+    var IDENT$1 = TYPE$4.Ident;
+    var DELIM$1 = TYPE$4.Delim;
+    var NUMBER$1 = TYPE$4.Number;
+    var DIMENSION$1 = TYPE$4.Dimension;
+    var PLUSSIGN$1 = 0x002B;     // U+002B PLUS SIGN (+)
+    var HYPHENMINUS$2 = 0x002D;  // U+002D HYPHEN-MINUS (-)
+    var QUESTIONMARK = 0x003F; // U+003F QUESTION MARK (?)
+    var U = 0x0075;            // U+0075 LATIN SMALL LETTER U (u)
+
+    function isDelim$1(token, code) {
+        return token !== null && token.type === DELIM$1 && token.value.charCodeAt(0) === code;
+    }
+
+    function startsWith(token, code) {
+        return token.value.charCodeAt(0) === code;
+    }
+
+    function hexSequence(token, offset, allowDash) {
+        for (var pos = offset, hexlen = 0; pos < token.value.length; pos++) {
+            var code = token.value.charCodeAt(pos);
+
+            if (code === HYPHENMINUS$2 && allowDash && hexlen !== 0) {
+                if (hexSequence(token, offset + hexlen + 1, false) > 0) {
+                    return 6; // dissallow following question marks
+                }
+
+                return 0; // dash at the ending of a hex sequence is not allowed
+            }
+
+            if (!isHexDigit$2(code)) {
+                return 0; // not a hex digit
+            }
+
+            if (++hexlen > 6) {
+                return 0; // too many hex digits
+            }    }
+
+        return hexlen;
+    }
+
+    function withQuestionMarkSequence(consumed, length, getNextToken) {
+        if (!consumed) {
+            return 0; // nothing consumed
+        }
+
+        while (isDelim$1(getNextToken(length), QUESTIONMARK)) {
+            if (++consumed > 6) {
+                return 0; // too many question marks
+            }
+
+            length++;
+        }
+
+        return length;
+    }
+
+    // https://drafts.csswg.org/css-syntax/#urange
+    // Informally, the <urange> production has three forms:
+    // U+0001
+    //      Defines a range consisting of a single code point, in this case the code point "1".
+    // U+0001-00ff
+    //      Defines a range of codepoints between the first and the second value, in this case
+    //      the range between "1" and "ff" (255 in decimal) inclusive.
+    // U+00??
+    //      Defines a range of codepoints where the "?" characters range over all hex digits,
+    //      in this case defining the same as the value U+0000-00ff.
+    // In each form, a maximum of 6 digits is allowed for each hexadecimal number (if you treat "?" as a hexadecimal digit).
+    //
+    // <urange> =
+    //   u '+' <ident-token> '?'* |
+    //   u <dimension-token> '?'* |
+    //   u <number-token> '?'* |
+    //   u <number-token> <dimension-token> |
+    //   u <number-token> <number-token> |
+    //   u '+' '?'+
+    var genericUrange = function urange(token, getNextToken) {
+        var length = 0;
+
+        // should start with `u` or `U`
+        if (token === null || token.type !== IDENT$1 || !cmpChar$2(token.value, 0, U)) {
+            return 0;
+        }
+
+        token = getNextToken(++length);
+        if (token === null) {
+            return 0;
+        }
+
+        // u '+' <ident-token> '?'*
+        // u '+' '?'+
+        if (isDelim$1(token, PLUSSIGN$1)) {
+            token = getNextToken(++length);
+            if (token === null) {
+                return 0;
+            }
+
+            if (token.type === IDENT$1) {
+                // u '+' <ident-token> '?'*
+                return withQuestionMarkSequence(hexSequence(token, 0, true), ++length, getNextToken);
+            }
+
+            if (isDelim$1(token, QUESTIONMARK)) {
+                // u '+' '?'+
+                return withQuestionMarkSequence(1, ++length, getNextToken);
+            }
+
+            // Hex digit or question mark is expected
+            return 0;
+        }
+
+        // u <number-token> '?'*
+        // u <number-token> <dimension-token>
+        // u <number-token> <number-token>
+        if (token.type === NUMBER$1) {
+            if (!startsWith(token, PLUSSIGN$1)) {
+                return 0;
+            }
+
+            var consumedHexLength = hexSequence(token, 1, true);
+            if (consumedHexLength === 0) {
+                return 0;
+            }
+
+            token = getNextToken(++length);
+            if (token === null) {
+                // u <number-token> <eof>
+                return length;
+            }
+
+            if (token.type === DIMENSION$1 || token.type === NUMBER$1) {
+                // u <number-token> <dimension-token>
+                // u <number-token> <number-token>
+                if (!startsWith(token, HYPHENMINUS$2) || !hexSequence(token, 1, false)) {
+                    return 0;
+                }
+
+                return length + 1;
+            }
+
+            // u <number-token> '?'*
+            return withQuestionMarkSequence(consumedHexLength, length, getNextToken);
+        }
+
+        // u <dimension-token> '?'*
+        if (token.type === DIMENSION$1) {
+            if (!startsWith(token, PLUSSIGN$1)) {
+                return 0;
+            }
+
+            return withQuestionMarkSequence(hexSequence(token, 1, true), ++length, getNextToken);
+        }
+
+        return 0;
+    };
+
+    var isIdentifierStart$2 = tokenizer.isIdentifierStart;
+    var isHexDigit$3 = tokenizer.isHexDigit;
+    var isDigit$3 = tokenizer.isDigit;
+    var cmpStr$3 = tokenizer.cmpStr;
+    var consumeNumber$2 = tokenizer.consumeNumber;
+    var TYPE$5 = tokenizer.TYPE;
+
+
+
+    var cssWideKeywords = ['unset', 'initial', 'inherit'];
+    var calcFunctionNames = ['calc(', '-moz-calc(', '-webkit-calc('];
+
+    // https://www.w3.org/TR/css-values-3/#lengths
+    var LENGTH = {
+        // absolute length units
+        'px': true,
+        'mm': true,
+        'cm': true,
+        'in': true,
+        'pt': true,
+        'pc': true,
+        'q': true,
+
+        // relative length units
+        'em': true,
+        'ex': true,
+        'ch': true,
+        'rem': true,
+
+        // viewport-percentage lengths
+        'vh': true,
+        'vw': true,
+        'vmin': true,
+        'vmax': true,
+        'vm': true
+    };
+
+    var ANGLE = {
+        'deg': true,
+        'grad': true,
+        'rad': true,
+        'turn': true
+    };
+
+    var TIME = {
+        's': true,
+        'ms': true
+    };
+
+    var FREQUENCY = {
+        'hz': true,
+        'khz': true
+    };
+
+    // https://www.w3.org/TR/css-values-3/#resolution (https://drafts.csswg.org/css-values/#resolution)
+    var RESOLUTION = {
+        'dpi': true,
+        'dpcm': true,
+        'dppx': true,
+        'x': true      // https://github.com/w3c/csswg-drafts/issues/461
+    };
+
+    // https://drafts.csswg.org/css-grid/#fr-unit
+    var FLEX = {
+        'fr': true
+    };
+
+    // https://www.w3.org/TR/css3-speech/#mixing-props-voice-volume
+    var DECIBEL = {
+        'db': true
+    };
+
+    // https://www.w3.org/TR/css3-speech/#voice-props-voice-pitch
+    var SEMITONES = {
+        'st': true
+    };
+
+    // safe char code getter
+    function charCode(str, index) {
+        return index < str.length ? str.charCodeAt(index) : 0;
+    }
+
+    function eqStr(actual, expected) {
+        return cmpStr$3(actual, 0, actual.length, expected);
+    }
+
+    function eqStrAny(actual, expected) {
+        for (var i = 0; i < expected.length; i++) {
+            if (eqStr(actual, expected[i])) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    // IE postfix hack, i.e. 123\0 or 123px\9
+    function isPostfixIeHack(str, offset) {
+        if (offset !== str.length - 2) {
+            return false;
+        }
+
+        return (
+            str.charCodeAt(offset) === 0x005C &&  // U+005C REVERSE SOLIDUS (\)
+            isDigit$3(str.charCodeAt(offset + 1))
+        );
+    }
+
+    function outOfRange(opts, value, numEnd) {
+        if (opts && opts.type === 'Range') {
+            var num = Number(
+                numEnd !== undefined && numEnd !== value.length
+                    ? value.substr(0, numEnd)
+                    : value
+            );
+
+            if (isNaN(num)) {
+                return true;
+            }
+
+            if (opts.min !== null && num < opts.min) {
+                return true;
+            }
+
+            if (opts.max !== null && num > opts.max) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    function consumeFunction(token, getNextToken) {
+        var startIdx = token.index;
+        var length = 0;
+
+        // balanced token consuming
+        do {
+            length++;
+
+            if (token.balance <= startIdx) {
+                break;
+            }
+        } while (token = getNextToken(length));
+
+        return length;
+    }
+
+    // TODO: implement
+    // can be used wherever <length>, <frequency>, <angle>, <time>, <percentage>, <number>, or <integer> values are allowed
+    // https://drafts.csswg.org/css-values/#calc-notation
+    function calc(next) {
+        return function(token, getNextToken, opts) {
+            if (token === null) {
+                return 0;
+            }
+
+            if (token.type === TYPE$5.Function && eqStrAny(token.value, calcFunctionNames)) {
+                return consumeFunction(token, getNextToken);
+            }
+
+            return next(token, getNextToken, opts);
+        };
+    }
+
+    function tokenType(expectedTokenType) {
+        return function(token) {
+            if (token === null || token.type !== expectedTokenType) {
+                return 0;
+            }
+
+            return 1;
+        };
+    }
+
+    function func(name) {
+        name = name + '(';
+
+        return function(token, getNextToken) {
+            if (token !== null && eqStr(token.value, name)) {
+                return consumeFunction(token, getNextToken);
+            }
+
+            return 0;
+        };
+    }
+
+    // =========================
+    // Complex types
+    //
+
+    // https://drafts.csswg.org/css-values-4/#custom-idents
+    // 4.2. Author-defined Identifiers: the <custom-ident> type
+    // Some properties accept arbitrary author-defined identifiers as a component value.
+    // This generic data type is denoted by <custom-ident>, and represents any valid CSS identifier
+    // that would not be misinterpreted as a pre-defined keyword in that property’s value definition.
+    //
+    // See also: https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident
+    function customIdent(token) {
+        if (token === null || token.type !== TYPE$5.Ident) {
+            return 0;
+        }
+
+        var name = token.value.toLowerCase();
+
+        // The CSS-wide keywords are not valid <custom-ident>s
+        if (eqStrAny(name, cssWideKeywords)) {
+            return 0;
+        }
+
+        // The default keyword is reserved and is also not a valid <custom-ident>
+        if (eqStr(name, 'default')) {
+            return 0;
+        }
+
+        // TODO: ignore property specific keywords (as described https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident)
+        // Specifications using <custom-ident> must specify clearly what other keywords
+        // are excluded from <custom-ident>, if any—for example by saying that any pre-defined keywords
+        // in that property’s value definition are excluded. Excluded keywords are excluded
+        // in all ASCII case permutations.
+
+        return 1;
+    }
+
+    // https://drafts.csswg.org/css-variables/#typedef-custom-property-name
+    // A custom property is any property whose name starts with two dashes (U+002D HYPHEN-MINUS), like --foo.
+    // The <custom-property-name> production corresponds to this: it’s defined as any valid identifier
+    // that starts with two dashes, except -- itself, which is reserved for future use by CSS.
+    // NOTE: Current implementation treat `--` as a valid name since most (all?) major browsers treat it as valid.
+    function customPropertyName(token) {
+        // ... defined as any valid identifier
+        if (token === null || token.type !== TYPE$5.Ident) {
+            return 0;
+        }
+
+        // ... that starts with two dashes (U+002D HYPHEN-MINUS)
+        if (charCode(token.value, 0) !== 0x002D || charCode(token.value, 1) !== 0x002D) {
+            return 0;
+        }
+
+        return 1;
+    }
+
+    // https://drafts.csswg.org/css-color-4/#hex-notation
+    // The syntax of a <hex-color> is a <hash-token> token whose value consists of 3, 4, 6, or 8 hexadecimal digits.
+    // In other words, a hex color is written as a hash character, "#", followed by some number of digits 0-9 or
+    // letters a-f (the case of the letters doesn’t matter - #00ff00 is identical to #00FF00).
+    function hexColor(token) {
+        if (token === null || token.type !== TYPE$5.Hash) {
+            return 0;
+        }
+
+        var length = token.value.length;
+
+        // valid values (length): #rgb (4), #rgba (5), #rrggbb (7), #rrggbbaa (9)
+        if (length !== 4 && length !== 5 && length !== 7 && length !== 9) {
+            return 0;
+        }
+
+        for (var i = 1; i < length; i++) {
+            if (!isHexDigit$3(token.value.charCodeAt(i))) {
+                return 0;
+            }
+        }
+
+        return 1;
+    }
+
+    function idSelector(token) {
+        if (token === null || token.type !== TYPE$5.Hash) {
+            return 0;
+        }
+
+        if (!isIdentifierStart$2(charCode(token.value, 1), charCode(token.value, 2), charCode(token.value, 3))) {
+            return 0;
+        }
+
+        return 1;
+    }
+
+    // https://drafts.csswg.org/css-syntax/#any-value
+    // It represents the entirety of what a valid declaration can have as its value.
+    function declarationValue(token, getNextToken) {
+        if (!token) {
+            return 0;
+        }
+
+        var length = 0;
+        var level = 0;
+        var startIdx = token.index;
+
+        // The <declaration-value> production matches any sequence of one or more tokens,
+        // so long as the sequence ...
+        scan:
+        do {
+            switch (token.type) {
+                // ... does not contain <bad-string-token>, <bad-url-token>,
+                case TYPE$5.BadString:
+                case TYPE$5.BadUrl:
+                    break scan;
+
+                // ... unmatched <)-token>, <]-token>, or <}-token>,
+                case TYPE$5.RightCurlyBracket:
+                case TYPE$5.RightParenthesis:
+                case TYPE$5.RightSquareBracket:
+                    if (token.balance > token.index || token.balance < startIdx) {
+                        break scan;
+                    }
+
+                    level--;
+                    break;
+
+                // ... or top-level <semicolon-token> tokens
+                case TYPE$5.Semicolon:
+                    if (level === 0) {
+                        break scan;
+                    }
+
+                    break;
+
+                // ... or <delim-token> tokens with a value of "!"
+                case TYPE$5.Delim:
+                    if (token.value === '!' && level === 0) {
+                        break scan;
+                    }
+
+                    break;
+
+                case TYPE$5.Function:
+                case TYPE$5.LeftParenthesis:
+                case TYPE$5.LeftSquareBracket:
+                case TYPE$5.LeftCurlyBracket:
+                    level++;
+                    break;
+            }
+
+            length++;
+
+            // until balance closing
+            if (token.balance <= startIdx) {
+                break;
+            }
+        } while (token = getNextToken(length));
+
+        return length;
+    }
+
+    // https://drafts.csswg.org/css-syntax/#any-value
+    // The <any-value> production is identical to <declaration-value>, but also
+    // allows top-level <semicolon-token> tokens and <delim-token> tokens
+    // with a value of "!". It represents the entirety of what valid CSS can be in any context.
+    function anyValue(token, getNextToken) {
+        if (!token) {
+            return 0;
+        }
+
+        var startIdx = token.index;
+        var length = 0;
+
+        // The <any-value> production matches any sequence of one or more tokens,
+        // so long as the sequence ...
+        scan:
+        do {
+            switch (token.type) {
+                // ... does not contain <bad-string-token>, <bad-url-token>,
+                case TYPE$5.BadString:
+                case TYPE$5.BadUrl:
+                    break scan;
+
+                // ... unmatched <)-token>, <]-token>, or <}-token>,
+                case TYPE$5.RightCurlyBracket:
+                case TYPE$5.RightParenthesis:
+                case TYPE$5.RightSquareBracket:
+                    if (token.balance > token.index || token.balance < startIdx) {
+                        break scan;
+                    }
+
+                    break;
+            }
+
+            length++;
+
+            // until balance closing
+            if (token.balance <= startIdx) {
+                break;
+            }
+        } while (token = getNextToken(length));
+
+        return length;
+    }
+
+    // =========================
+    // Dimensions
+    //
+
+    function dimension(type) {
+        return function(token, getNextToken, opts) {
+            if (token === null || token.type !== TYPE$5.Dimension) {
+                return 0;
+            }
+
+            var numberEnd = consumeNumber$2(token.value, 0);
+
+            // check unit
+            if (type !== null) {
+                // check for IE postfix hack, i.e. 123px\0 or 123px\9
+                var reverseSolidusOffset = token.value.indexOf('\\', numberEnd);
+                var unit = reverseSolidusOffset === -1 || !isPostfixIeHack(token.value, reverseSolidusOffset)
+                    ? token.value.substr(numberEnd)
+                    : token.value.substring(numberEnd, reverseSolidusOffset);
+
+                if (type.hasOwnProperty(unit.toLowerCase()) === false) {
+                    return 0;
+                }
+            }
+
+            // check range if specified
+            if (outOfRange(opts, token.value, numberEnd)) {
+                return 0;
+            }
+
+            return 1;
+        };
+    }
+
+    // =========================
+    // Percentage
+    //
+
+    // §5.5. Percentages: the <percentage> type
+    // https://drafts.csswg.org/css-values-4/#percentages
+    function percentage(token, getNextToken, opts) {
+        // ... corresponds to the <percentage-token> production
+        if (token === null || token.type !== TYPE$5.Percentage) {
+            return 0;
+        }
+
+        // check range if specified
+        if (outOfRange(opts, token.value, token.value.length - 1)) {
+            return 0;
+        }
+
+        return 1;
+    }
+
+    // =========================
+    // Numeric
+    //
+
+    // https://drafts.csswg.org/css-values-4/#numbers
+    // The value <zero> represents a literal number with the value 0. Expressions that merely
+    // evaluate to a <number> with the value 0 (for example, calc(0)) do not match <zero>;
+    // only literal <number-token>s do.
+    function zero(next) {
+        if (typeof next !== 'function') {
+            next = function() {
+                return 0;
+            };
+        }
+
+        return function(token, getNextToken, opts) {
+            if (token !== null && token.type === TYPE$5.Number) {
+                if (Number(token.value) === 0) {
+                    return 1;
+                }
+            }
+
+            return next(token, getNextToken, opts);
+        };
+    }
+
+    // § 5.3. Real Numbers: the <number> type
+    // https://drafts.csswg.org/css-values-4/#numbers
+    // Number values are denoted by <number>, and represent real numbers, possibly with a fractional component.
+    // ... It corresponds to the <number-token> production
+    function number(token, getNextToken, opts) {
+        if (token === null) {
+            return 0;
+        }
+
+        var numberEnd = consumeNumber$2(token.value, 0);
+        var isNumber = numberEnd === token.value.length;
+        if (!isNumber && !isPostfixIeHack(token.value, numberEnd)) {
+            return 0;
+        }
+
+        // check range if specified
+        if (outOfRange(opts, token.value, numberEnd)) {
+            return 0;
+        }
+
+        return 1;
+    }
+
+    // §5.2. Integers: the <integer> type
+    // https://drafts.csswg.org/css-values-4/#integers
+    function integer(token, getNextToken, opts) {
+        // ... corresponds to a subset of the <number-token> production
+        if (token === null || token.type !== TYPE$5.Number) {
+            return 0;
+        }
+
+        // The first digit of an integer may be immediately preceded by `-` or `+` to indicate the integer’s sign.
+        var i = token.value.charCodeAt(0) === 0x002B ||       // U+002B PLUS SIGN (+)
+                token.value.charCodeAt(0) === 0x002D ? 1 : 0; // U+002D HYPHEN-MINUS (-)
+
+        // When written literally, an integer is one or more decimal digits 0 through 9 ...
+        for (; i < token.value.length; i++) {
+            if (!isDigit$3(token.value.charCodeAt(i))) {
+                return 0;
+            }
+        }
+
+        // check range if specified
+        if (outOfRange(opts, token.value, i)) {
+            return 0;
+        }
+
+        return 1;
+    }
+
+    var generic = {
+        // token types
+        'ident-token': tokenType(TYPE$5.Ident),
+        'function-token': tokenType(TYPE$5.Function),
+        'at-keyword-token': tokenType(TYPE$5.AtKeyword),
+        'hash-token': tokenType(TYPE$5.Hash),
+        'string-token': tokenType(TYPE$5.String),
+        'bad-string-token': tokenType(TYPE$5.BadString),
+        'url-token': tokenType(TYPE$5.Url),
+        'bad-url-token': tokenType(TYPE$5.BadUrl),
+        'delim-token': tokenType(TYPE$5.Delim),
+        'number-token': tokenType(TYPE$5.Number),
+        'percentage-token': tokenType(TYPE$5.Percentage),
+        'dimension-token': tokenType(TYPE$5.Dimension),
+        'whitespace-token': tokenType(TYPE$5.WhiteSpace),
+        'CDO-token': tokenType(TYPE$5.CDO),
+        'CDC-token': tokenType(TYPE$5.CDC),
+        'colon-token': tokenType(TYPE$5.Colon),
+        'semicolon-token': tokenType(TYPE$5.Semicolon),
+        'comma-token': tokenType(TYPE$5.Comma),
+        '[-token': tokenType(TYPE$5.LeftSquareBracket),
+        ']-token': tokenType(TYPE$5.RightSquareBracket),
+        '(-token': tokenType(TYPE$5.LeftParenthesis),
+        ')-token': tokenType(TYPE$5.RightParenthesis),
+        '{-token': tokenType(TYPE$5.LeftCurlyBracket),
+        '}-token': tokenType(TYPE$5.RightCurlyBracket),
+
+        // token type aliases
+        'string': tokenType(TYPE$5.String),
+        'ident': tokenType(TYPE$5.Ident),
+
+        // complex types
+        'custom-ident': customIdent,
+        'custom-property-name': customPropertyName,
+        'hex-color': hexColor,
+        'id-selector': idSelector, // element( <id-selector> )
+        'an-plus-b': genericAnPlusB,
+        'urange': genericUrange,
+        'declaration-value': declarationValue,
+        'any-value': anyValue,
+
+        // dimensions
+        'dimension': calc(dimension(null)),
+        'angle': calc(dimension(ANGLE)),
+        'decibel': calc(dimension(DECIBEL)),
+        'frequency': calc(dimension(FREQUENCY)),
+        'flex': calc(dimension(FLEX)),
+        'length': calc(zero(dimension(LENGTH))),
+        'resolution': calc(dimension(RESOLUTION)),
+        'semitones': calc(dimension(SEMITONES)),
+        'time': calc(dimension(TIME)),
+
+        // percentage
+        'percentage': calc(percentage),
+
+        // numeric
+        'zero': zero(),
+        'number': calc(number),
+        'integer': calc(integer),
+
+        // old IE stuff
+        '-ms-legacy-expression': func('expression')
+    };
+
+    var _SyntaxError$1 = function SyntaxError(message, input, offset) {
+        var error = createCustomError('SyntaxError', message);
+
+        error.input = input;
+        error.offset = offset;
+        error.rawMessage = message;
+        error.message = error.rawMessage + '\n' +
+            '  ' + error.input + '\n' +
+            '--' + new Array((error.offset || error.input.length) + 1).join('-') + '^';
+
+        return error;
+    };
+
+    var TAB = 9;
+    var N$1 = 10;
+    var F = 12;
+    var R = 13;
+    var SPACE = 32;
+
+    var Tokenizer = function(str) {
+        this.str = str;
+        this.pos = 0;
+    };
+
+    Tokenizer.prototype = {
+        charCodeAt: function(pos) {
+            return pos < this.str.length ? this.str.charCodeAt(pos) : 0;
+        },
+        charCode: function() {
+            return this.charCodeAt(this.pos);
+        },
+        nextCharCode: function() {
+            return this.charCodeAt(this.pos + 1);
+        },
+        nextNonWsCode: function(pos) {
+            return this.charCodeAt(this.findWsEnd(pos));
+        },
+        findWsEnd: function(pos) {
+            for (; pos < this.str.length; pos++) {
+                var code = this.str.charCodeAt(pos);
+                if (code !== R && code !== N$1 && code !== F && code !== SPACE && code !== TAB) {
+                    break;
+                }
+            }
+
+            return pos;
+        },
+        substringToPos: function(end) {
+            return this.str.substring(this.pos, this.pos = end);
+        },
+        eat: function(code) {
+            if (this.charCode() !== code) {
+                this.error('Expect `' + String.fromCharCode(code) + '`');
+            }
+
+            this.pos++;
+        },
+        peek: function() {
+            return this.pos < this.str.length ? this.str.charAt(this.pos++) : '';
+        },
+        error: function(message) {
+            throw new _SyntaxError$1(message, this.str, this.pos);
+        }
+    };
+
+    var tokenizer$1 = Tokenizer;
+
+    var TAB$1 = 9;
+    var N$2 = 10;
+    var F$1 = 12;
+    var R$1 = 13;
+    var SPACE$1 = 32;
+    var EXCLAMATIONMARK = 33;    // !
+    var NUMBERSIGN = 35;         // #
+    var AMPERSAND = 38;          // &
+    var APOSTROPHE = 39;         // '
+    var LEFTPARENTHESIS = 40;    // (
+    var RIGHTPARENTHESIS = 41;   // )
+    var ASTERISK = 42;           // *
+    var PLUSSIGN$2 = 43;           // +
+    var COMMA = 44;              // ,
+    var HYPERMINUS = 45;         // -
+    var LESSTHANSIGN = 60;       // <
+    var GREATERTHANSIGN = 62;    // >
+    var QUESTIONMARK$1 = 63;       // ?
+    var COMMERCIALAT = 64;       // @
+    var LEFTSQUAREBRACKET = 91;  // [
+    var RIGHTSQUAREBRACKET = 93; // ]
+    var LEFTCURLYBRACKET = 123;  // {
+    var VERTICALLINE = 124;      // |
+    var RIGHTCURLYBRACKET = 125; // }
+    var INFINITY = 8734;         // ∞
+    var NAME_CHAR = createCharMap(function(ch) {
+        return /[a-zA-Z0-9\-]/.test(ch);
+    });
+    var COMBINATOR_PRECEDENCE = {
+        ' ': 1,
+        '&&': 2,
+        '||': 3,
+        '|': 4
+    };
+
+    function createCharMap(fn) {
+        var array = typeof Uint32Array === 'function' ? new Uint32Array(128) : new Array(128);
+        for (var i = 0; i < 128; i++) {
+            array[i] = fn(String.fromCharCode(i)) ? 1 : 0;
+        }
+        return array;
+    }
+
+    function scanSpaces(tokenizer) {
+        return tokenizer.substringToPos(
+            tokenizer.findWsEnd(tokenizer.pos)
+        );
+    }
+
+    function scanWord(tokenizer) {
+        var end = tokenizer.pos;
+
+        for (; end < tokenizer.str.length; end++) {
+            var code = tokenizer.str.charCodeAt(end);
+            if (code >= 128 || NAME_CHAR[code] === 0) {
+                break;
+            }
+        }
+
+        if (tokenizer.pos === end) {
+            tokenizer.error('Expect a keyword');
+        }
+
+        return tokenizer.substringToPos(end);
+    }
+
+    function scanNumber(tokenizer) {
+        var end = tokenizer.pos;
+
+        for (; end < tokenizer.str.length; end++) {
+            var code = tokenizer.str.charCodeAt(end);
+            if (code < 48 || code > 57) {
+                break;
+            }
+        }
+
+        if (tokenizer.pos === end) {
+            tokenizer.error('Expect a number');
+        }
+
+        return tokenizer.substringToPos(end);
+    }
+
+    function scanString(tokenizer) {
+        var end = tokenizer.str.indexOf('\'', tokenizer.pos + 1);
+
+        if (end === -1) {
+            tokenizer.pos = tokenizer.str.length;
+            tokenizer.error('Expect an apostrophe');
+        }
+
+        return tokenizer.substringToPos(end + 1);
+    }
+
+    function readMultiplierRange(tokenizer) {
+        var min = null;
+        var max = null;
+
+        tokenizer.eat(LEFTCURLYBRACKET);
+
+        min = scanNumber(tokenizer);
+
+        if (tokenizer.charCode() === COMMA) {
+            tokenizer.pos++;
+            if (tokenizer.charCode() !== RIGHTCURLYBRACKET) {
+                max = scanNumber(tokenizer);
+            }
+        } else {
+            max = min;
+        }
+
+        tokenizer.eat(RIGHTCURLYBRACKET);
+
+        return {
+            min: Number(min),
+            max: max ? Number(max) : 0
+        };
+    }
+
+    function readMultiplier(tokenizer) {
+        var range = null;
+        var comma = false;
+
+        switch (tokenizer.charCode()) {
+            case ASTERISK:
+                tokenizer.pos++;
+
+                range = {
+                    min: 0,
+                    max: 0
+                };
+
+                break;
+
+            case PLUSSIGN$2:
+                tokenizer.pos++;
+
+                range = {
+                    min: 1,
+                    max: 0
+                };
+
+                break;
+
+            case QUESTIONMARK$1:
+                tokenizer.pos++;
+
+                range = {
+                    min: 0,
+                    max: 1
+                };
+
+                break;
+
+            case NUMBERSIGN:
+                tokenizer.pos++;
+
+                comma = true;
+
+                if (tokenizer.charCode() === LEFTCURLYBRACKET) {
+                    range = readMultiplierRange(tokenizer);
+                } else {
+                    range = {
+                        min: 1,
+                        max: 0
+                    };
+                }
+
+                break;
+
+            case LEFTCURLYBRACKET:
+                range = readMultiplierRange(tokenizer);
+                break;
+
+            default:
+                return null;
+        }
+
+        return {
+            type: 'Multiplier',
+            comma: comma,
+            min: range.min,
+            max: range.max,
+            term: null
+        };
+    }
+
+    function maybeMultiplied(tokenizer, node) {
+        var multiplier = readMultiplier(tokenizer);
+
+        if (multiplier !== null) {
+            multiplier.term = node;
+            return multiplier;
+        }
+
+        return node;
+    }
+
+    function maybeToken(tokenizer) {
+        var ch = tokenizer.peek();
+
+        if (ch === '') {
+            return null;
+        }
+
+        return {
+            type: 'Token',
+            value: ch
+        };
+    }
+
+    function readProperty(tokenizer) {
+        var name;
+
+        tokenizer.eat(LESSTHANSIGN);
+        tokenizer.eat(APOSTROPHE);
+
+        name = scanWord(tokenizer);
+
+        tokenizer.eat(APOSTROPHE);
+        tokenizer.eat(GREATERTHANSIGN);
+
+        return maybeMultiplied(tokenizer, {
+            type: 'Property',
+            name: name
+        });
+    }
+
+    // https://drafts.csswg.org/css-values-3/#numeric-ranges
+    // 4.1. Range Restrictions and Range Definition Notation
+    //
+    // Range restrictions can be annotated in the numeric type notation using CSS bracketed
+    // range notation—[min,max]—within the angle brackets, after the identifying keyword,
+    // indicating a closed range between (and including) min and max.
+    // For example, <integer [0, 10]> indicates an integer between 0 and 10, inclusive.
+    function readTypeRange(tokenizer) {
+        // use null for Infinity to make AST format JSON serializable/deserializable
+        var min = null; // -Infinity
+        var max = null; // Infinity
+        var sign = 1;
+
+        tokenizer.eat(LEFTSQUAREBRACKET);
+
+        if (tokenizer.charCode() === HYPERMINUS) {
+            tokenizer.peek();
+            sign = -1;
+        }
+
+        if (sign == -1 && tokenizer.charCode() === INFINITY) {
+            tokenizer.peek();
+        } else {
+            min = sign * Number(scanNumber(tokenizer));
+        }
+
+        scanSpaces(tokenizer);
+        tokenizer.eat(COMMA);
+        scanSpaces(tokenizer);
+
+        if (tokenizer.charCode() === INFINITY) {
+            tokenizer.peek();
+        } else {
+            sign = 1;
+
+            if (tokenizer.charCode() === HYPERMINUS) {
+                tokenizer.peek();
+                sign = -1;
+            }
+
+            max = sign * Number(scanNumber(tokenizer));
+        }
+
+        tokenizer.eat(RIGHTSQUAREBRACKET);
+
+        // If no range is indicated, either by using the bracketed range notation
+        // or in the property description, then [−∞,∞] is assumed.
+        if (min === null && max === null) {
+            return null;
+        }
+
+        return {
+            type: 'Range',
+            min: min,
+            max: max
+        };
+    }
+
+    function readType(tokenizer) {
+        var name;
+        var opts = null;
+
+        tokenizer.eat(LESSTHANSIGN);
+        name = scanWord(tokenizer);
+
+        if (tokenizer.charCode() === LEFTPARENTHESIS &&
+            tokenizer.nextCharCode() === RIGHTPARENTHESIS) {
+            tokenizer.pos += 2;
+            name += '()';
+        }
+
+        if (tokenizer.charCodeAt(tokenizer.findWsEnd(tokenizer.pos)) === LEFTSQUAREBRACKET) {
+            scanSpaces(tokenizer);
+            opts = readTypeRange(tokenizer);
+        }
+
+        tokenizer.eat(GREATERTHANSIGN);
+
+        return maybeMultiplied(tokenizer, {
+            type: 'Type',
+            name: name,
+            opts: opts
+        });
+    }
+
+    function readKeywordOrFunction(tokenizer) {
+        var name;
+
+        name = scanWord(tokenizer);
+
+        if (tokenizer.charCode() === LEFTPARENTHESIS) {
+            tokenizer.pos++;
+
+            return {
+                type: 'Function',
+                name: name
+            };
+        }
+
+        return maybeMultiplied(tokenizer, {
+            type: 'Keyword',
+            name: name
+        });
+    }
+
+    function regroupTerms(terms, combinators) {
+        function createGroup(terms, combinator) {
+            return {
+                type: 'Group',
+                terms: terms,
+                combinator: combinator,
+                disallowEmpty: false,
+                explicit: false
+            };
+        }
+
+        combinators = Object.keys(combinators).sort(function(a, b) {
+            return COMBINATOR_PRECEDENCE[a] - COMBINATOR_PRECEDENCE[b];
+        });
+
+        while (combinators.length > 0) {
+            var combinator = combinators.shift();
+            for (var i = 0, subgroupStart = 0; i < terms.length; i++) {
+                var term = terms[i];
+                if (term.type === 'Combinator') {
+                    if (term.value === combinator) {
+                        if (subgroupStart === -1) {
+                            subgroupStart = i - 1;
+                        }
+                        terms.splice(i, 1);
+                        i--;
+                    } else {
+                        if (subgroupStart !== -1 && i - subgroupStart > 1) {
+                            terms.splice(
+                                subgroupStart,
+                                i - subgroupStart,
+                                createGroup(terms.slice(subgroupStart, i), combinator)
+                            );
+                            i = subgroupStart + 1;
+                        }
+                        subgroupStart = -1;
+                    }
+                }
+            }
+
+            if (subgroupStart !== -1 && combinators.length) {
+                terms.splice(
+                    subgroupStart,
+                    i - subgroupStart,
+                    createGroup(terms.slice(subgroupStart, i), combinator)
+                );
+            }
+        }
+
+        return combinator;
+    }
+
+    function readImplicitGroup(tokenizer) {
+        var terms = [];
+        var combinators = {};
+        var token;
+        var prevToken = null;
+        var prevTokenPos = tokenizer.pos;
+
+        while (token = peek(tokenizer)) {
+            if (token.type !== 'Spaces') {
+                if (token.type === 'Combinator') {
+                    // check for combinator in group beginning and double combinator sequence
+                    if (prevToken === null || prevToken.type === 'Combinator') {
+                        tokenizer.pos = prevTokenPos;
+                        tokenizer.error('Unexpected combinator');
+                    }
+
+                    combinators[token.value] = true;
+                } else if (prevToken !== null && prevToken.type !== 'Combinator') {
+                    combinators[' '] = true;  // a b
+                    terms.push({
+                        type: 'Combinator',
+                        value: ' '
+                    });
+                }
+
+                terms.push(token);
+                prevToken = token;
+                prevTokenPos = tokenizer.pos;
+            }
+        }
+
+        // check for combinator in group ending
+        if (prevToken !== null && prevToken.type === 'Combinator') {
+            tokenizer.pos -= prevTokenPos;
+            tokenizer.error('Unexpected combinator');
+        }
+
+        return {
+            type: 'Group',
+            terms: terms,
+            combinator: regroupTerms(terms, combinators) || ' ',
+            disallowEmpty: false,
+            explicit: false
+        };
+    }
+
+    function readGroup(tokenizer) {
+        var result;
+
+        tokenizer.eat(LEFTSQUAREBRACKET);
+        result = readImplicitGroup(tokenizer);
+        tokenizer.eat(RIGHTSQUAREBRACKET);
+
+        result.explicit = true;
+
+        if (tokenizer.charCode() === EXCLAMATIONMARK) {
+            tokenizer.pos++;
+            result.disallowEmpty = true;
+        }
+
+        return result;
+    }
+
+    function peek(tokenizer) {
+        var code = tokenizer.charCode();
+
+        if (code < 128 && NAME_CHAR[code] === 1) {
+            return readKeywordOrFunction(tokenizer);
+        }
+
+        switch (code) {
+            case RIGHTSQUAREBRACKET:
+                // don't eat, stop scan a group
+                break;
+
+            case LEFTSQUAREBRACKET:
+                return maybeMultiplied(tokenizer, readGroup(tokenizer));
+
+            case LESSTHANSIGN:
+                return tokenizer.nextCharCode() === APOSTROPHE
+                    ? readProperty(tokenizer)
+                    : readType(tokenizer);
+
+            case VERTICALLINE:
+                return {
+                    type: 'Combinator',
+                    value: tokenizer.substringToPos(
+                        tokenizer.nextCharCode() === VERTICALLINE
+                            ? tokenizer.pos + 2
+                            : tokenizer.pos + 1
+                    )
+                };
+
+            case AMPERSAND:
+                tokenizer.pos++;
+                tokenizer.eat(AMPERSAND);
+
+                return {
+                    type: 'Combinator',
+                    value: '&&'
+                };
+
+            case COMMA:
+                tokenizer.pos++;
+                return {
+                    type: 'Comma'
+                };
+
+            case APOSTROPHE:
+                return maybeMultiplied(tokenizer, {
+                    type: 'String',
+                    value: scanString(tokenizer)
+                });
+
+            case SPACE$1:
+            case TAB$1:
+            case N$2:
+            case R$1:
+            case F$1:
+                return {
+                    type: 'Spaces',
+                    value: scanSpaces(tokenizer)
+                };
+
+            case COMMERCIALAT:
+                code = tokenizer.nextCharCode();
+
+                if (code < 128 && NAME_CHAR[code] === 1) {
+                    tokenizer.pos++;
+                    return {
+                        type: 'AtKeyword',
+                        name: scanWord(tokenizer)
+                    };
+                }
+
+                return maybeToken(tokenizer);
+
+            case ASTERISK:
+            case PLUSSIGN$2:
+            case QUESTIONMARK$1:
+            case NUMBERSIGN:
+            case EXCLAMATIONMARK:
+                // prohibited tokens (used as a multiplier start)
+                break;
+
+            case LEFTCURLYBRACKET:
+                // LEFTCURLYBRACKET is allowed since mdn/data uses it w/o quoting
+                // check next char isn't a number, because it's likely a disjoined multiplier
+                code = tokenizer.nextCharCode();
+
+                if (code < 48 || code > 57) {
+                    return maybeToken(tokenizer);
+                }
+
+                break;
+
+            default:
+                return maybeToken(tokenizer);
+        }
+    }
+
+    function parse(source) {
+        var tokenizer = new tokenizer$1(source);
+        var result = readImplicitGroup(tokenizer);
+
+        if (tokenizer.pos !== source.length) {
+            tokenizer.error('Unexpected input');
+        }
+
+        // reduce redundant groups with single group term
+        if (result.terms.length === 1 && result.terms[0].type === 'Group') {
+            result = result.terms[0];
+        }
+
+        return result;
+    }
+
+    // warm up parse to elimitate code branches that never execute
+    // fix soft deoptimizations (insufficient type feedback)
+    parse('[a&&<b>#|<\'c\'>*||e() f{2} /,(% g#{1,2} h{2,})]!');
+
+    var parse_1 = parse;
+
+    var noop$1 = function() {};
+
+    function ensureFunction(value) {
+        return typeof value === 'function' ? value : noop$1;
+    }
+
+    var walk = function(node, options, context) {
+        function walk(node) {
+            enter.call(context, node);
+
+            switch (node.type) {
+                case 'Group':
+                    node.terms.forEach(walk);
+                    break;
+
+                case 'Multiplier':
+                    walk(node.term);
+                    break;
+
+                case 'Type':
+                case 'Property':
+                case 'Keyword':
+                case 'AtKeyword':
+                case 'Function':
+                case 'String':
+                case 'Token':
+                case 'Comma':
+                    break;
+
+                default:
+                    throw new Error('Unknown type: ' + node.type);
+            }
+
+            leave.call(context, node);
+        }
+
+        var enter = noop$1;
+        var leave = noop$1;
+
+        if (typeof options === 'function') {
+            enter = options;
+        } else if (options) {
+            enter = ensureFunction(options.enter);
+            leave = ensureFunction(options.leave);
+        }
+
+        if (enter === noop$1 && leave === noop$1) {
+            throw new Error('Neither `enter` nor `leave` walker handler is set or both aren\'t a function');
+        }
+
+        walk(node);
+    };
+
+    var tokenStream = new TokenStream_1();
+    var astToTokens = {
+        decorator: function(handlers) {
+            var curNode = null;
+            var prev = { len: 0, node: null };
+            var nodes = [prev];
+            var buffer = '';
+
+            return {
+                children: handlers.children,
+                node: function(node) {
+                    var tmp = curNode;
+                    curNode = node;
+                    handlers.node.call(this, node);
+                    curNode = tmp;
+                },
+                chunk: function(chunk) {
+                    buffer += chunk;
+                    if (prev.node !== curNode) {
+                        nodes.push({
+                            len: chunk.length,
+                            node: curNode
+                        });
+                    } else {
+                        prev.len += chunk.length;
+                    }
+                },
+                result: function() {
+                    return prepareTokens(buffer, nodes);
+                }
+            };
+        }
+    };
+
+    function prepareTokens(str, nodes) {
+        var tokens = [];
+        var nodesOffset = 0;
+        var nodesIndex = 0;
+        var currentNode = nodes ? nodes[nodesIndex].node : null;
+
+        tokenizer(str, tokenStream);
+
+        while (!tokenStream.eof) {
+            if (nodes) {
+                while (nodesIndex < nodes.length && nodesOffset + nodes[nodesIndex].len <= tokenStream.tokenStart) {
+                    nodesOffset += nodes[nodesIndex++].len;
+                    currentNode = nodes[nodesIndex].node;
+                }
+            }
+
+            tokens.push({
+                type: tokenStream.tokenType,
+                value: tokenStream.getTokenValue(),
+                index: tokenStream.tokenIndex, // TODO: remove it, temporary solution
+                balance: tokenStream.balance[tokenStream.tokenIndex], // TODO: remove it, temporary solution
+                node: currentNode
+            });
+            tokenStream.next();
+            // console.log({ ...tokens[tokens.length - 1], node: undefined });
+        }
+
+        return tokens;
+    }
+
+    var prepareTokens_1 = function(value, syntax) {
+        if (typeof value === 'string') {
+            return prepareTokens(value, null);
+        }
+
+        return syntax.generate(value, astToTokens);
+    };
+
+    var MATCH = { type: 'Match' };
+    var MISMATCH = { type: 'Mismatch' };
+    var DISALLOW_EMPTY = { type: 'DisallowEmpty' };
+    var LEFTPARENTHESIS$1 = 40;  // (
+    var RIGHTPARENTHESIS$1 = 41; // )
+
+    function createCondition(match, thenBranch, elseBranch) {
+        // reduce node count
+        if (thenBranch === MATCH && elseBranch === MISMATCH) {
+            return match;
+        }
+
+        if (match === MATCH && thenBranch === MATCH && elseBranch === MATCH) {
+            return match;
+        }
+
+        if (match.type === 'If' && match.else === MISMATCH && thenBranch === MATCH) {
+            thenBranch = match.then;
+            match = match.match;
+        }
+
+        return {
+            type: 'If',
+            match: match,
+            then: thenBranch,
+            else: elseBranch
+        };
+    }
+
+    function isFunctionType(name) {
+        return (
+            name.length > 2 &&
+            name.charCodeAt(name.length - 2) === LEFTPARENTHESIS$1 &&
+            name.charCodeAt(name.length - 1) === RIGHTPARENTHESIS$1
+        );
+    }
+
+    function isEnumCapatible(term) {
+        return (
+            term.type === 'Keyword' ||
+            term.type === 'AtKeyword' ||
+            term.type === 'Function' ||
+            term.type === 'Type' && isFunctionType(term.name)
+        );
+    }
+
+    function buildGroupMatchGraph(combinator, terms, atLeastOneTermMatched) {
+        switch (combinator) {
+            case ' ':
+                // Juxtaposing components means that all of them must occur, in the given order.
+                //
+                // a b c
+                // =
+                // match a
+                //   then match b
+                //     then match c
+                //       then MATCH
+                //       else MISMATCH
+                //     else MISMATCH
+                //   else MISMATCH
+                var result = MATCH;
+
+                for (var i = terms.length - 1; i >= 0; i--) {
+                    var term = terms[i];
+
+                    result = createCondition(
+                        term,
+                        result,
+                        MISMATCH
+                    );
+                }
+                return result;
+
+            case '|':
+                // A bar (|) separates two or more alternatives: exactly one of them must occur.
+                //
+                // a | b | c
+                // =
+                // match a
+                //   then MATCH
+                //   else match b
+                //     then MATCH
+                //     else match c
+                //       then MATCH
+                //       else MISMATCH
+
+                var result = MISMATCH;
+                var map = null;
+
+                for (var i = terms.length - 1; i >= 0; i--) {
+                    var term = terms[i];
+
+                    // reduce sequence of keywords into a Enum
+                    if (isEnumCapatible(term)) {
+                        if (map === null && i > 0 && isEnumCapatible(terms[i - 1])) {
+                            map = Object.create(null);
+                            result = createCondition(
+                                {
+                                    type: 'Enum',
+                                    map: map
+                                },
+                                MATCH,
+                                result
+                            );
+                        }
+
+                        if (map !== null) {
+                            var key = (isFunctionType(term.name) ? term.name.slice(0, -1) : term.name).toLowerCase();
+                            if (key in map === false) {
+                                map[key] = term;
+                                continue;
+                            }
+                        }
+                    }
+
+                    map = null;
+
+                    // create a new conditonal node
+                    result = createCondition(
+                        term,
+                        MATCH,
+                        result
+                    );
+                }
+                return result;
+
+            case '&&':
+                // A double ampersand (&&) separates two or more components,
+                // all of which must occur, in any order.
+
+                // Use MatchOnce for groups with a large number of terms,
+                // since &&-groups produces at least N!-node trees
+                if (terms.length > 5) {
+                    return {
+                        type: 'MatchOnce',
+                        terms: terms,
+                        all: true
+                    };
+                }
+
+                // Use a combination tree for groups with small number of terms
+                //
+                // a && b && c
+                // =
+                // match a
+                //   then [b && c]
+                //   else match b
+                //     then [a && c]
+                //     else match c
+                //       then [a && b]
+                //       else MISMATCH
+                //
+                // a && b
+                // =
+                // match a
+                //   then match b
+                //     then MATCH
+                //     else MISMATCH
+                //   else match b
+                //     then match a
+                //       then MATCH
+                //       else MISMATCH
+                //     else MISMATCH
+                var result = MISMATCH;
+
+                for (var i = terms.length - 1; i >= 0; i--) {
+                    var term = terms[i];
+                    var thenClause;
+
+                    if (terms.length > 1) {
+                        thenClause = buildGroupMatchGraph(
+                            combinator,
+                            terms.filter(function(newGroupTerm) {
+                                return newGroupTerm !== term;
+                            }),
+                            false
+                        );
+                    } else {
+                        thenClause = MATCH;
+                    }
+
+                    result = createCondition(
+                        term,
+                        thenClause,
+                        result
+                    );
+                }
+                return result;
+
+            case '||':
+                // A double bar (||) separates two or more options:
+                // one or more of them must occur, in any order.
+
+                // Use MatchOnce for groups with a large number of terms,
+                // since ||-groups produces at least N!-node trees
+                if (terms.length > 5) {
+                    return {
+                        type: 'MatchOnce',
+                        terms: terms,
+                        all: false
+                    };
+                }
+
+                // Use a combination tree for groups with small number of terms
+                //
+                // a || b || c
+                // =
+                // match a
+                //   then [b || c]
+                //   else match b
+                //     then [a || c]
+                //     else match c
+                //       then [a || b]
+                //       else MISMATCH
+                //
+                // a || b
+                // =
+                // match a
+                //   then match b
+                //     then MATCH
+                //     else MATCH
+                //   else match b
+                //     then match a
+                //       then MATCH
+                //       else MATCH
+                //     else MISMATCH
+                var result = atLeastOneTermMatched ? MATCH : MISMATCH;
+
+                for (var i = terms.length - 1; i >= 0; i--) {
+                    var term = terms[i];
+                    var thenClause;
+
+                    if (terms.length > 1) {
+                        thenClause = buildGroupMatchGraph(
+                            combinator,
+                            terms.filter(function(newGroupTerm) {
+                                return newGroupTerm !== term;
+                            }),
+                            true
+                        );
+                    } else {
+                        thenClause = MATCH;
+                    }
+
+                    result = createCondition(
+                        term,
+                        thenClause,
+                        result
+                    );
+                }
+                return result;
+        }
+    }
+
+    function buildMultiplierMatchGraph(node) {
+        var result = MATCH;
+        var matchTerm = buildMatchGraph(node.term);
+
+        if (node.max === 0) {
+            // disable repeating of empty match to prevent infinite loop
+            matchTerm = createCondition(
+                matchTerm,
+                DISALLOW_EMPTY,
+                MISMATCH
+            );
+
+            // an occurrence count is not limited, make a cycle;
+            // to collect more terms on each following matching mismatch
+            result = createCondition(
+                matchTerm,
+                null, // will be a loop
+                MISMATCH
+            );
+
+            result.then = createCondition(
+                MATCH,
+                MATCH,
+                result // make a loop
+            );
+
+            if (node.comma) {
+                result.then.else = createCondition(
+                    { type: 'Comma', syntax: node },
+                    result,
+                    MISMATCH
+                );
+            }
+        } else {
+            // create a match node chain for [min .. max] interval with optional matches
+            for (var i = node.min || 1; i <= node.max; i++) {
+                if (node.comma && result !== MATCH) {
+                    result = createCondition(
+                        { type: 'Comma', syntax: node },
+                        result,
+                        MISMATCH
+                    );
+                }
+
+                result = createCondition(
+                    matchTerm,
+                    createCondition(
+                        MATCH,
+                        MATCH,
+                        result
+                    ),
+                    MISMATCH
+                );
+            }
+        }
+
+        if (node.min === 0) {
+            // allow zero match
+            result = createCondition(
+                MATCH,
+                MATCH,
+                result
+            );
+        } else {
+            // create a match node chain to collect [0 ... min - 1] required matches
+            for (var i = 0; i < node.min - 1; i++) {
+                if (node.comma && result !== MATCH) {
+                    result = createCondition(
+                        { type: 'Comma', syntax: node },
+                        result,
+                        MISMATCH
+                    );
+                }
+
+                result = createCondition(
+                    matchTerm,
+                    result,
+                    MISMATCH
+                );
+            }
+        }
+
+        return result;
+    }
+
+    function buildMatchGraph(node) {
+        if (typeof node === 'function') {
+            return {
+                type: 'Generic',
+                fn: node
+            };
+        }
+
+        switch (node.type) {
+            case 'Group':
+                var result = buildGroupMatchGraph(
+                    node.combinator,
+                    node.terms.map(buildMatchGraph),
+                    false
+                );
+
+                if (node.disallowEmpty) {
+                    result = createCondition(
+                        result,
+                        DISALLOW_EMPTY,
+                        MISMATCH
+                    );
+                }
+
+                return result;
+
+            case 'Multiplier':
+                return buildMultiplierMatchGraph(node);
+
+            case 'Type':
+            case 'Property':
+                return {
+                    type: node.type,
+                    name: node.name,
+                    syntax: node
+                };
+
+            case 'Keyword':
+                return {
+                    type: node.type,
+                    name: node.name.toLowerCase(),
+                    syntax: node
+                };
+
+            case 'AtKeyword':
+                return {
+                    type: node.type,
+                    name: '@' + node.name.toLowerCase(),
+                    syntax: node
+                };
+
+            case 'Function':
+                return {
+                    type: node.type,
+                    name: node.name.toLowerCase() + '(',
+                    syntax: node
+                };
+
+            case 'String':
+                // convert a one char length String to a Token
+                if (node.value.length === 3) {
+                    return {
+                        type: 'Token',
+                        value: node.value.charAt(1),
+                        syntax: node
+                    };
+                }
+
+                // otherwise use it as is
+                return {
+                    type: node.type,
+                    value: node.value.substr(1, node.value.length - 2).replace(/\\'/g, '\''),
+                    syntax: node
+                };
+
+            case 'Token':
+                return {
+                    type: node.type,
+                    value: node.value,
+                    syntax: node
+                };
+
+            case 'Comma':
+                return {
+                    type: node.type,
+                    syntax: node
+                };
+
+            default:
+                throw new Error('Unknown node type:', node.type);
+        }
+    }
+
+    var matchGraph = {
+        MATCH: MATCH,
+        MISMATCH: MISMATCH,
+        DISALLOW_EMPTY: DISALLOW_EMPTY,
+        buildMatchGraph: function(syntaxTree, ref) {
+            if (typeof syntaxTree === 'string') {
+                syntaxTree = parse_1(syntaxTree);
+            }
+
+            return {
+                type: 'MatchGraph',
+                match: buildMatchGraph(syntaxTree),
+                syntax: ref || null,
+                source: syntaxTree
+            };
+        }
+    };
+
+    var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
+
+    var MATCH$1 = matchGraph.MATCH;
+    var MISMATCH$1 = matchGraph.MISMATCH;
+    var DISALLOW_EMPTY$1 = matchGraph.DISALLOW_EMPTY;
+    var TYPE$6 = _const.TYPE;
+
+    var STUB = 0;
+    var TOKEN = 1;
+    var OPEN_SYNTAX = 2;
+    var CLOSE_SYNTAX = 3;
+
+    var EXIT_REASON_MATCH = 'Match';
+    var EXIT_REASON_MISMATCH = 'Mismatch';
+    var EXIT_REASON_ITERATION_LIMIT = 'Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)';
+
+    var ITERATION_LIMIT = 15000;
+    var totalIterationCount = 0;
+
+    function reverseList(list) {
+        var prev = null;
+        var next = null;
+        var item = list;
+
+        while (item !== null) {
+            next = item.prev;
+            item.prev = prev;
+            prev = item;
+            item = next;
+        }
+
+        return prev;
+    }
+
+    function areStringsEqualCaseInsensitive(testStr, referenceStr) {
+        if (testStr.length !== referenceStr.length) {
+            return false;
+        }
+
+        for (var i = 0; i < testStr.length; i++) {
+            var testCode = testStr.charCodeAt(i);
+            var referenceCode = referenceStr.charCodeAt(i);
+
+            // testCode.toLowerCase() for U+0041 LATIN CAPITAL LETTER A (A) .. U+005A LATIN CAPITAL LETTER Z (Z).
+            if (testCode >= 0x0041 && testCode <= 0x005A) {
+                testCode = testCode | 32;
+            }
+
+            if (testCode !== referenceCode) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    function isContextEdgeDelim(token) {
+        if (token.type !== TYPE$6.Delim) {
+            return false;
+        }
+
+        // Fix matching for unicode-range: U+30??, U+FF00-FF9F
+        // Probably we need to check out previous match instead
+        return token.value !== '?';
+    }
+
+    function isCommaContextStart(token) {
+        if (token === null) {
+            return true;
+        }
+
+        return (
+            token.type === TYPE$6.Comma ||
+            token.type === TYPE$6.Function ||
+            token.type === TYPE$6.LeftParenthesis ||
+            token.type === TYPE$6.LeftSquareBracket ||
+            token.type === TYPE$6.LeftCurlyBracket ||
+            isContextEdgeDelim(token)
+        );
+    }
+
+    function isCommaContextEnd(token) {
+        if (token === null) {
+            return true;
+        }
+
+        return (
+            token.type === TYPE$6.RightParenthesis ||
+            token.type === TYPE$6.RightSquareBracket ||
+            token.type === TYPE$6.RightCurlyBracket ||
+            token.type === TYPE$6.Delim
+        );
+    }
+
+    function internalMatch(tokens, state, syntaxes) {
+        function moveToNextToken() {
+            do {
+                tokenIndex++;
+                token = tokenIndex < tokens.length ? tokens[tokenIndex] : null;
+            } while (token !== null && (token.type === TYPE$6.WhiteSpace || token.type === TYPE$6.Comment));
+        }
+
+        function getNextToken(offset) {
+            var nextIndex = tokenIndex + offset;
+
+            return nextIndex < tokens.length ? tokens[nextIndex] : null;
+        }
+
+        function stateSnapshotFromSyntax(nextState, prev) {
+            return {
+                nextState: nextState,
+                matchStack: matchStack,
+                syntaxStack: syntaxStack,
+                thenStack: thenStack,
+                tokenIndex: tokenIndex,
+                prev: prev
+            };
+        }
+
+        function pushThenStack(nextState) {
+            thenStack = {
+                nextState: nextState,
+                matchStack: matchStack,
+                syntaxStack: syntaxStack,
+                prev: thenStack
+            };
+        }
+
+        function pushElseStack(nextState) {
+            elseStack = stateSnapshotFromSyntax(nextState, elseStack);
+        }
+
+        function addTokenToMatch() {
+            matchStack = {
+                type: TOKEN,
+                syntax: state.syntax,
+                token: token,
+                prev: matchStack
+            };
+
+            moveToNextToken();
+            syntaxStash = null;
+
+            if (tokenIndex > longestMatch) {
+                longestMatch = tokenIndex;
+            }
+        }
+
+        function openSyntax() {
+            syntaxStack = {
+                syntax: state.syntax,
+                opts: state.syntax.opts || (syntaxStack !== null && syntaxStack.opts) || null,
+                prev: syntaxStack
+            };
+
+            matchStack = {
+                type: OPEN_SYNTAX,
+                syntax: state.syntax,
+                token: matchStack.token,
+                prev: matchStack
+            };
+        }
+
+        function closeSyntax() {
+            if (matchStack.type === OPEN_SYNTAX) {
+                matchStack = matchStack.prev;
+            } else {
+                matchStack = {
+                    type: CLOSE_SYNTAX,
+                    syntax: syntaxStack.syntax,
+                    token: matchStack.token,
+                    prev: matchStack
+                };
+            }
+
+            syntaxStack = syntaxStack.prev;
+        }
+
+        var syntaxStack = null;
+        var thenStack = null;
+        var elseStack = null;
+
+        // null – stashing allowed, nothing stashed
+        // false – stashing disabled, nothing stashed
+        // anithing else – fail stashable syntaxes, some syntax stashed
+        var syntaxStash = null;
+
+        var iterationCount = 0; // count iterations and prevent infinite loop
+        var exitReason = null;
+
+        var token = null;
+        var tokenIndex = -1;
+        var longestMatch = 0;
+        var matchStack = {
+            type: STUB,
+            syntax: null,
+            token: null,
+            prev: null
+        };
+
+        moveToNextToken();
+
+        while (exitReason === null && ++iterationCount < ITERATION_LIMIT) {
+            // function mapList(list, fn) {
+            //     var result = [];
+            //     while (list) {
+            //         result.unshift(fn(list));
+            //         list = list.prev;
+            //     }
+            //     return result;
+            // }
+            // console.log('--\n',
+            //     '#' + iterationCount,
+            //     require('util').inspect({
+            //         match: mapList(matchStack, x => x.type === TOKEN ? x.token && x.token.value : x.syntax ? ({ [OPEN_SYNTAX]: '<', [CLOSE_SYNTAX]: '</' }[x.type] || x.type) + '!' + x.syntax.name : null),
+            //         token: token && token.value,
+            //         tokenIndex,
+            //         syntax: syntax.type + (syntax.id ? ' #' + syntax.id : '')
+            //     }, { depth: null })
+            // );
+            switch (state.type) {
+                case 'Match':
+                    if (thenStack === null) {
+                        // turn to MISMATCH when some tokens left unmatched
+                        if (token !== null) {
+                            // doesn't mismatch if just one token left and it's an IE hack
+                            if (tokenIndex !== tokens.length - 1 || (token.value !== '\\0' && token.value !== '\\9')) {
+                                state = MISMATCH$1;
+                                break;
+                            }
+                        }
+
+                        // break the main loop, return a result - MATCH
+                        exitReason = EXIT_REASON_MATCH;
+                        break;
+                    }
+
+                    // go to next syntax (`then` branch)
+                    state = thenStack.nextState;
+
+                    // check match is not empty
+                    if (state === DISALLOW_EMPTY$1) {
+                        if (thenStack.matchStack === matchStack) {
+                            state = MISMATCH$1;
+                            break;
+                        } else {
+                            state = MATCH$1;
+                        }
+                    }
+
+                    // close syntax if needed
+                    while (thenStack.syntaxStack !== syntaxStack) {
+                        closeSyntax();
+                    }
+
+                    // pop stack
+                    thenStack = thenStack.prev;
+                    break;
+
+                case 'Mismatch':
+                    // when some syntax is stashed
+                    if (syntaxStash !== null && syntaxStash !== false) {
+                        // there is no else branches or a branch reduce match stack
+                        if (elseStack === null || tokenIndex > elseStack.tokenIndex) {
+                            // restore state from the stash
+                            elseStack = syntaxStash;
+                            syntaxStash = false; // disable stashing
+                        }
+                    } else if (elseStack === null) {
+                        // no else branches -> break the main loop
+                        // return a result - MISMATCH
+                        exitReason = EXIT_REASON_MISMATCH;
+                        break;
+                    }
+
+                    // go to next syntax (`else` branch)
+                    state = elseStack.nextState;
+
+                    // restore all the rest stack states
+                    thenStack = elseStack.thenStack;
+                    syntaxStack = elseStack.syntaxStack;
+                    matchStack = elseStack.matchStack;
+                    tokenIndex = elseStack.tokenIndex;
+                    token = tokenIndex < tokens.length ? tokens[tokenIndex] : null;
+
+                    // pop stack
+                    elseStack = elseStack.prev;
+                    break;
+
+                case 'MatchGraph':
+                    state = state.match;
+                    break;
+
+                case 'If':
+                    // IMPORTANT: else stack push must go first,
+                    // since it stores the state of thenStack before changes
+                    if (state.else !== MISMATCH$1) {
+                        pushElseStack(state.else);
+                    }
+
+                    if (state.then !== MATCH$1) {
+                        pushThenStack(state.then);
+                    }
+
+                    state = state.match;
+                    break;
+
+                case 'MatchOnce':
+                    state = {
+                        type: 'MatchOnceBuffer',
+                        syntax: state,
+                        index: 0,
+                        mask: 0
+                    };
+                    break;
+
+                case 'MatchOnceBuffer':
+                    var terms = state.syntax.terms;
+
+                    if (state.index === terms.length) {
+                        // no matches at all or it's required all terms to be matched
+                        if (state.mask === 0 || state.syntax.all) {
+                            state = MISMATCH$1;
+                            break;
+                        }
+
+                        // a partial match is ok
+                        state = MATCH$1;
+                        break;
+                    }
+
+                    // all terms are matched
+                    if (state.mask === (1 << terms.length) - 1) {
+                        state = MATCH$1;
+                        break;
+                    }
+
+                    for (; state.index < terms.length; state.index++) {
+                        var matchFlag = 1 << state.index;
+
+                        if ((state.mask & matchFlag) === 0) {
+                            // IMPORTANT: else stack push must go first,
+                            // since it stores the state of thenStack before changes
+                            pushElseStack(state);
+                            pushThenStack({
+                                type: 'AddMatchOnce',
+                                syntax: state.syntax,
+                                mask: state.mask | matchFlag
+                            });
+
+                            // match
+                            state = terms[state.index++];
+                            break;
+                        }
+                    }
+                    break;
+
+                case 'AddMatchOnce':
+                    state = {
+                        type: 'MatchOnceBuffer',
+                        syntax: state.syntax,
+                        index: 0,
+                        mask: state.mask
+                    };
+                    break;
+
+                case 'Enum':
+                    if (token !== null) {
+                        var name = token.value.toLowerCase();
+
+                        // drop \0 and \9 hack from keyword name
+                        if (name.indexOf('\\') !== -1) {
+                            name = name.replace(/\\[09].*$/, '');
+                        }
+
+                        if (hasOwnProperty$1.call(state.map, name)) {
+                            state = state.map[name];
+                            break;
+                        }
+                    }
+
+                    state = MISMATCH$1;
+                    break;
+
+                case 'Generic':
+                    var opts = syntaxStack !== null ? syntaxStack.opts : null;
+                    var lastTokenIndex = tokenIndex + Math.floor(state.fn(token, getNextToken, opts));
+
+                    if (!isNaN(lastTokenIndex) && lastTokenIndex > tokenIndex) {
+                        while (tokenIndex < lastTokenIndex) {
+                            addTokenToMatch();
+                        }
+
+                        state = MATCH$1;
+                    } else {
+                        state = MISMATCH$1;
+                    }
+
+                    break;
+
+                case 'Type':
+                case 'Property':
+                    var syntaxDict = state.type === 'Type' ? 'types' : 'properties';
+                    var dictSyntax = hasOwnProperty$1.call(syntaxes, syntaxDict) ? syntaxes[syntaxDict][state.name] : null;
+
+                    if (!dictSyntax || !dictSyntax.match) {
+                        throw new Error(
+                            'Bad syntax reference: ' +
+                            (state.type === 'Type'
+                                ? '<' + state.name + '>'
+                                : '<\'' + state.name + '\'>')
+                        );
+                    }
+
+                    // stash a syntax for types with low priority
+                    if (syntaxStash !== false && token !== null && state.type === 'Type') {
+                        var lowPriorityMatching =
+                            // https://drafts.csswg.org/css-values-4/#custom-idents
+                            // When parsing positionally-ambiguous keywords in a property value, a <custom-ident> production
+                            // can only claim the keyword if no other unfulfilled production can claim it.
+                            (state.name === 'custom-ident' && token.type === TYPE$6.Ident) ||
+
+                            // https://drafts.csswg.org/css-values-4/#lengths
+                            // ... if a `0` could be parsed as either a <number> or a <length> in a property (such as line-height),
+                            // it must parse as a <number>
+                            (state.name === 'length' && token.value === '0');
+
+                        if (lowPriorityMatching) {
+                            if (syntaxStash === null) {
+                                syntaxStash = stateSnapshotFromSyntax(state, elseStack);
+                            }
+
+                            state = MISMATCH$1;
+                            break;
+                        }
+                    }
+
+                    openSyntax();
+                    state = dictSyntax.match;
+                    break;
+
+                case 'Keyword':
+                    var name = state.name;
+
+                    if (token !== null) {
+                        var keywordName = token.value;
+
+                        // drop \0 and \9 hack from keyword name
+                        if (keywordName.indexOf('\\') !== -1) {
+                            keywordName = keywordName.replace(/\\[09].*$/, '');
+                        }
+
+                        if (areStringsEqualCaseInsensitive(keywordName, name)) {
+                            addTokenToMatch();
+                            state = MATCH$1;
+                            break;
+                        }
+                    }
+
+                    state = MISMATCH$1;
+                    break;
+
+                case 'AtKeyword':
+                case 'Function':
+                    if (token !== null && areStringsEqualCaseInsensitive(token.value, state.name)) {
+                        addTokenToMatch();
+                        state = MATCH$1;
+                        break;
+                    }
+
+                    state = MISMATCH$1;
+                    break;
+
+                case 'Token':
+                    if (token !== null && token.value === state.value) {
+                        addTokenToMatch();
+                        state = MATCH$1;
+                        break;
+                    }
+
+                    state = MISMATCH$1;
+                    break;
+
+                case 'Comma':
+                    if (token !== null && token.type === TYPE$6.Comma) {
+                        if (isCommaContextStart(matchStack.token)) {
+                            state = MISMATCH$1;
+                        } else {
+                            addTokenToMatch();
+                            state = isCommaContextEnd(token) ? MISMATCH$1 : MATCH$1;
+                        }
+                    } else {
+                        state = isCommaContextStart(matchStack.token) || isCommaContextEnd(token) ? MATCH$1 : MISMATCH$1;
+                    }
+
+                    break;
+
+                case 'String':
+                    var string = '';
+
+                    for (var lastTokenIndex = tokenIndex; lastTokenIndex < tokens.length && string.length < state.value.length; lastTokenIndex++) {
+                        string += tokens[lastTokenIndex].value;
+                    }
+
+                    if (areStringsEqualCaseInsensitive(string, state.value)) {
+                        while (tokenIndex < lastTokenIndex) {
+                            addTokenToMatch();
+                        }
+
+                        state = MATCH$1;
+                    } else {
+                        state = MISMATCH$1;
+                    }
+
+                    break;
+
+                default:
+                    throw new Error('Unknown node type: ' + state.type);
+            }
+        }
+
+        totalIterationCount += iterationCount;
+
+        switch (exitReason) {
+            case null:
+                console.warn('[csstree-match] BREAK after ' + ITERATION_LIMIT + ' iterations');
+                exitReason = EXIT_REASON_ITERATION_LIMIT;
+                matchStack = null;
+                break;
+
+            case EXIT_REASON_MATCH:
+                while (syntaxStack !== null) {
+                    closeSyntax();
+                }
+                break;
+
+            default:
+                matchStack = null;
+        }
+
+        return {
+            tokens: tokens,
+            reason: exitReason,
+            iterations: iterationCount,
+            match: matchStack,
+            longestMatch: longestMatch
+        };
+    }
+
+    function matchAsList(tokens, matchGraph, syntaxes) {
+        var matchResult = internalMatch(tokens, matchGraph, syntaxes || {});
+
+        if (matchResult.match !== null) {
+            var item = reverseList(matchResult.match).prev;
+
+            matchResult.match = [];
+
+            while (item !== null) {
+                switch (item.type) {
+                    case STUB:
+                        break;
+
+                    case OPEN_SYNTAX:
+                    case CLOSE_SYNTAX:
+                        matchResult.match.push({
+                            type: item.type,
+                            syntax: item.syntax
+                        });
+                        break;
+
+                    default:
+                        matchResult.match.push({
+                            token: item.token.value,
+                            node: item.token.node
+                        });
+                        break;
+                }
+
+                item = item.prev;
+            }
+        }
+
+        return matchResult;
+    }
+
+    function matchAsTree(tokens, matchGraph, syntaxes) {
+        var matchResult = internalMatch(tokens, matchGraph, syntaxes || {});
+
+        if (matchResult.match === null) {
+            return matchResult;
+        }
+
+        var item = matchResult.match;
+        var host = matchResult.match = {
+            syntax: matchGraph.syntax || null,
+            match: []
+        };
+        var hostStack = [host];
+
+        // revert a list and start with 2nd item since 1st is a stub item
+        item = reverseList(item).prev;
+
+        // build a tree
+        while (item !== null) {
+            switch (item.type) {
+                case OPEN_SYNTAX:
+                    host.match.push(host = {
+                        syntax: item.syntax,
+                        match: []
+                    });
+                    hostStack.push(host);
+                    break;
+
+                case CLOSE_SYNTAX:
+                    hostStack.pop();
+                    host = hostStack[hostStack.length - 1];
+                    break;
+
+                default:
+                    host.match.push({
+                        syntax: item.syntax || null,
+                        token: item.token.value,
+                        node: item.token.node
+                    });
+            }
+
+            item = item.prev;
+        }
+
+        return matchResult;
+    }
+
+    var match = {
+        matchAsList: matchAsList,
+        matchAsTree: matchAsTree,
+        getTotalIterationCount: function() {
+            return totalIterationCount;
+        }
+    };
+
+    function getTrace(node) {
+        function shouldPutToTrace(syntax) {
+            if (syntax === null) {
+                return false;
+            }
+
+            return (
+                syntax.type === 'Type' ||
+                syntax.type === 'Property' ||
+                syntax.type === 'Keyword'
+            );
+        }
+
+        function hasMatch(matchNode) {
+            if (Array.isArray(matchNode.match)) {
+                // use for-loop for better perfomance
+                for (var i = 0; i < matchNode.match.length; i++) {
+                    if (hasMatch(matchNode.match[i])) {
+                        if (shouldPutToTrace(matchNode.syntax)) {
+                            result.unshift(matchNode.syntax);
+                        }
+
+                        return true;
+                    }
+                }
+            } else if (matchNode.node === node) {
+                result = shouldPutToTrace(matchNode.syntax)
+                    ? [matchNode.syntax]
+                    : [];
+
+                return true;
+            }
+
+            return false;
+        }
+
+        var result = null;
+
+        if (this.matched !== null) {
+            hasMatch(this.matched);
+        }
+
+        return result;
+    }
+
+    function testNode(match, node, fn) {
+        var trace = getTrace.call(match, node);
+
+        if (trace === null) {
+            return false;
+        }
+
+        return trace.some(fn);
+    }
+
+    function isType(node, type) {
+        return testNode(this, node, function(matchNode) {
+            return matchNode.type === 'Type' && matchNode.name === type;
+        });
+    }
+
+    function isProperty(node, property) {
+        return testNode(this, node, function(matchNode) {
+            return matchNode.type === 'Property' && matchNode.name === property;
+        });
+    }
+
+    function isKeyword(node) {
+        return testNode(this, node, function(matchNode) {
+            return matchNode.type === 'Keyword';
+        });
+    }
+
+    var trace = {
+        getTrace: getTrace,
+        isType: isType,
+        isProperty: isProperty,
+        isKeyword: isKeyword
+    };
+
+    function getFirstMatchNode(matchNode) {
+        if ('node' in matchNode) {
+            return matchNode.node;
+        }
+
+        return getFirstMatchNode(matchNode.match[0]);
+    }
+
+    function getLastMatchNode(matchNode) {
+        if ('node' in matchNode) {
+            return matchNode.node;
+        }
+
+        return getLastMatchNode(matchNode.match[matchNode.match.length - 1]);
+    }
+
+    function matchFragments(lexer, ast, match, type, name) {
+        function findFragments(matchNode) {
+            if (matchNode.syntax !== null &&
+                matchNode.syntax.type === type &&
+                matchNode.syntax.name === name) {
+                var start = getFirstMatchNode(matchNode);
+                var end = getLastMatchNode(matchNode);
+
+                lexer.syntax.walk(ast, function(node, item, list) {
+                    if (node === start) {
+                        var nodes = new List_1();
+
+                        do {
+                            nodes.appendData(item.data);
+
+                            if (item.data === end) {
+                                break;
+                            }
+
+                            item = item.next;
+                        } while (item !== null);
+
+                        fragments.push({
+                            parent: list,
+                            nodes: nodes
+                        });
+                    }
+                });
+            }
+
+            if (Array.isArray(matchNode.match)) {
+                matchNode.match.forEach(findFragments);
+            }
+        }
+
+        var fragments = [];
+
+        if (match.matched !== null) {
+            findFragments(match.matched);
+        }
+
+        return fragments;
+    }
+
+    var search = {
+        matchFragments: matchFragments
+    };
+
+    var hasOwnProperty$2 = Object.prototype.hasOwnProperty;
+
+    function isValidNumber(value) {
+        // Number.isInteger(value) && value >= 0
+        return (
+            typeof value === 'number' &&
+            isFinite(value) &&
+            Math.floor(value) === value &&
+            value >= 0
+        );
+    }
+
+    function isValidLocation(loc) {
+        return (
+            Boolean(loc) &&
+            isValidNumber(loc.offset) &&
+            isValidNumber(loc.line) &&
+            isValidNumber(loc.column)
+        );
+    }
+
+    function createNodeStructureChecker(type, fields) {
+        return function checkNode(node, warn) {
+            if (!node || node.constructor !== Object) {
+                return warn(node, 'Type of node should be an Object');
+            }
+
+            for (var key in node) {
+                var valid = true;
+
+                if (hasOwnProperty$2.call(node, key) === false) {
+                    continue;
+                }
+
+                if (key === 'type') {
+                    if (node.type !== type) {
+                        warn(node, 'Wrong node type `' + node.type + '`, expected `' + type + '`');
+                    }
+                } else if (key === 'loc') {
+                    if (node.loc === null) {
+                        continue;
+                    } else if (node.loc && node.loc.constructor === Object) {
+                        if (typeof node.loc.source !== 'string') {
+                            key += '.source';
+                        } else if (!isValidLocation(node.loc.start)) {
+                            key += '.start';
+                        } else if (!isValidLocation(node.loc.end)) {
+                            key += '.end';
+                        } else {
+                            continue;
+                        }
+                    }
+
+                    valid = false;
+                } else if (fields.hasOwnProperty(key)) {
+                    for (var i = 0, valid = false; !valid && i < fields[key].length; i++) {
+                        var fieldType = fields[key][i];
+
+                        switch (fieldType) {
+                            case String:
+                                valid = typeof node[key] === 'string';
+                                break;
+
+                            case Boolean:
+                                valid = typeof node[key] === 'boolean';
+                                break;
+
+                            case null:
+                                valid = node[key] === null;
+                                break;
+
+                            default:
+                                if (typeof fieldType === 'string') {
+                                    valid = node[key] && node[key].type === fieldType;
+                                } else if (Array.isArray(fieldType)) {
+                                    valid = node[key] instanceof List_1;
+                                }
+                        }
+                    }
+                } else {
+                    warn(node, 'Unknown field `' + key + '` for ' + type + ' node type');
+                }
+
+                if (!valid) {
+                    warn(node, 'Bad value for `' + type + '.' + key + '`');
+                }
+            }
+
+            for (var key in fields) {
+                if (hasOwnProperty$2.call(fields, key) &&
+                    hasOwnProperty$2.call(node, key) === false) {
+                    warn(node, 'Field `' + type + '.' + key + '` is missed');
+                }
+            }
+        };
+    }
+
+    function processStructure(name, nodeType) {
+        var structure = nodeType.structure;
+        var fields = {
+            type: String,
+            loc: true
+        };
+        var docs = {
+            type: '"' + name + '"'
+        };
+
+        for (var key in structure) {
+            if (hasOwnProperty$2.call(structure, key) === false) {
+                continue;
+            }
+
+            var docsTypes = [];
+            var fieldTypes = fields[key] = Array.isArray(structure[key])
+                ? structure[key].slice()
+                : [structure[key]];
+
+            for (var i = 0; i < fieldTypes.length; i++) {
+                var fieldType = fieldTypes[i];
+                if (fieldType === String || fieldType === Boolean) {
+                    docsTypes.push(fieldType.name);
+                } else if (fieldType === null) {
+                    docsTypes.push('null');
+                } else if (typeof fieldType === 'string') {
+                    docsTypes.push('<' + fieldType + '>');
+                } else if (Array.isArray(fieldType)) {
+                    docsTypes.push('List'); // TODO: use type enum
+                } else {
+                    throw new Error('Wrong value `' + fieldType + '` in `' + name + '.' + key + '` structure definition');
+                }
+            }
+
+            docs[key] = docsTypes.join(' | ');
+        }
+
+        return {
+            docs: docs,
+            check: createNodeStructureChecker(name, fields)
+        };
+    }
+
+    var structure = {
+        getStructureFromConfig: function(config) {
+            var structure = {};
+
+            if (config.node) {
+                for (var name in config.node) {
+                    if (hasOwnProperty$2.call(config.node, name)) {
+                        var nodeType = config.node[name];
+
+                        if (nodeType.structure) {
+                            structure[name] = processStructure(name, nodeType);
+                        } else {
+                            throw new Error('Missed `structure` field in `' + name + '` node type definition');
+                        }
+                    }
+                }
+            }
+
+            return structure;
+        }
+    };
+
+    var SyntaxReferenceError$1 = error.SyntaxReferenceError;
+    var SyntaxMatchError$1 = error.SyntaxMatchError;
+
+
+
+
+
+
+    var buildMatchGraph$1 = matchGraph.buildMatchGraph;
+    var matchAsTree$1 = match.matchAsTree;
+
+
+    var getStructureFromConfig = structure.getStructureFromConfig;
+    var cssWideKeywords$1 = buildMatchGraph$1('inherit | initial | unset');
+    var cssWideKeywordsWithExpression = buildMatchGraph$1('inherit | initial | unset | <-ms-legacy-expression>');
+
+    function dumpMapSyntax(map, compact, syntaxAsAst) {
+        var result = {};
+
+        for (var name in map) {
+            if (map[name].syntax) {
+                result[name] = syntaxAsAst
+                    ? map[name].syntax
+                    : generate_1(map[name].syntax, { compact: compact });
+            }
+        }
+
+        return result;
+    }
+
+    function dumpAtruleMapSyntax(map, compact, syntaxAsAst) {
+        const result = {};
+
+        for (const [name, atrule] of Object.entries(map)) {
+            result[name] = {
+                prelude: atrule.prelude && (
+                    syntaxAsAst
+                        ? atrule.prelude.syntax
+                        : generate_1(atrule.prelude.syntax, { compact })
+                ),
+                descriptors: atrule.descriptors && dumpMapSyntax(atrule.descriptors, compact, syntaxAsAst)
+            };
+        }
+
+        return result;
+    }
+
+    function valueHasVar(tokens) {
+        for (var i = 0; i < tokens.length; i++) {
+            if (tokens[i].value.toLowerCase() === 'var(') {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    function buildMatchResult(match, error, iterations) {
+        return {
+            matched: match,
+            iterations: iterations,
+            error: error,
+            getTrace: trace.getTrace,
+            isType: trace.isType,
+            isProperty: trace.isProperty,
+            isKeyword: trace.isKeyword
+        };
+    }
+
+    function matchSyntax(lexer, syntax, value, useCommon) {
+        var tokens = prepareTokens_1(value, lexer.syntax);
+        var result;
+
+        if (valueHasVar(tokens)) {
+            return buildMatchResult(null, new Error('Matching for a tree with var() is not supported'));
+        }
+
+        if (useCommon) {
+            result = matchAsTree$1(tokens, lexer.valueCommonSyntax, lexer);
+        }
+
+        if (!useCommon || !result.match) {
+            result = matchAsTree$1(tokens, syntax.match, lexer);
+            if (!result.match) {
+                return buildMatchResult(
+                    null,
+                    new SyntaxMatchError$1(result.reason, syntax.syntax, value, result),
+                    result.iterations
+                );
+            }
+        }
+
+        return buildMatchResult(result.match, null, result.iterations);
+    }
+
+    var Lexer = function(config, syntax, structure) {
+        this.valueCommonSyntax = cssWideKeywords$1;
+        this.syntax = syntax;
+        this.generic = false;
+        this.atrules = {};
+        this.properties = {};
+        this.types = {};
+        this.structure = structure || getStructureFromConfig(config);
+
+        if (config) {
+            if (config.types) {
+                for (var name in config.types) {
+                    this.addType_(name, config.types[name]);
+                }
+            }
+
+            if (config.generic) {
+                this.generic = true;
+                for (var name in generic) {
+                    this.addType_(name, generic[name]);
+                }
+            }
+
+            if (config.atrules) {
+                for (var name in config.atrules) {
+                    this.addAtrule_(name, config.atrules[name]);
+                }
+            }
+
+            if (config.properties) {
+                for (var name in config.properties) {
+                    this.addProperty_(name, config.properties[name]);
+                }
+            }
+        }
+    };
+
+    Lexer.prototype = {
+        structure: {},
+        checkStructure: function(ast) {
+            function collectWarning(node, message) {
+                warns.push({
+                    node: node,
+                    message: message
+                });
+            }
+
+            var structure = this.structure;
+            var warns = [];
+
+            this.syntax.walk(ast, function(node) {
+                if (structure.hasOwnProperty(node.type)) {
+                    structure[node.type].check(node, collectWarning);
+                } else {
+                    collectWarning(node, 'Unknown node type `' + node.type + '`');
+                }
+            });
+
+            return warns.length ? warns : false;
+        },
+
+        createDescriptor: function(syntax, type, name, parent = null) {
+            var ref = {
+                type: type,
+                name: name
+            };
+            var descriptor = {
+                type: type,
+                name: name,
+                parent: parent,
+                syntax: null,
+                match: null
+            };
+
+            if (typeof syntax === 'function') {
+                descriptor.match = buildMatchGraph$1(syntax, ref);
+            } else {
+                if (typeof syntax === 'string') {
+                    // lazy parsing on first access
+                    Object.defineProperty(descriptor, 'syntax', {
+                        get: function() {
+                            Object.defineProperty(descriptor, 'syntax', {
+                                value: parse_1(syntax)
+                            });
+
+                            return descriptor.syntax;
+                        }
+                    });
+                } else {
+                    descriptor.syntax = syntax;
+                }
+
+                // lazy graph build on first access
+                Object.defineProperty(descriptor, 'match', {
+                    get: function() {
+                        Object.defineProperty(descriptor, 'match', {
+                            value: buildMatchGraph$1(descriptor.syntax, ref)
+                        });
+
+                        return descriptor.match;
+                    }
+                });
+            }
+
+            return descriptor;
+        },
+        addAtrule_: function(name, syntax) {
+            if (!syntax) {
+                return;
+            }
+
+            this.atrules[name] = {
+                type: 'Atrule',
+                name: name,
+                prelude: syntax.prelude ? this.createDescriptor(syntax.prelude, 'AtrulePrelude', name) : null,
+                descriptors: syntax.descriptors
+                    ? Object.keys(syntax.descriptors).reduce((res, descName) => {
+                        res[descName] = this.createDescriptor(syntax.descriptors[descName], 'AtruleDescriptor', descName, name);
+                        return res;
+                    }, {})
+                    : null
+            };
+        },
+        addProperty_: function(name, syntax) {
+            if (!syntax) {
+                return;
+            }
+
+            this.properties[name] = this.createDescriptor(syntax, 'Property', name);
+        },
+        addType_: function(name, syntax) {
+            if (!syntax) {
+                return;
+            }
+
+            this.types[name] = this.createDescriptor(syntax, 'Type', name);
+
+            if (syntax === generic['-ms-legacy-expression']) {
+                this.valueCommonSyntax = cssWideKeywordsWithExpression;
+            }
+        },
+
+        checkAtruleName: function(atruleName) {
+            if (!this.getAtrule(atruleName)) {
+                return new SyntaxReferenceError$1('Unknown at-rule', '@' + atruleName);
+            }
+        },
+        checkAtrulePrelude: function(atruleName, prelude) {
+            let error = this.checkAtruleName(atruleName);
+
+            if (error) {
+                return error;
+            }
+
+            var atrule = this.getAtrule(atruleName);
+
+            if (!atrule.prelude && prelude) {
+                return new SyntaxError('At-rule `@' + atruleName + '` should not contain a prelude');
+            }
+
+            if (atrule.prelude && !prelude) {
+                return new SyntaxError('At-rule `@' + atruleName + '` should contain a prelude');
+            }
+        },
+        checkAtruleDescriptorName: function(atruleName, descriptorName) {
+            let error = this.checkAtruleName(atruleName);
+
+            if (error) {
+                return error;
+            }
+
+            var atrule = this.getAtrule(atruleName);
+            var descriptor = names.keyword(descriptorName);
+
+            if (!atrule.descriptors) {
+                return new SyntaxError('At-rule `@' + atruleName + '` has no known descriptors');
+            }
+
+            if (!atrule.descriptors[descriptor.name] &&
+                !atrule.descriptors[descriptor.basename]) {
+                return new SyntaxReferenceError$1('Unknown at-rule descriptor', descriptorName);
+            }
+        },
+        checkPropertyName: function(propertyName) {
+            var property = names.property(propertyName);
+
+            // don't match syntax for a custom property
+            if (property.custom) {
+                return new Error('Lexer matching doesn\'t applicable for custom properties');
+            }
+
+            if (!this.getProperty(propertyName)) {
+                return new SyntaxReferenceError$1('Unknown property', propertyName);
+            }
+        },
+
+        matchAtrulePrelude: function(atruleName, prelude) {
+            var error = this.checkAtrulePrelude(atruleName, prelude);
+
+            if (error) {
+                return buildMatchResult(null, error);
+            }
+
+            if (!prelude) {
+                return buildMatchResult(null, null);
+            }
+
+            return matchSyntax(this, this.getAtrule(atruleName).prelude, prelude, false);
+        },
+        matchAtruleDescriptor: function(atruleName, descriptorName, value) {
+            var error = this.checkAtruleDescriptorName(atruleName, descriptorName);
+
+            if (error) {
+                return buildMatchResult(null, error);
+            }
+
+            var atrule = this.getAtrule(atruleName);
+            var descriptor = names.keyword(descriptorName);
+
+            return matchSyntax(this, atrule.descriptors[descriptor.name] || atrule.descriptors[descriptor.basename], value, false);
+        },
+        matchDeclaration: function(node) {
+            if (node.type !== 'Declaration') {
+                return buildMatchResult(null, new Error('Not a Declaration node'));
+            }
+
+            return this.matchProperty(node.property, node.value);
+        },
+        matchProperty: function(propertyName, value) {
+            var error = this.checkPropertyName(propertyName);
+
+            if (error) {
+                return buildMatchResult(null, error);
+            }
+
+            return matchSyntax(this, this.getProperty(propertyName), value, true);
+        },
+        matchType: function(typeName, value) {
+            var typeSyntax = this.getType(typeName);
+
+            if (!typeSyntax) {
+                return buildMatchResult(null, new SyntaxReferenceError$1('Unknown type', typeName));
+            }
+
+            return matchSyntax(this, typeSyntax, value, false);
+        },
+        match: function(syntax, value) {
+            if (typeof syntax !== 'string' && (!syntax || !syntax.type)) {
+                return buildMatchResult(null, new SyntaxReferenceError$1('Bad syntax'));
+            }
+
+            if (typeof syntax === 'string' || !syntax.match) {
+                syntax = this.createDescriptor(syntax, 'Type', 'anonymous');
+            }
+
+            return matchSyntax(this, syntax, value, false);
+        },
+
+        findValueFragments: function(propertyName, value, type, name) {
+            return search.matchFragments(this, value, this.matchProperty(propertyName, value), type, name);
+        },
+        findDeclarationValueFragments: function(declaration, type, name) {
+            return search.matchFragments(this, declaration.value, this.matchDeclaration(declaration), type, name);
+        },
+        findAllFragments: function(ast, type, name) {
+            var result = [];
+
+            this.syntax.walk(ast, {
+                visit: 'Declaration',
+                enter: function(declaration) {
+                    result.push.apply(result, this.findDeclarationValueFragments(declaration, type, name));
+                }.bind(this)
+            });
+
+            return result;
+        },
+
+        getAtrule: function(atruleName, fallbackBasename = true) {
+            var atrule = names.keyword(atruleName);
+            var atruleEntry = atrule.vendor && fallbackBasename
+                ? this.atrules[atrule.name] || this.atrules[atrule.basename]
+                : this.atrules[atrule.name];
+
+            return atruleEntry || null;
+        },
+        getAtrulePrelude: function(atruleName, fallbackBasename = true) {
+            const atrule = this.getAtrule(atruleName, fallbackBasename);
+
+            return atrule && atrule.prelude || null;
+        },
+        getAtruleDescriptor: function(atruleName, name) {
+            return this.atrules.hasOwnProperty(atruleName) && this.atrules.declarators
+                ? this.atrules[atruleName].declarators[name] || null
+                : null;
+        },
+        getProperty: function(propertyName, fallbackBasename = true) {
+            var property = names.property(propertyName);
+            var propertyEntry = property.vendor && fallbackBasename
+                ? this.properties[property.name] || this.properties[property.basename]
+                : this.properties[property.name];
+
+            return propertyEntry || null;
+        },
+        getType: function(name) {
+            return this.types.hasOwnProperty(name) ? this.types[name] : null;
+        },
+
+        validate: function() {
+            function validate(syntax, name, broken, descriptor) {
+                if (broken.hasOwnProperty(name)) {
+                    return broken[name];
+                }
+
+                broken[name] = false;
+                if (descriptor.syntax !== null) {
+                    walk(descriptor.syntax, function(node) {
+                        if (node.type !== 'Type' && node.type !== 'Property') {
+                            return;
+                        }
+
+                        var map = node.type === 'Type' ? syntax.types : syntax.properties;
+                        var brokenMap = node.type === 'Type' ? brokenTypes : brokenProperties;
+
+                        if (!map.hasOwnProperty(node.name) || validate(syntax, node.name, brokenMap, map[node.name])) {
+                            broken[name] = true;
+                        }
+                    }, this);
+                }
+            }
+
+            var brokenTypes = {};
+            var brokenProperties = {};
+
+            for (var key in this.types) {
+                validate(this, key, brokenTypes, this.types[key]);
+            }
+
+            for (var key in this.properties) {
+                validate(this, key, brokenProperties, this.properties[key]);
+            }
+
+            brokenTypes = Object.keys(brokenTypes).filter(function(name) {
+                return brokenTypes[name];
+            });
+            brokenProperties = Object.keys(brokenProperties).filter(function(name) {
+                return brokenProperties[name];
+            });
+
+            if (brokenTypes.length || brokenProperties.length) {
+                return {
+                    types: brokenTypes,
+                    properties: brokenProperties
+                };
+            }
+
+            return null;
+        },
+        dump: function(syntaxAsAst, pretty) {
+            return {
+                generic: this.generic,
+                types: dumpMapSyntax(this.types, !pretty, syntaxAsAst),
+                properties: dumpMapSyntax(this.properties, !pretty, syntaxAsAst),
+                atrules: dumpAtruleMapSyntax(this.atrules, !pretty, syntaxAsAst)
+            };
+        },
+        toString: function() {
+            return JSON.stringify(this.dump());
+        }
+    };
+
+    var Lexer_1 = Lexer;
+
+    var definitionSyntax = {
+        SyntaxError: _SyntaxError$1,
+        parse: parse_1,
+        generate: generate_1,
+        walk: walk
+    };
+
+    var isBOM$2 = tokenizer.isBOM;
+
+    var N$3 = 10;
+    var F$2 = 12;
+    var R$2 = 13;
+
+    function computeLinesAndColumns(host, source) {
+        var sourceLength = source.length;
+        var lines = adoptBuffer(host.lines, sourceLength); // +1
+        var line = host.startLine;
+        var columns = adoptBuffer(host.columns, sourceLength);
+        var column = host.startColumn;
+        var startOffset = source.length > 0 ? isBOM$2(source.charCodeAt(0)) : 0;
+
+        for (var i = startOffset; i < sourceLength; i++) { // -1
+            var code = source.charCodeAt(i);
+
+            lines[i] = line;
+            columns[i] = column++;
+
+            if (code === N$3 || code === R$2 || code === F$2) {
+                if (code === R$2 && i + 1 < sourceLength && source.charCodeAt(i + 1) === N$3) {
+                    i++;
+                    lines[i] = line;
+                    columns[i] = column;
+                }
+
+                line++;
+                column = 1;
+            }
+        }
+
+        lines[i] = line;
+        columns[i] = column;
+
+        host.lines = lines;
+        host.columns = columns;
+    }
+
+    var OffsetToLocation = function() {
+        this.lines = null;
+        this.columns = null;
+        this.linesAndColumnsComputed = false;
+    };
+
+    OffsetToLocation.prototype = {
+        setSource: function(source, startOffset, startLine, startColumn) {
+            this.source = source;
+            this.startOffset = typeof startOffset === 'undefined' ? 0 : startOffset;
+            this.startLine = typeof startLine === 'undefined' ? 1 : startLine;
+            this.startColumn = typeof startColumn === 'undefined' ? 1 : startColumn;
+            this.linesAndColumnsComputed = false;
+        },
+
+        ensureLinesAndColumnsComputed: function() {
+            if (!this.linesAndColumnsComputed) {
+                computeLinesAndColumns(this, this.source);
+                this.linesAndColumnsComputed = true;
+            }
+        },
+        getLocation: function(offset, filename) {
+            this.ensureLinesAndColumnsComputed();
+
+            return {
+                source: filename,
+                offset: this.startOffset + offset,
+                line: this.lines[offset],
+                column: this.columns[offset]
+            };
+        },
+        getLocationRange: function(start, end, filename) {
+            this.ensureLinesAndColumnsComputed();
+
+            return {
+                source: filename,
+                start: {
+                    offset: this.startOffset + start,
+                    line: this.lines[start],
+                    column: this.columns[start]
+                },
+                end: {
+                    offset: this.startOffset + end,
+                    line: this.lines[end],
+                    column: this.columns[end]
+                }
+            };
+        }
+    };
+
+    var OffsetToLocation_1 = OffsetToLocation;
+
+    var TYPE$7 = tokenizer.TYPE;
+    var WHITESPACE$2 = TYPE$7.WhiteSpace;
+    var COMMENT$2 = TYPE$7.Comment;
+
+    var sequence = function readSequence(recognizer) {
+        var children = this.createList();
+        var child = null;
+        var context = {
+            recognizer: recognizer,
+            space: null,
+            ignoreWS: false,
+            ignoreWSAfter: false
+        };
+
+        this.scanner.skipSC();
+
+        while (!this.scanner.eof) {
+            switch (this.scanner.tokenType) {
+                case COMMENT$2:
+                    this.scanner.next();
+                    continue;
+
+                case WHITESPACE$2:
+                    if (context.ignoreWS) {
+                        this.scanner.next();
+                    } else {
+                        context.space = this.WhiteSpace();
+                    }
+                    continue;
+            }
+
+            child = recognizer.getNode.call(this, context);
+
+            if (child === undefined) {
+                break;
+            }
+
+            if (context.space !== null) {
+                children.push(context.space);
+                context.space = null;
+            }
+
+            children.push(child);
+
+            if (context.ignoreWSAfter) {
+                context.ignoreWSAfter = false;
+                context.ignoreWS = true;
+            } else {
+                context.ignoreWS = false;
+            }
+        }
+
+        return children;
+    };
+
+    var { findWhiteSpaceStart: findWhiteSpaceStart$1, cmpStr: cmpStr$4 } = utils;
+
+    var noop$2 = function() {};
+
+    var TYPE$8 = _const.TYPE;
+    var NAME$2 = _const.NAME;
+    var WHITESPACE$3 = TYPE$8.WhiteSpace;
+    var COMMENT$3 = TYPE$8.Comment;
+    var IDENT$2 = TYPE$8.Ident;
+    var FUNCTION = TYPE$8.Function;
+    var URL = TYPE$8.Url;
+    var HASH = TYPE$8.Hash;
+    var PERCENTAGE = TYPE$8.Percentage;
+    var NUMBER$2 = TYPE$8.Number;
+    var NUMBERSIGN$1 = 0x0023; // U+0023 NUMBER SIGN (#)
+    var NULL = 0;
+
+    function createParseContext(name) {
+        return function() {
+            return this[name]();
+        };
+    }
+
+    function processConfig(config) {
+        var parserConfig = {
+            context: {},
+            scope: {},
+            atrule: {},
+            pseudo: {}
+        };
+
+        if (config.parseContext) {
+            for (var name in config.parseContext) {
+                switch (typeof config.parseContext[name]) {
+                    case 'function':
+                        parserConfig.context[name] = config.parseContext[name];
+                        break;
+
+                    case 'string':
+                        parserConfig.context[name] = createParseContext(config.parseContext[name]);
+                        break;
+                }
+            }
+        }
+
+        if (config.scope) {
+            for (var name in config.scope) {
+                parserConfig.scope[name] = config.scope[name];
+            }
+        }
+
+        if (config.atrule) {
+            for (var name in config.atrule) {
+                var atrule = config.atrule[name];
+
+                if (atrule.parse) {
+                    parserConfig.atrule[name] = atrule.parse;
+                }
+            }
+        }
+
+        if (config.pseudo) {
+            for (var name in config.pseudo) {
+                var pseudo = config.pseudo[name];
+
+                if (pseudo.parse) {
+                    parserConfig.pseudo[name] = pseudo.parse;
+                }
+            }
+        }
+
+        if (config.node) {
+            for (var name in config.node) {
+                parserConfig[name] = config.node[name].parse;
+            }
+        }
+
+        return parserConfig;
+    }
+
+    var create = function createParser(config) {
+        var parser = {
+            scanner: new TokenStream_1(),
+            locationMap: new OffsetToLocation_1(),
+
+            filename: '<unknown>',
+            needPositions: false,
+            onParseError: noop$2,
+            onParseErrorThrow: false,
+            parseAtrulePrelude: true,
+            parseRulePrelude: true,
+            parseValue: true,
+            parseCustomProperty: false,
+
+            readSequence: sequence,
+
+            createList: function() {
+                return new List_1();
+            },
+            createSingleNodeList: function(node) {
+                return new List_1().appendData(node);
+            },
+            getFirstListNode: function(list) {
+                return list && list.first();
+            },
+            getLastListNode: function(list) {
+                return list.last();
+            },
+
+            parseWithFallback: function(consumer, fallback) {
+                var startToken = this.scanner.tokenIndex;
+
+                try {
+                    return consumer.call(this);
+                } catch (e) {
+                    if (this.onParseErrorThrow) {
+                        throw e;
+                    }
+
+                    var fallbackNode = fallback.call(this, startToken);
+
+                    this.onParseErrorThrow = true;
+                    this.onParseError(e, fallbackNode);
+                    this.onParseErrorThrow = false;
+
+                    return fallbackNode;
+                }
+            },
+
+            lookupNonWSType: function(offset) {
+                do {
+                    var type = this.scanner.lookupType(offset++);
+                    if (type !== WHITESPACE$3) {
+                        return type;
+                    }
+                } while (type !== NULL);
+
+                return NULL;
+            },
+
+            eat: function(tokenType) {
+                if (this.scanner.tokenType !== tokenType) {
+                    var offset = this.scanner.tokenStart;
+                    var message = NAME$2[tokenType] + ' is expected';
+
+                    // tweak message and offset
+                    switch (tokenType) {
+                        case IDENT$2:
+                            // when identifier is expected but there is a function or url
+                            if (this.scanner.tokenType === FUNCTION || this.scanner.tokenType === URL) {
+                                offset = this.scanner.tokenEnd - 1;
+                                message = 'Identifier is expected but function found';
+                            } else {
+                                message = 'Identifier is expected';
+                            }
+                            break;
+
+                        case HASH:
+                            if (this.scanner.isDelim(NUMBERSIGN$1)) {
+                                this.scanner.next();
+                                offset++;
+                                message = 'Name is expected';
+                            }
+                            break;
+
+                        case PERCENTAGE:
+                            if (this.scanner.tokenType === NUMBER$2) {
+                                offset = this.scanner.tokenEnd;
+                                message = 'Percent sign is expected';
+                            }
+                            break;
+
+                        default:
+                            // when test type is part of another token show error for current position + 1
+                            // e.g. eat(HYPHENMINUS) will fail on "-foo", but pointing on "-" is odd
+                            if (this.scanner.source.charCodeAt(this.scanner.tokenStart) === tokenType) {
+                                offset = offset + 1;
+                            }
+                    }
+
+                    this.error(message, offset);
+                }
+
+                this.scanner.next();
+            },
+
+            consume: function(tokenType) {
+                var value = this.scanner.getTokenValue();
+
+                this.eat(tokenType);
+
+                return value;
+            },
+            consumeFunctionName: function() {
+                var name = this.scanner.source.substring(this.scanner.tokenStart, this.scanner.tokenEnd - 1);
+
+                this.eat(FUNCTION);
+
+                return name;
+            },
+
+            getLocation: function(start, end) {
+                if (this.needPositions) {
+                    return this.locationMap.getLocationRange(
+                        start,
+                        end,
+                        this.filename
+                    );
+                }
+
+                return null;
+            },
+            getLocationFromList: function(list) {
+                if (this.needPositions) {
+                    var head = this.getFirstListNode(list);
+                    var tail = this.getLastListNode(list);
+                    return this.locationMap.getLocationRange(
+                        head !== null ? head.loc.start.offset - this.locationMap.startOffset : this.scanner.tokenStart,
+                        tail !== null ? tail.loc.end.offset - this.locationMap.startOffset : this.scanner.tokenStart,
+                        this.filename
+                    );
+                }
+
+                return null;
+            },
+
+            error: function(message, offset) {
+                var location = typeof offset !== 'undefined' && offset < this.scanner.source.length
+                    ? this.locationMap.getLocation(offset)
+                    : this.scanner.eof
+                        ? this.locationMap.getLocation(findWhiteSpaceStart$1(this.scanner.source, this.scanner.source.length - 1))
+                        : this.locationMap.getLocation(this.scanner.tokenStart);
+
+                throw new _SyntaxError(
+                    message || 'Unexpected input',
+                    this.scanner.source,
+                    location.offset,
+                    location.line,
+                    location.column
+                );
+            }
+        };
+
+        config = processConfig(config || {});
+        for (var key in config) {
+            parser[key] = config[key];
+        }
+
+        return function(source, options) {
+            options = options || {};
+
+            var context = options.context || 'default';
+            var onComment = options.onComment;
+            var ast;
+
+            tokenizer(source, parser.scanner);
+            parser.locationMap.setSource(
+                source,
+                options.offset,
+                options.line,
+                options.column
+            );
+
+            parser.filename = options.filename || '<unknown>';
+            parser.needPositions = Boolean(options.positions);
+            parser.onParseError = typeof options.onParseError === 'function' ? options.onParseError : noop$2;
+            parser.onParseErrorThrow = false;
+            parser.parseAtrulePrelude = 'parseAtrulePrelude' in options ? Boolean(options.parseAtrulePrelude) : true;
+            parser.parseRulePrelude = 'parseRulePrelude' in options ? Boolean(options.parseRulePrelude) : true;
+            parser.parseValue = 'parseValue' in options ? Boolean(options.parseValue) : true;
+            parser.parseCustomProperty = 'parseCustomProperty' in options ? Boolean(options.parseCustomProperty) : false;
+
+            if (!parser.context.hasOwnProperty(context)) {
+                throw new Error('Unknown context `' + context + '`');
+            }
+
+            if (typeof onComment === 'function') {
+                parser.scanner.forEachToken((type, start, end) => {
+                    if (type === COMMENT$3) {
+                        const loc = parser.getLocation(start, end);
+                        const value = cmpStr$4(source, end - 2, end, '*/')
+                            ? source.slice(start + 2, end - 2)
+                            : source.slice(start + 2, end);
+
+                        onComment(value, loc);
+                    }
+                });
+            }
+
+            ast = parser.context[context].call(parser, options);
+
+            if (!parser.scanner.eof) {
+                parser.error();
+            }
+
+            return ast;
+        };
+    };
+
+    /* -*- Mode: js; js-indent-level: 2; -*- */
+    /*
+     * Copyright 2011 Mozilla Foundation and contributors
+     * Licensed under the New BSD license. See LICENSE or:
+     * http://opensource.org/licenses/BSD-3-Clause
+     */
+
+    var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
+
+    /**
+     * Encode an integer in the range of 0 to 63 to a single base 64 digit.
+     */
+    var encode = function (number) {
+      if (0 <= number && number < intToCharMap.length) {
+        return intToCharMap[number];
+      }
+      throw new TypeError("Must be between 0 and 63: " + number);
+    };
+
+    /**
+     * Decode a single base 64 character code digit to an integer. Returns -1 on
+     * failure.
+     */
+    var decode = function (charCode) {
+      var bigA = 65;     // 'A'
+      var bigZ = 90;     // 'Z'
+
+      var littleA = 97;  // 'a'
+      var littleZ = 122; // 'z'
+
+      var zero = 48;     // '0'
+      var nine = 57;     // '9'
+
+      var plus = 43;     // '+'
+      var slash = 47;    // '/'
+
+      var littleOffset = 26;
+      var numberOffset = 52;
+
+      // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+      if (bigA <= charCode && charCode <= bigZ) {
+        return (charCode - bigA);
+      }
+
+      // 26 - 51: abcdefghijklmnopqrstuvwxyz
+      if (littleA <= charCode && charCode <= littleZ) {
+        return (charCode - littleA + littleOffset);
+      }
+
+      // 52 - 61: 0123456789
+      if (zero <= charCode && charCode <= nine) {
+        return (charCode - zero + numberOffset);
+      }
+
+      // 62: +
+      if (charCode == plus) {
+        return 62;
+      }
+
+      // 63: /
+      if (charCode == slash) {
+        return 63;
+      }
+
+      // Invalid base64 digit.
+      return -1;
+    };
+
+    var base64 = {
+    	encode: encode,
+    	decode: decode
+    };
+
+    /* -*- Mode: js; js-indent-level: 2; -*- */
+    /*
+     * Copyright 2011 Mozilla Foundation and contributors
+     * Licensed under the New BSD license. See LICENSE or:
+     * http://opensource.org/licenses/BSD-3-Clause
+     *
+     * Based on the Base 64 VLQ implementation in Closure Compiler:
+     * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
+     *
+     * Copyright 2011 The Closure Compiler Authors. All rights reserved.
+     * Redistribution and use in source and binary forms, with or without
+     * modification, are permitted provided that the following conditions are
+     * met:
+     *
+     *  * Redistributions of source code must retain the above copyright
+     *    notice, this list of conditions and the following disclaimer.
+     *  * Redistributions in binary form must reproduce the above
+     *    copyright notice, this list of conditions and the following
+     *    disclaimer in the documentation and/or other materials provided
+     *    with the distribution.
+     *  * Neither the name of Google Inc. nor the names of its
+     *    contributors may be used to endorse or promote products derived
+     *    from this software without specific prior written permission.
+     *
+     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+     * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+     * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+     * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+     * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+     * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+     * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+     * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+     */
+
+
+
+    // A single base 64 digit can contain 6 bits of data. For the base 64 variable
+    // length quantities we use in the source map spec, the first bit is the sign,
+    // the next four bits are the actual value, and the 6th bit is the
+    // continuation bit. The continuation bit tells us whether there are more
+    // digits in this value following this digit.
+    //
+    //   Continuation
+    //   |    Sign
+    //   |    |
+    //   V    V
+    //   101011
+
+    var VLQ_BASE_SHIFT = 5;
+
+    // binary: 100000
+    var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
+
+    // binary: 011111
+    var VLQ_BASE_MASK = VLQ_BASE - 1;
+
+    // binary: 100000
+    var VLQ_CONTINUATION_BIT = VLQ_BASE;
+
+    /**
+     * Converts from a two-complement value to a value where the sign bit is
+     * placed in the least significant bit.  For example, as decimals:
+     *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
+     *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
+     */
+    function toVLQSigned(aValue) {
+      return aValue < 0
+        ? ((-aValue) << 1) + 1
+        : (aValue << 1) + 0;
+    }
+
+    /**
+     * Converts to a two-complement value from a value where the sign bit is
+     * placed in the least significant bit.  For example, as decimals:
+     *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1
+     *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2
+     */
+    function fromVLQSigned(aValue) {
+      var isNegative = (aValue & 1) === 1;
+      var shifted = aValue >> 1;
+      return isNegative
+        ? -shifted
+        : shifted;
+    }
+
+    /**
+     * Returns the base 64 VLQ encoded value.
+     */
+    var encode$1 = function base64VLQ_encode(aValue) {
+      var encoded = "";
+      var digit;
+
+      var vlq = toVLQSigned(aValue);
+
+      do {
+        digit = vlq & VLQ_BASE_MASK;
+        vlq >>>= VLQ_BASE_SHIFT;
+        if (vlq > 0) {
+          // There are still more digits in this value, so we must make sure the
+          // continuation bit is marked.
+          digit |= VLQ_CONTINUATION_BIT;
+        }
+        encoded += base64.encode(digit);
+      } while (vlq > 0);
+
+      return encoded;
+    };
+
+    /**
+     * Decodes the next base 64 VLQ value from the given string and returns the
+     * value and the rest of the string via the out parameter.
+     */
+    var decode$1 = function base64VLQ_decode(aStr, aIndex, aOutParam) {
+      var strLen = aStr.length;
+      var result = 0;
+      var shift = 0;
+      var continuation, digit;
+
+      do {
+        if (aIndex >= strLen) {
+          throw new Error("Expected more digits in base 64 VLQ value.");
+        }
+
+        digit = base64.decode(aStr.charCodeAt(aIndex++));
+        if (digit === -1) {
+          throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
+        }
+
+        continuation = !!(digit & VLQ_CONTINUATION_BIT);
+        digit &= VLQ_BASE_MASK;
+        result = result + (digit << shift);
+        shift += VLQ_BASE_SHIFT;
+      } while (continuation);
+
+      aOutParam.value = fromVLQSigned(result);
+      aOutParam.rest = aIndex;
+    };
+
+    var base64Vlq = {
+    	encode: encode$1,
+    	decode: decode$1
+    };
+
+    function createCommonjsModule(fn, module) {
+    	return module = { exports: {} }, fn(module, module.exports), module.exports;
+    }
+
+    function getCjsExportFromNamespace (n) {
+    	return n && n['default'] || n;
+    }
+
+    var util = createCommonjsModule(function (module, exports) {
+    /* -*- Mode: js; js-indent-level: 2; -*- */
+    /*
+     * Copyright 2011 Mozilla Foundation and contributors
+     * Licensed under the New BSD license. See LICENSE or:
+     * http://opensource.org/licenses/BSD-3-Clause
+     */
+
+    /**
+     * This is a helper function for getting values from parameter/options
+     * objects.
+     *
+     * @param args The object we are extracting values from
+     * @param name The name of the property we are getting.
+     * @param defaultValue An optional value to return if the property is missing
+     * from the object. If this is not specified and the property is missing, an
+     * error will be thrown.
+     */
+    function getArg(aArgs, aName, aDefaultValue) {
+      if (aName in aArgs) {
+        return aArgs[aName];
+      } else if (arguments.length === 3) {
+        return aDefaultValue;
+      } else {
+        throw new Error('"' + aName + '" is a required argument.');
+      }
+    }
+    exports.getArg = getArg;
+
+    var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
+    var dataUrlRegexp = /^data:.+\,.+$/;
+
+    function urlParse(aUrl) {
+      var match = aUrl.match(urlRegexp);
+      if (!match) {
+        return null;
+      }
+      return {
+        scheme: match[1],
+        auth: match[2],
+        host: match[3],
+        port: match[4],
+        path: match[5]
+      };
+    }
+    exports.urlParse = urlParse;
+
+    function urlGenerate(aParsedUrl) {
+      var url = '';
+      if (aParsedUrl.scheme) {
+        url += aParsedUrl.scheme + ':';
+      }
+      url += '//';
+      if (aParsedUrl.auth) {
+        url += aParsedUrl.auth + '@';
+      }
+      if (aParsedUrl.host) {
+        url += aParsedUrl.host;
+      }
+      if (aParsedUrl.port) {
+        url += ":" + aParsedUrl.port;
+      }
+      if (aParsedUrl.path) {
+        url += aParsedUrl.path;
+      }
+      return url;
+    }
+    exports.urlGenerate = urlGenerate;
+
+    /**
+     * Normalizes a path, or the path portion of a URL:
+     *
+     * - Replaces consecutive slashes with one slash.
+     * - Removes unnecessary '.' parts.
+     * - Removes unnecessary '<dir>/..' parts.
+     *
+     * Based on code in the Node.js 'path' core module.
+     *
+     * @param aPath The path or url to normalize.
+     */
+    function normalize(aPath) {
+      var path = aPath;
+      var url = urlParse(aPath);
+      if (url) {
+        if (!url.path) {
+          return aPath;
+        }
+        path = url.path;
+      }
+      var isAbsolute = exports.isAbsolute(path);
+
+      var parts = path.split(/\/+/);
+      for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
+        part = parts[i];
+        if (part === '.') {
+          parts.splice(i, 1);
+        } else if (part === '..') {
+          up++;
+        } else if (up > 0) {
+          if (part === '') {
+            // The first part is blank if the path is absolute. Trying to go
+            // above the root is a no-op. Therefore we can remove all '..' parts
+            // directly after the root.
+            parts.splice(i + 1, up);
+            up = 0;
+          } else {
+            parts.splice(i, 2);
+            up--;
+          }
+        }
+      }
+      path = parts.join('/');
+
+      if (path === '') {
+        path = isAbsolute ? '/' : '.';
+      }
+
+      if (url) {
+        url.path = path;
+        return urlGenerate(url);
+      }
+      return path;
+    }
+    exports.normalize = normalize;
+
+    /**
+     * Joins two paths/URLs.
+     *
+     * @param aRoot The root path or URL.
+     * @param aPath The path or URL to be joined with the root.
+     *
+     * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
+     *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended
+     *   first.
+     * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
+     *   is updated with the result and aRoot is returned. Otherwise the result
+     *   is returned.
+     *   - If aPath is absolute, the result is aPath.
+     *   - Otherwise the two paths are joined with a slash.
+     * - Joining for example 'http://' and 'www.example.com' is also supported.
+     */
+    function join(aRoot, aPath) {
+      if (aRoot === "") {
+        aRoot = ".";
+      }
+      if (aPath === "") {
+        aPath = ".";
+      }
+      var aPathUrl = urlParse(aPath);
+      var aRootUrl = urlParse(aRoot);
+      if (aRootUrl) {
+        aRoot = aRootUrl.path || '/';
+      }
+
+      // `join(foo, '//www.example.org')`
+      if (aPathUrl && !aPathUrl.scheme) {
+        if (aRootUrl) {
+          aPathUrl.scheme = aRootUrl.scheme;
+        }
+        return urlGenerate(aPathUrl);
+      }
+
+      if (aPathUrl || aPath.match(dataUrlRegexp)) {
+        return aPath;
+      }
+
+      // `join('http://', 'www.example.com')`
+      if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
+        aRootUrl.host = aPath;
+        return urlGenerate(aRootUrl);
+      }
+
+      var joined = aPath.charAt(0) === '/'
+        ? aPath
+        : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);
+
+      if (aRootUrl) {
+        aRootUrl.path = joined;
+        return urlGenerate(aRootUrl);
+      }
+      return joined;
+    }
+    exports.join = join;
+
+    exports.isAbsolute = function (aPath) {
+      return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
+    };
+
+    /**
+     * Make a path relative to a URL or another path.
+     *
+     * @param aRoot The root path or URL.
+     * @param aPath The path or URL to be made relative to aRoot.
+     */
+    function relative(aRoot, aPath) {
+      if (aRoot === "") {
+        aRoot = ".";
+      }
+
+      aRoot = aRoot.replace(/\/$/, '');
+
+      // It is possible for the path to be above the root. In this case, simply
+      // checking whether the root is a prefix of the path won't work. Instead, we
+      // need to remove components from the root one by one, until either we find
+      // a prefix that fits, or we run out of components to remove.
+      var level = 0;
+      while (aPath.indexOf(aRoot + '/') !== 0) {
+        var index = aRoot.lastIndexOf("/");
+        if (index < 0) {
+          return aPath;
+        }
+
+        // If the only part of the root that is left is the scheme (i.e. http://,
+        // file:///, etc.), one or more slashes (/), or simply nothing at all, we
+        // have exhausted all components, so the path is not relative to the root.
+        aRoot = aRoot.slice(0, index);
+        if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
+          return aPath;
+        }
+
+        ++level;
+      }
+
+      // Make sure we add a "../" for each component we removed from the root.
+      return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
+    }
+    exports.relative = relative;
+
+    var supportsNullProto = (function () {
+      var obj = Object.create(null);
+      return !('__proto__' in obj);
+    }());
+
+    function identity (s) {
+      return s;
+    }
+
+    /**
+     * Because behavior goes wacky when you set `__proto__` on objects, we
+     * have to prefix all the strings in our set with an arbitrary character.
+     *
+     * See https://github.com/mozilla/source-map/pull/31 and
+     * https://github.com/mozilla/source-map/issues/30
+     *
+     * @param String aStr
+     */
+    function toSetString(aStr) {
+      if (isProtoString(aStr)) {
+        return '$' + aStr;
+      }
+
+      return aStr;
+    }
+    exports.toSetString = supportsNullProto ? identity : toSetString;
+
+    function fromSetString(aStr) {
+      if (isProtoString(aStr)) {
+        return aStr.slice(1);
+      }
+
+      return aStr;
+    }
+    exports.fromSetString = supportsNullProto ? identity : fromSetString;
+
+    function isProtoString(s) {
+      if (!s) {
+        return false;
+      }
+
+      var length = s.length;
+
+      if (length < 9 /* "__proto__".length */) {
+        return false;
+      }
+
+      if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||
+          s.charCodeAt(length - 2) !== 95  /* '_' */ ||
+          s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
+          s.charCodeAt(length - 4) !== 116 /* 't' */ ||
+          s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
+          s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
+          s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
+          s.charCodeAt(length - 8) !== 95  /* '_' */ ||
+          s.charCodeAt(length - 9) !== 95  /* '_' */) {
+        return false;
+      }
+
+      for (var i = length - 10; i >= 0; i--) {
+        if (s.charCodeAt(i) !== 36 /* '$' */) {
+          return false;
+        }
+      }
+
+      return true;
+    }
+
+    /**
+     * Comparator between two mappings where the original positions are compared.
+     *
+     * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+     * mappings with the same original source/line/column, but different generated
+     * line and column the same. Useful when searching for a mapping with a
+     * stubbed out mapping.
+     */
+    function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
+      var cmp = strcmp(mappingA.source, mappingB.source);
+      if (cmp !== 0) {
+        return cmp;
+      }
+
+      cmp = mappingA.originalLine - mappingB.originalLine;
+      if (cmp !== 0) {
+        return cmp;
+      }
+
+      cmp = mappingA.originalColumn - mappingB.originalColumn;
+      if (cmp !== 0 || onlyCompareOriginal) {
+        return cmp;
+      }
+
+      cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+      if (cmp !== 0) {
+        return cmp;
+      }
+
+      cmp = mappingA.generatedLine - mappingB.generatedLine;
+      if (cmp !== 0) {
+        return cmp;
+      }
+
+      return strcmp(mappingA.name, mappingB.name);
+    }
+    exports.compareByOriginalPositions = compareByOriginalPositions;
+
+    /**
+     * Comparator between two mappings with deflated source and name indices where
+     * the generated positions are compared.
+     *
+     * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+     * mappings with the same generated line and column, but different
+     * source/name/original line and column the same. Useful when searching for a
+     * mapping with a stubbed out mapping.
+     */
+    function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
+      var cmp = mappingA.generatedLine - mappingB.generatedLine;
+      if (cmp !== 0) {
+        return cmp;
+      }
+
+      cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+      if (cmp !== 0 || onlyCompareGenerated) {
+        return cmp;
+      }
+
+      cmp = strcmp(mappingA.source, mappingB.source);
+      if (cmp !== 0) {
+        return cmp;
+      }
+
+      cmp = mappingA.originalLine - mappingB.originalLine;
+      if (cmp !== 0) {
+        return cmp;
+      }
+
+      cmp = mappingA.originalColumn - mappingB.originalColumn;
+      if (cmp !== 0) {
+        return cmp;
+      }
+
+      return strcmp(mappingA.name, mappingB.name);
+    }
+    exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
+
+    function strcmp(aStr1, aStr2) {
+      if (aStr1 === aStr2) {
+        return 0;
+      }
+
+      if (aStr1 === null) {
+        return 1; // aStr2 !== null
+      }
+
+      if (aStr2 === null) {
+        return -1; // aStr1 !== null
+      }
+
+      if (aStr1 > aStr2) {
+        return 1;
+      }
+
+      return -1;
+    }
+
+    /**
+     * Comparator between two mappings with inflated source and name strings where
+     * the generated positions are compared.
+     */
+    function compareByGeneratedPositionsInflated(mappingA, mappingB) {
+      var cmp = mappingA.generatedLine - mappingB.generatedLine;
+      if (cmp !== 0) {
+        return cmp;
+      }
+
+      cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+      if (cmp !== 0) {
+        return cmp;
+      }
+
+      cmp = strcmp(mappingA.source, mappingB.source);
+      if (cmp !== 0) {
+        return cmp;
+      }
+
+      cmp = mappingA.originalLine - mappingB.originalLine;
+      if (cmp !== 0) {
+        return cmp;
+      }
+
+      cmp = mappingA.originalColumn - mappingB.originalColumn;
+      if (cmp !== 0) {
+        return cmp;
+      }
+
+      return strcmp(mappingA.name, mappingB.name);
+    }
+    exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
+
+    /**
+     * Strip any JSON XSSI avoidance prefix from the string (as documented
+     * in the source maps specification), and then parse the string as
+     * JSON.
+     */
+    function parseSourceMapInput(str) {
+      return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
+    }
+    exports.parseSourceMapInput = parseSourceMapInput;
+
+    /**
+     * Compute the URL of a source given the the source root, the source's
+     * URL, and the source map's URL.
+     */
+    function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
+      sourceURL = sourceURL || '';
+
+      if (sourceRoot) {
+        // This follows what Chrome does.
+        if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
+          sourceRoot += '/';
+        }
+        // The spec says:
+        //   Line 4: An optional source root, useful for relocating source
+        //   files on a server or removing repeated values in the
+        //   “sources” entry.  This value is prepended to the individual
+        //   entries in the “source” field.
+        sourceURL = sourceRoot + sourceURL;
+      }
+
+      // Historically, SourceMapConsumer did not take the sourceMapURL as
+      // a parameter.  This mode is still somewhat supported, which is why
+      // this code block is conditional.  However, it's preferable to pass
+      // the source map URL to SourceMapConsumer, so that this function
+      // can implement the source URL resolution algorithm as outlined in
+      // the spec.  This block is basically the equivalent of:
+      //    new URL(sourceURL, sourceMapURL).toString()
+      // ... except it avoids using URL, which wasn't available in the
+      // older releases of node still supported by this library.
+      //
+      // The spec says:
+      //   If the sources are not absolute URLs after prepending of the
+      //   “sourceRoot”, the sources are resolved relative to the
+      //   SourceMap (like resolving script src in a html document).
+      if (sourceMapURL) {
+        var parsed = urlParse(sourceMapURL);
+        if (!parsed) {
+          throw new Error("sourceMapURL could not be parsed");
+        }
+        if (parsed.path) {
+          // Strip the last path component, but keep the "/".
+          var index = parsed.path.lastIndexOf('/');
+          if (index >= 0) {
+            parsed.path = parsed.path.substring(0, index + 1);
+          }
+        }
+        sourceURL = join(urlGenerate(parsed), sourceURL);
+      }
+
+      return normalize(sourceURL);
+    }
+    exports.computeSourceURL = computeSourceURL;
+    });
+    var util_1 = util.getArg;
+    var util_2 = util.urlParse;
+    var util_3 = util.urlGenerate;
+    var util_4 = util.normalize;
+    var util_5 = util.join;
+    var util_6 = util.isAbsolute;
+    var util_7 = util.relative;
+    var util_8 = util.toSetString;
+    var util_9 = util.fromSetString;
+    var util_10 = util.compareByOriginalPositions;
+    var util_11 = util.compareByGeneratedPositionsDeflated;
+    var util_12 = util.compareByGeneratedPositionsInflated;
+    var util_13 = util.parseSourceMapInput;
+    var util_14 = util.computeSourceURL;
+
+    /* -*- Mode: js; js-indent-level: 2; -*- */
+    /*
+     * Copyright 2011 Mozilla Foundation and contributors
+     * Licensed under the New BSD license. See LICENSE or:
+     * http://opensource.org/licenses/BSD-3-Clause
+     */
+
+
+    var has = Object.prototype.hasOwnProperty;
+    var hasNativeMap = typeof Map !== "undefined";
+
+    /**
+     * A data structure which is a combination of an array and a set. Adding a new
+     * member is O(1), testing for membership is O(1), and finding the index of an
+     * element is O(1). Removing elements from the set is not supported. Only
+     * strings are supported for membership.
+     */
+    function ArraySet() {
+      this._array = [];
+      this._set = hasNativeMap ? new Map() : Object.create(null);
+    }
+
+    /**
+     * Static method for creating ArraySet instances from an existing array.
+     */
+    ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
+      var set = new ArraySet();
+      for (var i = 0, len = aArray.length; i < len; i++) {
+        set.add(aArray[i], aAllowDuplicates);
+      }
+      return set;
+    };
+
+    /**
+     * Return how many unique items are in this ArraySet. If duplicates have been
+     * added, than those do not count towards the size.
+     *
+     * @returns Number
+     */
+    ArraySet.prototype.size = function ArraySet_size() {
+      return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
+    };
+
+    /**
+     * Add the given string to this set.
+     *
+     * @param String aStr
+     */
+    ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
+      var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
+      var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
+      var idx = this._array.length;
+      if (!isDuplicate || aAllowDuplicates) {
+        this._array.push(aStr);
+      }
+      if (!isDuplicate) {
+        if (hasNativeMap) {
+          this._set.set(aStr, idx);
+        } else {
+          this._set[sStr] = idx;
+        }
+      }
+    };
+
+    /**
+     * Is the given string a member of this set?
+     *
+     * @param String aStr
+     */
+    ArraySet.prototype.has = function ArraySet_has(aStr) {
+      if (hasNativeMap) {
+        return this._set.has(aStr);
+      } else {
+        var sStr = util.toSetString(aStr);
+        return has.call(this._set, sStr);
+      }
+    };
+
+    /**
+     * What is the index of the given string in the array?
+     *
+     * @param String aStr
+     */
+    ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
+      if (hasNativeMap) {
+        var idx = this._set.get(aStr);
+        if (idx >= 0) {
+            return idx;
+        }
+      } else {
+        var sStr = util.toSetString(aStr);
+        if (has.call(this._set, sStr)) {
+          return this._set[sStr];
+        }
+      }
+
+      throw new Error('"' + aStr + '" is not in the set.');
+    };
+
+    /**
+     * What is the element at the given index?
+     *
+     * @param Number aIdx
+     */
+    ArraySet.prototype.at = function ArraySet_at(aIdx) {
+      if (aIdx >= 0 && aIdx < this._array.length) {
+        return this._array[aIdx];
+      }
+      throw new Error('No element indexed by ' + aIdx);
+    };
+
+    /**
+     * Returns the array representation of this set (which has the proper indices
+     * indicated by indexOf). Note that this is a copy of the internal array used
+     * for storing the members so that no one can mess with internal state.
+     */
+    ArraySet.prototype.toArray = function ArraySet_toArray() {
+      return this._array.slice();
+    };
+
+    var ArraySet_1 = ArraySet;
+
+    var arraySet = {
+    	ArraySet: ArraySet_1
+    };
+
+    /* -*- Mode: js; js-indent-level: 2; -*- */
+    /*
+     * Copyright 2014 Mozilla Foundation and contributors
+     * Licensed under the New BSD license. See LICENSE or:
+     * http://opensource.org/licenses/BSD-3-Clause
+     */
+
+
+
+    /**
+     * Determine whether mappingB is after mappingA with respect to generated
+     * position.
+     */
+    function generatedPositionAfter(mappingA, mappingB) {
+      // Optimized for most common case
+      var lineA = mappingA.generatedLine;
+      var lineB = mappingB.generatedLine;
+      var columnA = mappingA.generatedColumn;
+      var columnB = mappingB.generatedColumn;
+      return lineB > lineA || lineB == lineA && columnB >= columnA ||
+             util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
+    }
+
+    /**
+     * A data structure to provide a sorted view of accumulated mappings in a
+     * performance conscious manner. It trades a neglibable overhead in general
+     * case for a large speedup in case of mappings being added in order.
+     */
+    function MappingList() {
+      this._array = [];
+      this._sorted = true;
+      // Serves as infimum
+      this._last = {generatedLine: -1, generatedColumn: 0};
+    }
+
+    /**
+     * Iterate through internal items. This method takes the same arguments that
+     * `Array.prototype.forEach` takes.
+     *
+     * NOTE: The order of the mappings is NOT guaranteed.
+     */
+    MappingList.prototype.unsortedForEach =
+      function MappingList_forEach(aCallback, aThisArg) {
+        this._array.forEach(aCallback, aThisArg);
+      };
+
+    /**
+     * Add the given source mapping.
+     *
+     * @param Object aMapping
+     */
+    MappingList.prototype.add = function MappingList_add(aMapping) {
+      if (generatedPositionAfter(this._last, aMapping)) {
+        this._last = aMapping;
+        this._array.push(aMapping);
+      } else {
+        this._sorted = false;
+        this._array.push(aMapping);
+      }
+    };
+
+    /**
+     * Returns the flat, sorted array of mappings. The mappings are sorted by
+     * generated position.
+     *
+     * WARNING: This method returns internal data without copying, for
+     * performance. The return value must NOT be mutated, and should be treated as
+     * an immutable borrow. If you want to take ownership, you must make your own
+     * copy.
+     */
+    MappingList.prototype.toArray = function MappingList_toArray() {
+      if (!this._sorted) {
+        this._array.sort(util.compareByGeneratedPositionsInflated);
+        this._sorted = true;
+      }
+      return this._array;
+    };
+
+    var MappingList_1 = MappingList;
+
+    var mappingList = {
+    	MappingList: MappingList_1
+    };
+
+    /* -*- Mode: js; js-indent-level: 2; -*- */
+    /*
+     * Copyright 2011 Mozilla Foundation and contributors
+     * Licensed under the New BSD license. See LICENSE or:
+     * http://opensource.org/licenses/BSD-3-Clause
+     */
+
+
+
+    var ArraySet$1 = arraySet.ArraySet;
+    var MappingList$1 = mappingList.MappingList;
+
+    /**
+     * An instance of the SourceMapGenerator represents a source map which is
+     * being built incrementally. You may pass an object with the following
+     * properties:
+     *
+     *   - file: The filename of the generated source.
+     *   - sourceRoot: A root for all relative URLs in this source map.
+     */
+    function SourceMapGenerator(aArgs) {
+      if (!aArgs) {
+        aArgs = {};
+      }
+      this._file = util.getArg(aArgs, 'file', null);
+      this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
+      this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
+      this._sources = new ArraySet$1();
+      this._names = new ArraySet$1();
+      this._mappings = new MappingList$1();
+      this._sourcesContents = null;
+    }
+
+    SourceMapGenerator.prototype._version = 3;
+
+    /**
+     * Creates a new SourceMapGenerator based on a SourceMapConsumer
+     *
+     * @param aSourceMapConsumer The SourceMap.
+     */
+    SourceMapGenerator.fromSourceMap =
+      function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
+        var sourceRoot = aSourceMapConsumer.sourceRoot;
+        var generator = new SourceMapGenerator({
+          file: aSourceMapConsumer.file,
+          sourceRoot: sourceRoot
+        });
+        aSourceMapConsumer.eachMapping(function (mapping) {
+          var newMapping = {
+            generated: {
+              line: mapping.generatedLine,
+              column: mapping.generatedColumn
+            }
+          };
+
+          if (mapping.source != null) {
+            newMapping.source = mapping.source;
+            if (sourceRoot != null) {
+              newMapping.source = util.relative(sourceRoot, newMapping.source);
+            }
+
+            newMapping.original = {
+              line: mapping.originalLine,
+              column: mapping.originalColumn
+            };
+
+            if (mapping.name != null) {
+              newMapping.name = mapping.name;
+            }
+          }
+
+          generator.addMapping(newMapping);
+        });
+        aSourceMapConsumer.sources.forEach(function (sourceFile) {
+          var sourceRelative = sourceFile;
+          if (sourceRoot !== null) {
+            sourceRelative = util.relative(sourceRoot, sourceFile);
+          }
+
+          if (!generator._sources.has(sourceRelative)) {
+            generator._sources.add(sourceRelative);
+          }
+
+          var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+          if (content != null) {
+            generator.setSourceContent(sourceFile, content);
+          }
+        });
+        return generator;
+      };
+
+    /**
+     * Add a single mapping from original source line and column to the generated
+     * source's line and column for this source map being created. The mapping
+     * object should have the following properties:
+     *
+     *   - generated: An object with the generated line and column positions.
+     *   - original: An object with the original line and column positions.
+     *   - source: The original source file (relative to the sourceRoot).
+     *   - name: An optional original token name for this mapping.
+     */
+    SourceMapGenerator.prototype.addMapping =
+      function SourceMapGenerator_addMapping(aArgs) {
+        var generated = util.getArg(aArgs, 'generated');
+        var original = util.getArg(aArgs, 'original', null);
+        var source = util.getArg(aArgs, 'source', null);
+        var name = util.getArg(aArgs, 'name', null);
+
+        if (!this._skipValidation) {
+          this._validateMapping(generated, original, source, name);
+        }
+
+        if (source != null) {
+          source = String(source);
+          if (!this._sources.has(source)) {
+            this._sources.add(source);
+          }
+        }
+
+        if (name != null) {
+          name = String(name);
+          if (!this._names.has(name)) {
+            this._names.add(name);
+          }
+        }
+
+        this._mappings.add({
+          generatedLine: generated.line,
+          generatedColumn: generated.column,
+          originalLine: original != null && original.line,
+          originalColumn: original != null && original.column,
+          source: source,
+          name: name
+        });
+      };
+
+    /**
+     * Set the source content for a source file.
+     */
+    SourceMapGenerator.prototype.setSourceContent =
+      function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
+        var source = aSourceFile;
+        if (this._sourceRoot != null) {
+          source = util.relative(this._sourceRoot, source);
+        }
+
+        if (aSourceContent != null) {
+          // Add the source content to the _sourcesContents map.
+          // Create a new _sourcesContents map if the property is null.
+          if (!this._sourcesContents) {
+            this._sourcesContents = Object.create(null);
+          }
+          this._sourcesContents[util.toSetString(source)] = aSourceContent;
+        } else if (this._sourcesContents) {
+          // Remove the source file from the _sourcesContents map.
+          // If the _sourcesContents map is empty, set the property to null.
+          delete this._sourcesContents[util.toSetString(source)];
+          if (Object.keys(this._sourcesContents).length === 0) {
+            this._sourcesContents = null;
+          }
+        }
+      };
+
+    /**
+     * Applies the mappings of a sub-source-map for a specific source file to the
+     * source map being generated. Each mapping to the supplied source file is
+     * rewritten using the supplied source map. Note: The resolution for the
+     * resulting mappings is the minimium of this map and the supplied map.
+     *
+     * @param aSourceMapConsumer The source map to be applied.
+     * @param aSourceFile Optional. The filename of the source file.
+     *        If omitted, SourceMapConsumer's file property will be used.
+     * @param aSourceMapPath Optional. The dirname of the path to the source map
+     *        to be applied. If relative, it is relative to the SourceMapConsumer.
+     *        This parameter is needed when the two source maps aren't in the same
+     *        directory, and the source map to be applied contains relative source
+     *        paths. If so, those relative source paths need to be rewritten
+     *        relative to the SourceMapGenerator.
+     */
+    SourceMapGenerator.prototype.applySourceMap =
+      function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
+        var sourceFile = aSourceFile;
+        // If aSourceFile is omitted, we will use the file property of the SourceMap
+        if (aSourceFile == null) {
+          if (aSourceMapConsumer.file == null) {
+            throw new Error(
+              'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
+              'or the source map\'s "file" property. Both were omitted.'
+            );
+          }
+          sourceFile = aSourceMapConsumer.file;
+        }
+        var sourceRoot = this._sourceRoot;
+        // Make "sourceFile" relative if an absolute Url is passed.
+        if (sourceRoot != null) {
+          sourceFile = util.relative(sourceRoot, sourceFile);
+        }
+        // Applying the SourceMap can add and remove items from the sources and
+        // the names array.
+        var newSources = new ArraySet$1();
+        var newNames = new ArraySet$1();
+
+        // Find mappings for the "sourceFile"
+        this._mappings.unsortedForEach(function (mapping) {
+          if (mapping.source === sourceFile && mapping.originalLine != null) {
+            // Check if it can be mapped by the source map, then update the mapping.
+            var original = aSourceMapConsumer.originalPositionFor({
+              line: mapping.originalLine,
+              column: mapping.originalColumn
+            });
+            if (original.source != null) {
+              // Copy mapping
+              mapping.source = original.source;
+              if (aSourceMapPath != null) {
+                mapping.source = util.join(aSourceMapPath, mapping.source);
+              }
+              if (sourceRoot != null) {
+                mapping.source = util.relative(sourceRoot, mapping.source);
+              }
+              mapping.originalLine = original.line;
+              mapping.originalColumn = original.column;
+              if (original.name != null) {
+                mapping.name = original.name;
+              }
+            }
+          }
+
+          var source = mapping.source;
+          if (source != null && !newSources.has(source)) {
+            newSources.add(source);
+          }
+
+          var name = mapping.name;
+          if (name != null && !newNames.has(name)) {
+            newNames.add(name);
+          }
+
+        }, this);
+        this._sources = newSources;
+        this._names = newNames;
+
+        // Copy sourcesContents of applied map.
+        aSourceMapConsumer.sources.forEach(function (sourceFile) {
+          var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+          if (content != null) {
+            if (aSourceMapPath != null) {
+              sourceFile = util.join(aSourceMapPath, sourceFile);
+            }
+            if (sourceRoot != null) {
+              sourceFile = util.relative(sourceRoot, sourceFile);
+            }
+            this.setSourceContent(sourceFile, content);
+          }
+        }, this);
+      };
+
+    /**
+     * A mapping can have one of the three levels of data:
+     *
+     *   1. Just the generated position.
+     *   2. The Generated position, original position, and original source.
+     *   3. Generated and original position, original source, as well as a name
+     *      token.
+     *
+     * To maintain consistency, we validate that any new mapping being added falls
+     * in to one of these categories.
+     */
+    SourceMapGenerator.prototype._validateMapping =
+      function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
+                                                  aName) {
+        // When aOriginal is truthy but has empty values for .line and .column,
+        // it is most likely a programmer error. In this case we throw a very
+        // specific error message to try to guide them the right way.
+        // For example: https://github.com/Polymer/polymer-bundler/pull/519
+        if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
+            throw new Error(
+                'original.line and original.column are not numbers -- you probably meant to omit ' +
+                'the original mapping entirely and only map the generated position. If so, pass ' +
+                'null for the original mapping instead of an object with empty or null values.'
+            );
+        }
+
+        if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+            && aGenerated.line > 0 && aGenerated.column >= 0
+            && !aOriginal && !aSource && !aName) {
+          // Case 1.
+          return;
+        }
+        else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+                 && aOriginal && 'line' in aOriginal && 'column' in aOriginal
+                 && aGenerated.line > 0 && aGenerated.column >= 0
+                 && aOriginal.line > 0 && aOriginal.column >= 0
+                 && aSource) {
+          // Cases 2 and 3.
+          return;
+        }
+        else {
+          throw new Error('Invalid mapping: ' + JSON.stringify({
+            generated: aGenerated,
+            source: aSource,
+            original: aOriginal,
+            name: aName
+          }));
+        }
+      };
+
+    /**
+     * Serialize the accumulated mappings in to the stream of base 64 VLQs
+     * specified by the source map format.
+     */
+    SourceMapGenerator.prototype._serializeMappings =
+      function SourceMapGenerator_serializeMappings() {
+        var previousGeneratedColumn = 0;
+        var previousGeneratedLine = 1;
+        var previousOriginalColumn = 0;
+        var previousOriginalLine = 0;
+        var previousName = 0;
+        var previousSource = 0;
+        var result = '';
+        var next;
+        var mapping;
+        var nameIdx;
+        var sourceIdx;
+
+        var mappings = this._mappings.toArray();
+        for (var i = 0, len = mappings.length; i < len; i++) {
+          mapping = mappings[i];
+          next = '';
+
+          if (mapping.generatedLine !== previousGeneratedLine) {
+            previousGeneratedColumn = 0;
+            while (mapping.generatedLine !== previousGeneratedLine) {
+              next += ';';
+              previousGeneratedLine++;
+            }
+          }
+          else {
+            if (i > 0) {
+              if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
+                continue;
+              }
+              next += ',';
+            }
+          }
+
+          next += base64Vlq.encode(mapping.generatedColumn
+                                     - previousGeneratedColumn);
+          previousGeneratedColumn = mapping.generatedColumn;
+
+          if (mapping.source != null) {
+            sourceIdx = this._sources.indexOf(mapping.source);
+            next += base64Vlq.encode(sourceIdx - previousSource);
+            previousSource = sourceIdx;
+
+            // lines are stored 0-based in SourceMap spec version 3
+            next += base64Vlq.encode(mapping.originalLine - 1
+                                       - previousOriginalLine);
+            previousOriginalLine = mapping.originalLine - 1;
+
+            next += base64Vlq.encode(mapping.originalColumn
+                                       - previousOriginalColumn);
+            previousOriginalColumn = mapping.originalColumn;
+
+            if (mapping.name != null) {
+              nameIdx = this._names.indexOf(mapping.name);
+              next += base64Vlq.encode(nameIdx - previousName);
+              previousName = nameIdx;
+            }
+          }
+
+          result += next;
+        }
+
+        return result;
+      };
+
+    SourceMapGenerator.prototype._generateSourcesContent =
+      function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
+        return aSources.map(function (source) {
+          if (!this._sourcesContents) {
+            return null;
+          }
+          if (aSourceRoot != null) {
+            source = util.relative(aSourceRoot, source);
+          }
+          var key = util.toSetString(source);
+          return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
+            ? this._sourcesContents[key]
+            : null;
+        }, this);
+      };
+
+    /**
+     * Externalize the source map.
+     */
+    SourceMapGenerator.prototype.toJSON =
+      function SourceMapGenerator_toJSON() {
+        var map = {
+          version: this._version,
+          sources: this._sources.toArray(),
+          names: this._names.toArray(),
+          mappings: this._serializeMappings()
+        };
+        if (this._file != null) {
+          map.file = this._file;
+        }
+        if (this._sourceRoot != null) {
+          map.sourceRoot = this._sourceRoot;
+        }
+        if (this._sourcesContents) {
+          map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
+        }
+
+        return map;
+      };
+
+    /**
+     * Render the source map being generated to a string.
+     */
+    SourceMapGenerator.prototype.toString =
+      function SourceMapGenerator_toString() {
+        return JSON.stringify(this.toJSON());
+      };
+
+    var SourceMapGenerator_1 = SourceMapGenerator;
+
+    var sourceMapGenerator = {
+    	SourceMapGenerator: SourceMapGenerator_1
+    };
+
+    var SourceMapGenerator$1 = sourceMapGenerator.SourceMapGenerator;
+    var trackNodes = {
+        Atrule: true,
+        Selector: true,
+        Declaration: true
+    };
+
+    var sourceMap = function generateSourceMap(handlers) {
+        var map = new SourceMapGenerator$1();
+        var line = 1;
+        var column = 0;
+        var generated = {
+            line: 1,
+            column: 0
+        };
+        var original = {
+            line: 0, // should be zero to add first mapping
+            column: 0
+        };
+        var sourceMappingActive = false;
+        var activatedGenerated = {
+            line: 1,
+            column: 0
+        };
+        var activatedMapping = {
+            generated: activatedGenerated
+        };
+
+        var handlersNode = handlers.node;
+        handlers.node = function(node) {
+            if (node.loc && node.loc.start && trackNodes.hasOwnProperty(node.type)) {
+                var nodeLine = node.loc.start.line;
+                var nodeColumn = node.loc.start.column - 1;
+
+                if (original.line !== nodeLine ||
+                    original.column !== nodeColumn) {
+                    original.line = nodeLine;
+                    original.column = nodeColumn;
+
+                    generated.line = line;
+                    generated.column = column;
+
+                    if (sourceMappingActive) {
+                        sourceMappingActive = false;
+                        if (generated.line !== activatedGenerated.line ||
+                            generated.column !== activatedGenerated.column) {
+                            map.addMapping(activatedMapping);
+                        }
+                    }
+
+                    sourceMappingActive = true;
+                    map.addMapping({
+                        source: node.loc.source,
+                        original: original,
+                        generated: generated
+                    });
+                }
+            }
+
+            handlersNode.call(this, node);
+
+            if (sourceMappingActive && trackNodes.hasOwnProperty(node.type)) {
+                activatedGenerated.line = line;
+                activatedGenerated.column = column;
+            }
+        };
+
+        var handlersChunk = handlers.chunk;
+        handlers.chunk = function(chunk) {
+            for (var i = 0; i < chunk.length; i++) {
+                if (chunk.charCodeAt(i) === 10) { // \n
+                    line++;
+                    column = 0;
+                } else {
+                    column++;
+                }
+            }
+
+            handlersChunk(chunk);
+        };
+
+        var handlersResult = handlers.result;
+        handlers.result = function() {
+            if (sourceMappingActive) {
+                map.addMapping(activatedMapping);
+            }
+
+            return {
+                css: handlersResult(),
+                map: map
+            };
+        };
+
+        return handlers;
+    };
+
+    var hasOwnProperty$3 = Object.prototype.hasOwnProperty;
+
+    function processChildren(node, delimeter) {
+        var list = node.children;
+        var prev = null;
+
+        if (typeof delimeter !== 'function') {
+            list.forEach(this.node, this);
+        } else {
+            list.forEach(function(node) {
+                if (prev !== null) {
+                    delimeter.call(this, prev);
+                }
+
+                this.node(node);
+                prev = node;
+            }, this);
+        }
+    }
+
+    var create$1 = function createGenerator(config) {
+        function processNode(node) {
+            if (hasOwnProperty$3.call(types, node.type)) {
+                types[node.type].call(this, node);
+            } else {
+                throw new Error('Unknown node type: ' + node.type);
+            }
+        }
+
+        var types = {};
+
+        if (config.node) {
+            for (var name in config.node) {
+                types[name] = config.node[name].generate;
+            }
+        }
+
+        return function(node, options) {
+            var buffer = '';
+            var handlers = {
+                children: processChildren,
+                node: processNode,
+                chunk: function(chunk) {
+                    buffer += chunk;
+                },
+                result: function() {
+                    return buffer;
+                }
+            };
+
+            if (options) {
+                if (typeof options.decorator === 'function') {
+                    handlers = options.decorator(handlers);
+                }
+
+                if (options.sourceMap) {
+                    handlers = sourceMap(handlers);
+                }
+            }
+
+            handlers.node(node);
+
+            return handlers.result();
+        };
+    };
+
+    var create$2 = function createConvertors(walk) {
+        return {
+            fromPlainObject: function(ast) {
+                walk(ast, {
+                    enter: function(node) {
+                        if (node.children && node.children instanceof List_1 === false) {
+                            node.children = new List_1().fromArray(node.children);
+                        }
+                    }
+                });
+
+                return ast;
+            },
+            toPlainObject: function(ast) {
+                walk(ast, {
+                    leave: function(node) {
+                        if (node.children && node.children instanceof List_1) {
+                            node.children = node.children.toArray();
+                        }
+                    }
+                });
+
+                return ast;
+            }
+        };
+    };
+
+    var hasOwnProperty$4 = Object.prototype.hasOwnProperty;
+    var noop$3 = function() {};
+
+    function ensureFunction$1(value) {
+        return typeof value === 'function' ? value : noop$3;
+    }
+
+    function invokeForType(fn, type) {
+        return function(node, item, list) {
+            if (node.type === type) {
+                fn.call(this, node, item, list);
+            }
+        };
+    }
+
+    function getWalkersFromStructure(name, nodeType) {
+        var structure = nodeType.structure;
+        var walkers = [];
+
+        for (var key in structure) {
+            if (hasOwnProperty$4.call(structure, key) === false) {
+                continue;
+            }
+
+            var fieldTypes = structure[key];
+            var walker = {
+                name: key,
+                type: false,
+                nullable: false
+            };
+
+            if (!Array.isArray(structure[key])) {
+                fieldTypes = [structure[key]];
+            }
+
+            for (var i = 0; i < fieldTypes.length; i++) {
+                var fieldType = fieldTypes[i];
+                if (fieldType === null) {
+                    walker.nullable = true;
+                } else if (typeof fieldType === 'string') {
+                    walker.type = 'node';
+                } else if (Array.isArray(fieldType)) {
+                    walker.type = 'list';
+                }
+            }
+
+            if (walker.type) {
+                walkers.push(walker);
+            }
+        }
+
+        if (walkers.length) {
+            return {
+                context: nodeType.walkContext,
+                fields: walkers
+            };
+        }
+
+        return null;
+    }
+
+    function getTypesFromConfig(config) {
+        var types = {};
+
+        for (var name in config.node) {
+            if (hasOwnProperty$4.call(config.node, name)) {
+                var nodeType = config.node[name];
+
+                if (!nodeType.structure) {
+                    throw new Error('Missed `structure` field in `' + name + '` node type definition');
+                }
+
+                types[name] = getWalkersFromStructure(name, nodeType);
+            }
+        }
+
+        return types;
+    }
+
+    function createTypeIterator(config, reverse) {
+        var fields = config.fields.slice();
+        var contextName = config.context;
+        var useContext = typeof contextName === 'string';
+
+        if (reverse) {
+            fields.reverse();
+        }
+
+        return function(node, context, walk, walkReducer) {
+            var prevContextValue;
+
+            if (useContext) {
+                prevContextValue = context[contextName];
+                context[contextName] = node;
+            }
+
+            for (var i = 0; i < fields.length; i++) {
+                var field = fields[i];
+                var ref = node[field.name];
+
+                if (!field.nullable || ref) {
+                    if (field.type === 'list') {
+                        var breakWalk = reverse
+                            ? ref.reduceRight(walkReducer, false)
+                            : ref.reduce(walkReducer, false);
+
+                        if (breakWalk) {
+                            return true;
+                        }
+                    } else if (walk(ref)) {
+                        return true;
+                    }
+                }
+            }
+
+            if (useContext) {
+                context[contextName] = prevContextValue;
+            }
+        };
+    }
+
+    function createFastTraveralMap(iterators) {
+        return {
+            Atrule: {
+                StyleSheet: iterators.StyleSheet,
+                Atrule: iterators.Atrule,
+                Rule: iterators.Rule,
+                Block: iterators.Block
+            },
+            Rule: {
+                StyleSheet: iterators.StyleSheet,
+                Atrule: iterators.Atrule,
+                Rule: iterators.Rule,
+                Block: iterators.Block
+            },
+            Declaration: {
+                StyleSheet: iterators.StyleSheet,
+                Atrule: iterators.Atrule,
+                Rule: iterators.Rule,
+                Block: iterators.Block,
+                DeclarationList: iterators.DeclarationList
+            }
+        };
+    }
+
+    var create$3 = function createWalker(config) {
+        var types = getTypesFromConfig(config);
+        var iteratorsNatural = {};
+        var iteratorsReverse = {};
+        var breakWalk = Symbol('break-walk');
+        var skipNode = Symbol('skip-node');
+
+        for (var name in types) {
+            if (hasOwnProperty$4.call(types, name) && types[name] !== null) {
+                iteratorsNatural[name] = createTypeIterator(types[name], false);
+                iteratorsReverse[name] = createTypeIterator(types[name], true);
+            }
+        }
+
+        var fastTraversalIteratorsNatural = createFastTraveralMap(iteratorsNatural);
+        var fastTraversalIteratorsReverse = createFastTraveralMap(iteratorsReverse);
+
+        var walk = function(root, options) {
+            function walkNode(node, item, list) {
+                var enterRet = enter.call(context, node, item, list);
+
+                if (enterRet === breakWalk) {
+                    debugger;
+                    return true;
+                }
+
+                if (enterRet === skipNode) {
+                    return false;
+                }
+
+                if (iterators.hasOwnProperty(node.type)) {
+                    if (iterators[node.type](node, context, walkNode, walkReducer)) {
+                        return true;
+                    }
+                }
+
+                if (leave.call(context, node, item, list) === breakWalk) {
+                    return true;
+                }
+
+                return false;
+            }
+
+            var walkReducer = (ret, data, item, list) => ret || walkNode(data, item, list);
+            var enter = noop$3;
+            var leave = noop$3;
+            var iterators = iteratorsNatural;
+            var context = {
+                break: breakWalk,
+                skip: skipNode,
+
+                root: root,
+                stylesheet: null,
+                atrule: null,
+                atrulePrelude: null,
+                rule: null,
+                selector: null,
+                block: null,
+                declaration: null,
+                function: null
+            };
+
+            if (typeof options === 'function') {
+                enter = options;
+            } else if (options) {
+                enter = ensureFunction$1(options.enter);
+                leave = ensureFunction$1(options.leave);
+
+                if (options.reverse) {
+                    iterators = iteratorsReverse;
+                }
+
+                if (options.visit) {
+                    if (fastTraversalIteratorsNatural.hasOwnProperty(options.visit)) {
+                        iterators = options.reverse
+                            ? fastTraversalIteratorsReverse[options.visit]
+                            : fastTraversalIteratorsNatural[options.visit];
+                    } else if (!types.hasOwnProperty(options.visit)) {
+                        throw new Error('Bad value `' + options.visit + '` for `visit` option (should be: ' + Object.keys(types).join(', ') + ')');
+                    }
+
+                    enter = invokeForType(enter, options.visit);
+                    leave = invokeForType(leave, options.visit);
+                }
+            }
+
+            if (enter === noop$3 && leave === noop$3) {
+                throw new Error('Neither `enter` nor `leave` walker handler is set or both aren\'t a function');
+            }
+
+            walkNode(root);
+        };
+
+        walk.break = breakWalk;
+        walk.skip = skipNode;
+
+        walk.find = function(ast, fn) {
+            var found = null;
+
+            walk(ast, function(node, item, list) {
+                if (fn.call(this, node, item, list)) {
+                    found = node;
+                    return breakWalk;
+                }
+            });
+
+            return found;
+        };
+
+        walk.findLast = function(ast, fn) {
+            var found = null;
+
+            walk(ast, {
+                reverse: true,
+                enter: function(node, item, list) {
+                    if (fn.call(this, node, item, list)) {
+                        found = node;
+                        return breakWalk;
+                    }
+                }
+            });
+
+            return found;
+        };
+
+        walk.findAll = function(ast, fn) {
+            var found = [];
+
+            walk(ast, function(node, item, list) {
+                if (fn.call(this, node, item, list)) {
+                    found.push(node);
+                }
+            });
+
+            return found;
+        };
+
+        return walk;
+    };
+
+    var clone = function clone(node) {
+        var result = {};
+
+        for (var key in node) {
+            var value = node[key];
+
+            if (value) {
+                if (Array.isArray(value) || value instanceof List_1) {
+                    value = value.map(clone);
+                } else if (value.constructor === Object) {
+                    value = clone(value);
+                }
+            }
+
+            result[key] = value;
+        }
+
+        return result;
+    };
+
+    const hasOwnProperty$5 = Object.prototype.hasOwnProperty;
+    const shape = {
+        generic: true,
+        types: appendOrAssign,
+        atrules: {
+            prelude: appendOrAssignOrNull,
+            descriptors: appendOrAssignOrNull
+        },
+        properties: appendOrAssign,
+        parseContext: assign,
+        scope: deepAssign,
+        atrule: ['parse'],
+        pseudo: ['parse'],
+        node: ['name', 'structure', 'parse', 'generate', 'walkContext']
+    };
+
+    function isObject(value) {
+        return value && value.constructor === Object;
+    }
+
+    function copy(value) {
+        return isObject(value)
+            ? Object.assign({}, value)
+            : value;
+    }
+
+    function assign(dest, src) {
+        return Object.assign(dest, src);
+    }
+
+    function deepAssign(dest, src) {
+        for (const key in src) {
+            if (hasOwnProperty$5.call(src, key)) {
+                if (isObject(dest[key])) {
+                    deepAssign(dest[key], copy(src[key]));
+                } else {
+                    dest[key] = copy(src[key]);
+                }
+            }
+        }
+
+        return dest;
+    }
+
+    function append(a, b) {
+        if (typeof b === 'string' && /^\s*\|/.test(b)) {
+            return typeof a === 'string'
+                ? a + b
+                : b.replace(/^\s*\|\s*/, '');
+        }
+
+        return b || null;
+    }
+
+    function appendOrAssign(a, b) {
+        if (typeof b === 'string') {
+            return append(a, b);
+        }
+
+        const result = Object.assign({}, a);
+        for (let key in b) {
+            if (hasOwnProperty$5.call(b, key)) {
+                result[key] = append(hasOwnProperty$5.call(a, key) ? a[key] : undefined, b[key]);
+            }
+        }
+
+        return result;
+    }
+
+    function appendOrAssignOrNull(a, b) {
+        const result = appendOrAssign(a, b);
+
+        return !isObject(result) || Object.keys(result).length
+            ? result
+            : null;
+    }
+
+    function mix(dest, src, shape) {
+        for (const key in shape) {
+            if (hasOwnProperty$5.call(shape, key) === false) {
+                continue;
+            }
+
+            if (shape[key] === true) {
+                if (key in src) {
+                    if (hasOwnProperty$5.call(src, key)) {
+                        dest[key] = copy(src[key]);
+                    }
+                }
+            } else if (shape[key]) {
+                if (typeof shape[key] === 'function') {
+                    const fn = shape[key];
+                    dest[key] = fn({}, dest[key]);
+                    dest[key] = fn(dest[key] || {}, src[key]);
+                } else if (isObject(shape[key])) {
+                    const result = {};
+
+                    for (let name in dest[key]) {
+                        result[name] = mix({}, dest[key][name], shape[key]);
+                    }
+
+                    for (let name in src[key]) {
+                        result[name] = mix(result[name] || {}, src[key][name], shape[key]);
+                    }
+
+                    dest[key] = result;
+                } else if (Array.isArray(shape[key])) {
+                    const res = {};
+                    const innerShape = shape[key].reduce(function(s, k) {
+                        s[k] = true;
+                        return s;
+                    }, {});
+
+                    for (const [name, value] of Object.entries(dest[key] || {})) {
+                        res[name] = {};
+                        if (value) {
+                            mix(res[name], value, innerShape);
+                        }
+                    }
+
+                    for (const name in src[key]) {
+                        if (hasOwnProperty$5.call(src[key], name)) {
+                            if (!res[name]) {
+                                res[name] = {};
+                            }
+
+                            if (src[key] && src[key][name]) {
+                                mix(res[name], src[key][name], innerShape);
+                            }
+                        }
+                    }
+
+                    dest[key] = res;
+                }
+            }
+        }
+        return dest;
+    }
+
+    var mix_1 = (dest, src) => mix(dest, src, shape);
+
+    function createSyntax(config) {
+        var parse = create(config);
+        var walk = create$3(config);
+        var generate = create$1(config);
+        var convert = create$2(walk);
+
+        var syntax = {
+            List: List_1,
+            SyntaxError: _SyntaxError,
+            TokenStream: TokenStream_1,
+            Lexer: Lexer_1,
+
+            vendorPrefix: names.vendorPrefix,
+            keyword: names.keyword,
+            property: names.property,
+            isCustomProperty: names.isCustomProperty,
+
+            definitionSyntax: definitionSyntax,
+            lexer: null,
+            createLexer: function(config) {
+                return new Lexer_1(config, syntax, syntax.lexer.structure);
+            },
+
+            tokenize: tokenizer,
+            parse: parse,
+            walk: walk,
+            generate: generate,
+
+            find: walk.find,
+            findLast: walk.findLast,
+            findAll: walk.findAll,
+
+            clone: clone,
+            fromPlainObject: convert.fromPlainObject,
+            toPlainObject: convert.toPlainObject,
+
+            createSyntax: function(config) {
+                return createSyntax(mix_1({}, config));
+            },
+            fork: function(extension) {
+                var base = mix_1({}, config); // copy of config
+                return createSyntax(
+                    typeof extension === 'function'
+                        ? extension(base, Object.assign)
+                        : mix_1(base, extension)
+                );
+            }
+        };
+
+        syntax.lexer = new Lexer_1({
+            generic: true,
+            types: config.types,
+            atrules: config.atrules,
+            properties: config.properties,
+            node: config.node
+        }, syntax);
+
+        return syntax;
+    }
+    var create_1 = function(config) {
+        return createSyntax(mix_1({}, config));
+    };
+
+    var create$4 = {
+    	create: create_1
+    };
+
+    var data = {
+        "generic": true,
+        "types": {
+            "absolute-size": "xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large",
+            "alpha-value": "<number>|<percentage>",
+            "angle-percentage": "<angle>|<percentage>",
+            "angular-color-hint": "<angle-percentage>",
+            "angular-color-stop": "<color>&&<color-stop-angle>?",
+            "angular-color-stop-list": "[<angular-color-stop> [, <angular-color-hint>]?]# , <angular-color-stop>",
+            "animateable-feature": "scroll-position|contents|<custom-ident>",
+            "attachment": "scroll|fixed|local",
+            "attr()": "attr( <attr-name> <type-or-unit>? [, <attr-fallback>]? )",
+            "attr-matcher": "['~'|'|'|'^'|'$'|'*']? '='",
+            "attr-modifier": "i|s",
+            "attribute-selector": "'[' <wq-name> ']'|'[' <wq-name> <attr-matcher> [<string-token>|<ident-token>] <attr-modifier>? ']'",
+            "auto-repeat": "repeat( [auto-fill|auto-fit] , [<line-names>? <fixed-size>]+ <line-names>? )",
+            "auto-track-list": "[<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>? <auto-repeat> [<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>?",
+            "baseline-position": "[first|last]? baseline",
+            "basic-shape": "<inset()>|<circle()>|<ellipse()>|<polygon()>|<path()>",
+            "bg-image": "none|<image>",
+            "bg-layer": "<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>",
+            "bg-position": "[[left|center|right|top|bottom|<length-percentage>]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]|[center|[left|right] <length-percentage>?]&&[center|[top|bottom] <length-percentage>?]]",
+            "bg-size": "[<length-percentage>|auto]{1,2}|cover|contain",
+            "blur()": "blur( <length> )",
+            "blend-mode": "normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|hard-light|soft-light|difference|exclusion|hue|saturation|color|luminosity",
+            "box": "border-box|padding-box|content-box",
+            "brightness()": "brightness( <number-percentage> )",
+            "calc()": "calc( <calc-sum> )",
+            "calc-sum": "<calc-product> [['+'|'-'] <calc-product>]*",
+            "calc-product": "<calc-value> ['*' <calc-value>|'/' <number>]*",
+            "calc-value": "<number>|<dimension>|<percentage>|( <calc-sum> )",
+            "cf-final-image": "<image>|<color>",
+            "cf-mixing-image": "<percentage>?&&<image>",
+            "circle()": "circle( [<shape-radius>]? [at <position>]? )",
+            "clamp()": "clamp( <calc-sum>#{3} )",
+            "class-selector": "'.' <ident-token>",
+            "clip-source": "<url>",
+            "color": "<rgb()>|<rgba()>|<hsl()>|<hsla()>|<hex-color>|<named-color>|currentcolor|<deprecated-system-color>",
+            "color-stop": "<color-stop-length>|<color-stop-angle>",
+            "color-stop-angle": "<angle-percentage>{1,2}",
+            "color-stop-length": "<length-percentage>{1,2}",
+            "color-stop-list": "[<linear-color-stop> [, <linear-color-hint>]?]# , <linear-color-stop>",
+            "combinator": "'>'|'+'|'~'|['||']",
+            "common-lig-values": "[common-ligatures|no-common-ligatures]",
+            "compat-auto": "searchfield|textarea|push-button|slider-horizontal|checkbox|radio|square-button|menulist|listbox|meter|progress-bar|button",
+            "composite-style": "clear|copy|source-over|source-in|source-out|source-atop|destination-over|destination-in|destination-out|destination-atop|xor",
+            "compositing-operator": "add|subtract|intersect|exclude",
+            "compound-selector": "[<type-selector>? <subclass-selector>* [<pseudo-element-selector> <pseudo-class-selector>*]*]!",
+            "compound-selector-list": "<compound-selector>#",
+            "complex-selector": "<compound-selector> [<combinator>? <compound-selector>]*",
+            "complex-selector-list": "<complex-selector>#",
+            "conic-gradient()": "conic-gradient( [from <angle>]? [at <position>]? , <angular-color-stop-list> )",
+            "contextual-alt-values": "[contextual|no-contextual]",
+            "content-distribution": "space-between|space-around|space-evenly|stretch",
+            "content-list": "[<string>|contents|<image>|<quote>|<target>|<leader()>|<attr()>|counter( <ident> , <'list-style-type'>? )]+",
+            "content-position": "center|start|end|flex-start|flex-end",
+            "content-replacement": "<image>",
+            "contrast()": "contrast( [<number-percentage>] )",
+            "counter()": "counter( <custom-ident> , <counter-style>? )",
+            "counter-style": "<counter-style-name>|symbols( )",
+            "counter-style-name": "<custom-ident>",
+            "counters()": "counters( <custom-ident> , <string> , <counter-style>? )",
+            "cross-fade()": "cross-fade( <cf-mixing-image> , <cf-final-image>? )",
+            "cubic-bezier-timing-function": "ease|ease-in|ease-out|ease-in-out|cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )",
+            "deprecated-system-color": "ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText",
+            "discretionary-lig-values": "[discretionary-ligatures|no-discretionary-ligatures]",
+            "display-box": "contents|none",
+            "display-inside": "flow|flow-root|table|flex|grid|ruby",
+            "display-internal": "table-row-group|table-header-group|table-footer-group|table-row|table-cell|table-column-group|table-column|table-caption|ruby-base|ruby-text|ruby-base-container|ruby-text-container",
+            "display-legacy": "inline-block|inline-list-item|inline-table|inline-flex|inline-grid",
+            "display-listitem": "<display-outside>?&&[flow|flow-root]?&&list-item",
+            "display-outside": "block|inline|run-in",
+            "drop-shadow()": "drop-shadow( <length>{2,3} <color>? )",
+            "east-asian-variant-values": "[jis78|jis83|jis90|jis04|simplified|traditional]",
+            "east-asian-width-values": "[full-width|proportional-width]",
+            "element()": "element( <custom-ident> , [first|start|last|first-except]? )|element( <id-selector> )",
+            "ellipse()": "ellipse( [<shape-radius>{2}]? [at <position>]? )",
+            "ending-shape": "circle|ellipse",
+            "env()": "env( <custom-ident> , <declaration-value>? )",
+            "explicit-track-list": "[<line-names>? <track-size>]+ <line-names>?",
+            "family-name": "<string>|<custom-ident>+",
+            "feature-tag-value": "<string> [<integer>|on|off]?",
+            "feature-type": "@stylistic|@historical-forms|@styleset|@character-variant|@swash|@ornaments|@annotation",
+            "feature-value-block": "<feature-type> '{' <feature-value-declaration-list> '}'",
+            "feature-value-block-list": "<feature-value-block>+",
+            "feature-value-declaration": "<custom-ident> : <integer>+ ;",
+            "feature-value-declaration-list": "<feature-value-declaration>",
+            "feature-value-name": "<custom-ident>",
+            "fill-rule": "nonzero|evenodd",
+            "filter-function": "<blur()>|<brightness()>|<contrast()>|<drop-shadow()>|<grayscale()>|<hue-rotate()>|<invert()>|<opacity()>|<saturate()>|<sepia()>",
+            "filter-function-list": "[<filter-function>|<url>]+",
+            "final-bg-layer": "<'background-color'>||<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>",
+            "fit-content()": "fit-content( [<length>|<percentage>] )",
+            "fixed-breadth": "<length-percentage>",
+            "fixed-repeat": "repeat( [<positive-integer>] , [<line-names>? <fixed-size>]+ <line-names>? )",
+            "fixed-size": "<fixed-breadth>|minmax( <fixed-breadth> , <track-breadth> )|minmax( <inflexible-breadth> , <fixed-breadth> )",
+            "font-stretch-absolute": "normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded|<percentage>",
+            "font-variant-css21": "[normal|small-caps]",
+            "font-weight-absolute": "normal|bold|<number [1,1000]>",
+            "frequency-percentage": "<frequency>|<percentage>",
+            "general-enclosed": "[<function-token> <any-value> )]|( <ident> <any-value> )",
+            "generic-family": "serif|sans-serif|cursive|fantasy|monospace|-apple-system",
+            "generic-name": "serif|sans-serif|cursive|fantasy|monospace",
+            "geometry-box": "<shape-box>|fill-box|stroke-box|view-box",
+            "gradient": "<linear-gradient()>|<repeating-linear-gradient()>|<radial-gradient()>|<repeating-radial-gradient()>|<conic-gradient()>|<-legacy-gradient>",
+            "grayscale()": "grayscale( <number-percentage> )",
+            "grid-line": "auto|<custom-ident>|[<integer>&&<custom-ident>?]|[span&&[<integer>||<custom-ident>]]",
+            "historical-lig-values": "[historical-ligatures|no-historical-ligatures]",
+            "hsl()": "hsl( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )",
+            "hsla()": "hsla( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )",
+            "hue": "<number>|<angle>",
+            "hue-rotate()": "hue-rotate( <angle> )",
+            "image": "<url>|<image()>|<image-set()>|<element()>|<paint()>|<cross-fade()>|<gradient>",
+            "image()": "image( <image-tags>? [<image-src>? , <color>?]! )",
+            "image-set()": "image-set( <image-set-option># )",
+            "image-set-option": "[<image>|<string>] <resolution>",
+            "image-src": "<url>|<string>",
+            "image-tags": "ltr|rtl",
+            "inflexible-breadth": "<length>|<percentage>|min-content|max-content|auto",
+            "inset()": "inset( <length-percentage>{1,4} [round <'border-radius'>]? )",
+            "invert()": "invert( <number-percentage> )",
+            "keyframes-name": "<custom-ident>|<string>",
+            "keyframe-block": "<keyframe-selector># { <declaration-list> }",
+            "keyframe-block-list": "<keyframe-block>+",
+            "keyframe-selector": "from|to|<percentage>",
+            "leader()": "leader( <leader-type> )",
+            "leader-type": "dotted|solid|space|<string>",
+            "length-percentage": "<length>|<percentage>",
+            "line-names": "'[' <custom-ident>* ']'",
+            "line-name-list": "[<line-names>|<name-repeat>]+",
+            "line-style": "none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset",
+            "line-width": "<length>|thin|medium|thick",
+            "linear-color-hint": "<length-percentage>",
+            "linear-color-stop": "<color> <color-stop-length>?",
+            "linear-gradient()": "linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )",
+            "mask-layer": "<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||<geometry-box>||[<geometry-box>|no-clip]||<compositing-operator>||<masking-mode>",
+            "mask-position": "[<length-percentage>|left|center|right] [<length-percentage>|top|center|bottom]?",
+            "mask-reference": "none|<image>|<mask-source>",
+            "mask-source": "<url>",
+            "masking-mode": "alpha|luminance|match-source",
+            "matrix()": "matrix( <number>#{6} )",
+            "matrix3d()": "matrix3d( <number>#{16} )",
+            "max()": "max( <calc-sum># )",
+            "media-and": "<media-in-parens> [and <media-in-parens>]+",
+            "media-condition": "<media-not>|<media-and>|<media-or>|<media-in-parens>",
+            "media-condition-without-or": "<media-not>|<media-and>|<media-in-parens>",
+            "media-feature": "( [<mf-plain>|<mf-boolean>|<mf-range>] )",
+            "media-in-parens": "( <media-condition> )|<media-feature>|<general-enclosed>",
+            "media-not": "not <media-in-parens>",
+            "media-or": "<media-in-parens> [or <media-in-parens>]+",
+            "media-query": "<media-condition>|[not|only]? <media-type> [and <media-condition-without-or>]?",
+            "media-query-list": "<media-query>#",
+            "media-type": "<ident>",
+            "mf-boolean": "<mf-name>",
+            "mf-name": "<ident>",
+            "mf-plain": "<mf-name> : <mf-value>",
+            "mf-range": "<mf-name> ['<'|'>']? '='? <mf-value>|<mf-value> ['<'|'>']? '='? <mf-name>|<mf-value> '<' '='? <mf-name> '<' '='? <mf-value>|<mf-value> '>' '='? <mf-name> '>' '='? <mf-value>",
+            "mf-value": "<number>|<dimension>|<ident>|<ratio>",
+            "min()": "min( <calc-sum># )",
+            "minmax()": "minmax( [<length>|<percentage>|min-content|max-content|auto] , [<length>|<percentage>|<flex>|min-content|max-content|auto] )",
+            "named-color": "transparent|aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen|<-non-standard-color>",
+            "namespace-prefix": "<ident>",
+            "ns-prefix": "[<ident-token>|'*']? '|'",
+            "number-percentage": "<number>|<percentage>",
+            "numeric-figure-values": "[lining-nums|oldstyle-nums]",
+            "numeric-fraction-values": "[diagonal-fractions|stacked-fractions]",
+            "numeric-spacing-values": "[proportional-nums|tabular-nums]",
+            "nth": "<an-plus-b>|even|odd",
+            "opacity()": "opacity( [<number-percentage>] )",
+            "overflow-position": "unsafe|safe",
+            "outline-radius": "<length>|<percentage>",
+            "page-body": "<declaration>? [; <page-body>]?|<page-margin-box> <page-body>",
+            "page-margin-box": "<page-margin-box-type> '{' <declaration-list> '}'",
+            "page-margin-box-type": "@top-left-corner|@top-left|@top-center|@top-right|@top-right-corner|@bottom-left-corner|@bottom-left|@bottom-center|@bottom-right|@bottom-right-corner|@left-top|@left-middle|@left-bottom|@right-top|@right-middle|@right-bottom",
+            "page-selector-list": "[<page-selector>#]?",
+            "page-selector": "<pseudo-page>+|<ident> <pseudo-page>*",
+            "path()": "path( [<fill-rule> ,]? <string> )",
+            "paint()": "paint( <ident> , <declaration-value>? )",
+            "perspective()": "perspective( <length> )",
+            "polygon()": "polygon( <fill-rule>? , [<length-percentage> <length-percentage>]# )",
+            "position": "[[left|center|right]||[top|center|bottom]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]?|[[left|right] <length-percentage>]&&[[top|bottom] <length-percentage>]]",
+            "pseudo-class-selector": "':' <ident-token>|':' <function-token> <any-value> ')'",
+            "pseudo-element-selector": "':' <pseudo-class-selector>",
+            "pseudo-page": ": [left|right|first|blank]",
+            "quote": "open-quote|close-quote|no-open-quote|no-close-quote",
+            "radial-gradient()": "radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )",
+            "relative-selector": "<combinator>? <complex-selector>",
+            "relative-selector-list": "<relative-selector>#",
+            "relative-size": "larger|smaller",
+            "repeat-style": "repeat-x|repeat-y|[repeat|space|round|no-repeat]{1,2}",
+            "repeating-linear-gradient()": "repeating-linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )",
+            "repeating-radial-gradient()": "repeating-radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )",
+            "rgb()": "rgb( <percentage>{3} [/ <alpha-value>]? )|rgb( <number>{3} [/ <alpha-value>]? )|rgb( <percentage>#{3} , <alpha-value>? )|rgb( <number>#{3} , <alpha-value>? )",
+            "rgba()": "rgba( <percentage>{3} [/ <alpha-value>]? )|rgba( <number>{3} [/ <alpha-value>]? )|rgba( <percentage>#{3} , <alpha-value>? )|rgba( <number>#{3} , <alpha-value>? )",
+            "rotate()": "rotate( [<angle>|<zero>] )",
+            "rotate3d()": "rotate3d( <number> , <number> , <number> , [<angle>|<zero>] )",
+            "rotateX()": "rotateX( [<angle>|<zero>] )",
+            "rotateY()": "rotateY( [<angle>|<zero>] )",
+            "rotateZ()": "rotateZ( [<angle>|<zero>] )",
+            "saturate()": "saturate( <number-percentage> )",
+            "scale()": "scale( <number> , <number>? )",
+            "scale3d()": "scale3d( <number> , <number> , <number> )",
+            "scaleX()": "scaleX( <number> )",
+            "scaleY()": "scaleY( <number> )",
+            "scaleZ()": "scaleZ( <number> )",
+            "self-position": "center|start|end|self-start|self-end|flex-start|flex-end",
+            "shape-radius": "<length-percentage>|closest-side|farthest-side",
+            "skew()": "skew( [<angle>|<zero>] , [<angle>|<zero>]? )",
+            "skewX()": "skewX( [<angle>|<zero>] )",
+            "skewY()": "skewY( [<angle>|<zero>] )",
+            "sepia()": "sepia( <number-percentage> )",
+            "shadow": "inset?&&<length>{2,4}&&<color>?",
+            "shadow-t": "[<length>{2,3}&&<color>?]",
+            "shape": "rect( <top> , <right> , <bottom> , <left> )|rect( <top> <right> <bottom> <left> )",
+            "shape-box": "<box>|margin-box",
+            "side-or-corner": "[left|right]||[top|bottom]",
+            "single-animation": "<time>||<timing-function>||<time>||<single-animation-iteration-count>||<single-animation-direction>||<single-animation-fill-mode>||<single-animation-play-state>||[none|<keyframes-name>]",
+            "single-animation-direction": "normal|reverse|alternate|alternate-reverse",
+            "single-animation-fill-mode": "none|forwards|backwards|both",
+            "single-animation-iteration-count": "infinite|<number>",
+            "single-animation-play-state": "running|paused",
+            "single-transition": "[none|<single-transition-property>]||<time>||<timing-function>||<time>",
+            "single-transition-property": "all|<custom-ident>",
+            "size": "closest-side|farthest-side|closest-corner|farthest-corner|<length>|<length-percentage>{2}",
+            "step-position": "jump-start|jump-end|jump-none|jump-both|start|end",
+            "step-timing-function": "step-start|step-end|steps( <integer> [, <step-position>]? )",
+            "subclass-selector": "<id-selector>|<class-selector>|<attribute-selector>|<pseudo-class-selector>",
+            "supports-condition": "not <supports-in-parens>|<supports-in-parens> [and <supports-in-parens>]*|<supports-in-parens> [or <supports-in-parens>]*",
+            "supports-in-parens": "( <supports-condition> )|<supports-feature>|<general-enclosed>",
+            "supports-feature": "<supports-decl>|<supports-selector-fn>",
+            "supports-decl": "( <declaration> )",
+            "supports-selector-fn": "selector( <complex-selector> )",
+            "symbol": "<string>|<image>|<custom-ident>",
+            "target": "<target-counter()>|<target-counters()>|<target-text()>",
+            "target-counter()": "target-counter( [<string>|<url>] , <custom-ident> , <counter-style>? )",
+            "target-counters()": "target-counters( [<string>|<url>] , <custom-ident> , <string> , <counter-style>? )",
+            "target-text()": "target-text( [<string>|<url>] , [content|before|after|first-letter]? )",
+            "time-percentage": "<time>|<percentage>",
+            "timing-function": "linear|<cubic-bezier-timing-function>|<step-timing-function>",
+            "track-breadth": "<length-percentage>|<flex>|min-content|max-content|auto",
+            "track-list": "[<line-names>? [<track-size>|<track-repeat>]]+ <line-names>?",
+            "track-repeat": "repeat( [<positive-integer>] , [<line-names>? <track-size>]+ <line-names>? )",
+            "track-size": "<track-breadth>|minmax( <inflexible-breadth> , <track-breadth> )|fit-content( [<length>|<percentage>] )",
+            "transform-function": "<matrix()>|<translate()>|<translateX()>|<translateY()>|<scale()>|<scaleX()>|<scaleY()>|<rotate()>|<skew()>|<skewX()>|<skewY()>|<matrix3d()>|<translate3d()>|<translateZ()>|<scale3d()>|<scaleZ()>|<rotate3d()>|<rotateX()>|<rotateY()>|<rotateZ()>|<perspective()>",
+            "transform-list": "<transform-function>+",
+            "translate()": "translate( <length-percentage> , <length-percentage>? )",
+            "translate3d()": "translate3d( <length-percentage> , <length-percentage> , <length> )",
+            "translateX()": "translateX( <length-percentage> )",
+            "translateY()": "translateY( <length-percentage> )",
+            "translateZ()": "translateZ( <length> )",
+            "type-or-unit": "string|color|url|integer|number|length|angle|time|frequency|cap|ch|em|ex|ic|lh|rlh|rem|vb|vi|vw|vh|vmin|vmax|mm|Q|cm|in|pt|pc|px|deg|grad|rad|turn|ms|s|Hz|kHz|%",
+            "type-selector": "<wq-name>|<ns-prefix>? '*'",
+            "var()": "var( <custom-property-name> , <declaration-value>? )",
+            "viewport-length": "auto|<length-percentage>",
+            "wq-name": "<ns-prefix>? <ident-token>",
+            "-legacy-gradient": "<-webkit-gradient()>|<-legacy-linear-gradient>|<-legacy-repeating-linear-gradient>|<-legacy-radial-gradient>|<-legacy-repeating-radial-gradient>",
+            "-legacy-linear-gradient": "-moz-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-linear-gradient( <-legacy-linear-gradient-arguments> )",
+            "-legacy-repeating-linear-gradient": "-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )",
+            "-legacy-linear-gradient-arguments": "[<angle>|<side-or-corner>]? , <color-stop-list>",
+            "-legacy-radial-gradient": "-moz-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-radial-gradient( <-legacy-radial-gradient-arguments> )",
+            "-legacy-repeating-radial-gradient": "-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )",
+            "-legacy-radial-gradient-arguments": "[<position> ,]? [[[<-legacy-radial-gradient-shape>||<-legacy-radial-gradient-size>]|[<length>|<percentage>]{2}] ,]? <color-stop-list>",
+            "-legacy-radial-gradient-size": "closest-side|closest-corner|farthest-side|farthest-corner|contain|cover",
+            "-legacy-radial-gradient-shape": "circle|ellipse",
+            "-non-standard-font": "-apple-system-body|-apple-system-headline|-apple-system-subheadline|-apple-system-caption1|-apple-system-caption2|-apple-system-footnote|-apple-system-short-body|-apple-system-short-headline|-apple-system-short-subheadline|-apple-system-short-caption1|-apple-system-short-footnote|-apple-system-tall-body",
+            "-non-standard-color": "-moz-ButtonDefault|-moz-ButtonHoverFace|-moz-ButtonHoverText|-moz-CellHighlight|-moz-CellHighlightText|-moz-Combobox|-moz-ComboboxText|-moz-Dialog|-moz-DialogText|-moz-dragtargetzone|-moz-EvenTreeRow|-moz-Field|-moz-FieldText|-moz-html-CellHighlight|-moz-html-CellHighlightText|-moz-mac-accentdarkestshadow|-moz-mac-accentdarkshadow|-moz-mac-accentface|-moz-mac-accentlightesthighlight|-moz-mac-accentlightshadow|-moz-mac-accentregularhighlight|-moz-mac-accentregularshadow|-moz-mac-chrome-active|-moz-mac-chrome-inactive|-moz-mac-focusring|-moz-mac-menuselect|-moz-mac-menushadow|-moz-mac-menutextselect|-moz-MenuHover|-moz-MenuHoverText|-moz-MenuBarText|-moz-MenuBarHoverText|-moz-nativehyperlinktext|-moz-OddTreeRow|-moz-win-communicationstext|-moz-win-mediatext|-moz-activehyperlinktext|-moz-default-background-color|-moz-default-color|-moz-hyperlinktext|-moz-visitedhyperlinktext|-webkit-activelink|-webkit-focus-ring-color|-webkit-link|-webkit-text",
+            "-non-standard-image-rendering": "optimize-contrast|-moz-crisp-edges|-o-crisp-edges|-webkit-optimize-contrast",
+            "-non-standard-overflow": "-moz-scrollbars-none|-moz-scrollbars-horizontal|-moz-scrollbars-vertical|-moz-hidden-unscrollable",
+            "-non-standard-width": "fill-available|min-intrinsic|intrinsic|-moz-available|-moz-fit-content|-moz-min-content|-moz-max-content|-webkit-min-content|-webkit-max-content",
+            "-webkit-gradient()": "-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point>|, <-webkit-gradient-radius> , <-webkit-gradient-point>] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )",
+            "-webkit-gradient-color-stop": "from( <color> )|color-stop( [<number-zero-one>|<percentage>] , <color> )|to( <color> )",
+            "-webkit-gradient-point": "[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]",
+            "-webkit-gradient-radius": "<length>|<percentage>",
+            "-webkit-gradient-type": "linear|radial",
+            "-webkit-mask-box-repeat": "repeat|stretch|round",
+            "-webkit-mask-clip-style": "border|border-box|padding|padding-box|content|content-box|text",
+            "-ms-filter-function-list": "<-ms-filter-function>+",
+            "-ms-filter-function": "<-ms-filter-function-progid>|<-ms-filter-function-legacy>",
+            "-ms-filter-function-progid": "'progid:' [<ident-token> '.']* [<ident-token>|<function-token> <any-value>? )]",
+            "-ms-filter-function-legacy": "<ident-token>|<function-token> <any-value>? )",
+            "-ms-filter": "<string>",
+            "age": "child|young|old",
+            "attr-name": "<wq-name>",
+            "attr-fallback": "<any-value>",
+            "border-radius": "<length-percentage>{1,2}",
+            "bottom": "<length>|auto",
+            "generic-voice": "[<age>? <gender> <integer>?]",
+            "gender": "male|female|neutral",
+            "left": "<length>|auto",
+            "mask-image": "<mask-reference>#",
+            "name-repeat": "repeat( [<positive-integer>|auto-fill] , <line-names>+ )",
+            "paint": "none|<color>|<url> [none|<color>]?|context-fill|context-stroke",
+            "page-size": "A5|A4|A3|B5|B4|JIS-B5|JIS-B4|letter|legal|ledger",
+            "ratio": "<integer> / <integer>",
+            "right": "<length>|auto",
+            "svg-length": "<percentage>|<length>|<number>",
+            "svg-writing-mode": "lr-tb|rl-tb|tb-rl|lr|rl|tb",
+            "top": "<length>|auto",
+            "track-group": "'(' [<string>* <track-minmax> <string>*]+ ')' ['[' <positive-integer> ']']?|<track-minmax>",
+            "track-list-v0": "[<string>* <track-group> <string>*]+|none",
+            "track-minmax": "minmax( <track-breadth> , <track-breadth> )|auto|<track-breadth>|fit-content",
+            "x": "<number>",
+            "y": "<number>",
+            "declaration": "<ident-token> : <declaration-value>? ['!' important]?",
+            "declaration-list": "[<declaration>? ';']* <declaration>?",
+            "url": "url( <string> <url-modifier>* )|<url-token>",
+            "url-modifier": "<ident>|<function-token> <any-value> )",
+            "number-zero-one": "<number [0,1]>",
+            "number-one-or-greater": "<number [1,∞]>",
+            "positive-integer": "<integer [0,∞]>",
+            "-non-standard-display": "-ms-inline-flexbox|-ms-grid|-ms-inline-grid|-webkit-flex|-webkit-inline-flex|-webkit-box|-webkit-inline-box|-moz-inline-stack|-moz-box|-moz-inline-box"
+        },
+        "properties": {
+            "--*": "<declaration-value>",
+            "-ms-accelerator": "false|true",
+            "-ms-block-progression": "tb|rl|bt|lr",
+            "-ms-content-zoom-chaining": "none|chained",
+            "-ms-content-zooming": "none|zoom",
+            "-ms-content-zoom-limit": "<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>",
+            "-ms-content-zoom-limit-max": "<percentage>",
+            "-ms-content-zoom-limit-min": "<percentage>",
+            "-ms-content-zoom-snap": "<'-ms-content-zoom-snap-type'>||<'-ms-content-zoom-snap-points'>",
+            "-ms-content-zoom-snap-points": "snapInterval( <percentage> , <percentage> )|snapList( <percentage># )",
+            "-ms-content-zoom-snap-type": "none|proximity|mandatory",
+            "-ms-filter": "<string>",
+            "-ms-flow-from": "[none|<custom-ident>]#",
+            "-ms-flow-into": "[none|<custom-ident>]#",
+            "-ms-grid-columns": "none|<track-list>|<auto-track-list>",
+            "-ms-grid-rows": "none|<track-list>|<auto-track-list>",
+            "-ms-high-contrast-adjust": "auto|none",
+            "-ms-hyphenate-limit-chars": "auto|<integer>{1,3}",
+            "-ms-hyphenate-limit-lines": "no-limit|<integer>",
+            "-ms-hyphenate-limit-zone": "<percentage>|<length>",
+            "-ms-ime-align": "auto|after",
+            "-ms-overflow-style": "auto|none|scrollbar|-ms-autohiding-scrollbar",
+            "-ms-scrollbar-3dlight-color": "<color>",
+            "-ms-scrollbar-arrow-color": "<color>",
+            "-ms-scrollbar-base-color": "<color>",
+            "-ms-scrollbar-darkshadow-color": "<color>",
+            "-ms-scrollbar-face-color": "<color>",
+            "-ms-scrollbar-highlight-color": "<color>",
+            "-ms-scrollbar-shadow-color": "<color>",
+            "-ms-scrollbar-track-color": "<color>",
+            "-ms-scroll-chaining": "chained|none",
+            "-ms-scroll-limit": "<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>",
+            "-ms-scroll-limit-x-max": "auto|<length>",
+            "-ms-scroll-limit-x-min": "<length>",
+            "-ms-scroll-limit-y-max": "auto|<length>",
+            "-ms-scroll-limit-y-min": "<length>",
+            "-ms-scroll-rails": "none|railed",
+            "-ms-scroll-snap-points-x": "snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )",
+            "-ms-scroll-snap-points-y": "snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )",
+            "-ms-scroll-snap-type": "none|proximity|mandatory",
+            "-ms-scroll-snap-x": "<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>",
+            "-ms-scroll-snap-y": "<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>",
+            "-ms-scroll-translation": "none|vertical-to-horizontal",
+            "-ms-text-autospace": "none|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space",
+            "-ms-touch-select": "grippers|none",
+            "-ms-user-select": "none|element|text",
+            "-ms-wrap-flow": "auto|both|start|end|maximum|clear",
+            "-ms-wrap-margin": "<length>",
+            "-ms-wrap-through": "wrap|none",
+            "-moz-appearance": "none|button|button-arrow-down|button-arrow-next|button-arrow-previous|button-arrow-up|button-bevel|button-focus|caret|checkbox|checkbox-container|checkbox-label|checkmenuitem|dualbutton|groupbox|listbox|listitem|menuarrow|menubar|menucheckbox|menuimage|menuitem|menuitemtext|menulist|menulist-button|menulist-text|menulist-textfield|menupopup|menuradio|menuseparator|meterbar|meterchunk|progressbar|progressbar-vertical|progresschunk|progresschunk-vertical|radio|radio-container|radio-label|radiomenuitem|range|range-thumb|resizer|resizerpanel|scale-horizontal|scalethumbend|scalethumb-horizontal|scalethumbstart|scalethumbtick|scalethumb-vertical|scale-vertical|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|separator|sheet|spinner|spinner-downbutton|spinner-textfield|spinner-upbutton|splitter|statusbar|statusbarpanel|tab|tabpanel|tabpanels|tab-scroll-arrow-back|tab-scroll-arrow-forward|textfield|textfield-multiline|toolbar|toolbarbutton|toolbarbutton-dropdown|toolbargripper|toolbox|tooltip|treeheader|treeheadercell|treeheadersortarrow|treeitem|treeline|treetwisty|treetwistyopen|treeview|-moz-mac-unified-toolbar|-moz-win-borderless-glass|-moz-win-browsertabbar-toolbox|-moz-win-communicationstext|-moz-win-communications-toolbox|-moz-win-exclude-glass|-moz-win-glass|-moz-win-mediatext|-moz-win-media-toolbox|-moz-window-button-box|-moz-window-button-box-maximized|-moz-window-button-close|-moz-window-button-maximize|-moz-window-button-minimize|-moz-window-button-restore|-moz-window-frame-bottom|-moz-window-frame-left|-moz-window-frame-right|-moz-window-titlebar|-moz-window-titlebar-maximized",
+            "-moz-binding": "<url>|none",
+            "-moz-border-bottom-colors": "<color>+|none",
+            "-moz-border-left-colors": "<color>+|none",
+            "-moz-border-right-colors": "<color>+|none",
+            "-moz-border-top-colors": "<color>+|none",
+            "-moz-context-properties": "none|[fill|fill-opacity|stroke|stroke-opacity]#",
+            "-moz-float-edge": "border-box|content-box|margin-box|padding-box",
+            "-moz-force-broken-image-icon": "<integer [0,1]>",
+            "-moz-image-region": "<shape>|auto",
+            "-moz-orient": "inline|block|horizontal|vertical",
+            "-moz-outline-radius": "<outline-radius>{1,4} [/ <outline-radius>{1,4}]?",
+            "-moz-outline-radius-bottomleft": "<outline-radius>",
+            "-moz-outline-radius-bottomright": "<outline-radius>",
+            "-moz-outline-radius-topleft": "<outline-radius>",
+            "-moz-outline-radius-topright": "<outline-radius>",
+            "-moz-stack-sizing": "ignore|stretch-to-fit",
+            "-moz-text-blink": "none|blink",
+            "-moz-user-focus": "ignore|normal|select-after|select-before|select-menu|select-same|select-all|none",
+            "-moz-user-input": "auto|none|enabled|disabled",
+            "-moz-user-modify": "read-only|read-write|write-only",
+            "-moz-window-dragging": "drag|no-drag",
+            "-moz-window-shadow": "default|menu|tooltip|sheet|none",
+            "-webkit-appearance": "none|button|button-bevel|caps-lock-indicator|caret|checkbox|default-button|inner-spin-button|listbox|listitem|media-controls-background|media-controls-fullscreen-background|media-current-time-display|media-enter-fullscreen-button|media-exit-fullscreen-button|media-fullscreen-button|media-mute-button|media-overlay-play-button|media-play-button|media-seek-back-button|media-seek-forward-button|media-slider|media-sliderthumb|media-time-remaining-display|media-toggle-closed-captions-button|media-volume-slider|media-volume-slider-container|media-volume-sliderthumb|menulist|menulist-button|menulist-text|menulist-textfield|meter|progress-bar|progress-bar-value|push-button|radio|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbargripper-horizontal|scrollbargripper-vertical|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|searchfield-cancel-button|searchfield-decoration|searchfield-results-button|searchfield-results-decoration|slider-horizontal|slider-vertical|sliderthumb-horizontal|sliderthumb-vertical|square-button|textarea|textfield|-apple-pay-button",
+            "-webkit-border-before": "<'border-width'>||<'border-style'>||<'color'>",
+            "-webkit-border-before-color": "<'color'>",
+            "-webkit-border-before-style": "<'border-style'>",
+            "-webkit-border-before-width": "<'border-width'>",
+            "-webkit-box-reflect": "[above|below|right|left]? <length>? <image>?",
+            "-webkit-line-clamp": "none|<integer>",
+            "-webkit-mask": "[<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||[<box>|border|padding|content|text]||[<box>|border|padding|content]]#",
+            "-webkit-mask-attachment": "<attachment>#",
+            "-webkit-mask-clip": "[<box>|border|padding|content|text]#",
+            "-webkit-mask-composite": "<composite-style>#",
+            "-webkit-mask-image": "<mask-reference>#",
+            "-webkit-mask-origin": "[<box>|border|padding|content]#",
+            "-webkit-mask-position": "<position>#",
+            "-webkit-mask-position-x": "[<length-percentage>|left|center|right]#",
+            "-webkit-mask-position-y": "[<length-percentage>|top|center|bottom]#",
+            "-webkit-mask-repeat": "<repeat-style>#",
+            "-webkit-mask-repeat-x": "repeat|no-repeat|space|round",
+            "-webkit-mask-repeat-y": "repeat|no-repeat|space|round",
+            "-webkit-mask-size": "<bg-size>#",
+            "-webkit-overflow-scrolling": "auto|touch",
+            "-webkit-tap-highlight-color": "<color>",
+            "-webkit-text-fill-color": "<color>",
+            "-webkit-text-stroke": "<length>||<color>",
+            "-webkit-text-stroke-color": "<color>",
+            "-webkit-text-stroke-width": "<length>",
+            "-webkit-touch-callout": "default|none",
+            "-webkit-user-modify": "read-only|read-write|read-write-plaintext-only",
+            "align-content": "normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>",
+            "align-items": "normal|stretch|<baseline-position>|[<overflow-position>? <self-position>]",
+            "align-self": "auto|normal|stretch|<baseline-position>|<overflow-position>? <self-position>",
+            "align-tracks": "[normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>]#",
+            "all": "initial|inherit|unset|revert",
+            "animation": "<single-animation>#",
+            "animation-delay": "<time>#",
+            "animation-direction": "<single-animation-direction>#",
+            "animation-duration": "<time>#",
+            "animation-fill-mode": "<single-animation-fill-mode>#",
+            "animation-iteration-count": "<single-animation-iteration-count>#",
+            "animation-name": "[none|<keyframes-name>]#",
+            "animation-play-state": "<single-animation-play-state>#",
+            "animation-timing-function": "<timing-function>#",
+            "appearance": "none|auto|textfield|menulist-button|<compat-auto>",
+            "aspect-ratio": "auto|<ratio>",
+            "azimuth": "<angle>|[[left-side|far-left|left|center-left|center|center-right|right|far-right|right-side]||behind]|leftwards|rightwards",
+            "backdrop-filter": "none|<filter-function-list>",
+            "backface-visibility": "visible|hidden",
+            "background": "[<bg-layer> ,]* <final-bg-layer>",
+            "background-attachment": "<attachment>#",
+            "background-blend-mode": "<blend-mode>#",
+            "background-clip": "<box>#",
+            "background-color": "<color>",
+            "background-image": "<bg-image>#",
+            "background-origin": "<box>#",
+            "background-position": "<bg-position>#",
+            "background-position-x": "[center|[[left|right|x-start|x-end]? <length-percentage>?]!]#",
+            "background-position-y": "[center|[[top|bottom|y-start|y-end]? <length-percentage>?]!]#",
+            "background-repeat": "<repeat-style>#",
+            "background-size": "<bg-size>#",
+            "block-overflow": "clip|ellipsis|<string>",
+            "block-size": "<'width'>",
+            "border": "<line-width>||<line-style>||<color>",
+            "border-block": "<'border-top-width'>||<'border-top-style'>||<'color'>",
+            "border-block-color": "<'border-top-color'>{1,2}",
+            "border-block-style": "<'border-top-style'>",
+            "border-block-width": "<'border-top-width'>",
+            "border-block-end": "<'border-top-width'>||<'border-top-style'>||<'color'>",
+            "border-block-end-color": "<'border-top-color'>",
+            "border-block-end-style": "<'border-top-style'>",
+            "border-block-end-width": "<'border-top-width'>",
+            "border-block-start": "<'border-top-width'>||<'border-top-style'>||<'color'>",
+            "border-block-start-color": "<'border-top-color'>",
+            "border-block-start-style": "<'border-top-style'>",
+            "border-block-start-width": "<'border-top-width'>",
+            "border-bottom": "<line-width>||<line-style>||<color>",
+            "border-bottom-color": "<'border-top-color'>",
+            "border-bottom-left-radius": "<length-percentage>{1,2}",
+            "border-bottom-right-radius": "<length-percentage>{1,2}",
+            "border-bottom-style": "<line-style>",
+            "border-bottom-width": "<line-width>",
+            "border-collapse": "collapse|separate",
+            "border-color": "<color>{1,4}",
+            "border-end-end-radius": "<length-percentage>{1,2}",
+            "border-end-start-radius": "<length-percentage>{1,2}",
+            "border-image": "<'border-image-source'>||<'border-image-slice'> [/ <'border-image-width'>|/ <'border-image-width'>? / <'border-image-outset'>]?||<'border-image-repeat'>",
+            "border-image-outset": "[<length>|<number>]{1,4}",
+            "border-image-repeat": "[stretch|repeat|round|space]{1,2}",
+            "border-image-slice": "<number-percentage>{1,4}&&fill?",
+            "border-image-source": "none|<image>",
+            "border-image-width": "[<length-percentage>|<number>|auto]{1,4}",
+            "border-inline": "<'border-top-width'>||<'border-top-style'>||<'color'>",
+            "border-inline-end": "<'border-top-width'>||<'border-top-style'>||<'color'>",
+            "border-inline-color": "<'border-top-color'>{1,2}",
+            "border-inline-style": "<'border-top-style'>",
+            "border-inline-width": "<'border-top-width'>",
+            "border-inline-end-color": "<'border-top-color'>",
+            "border-inline-end-style": "<'border-top-style'>",
+            "border-inline-end-width": "<'border-top-width'>",
+            "border-inline-start": "<'border-top-width'>||<'border-top-style'>||<'color'>",
+            "border-inline-start-color": "<'border-top-color'>",
+            "border-inline-start-style": "<'border-top-style'>",
+            "border-inline-start-width": "<'border-top-width'>",
+            "border-left": "<line-width>||<line-style>||<color>",
+            "border-left-color": "<color>",
+            "border-left-style": "<line-style>",
+            "border-left-width": "<line-width>",
+            "border-radius": "<length-percentage>{1,4} [/ <length-percentage>{1,4}]?",
+            "border-right": "<line-width>||<line-style>||<color>",
+            "border-right-color": "<color>",
+            "border-right-style": "<line-style>",
+            "border-right-width": "<line-width>",
+            "border-spacing": "<length> <length>?",
+            "border-start-end-radius": "<length-percentage>{1,2}",
+            "border-start-start-radius": "<length-percentage>{1,2}",
+            "border-style": "<line-style>{1,4}",
+            "border-top": "<line-width>||<line-style>||<color>",
+            "border-top-color": "<color>",
+            "border-top-left-radius": "<length-percentage>{1,2}",
+            "border-top-right-radius": "<length-percentage>{1,2}",
+            "border-top-style": "<line-style>",
+            "border-top-width": "<line-width>",
+            "border-width": "<line-width>{1,4}",
+            "bottom": "<length>|<percentage>|auto",
+            "box-align": "start|center|end|baseline|stretch",
+            "box-decoration-break": "slice|clone",
+            "box-direction": "normal|reverse|inherit",
+            "box-flex": "<number>",
+            "box-flex-group": "<integer>",
+            "box-lines": "single|multiple",
+            "box-ordinal-group": "<integer>",
+            "box-orient": "horizontal|vertical|inline-axis|block-axis|inherit",
+            "box-pack": "start|center|end|justify",
+            "box-shadow": "none|<shadow>#",
+            "box-sizing": "content-box|border-box",
+            "break-after": "auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region",
+            "break-before": "auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region",
+            "break-inside": "auto|avoid|avoid-page|avoid-column|avoid-region",
+            "caption-side": "top|bottom|block-start|block-end|inline-start|inline-end",
+            "caret-color": "auto|<color>",
+            "clear": "none|left|right|both|inline-start|inline-end",
+            "clip": "<shape>|auto",
+            "clip-path": "<clip-source>|[<basic-shape>||<geometry-box>]|none",
+            "color": "<color>",
+            "color-adjust": "economy|exact",
+            "column-count": "<integer>|auto",
+            "column-fill": "auto|balance|balance-all",
+            "column-gap": "normal|<length-percentage>",
+            "column-rule": "<'column-rule-width'>||<'column-rule-style'>||<'column-rule-color'>",
+            "column-rule-color": "<color>",
+            "column-rule-style": "<'border-style'>",
+            "column-rule-width": "<'border-width'>",
+            "column-span": "none|all",
+            "column-width": "<length>|auto",
+            "columns": "<'column-width'>||<'column-count'>",
+            "contain": "none|strict|content|[size||layout||style||paint]",
+            "content": "normal|none|[<content-replacement>|<content-list>] [/ <string>]?",
+            "counter-increment": "[<custom-ident> <integer>?]+|none",
+            "counter-reset": "[<custom-ident> <integer>?]+|none",
+            "counter-set": "[<custom-ident> <integer>?]+|none",
+            "cursor": "[[<url> [<x> <y>]? ,]* [auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|e-resize|n-resize|ne-resize|nw-resize|s-resize|se-resize|sw-resize|w-resize|ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize|row-resize|all-scroll|zoom-in|zoom-out|grab|grabbing|hand|-webkit-grab|-webkit-grabbing|-webkit-zoom-in|-webkit-zoom-out|-moz-grab|-moz-grabbing|-moz-zoom-in|-moz-zoom-out]]",
+            "direction": "ltr|rtl",
+            "display": "[<display-outside>||<display-inside>]|<display-listitem>|<display-internal>|<display-box>|<display-legacy>|<-non-standard-display>",
+            "empty-cells": "show|hide",
+            "filter": "none|<filter-function-list>|<-ms-filter-function-list>",
+            "flex": "none|[<'flex-grow'> <'flex-shrink'>?||<'flex-basis'>]",
+            "flex-basis": "content|<'width'>",
+            "flex-direction": "row|row-reverse|column|column-reverse",
+            "flex-flow": "<'flex-direction'>||<'flex-wrap'>",
+            "flex-grow": "<number>",
+            "flex-shrink": "<number>",
+            "flex-wrap": "nowrap|wrap|wrap-reverse",
+            "float": "left|right|none|inline-start|inline-end",
+            "font": "[[<'font-style'>||<font-variant-css21>||<'font-weight'>||<'font-stretch'>]? <'font-size'> [/ <'line-height'>]? <'font-family'>]|caption|icon|menu|message-box|small-caption|status-bar",
+            "font-family": "[<family-name>|<generic-family>]#",
+            "font-feature-settings": "normal|<feature-tag-value>#",
+            "font-kerning": "auto|normal|none",
+            "font-language-override": "normal|<string>",
+            "font-optical-sizing": "auto|none",
+            "font-variation-settings": "normal|[<string> <number>]#",
+            "font-size": "<absolute-size>|<relative-size>|<length-percentage>",
+            "font-size-adjust": "none|<number>",
+            "font-smooth": "auto|never|always|<absolute-size>|<length>",
+            "font-stretch": "<font-stretch-absolute>",
+            "font-style": "normal|italic|oblique <angle>?",
+            "font-synthesis": "none|[weight||style]",
+            "font-variant": "normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]",
+            "font-variant-alternates": "normal|[stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )]",
+            "font-variant-caps": "normal|small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps",
+            "font-variant-east-asian": "normal|[<east-asian-variant-values>||<east-asian-width-values>||ruby]",
+            "font-variant-ligatures": "normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>]",
+            "font-variant-numeric": "normal|[<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero]",
+            "font-variant-position": "normal|sub|super",
+            "font-weight": "<font-weight-absolute>|bolder|lighter",
+            "gap": "<'row-gap'> <'column-gap'>?",
+            "grid": "<'grid-template'>|<'grid-template-rows'> / [auto-flow&&dense?] <'grid-auto-columns'>?|[auto-flow&&dense?] <'grid-auto-rows'>? / <'grid-template-columns'>",
+            "grid-area": "<grid-line> [/ <grid-line>]{0,3}",
+            "grid-auto-columns": "<track-size>+",
+            "grid-auto-flow": "[row|column]||dense",
+            "grid-auto-rows": "<track-size>+",
+            "grid-column": "<grid-line> [/ <grid-line>]?",
+            "grid-column-end": "<grid-line>",
+            "grid-column-gap": "<length-percentage>",
+            "grid-column-start": "<grid-line>",
+            "grid-gap": "<'grid-row-gap'> <'grid-column-gap'>?",
+            "grid-row": "<grid-line> [/ <grid-line>]?",
+            "grid-row-end": "<grid-line>",
+            "grid-row-gap": "<length-percentage>",
+            "grid-row-start": "<grid-line>",
+            "grid-template": "none|[<'grid-template-rows'> / <'grid-template-columns'>]|[<line-names>? <string> <track-size>? <line-names>?]+ [/ <explicit-track-list>]?",
+            "grid-template-areas": "none|<string>+",
+            "grid-template-columns": "none|<track-list>|<auto-track-list>|subgrid <line-name-list>?",
+            "grid-template-rows": "none|<track-list>|<auto-track-list>|subgrid <line-name-list>?",
+            "hanging-punctuation": "none|[first||[force-end|allow-end]||last]",
+            "height": "auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )",
+            "hyphens": "none|manual|auto",
+            "image-orientation": "from-image|<angle>|[<angle>? flip]",
+            "image-rendering": "auto|crisp-edges|pixelated|optimizeSpeed|optimizeQuality|<-non-standard-image-rendering>",
+            "image-resolution": "[from-image||<resolution>]&&snap?",
+            "ime-mode": "auto|normal|active|inactive|disabled",
+            "initial-letter": "normal|[<number> <integer>?]",
+            "initial-letter-align": "[auto|alphabetic|hanging|ideographic]",
+            "inline-size": "<'width'>",
+            "inset": "<'top'>{1,4}",
+            "inset-block": "<'top'>{1,2}",
+            "inset-block-end": "<'top'>",
+            "inset-block-start": "<'top'>",
+            "inset-inline": "<'top'>{1,2}",
+            "inset-inline-end": "<'top'>",
+            "inset-inline-start": "<'top'>",
+            "isolation": "auto|isolate",
+            "justify-content": "normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]",
+            "justify-items": "normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]|legacy|legacy&&[left|right|center]",
+            "justify-self": "auto|normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]",
+            "justify-tracks": "[normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]]#",
+            "left": "<length>|<percentage>|auto",
+            "letter-spacing": "normal|<length-percentage>",
+            "line-break": "auto|loose|normal|strict|anywhere",
+            "line-clamp": "none|<integer>",
+            "line-height": "normal|<number>|<length>|<percentage>",
+            "line-height-step": "<length>",
+            "list-style": "<'list-style-type'>||<'list-style-position'>||<'list-style-image'>",
+            "list-style-image": "<url>|none",
+            "list-style-position": "inside|outside",
+            "list-style-type": "<counter-style>|<string>|none",
+            "margin": "[<length>|<percentage>|auto]{1,4}",
+            "margin-block": "<'margin-left'>{1,2}",
+            "margin-block-end": "<'margin-left'>",
+            "margin-block-start": "<'margin-left'>",
+            "margin-bottom": "<length>|<percentage>|auto",
+            "margin-inline": "<'margin-left'>{1,2}",
+            "margin-inline-end": "<'margin-left'>",
+            "margin-inline-start": "<'margin-left'>",
+            "margin-left": "<length>|<percentage>|auto",
+            "margin-right": "<length>|<percentage>|auto",
+            "margin-top": "<length>|<percentage>|auto",
+            "margin-trim": "none|in-flow|all",
+            "mask": "<mask-layer>#",
+            "mask-border": "<'mask-border-source'>||<'mask-border-slice'> [/ <'mask-border-width'>? [/ <'mask-border-outset'>]?]?||<'mask-border-repeat'>||<'mask-border-mode'>",
+            "mask-border-mode": "luminance|alpha",
+            "mask-border-outset": "[<length>|<number>]{1,4}",
+            "mask-border-repeat": "[stretch|repeat|round|space]{1,2}",
+            "mask-border-slice": "<number-percentage>{1,4} fill?",
+            "mask-border-source": "none|<image>",
+            "mask-border-width": "[<length-percentage>|<number>|auto]{1,4}",
+            "mask-clip": "[<geometry-box>|no-clip]#",
+            "mask-composite": "<compositing-operator>#",
+            "mask-image": "<mask-reference>#",
+            "mask-mode": "<masking-mode>#",
+            "mask-origin": "<geometry-box>#",
+            "mask-position": "<position>#",
+            "mask-repeat": "<repeat-style>#",
+            "mask-size": "<bg-size>#",
+            "mask-type": "luminance|alpha",
+            "masonry-auto-flow": "[pack|next]||[definite-first|ordered]",
+            "math-style": "normal|compact",
+            "max-block-size": "<'max-width'>",
+            "max-height": "none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )",
+            "max-inline-size": "<'max-width'>",
+            "max-lines": "none|<integer>",
+            "max-width": "none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>",
+            "min-block-size": "<'min-width'>",
+            "min-height": "auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )",
+            "min-inline-size": "<'min-width'>",
+            "min-width": "auto|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>",
+            "mix-blend-mode": "<blend-mode>",
+            "object-fit": "fill|contain|cover|none|scale-down",
+            "object-position": "<position>",
+            "offset": "[<'offset-position'>? [<'offset-path'> [<'offset-distance'>||<'offset-rotate'>]?]?]! [/ <'offset-anchor'>]?",
+            "offset-anchor": "auto|<position>",
+            "offset-distance": "<length-percentage>",
+            "offset-path": "none|ray( [<angle>&&<size>&&contain?] )|<path()>|<url>|[<basic-shape>||<geometry-box>]",
+            "offset-position": "auto|<position>",
+            "offset-rotate": "[auto|reverse]||<angle>",
+            "opacity": "<alpha-value>",
+            "order": "<integer>",
+            "orphans": "<integer>",
+            "outline": "[<'outline-color'>||<'outline-style'>||<'outline-width'>]",
+            "outline-color": "<color>|invert",
+            "outline-offset": "<length>",
+            "outline-style": "auto|<'border-style'>",
+            "outline-width": "<line-width>",
+            "overflow": "[visible|hidden|clip|scroll|auto]{1,2}|<-non-standard-overflow>",
+            "overflow-anchor": "auto|none",
+            "overflow-block": "visible|hidden|clip|scroll|auto",
+            "overflow-clip-box": "padding-box|content-box",
+            "overflow-inline": "visible|hidden|clip|scroll|auto",
+            "overflow-wrap": "normal|break-word|anywhere",
+            "overflow-x": "visible|hidden|clip|scroll|auto",
+            "overflow-y": "visible|hidden|clip|scroll|auto",
+            "overscroll-behavior": "[contain|none|auto]{1,2}",
+            "overscroll-behavior-block": "contain|none|auto",
+            "overscroll-behavior-inline": "contain|none|auto",
+            "overscroll-behavior-x": "contain|none|auto",
+            "overscroll-behavior-y": "contain|none|auto",
+            "padding": "[<length>|<percentage>]{1,4}",
+            "padding-block": "<'padding-left'>{1,2}",
+            "padding-block-end": "<'padding-left'>",
+            "padding-block-start": "<'padding-left'>",
+            "padding-bottom": "<length>|<percentage>",
+            "padding-inline": "<'padding-left'>{1,2}",
+            "padding-inline-end": "<'padding-left'>",
+            "padding-inline-start": "<'padding-left'>",
+            "padding-left": "<length>|<percentage>",
+            "padding-right": "<length>|<percentage>",
+            "padding-top": "<length>|<percentage>",
+            "page-break-after": "auto|always|avoid|left|right|recto|verso",
+            "page-break-before": "auto|always|avoid|left|right|recto|verso",
+            "page-break-inside": "auto|avoid",
+            "paint-order": "normal|[fill||stroke||markers]",
+            "perspective": "none|<length>",
+            "perspective-origin": "<position>",
+            "place-content": "<'align-content'> <'justify-content'>?",
+            "place-items": "<'align-items'> <'justify-items'>?",
+            "place-self": "<'align-self'> <'justify-self'>?",
+            "pointer-events": "auto|none|visiblePainted|visibleFill|visibleStroke|visible|painted|fill|stroke|all|inherit",
+            "position": "static|relative|absolute|sticky|fixed|-webkit-sticky",
+            "quotes": "none|auto|[<string> <string>]+",
+            "resize": "none|both|horizontal|vertical|block|inline",
+            "right": "<length>|<percentage>|auto",
+            "rotate": "none|<angle>|[x|y|z|<number>{3}]&&<angle>",
+            "row-gap": "normal|<length-percentage>",
+            "ruby-align": "start|center|space-between|space-around",
+            "ruby-merge": "separate|collapse|auto",
+            "ruby-position": "over|under|inter-character",
+            "scale": "none|<number>{1,3}",
+            "scrollbar-color": "auto|dark|light|<color>{2}",
+            "scrollbar-gutter": "auto|[stable|always]&&both?&&force?",
+            "scrollbar-width": "auto|thin|none",
+            "scroll-behavior": "auto|smooth",
+            "scroll-margin": "<length>{1,4}",
+            "scroll-margin-block": "<length>{1,2}",
+            "scroll-margin-block-start": "<length>",
+            "scroll-margin-block-end": "<length>",
+            "scroll-margin-bottom": "<length>",
+            "scroll-margin-inline": "<length>{1,2}",
+            "scroll-margin-inline-start": "<length>",
+            "scroll-margin-inline-end": "<length>",
+            "scroll-margin-left": "<length>",
+            "scroll-margin-right": "<length>",
+            "scroll-margin-top": "<length>",
+            "scroll-padding": "[auto|<length-percentage>]{1,4}",
+            "scroll-padding-block": "[auto|<length-percentage>]{1,2}",
+            "scroll-padding-block-start": "auto|<length-percentage>",
+            "scroll-padding-block-end": "auto|<length-percentage>",
+            "scroll-padding-bottom": "auto|<length-percentage>",
+            "scroll-padding-inline": "[auto|<length-percentage>]{1,2}",
+            "scroll-padding-inline-start": "auto|<length-percentage>",
+            "scroll-padding-inline-end": "auto|<length-percentage>",
+            "scroll-padding-left": "auto|<length-percentage>",
+            "scroll-padding-right": "auto|<length-percentage>",
+            "scroll-padding-top": "auto|<length-percentage>",
+            "scroll-snap-align": "[none|start|end|center]{1,2}",
+            "scroll-snap-coordinate": "none|<position>#",
+            "scroll-snap-destination": "<position>",
+            "scroll-snap-points-x": "none|repeat( <length-percentage> )",
+            "scroll-snap-points-y": "none|repeat( <length-percentage> )",
+            "scroll-snap-stop": "normal|always",
+            "scroll-snap-type": "none|[x|y|block|inline|both] [mandatory|proximity]?",
+            "scroll-snap-type-x": "none|mandatory|proximity",
+            "scroll-snap-type-y": "none|mandatory|proximity",
+            "shape-image-threshold": "<alpha-value>",
+            "shape-margin": "<length-percentage>",
+            "shape-outside": "none|<shape-box>||<basic-shape>|<image>",
+            "tab-size": "<integer>|<length>",
+            "table-layout": "auto|fixed",
+            "text-align": "start|end|left|right|center|justify|match-parent",
+            "text-align-last": "auto|start|end|left|right|center|justify",
+            "text-combine-upright": "none|all|[digits <integer>?]",
+            "text-decoration": "<'text-decoration-line'>||<'text-decoration-style'>||<'text-decoration-color'>||<'text-decoration-thickness'>",
+            "text-decoration-color": "<color>",
+            "text-decoration-line": "none|[underline||overline||line-through||blink]|spelling-error|grammar-error",
+            "text-decoration-skip": "none|[objects||[spaces|[leading-spaces||trailing-spaces]]||edges||box-decoration]",
+            "text-decoration-skip-ink": "auto|all|none",
+            "text-decoration-style": "solid|double|dotted|dashed|wavy",
+            "text-decoration-thickness": "auto|from-font|<length>|<percentage>",
+            "text-emphasis": "<'text-emphasis-style'>||<'text-emphasis-color'>",
+            "text-emphasis-color": "<color>",
+            "text-emphasis-position": "[over|under]&&[right|left]",
+            "text-emphasis-style": "none|[[filled|open]||[dot|circle|double-circle|triangle|sesame]]|<string>",
+            "text-indent": "<length-percentage>&&hanging?&&each-line?",
+            "text-justify": "auto|inter-character|inter-word|none",
+            "text-orientation": "mixed|upright|sideways",
+            "text-overflow": "[clip|ellipsis|<string>]{1,2}",
+            "text-rendering": "auto|optimizeSpeed|optimizeLegibility|geometricPrecision",
+            "text-shadow": "none|<shadow-t>#",
+            "text-size-adjust": "none|auto|<percentage>",
+            "text-transform": "none|capitalize|uppercase|lowercase|full-width|full-size-kana",
+            "text-underline-offset": "auto|<length>|<percentage>",
+            "text-underline-position": "auto|from-font|[under||[left|right]]",
+            "top": "<length>|<percentage>|auto",
+            "touch-action": "auto|none|[[pan-x|pan-left|pan-right]||[pan-y|pan-up|pan-down]||pinch-zoom]|manipulation",
+            "transform": "none|<transform-list>",
+            "transform-box": "content-box|border-box|fill-box|stroke-box|view-box",
+            "transform-origin": "[<length-percentage>|left|center|right|top|bottom]|[[<length-percentage>|left|center|right]&&[<length-percentage>|top|center|bottom]] <length>?",
+            "transform-style": "flat|preserve-3d",
+            "transition": "<single-transition>#",
+            "transition-delay": "<time>#",
+            "transition-duration": "<time>#",
+            "transition-property": "none|<single-transition-property>#",
+            "transition-timing-function": "<timing-function>#",
+            "translate": "none|<length-percentage> [<length-percentage> <length>?]?",
+            "unicode-bidi": "normal|embed|isolate|bidi-override|isolate-override|plaintext|-moz-isolate|-moz-isolate-override|-moz-plaintext|-webkit-isolate|-webkit-isolate-override|-webkit-plaintext",
+            "user-select": "auto|text|none|contain|all",
+            "vertical-align": "baseline|sub|super|text-top|text-bottom|middle|top|bottom|<percentage>|<length>",
+            "visibility": "visible|hidden|collapse",
+            "white-space": "normal|pre|nowrap|pre-wrap|pre-line|break-spaces",
+            "widows": "<integer>",
+            "width": "auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )|fit-content|-moz-fit-content|-webkit-fit-content",
+            "will-change": "auto|<animateable-feature>#",
+            "word-break": "normal|break-all|keep-all|break-word",
+            "word-spacing": "normal|<length-percentage>",
+            "word-wrap": "normal|break-word",
+            "writing-mode": "horizontal-tb|vertical-rl|vertical-lr|sideways-rl|sideways-lr|<svg-writing-mode>",
+            "z-index": "auto|<integer>",
+            "zoom": "normal|reset|<number>|<percentage>",
+            "-moz-background-clip": "padding|border",
+            "-moz-border-radius-bottomleft": "<'border-bottom-left-radius'>",
+            "-moz-border-radius-bottomright": "<'border-bottom-right-radius'>",
+            "-moz-border-radius-topleft": "<'border-top-left-radius'>",
+            "-moz-border-radius-topright": "<'border-bottom-right-radius'>",
+            "-moz-control-character-visibility": "visible|hidden",
+            "-moz-osx-font-smoothing": "auto|grayscale",
+            "-moz-user-select": "none|text|all|-moz-none",
+            "-ms-flex-align": "start|end|center|baseline|stretch",
+            "-ms-flex-item-align": "auto|start|end|center|baseline|stretch",
+            "-ms-flex-line-pack": "start|end|center|justify|distribute|stretch",
+            "-ms-flex-negative": "<'flex-shrink'>",
+            "-ms-flex-pack": "start|end|center|justify|distribute",
+            "-ms-flex-order": "<integer>",
+            "-ms-flex-positive": "<'flex-grow'>",
+            "-ms-flex-preferred-size": "<'flex-basis'>",
+            "-ms-interpolation-mode": "nearest-neighbor|bicubic",
+            "-ms-grid-column-align": "start|end|center|stretch",
+            "-ms-grid-row-align": "start|end|center|stretch",
+            "-ms-hyphenate-limit-last": "none|always|column|page|spread",
+            "-webkit-background-clip": "[<box>|border|padding|content|text]#",
+            "-webkit-column-break-after": "always|auto|avoid",
+            "-webkit-column-break-before": "always|auto|avoid",
+            "-webkit-column-break-inside": "always|auto|avoid",
+            "-webkit-font-smoothing": "auto|none|antialiased|subpixel-antialiased",
+            "-webkit-mask-box-image": "[<url>|<gradient>|none] [<length-percentage>{4} <-webkit-mask-box-repeat>{2}]?",
+            "-webkit-print-color-adjust": "economy|exact",
+            "-webkit-text-security": "none|circle|disc|square",
+            "-webkit-user-drag": "none|element|auto",
+            "-webkit-user-select": "auto|none|text|all",
+            "alignment-baseline": "auto|baseline|before-edge|text-before-edge|middle|central|after-edge|text-after-edge|ideographic|alphabetic|hanging|mathematical",
+            "baseline-shift": "baseline|sub|super|<svg-length>",
+            "behavior": "<url>+",
+            "clip-rule": "nonzero|evenodd",
+            "cue": "<'cue-before'> <'cue-after'>?",
+            "cue-after": "<url> <decibel>?|none",
+            "cue-before": "<url> <decibel>?|none",
+            "dominant-baseline": "auto|use-script|no-change|reset-size|ideographic|alphabetic|hanging|mathematical|central|middle|text-after-edge|text-before-edge",
+            "fill": "<paint>",
+            "fill-opacity": "<number-zero-one>",
+            "fill-rule": "nonzero|evenodd",
+            "glyph-orientation-horizontal": "<angle>",
+            "glyph-orientation-vertical": "<angle>",
+            "kerning": "auto|<svg-length>",
+            "marker": "none|<url>",
+            "marker-end": "none|<url>",
+            "marker-mid": "none|<url>",
+            "marker-start": "none|<url>",
+            "pause": "<'pause-before'> <'pause-after'>?",
+            "pause-after": "<time>|none|x-weak|weak|medium|strong|x-strong",
+            "pause-before": "<time>|none|x-weak|weak|medium|strong|x-strong",
+            "rest": "<'rest-before'> <'rest-after'>?",
+            "rest-after": "<time>|none|x-weak|weak|medium|strong|x-strong",
+            "rest-before": "<time>|none|x-weak|weak|medium|strong|x-strong",
+            "shape-rendering": "auto|optimizeSpeed|crispEdges|geometricPrecision",
+            "src": "[<url> [format( <string># )]?|local( <family-name> )]#",
+            "speak": "auto|none|normal",
+            "speak-as": "normal|spell-out||digits||[literal-punctuation|no-punctuation]",
+            "stroke": "<paint>",
+            "stroke-dasharray": "none|[<svg-length>+]#",
+            "stroke-dashoffset": "<svg-length>",
+            "stroke-linecap": "butt|round|square",
+            "stroke-linejoin": "miter|round|bevel",
+            "stroke-miterlimit": "<number-one-or-greater>",
+            "stroke-opacity": "<number-zero-one>",
+            "stroke-width": "<svg-length>",
+            "text-anchor": "start|middle|end",
+            "unicode-range": "<urange>#",
+            "voice-balance": "<number>|left|center|right|leftwards|rightwards",
+            "voice-duration": "auto|<time>",
+            "voice-family": "[[<family-name>|<generic-voice>] ,]* [<family-name>|<generic-voice>]|preserve",
+            "voice-pitch": "<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]",
+            "voice-range": "<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]",
+            "voice-rate": "[normal|x-slow|slow|medium|fast|x-fast]||<percentage>",
+            "voice-stress": "normal|strong|moderate|none|reduced",
+            "voice-volume": "silent|[[x-soft|soft|medium|loud|x-loud]||<decibel>]"
+        },
+        "atrules": {
+            "charset": {
+                "prelude": "<string>",
+                "descriptors": null
+            },
+            "counter-style": {
+                "prelude": "<counter-style-name>",
+                "descriptors": {
+                    "additive-symbols": "[<integer>&&<symbol>]#",
+                    "fallback": "<counter-style-name>",
+                    "negative": "<symbol> <symbol>?",
+                    "pad": "<integer>&&<symbol>",
+                    "prefix": "<symbol>",
+                    "range": "[[<integer>|infinite]{2}]#|auto",
+                    "speak-as": "auto|bullets|numbers|words|spell-out|<counter-style-name>",
+                    "suffix": "<symbol>",
+                    "symbols": "<symbol>+",
+                    "system": "cyclic|numeric|alphabetic|symbolic|additive|[fixed <integer>?]|[extends <counter-style-name>]"
+                }
+            },
+            "document": {
+                "prelude": "[<url>|url-prefix( <string> )|domain( <string> )|media-document( <string> )|regexp( <string> )]#",
+                "descriptors": null
+            },
+            "font-face": {
+                "prelude": null,
+                "descriptors": {
+                    "font-display": "[auto|block|swap|fallback|optional]",
+                    "font-family": "<family-name>",
+                    "font-feature-settings": "normal|<feature-tag-value>#",
+                    "font-variation-settings": "normal|[<string> <number>]#",
+                    "font-stretch": "<font-stretch-absolute>{1,2}",
+                    "font-style": "normal|italic|oblique <angle>{0,2}",
+                    "font-weight": "<font-weight-absolute>{1,2}",
+                    "font-variant": "normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]",
+                    "src": "[<url> [format( <string># )]?|local( <family-name> )]#",
+                    "unicode-range": "<urange>#"
+                }
+            },
+            "font-feature-values": {
+                "prelude": "<family-name>#",
+                "descriptors": null
+            },
+            "import": {
+                "prelude": "[<string>|<url>] [<media-query-list>]?",
+                "descriptors": null
+            },
+            "keyframes": {
+                "prelude": "<keyframes-name>",
+                "descriptors": null
+            },
+            "media": {
+                "prelude": "<media-query-list>",
+                "descriptors": null
+            },
+            "namespace": {
+                "prelude": "<namespace-prefix>? [<string>|<url>]",
+                "descriptors": null
+            },
+            "page": {
+                "prelude": "<page-selector-list>",
+                "descriptors": {
+                    "bleed": "auto|<length>",
+                    "marks": "none|[crop||cross]",
+                    "size": "<length>{1,2}|auto|[<page-size>||[portrait|landscape]]"
+                }
+            },
+            "property": {
+                "prelude": "<custom-property-name>",
+                "descriptors": {
+                    "syntax": "<string>",
+                    "inherits": "true|false",
+                    "initial-value": "<string>"
+                }
+            },
+            "supports": {
+                "prelude": "<supports-condition>",
+                "descriptors": null
+            },
+            "viewport": {
+                "prelude": null,
+                "descriptors": {
+                    "height": "<viewport-length>{1,2}",
+                    "max-height": "<viewport-length>",
+                    "max-width": "<viewport-length>",
+                    "max-zoom": "auto|<number>|<percentage>",
+                    "min-height": "<viewport-length>",
+                    "min-width": "<viewport-length>",
+                    "min-zoom": "auto|<number>|<percentage>",
+                    "orientation": "auto|portrait|landscape",
+                    "user-zoom": "zoom|fixed",
+                    "viewport-fit": "auto|contain|cover",
+                    "width": "<viewport-length>{1,2}",
+                    "zoom": "auto|<number>|<percentage>"
+                }
+            }
+        }
+    };
+
+    var cmpChar$3 = tokenizer.cmpChar;
+    var isDigit$4 = tokenizer.isDigit;
+    var TYPE$9 = tokenizer.TYPE;
+
+    var WHITESPACE$4 = TYPE$9.WhiteSpace;
+    var COMMENT$4 = TYPE$9.Comment;
+    var IDENT$3 = TYPE$9.Ident;
+    var NUMBER$3 = TYPE$9.Number;
+    var DIMENSION$2 = TYPE$9.Dimension;
+    var PLUSSIGN$3 = 0x002B;    // U+002B PLUS SIGN (+)
+    var HYPHENMINUS$3 = 0x002D; // U+002D HYPHEN-MINUS (-)
+    var N$4 = 0x006E;           // U+006E LATIN SMALL LETTER N (n)
+    var DISALLOW_SIGN$1 = true;
+    var ALLOW_SIGN$1 = false;
+
+    function checkInteger$1(offset, disallowSign) {
+        var pos = this.scanner.tokenStart + offset;
+        var code = this.scanner.source.charCodeAt(pos);
+
+        if (code === PLUSSIGN$3 || code === HYPHENMINUS$3) {
+            if (disallowSign) {
+                this.error('Number sign is not allowed');
+            }
+            pos++;
+        }
+
+        for (; pos < this.scanner.tokenEnd; pos++) {
+            if (!isDigit$4(this.scanner.source.charCodeAt(pos))) {
+                this.error('Integer is expected', pos);
+            }
+        }
+    }
+
+    function checkTokenIsInteger(disallowSign) {
+        return checkInteger$1.call(this, 0, disallowSign);
+    }
+
+    function expectCharCode(offset, code) {
+        if (!cmpChar$3(this.scanner.source, this.scanner.tokenStart + offset, code)) {
+            var msg = '';
+
+            switch (code) {
+                case N$4:
+                    msg = 'N is expected';
+                    break;
+                case HYPHENMINUS$3:
+                    msg = 'HyphenMinus is expected';
+                    break;
+            }
+
+            this.error(msg, this.scanner.tokenStart + offset);
+        }
+    }
+
+    // ... <signed-integer>
+    // ... ['+' | '-'] <signless-integer>
+    function consumeB$1() {
+        var offset = 0;
+        var sign = 0;
+        var type = this.scanner.tokenType;
+
+        while (type === WHITESPACE$4 || type === COMMENT$4) {
+            type = this.scanner.lookupType(++offset);
+        }
+
+        if (type !== NUMBER$3) {
+            if (this.scanner.isDelim(PLUSSIGN$3, offset) ||
+                this.scanner.isDelim(HYPHENMINUS$3, offset)) {
+                sign = this.scanner.isDelim(PLUSSIGN$3, offset) ? PLUSSIGN$3 : HYPHENMINUS$3;
+
+                do {
+                    type = this.scanner.lookupType(++offset);
+                } while (type === WHITESPACE$4 || type === COMMENT$4);
+
+                if (type !== NUMBER$3) {
+                    this.scanner.skip(offset);
+                    checkTokenIsInteger.call(this, DISALLOW_SIGN$1);
+                }
+            } else {
+                return null;
+            }
+        }
+
+        if (offset > 0) {
+            this.scanner.skip(offset);
+        }
+
+        if (sign === 0) {
+            type = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+            if (type !== PLUSSIGN$3 && type !== HYPHENMINUS$3) {
+                this.error('Number sign is expected');
+            }
+        }
+
+        checkTokenIsInteger.call(this, sign !== 0);
+        return sign === HYPHENMINUS$3 ? '-' + this.consume(NUMBER$3) : this.consume(NUMBER$3);
+    }
+
+    // An+B microsyntax https://www.w3.org/TR/css-syntax-3/#anb
+    var AnPlusB = {
+        name: 'AnPlusB',
+        structure: {
+            a: [String, null],
+            b: [String, null]
+        },
+        parse: function() {
+            /* eslint-disable brace-style*/
+            var start = this.scanner.tokenStart;
+            var a = null;
+            var b = null;
+
+            // <integer>
+            if (this.scanner.tokenType === NUMBER$3) {
+                checkTokenIsInteger.call(this, ALLOW_SIGN$1);
+                b = this.consume(NUMBER$3);
+            }
+
+            // -n
+            // -n <signed-integer>
+            // -n ['+' | '-'] <signless-integer>
+            // -n- <signless-integer>
+            // <dashndashdigit-ident>
+            else if (this.scanner.tokenType === IDENT$3 && cmpChar$3(this.scanner.source, this.scanner.tokenStart, HYPHENMINUS$3)) {
+                a = '-1';
+
+                expectCharCode.call(this, 1, N$4);
+
+                switch (this.scanner.getTokenLength()) {
+                    // -n
+                    // -n <signed-integer>
+                    // -n ['+' | '-'] <signless-integer>
+                    case 2:
+                        this.scanner.next();
+                        b = consumeB$1.call(this);
+                        break;
+
+                    // -n- <signless-integer>
+                    case 3:
+                        expectCharCode.call(this, 2, HYPHENMINUS$3);
+
+                        this.scanner.next();
+                        this.scanner.skipSC();
+
+                        checkTokenIsInteger.call(this, DISALLOW_SIGN$1);
+
+                        b = '-' + this.consume(NUMBER$3);
+                        break;
+
+                    // <dashndashdigit-ident>
+                    default:
+                        expectCharCode.call(this, 2, HYPHENMINUS$3);
+                        checkInteger$1.call(this, 3, DISALLOW_SIGN$1);
+                        this.scanner.next();
+
+                        b = this.scanner.substrToCursor(start + 2);
+                }
+            }
+
+            // '+'? n
+            // '+'? n <signed-integer>
+            // '+'? n ['+' | '-'] <signless-integer>
+            // '+'? n- <signless-integer>
+            // '+'? <ndashdigit-ident>
+            else if (this.scanner.tokenType === IDENT$3 || (this.scanner.isDelim(PLUSSIGN$3) && this.scanner.lookupType(1) === IDENT$3)) {
+                var sign = 0;
+                a = '1';
+
+                // just ignore a plus
+                if (this.scanner.isDelim(PLUSSIGN$3)) {
+                    sign = 1;
+                    this.scanner.next();
+                }
+
+                expectCharCode.call(this, 0, N$4);
+
+                switch (this.scanner.getTokenLength()) {
+                    // '+'? n
+                    // '+'? n <signed-integer>
+                    // '+'? n ['+' | '-'] <signless-integer>
+                    case 1:
+                        this.scanner.next();
+                        b = consumeB$1.call(this);
+                        break;
+
+                    // '+'? n- <signless-integer>
+                    case 2:
+                        expectCharCode.call(this, 1, HYPHENMINUS$3);
+
+                        this.scanner.next();
+                        this.scanner.skipSC();
+
+                        checkTokenIsInteger.call(this, DISALLOW_SIGN$1);
+
+                        b = '-' + this.consume(NUMBER$3);
+                        break;
+
+                    // '+'? <ndashdigit-ident>
+                    default:
+                        expectCharCode.call(this, 1, HYPHENMINUS$3);
+                        checkInteger$1.call(this, 2, DISALLOW_SIGN$1);
+                        this.scanner.next();
+
+                        b = this.scanner.substrToCursor(start + sign + 1);
+                }
+            }
+
+            // <ndashdigit-dimension>
+            // <ndash-dimension> <signless-integer>
+            // <n-dimension>
+            // <n-dimension> <signed-integer>
+            // <n-dimension> ['+' | '-'] <signless-integer>
+            else if (this.scanner.tokenType === DIMENSION$2) {
+                var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+                var sign = code === PLUSSIGN$3 || code === HYPHENMINUS$3;
+
+                for (var i = this.scanner.tokenStart + sign; i < this.scanner.tokenEnd; i++) {
+                    if (!isDigit$4(this.scanner.source.charCodeAt(i))) {
+                        break;
+                    }
+                }
+
+                if (i === this.scanner.tokenStart + sign) {
+                    this.error('Integer is expected', this.scanner.tokenStart + sign);
+                }
+
+                expectCharCode.call(this, i - this.scanner.tokenStart, N$4);
+                a = this.scanner.source.substring(start, i);
+
+                // <n-dimension>
+                // <n-dimension> <signed-integer>
+                // <n-dimension> ['+' | '-'] <signless-integer>
+                if (i + 1 === this.scanner.tokenEnd) {
+                    this.scanner.next();
+                    b = consumeB$1.call(this);
+                } else {
+                    expectCharCode.call(this, i - this.scanner.tokenStart + 1, HYPHENMINUS$3);
+
+                    // <ndash-dimension> <signless-integer>
+                    if (i + 2 === this.scanner.tokenEnd) {
+                        this.scanner.next();
+                        this.scanner.skipSC();
+                        checkTokenIsInteger.call(this, DISALLOW_SIGN$1);
+                        b = '-' + this.consume(NUMBER$3);
+                    }
+                    // <ndashdigit-dimension>
+                    else {
+                        checkInteger$1.call(this, i - this.scanner.tokenStart + 2, DISALLOW_SIGN$1);
+                        this.scanner.next();
+                        b = this.scanner.substrToCursor(i + 1);
+                    }
+                }
+            } else {
+                this.error();
+            }
+
+            if (a !== null && a.charCodeAt(0) === PLUSSIGN$3) {
+                a = a.substr(1);
+            }
+
+            if (b !== null && b.charCodeAt(0) === PLUSSIGN$3) {
+                b = b.substr(1);
+            }
+
+            return {
+                type: 'AnPlusB',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                a: a,
+                b: b
+            };
+        },
+        generate: function(node) {
+            var a = node.a !== null && node.a !== undefined;
+            var b = node.b !== null && node.b !== undefined;
+
+            if (a) {
+                this.chunk(
+                    node.a === '+1' ? '+n' : // eslint-disable-line operator-linebreak, indent
+                    node.a ===  '1' ?  'n' : // eslint-disable-line operator-linebreak, indent
+                    node.a === '-1' ? '-n' : // eslint-disable-line operator-linebreak, indent
+                    node.a + 'n'             // eslint-disable-line operator-linebreak, indent
+                );
+
+                if (b) {
+                    b = String(node.b);
+                    if (b.charAt(0) === '-' || b.charAt(0) === '+') {
+                        this.chunk(b.charAt(0));
+                        this.chunk(b.substr(1));
+                    } else {
+                        this.chunk('+');
+                        this.chunk(b);
+                    }
+                }
+            } else {
+                this.chunk(String(node.b));
+            }
+        }
+    };
+
+    var TYPE$a = tokenizer.TYPE;
+
+    var WhiteSpace = TYPE$a.WhiteSpace;
+    var Semicolon = TYPE$a.Semicolon;
+    var LeftCurlyBracket = TYPE$a.LeftCurlyBracket;
+    var Delim = TYPE$a.Delim;
+    var EXCLAMATIONMARK$1 = 0x0021; // U+0021 EXCLAMATION MARK (!)
+
+    function getOffsetExcludeWS() {
+        if (this.scanner.tokenIndex > 0) {
+            if (this.scanner.lookupType(-1) === WhiteSpace) {
+                return this.scanner.tokenIndex > 1
+                    ? this.scanner.getTokenStart(this.scanner.tokenIndex - 1)
+                    : this.scanner.firstCharOffset;
+            }
+        }
+
+        return this.scanner.tokenStart;
+    }
+
+    // 0, 0, false
+    function balanceEnd() {
+        return 0;
+    }
+
+    // LEFTCURLYBRACKET, 0, false
+    function leftCurlyBracket(tokenType) {
+        return tokenType === LeftCurlyBracket ? 1 : 0;
+    }
+
+    // LEFTCURLYBRACKET, SEMICOLON, false
+    function leftCurlyBracketOrSemicolon(tokenType) {
+        return tokenType === LeftCurlyBracket || tokenType === Semicolon ? 1 : 0;
+    }
+
+    // EXCLAMATIONMARK, SEMICOLON, false
+    function exclamationMarkOrSemicolon(tokenType, source, offset) {
+        if (tokenType === Delim && source.charCodeAt(offset) === EXCLAMATIONMARK$1) {
+            return 1;
+        }
+
+        return tokenType === Semicolon ? 1 : 0;
+    }
+
+    // 0, SEMICOLON, true
+    function semicolonIncluded(tokenType) {
+        return tokenType === Semicolon ? 2 : 0;
+    }
+
+    var Raw = {
+        name: 'Raw',
+        structure: {
+            value: String
+        },
+        parse: function(startToken, mode, excludeWhiteSpace) {
+            var startOffset = this.scanner.getTokenStart(startToken);
+            var endOffset;
+
+            this.scanner.skip(
+                this.scanner.getRawLength(startToken, mode || balanceEnd)
+            );
+
+            if (excludeWhiteSpace && this.scanner.tokenStart > startOffset) {
+                endOffset = getOffsetExcludeWS.call(this);
+            } else {
+                endOffset = this.scanner.tokenStart;
+            }
+
+            return {
+                type: 'Raw',
+                loc: this.getLocation(startOffset, endOffset),
+                value: this.scanner.source.substring(startOffset, endOffset)
+            };
+        },
+        generate: function(node) {
+            this.chunk(node.value);
+        },
+
+        mode: {
+            default: balanceEnd,
+            leftCurlyBracket: leftCurlyBracket,
+            leftCurlyBracketOrSemicolon: leftCurlyBracketOrSemicolon,
+            exclamationMarkOrSemicolon: exclamationMarkOrSemicolon,
+            semicolonIncluded: semicolonIncluded
+        }
+    };
+
+    var TYPE$b = tokenizer.TYPE;
+    var rawMode = Raw.mode;
+
+    var ATKEYWORD = TYPE$b.AtKeyword;
+    var SEMICOLON = TYPE$b.Semicolon;
+    var LEFTCURLYBRACKET$1 = TYPE$b.LeftCurlyBracket;
+    var RIGHTCURLYBRACKET$1 = TYPE$b.RightCurlyBracket;
+
+    function consumeRaw(startToken) {
+        return this.Raw(startToken, rawMode.leftCurlyBracketOrSemicolon, true);
+    }
+
+    function isDeclarationBlockAtrule() {
+        for (var offset = 1, type; type = this.scanner.lookupType(offset); offset++) {
+            if (type === RIGHTCURLYBRACKET$1) {
+                return true;
+            }
+
+            if (type === LEFTCURLYBRACKET$1 ||
+                type === ATKEYWORD) {
+                return false;
+            }
+        }
+
+        return false;
+    }
+
+    var Atrule = {
+        name: 'Atrule',
+        structure: {
+            name: String,
+            prelude: ['AtrulePrelude', 'Raw', null],
+            block: ['Block', null]
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+            var name;
+            var nameLowerCase;
+            var prelude = null;
+            var block = null;
+
+            this.eat(ATKEYWORD);
+
+            name = this.scanner.substrToCursor(start + 1);
+            nameLowerCase = name.toLowerCase();
+            this.scanner.skipSC();
+
+            // parse prelude
+            if (this.scanner.eof === false &&
+                this.scanner.tokenType !== LEFTCURLYBRACKET$1 &&
+                this.scanner.tokenType !== SEMICOLON) {
+                if (this.parseAtrulePrelude) {
+                    prelude = this.parseWithFallback(this.AtrulePrelude.bind(this, name), consumeRaw);
+
+                    // turn empty AtrulePrelude into null
+                    if (prelude.type === 'AtrulePrelude' && prelude.children.head === null) {
+                        prelude = null;
+                    }
+                } else {
+                    prelude = consumeRaw.call(this, this.scanner.tokenIndex);
+                }
+
+                this.scanner.skipSC();
+            }
+
+            switch (this.scanner.tokenType) {
+                case SEMICOLON:
+                    this.scanner.next();
+                    break;
+
+                case LEFTCURLYBRACKET$1:
+                    if (this.atrule.hasOwnProperty(nameLowerCase) &&
+                        typeof this.atrule[nameLowerCase].block === 'function') {
+                        block = this.atrule[nameLowerCase].block.call(this);
+                    } else {
+                        // TODO: should consume block content as Raw?
+                        block = this.Block(isDeclarationBlockAtrule.call(this));
+                    }
+
+                    break;
+            }
+
+            return {
+                type: 'Atrule',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                name: name,
+                prelude: prelude,
+                block: block
+            };
+        },
+        generate: function(node) {
+            this.chunk('@');
+            this.chunk(node.name);
+
+            if (node.prelude !== null) {
+                this.chunk(' ');
+                this.node(node.prelude);
+            }
+
+            if (node.block) {
+                this.node(node.block);
+            } else {
+                this.chunk(';');
+            }
+        },
+        walkContext: 'atrule'
+    };
+
+    var TYPE$c = tokenizer.TYPE;
+
+    var SEMICOLON$1 = TYPE$c.Semicolon;
+    var LEFTCURLYBRACKET$2 = TYPE$c.LeftCurlyBracket;
+
+    var AtrulePrelude = {
+        name: 'AtrulePrelude',
+        structure: {
+            children: [[]]
+        },
+        parse: function(name) {
+            var children = null;
+
+            if (name !== null) {
+                name = name.toLowerCase();
+            }
+
+            this.scanner.skipSC();
+
+            if (this.atrule.hasOwnProperty(name) &&
+                typeof this.atrule[name].prelude === 'function') {
+                // custom consumer
+                children = this.atrule[name].prelude.call(this);
+            } else {
+                // default consumer
+                children = this.readSequence(this.scope.AtrulePrelude);
+            }
+
+            this.scanner.skipSC();
+
+            if (this.scanner.eof !== true &&
+                this.scanner.tokenType !== LEFTCURLYBRACKET$2 &&
+                this.scanner.tokenType !== SEMICOLON$1) {
+                this.error('Semicolon or block is expected');
+            }
+
+            if (children === null) {
+                children = this.createList();
+            }
+
+            return {
+                type: 'AtrulePrelude',
+                loc: this.getLocationFromList(children),
+                children: children
+            };
+        },
+        generate: function(node) {
+            this.children(node);
+        },
+        walkContext: 'atrulePrelude'
+    };
+
+    var TYPE$d = tokenizer.TYPE;
+
+    var IDENT$4 = TYPE$d.Ident;
+    var STRING = TYPE$d.String;
+    var COLON = TYPE$d.Colon;
+    var LEFTSQUAREBRACKET$1 = TYPE$d.LeftSquareBracket;
+    var RIGHTSQUAREBRACKET$1 = TYPE$d.RightSquareBracket;
+    var DOLLARSIGN = 0x0024;       // U+0024 DOLLAR SIGN ($)
+    var ASTERISK$1 = 0x002A;         // U+002A ASTERISK (*)
+    var EQUALSSIGN = 0x003D;       // U+003D EQUALS SIGN (=)
+    var CIRCUMFLEXACCENT = 0x005E; // U+005E (^)
+    var VERTICALLINE$1 = 0x007C;     // U+007C VERTICAL LINE (|)
+    var TILDE = 0x007E;            // U+007E TILDE (~)
+
+    function getAttributeName() {
+        if (this.scanner.eof) {
+            this.error('Unexpected end of input');
+        }
+
+        var start = this.scanner.tokenStart;
+        var expectIdent = false;
+        var checkColon = true;
+
+        if (this.scanner.isDelim(ASTERISK$1)) {
+            expectIdent = true;
+            checkColon = false;
+            this.scanner.next();
+        } else if (!this.scanner.isDelim(VERTICALLINE$1)) {
+            this.eat(IDENT$4);
+        }
+
+        if (this.scanner.isDelim(VERTICALLINE$1)) {
+            if (this.scanner.source.charCodeAt(this.scanner.tokenStart + 1) !== EQUALSSIGN) {
+                this.scanner.next();
+                this.eat(IDENT$4);
+            } else if (expectIdent) {
+                this.error('Identifier is expected', this.scanner.tokenEnd);
+            }
+        } else if (expectIdent) {
+            this.error('Vertical line is expected');
+        }
+
+        if (checkColon && this.scanner.tokenType === COLON) {
+            this.scanner.next();
+            this.eat(IDENT$4);
+        }
+
+        return {
+            type: 'Identifier',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            name: this.scanner.substrToCursor(start)
+        };
+    }
+
+    function getOperator() {
+        var start = this.scanner.tokenStart;
+        var code = this.scanner.source.charCodeAt(start);
+
+        if (code !== EQUALSSIGN &&        // =
+            code !== TILDE &&             // ~=
+            code !== CIRCUMFLEXACCENT &&  // ^=
+            code !== DOLLARSIGN &&        // $=
+            code !== ASTERISK$1 &&          // *=
+            code !== VERTICALLINE$1         // |=
+        ) {
+            this.error('Attribute selector (=, ~=, ^=, $=, *=, |=) is expected');
+        }
+
+        this.scanner.next();
+
+        if (code !== EQUALSSIGN) {
+            if (!this.scanner.isDelim(EQUALSSIGN)) {
+                this.error('Equal sign is expected');
+            }
+
+            this.scanner.next();
+        }
+
+        return this.scanner.substrToCursor(start);
+    }
+
+    // '[' <wq-name> ']'
+    // '[' <wq-name> <attr-matcher> [ <string-token> | <ident-token> ] <attr-modifier>? ']'
+    var AttributeSelector = {
+        name: 'AttributeSelector',
+        structure: {
+            name: 'Identifier',
+            matcher: [String, null],
+            value: ['String', 'Identifier', null],
+            flags: [String, null]
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+            var name;
+            var matcher = null;
+            var value = null;
+            var flags = null;
+
+            this.eat(LEFTSQUAREBRACKET$1);
+            this.scanner.skipSC();
+
+            name = getAttributeName.call(this);
+            this.scanner.skipSC();
+
+            if (this.scanner.tokenType !== RIGHTSQUAREBRACKET$1) {
+                // avoid case `[name i]`
+                if (this.scanner.tokenType !== IDENT$4) {
+                    matcher = getOperator.call(this);
+
+                    this.scanner.skipSC();
+
+                    value = this.scanner.tokenType === STRING
+                        ? this.String()
+                        : this.Identifier();
+
+                    this.scanner.skipSC();
+                }
+
+                // attribute flags
+                if (this.scanner.tokenType === IDENT$4) {
+                    flags = this.scanner.getTokenValue();
+                    this.scanner.next();
+
+                    this.scanner.skipSC();
+                }
+            }
+
+            this.eat(RIGHTSQUAREBRACKET$1);
+
+            return {
+                type: 'AttributeSelector',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                name: name,
+                matcher: matcher,
+                value: value,
+                flags: flags
+            };
+        },
+        generate: function(node) {
+            var flagsPrefix = ' ';
+
+            this.chunk('[');
+            this.node(node.name);
+
+            if (node.matcher !== null) {
+                this.chunk(node.matcher);
+
+                if (node.value !== null) {
+                    this.node(node.value);
+
+                    // space between string and flags is not required
+                    if (node.value.type === 'String') {
+                        flagsPrefix = '';
+                    }
+                }
+            }
+
+            if (node.flags !== null) {
+                this.chunk(flagsPrefix);
+                this.chunk(node.flags);
+            }
+
+            this.chunk(']');
+        }
+    };
+
+    var TYPE$e = tokenizer.TYPE;
+    var rawMode$1 = Raw.mode;
+
+    var WHITESPACE$5 = TYPE$e.WhiteSpace;
+    var COMMENT$5 = TYPE$e.Comment;
+    var SEMICOLON$2 = TYPE$e.Semicolon;
+    var ATKEYWORD$1 = TYPE$e.AtKeyword;
+    var LEFTCURLYBRACKET$3 = TYPE$e.LeftCurlyBracket;
+    var RIGHTCURLYBRACKET$2 = TYPE$e.RightCurlyBracket;
+
+    function consumeRaw$1(startToken) {
+        return this.Raw(startToken, null, true);
+    }
+    function consumeRule() {
+        return this.parseWithFallback(this.Rule, consumeRaw$1);
+    }
+    function consumeRawDeclaration(startToken) {
+        return this.Raw(startToken, rawMode$1.semicolonIncluded, true);
+    }
+    function consumeDeclaration() {
+        if (this.scanner.tokenType === SEMICOLON$2) {
+            return consumeRawDeclaration.call(this, this.scanner.tokenIndex);
+        }
+
+        var node = this.parseWithFallback(this.Declaration, consumeRawDeclaration);
+
+        if (this.scanner.tokenType === SEMICOLON$2) {
+            this.scanner.next();
+        }
+
+        return node;
+    }
+
+    var Block = {
+        name: 'Block',
+        structure: {
+            children: [[
+                'Atrule',
+                'Rule',
+                'Declaration'
+            ]]
+        },
+        parse: function(isDeclaration) {
+            var consumer = isDeclaration ? consumeDeclaration : consumeRule;
+
+            var start = this.scanner.tokenStart;
+            var children = this.createList();
+
+            this.eat(LEFTCURLYBRACKET$3);
+
+            scan:
+            while (!this.scanner.eof) {
+                switch (this.scanner.tokenType) {
+                    case RIGHTCURLYBRACKET$2:
+                        break scan;
+
+                    case WHITESPACE$5:
+                    case COMMENT$5:
+                        this.scanner.next();
+                        break;
+
+                    case ATKEYWORD$1:
+                        children.push(this.parseWithFallback(this.Atrule, consumeRaw$1));
+                        break;
+
+                    default:
+                        children.push(consumer.call(this));
+                }
+            }
+
+            if (!this.scanner.eof) {
+                this.eat(RIGHTCURLYBRACKET$2);
+            }
+
+            return {
+                type: 'Block',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                children: children
+            };
+        },
+        generate: function(node) {
+            this.chunk('{');
+            this.children(node, function(prev) {
+                if (prev.type === 'Declaration') {
+                    this.chunk(';');
+                }
+            });
+            this.chunk('}');
+        },
+        walkContext: 'block'
+    };
+
+    var TYPE$f = tokenizer.TYPE;
+
+    var LEFTSQUAREBRACKET$2 = TYPE$f.LeftSquareBracket;
+    var RIGHTSQUAREBRACKET$2 = TYPE$f.RightSquareBracket;
+
+    var Brackets = {
+        name: 'Brackets',
+        structure: {
+            children: [[]]
+        },
+        parse: function(readSequence, recognizer) {
+            var start = this.scanner.tokenStart;
+            var children = null;
+
+            this.eat(LEFTSQUAREBRACKET$2);
+
+            children = readSequence.call(this, recognizer);
+
+            if (!this.scanner.eof) {
+                this.eat(RIGHTSQUAREBRACKET$2);
+            }
+
+            return {
+                type: 'Brackets',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                children: children
+            };
+        },
+        generate: function(node) {
+            this.chunk('[');
+            this.children(node);
+            this.chunk(']');
+        }
+    };
+
+    var CDC = tokenizer.TYPE.CDC;
+
+    var CDC_1 = {
+        name: 'CDC',
+        structure: [],
+        parse: function() {
+            var start = this.scanner.tokenStart;
+
+            this.eat(CDC); // -->
+
+            return {
+                type: 'CDC',
+                loc: this.getLocation(start, this.scanner.tokenStart)
+            };
+        },
+        generate: function() {
+            this.chunk('-->');
+        }
+    };
+
+    var CDO = tokenizer.TYPE.CDO;
+
+    var CDO_1 = {
+        name: 'CDO',
+        structure: [],
+        parse: function() {
+            var start = this.scanner.tokenStart;
+
+            this.eat(CDO); // <!--
+
+            return {
+                type: 'CDO',
+                loc: this.getLocation(start, this.scanner.tokenStart)
+            };
+        },
+        generate: function() {
+            this.chunk('<!--');
+        }
+    };
+
+    var TYPE$g = tokenizer.TYPE;
+
+    var IDENT$5 = TYPE$g.Ident;
+    var FULLSTOP = 0x002E; // U+002E FULL STOP (.)
+
+    // '.' ident
+    var ClassSelector = {
+        name: 'ClassSelector',
+        structure: {
+            name: String
+        },
+        parse: function() {
+            if (!this.scanner.isDelim(FULLSTOP)) {
+                this.error('Full stop is expected');
+            }
+
+            this.scanner.next();
+
+            return {
+                type: 'ClassSelector',
+                loc: this.getLocation(this.scanner.tokenStart - 1, this.scanner.tokenEnd),
+                name: this.consume(IDENT$5)
+            };
+        },
+        generate: function(node) {
+            this.chunk('.');
+            this.chunk(node.name);
+        }
+    };
+
+    var TYPE$h = tokenizer.TYPE;
+
+    var IDENT$6 = TYPE$h.Ident;
+    var PLUSSIGN$4 = 0x002B;        // U+002B PLUS SIGN (+)
+    var SOLIDUS = 0x002F;         // U+002F SOLIDUS (/)
+    var GREATERTHANSIGN$1 = 0x003E; // U+003E GREATER-THAN SIGN (>)
+    var TILDE$1 = 0x007E;           // U+007E TILDE (~)
+
+    // + | > | ~ | /deep/
+    var Combinator = {
+        name: 'Combinator',
+        structure: {
+            name: String
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+            var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+
+            switch (code) {
+                case GREATERTHANSIGN$1:
+                case PLUSSIGN$4:
+                case TILDE$1:
+                    this.scanner.next();
+                    break;
+
+                case SOLIDUS:
+                    this.scanner.next();
+
+                    if (this.scanner.tokenType !== IDENT$6 || this.scanner.lookupValue(0, 'deep') === false) {
+                        this.error('Identifier `deep` is expected');
+                    }
+
+                    this.scanner.next();
+
+                    if (!this.scanner.isDelim(SOLIDUS)) {
+                        this.error('Solidus is expected');
+                    }
+
+                    this.scanner.next();
+                    break;
+
+                default:
+                    this.error('Combinator is expected');
+            }
+
+            return {
+                type: 'Combinator',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                name: this.scanner.substrToCursor(start)
+            };
+        },
+        generate: function(node) {
+            this.chunk(node.name);
+        }
+    };
+
+    var TYPE$i = tokenizer.TYPE;
+
+    var COMMENT$6 = TYPE$i.Comment;
+    var ASTERISK$2 = 0x002A;        // U+002A ASTERISK (*)
+    var SOLIDUS$1 = 0x002F;         // U+002F SOLIDUS (/)
+
+    // '/*' .* '*/'
+    var Comment = {
+        name: 'Comment',
+        structure: {
+            value: String
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+            var end = this.scanner.tokenEnd;
+
+            this.eat(COMMENT$6);
+
+            if ((end - start + 2) >= 2 &&
+                this.scanner.source.charCodeAt(end - 2) === ASTERISK$2 &&
+                this.scanner.source.charCodeAt(end - 1) === SOLIDUS$1) {
+                end -= 2;
+            }
+
+            return {
+                type: 'Comment',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                value: this.scanner.source.substring(start + 2, end)
+            };
+        },
+        generate: function(node) {
+            this.chunk('/*');
+            this.chunk(node.value);
+            this.chunk('*/');
+        }
+    };
+
+    var isCustomProperty$1 = names.isCustomProperty;
+    var TYPE$j = tokenizer.TYPE;
+    var rawMode$2 = Raw.mode;
+
+    var IDENT$7 = TYPE$j.Ident;
+    var HASH$1 = TYPE$j.Hash;
+    var COLON$1 = TYPE$j.Colon;
+    var SEMICOLON$3 = TYPE$j.Semicolon;
+    var DELIM$2 = TYPE$j.Delim;
+    var WHITESPACE$6 = TYPE$j.WhiteSpace;
+    var EXCLAMATIONMARK$2 = 0x0021; // U+0021 EXCLAMATION MARK (!)
+    var NUMBERSIGN$2 = 0x0023;      // U+0023 NUMBER SIGN (#)
+    var DOLLARSIGN$1 = 0x0024;      // U+0024 DOLLAR SIGN ($)
+    var AMPERSAND$1 = 0x0026;       // U+0026 ANPERSAND (&)
+    var ASTERISK$3 = 0x002A;        // U+002A ASTERISK (*)
+    var PLUSSIGN$5 = 0x002B;        // U+002B PLUS SIGN (+)
+    var SOLIDUS$2 = 0x002F;         // U+002F SOLIDUS (/)
+
+    function consumeValueRaw(startToken) {
+        return this.Raw(startToken, rawMode$2.exclamationMarkOrSemicolon, true);
+    }
+
+    function consumeCustomPropertyRaw(startToken) {
+        return this.Raw(startToken, rawMode$2.exclamationMarkOrSemicolon, false);
+    }
+
+    function consumeValue() {
+        var startValueToken = this.scanner.tokenIndex;
+        var value = this.Value();
+
+        if (value.type !== 'Raw' &&
+            this.scanner.eof === false &&
+            this.scanner.tokenType !== SEMICOLON$3 &&
+            this.scanner.isDelim(EXCLAMATIONMARK$2) === false &&
+            this.scanner.isBalanceEdge(startValueToken) === false) {
+            this.error();
+        }
+
+        return value;
+    }
+
+    var Declaration = {
+        name: 'Declaration',
+        structure: {
+            important: [Boolean, String],
+            property: String,
+            value: ['Value', 'Raw']
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+            var startToken = this.scanner.tokenIndex;
+            var property = readProperty$1.call(this);
+            var customProperty = isCustomProperty$1(property);
+            var parseValue = customProperty ? this.parseCustomProperty : this.parseValue;
+            var consumeRaw = customProperty ? consumeCustomPropertyRaw : consumeValueRaw;
+            var important = false;
+            var value;
+
+            this.scanner.skipSC();
+            this.eat(COLON$1);
+
+            const valueStart = this.scanner.tokenIndex;
+
+            if (!customProperty) {
+                this.scanner.skipSC();
+            }
+
+            if (parseValue) {
+                value = this.parseWithFallback(consumeValue, consumeRaw);
+            } else {
+                value = consumeRaw.call(this, this.scanner.tokenIndex);
+            }
+
+            if (customProperty && value.type === 'Value' && value.children.isEmpty()) {
+                for (let offset = valueStart - this.scanner.tokenIndex; offset <= 0; offset++) {
+                    if (this.scanner.lookupType(offset) === WHITESPACE$6) {
+                        value.children.appendData({
+                            type: 'WhiteSpace',
+                            loc: null,
+                            value: ' '
+                        });
+                        break;
+                    }
+                }
+            }
+
+            if (this.scanner.isDelim(EXCLAMATIONMARK$2)) {
+                important = getImportant.call(this);
+                this.scanner.skipSC();
+            }
+
+            // Do not include semicolon to range per spec
+            // https://drafts.csswg.org/css-syntax/#declaration-diagram
+
+            if (this.scanner.eof === false &&
+                this.scanner.tokenType !== SEMICOLON$3 &&
+                this.scanner.isBalanceEdge(startToken) === false) {
+                this.error();
+            }
+
+            return {
+                type: 'Declaration',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                important: important,
+                property: property,
+                value: value
+            };
+        },
+        generate: function(node) {
+            this.chunk(node.property);
+            this.chunk(':');
+            this.node(node.value);
+
+            if (node.important) {
+                this.chunk(node.important === true ? '!important' : '!' + node.important);
+            }
+        },
+        walkContext: 'declaration'
+    };
+
+    function readProperty$1() {
+        var start = this.scanner.tokenStart;
+
+        // hacks
+        if (this.scanner.tokenType === DELIM$2) {
+            switch (this.scanner.source.charCodeAt(this.scanner.tokenStart)) {
+                case ASTERISK$3:
+                case DOLLARSIGN$1:
+                case PLUSSIGN$5:
+                case NUMBERSIGN$2:
+                case AMPERSAND$1:
+                    this.scanner.next();
+                    break;
+
+                // TODO: not sure we should support this hack
+                case SOLIDUS$2:
+                    this.scanner.next();
+                    if (this.scanner.isDelim(SOLIDUS$2)) {
+                        this.scanner.next();
+                    }
+                    break;
+            }
+        }
+
+        if (this.scanner.tokenType === HASH$1) {
+            this.eat(HASH$1);
+        } else {
+            this.eat(IDENT$7);
+        }
+
+        return this.scanner.substrToCursor(start);
+    }
+
+    // ! ws* important
+    function getImportant() {
+        this.eat(DELIM$2);
+        this.scanner.skipSC();
+
+        var important = this.consume(IDENT$7);
+
+        // store original value in case it differ from `important`
+        // for better original source restoring and hacks like `!ie` support
+        return important === 'important' ? true : important;
+    }
+
+    var TYPE$k = tokenizer.TYPE;
+    var rawMode$3 = Raw.mode;
+
+    var WHITESPACE$7 = TYPE$k.WhiteSpace;
+    var COMMENT$7 = TYPE$k.Comment;
+    var SEMICOLON$4 = TYPE$k.Semicolon;
+
+    function consumeRaw$2(startToken) {
+        return this.Raw(startToken, rawMode$3.semicolonIncluded, true);
+    }
+
+    var DeclarationList = {
+        name: 'DeclarationList',
+        structure: {
+            children: [[
+                'Declaration'
+            ]]
+        },
+        parse: function() {
+            var children = this.createList();
+
+            
+            while (!this.scanner.eof) {
+                switch (this.scanner.tokenType) {
+                    case WHITESPACE$7:
+                    case COMMENT$7:
+                    case SEMICOLON$4:
+                        this.scanner.next();
+                        break;
+
+                    default:
+                        children.push(this.parseWithFallback(this.Declaration, consumeRaw$2));
+                }
+            }
+
+            return {
+                type: 'DeclarationList',
+                loc: this.getLocationFromList(children),
+                children: children
+            };
+        },
+        generate: function(node) {
+            this.children(node, function(prev) {
+                if (prev.type === 'Declaration') {
+                    this.chunk(';');
+                }
+            });
+        }
+    };
+
+    var consumeNumber$3 = utils.consumeNumber;
+    var TYPE$l = tokenizer.TYPE;
+
+    var DIMENSION$3 = TYPE$l.Dimension;
+
+    var Dimension = {
+        name: 'Dimension',
+        structure: {
+            value: String,
+            unit: String
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+            var numberEnd = consumeNumber$3(this.scanner.source, start);
+
+            this.eat(DIMENSION$3);
+
+            return {
+                type: 'Dimension',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                value: this.scanner.source.substring(start, numberEnd),
+                unit: this.scanner.source.substring(numberEnd, this.scanner.tokenStart)
+            };
+        },
+        generate: function(node) {
+            this.chunk(node.value);
+            this.chunk(node.unit);
+        }
+    };
+
+    var TYPE$m = tokenizer.TYPE;
+
+    var RIGHTPARENTHESIS$2 = TYPE$m.RightParenthesis;
+
+    // <function-token> <sequence> )
+    var _Function = {
+        name: 'Function',
+        structure: {
+            name: String,
+            children: [[]]
+        },
+        parse: function(readSequence, recognizer) {
+            var start = this.scanner.tokenStart;
+            var name = this.consumeFunctionName();
+            var nameLowerCase = name.toLowerCase();
+            var children;
+
+            children = recognizer.hasOwnProperty(nameLowerCase)
+                ? recognizer[nameLowerCase].call(this, recognizer)
+                : readSequence.call(this, recognizer);
+
+            if (!this.scanner.eof) {
+                this.eat(RIGHTPARENTHESIS$2);
+            }
+
+            return {
+                type: 'Function',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                name: name,
+                children: children
+            };
+        },
+        generate: function(node) {
+            this.chunk(node.name);
+            this.chunk('(');
+            this.children(node);
+            this.chunk(')');
+        },
+        walkContext: 'function'
+    };
+
+    var TYPE$n = tokenizer.TYPE;
+
+    var HASH$2 = TYPE$n.Hash;
+
+    // '#' ident
+    var Hash = {
+        name: 'Hash',
+        structure: {
+            value: String
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+
+            this.eat(HASH$2);
+
+            return {
+                type: 'Hash',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                value: this.scanner.substrToCursor(start + 1)
+            };
+        },
+        generate: function(node) {
+            this.chunk('#');
+            this.chunk(node.value);
+        }
+    };
+
+    var TYPE$o = tokenizer.TYPE;
+
+    var IDENT$8 = TYPE$o.Ident;
+
+    var Identifier = {
+        name: 'Identifier',
+        structure: {
+            name: String
+        },
+        parse: function() {
+            return {
+                type: 'Identifier',
+                loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),
+                name: this.consume(IDENT$8)
+            };
+        },
+        generate: function(node) {
+            this.chunk(node.name);
+        }
+    };
+
+    var TYPE$p = tokenizer.TYPE;
+
+    var HASH$3 = TYPE$p.Hash;
+
+    // <hash-token>
+    var IdSelector = {
+        name: 'IdSelector',
+        structure: {
+            name: String
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+
+            // TODO: check value is an ident
+            this.eat(HASH$3);
+
+            return {
+                type: 'IdSelector',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                name: this.scanner.substrToCursor(start + 1)
+            };
+        },
+        generate: function(node) {
+            this.chunk('#');
+            this.chunk(node.name);
+        }
+    };
+
+    var TYPE$q = tokenizer.TYPE;
+
+    var IDENT$9 = TYPE$q.Ident;
+    var NUMBER$4 = TYPE$q.Number;
+    var DIMENSION$4 = TYPE$q.Dimension;
+    var LEFTPARENTHESIS$2 = TYPE$q.LeftParenthesis;
+    var RIGHTPARENTHESIS$3 = TYPE$q.RightParenthesis;
+    var COLON$2 = TYPE$q.Colon;
+    var DELIM$3 = TYPE$q.Delim;
+
+    var MediaFeature = {
+        name: 'MediaFeature',
+        structure: {
+            name: String,
+            value: ['Identifier', 'Number', 'Dimension', 'Ratio', null]
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+            var name;
+            var value = null;
+
+            this.eat(LEFTPARENTHESIS$2);
+            this.scanner.skipSC();
+
+            name = this.consume(IDENT$9);
+            this.scanner.skipSC();
+
+            if (this.scanner.tokenType !== RIGHTPARENTHESIS$3) {
+                this.eat(COLON$2);
+                this.scanner.skipSC();
+
+                switch (this.scanner.tokenType) {
+                    case NUMBER$4:
+                        if (this.lookupNonWSType(1) === DELIM$3) {
+                            value = this.Ratio();
+                        } else {
+                            value = this.Number();
+                        }
+
+                        break;
+
+                    case DIMENSION$4:
+                        value = this.Dimension();
+                        break;
+
+                    case IDENT$9:
+                        value = this.Identifier();
+
+                        break;
+
+                    default:
+                        this.error('Number, dimension, ratio or identifier is expected');
+                }
+
+                this.scanner.skipSC();
+            }
+
+            this.eat(RIGHTPARENTHESIS$3);
+
+            return {
+                type: 'MediaFeature',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                name: name,
+                value: value
+            };
+        },
+        generate: function(node) {
+            this.chunk('(');
+            this.chunk(node.name);
+            if (node.value !== null) {
+                this.chunk(':');
+                this.node(node.value);
+            }
+            this.chunk(')');
+        }
+    };
+
+    var TYPE$r = tokenizer.TYPE;
+
+    var WHITESPACE$8 = TYPE$r.WhiteSpace;
+    var COMMENT$8 = TYPE$r.Comment;
+    var IDENT$a = TYPE$r.Ident;
+    var LEFTPARENTHESIS$3 = TYPE$r.LeftParenthesis;
+
+    var MediaQuery = {
+        name: 'MediaQuery',
+        structure: {
+            children: [[
+                'Identifier',
+                'MediaFeature',
+                'WhiteSpace'
+            ]]
+        },
+        parse: function() {
+            this.scanner.skipSC();
+
+            var children = this.createList();
+            var child = null;
+            var space = null;
+
+            scan:
+            while (!this.scanner.eof) {
+                switch (this.scanner.tokenType) {
+                    case COMMENT$8:
+                        this.scanner.next();
+                        continue;
+
+                    case WHITESPACE$8:
+                        space = this.WhiteSpace();
+                        continue;
+
+                    case IDENT$a:
+                        child = this.Identifier();
+                        break;
+
+                    case LEFTPARENTHESIS$3:
+                        child = this.MediaFeature();
+                        break;
+
+                    default:
+                        break scan;
+                }
+
+                if (space !== null) {
+                    children.push(space);
+                    space = null;
+                }
+
+                children.push(child);
+            }
+
+            if (child === null) {
+                this.error('Identifier or parenthesis is expected');
+            }
+
+            return {
+                type: 'MediaQuery',
+                loc: this.getLocationFromList(children),
+                children: children
+            };
+        },
+        generate: function(node) {
+            this.children(node);
+        }
+    };
+
+    var COMMA$1 = tokenizer.TYPE.Comma;
+
+    var MediaQueryList = {
+        name: 'MediaQueryList',
+        structure: {
+            children: [[
+                'MediaQuery'
+            ]]
+        },
+        parse: function(relative) {
+            var children = this.createList();
+
+            this.scanner.skipSC();
+
+            while (!this.scanner.eof) {
+                children.push(this.MediaQuery(relative));
+
+                if (this.scanner.tokenType !== COMMA$1) {
+                    break;
+                }
+
+                this.scanner.next();
+            }
+
+            return {
+                type: 'MediaQueryList',
+                loc: this.getLocationFromList(children),
+                children: children
+            };
+        },
+        generate: function(node) {
+            this.children(node, function() {
+                this.chunk(',');
+            });
+        }
+    };
+
+    var Nth = {
+        name: 'Nth',
+        structure: {
+            nth: ['AnPlusB', 'Identifier'],
+            selector: ['SelectorList', null]
+        },
+        parse: function(allowOfClause) {
+            this.scanner.skipSC();
+
+            var start = this.scanner.tokenStart;
+            var end = start;
+            var selector = null;
+            var query;
+
+            if (this.scanner.lookupValue(0, 'odd') || this.scanner.lookupValue(0, 'even')) {
+                query = this.Identifier();
+            } else {
+                query = this.AnPlusB();
+            }
+
+            this.scanner.skipSC();
+
+            if (allowOfClause && this.scanner.lookupValue(0, 'of')) {
+                this.scanner.next();
+
+                selector = this.SelectorList();
+
+                if (this.needPositions) {
+                    end = this.getLastListNode(selector.children).loc.end.offset;
+                }
+            } else {
+                if (this.needPositions) {
+                    end = query.loc.end.offset;
+                }
+            }
+
+            return {
+                type: 'Nth',
+                loc: this.getLocation(start, end),
+                nth: query,
+                selector: selector
+            };
+        },
+        generate: function(node) {
+            this.node(node.nth);
+            if (node.selector !== null) {
+                this.chunk(' of ');
+                this.node(node.selector);
+            }
+        }
+    };
+
+    var NUMBER$5 = tokenizer.TYPE.Number;
+
+    var _Number = {
+        name: 'Number',
+        structure: {
+            value: String
+        },
+        parse: function() {
+            return {
+                type: 'Number',
+                loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),
+                value: this.consume(NUMBER$5)
+            };
+        },
+        generate: function(node) {
+            this.chunk(node.value);
+        }
+    };
+
+    // '/' | '*' | ',' | ':' | '+' | '-'
+    var Operator = {
+        name: 'Operator',
+        structure: {
+            value: String
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+
+            this.scanner.next();
+
+            return {
+                type: 'Operator',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                value: this.scanner.substrToCursor(start)
+            };
+        },
+        generate: function(node) {
+            this.chunk(node.value);
+        }
+    };
+
+    var TYPE$s = tokenizer.TYPE;
+
+    var LEFTPARENTHESIS$4 = TYPE$s.LeftParenthesis;
+    var RIGHTPARENTHESIS$4 = TYPE$s.RightParenthesis;
+
+    var Parentheses = {
+        name: 'Parentheses',
+        structure: {
+            children: [[]]
+        },
+        parse: function(readSequence, recognizer) {
+            var start = this.scanner.tokenStart;
+            var children = null;
+
+            this.eat(LEFTPARENTHESIS$4);
+
+            children = readSequence.call(this, recognizer);
+
+            if (!this.scanner.eof) {
+                this.eat(RIGHTPARENTHESIS$4);
+            }
+
+            return {
+                type: 'Parentheses',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                children: children
+            };
+        },
+        generate: function(node) {
+            this.chunk('(');
+            this.children(node);
+            this.chunk(')');
+        }
+    };
+
+    var consumeNumber$4 = utils.consumeNumber;
+    var TYPE$t = tokenizer.TYPE;
+
+    var PERCENTAGE$1 = TYPE$t.Percentage;
+
+    var Percentage = {
+        name: 'Percentage',
+        structure: {
+            value: String
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+            var numberEnd = consumeNumber$4(this.scanner.source, start);
+
+            this.eat(PERCENTAGE$1);
+
+            return {
+                type: 'Percentage',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                value: this.scanner.source.substring(start, numberEnd)
+            };
+        },
+        generate: function(node) {
+            this.chunk(node.value);
+            this.chunk('%');
+        }
+    };
+
+    var TYPE$u = tokenizer.TYPE;
+
+    var IDENT$b = TYPE$u.Ident;
+    var FUNCTION$1 = TYPE$u.Function;
+    var COLON$3 = TYPE$u.Colon;
+    var RIGHTPARENTHESIS$5 = TYPE$u.RightParenthesis;
+
+    // : [ <ident> | <function-token> <any-value>? ) ]
+    var PseudoClassSelector = {
+        name: 'PseudoClassSelector',
+        structure: {
+            name: String,
+            children: [['Raw'], null]
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+            var children = null;
+            var name;
+            var nameLowerCase;
+
+            this.eat(COLON$3);
+
+            if (this.scanner.tokenType === FUNCTION$1) {
+                name = this.consumeFunctionName();
+                nameLowerCase = name.toLowerCase();
+
+                if (this.pseudo.hasOwnProperty(nameLowerCase)) {
+                    this.scanner.skipSC();
+                    children = this.pseudo[nameLowerCase].call(this);
+                    this.scanner.skipSC();
+                } else {
+                    children = this.createList();
+                    children.push(
+                        this.Raw(this.scanner.tokenIndex, null, false)
+                    );
+                }
+
+                this.eat(RIGHTPARENTHESIS$5);
+            } else {
+                name = this.consume(IDENT$b);
+            }
+
+            return {
+                type: 'PseudoClassSelector',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                name: name,
+                children: children
+            };
+        },
+        generate: function(node) {
+            this.chunk(':');
+            this.chunk(node.name);
+
+            if (node.children !== null) {
+                this.chunk('(');
+                this.children(node);
+                this.chunk(')');
+            }
+        },
+        walkContext: 'function'
+    };
+
+    var TYPE$v = tokenizer.TYPE;
+
+    var IDENT$c = TYPE$v.Ident;
+    var FUNCTION$2 = TYPE$v.Function;
+    var COLON$4 = TYPE$v.Colon;
+    var RIGHTPARENTHESIS$6 = TYPE$v.RightParenthesis;
+
+    // :: [ <ident> | <function-token> <any-value>? ) ]
+    var PseudoElementSelector = {
+        name: 'PseudoElementSelector',
+        structure: {
+            name: String,
+            children: [['Raw'], null]
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+            var children = null;
+            var name;
+            var nameLowerCase;
+
+            this.eat(COLON$4);
+            this.eat(COLON$4);
+
+            if (this.scanner.tokenType === FUNCTION$2) {
+                name = this.consumeFunctionName();
+                nameLowerCase = name.toLowerCase();
+
+                if (this.pseudo.hasOwnProperty(nameLowerCase)) {
+                    this.scanner.skipSC();
+                    children = this.pseudo[nameLowerCase].call(this);
+                    this.scanner.skipSC();
+                } else {
+                    children = this.createList();
+                    children.push(
+                        this.Raw(this.scanner.tokenIndex, null, false)
+                    );
+                }
+
+                this.eat(RIGHTPARENTHESIS$6);
+            } else {
+                name = this.consume(IDENT$c);
+            }
+
+            return {
+                type: 'PseudoElementSelector',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                name: name,
+                children: children
+            };
+        },
+        generate: function(node) {
+            this.chunk('::');
+            this.chunk(node.name);
+
+            if (node.children !== null) {
+                this.chunk('(');
+                this.children(node);
+                this.chunk(')');
+            }
+        },
+        walkContext: 'function'
+    };
+
+    var isDigit$5 = tokenizer.isDigit;
+    var TYPE$w = tokenizer.TYPE;
+
+    var NUMBER$6 = TYPE$w.Number;
+    var DELIM$4 = TYPE$w.Delim;
+    var SOLIDUS$3 = 0x002F;  // U+002F SOLIDUS (/)
+    var FULLSTOP$1 = 0x002E; // U+002E FULL STOP (.)
+
+    // Terms of <ratio> should be a positive numbers (not zero or negative)
+    // (see https://drafts.csswg.org/mediaqueries-3/#values)
+    // However, -o-min-device-pixel-ratio takes fractional values as a ratio's term
+    // and this is using by various sites. Therefore we relax checking on parse
+    // to test a term is unsigned number without an exponent part.
+    // Additional checking may be applied on lexer validation.
+    function consumeNumber$5() {
+        this.scanner.skipWS();
+
+        var value = this.consume(NUMBER$6);
+
+        for (var i = 0; i < value.length; i++) {
+            var code = value.charCodeAt(i);
+            if (!isDigit$5(code) && code !== FULLSTOP$1) {
+                this.error('Unsigned number is expected', this.scanner.tokenStart - value.length + i);
+            }
+        }
+
+        if (Number(value) === 0) {
+            this.error('Zero number is not allowed', this.scanner.tokenStart - value.length);
+        }
+
+        return value;
+    }
+
+    // <positive-integer> S* '/' S* <positive-integer>
+    var Ratio = {
+        name: 'Ratio',
+        structure: {
+            left: String,
+            right: String
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+            var left = consumeNumber$5.call(this);
+            var right;
+
+            this.scanner.skipWS();
+
+            if (!this.scanner.isDelim(SOLIDUS$3)) {
+                this.error('Solidus is expected');
+            }
+            this.eat(DELIM$4);
+            right = consumeNumber$5.call(this);
+
+            return {
+                type: 'Ratio',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                left: left,
+                right: right
+            };
+        },
+        generate: function(node) {
+            this.chunk(node.left);
+            this.chunk('/');
+            this.chunk(node.right);
+        }
+    };
+
+    var TYPE$x = tokenizer.TYPE;
+    var rawMode$4 = Raw.mode;
+
+    var LEFTCURLYBRACKET$4 = TYPE$x.LeftCurlyBracket;
+
+    function consumeRaw$3(startToken) {
+        return this.Raw(startToken, rawMode$4.leftCurlyBracket, true);
+    }
+
+    function consumePrelude() {
+        var prelude = this.SelectorList();
+
+        if (prelude.type !== 'Raw' &&
+            this.scanner.eof === false &&
+            this.scanner.tokenType !== LEFTCURLYBRACKET$4) {
+            this.error();
+        }
+
+        return prelude;
+    }
+
+    var Rule = {
+        name: 'Rule',
+        structure: {
+            prelude: ['SelectorList', 'Raw'],
+            block: ['Block']
+        },
+        parse: function() {
+            var startToken = this.scanner.tokenIndex;
+            var startOffset = this.scanner.tokenStart;
+            var prelude;
+            var block;
+
+            if (this.parseRulePrelude) {
+                prelude = this.parseWithFallback(consumePrelude, consumeRaw$3);
+            } else {
+                prelude = consumeRaw$3.call(this, startToken);
+            }
+
+            block = this.Block(true);
+
+            return {
+                type: 'Rule',
+                loc: this.getLocation(startOffset, this.scanner.tokenStart),
+                prelude: prelude,
+                block: block
+            };
+        },
+        generate: function(node) {
+            this.node(node.prelude);
+            this.node(node.block);
+        },
+        walkContext: 'rule'
+    };
+
+    var Selector = {
+        name: 'Selector',
+        structure: {
+            children: [[
+                'TypeSelector',
+                'IdSelector',
+                'ClassSelector',
+                'AttributeSelector',
+                'PseudoClassSelector',
+                'PseudoElementSelector',
+                'Combinator',
+                'WhiteSpace'
+            ]]
+        },
+        parse: function() {
+            var children = this.readSequence(this.scope.Selector);
+
+            // nothing were consumed
+            if (this.getFirstListNode(children) === null) {
+                this.error('Selector is expected');
+            }
+
+            return {
+                type: 'Selector',
+                loc: this.getLocationFromList(children),
+                children: children
+            };
+        },
+        generate: function(node) {
+            this.children(node);
+        }
+    };
+
+    var TYPE$y = tokenizer.TYPE;
+
+    var COMMA$2 = TYPE$y.Comma;
+
+    var SelectorList = {
+        name: 'SelectorList',
+        structure: {
+            children: [[
+                'Selector',
+                'Raw'
+            ]]
+        },
+        parse: function() {
+            var children = this.createList();
+
+            while (!this.scanner.eof) {
+                children.push(this.Selector());
+
+                if (this.scanner.tokenType === COMMA$2) {
+                    this.scanner.next();
+                    continue;
+                }
+
+                break;
+            }
+
+            return {
+                type: 'SelectorList',
+                loc: this.getLocationFromList(children),
+                children: children
+            };
+        },
+        generate: function(node) {
+            this.children(node, function() {
+                this.chunk(',');
+            });
+        },
+        walkContext: 'selector'
+    };
+
+    var STRING$1 = tokenizer.TYPE.String;
+
+    var _String = {
+        name: 'String',
+        structure: {
+            value: String
+        },
+        parse: function() {
+            return {
+                type: 'String',
+                loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),
+                value: this.consume(STRING$1)
+            };
+        },
+        generate: function(node) {
+            this.chunk(node.value);
+        }
+    };
+
+    var TYPE$z = tokenizer.TYPE;
+
+    var WHITESPACE$9 = TYPE$z.WhiteSpace;
+    var COMMENT$9 = TYPE$z.Comment;
+    var ATKEYWORD$2 = TYPE$z.AtKeyword;
+    var CDO$1 = TYPE$z.CDO;
+    var CDC$1 = TYPE$z.CDC;
+    var EXCLAMATIONMARK$3 = 0x0021; // U+0021 EXCLAMATION MARK (!)
+
+    function consumeRaw$4(startToken) {
+        return this.Raw(startToken, null, false);
+    }
+
+    var StyleSheet = {
+        name: 'StyleSheet',
+        structure: {
+            children: [[
+                'Comment',
+                'CDO',
+                'CDC',
+                'Atrule',
+                'Rule',
+                'Raw'
+            ]]
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+            var children = this.createList();
+            var child;
+
+            
+            while (!this.scanner.eof) {
+                switch (this.scanner.tokenType) {
+                    case WHITESPACE$9:
+                        this.scanner.next();
+                        continue;
+
+                    case COMMENT$9:
+                        // ignore comments except exclamation comments (i.e. /*! .. */) on top level
+                        if (this.scanner.source.charCodeAt(this.scanner.tokenStart + 2) !== EXCLAMATIONMARK$3) {
+                            this.scanner.next();
+                            continue;
+                        }
+
+                        child = this.Comment();
+                        break;
+
+                    case CDO$1: // <!--
+                        child = this.CDO();
+                        break;
+
+                    case CDC$1: // -->
+                        child = this.CDC();
+                        break;
+
+                    // CSS Syntax Module Level 3
+                    // §2.2 Error handling
+                    // At the "top level" of a stylesheet, an <at-keyword-token> starts an at-rule.
+                    case ATKEYWORD$2:
+                        child = this.parseWithFallback(this.Atrule, consumeRaw$4);
+                        break;
+
+                    // Anything else starts a qualified rule ...
+                    default:
+                        child = this.parseWithFallback(this.Rule, consumeRaw$4);
+                }
+
+                children.push(child);
+            }
+
+            return {
+                type: 'StyleSheet',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                children: children
+            };
+        },
+        generate: function(node) {
+            this.children(node);
+        },
+        walkContext: 'stylesheet'
+    };
+
+    var TYPE$A = tokenizer.TYPE;
+
+    var IDENT$d = TYPE$A.Ident;
+    var ASTERISK$4 = 0x002A;     // U+002A ASTERISK (*)
+    var VERTICALLINE$2 = 0x007C; // U+007C VERTICAL LINE (|)
+
+    function eatIdentifierOrAsterisk() {
+        if (this.scanner.tokenType !== IDENT$d &&
+            this.scanner.isDelim(ASTERISK$4) === false) {
+            this.error('Identifier or asterisk is expected');
+        }
+
+        this.scanner.next();
+    }
+
+    // ident
+    // ident|ident
+    // ident|*
+    // *
+    // *|ident
+    // *|*
+    // |ident
+    // |*
+    var TypeSelector = {
+        name: 'TypeSelector',
+        structure: {
+            name: String
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+
+            if (this.scanner.isDelim(VERTICALLINE$2)) {
+                this.scanner.next();
+                eatIdentifierOrAsterisk.call(this);
+            } else {
+                eatIdentifierOrAsterisk.call(this);
+
+                if (this.scanner.isDelim(VERTICALLINE$2)) {
+                    this.scanner.next();
+                    eatIdentifierOrAsterisk.call(this);
+                }
+            }
+
+            return {
+                type: 'TypeSelector',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                name: this.scanner.substrToCursor(start)
+            };
+        },
+        generate: function(node) {
+            this.chunk(node.name);
+        }
+    };
+
+    var isHexDigit$4 = tokenizer.isHexDigit;
+    var cmpChar$4 = tokenizer.cmpChar;
+    var TYPE$B = tokenizer.TYPE;
+    var NAME$3 = tokenizer.NAME;
+
+    var IDENT$e = TYPE$B.Ident;
+    var NUMBER$7 = TYPE$B.Number;
+    var DIMENSION$5 = TYPE$B.Dimension;
+    var PLUSSIGN$6 = 0x002B;     // U+002B PLUS SIGN (+)
+    var HYPHENMINUS$4 = 0x002D;  // U+002D HYPHEN-MINUS (-)
+    var QUESTIONMARK$2 = 0x003F; // U+003F QUESTION MARK (?)
+    var U$1 = 0x0075;            // U+0075 LATIN SMALL LETTER U (u)
+
+    function eatHexSequence(offset, allowDash) {
+        for (var pos = this.scanner.tokenStart + offset, len = 0; pos < this.scanner.tokenEnd; pos++) {
+            var code = this.scanner.source.charCodeAt(pos);
+
+            if (code === HYPHENMINUS$4 && allowDash && len !== 0) {
+                if (eatHexSequence.call(this, offset + len + 1, false) === 0) {
+                    this.error();
+                }
+
+                return -1;
+            }
+
+            if (!isHexDigit$4(code)) {
+                this.error(
+                    allowDash && len !== 0
+                        ? 'HyphenMinus' + (len < 6 ? ' or hex digit' : '') + ' is expected'
+                        : (len < 6 ? 'Hex digit is expected' : 'Unexpected input'),
+                    pos
+                );
+            }
+
+            if (++len > 6) {
+                this.error('Too many hex digits', pos);
+            }    }
+
+        this.scanner.next();
+        return len;
+    }
+
+    function eatQuestionMarkSequence(max) {
+        var count = 0;
+
+        while (this.scanner.isDelim(QUESTIONMARK$2)) {
+            if (++count > max) {
+                this.error('Too many question marks');
+            }
+
+            this.scanner.next();
+        }
+    }
+
+    function startsWith$1(code) {
+        if (this.scanner.source.charCodeAt(this.scanner.tokenStart) !== code) {
+            this.error(NAME$3[code] + ' is expected');
+        }
+    }
+
+    // https://drafts.csswg.org/css-syntax/#urange
+    // Informally, the <urange> production has three forms:
+    // U+0001
+    //      Defines a range consisting of a single code point, in this case the code point "1".
+    // U+0001-00ff
+    //      Defines a range of codepoints between the first and the second value, in this case
+    //      the range between "1" and "ff" (255 in decimal) inclusive.
+    // U+00??
+    //      Defines a range of codepoints where the "?" characters range over all hex digits,
+    //      in this case defining the same as the value U+0000-00ff.
+    // In each form, a maximum of 6 digits is allowed for each hexadecimal number (if you treat "?" as a hexadecimal digit).
+    //
+    // <urange> =
+    //   u '+' <ident-token> '?'* |
+    //   u <dimension-token> '?'* |
+    //   u <number-token> '?'* |
+    //   u <number-token> <dimension-token> |
+    //   u <number-token> <number-token> |
+    //   u '+' '?'+
+    function scanUnicodeRange() {
+        var hexLength = 0;
+
+        // u '+' <ident-token> '?'*
+        // u '+' '?'+
+        if (this.scanner.isDelim(PLUSSIGN$6)) {
+            this.scanner.next();
+
+            if (this.scanner.tokenType === IDENT$e) {
+                hexLength = eatHexSequence.call(this, 0, true);
+                if (hexLength > 0) {
+                    eatQuestionMarkSequence.call(this, 6 - hexLength);
+                }
+                return;
+            }
+
+            if (this.scanner.isDelim(QUESTIONMARK$2)) {
+                this.scanner.next();
+                eatQuestionMarkSequence.call(this, 5);
+                return;
+            }
+
+            this.error('Hex digit or question mark is expected');
+            return;
+        }
+
+        // u <number-token> '?'*
+        // u <number-token> <dimension-token>
+        // u <number-token> <number-token>
+        if (this.scanner.tokenType === NUMBER$7) {
+            startsWith$1.call(this, PLUSSIGN$6);
+            hexLength = eatHexSequence.call(this, 1, true);
+
+            if (this.scanner.isDelim(QUESTIONMARK$2)) {
+                eatQuestionMarkSequence.call(this, 6 - hexLength);
+                return;
+            }
+
+            if (this.scanner.tokenType === DIMENSION$5 ||
+                this.scanner.tokenType === NUMBER$7) {
+                startsWith$1.call(this, HYPHENMINUS$4);
+                eatHexSequence.call(this, 1, false);
+                return;
+            }
+
+            return;
+        }
+
+        // u <dimension-token> '?'*
+        if (this.scanner.tokenType === DIMENSION$5) {
+            startsWith$1.call(this, PLUSSIGN$6);
+            hexLength = eatHexSequence.call(this, 1, true);
+
+            if (hexLength > 0) {
+                eatQuestionMarkSequence.call(this, 6 - hexLength);
+            }
+
+            return;
+        }
+
+        this.error();
+    }
+
+    var UnicodeRange = {
+        name: 'UnicodeRange',
+        structure: {
+            value: String
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+
+            // U or u
+            if (!cmpChar$4(this.scanner.source, start, U$1)) {
+                this.error('U is expected');
+            }
+
+            if (!cmpChar$4(this.scanner.source, start + 1, PLUSSIGN$6)) {
+                this.error('Plus sign is expected');
+            }
+
+            this.scanner.next();
+            scanUnicodeRange.call(this);
+
+            return {
+                type: 'UnicodeRange',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                value: this.scanner.substrToCursor(start)
+            };
+        },
+        generate: function(node) {
+            this.chunk(node.value);
+        }
+    };
+
+    var isWhiteSpace$2 = tokenizer.isWhiteSpace;
+    var cmpStr$5 = tokenizer.cmpStr;
+    var TYPE$C = tokenizer.TYPE;
+
+    var FUNCTION$3 = TYPE$C.Function;
+    var URL$1 = TYPE$C.Url;
+    var RIGHTPARENTHESIS$7 = TYPE$C.RightParenthesis;
+
+    // <url-token> | <function-token> <string> )
+    var Url = {
+        name: 'Url',
+        structure: {
+            value: ['String', 'Raw']
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+            var value;
+
+            switch (this.scanner.tokenType) {
+                case URL$1:
+                    var rawStart = start + 4;
+                    var rawEnd = this.scanner.tokenEnd - 1;
+
+                    while (rawStart < rawEnd && isWhiteSpace$2(this.scanner.source.charCodeAt(rawStart))) {
+                        rawStart++;
+                    }
+
+                    while (rawStart < rawEnd && isWhiteSpace$2(this.scanner.source.charCodeAt(rawEnd - 1))) {
+                        rawEnd--;
+                    }
+
+                    value = {
+                        type: 'Raw',
+                        loc: this.getLocation(rawStart, rawEnd),
+                        value: this.scanner.source.substring(rawStart, rawEnd)
+                    };
+
+                    this.eat(URL$1);
+                    break;
+
+                case FUNCTION$3:
+                    if (!cmpStr$5(this.scanner.source, this.scanner.tokenStart, this.scanner.tokenEnd, 'url(')) {
+                        this.error('Function name must be `url`');
+                    }
+
+                    this.eat(FUNCTION$3);
+                    this.scanner.skipSC();
+                    value = this.String();
+                    this.scanner.skipSC();
+                    this.eat(RIGHTPARENTHESIS$7);
+                    break;
+
+                default:
+                    this.error('Url or Function is expected');
+            }
+
+            return {
+                type: 'Url',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                value: value
+            };
+        },
+        generate: function(node) {
+            this.chunk('url');
+            this.chunk('(');
+            this.node(node.value);
+            this.chunk(')');
+        }
+    };
+
+    var Value = {
+        name: 'Value',
+        structure: {
+            children: [[]]
+        },
+        parse: function() {
+            var start = this.scanner.tokenStart;
+            var children = this.readSequence(this.scope.Value);
+
+            return {
+                type: 'Value',
+                loc: this.getLocation(start, this.scanner.tokenStart),
+                children: children
+            };
+        },
+        generate: function(node) {
+            this.children(node);
+        }
+    };
+
+    var WHITESPACE$a = tokenizer.TYPE.WhiteSpace;
+    var SPACE$2 = Object.freeze({
+        type: 'WhiteSpace',
+        loc: null,
+        value: ' '
+    });
+
+    var WhiteSpace$1 = {
+        name: 'WhiteSpace',
+        structure: {
+            value: String
+        },
+        parse: function() {
+            this.eat(WHITESPACE$a);
+            return SPACE$2;
+
+            // return {
+            //     type: 'WhiteSpace',
+            //     loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),
+            //     value: this.consume(WHITESPACE)
+            // };
+        },
+        generate: function(node) {
+            this.chunk(node.value);
+        }
+    };
+
+    var node = {
+        AnPlusB: AnPlusB,
+        Atrule: Atrule,
+        AtrulePrelude: AtrulePrelude,
+        AttributeSelector: AttributeSelector,
+        Block: Block,
+        Brackets: Brackets,
+        CDC: CDC_1,
+        CDO: CDO_1,
+        ClassSelector: ClassSelector,
+        Combinator: Combinator,
+        Comment: Comment,
+        Declaration: Declaration,
+        DeclarationList: DeclarationList,
+        Dimension: Dimension,
+        Function: _Function,
+        Hash: Hash,
+        Identifier: Identifier,
+        IdSelector: IdSelector,
+        MediaFeature: MediaFeature,
+        MediaQuery: MediaQuery,
+        MediaQueryList: MediaQueryList,
+        Nth: Nth,
+        Number: _Number,
+        Operator: Operator,
+        Parentheses: Parentheses,
+        Percentage: Percentage,
+        PseudoClassSelector: PseudoClassSelector,
+        PseudoElementSelector: PseudoElementSelector,
+        Ratio: Ratio,
+        Raw: Raw,
+        Rule: Rule,
+        Selector: Selector,
+        SelectorList: SelectorList,
+        String: _String,
+        StyleSheet: StyleSheet,
+        TypeSelector: TypeSelector,
+        UnicodeRange: UnicodeRange,
+        Url: Url,
+        Value: Value,
+        WhiteSpace: WhiteSpace$1
+    };
+
+    var lexer = {
+        generic: true,
+        types: data.types,
+        atrules: data.atrules,
+        properties: data.properties,
+        node: node
+    };
+
+    var cmpChar$5 = tokenizer.cmpChar;
+    var cmpStr$6 = tokenizer.cmpStr;
+    var TYPE$D = tokenizer.TYPE;
+
+    var IDENT$f = TYPE$D.Ident;
+    var STRING$2 = TYPE$D.String;
+    var NUMBER$8 = TYPE$D.Number;
+    var FUNCTION$4 = TYPE$D.Function;
+    var URL$2 = TYPE$D.Url;
+    var HASH$4 = TYPE$D.Hash;
+    var DIMENSION$6 = TYPE$D.Dimension;
+    var PERCENTAGE$2 = TYPE$D.Percentage;
+    var LEFTPARENTHESIS$5 = TYPE$D.LeftParenthesis;
+    var LEFTSQUAREBRACKET$3 = TYPE$D.LeftSquareBracket;
+    var COMMA$3 = TYPE$D.Comma;
+    var DELIM$5 = TYPE$D.Delim;
+    var NUMBERSIGN$3 = 0x0023;  // U+0023 NUMBER SIGN (#)
+    var ASTERISK$5 = 0x002A;    // U+002A ASTERISK (*)
+    var PLUSSIGN$7 = 0x002B;    // U+002B PLUS SIGN (+)
+    var HYPHENMINUS$5 = 0x002D; // U+002D HYPHEN-MINUS (-)
+    var SOLIDUS$4 = 0x002F;     // U+002F SOLIDUS (/)
+    var U$2 = 0x0075;           // U+0075 LATIN SMALL LETTER U (u)
+
+    var _default = function defaultRecognizer(context) {
+        switch (this.scanner.tokenType) {
+            case HASH$4:
+                return this.Hash();
+
+            case COMMA$3:
+                context.space = null;
+                context.ignoreWSAfter = true;
+                return this.Operator();
+
+            case LEFTPARENTHESIS$5:
+                return this.Parentheses(this.readSequence, context.recognizer);
+
+            case LEFTSQUAREBRACKET$3:
+                return this.Brackets(this.readSequence, context.recognizer);
+
+            case STRING$2:
+                return this.String();
+
+            case DIMENSION$6:
+                return this.Dimension();
+
+            case PERCENTAGE$2:
+                return this.Percentage();
+
+            case NUMBER$8:
+                return this.Number();
+
+            case FUNCTION$4:
+                return cmpStr$6(this.scanner.source, this.scanner.tokenStart, this.scanner.tokenEnd, 'url(')
+                    ? this.Url()
+                    : this.Function(this.readSequence, context.recognizer);
+
+            case URL$2:
+                return this.Url();
+
+            case IDENT$f:
+                // check for unicode range, it should start with u+ or U+
+                if (cmpChar$5(this.scanner.source, this.scanner.tokenStart, U$2) &&
+                    cmpChar$5(this.scanner.source, this.scanner.tokenStart + 1, PLUSSIGN$7)) {
+                    return this.UnicodeRange();
+                } else {
+                    return this.Identifier();
+                }
+
+            case DELIM$5:
+                var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+
+                if (code === SOLIDUS$4 ||
+                    code === ASTERISK$5 ||
+                    code === PLUSSIGN$7 ||
+                    code === HYPHENMINUS$5) {
+                    return this.Operator(); // TODO: replace with Delim
+                }
+
+                // TODO: produce a node with Delim node type
+
+                if (code === NUMBERSIGN$3) {
+                    this.error('Hex or identifier is expected', this.scanner.tokenStart + 1);
+                }
+
+                break;
+        }
+    };
+
+    var atrulePrelude = {
+        getNode: _default
+    };
+
+    var TYPE$E = tokenizer.TYPE;
+
+    var DELIM$6 = TYPE$E.Delim;
+    var IDENT$g = TYPE$E.Ident;
+    var DIMENSION$7 = TYPE$E.Dimension;
+    var PERCENTAGE$3 = TYPE$E.Percentage;
+    var NUMBER$9 = TYPE$E.Number;
+    var HASH$5 = TYPE$E.Hash;
+    var COLON$5 = TYPE$E.Colon;
+    var LEFTSQUAREBRACKET$4 = TYPE$E.LeftSquareBracket;
+    var NUMBERSIGN$4 = 0x0023;      // U+0023 NUMBER SIGN (#)
+    var ASTERISK$6 = 0x002A;        // U+002A ASTERISK (*)
+    var PLUSSIGN$8 = 0x002B;        // U+002B PLUS SIGN (+)
+    var SOLIDUS$5 = 0x002F;         // U+002F SOLIDUS (/)
+    var FULLSTOP$2 = 0x002E;        // U+002E FULL STOP (.)
+    var GREATERTHANSIGN$2 = 0x003E; // U+003E GREATER-THAN SIGN (>)
+    var VERTICALLINE$3 = 0x007C;    // U+007C VERTICAL LINE (|)
+    var TILDE$2 = 0x007E;           // U+007E TILDE (~)
+
+    function getNode(context) {
+        switch (this.scanner.tokenType) {
+            case LEFTSQUAREBRACKET$4:
+                return this.AttributeSelector();
+
+            case HASH$5:
+                return this.IdSelector();
+
+            case COLON$5:
+                if (this.scanner.lookupType(1) === COLON$5) {
+                    return this.PseudoElementSelector();
+                } else {
+                    return this.PseudoClassSelector();
+                }
+
+            case IDENT$g:
+                return this.TypeSelector();
+
+            case NUMBER$9:
+            case PERCENTAGE$3:
+                return this.Percentage();
+
+            case DIMENSION$7:
+                // throws when .123ident
+                if (this.scanner.source.charCodeAt(this.scanner.tokenStart) === FULLSTOP$2) {
+                    this.error('Identifier is expected', this.scanner.tokenStart + 1);
+                }
+                break;
+
+            case DELIM$6:
+                var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+
+                switch (code) {
+                    case PLUSSIGN$8:
+                    case GREATERTHANSIGN$2:
+                    case TILDE$2:
+                        context.space = null;
+                        context.ignoreWSAfter = true;
+                        return this.Combinator();
+
+                    case SOLIDUS$5:  // /deep/
+                        return this.Combinator();
+
+                    case FULLSTOP$2:
+                        return this.ClassSelector();
+
+                    case ASTERISK$6:
+                    case VERTICALLINE$3:
+                        return this.TypeSelector();
+
+                    case NUMBERSIGN$4:
+                        return this.IdSelector();
+                }
+
+                break;
+        }
+    }
+    var selector = {
+        getNode: getNode
+    };
+
+    // legacy IE function
+    // expression( <any-value> )
+    var expression = function() {
+        return this.createSingleNodeList(
+            this.Raw(this.scanner.tokenIndex, null, false)
+        );
+    };
+
+    var TYPE$F = tokenizer.TYPE;
+    var rawMode$5 = Raw.mode;
+
+    var COMMA$4 = TYPE$F.Comma;
+    var WHITESPACE$b = TYPE$F.WhiteSpace;
+
+    // var( <ident> , <value>? )
+    var _var = function() {
+        var children = this.createList();
+
+        this.scanner.skipSC();
+
+        // NOTE: Don't check more than a first argument is an ident, rest checks are for lexer
+        children.push(this.Identifier());
+
+        this.scanner.skipSC();
+
+        if (this.scanner.tokenType === COMMA$4) {
+            children.push(this.Operator());
+
+            const startIndex = this.scanner.tokenIndex;
+            const value = this.parseCustomProperty
+                ? this.Value(null)
+                : this.Raw(this.scanner.tokenIndex, rawMode$5.exclamationMarkOrSemicolon, false);
+
+            if (value.type === 'Value' && value.children.isEmpty()) {
+                for (let offset = startIndex - this.scanner.tokenIndex; offset <= 0; offset++) {
+                    if (this.scanner.lookupType(offset) === WHITESPACE$b) {
+                        value.children.appendData({
+                            type: 'WhiteSpace',
+                            loc: null,
+                            value: ' '
+                        });
+                        break;
+                    }
+                }
+            }
+
+            children.push(value);
+        }
+
+        return children;
+    };
+
+    var value = {
+        getNode: _default,
+        'expression': expression,
+        'var': _var
+    };
+
+    var scope = {
+        AtrulePrelude: atrulePrelude,
+        Selector: selector,
+        Value: value
+    };
+
+    var fontFace = {
+        parse: {
+            prelude: null,
+            block: function() {
+                return this.Block(true);
+            }
+        }
+    };
+
+    var TYPE$G = tokenizer.TYPE;
+
+    var STRING$3 = TYPE$G.String;
+    var IDENT$h = TYPE$G.Ident;
+    var URL$3 = TYPE$G.Url;
+    var FUNCTION$5 = TYPE$G.Function;
+    var LEFTPARENTHESIS$6 = TYPE$G.LeftParenthesis;
+
+    var _import = {
+        parse: {
+            prelude: function() {
+                var children = this.createList();
+
+                this.scanner.skipSC();
+
+                switch (this.scanner.tokenType) {
+                    case STRING$3:
+                        children.push(this.String());
+                        break;
+
+                    case URL$3:
+                    case FUNCTION$5:
+                        children.push(this.Url());
+                        break;
+
+                    default:
+                        this.error('String or url() is expected');
+                }
+
+                if (this.lookupNonWSType(0) === IDENT$h ||
+                    this.lookupNonWSType(0) === LEFTPARENTHESIS$6) {
+                    children.push(this.WhiteSpace());
+                    children.push(this.MediaQueryList());
+                }
+
+                return children;
+            },
+            block: null
+        }
+    };
+
+    var media = {
+        parse: {
+            prelude: function() {
+                return this.createSingleNodeList(
+                    this.MediaQueryList()
+                );
+            },
+            block: function() {
+                return this.Block(false);
+            }
+        }
+    };
+
+    var page = {
+        parse: {
+            prelude: function() {
+                return this.createSingleNodeList(
+                    this.SelectorList()
+                );
+            },
+            block: function() {
+                return this.Block(true);
+            }
+        }
+    };
+
+    var TYPE$H = tokenizer.TYPE;
+
+    var WHITESPACE$c = TYPE$H.WhiteSpace;
+    var COMMENT$a = TYPE$H.Comment;
+    var IDENT$i = TYPE$H.Ident;
+    var FUNCTION$6 = TYPE$H.Function;
+    var COLON$6 = TYPE$H.Colon;
+    var LEFTPARENTHESIS$7 = TYPE$H.LeftParenthesis;
+
+    function consumeRaw$5() {
+        return this.createSingleNodeList(
+            this.Raw(this.scanner.tokenIndex, null, false)
+        );
+    }
+
+    function parentheses() {
+        this.scanner.skipSC();
+
+        if (this.scanner.tokenType === IDENT$i &&
+            this.lookupNonWSType(1) === COLON$6) {
+            return this.createSingleNodeList(
+                this.Declaration()
+            );
+        }
+
+        return readSequence.call(this);
+    }
+
+    function readSequence() {
+        var children = this.createList();
+        var space = null;
+        var child;
+
+        this.scanner.skipSC();
+
+        scan:
+        while (!this.scanner.eof) {
+            switch (this.scanner.tokenType) {
+                case WHITESPACE$c:
+                    space = this.WhiteSpace();
+                    continue;
+
+                case COMMENT$a:
+                    this.scanner.next();
+                    continue;
+
+                case FUNCTION$6:
+                    child = this.Function(consumeRaw$5, this.scope.AtrulePrelude);
+                    break;
+
+                case IDENT$i:
+                    child = this.Identifier();
+                    break;
+
+                case LEFTPARENTHESIS$7:
+                    child = this.Parentheses(parentheses, this.scope.AtrulePrelude);
+                    break;
+
+                default:
+                    break scan;
+            }
+
+            if (space !== null) {
+                children.push(space);
+                space = null;
+            }
+
+            children.push(child);
+        }
+
+        return children;
+    }
+
+    var supports = {
+        parse: {
+            prelude: function() {
+                var children = readSequence.call(this);
+
+                if (this.getFirstListNode(children) === null) {
+                    this.error('Condition is expected');
+                }
+
+                return children;
+            },
+            block: function() {
+                return this.Block(false);
+            }
+        }
+    };
+
+    var atrule = {
+        'font-face': fontFace,
+        'import': _import,
+        'media': media,
+        'page': page,
+        'supports': supports
+    };
+
+    var dir = {
+        parse: function() {
+            return this.createSingleNodeList(
+                this.Identifier()
+            );
+        }
+    };
+
+    var has$1 = {
+        parse: function() {
+            return this.createSingleNodeList(
+                this.SelectorList()
+            );
+        }
+    };
+
+    var lang = {
+        parse: function() {
+            return this.createSingleNodeList(
+                this.Identifier()
+            );
+        }
+    };
+
+    var selectorList = {
+        parse: function selectorList() {
+            return this.createSingleNodeList(
+                this.SelectorList()
+            );
+        }
+    };
+
+    var matches = selectorList;
+
+    var not = selectorList;
+
+    var ALLOW_OF_CLAUSE = true;
+
+    var nthWithOfClause = {
+        parse: function nthWithOfClause() {
+            return this.createSingleNodeList(
+                this.Nth(ALLOW_OF_CLAUSE)
+            );
+        }
+    };
+
+    var nthChild = nthWithOfClause;
+
+    var nthLastChild = nthWithOfClause;
+
+    var DISALLOW_OF_CLAUSE = false;
+
+    var nth = {
+        parse: function nth() {
+            return this.createSingleNodeList(
+                this.Nth(DISALLOW_OF_CLAUSE)
+            );
+        }
+    };
+
+    var nthLastOfType = nth;
+
+    var nthOfType = nth;
+
+    var slotted = {
+        parse: function compoundSelector() {
+            return this.createSingleNodeList(
+                this.Selector()
+            );
+        }
+    };
+
+    var pseudo = {
+        'dir': dir,
+        'has': has$1,
+        'lang': lang,
+        'matches': matches,
+        'not': not,
+        'nth-child': nthChild,
+        'nth-last-child': nthLastChild,
+        'nth-last-of-type': nthLastOfType,
+        'nth-of-type': nthOfType,
+        'slotted': slotted
+    };
+
+    var parser = {
+        parseContext: {
+            default: 'StyleSheet',
+            stylesheet: 'StyleSheet',
+            atrule: 'Atrule',
+            atrulePrelude: function(options) {
+                return this.AtrulePrelude(options.atrule ? String(options.atrule) : null);
+            },
+            mediaQueryList: 'MediaQueryList',
+            mediaQuery: 'MediaQuery',
+            rule: 'Rule',
+            selectorList: 'SelectorList',
+            selector: 'Selector',
+            block: function() {
+                return this.Block(true);
+            },
+            declarationList: 'DeclarationList',
+            declaration: 'Declaration',
+            value: 'Value'
+        },
+        scope: scope,
+        atrule: atrule,
+        pseudo: pseudo,
+        node: node
+    };
+
+    var walker = {
+        node: node
+    };
+
+    var version = "1.1.3";
+    var _package = {
+    	version: version
+    };
+
+    var _package$1 = /*#__PURE__*/Object.freeze({
+        __proto__: null,
+        version: version,
+        'default': _package
+    });
+
+    var require$$4 = getCjsExportFromNamespace(_package$1);
+
+    function merge() {
+        var dest = {};
+
+        for (var i = 0; i < arguments.length; i++) {
+            var src = arguments[i];
+            for (var key in src) {
+                dest[key] = src[key];
+            }
+        }
+
+        return dest;
+    }
+
+    var syntax = create$4.create(
+        merge(
+            lexer,
+            parser,
+            walker
+        )
+    );
+    var version$1 = require$$4.version;
+    syntax.version = version$1;
+
+    var lib = syntax;
+
+    return lib;
+
+})));
diff --git a/node_modules/css-tree/dist/csstree.min.js b/node_modules/css-tree/dist/csstree.min.js
new file mode 100644
index 0000000..774475e
--- /dev/null
+++ b/node_modules/css-tree/dist/csstree.min.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).csstree=t()}(this,(function(){"use strict";function e(e){return{prev:null,next:null,data:e}}function t(e,t,n){var i;return null!==r?(i=r,r=r.cursor,i.prev=t,i.next=n,i.cursor=e.cursor):i={prev:t,next:n,cursor:e.cursor},e.cursor=i,i}function n(e){var t=e.cursor;e.cursor=t.cursor,t.prev=null,t.next=null,t.cursor=r,r=t}var r=null,i=function(){this.cursor=null,this.head=null,this.tail=null};i.createItem=e,i.prototype.createItem=e,i.prototype.updateCursors=function(e,t,n,r){for(var i=this.cursor;null!==i;)i.prev===e&&(i.prev=t),i.next===n&&(i.next=r),i=i.cursor},i.prototype.getSize=function(){for(var e=0,t=this.head;t;)e++,t=t.next;return e},i.prototype.fromArray=function(t){var n=null;this.head=null;for(var r=0;r<t.length;r++){var i=e(t[r]);null!==n?n.next=i:this.head=i,i.prev=n,n=i}return this.tail=n,this},i.prototype.toArray=function(){for(var e=this.head,t=[];e;)t.push(e.data),e=e.next;return t},i.prototype.toJSON=i.prototype.toArray,i.prototype.isEmpty=function(){return null===this.head},i.prototype.first=function(){return this.head&&this.head.data},i.prototype.last=function(){return this.tail&&this.tail.data},i.prototype.each=function(e,r){var i;void 0===r&&(r=this);for(var a=t(this,null,this.head);null!==a.next;)i=a.next,a.next=i.next,e.call(r,i.data,i,this);n(this)},i.prototype.forEach=i.prototype.each,i.prototype.eachRight=function(e,r){var i;void 0===r&&(r=this);for(var a=t(this,this.tail,null);null!==a.prev;)i=a.prev,a.prev=i.prev,e.call(r,i.data,i,this);n(this)},i.prototype.forEachRight=i.prototype.eachRight,i.prototype.reduce=function(e,r,i){var a;void 0===i&&(i=this);for(var o=t(this,null,this.head),s=r;null!==o.next;)a=o.next,o.next=a.next,s=e.call(i,s,a.data,a,this);return n(this),s},i.prototype.reduceRight=function(e,r,i){var a;void 0===i&&(i=this);for(var o=t(this,this.tail,null),s=r;null!==o.prev;)a=o.prev,o.prev=a.prev,s=e.call(i,s,a.data,a,this);return n(this),s},i.prototype.nextUntil=function(e,r,i){if(null!==e){var a;void 0===i&&(i=this);for(var o=t(this,null,e);null!==o.next&&(a=o.next,o.next=a.next,!r.call(i,a.data,a,this)););n(this)}},i.prototype.prevUntil=function(e,r,i){if(null!==e){var a;void 0===i&&(i=this);for(var o=t(this,e,null);null!==o.prev&&(a=o.prev,o.prev=a.prev,!r.call(i,a.data,a,this)););n(this)}},i.prototype.some=function(e,t){var n=this.head;for(void 0===t&&(t=this);null!==n;){if(e.call(t,n.data,n,this))return!0;n=n.next}return!1},i.prototype.map=function(e,t){var n=new i,r=this.head;for(void 0===t&&(t=this);null!==r;)n.appendData(e.call(t,r.data,r,this)),r=r.next;return n},i.prototype.filter=function(e,t){var n=new i,r=this.head;for(void 0===t&&(t=this);null!==r;)e.call(t,r.data,r,this)&&n.appendData(r.data),r=r.next;return n},i.prototype.clear=function(){this.head=null,this.tail=null},i.prototype.copy=function(){for(var t=new i,n=this.head;null!==n;)t.insert(e(n.data)),n=n.next;return t},i.prototype.prepend=function(e){return this.updateCursors(null,e,this.head,e),null!==this.head?(this.head.prev=e,e.next=this.head):this.tail=e,this.head=e,this},i.prototype.prependData=function(t){return this.prepend(e(t))},i.prototype.append=function(e){return this.insert(e)},i.prototype.appendData=function(t){return this.insert(e(t))},i.prototype.insert=function(e,t){if(null!=t)if(this.updateCursors(t.prev,e,t,e),null===t.prev){if(this.head!==t)throw new Error("before doesn't belong to list");this.head=e,t.prev=e,e.next=t,this.updateCursors(null,e)}else t.prev.next=e,e.prev=t.prev,t.prev=e,e.next=t;else this.updateCursors(this.tail,e,null,e),null!==this.tail?(this.tail.next=e,e.prev=this.tail):this.head=e,this.tail=e;return this},i.prototype.insertData=function(t,n){return this.insert(e(t),n)},i.prototype.remove=function(e){if(this.updateCursors(e,e.prev,e,e.next),null!==e.prev)e.prev.next=e.next;else{if(this.head!==e)throw new Error("item doesn't belong to list");this.head=e.next}if(null!==e.next)e.next.prev=e.prev;else{if(this.tail!==e)throw new Error("item doesn't belong to list");this.tail=e.prev}return e.prev=null,e.next=null,e},i.prototype.push=function(t){this.insert(e(t))},i.prototype.pop=function(){if(null!==this.tail)return this.remove(this.tail)},i.prototype.unshift=function(t){this.prepend(e(t))},i.prototype.shift=function(){if(null!==this.head)return this.remove(this.head)},i.prototype.prependList=function(e){return this.insertList(e,this.head)},i.prototype.appendList=function(e){return this.insertList(e)},i.prototype.insertList=function(e,t){return null===e.head||(null!=t?(this.updateCursors(t.prev,e.tail,t,e.head),null!==t.prev?(t.prev.next=e.head,e.head.prev=t.prev):this.head=e.head,t.prev=e.tail,e.tail.next=t):(this.updateCursors(this.tail,e.tail,null,e.head),null!==this.tail?(this.tail.next=e.head,e.head.prev=this.tail):this.head=e.head,this.tail=e.tail),e.head=null,e.tail=null),this},i.prototype.replace=function(e,t){"head"in t?this.insertList(t,e):this.insert(t,e),this.remove(e)};var a=i,o=function(e,t){var n=Object.create(SyntaxError.prototype),r=new Error;return n.name=e,n.message=t,Object.defineProperty(n,"stack",{get:function(){return(r.stack||"").replace(/^(.+\n){1,3}/,e+": "+t+"\n")}}),n};function s(e,t){function n(e,t){return r.slice(e,t).map((function(t,n){for(var r=String(e+n+1);r.length<l;)r=" "+r;return r+" |"+t})).join("\n")}var r=e.source.split(/\r\n?|\n|\f/),i=e.line,a=e.column,o=Math.max(1,i-t)-1,s=Math.min(i+t,r.length+1),l=Math.max(4,String(s).length)+1,c=0;(a+=("    ".length-1)*(r[i-1].substr(0,a-1).match(/\t/g)||[]).length)>100&&(c=a-60+3,a=58);for(var u=o;u<=s;u++)u>=0&&u<r.length&&(r[u]=r[u].replace(/\t/g,"    "),r[u]=(c>0&&r[u].length>c?"…":"")+r[u].substr(c,98)+(r[u].length>c+100-1?"…":""));return[n(o,i),new Array(a+l+2).join("-")+"^",n(i,s)].filter(Boolean).join("\n")}var l=function(e,t,n,r,i){var a=o("SyntaxError",e);return a.source=t,a.offset=n,a.line=r,a.column=i,a.sourceFragment=function(e){return s(a,isNaN(e)?0:e)},Object.defineProperty(a,"formattedMessage",{get:function(){return"Parse error: "+a.message+"\n"+s(a,2)}}),a.parseError={offset:n,line:r,column:i},a},c={EOF:0,Ident:1,Function:2,AtKeyword:3,Hash:4,String:5,BadString:6,Url:7,BadUrl:8,Delim:9,Number:10,Percentage:11,Dimension:12,WhiteSpace:13,CDO:14,CDC:15,Colon:16,Semicolon:17,Comma:18,LeftSquareBracket:19,RightSquareBracket:20,LeftParenthesis:21,RightParenthesis:22,LeftCurlyBracket:23,RightCurlyBracket:24,Comment:25},u=Object.keys(c).reduce((function(e,t){return e[c[t]]=t,e}),{}),h={TYPE:c,NAME:u};function p(e){return e>=48&&e<=57}function d(e){return e>=65&&e<=90}function m(e){return e>=97&&e<=122}function g(e){return d(e)||m(e)}function f(e){return e>=128}function b(e){return g(e)||f(e)||95===e}function y(e){return e>=0&&e<=8||11===e||e>=14&&e<=31||127===e}function k(e){return 10===e||13===e||12===e}function v(e){return k(e)||32===e||9===e}function x(e,t){return 92===e&&(!k(t)&&0!==t)}var w=new Array(128);C.Eof=128,C.WhiteSpace=130,C.Digit=131,C.NameStart=132,C.NonPrintable=133;for(var S=0;S<w.length;S++)switch(!0){case v(S):w[S]=C.WhiteSpace;break;case p(S):w[S]=C.Digit;break;case b(S):w[S]=C.NameStart;break;case y(S):w[S]=C.NonPrintable;break;default:w[S]=S||C.Eof}function C(e){return e<128?w[e]:C.NameStart}var z={isDigit:p,isHexDigit:function(e){return p(e)||e>=65&&e<=70||e>=97&&e<=102},isUppercaseLetter:d,isLowercaseLetter:m,isLetter:g,isNonAscii:f,isNameStart:b,isName:function(e){return b(e)||p(e)||45===e},isNonPrintable:y,isNewline:k,isWhiteSpace:v,isValidEscape:x,isIdentifierStart:function(e,t,n){return 45===e?b(t)||45===t||x(t,n):!!b(e)||92===e&&x(e,t)},isNumberStart:function(e,t,n){return 43===e||45===e?p(t)?2:46===t&&p(n)?3:0:46===e?p(t)?2:0:p(e)?1:0},isBOM:function(e){return 65279===e||65534===e?1:0},charCodeCategory:C},A=z.isDigit,P=z.isHexDigit,T=z.isUppercaseLetter,L=z.isName,E=z.isWhiteSpace,D=z.isValidEscape;function O(e,t){return t<e.length?e.charCodeAt(t):0}function B(e,t,n){return 13===n&&10===O(e,t+1)?2:1}function I(e,t,n){var r=e.charCodeAt(t);return T(r)&&(r|=32),r===n}function N(e,t){for(;t<e.length&&A(e.charCodeAt(t));t++);return t}function R(e,t){if(P(O(e,(t+=2)-1))){for(var n=Math.min(e.length,t+5);t<n&&P(O(e,t));t++);var r=O(e,t);E(r)&&(t+=B(e,t,r))}return t}var M={consumeEscaped:R,consumeName:function(e,t){for(;t<e.length;t++){var n=e.charCodeAt(t);if(!L(n)){if(!D(n,O(e,t+1)))break;t=R(e,t)-1}}return t},consumeNumber:function(e,t){var n=e.charCodeAt(t);if(43!==n&&45!==n||(n=e.charCodeAt(t+=1)),A(n)&&(t=N(e,t+1),n=e.charCodeAt(t)),46===n&&A(e.charCodeAt(t+1))&&(n=e.charCodeAt(t+=2),t=N(e,t)),I(e,t,101)){var r=0;45!==(n=e.charCodeAt(t+1))&&43!==n||(r=1,n=e.charCodeAt(t+2)),A(n)&&(t=N(e,t+1+r+1))}return t},consumeBadUrlRemnants:function(e,t){for(;t<e.length;t++){var n=e.charCodeAt(t);if(41===n){t++;break}D(n,O(e,t+1))&&(t=R(e,t))}return t},cmpChar:I,cmpStr:function(e,t,n,r){if(n-t!==r.length)return!1;if(t<0||n>e.length)return!1;for(var i=t;i<n;i++){var a=e.charCodeAt(i),o=r.charCodeAt(i-t);if(T(a)&&(a|=32),a!==o)return!1}return!0},getNewlineLength:B,findWhiteSpaceStart:function(e,t){for(;t>=0&&E(e.charCodeAt(t));t--);return t+1},findWhiteSpaceEnd:function(e,t){for(;t<e.length&&E(e.charCodeAt(t));t++);return t}},j=h.TYPE,_=h.NAME,F=M.cmpStr,W=j.EOF,q=j.WhiteSpace,Y=j.Comment,U=function(){this.offsetAndType=null,this.balance=null,this.reset()};U.prototype={reset:function(){this.eof=!1,this.tokenIndex=-1,this.tokenType=0,this.tokenStart=this.firstCharOffset,this.tokenEnd=this.firstCharOffset},lookupType:function(e){return(e+=this.tokenIndex)<this.tokenCount?this.offsetAndType[e]>>24:W},lookupOffset:function(e){return(e+=this.tokenIndex)<this.tokenCount?16777215&this.offsetAndType[e-1]:this.source.length},lookupValue:function(e,t){return(e+=this.tokenIndex)<this.tokenCount&&F(this.source,16777215&this.offsetAndType[e-1],16777215&this.offsetAndType[e],t)},getTokenStart:function(e){return e===this.tokenIndex?this.tokenStart:e>0?e<this.tokenCount?16777215&this.offsetAndType[e-1]:16777215&this.offsetAndType[this.tokenCount]:this.firstCharOffset},getRawLength:function(e,t){var n,r=e,i=16777215&this.offsetAndType[Math.max(r-1,0)];e:for(;r<this.tokenCount&&!((n=this.balance[r])<e);r++)switch(t(this.offsetAndType[r]>>24,this.source,i)){case 1:break e;case 2:r++;break e;default:this.balance[n]===r&&(r=n),i=16777215&this.offsetAndType[r]}return r-this.tokenIndex},isBalanceEdge:function(e){return this.balance[this.tokenIndex]<e},isDelim:function(e,t){return t?this.lookupType(t)===j.Delim&&this.source.charCodeAt(this.lookupOffset(t))===e:this.tokenType===j.Delim&&this.source.charCodeAt(this.tokenStart)===e},getTokenValue:function(){return this.source.substring(this.tokenStart,this.tokenEnd)},getTokenLength:function(){return this.tokenEnd-this.tokenStart},substrToCursor:function(e){return this.source.substring(e,this.tokenStart)},skipWS:function(){for(var e=this.tokenIndex,t=0;e<this.tokenCount&&this.offsetAndType[e]>>24===q;e++,t++);t>0&&this.skip(t)},skipSC:function(){for(;this.tokenType===q||this.tokenType===Y;)this.next()},skip:function(e){var t=this.tokenIndex+e;t<this.tokenCount?(this.tokenIndex=t,this.tokenStart=16777215&this.offsetAndType[t-1],t=this.offsetAndType[t],this.tokenType=t>>24,this.tokenEnd=16777215&t):(this.tokenIndex=this.tokenCount,this.next())},next:function(){var e=this.tokenIndex+1;e<this.tokenCount?(this.tokenIndex=e,this.tokenStart=this.tokenEnd,e=this.offsetAndType[e],this.tokenType=e>>24,this.tokenEnd=16777215&e):(this.tokenIndex=this.tokenCount,this.eof=!0,this.tokenType=W,this.tokenStart=this.tokenEnd=this.source.length)},forEachToken(e){for(var t=0,n=this.firstCharOffset;t<this.tokenCount;t++){var r=n,i=this.offsetAndType[t],a=16777215&i;n=a,e(i>>24,r,a,t)}},dump(){var e=new Array(this.tokenCount);return this.forEachToken((t,n,r,i)=>{e[i]={idx:i,type:_[t],chunk:this.source.substring(n,r),balance:this.balance[i]}}),e}};var H=U;function V(e){return e}function K(e,t,n,r){var i,a;switch(e.type){case"Group":i=function(e,t,n,r){var i=" "===e.combinator||r?e.combinator:" "+e.combinator+" ",a=e.terms.map((function(e){return K(e,t,n,r)})).join(i);return(e.explicit||n)&&(a=(r||","===a[0]?"[":"[ ")+a+(r?"]":" ]")),a}(e,t,n,r)+(e.disallowEmpty?"!":"");break;case"Multiplier":return K(e.term,t,n,r)+t(0===(a=e).min&&0===a.max?"*":0===a.min&&1===a.max?"?":1===a.min&&0===a.max?a.comma?"#":"+":1===a.min&&1===a.max?"":(a.comma?"#":"")+(a.min===a.max?"{"+a.min+"}":"{"+a.min+","+(0!==a.max?a.max:"")+"}"),e);case"Type":i="<"+e.name+(e.opts?t(function(e){switch(e.type){case"Range":return" ["+(null===e.min?"-∞":e.min)+","+(null===e.max?"∞":e.max)+"]";default:throw new Error("Unknown node type `"+e.type+"`")}}(e.opts),e.opts):"")+">";break;case"Property":i="<'"+e.name+"'>";break;case"Keyword":i=e.name;break;case"AtKeyword":i="@"+e.name;break;case"Function":i=e.name+"(";break;case"String":case"Token":i=e.value;break;case"Comma":i=",";break;default:throw new Error("Unknown node type `"+e.type+"`")}return t(i,e)}var G=function(e,t){var n=V,r=!1,i=!1;return"function"==typeof t?n=t:t&&(r=Boolean(t.forceBraces),i=Boolean(t.compact),"function"==typeof t.decorate&&(n=t.decorate)),K(e,n,r,i)};const Q={offset:0,line:1,column:1};function X(e,t){const n=e&&e.loc&&e.loc[t];return n?"line"in n?Z(n):n:null}function Z({offset:e,line:t,column:n},r){const i={offset:e,line:t,column:n};if(r){const e=r.split(/\n|\r\n?|\f/);i.offset+=r.length,i.line+=e.length-1,i.column=1===e.length?i.column+r.length:e.pop().length+1}return i}var $=function(e,t){const n=o("SyntaxReferenceError",e+(t?" `"+t+"`":""));return n.reference=t,n},J=function(e,t,n,r){const i=o("SyntaxMatchError",e),{css:a,mismatchOffset:s,mismatchLength:l,start:c,end:u}=function(e,t){const n=e.tokens,r=e.longestMatch,i=r<n.length&&n[r].node||null,a=i!==t?i:null;let o,s,l=0,c=0,u=0,h="";for(let e=0;e<n.length;e++){const t=n[e].value;e===r&&(c=t.length,l=h.length),null!==a&&n[e].node===a&&(e<=r?u++:u=0),h+=t}return r===n.length||u>1?(o=X(a||t,"end")||Z(Q,h),s=Z(o)):(o=X(a,"start")||Z(X(t,"start")||Q,h.slice(0,l)),s=X(a,"end")||Z(o,h.substr(l,c))),{css:h,mismatchOffset:l,mismatchLength:c,start:o,end:s}}(r,n);return i.rawMessage=e,i.syntax=t?G(t):"<generic>",i.css=a,i.mismatchOffset=s,i.mismatchLength=l,i.message=e+"\n  syntax: "+i.syntax+"\n   value: "+(a||"<empty string>")+"\n  --------"+new Array(i.mismatchOffset+1).join("-")+"^",Object.assign(i,c),i.loc={source:n&&n.loc&&n.loc.source||"<unknown>",start:c,end:u},i},ee=Object.prototype.hasOwnProperty,te=Object.create(null),ne=Object.create(null);function re(e,t){return t=t||0,e.length-t>=2&&45===e.charCodeAt(t)&&45===e.charCodeAt(t+1)}function ie(e,t){if(t=t||0,e.length-t>=3&&45===e.charCodeAt(t)&&45!==e.charCodeAt(t+1)){var n=e.indexOf("-",t+2);if(-1!==n)return e.substring(t,n+1)}return""}var ae={keyword:function(e){if(ee.call(te,e))return te[e];var t=e.toLowerCase();if(ee.call(te,t))return te[e]=te[t];var n=re(t,0),r=n?"":ie(t,0);return te[e]=Object.freeze({basename:t.substr(r.length),name:t,vendor:r,prefix:r,custom:n})},property:function(e){if(ee.call(ne,e))return ne[e];var t=e,n=e[0];"/"===n?n="/"===e[1]?"//":"/":"_"!==n&&"*"!==n&&"$"!==n&&"#"!==n&&"+"!==n&&"&"!==n&&(n="");var r=re(t,n.length);if(!r&&(t=t.toLowerCase(),ee.call(ne,t)))return ne[e]=ne[t];var i=r?"":ie(t,n.length),a=t.substr(0,n.length+i.length);return ne[e]=Object.freeze({basename:t.substr(a.length),name:t.substr(n.length),hack:n,vendor:i,prefix:a,custom:r})},isCustomProperty:re,vendorPrefix:ie},oe="undefined"!=typeof Uint32Array?Uint32Array:Array,se=function(e,t){return null===e||e.length<t?new oe(Math.max(t+1024,16384)):e},le=h.TYPE,ce=z.isNewline,ue=z.isName,he=z.isValidEscape,pe=z.isNumberStart,de=z.isIdentifierStart,me=z.charCodeCategory,ge=z.isBOM,fe=M.cmpStr,be=M.getNewlineLength,ye=M.findWhiteSpaceEnd,ke=M.consumeEscaped,ve=M.consumeName,xe=M.consumeNumber,we=M.consumeBadUrlRemnants;function Se(e,t){function n(t){return t<o?e.charCodeAt(t):0}function r(){return h=xe(e,h),de(n(h),n(h+1),n(h+2))?(f=le.Dimension,void(h=ve(e,h))):37===n(h)?(f=le.Percentage,void h++):void(f=le.Number)}function i(){const t=h;return h=ve(e,h),fe(e,t,h,"url")&&40===n(h)?34===n(h=ye(e,h+1))||39===n(h)?(f=le.Function,void(h=t+4)):void function(){for(f=le.Url,h=ye(e,h);h<e.length;h++){var t=e.charCodeAt(h);switch(me(t)){case 41:return void h++;case me.Eof:return;case me.WhiteSpace:return 41===n(h=ye(e,h))||h>=e.length?void(h<e.length&&h++):(h=we(e,h),void(f=le.BadUrl));case 34:case 39:case 40:case me.NonPrintable:return h=we(e,h),void(f=le.BadUrl);case 92:if(he(t,n(h+1))){h=ke(e,h)-1;break}return h=we(e,h),void(f=le.BadUrl)}}}():40===n(h)?(f=le.Function,void h++):void(f=le.Ident)}function a(t){for(t||(t=n(h++)),f=le.String;h<e.length;h++){var r=e.charCodeAt(h);switch(me(r)){case t:return void h++;case me.Eof:return;case me.WhiteSpace:if(ce(r))return h+=be(e,h,r),void(f=le.BadString);break;case 92:if(h===e.length-1)break;var i=n(h+1);ce(i)?h+=be(e,h+1,i):he(r,i)&&(h=ke(e,h)-1)}}}t||(t=new H);for(var o=(e=String(e||"")).length,s=se(t.offsetAndType,o+1),l=se(t.balance,o+1),c=0,u=ge(n(0)),h=u,p=0,d=0,m=0;h<o;){var g=e.charCodeAt(h),f=0;switch(l[c]=o,me(g)){case me.WhiteSpace:f=le.WhiteSpace,h=ye(e,h+1);break;case 34:a();break;case 35:ue(n(h+1))||he(n(h+1),n(h+2))?(f=le.Hash,h=ve(e,h+1)):(f=le.Delim,h++);break;case 39:a();break;case 40:f=le.LeftParenthesis,h++;break;case 41:f=le.RightParenthesis,h++;break;case 43:pe(g,n(h+1),n(h+2))?r():(f=le.Delim,h++);break;case 44:f=le.Comma,h++;break;case 45:pe(g,n(h+1),n(h+2))?r():45===n(h+1)&&62===n(h+2)?(f=le.CDC,h+=3):de(g,n(h+1),n(h+2))?i():(f=le.Delim,h++);break;case 46:pe(g,n(h+1),n(h+2))?r():(f=le.Delim,h++);break;case 47:42===n(h+1)?(f=le.Comment,1===(h=e.indexOf("*/",h+2)+2)&&(h=e.length)):(f=le.Delim,h++);break;case 58:f=le.Colon,h++;break;case 59:f=le.Semicolon,h++;break;case 60:33===n(h+1)&&45===n(h+2)&&45===n(h+3)?(f=le.CDO,h+=4):(f=le.Delim,h++);break;case 64:de(n(h+1),n(h+2),n(h+3))?(f=le.AtKeyword,h=ve(e,h+1)):(f=le.Delim,h++);break;case 91:f=le.LeftSquareBracket,h++;break;case 92:he(g,n(h+1))?i():(f=le.Delim,h++);break;case 93:f=le.RightSquareBracket,h++;break;case 123:f=le.LeftCurlyBracket,h++;break;case 125:f=le.RightCurlyBracket,h++;break;case me.Digit:r();break;case me.NameStart:i();break;case me.Eof:break;default:f=le.Delim,h++}switch(f){case p:for(p=(d=l[m=16777215&d])>>24,l[c]=m,l[m++]=c;m<c;m++)l[m]===o&&(l[m]=c);break;case le.LeftParenthesis:case le.Function:l[c]=d,d=(p=le.RightParenthesis)<<24|c;break;case le.LeftSquareBracket:l[c]=d,d=(p=le.RightSquareBracket)<<24|c;break;case le.LeftCurlyBracket:l[c]=d,d=(p=le.RightCurlyBracket)<<24|c}s[c++]=f<<24|h}for(s[c]=le.EOF<<24|h,l[c]=o,l[o]=o;0!==d;)d=l[m=16777215&d],l[m]=o;return t.source=e,t.firstCharOffset=u,t.offsetAndType=s,t.tokenCount=c,t.balance=l,t.reset(),t.next(),t}Object.keys(h).forEach((function(e){Se[e]=h[e]})),Object.keys(z).forEach((function(e){Se[e]=z[e]})),Object.keys(M).forEach((function(e){Se[e]=M[e]}));var Ce=Se,ze=Ce.isDigit,Ae=Ce.cmpChar,Pe=Ce.TYPE,Te=Pe.Delim,Le=Pe.WhiteSpace,Ee=Pe.Comment,De=Pe.Ident,Oe=Pe.Number,Be=Pe.Dimension;function Ie(e,t){return null!==e&&e.type===Te&&e.value.charCodeAt(0)===t}function Ne(e,t,n){for(;null!==e&&(e.type===Le||e.type===Ee);)e=n(++t);return t}function Re(e,t,n,r){if(!e)return 0;var i=e.value.charCodeAt(t);if(43===i||45===i){if(n)return 0;t++}for(;t<e.value.length;t++)if(!ze(e.value.charCodeAt(t)))return 0;return r+1}function Me(e,t,n){var r=!1,i=Ne(e,t,n);if(null===(e=n(i)))return t;if(e.type!==Oe){if(!Ie(e,43)&&!Ie(e,45))return t;if(r=!0,i=Ne(n(++i),i,n),null===(e=n(i))&&e.type!==Oe)return 0}if(!r){var a=e.value.charCodeAt(0);if(43!==a&&45!==a)return 0}return Re(e,r?0:1,r,i)}var je=Ce.isHexDigit,_e=Ce.cmpChar,Fe=Ce.TYPE,We=Fe.Ident,qe=Fe.Delim,Ye=Fe.Number,Ue=Fe.Dimension;function He(e,t){return null!==e&&e.type===qe&&e.value.charCodeAt(0)===t}function Ve(e,t){return e.value.charCodeAt(0)===t}function Ke(e,t,n){for(var r=t,i=0;r<e.value.length;r++){var a=e.value.charCodeAt(r);if(45===a&&n&&0!==i)return Ke(e,t+i+1,!1)>0?6:0;if(!je(a))return 0;if(++i>6)return 0}return i}function Ge(e,t,n){if(!e)return 0;for(;He(n(t),63);){if(++e>6)return 0;t++}return t}var Qe=Ce.isIdentifierStart,Xe=Ce.isHexDigit,Ze=Ce.isDigit,$e=Ce.cmpStr,Je=Ce.consumeNumber,et=Ce.TYPE,tt=["unset","initial","inherit"],nt=["calc(","-moz-calc(","-webkit-calc("];function rt(e,t){return t<e.length?e.charCodeAt(t):0}function it(e,t){return $e(e,0,e.length,t)}function at(e,t){for(var n=0;n<t.length;n++)if(it(e,t[n]))return!0;return!1}function ot(e,t){return t===e.length-2&&(92===e.charCodeAt(t)&&Ze(e.charCodeAt(t+1)))}function st(e,t,n){if(e&&"Range"===e.type){var r=Number(void 0!==n&&n!==t.length?t.substr(0,n):t);if(isNaN(r))return!0;if(null!==e.min&&r<e.min)return!0;if(null!==e.max&&r>e.max)return!0}return!1}function lt(e,t){var n=e.index,r=0;do{if(r++,e.balance<=n)break}while(e=t(r));return r}function ct(e){return function(t,n,r){return null===t?0:t.type===et.Function&&at(t.value,nt)?lt(t,n):e(t,n,r)}}function ut(e){return function(t){return null===t||t.type!==e?0:1}}function ht(e){return function(t,n,r){if(null===t||t.type!==et.Dimension)return 0;var i=Je(t.value,0);if(null!==e){var a=t.value.indexOf("\\",i),o=-1!==a&&ot(t.value,a)?t.value.substring(i,a):t.value.substr(i);if(!1===e.hasOwnProperty(o.toLowerCase()))return 0}return st(r,t.value,i)?0:1}}function pt(e){return"function"!=typeof e&&(e=function(){return 0}),function(t,n,r){return null!==t&&t.type===et.Number&&0===Number(t.value)?1:e(t,n,r)}}var dt,mt={"ident-token":ut(et.Ident),"function-token":ut(et.Function),"at-keyword-token":ut(et.AtKeyword),"hash-token":ut(et.Hash),"string-token":ut(et.String),"bad-string-token":ut(et.BadString),"url-token":ut(et.Url),"bad-url-token":ut(et.BadUrl),"delim-token":ut(et.Delim),"number-token":ut(et.Number),"percentage-token":ut(et.Percentage),"dimension-token":ut(et.Dimension),"whitespace-token":ut(et.WhiteSpace),"CDO-token":ut(et.CDO),"CDC-token":ut(et.CDC),"colon-token":ut(et.Colon),"semicolon-token":ut(et.Semicolon),"comma-token":ut(et.Comma),"[-token":ut(et.LeftSquareBracket),"]-token":ut(et.RightSquareBracket),"(-token":ut(et.LeftParenthesis),")-token":ut(et.RightParenthesis),"{-token":ut(et.LeftCurlyBracket),"}-token":ut(et.RightCurlyBracket),string:ut(et.String),ident:ut(et.Ident),"custom-ident":function(e){if(null===e||e.type!==et.Ident)return 0;var t=e.value.toLowerCase();return at(t,tt)||it(t,"default")?0:1},"custom-property-name":function(e){return null===e||e.type!==et.Ident||45!==rt(e.value,0)||45!==rt(e.value,1)?0:1},"hex-color":function(e){if(null===e||e.type!==et.Hash)return 0;var t=e.value.length;if(4!==t&&5!==t&&7!==t&&9!==t)return 0;for(var n=1;n<t;n++)if(!Xe(e.value.charCodeAt(n)))return 0;return 1},"id-selector":function(e){return null===e||e.type!==et.Hash?0:Qe(rt(e.value,1),rt(e.value,2),rt(e.value,3))?1:0},"an-plus-b":function(e,t){var n=0;if(!e)return 0;if(e.type===Oe)return Re(e,0,!1,n);if(e.type===De&&45===e.value.charCodeAt(0)){if(!Ae(e.value,1,110))return 0;switch(e.value.length){case 2:return Me(t(++n),n,t);case 3:return 45!==e.value.charCodeAt(2)?0:(n=Ne(t(++n),n,t),Re(e=t(n),0,!0,n));default:return 45!==e.value.charCodeAt(2)?0:Re(e,3,!0,n)}}else if(e.type===De||Ie(e,43)&&t(n+1).type===De){if(e.type!==De&&(e=t(++n)),null===e||!Ae(e.value,0,110))return 0;switch(e.value.length){case 1:return Me(t(++n),n,t);case 2:return 45!==e.value.charCodeAt(1)?0:(n=Ne(t(++n),n,t),Re(e=t(n),0,!0,n));default:return 45!==e.value.charCodeAt(1)?0:Re(e,2,!0,n)}}else if(e.type===Be){for(var r=e.value.charCodeAt(0),i=43===r||45===r?1:0,a=i;a<e.value.length&&ze(e.value.charCodeAt(a));a++);return a===i?0:Ae(e.value,a,110)?a+1===e.value.length?Me(t(++n),n,t):45!==e.value.charCodeAt(a+1)?0:a+2===e.value.length?(n=Ne(t(++n),n,t),Re(e=t(n),0,!0,n)):Re(e,a+2,!0,n):0}return 0},urange:function(e,t){var n=0;if(null===e||e.type!==We||!_e(e.value,0,117))return 0;if(null===(e=t(++n)))return 0;if(He(e,43))return null===(e=t(++n))?0:e.type===We?Ge(Ke(e,0,!0),++n,t):He(e,63)?Ge(1,++n,t):0;if(e.type===Ye){if(!Ve(e,43))return 0;var r=Ke(e,1,!0);return 0===r?0:null===(e=t(++n))?n:e.type===Ue||e.type===Ye?Ve(e,45)&&Ke(e,1,!1)?n+1:0:Ge(r,n,t)}return e.type===Ue&&Ve(e,43)?Ge(Ke(e,1,!0),++n,t):0},"declaration-value":function(e,t){if(!e)return 0;var n=0,r=0,i=e.index;e:do{switch(e.type){case et.BadString:case et.BadUrl:break e;case et.RightCurlyBracket:case et.RightParenthesis:case et.RightSquareBracket:if(e.balance>e.index||e.balance<i)break e;r--;break;case et.Semicolon:if(0===r)break e;break;case et.Delim:if("!"===e.value&&0===r)break e;break;case et.Function:case et.LeftParenthesis:case et.LeftSquareBracket:case et.LeftCurlyBracket:r++}if(n++,e.balance<=i)break}while(e=t(n));return n},"any-value":function(e,t){if(!e)return 0;var n=e.index,r=0;e:do{switch(e.type){case et.BadString:case et.BadUrl:break e;case et.RightCurlyBracket:case et.RightParenthesis:case et.RightSquareBracket:if(e.balance>e.index||e.balance<n)break e}if(r++,e.balance<=n)break}while(e=t(r));return r},dimension:ct(ht(null)),angle:ct(ht({deg:!0,grad:!0,rad:!0,turn:!0})),decibel:ct(ht({db:!0})),frequency:ct(ht({hz:!0,khz:!0})),flex:ct(ht({fr:!0})),length:ct(pt(ht({px:!0,mm:!0,cm:!0,in:!0,pt:!0,pc:!0,q:!0,em:!0,ex:!0,ch:!0,rem:!0,vh:!0,vw:!0,vmin:!0,vmax:!0,vm:!0}))),resolution:ct(ht({dpi:!0,dpcm:!0,dppx:!0,x:!0})),semitones:ct(ht({st:!0})),time:ct(ht({s:!0,ms:!0})),percentage:ct((function(e,t,n){return null===e||e.type!==et.Percentage||st(n,e.value,e.value.length-1)?0:1})),zero:pt(),number:ct((function(e,t,n){if(null===e)return 0;var r=Je(e.value,0);return r===e.value.length||ot(e.value,r)?st(n,e.value,r)?0:1:0})),integer:ct((function(e,t,n){if(null===e||e.type!==et.Number)return 0;for(var r=43===e.value.charCodeAt(0)||45===e.value.charCodeAt(0)?1:0;r<e.value.length;r++)if(!Ze(e.value.charCodeAt(r)))return 0;return st(n,e.value,r)?0:1})),"-ms-legacy-expression":(dt="expression",dt+="(",function(e,t){return null!==e&&it(e.value,dt)?lt(e,t):0})},gt=function(e,t,n){var r=o("SyntaxError",e);return r.input=t,r.offset=n,r.rawMessage=e,r.message=r.rawMessage+"\n  "+r.input+"\n--"+new Array((r.offset||r.input.length)+1).join("-")+"^",r},ft=function(e){this.str=e,this.pos=0};ft.prototype={charCodeAt:function(e){return e<this.str.length?this.str.charCodeAt(e):0},charCode:function(){return this.charCodeAt(this.pos)},nextCharCode:function(){return this.charCodeAt(this.pos+1)},nextNonWsCode:function(e){return this.charCodeAt(this.findWsEnd(e))},findWsEnd:function(e){for(;e<this.str.length;e++){var t=this.str.charCodeAt(e);if(13!==t&&10!==t&&12!==t&&32!==t&&9!==t)break}return e},substringToPos:function(e){return this.str.substring(this.pos,this.pos=e)},eat:function(e){this.charCode()!==e&&this.error("Expect `"+String.fromCharCode(e)+"`"),this.pos++},peek:function(){return this.pos<this.str.length?this.str.charAt(this.pos++):""},error:function(e){throw new gt(e,this.str,this.pos)}};var bt=ft,yt=function(e){for(var t="function"==typeof Uint32Array?new Uint32Array(128):new Array(128),n=0;n<128;n++)t[n]=e(String.fromCharCode(n))?1:0;return t}((function(e){return/[a-zA-Z0-9\-]/.test(e)})),kt={" ":1,"&&":2,"||":3,"|":4};function vt(e){return e.substringToPos(e.findWsEnd(e.pos))}function xt(e){for(var t=e.pos;t<e.str.length;t++){var n=e.str.charCodeAt(t);if(n>=128||0===yt[n])break}return e.pos===t&&e.error("Expect a keyword"),e.substringToPos(t)}function wt(e){for(var t=e.pos;t<e.str.length;t++){var n=e.str.charCodeAt(t);if(n<48||n>57)break}return e.pos===t&&e.error("Expect a number"),e.substringToPos(t)}function St(e){var t=e.str.indexOf("'",e.pos+1);return-1===t&&(e.pos=e.str.length,e.error("Expect an apostrophe")),e.substringToPos(t+1)}function Ct(e){var t,n=null;return e.eat(123),t=wt(e),44===e.charCode()?(e.pos++,125!==e.charCode()&&(n=wt(e))):n=t,e.eat(125),{min:Number(t),max:n?Number(n):0}}function zt(e,t){var n=function(e){var t=null,n=!1;switch(e.charCode()){case 42:e.pos++,t={min:0,max:0};break;case 43:e.pos++,t={min:1,max:0};break;case 63:e.pos++,t={min:0,max:1};break;case 35:e.pos++,n=!0,t=123===e.charCode()?Ct(e):{min:1,max:0};break;case 123:t=Ct(e);break;default:return null}return{type:"Multiplier",comma:n,min:t.min,max:t.max,term:null}}(e);return null!==n?(n.term=t,n):t}function At(e){var t=e.peek();return""===t?null:{type:"Token",value:t}}function Pt(e){var t,n=null;return e.eat(60),t=xt(e),40===e.charCode()&&41===e.nextCharCode()&&(e.pos+=2,t+="()"),91===e.charCodeAt(e.findWsEnd(e.pos))&&(vt(e),n=function(e){var t=null,n=null,r=1;return e.eat(91),45===e.charCode()&&(e.peek(),r=-1),-1==r&&8734===e.charCode()?e.peek():t=r*Number(wt(e)),vt(e),e.eat(44),vt(e),8734===e.charCode()?e.peek():(r=1,45===e.charCode()&&(e.peek(),r=-1),n=r*Number(wt(e))),e.eat(93),null===t&&null===n?null:{type:"Range",min:t,max:n}}(e)),e.eat(62),zt(e,{type:"Type",name:t,opts:n})}function Tt(e,t){function n(e,t){return{type:"Group",terms:e,combinator:t,disallowEmpty:!1,explicit:!1}}for(t=Object.keys(t).sort((function(e,t){return kt[e]-kt[t]}));t.length>0;){for(var r=t.shift(),i=0,a=0;i<e.length;i++){var o=e[i];"Combinator"===o.type&&(o.value===r?(-1===a&&(a=i-1),e.splice(i,1),i--):(-1!==a&&i-a>1&&(e.splice(a,i-a,n(e.slice(a,i),r)),i=a+1),a=-1))}-1!==a&&t.length&&e.splice(a,i-a,n(e.slice(a,i),r))}return r}function Lt(e){for(var t,n=[],r={},i=null,a=e.pos;t=Et(e);)"Spaces"!==t.type&&("Combinator"===t.type?(null!==i&&"Combinator"!==i.type||(e.pos=a,e.error("Unexpected combinator")),r[t.value]=!0):null!==i&&"Combinator"!==i.type&&(r[" "]=!0,n.push({type:"Combinator",value:" "})),n.push(t),i=t,a=e.pos);return null!==i&&"Combinator"===i.type&&(e.pos-=a,e.error("Unexpected combinator")),{type:"Group",terms:n,combinator:Tt(n,r)||" ",disallowEmpty:!1,explicit:!1}}function Et(e){var t=e.charCode();if(t<128&&1===yt[t])return function(e){var t;return t=xt(e),40===e.charCode()?(e.pos++,{type:"Function",name:t}):zt(e,{type:"Keyword",name:t})}(e);switch(t){case 93:break;case 91:return zt(e,function(e){var t;return e.eat(91),t=Lt(e),e.eat(93),t.explicit=!0,33===e.charCode()&&(e.pos++,t.disallowEmpty=!0),t}(e));case 60:return 39===e.nextCharCode()?function(e){var t;return e.eat(60),e.eat(39),t=xt(e),e.eat(39),e.eat(62),zt(e,{type:"Property",name:t})}(e):Pt(e);case 124:return{type:"Combinator",value:e.substringToPos(124===e.nextCharCode()?e.pos+2:e.pos+1)};case 38:return e.pos++,e.eat(38),{type:"Combinator",value:"&&"};case 44:return e.pos++,{type:"Comma"};case 39:return zt(e,{type:"String",value:St(e)});case 32:case 9:case 10:case 13:case 12:return{type:"Spaces",value:vt(e)};case 64:return(t=e.nextCharCode())<128&&1===yt[t]?(e.pos++,{type:"AtKeyword",name:xt(e)}):At(e);case 42:case 43:case 63:case 35:case 33:break;case 123:if((t=e.nextCharCode())<48||t>57)return At(e);break;default:return At(e)}}function Dt(e){var t=new bt(e),n=Lt(t);return t.pos!==e.length&&t.error("Unexpected input"),1===n.terms.length&&"Group"===n.terms[0].type&&(n=n.terms[0]),n}Dt("[a&&<b>#|<'c'>*||e() f{2} /,(% g#{1,2} h{2,})]!");var Ot=Dt,Bt=function(){};function It(e){return"function"==typeof e?e:Bt}var Nt=function(e,t,n){var r=Bt,i=Bt;if("function"==typeof t?r=t:t&&(r=It(t.enter),i=It(t.leave)),r===Bt&&i===Bt)throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function");!function e(t){switch(r.call(n,t),t.type){case"Group":t.terms.forEach(e);break;case"Multiplier":e(t.term);break;case"Type":case"Property":case"Keyword":case"AtKeyword":case"Function":case"String":case"Token":case"Comma":break;default:throw new Error("Unknown type: "+t.type)}i.call(n,t)}(e)},Rt=new H,Mt={decorator:function(e){var t=null,n={len:0,node:null},r=[n],i="";return{children:e.children,node:function(n){var r=t;t=n,e.node.call(this,n),t=r},chunk:function(e){i+=e,n.node!==t?r.push({len:e.length,node:t}):n.len+=e.length},result:function(){return jt(i,r)}}}};function jt(e,t){var n=[],r=0,i=0,a=t?t[i].node:null;for(Ce(e,Rt);!Rt.eof;){if(t)for(;i<t.length&&r+t[i].len<=Rt.tokenStart;)r+=t[i++].len,a=t[i].node;n.push({type:Rt.tokenType,value:Rt.getTokenValue(),index:Rt.tokenIndex,balance:Rt.balance[Rt.tokenIndex],node:a}),Rt.next()}return n}var _t={type:"Match"},Ft={type:"Mismatch"},Wt={type:"DisallowEmpty"};function qt(e,t,n){return t===_t&&n===Ft||e===_t&&t===_t&&n===_t?e:("If"===e.type&&e.else===Ft&&t===_t&&(t=e.then,e=e.match),{type:"If",match:e,then:t,else:n})}function Yt(e){return e.length>2&&40===e.charCodeAt(e.length-2)&&41===e.charCodeAt(e.length-1)}function Ut(e){return"Keyword"===e.type||"AtKeyword"===e.type||"Function"===e.type||"Type"===e.type&&Yt(e.name)}function Ht(e){if("function"==typeof e)return{type:"Generic",fn:e};switch(e.type){case"Group":var t=function e(t,n,r){switch(t){case" ":for(var i=_t,a=n.length-1;a>=0;a--){i=qt(l=n[a],i,Ft)}return i;case"|":i=Ft;var o=null;for(a=n.length-1;a>=0;a--){if(Ut(l=n[a])&&(null===o&&a>0&&Ut(n[a-1])&&(i=qt({type:"Enum",map:o=Object.create(null)},_t,i)),null!==o)){var s=(Yt(l.name)?l.name.slice(0,-1):l.name).toLowerCase();if(s in o==!1){o[s]=l;continue}}o=null,i=qt(l,_t,i)}return i;case"&&":if(n.length>5)return{type:"MatchOnce",terms:n,all:!0};for(i=Ft,a=n.length-1;a>=0;a--){var l=n[a];c=n.length>1?e(t,n.filter((function(e){return e!==l})),!1):_t,i=qt(l,c,i)}return i;case"||":if(n.length>5)return{type:"MatchOnce",terms:n,all:!1};for(i=r?_t:Ft,a=n.length-1;a>=0;a--){var c;l=n[a];c=n.length>1?e(t,n.filter((function(e){return e!==l})),!0):_t,i=qt(l,c,i)}return i}}(e.combinator,e.terms.map(Ht),!1);return e.disallowEmpty&&(t=qt(t,Wt,Ft)),t;case"Multiplier":return function(e){var t=_t,n=Ht(e.term);if(0===e.max)n=qt(n,Wt,Ft),(t=qt(n,null,Ft)).then=qt(_t,_t,t),e.comma&&(t.then.else=qt({type:"Comma",syntax:e},t,Ft));else for(var r=e.min||1;r<=e.max;r++)e.comma&&t!==_t&&(t=qt({type:"Comma",syntax:e},t,Ft)),t=qt(n,qt(_t,_t,t),Ft);if(0===e.min)t=qt(_t,_t,t);else for(r=0;r<e.min-1;r++)e.comma&&t!==_t&&(t=qt({type:"Comma",syntax:e},t,Ft)),t=qt(n,t,Ft);return t}(e);case"Type":case"Property":return{type:e.type,name:e.name,syntax:e};case"Keyword":return{type:e.type,name:e.name.toLowerCase(),syntax:e};case"AtKeyword":return{type:e.type,name:"@"+e.name.toLowerCase(),syntax:e};case"Function":return{type:e.type,name:e.name.toLowerCase()+"(",syntax:e};case"String":return 3===e.value.length?{type:"Token",value:e.value.charAt(1),syntax:e}:{type:e.type,value:e.value.substr(1,e.value.length-2).replace(/\\'/g,"'"),syntax:e};case"Token":return{type:e.type,value:e.value,syntax:e};case"Comma":return{type:e.type,syntax:e};default:throw new Error("Unknown node type:",e.type)}}var Vt=_t,Kt=Ft,Gt=Wt,Qt=function(e,t){return"string"==typeof e&&(e=Ot(e)),{type:"MatchGraph",match:Ht(e),syntax:t||null,source:e}},Xt=Object.prototype.hasOwnProperty,Zt=Vt,$t=Kt,Jt=Gt,en=h.TYPE;function tn(e){for(var t=null,n=null,r=e;null!==r;)n=r.prev,r.prev=t,t=r,r=n;return t}function nn(e,t){if(e.length!==t.length)return!1;for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r>=65&&r<=90&&(r|=32),r!==t.charCodeAt(n))return!1}return!0}function rn(e){return null===e||(e.type===en.Comma||e.type===en.Function||e.type===en.LeftParenthesis||e.type===en.LeftSquareBracket||e.type===en.LeftCurlyBracket||function(e){return e.type===en.Delim&&"?"!==e.value}(e))}function an(e){return null===e||(e.type===en.RightParenthesis||e.type===en.RightSquareBracket||e.type===en.RightCurlyBracket||e.type===en.Delim)}function on(e,t,n){function r(){do{b++,f=b<e.length?e[b]:null}while(null!==f&&(f.type===en.WhiteSpace||f.type===en.Comment))}function i(t){var n=b+t;return n<e.length?e[n]:null}function a(e,t){return{nextState:e,matchStack:k,syntaxStack:u,thenStack:h,tokenIndex:b,prev:t}}function o(e){h={nextState:e,matchStack:k,syntaxStack:u,prev:h}}function s(e){p=a(e,p)}function l(){k={type:1,syntax:t.syntax,token:f,prev:k},r(),d=null,b>y&&(y=b)}function c(){k=2===k.type?k.prev:{type:3,syntax:u.syntax,token:k.token,prev:k},u=u.prev}var u=null,h=null,p=null,d=null,m=0,g=null,f=null,b=-1,y=0,k={type:0,syntax:null,token:null,prev:null};for(r();null===g&&++m<15e3;)switch(t.type){case"Match":if(null===h){if(null!==f&&(b!==e.length-1||"\\0"!==f.value&&"\\9"!==f.value)){t=$t;break}g="Match";break}if((t=h.nextState)===Jt){if(h.matchStack===k){t=$t;break}t=Zt}for(;h.syntaxStack!==u;)c();h=h.prev;break;case"Mismatch":if(null!==d&&!1!==d)(null===p||b>p.tokenIndex)&&(p=d,d=!1);else if(null===p){g="Mismatch";break}t=p.nextState,h=p.thenStack,u=p.syntaxStack,k=p.matchStack,b=p.tokenIndex,f=b<e.length?e[b]:null,p=p.prev;break;case"MatchGraph":t=t.match;break;case"If":t.else!==$t&&s(t.else),t.then!==Zt&&o(t.then),t=t.match;break;case"MatchOnce":t={type:"MatchOnceBuffer",syntax:t,index:0,mask:0};break;case"MatchOnceBuffer":var v=t.syntax.terms;if(t.index===v.length){if(0===t.mask||t.syntax.all){t=$t;break}t=Zt;break}if(t.mask===(1<<v.length)-1){t=Zt;break}for(;t.index<v.length;t.index++){var x=1<<t.index;if(0==(t.mask&x)){s(t),o({type:"AddMatchOnce",syntax:t.syntax,mask:t.mask|x}),t=v[t.index++];break}}break;case"AddMatchOnce":t={type:"MatchOnceBuffer",syntax:t.syntax,index:0,mask:t.mask};break;case"Enum":if(null!==f)if(-1!==(A=f.value.toLowerCase()).indexOf("\\")&&(A=A.replace(/\\[09].*$/,"")),Xt.call(t.map,A)){t=t.map[A];break}t=$t;break;case"Generic":var w=null!==u?u.opts:null,S=b+Math.floor(t.fn(f,i,w));if(!isNaN(S)&&S>b){for(;b<S;)l();t=Zt}else t=$t;break;case"Type":case"Property":var C="Type"===t.type?"types":"properties",z=Xt.call(n,C)?n[C][t.name]:null;if(!z||!z.match)throw new Error("Bad syntax reference: "+("Type"===t.type?"<"+t.name+">":"<'"+t.name+"'>"));if(!1!==d&&null!==f&&"Type"===t.type)if("custom-ident"===t.name&&f.type===en.Ident||"length"===t.name&&"0"===f.value){null===d&&(d=a(t,p)),t=$t;break}u={syntax:t.syntax,opts:t.syntax.opts||null!==u&&u.opts||null,prev:u},k={type:2,syntax:t.syntax,token:k.token,prev:k},t=z.match;break;case"Keyword":var A=t.name;if(null!==f){var P=f.value;if(-1!==P.indexOf("\\")&&(P=P.replace(/\\[09].*$/,"")),nn(P,A)){l(),t=Zt;break}}t=$t;break;case"AtKeyword":case"Function":if(null!==f&&nn(f.value,t.name)){l(),t=Zt;break}t=$t;break;case"Token":if(null!==f&&f.value===t.value){l(),t=Zt;break}t=$t;break;case"Comma":null!==f&&f.type===en.Comma?rn(k.token)?t=$t:(l(),t=an(f)?$t:Zt):t=rn(k.token)||an(f)?Zt:$t;break;case"String":var T="";for(S=b;S<e.length&&T.length<t.value.length;S++)T+=e[S].value;if(nn(T,t.value)){for(;b<S;)l();t=Zt}else t=$t;break;default:throw new Error("Unknown node type: "+t.type)}switch(m,g){case null:console.warn("[csstree-match] BREAK after 15000 iterations"),g="Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)",k=null;break;case"Match":for(;null!==u;)c();break;default:k=null}return{tokens:e,reason:g,iterations:m,match:k,longestMatch:y}}var sn=function(e,t,n){var r=on(e,t,n||{});if(null===r.match)return r;var i=r.match,a=r.match={syntax:t.syntax||null,match:[]},o=[a];for(i=tn(i).prev;null!==i;){switch(i.type){case 2:a.match.push(a={syntax:i.syntax,match:[]}),o.push(a);break;case 3:o.pop(),a=o[o.length-1];break;default:a.match.push({syntax:i.syntax||null,token:i.token.value,node:i.token.node})}i=i.prev}return r};function ln(e){function t(e){return null!==e&&("Type"===e.type||"Property"===e.type||"Keyword"===e.type)}var n=null;return null!==this.matched&&function r(i){if(Array.isArray(i.match)){for(var a=0;a<i.match.length;a++)if(r(i.match[a]))return t(i.syntax)&&n.unshift(i.syntax),!0}else if(i.node===e)return n=t(i.syntax)?[i.syntax]:[],!0;return!1}(this.matched),n}function cn(e,t,n){var r=ln.call(e,t);return null!==r&&r.some(n)}var un={getTrace:ln,isType:function(e,t){return cn(this,e,(function(e){return"Type"===e.type&&e.name===t}))},isProperty:function(e,t){return cn(this,e,(function(e){return"Property"===e.type&&e.name===t}))},isKeyword:function(e){return cn(this,e,(function(e){return"Keyword"===e.type}))}};var hn={matchFragments:function(e,t,n,r,i){var o=[];return null!==n.matched&&function n(s){if(null!==s.syntax&&s.syntax.type===r&&s.syntax.name===i){var l=function e(t){return"node"in t?t.node:e(t.match[0])}(s),c=function e(t){return"node"in t?t.node:e(t.match[t.match.length-1])}(s);e.syntax.walk(t,(function(e,t,n){if(e===l){var r=new a;do{if(r.appendData(t.data),t.data===c)break;t=t.next}while(null!==t);o.push({parent:n,nodes:r})}}))}Array.isArray(s.match)&&s.match.forEach(n)}(n.matched),o}},pn=Object.prototype.hasOwnProperty;function dn(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e&&e>=0}function mn(e){return Boolean(e)&&dn(e.offset)&&dn(e.line)&&dn(e.column)}function gn(e,t){return function(n,r){if(!n||n.constructor!==Object)return r(n,"Type of node should be an Object");for(var i in n){var o=!0;if(!1!==pn.call(n,i)){if("type"===i)n.type!==e&&r(n,"Wrong node type `"+n.type+"`, expected `"+e+"`");else if("loc"===i){if(null===n.loc)continue;if(n.loc&&n.loc.constructor===Object)if("string"!=typeof n.loc.source)i+=".source";else if(mn(n.loc.start)){if(mn(n.loc.end))continue;i+=".end"}else i+=".start";o=!1}else if(t.hasOwnProperty(i)){var s=0;for(o=!1;!o&&s<t[i].length;s++){var l=t[i][s];switch(l){case String:o="string"==typeof n[i];break;case Boolean:o="boolean"==typeof n[i];break;case null:o=null===n[i];break;default:"string"==typeof l?o=n[i]&&n[i].type===l:Array.isArray(l)&&(o=n[i]instanceof a)}}}else r(n,"Unknown field `"+i+"` for "+e+" node type");o||r(n,"Bad value for `"+e+"."+i+"`")}}for(var i in t)pn.call(t,i)&&!1===pn.call(n,i)&&r(n,"Field `"+e+"."+i+"` is missed")}}function fn(e,t){var n=t.structure,r={type:String,loc:!0},i={type:'"'+e+'"'};for(var a in n)if(!1!==pn.call(n,a)){for(var o=[],s=r[a]=Array.isArray(n[a])?n[a].slice():[n[a]],l=0;l<s.length;l++){var c=s[l];if(c===String||c===Boolean)o.push(c.name);else if(null===c)o.push("null");else if("string"==typeof c)o.push("<"+c+">");else{if(!Array.isArray(c))throw new Error("Wrong value `"+c+"` in `"+e+"."+a+"` structure definition");o.push("List")}}i[a]=o.join(" | ")}return{docs:i,check:gn(e,r)}}var bn=$,yn=J,kn=Qt,vn=sn,xn=function(e){var t={};if(e.node)for(var n in e.node)if(pn.call(e.node,n)){var r=e.node[n];if(!r.structure)throw new Error("Missed `structure` field in `"+n+"` node type definition");t[n]=fn(n,r)}return t},wn=kn("inherit | initial | unset"),Sn=kn("inherit | initial | unset | <-ms-legacy-expression>");function Cn(e,t,n){var r={};for(var i in e)e[i].syntax&&(r[i]=n?e[i].syntax:G(e[i].syntax,{compact:t}));return r}function zn(e,t,n){const r={};for(const[i,a]of Object.entries(e))r[i]={prelude:a.prelude&&(n?a.prelude.syntax:G(a.prelude.syntax,{compact:t})),descriptors:a.descriptors&&Cn(a.descriptors,t,n)};return r}function An(e,t,n){return{matched:e,iterations:n,error:t,getTrace:un.getTrace,isType:un.isType,isProperty:un.isProperty,isKeyword:un.isKeyword}}function Pn(e,t,n,r){var i,a=function(e,t){return"string"==typeof e?jt(e,null):t.generate(e,Mt)}(n,e.syntax);return function(e){for(var t=0;t<e.length;t++)if("var("===e[t].value.toLowerCase())return!0;return!1}(a)?An(null,new Error("Matching for a tree with var() is not supported")):(r&&(i=vn(a,e.valueCommonSyntax,e)),r&&i.match||(i=vn(a,t.match,e)).match?An(i.match,null,i.iterations):An(null,new yn(i.reason,t.syntax,n,i),i.iterations))}var Tn=function(e,t,n){if(this.valueCommonSyntax=wn,this.syntax=t,this.generic=!1,this.atrules={},this.properties={},this.types={},this.structure=n||xn(e),e){if(e.types)for(var r in e.types)this.addType_(r,e.types[r]);if(e.generic)for(var r in this.generic=!0,mt)this.addType_(r,mt[r]);if(e.atrules)for(var r in e.atrules)this.addAtrule_(r,e.atrules[r]);if(e.properties)for(var r in e.properties)this.addProperty_(r,e.properties[r])}};Tn.prototype={structure:{},checkStructure:function(e){function t(e,t){r.push({node:e,message:t})}var n=this.structure,r=[];return this.syntax.walk(e,(function(e){n.hasOwnProperty(e.type)?n[e.type].check(e,t):t(e,"Unknown node type `"+e.type+"`")})),!!r.length&&r},createDescriptor:function(e,t,n,r=null){var i={type:t,name:n},a={type:t,name:n,parent:r,syntax:null,match:null};return"function"==typeof e?a.match=kn(e,i):("string"==typeof e?Object.defineProperty(a,"syntax",{get:function(){return Object.defineProperty(a,"syntax",{value:Ot(e)}),a.syntax}}):a.syntax=e,Object.defineProperty(a,"match",{get:function(){return Object.defineProperty(a,"match",{value:kn(a.syntax,i)}),a.match}})),a},addAtrule_:function(e,t){t&&(this.atrules[e]={type:"Atrule",name:e,prelude:t.prelude?this.createDescriptor(t.prelude,"AtrulePrelude",e):null,descriptors:t.descriptors?Object.keys(t.descriptors).reduce((n,r)=>(n[r]=this.createDescriptor(t.descriptors[r],"AtruleDescriptor",r,e),n),{}):null})},addProperty_:function(e,t){t&&(this.properties[e]=this.createDescriptor(t,"Property",e))},addType_:function(e,t){t&&(this.types[e]=this.createDescriptor(t,"Type",e),t===mt["-ms-legacy-expression"]&&(this.valueCommonSyntax=Sn))},checkAtruleName:function(e){if(!this.getAtrule(e))return new bn("Unknown at-rule","@"+e)},checkAtrulePrelude:function(e,t){let n=this.checkAtruleName(e);if(n)return n;var r=this.getAtrule(e);return!r.prelude&&t?new SyntaxError("At-rule `@"+e+"` should not contain a prelude"):r.prelude&&!t?new SyntaxError("At-rule `@"+e+"` should contain a prelude"):void 0},checkAtruleDescriptorName:function(e,t){let n=this.checkAtruleName(e);if(n)return n;var r=this.getAtrule(e),i=ae.keyword(t);return r.descriptors?r.descriptors[i.name]||r.descriptors[i.basename]?void 0:new bn("Unknown at-rule descriptor",t):new SyntaxError("At-rule `@"+e+"` has no known descriptors")},checkPropertyName:function(e){return ae.property(e).custom?new Error("Lexer matching doesn't applicable for custom properties"):this.getProperty(e)?void 0:new bn("Unknown property",e)},matchAtrulePrelude:function(e,t){var n=this.checkAtrulePrelude(e,t);return n?An(null,n):t?Pn(this,this.getAtrule(e).prelude,t,!1):An(null,null)},matchAtruleDescriptor:function(e,t,n){var r=this.checkAtruleDescriptorName(e,t);if(r)return An(null,r);var i=this.getAtrule(e),a=ae.keyword(t);return Pn(this,i.descriptors[a.name]||i.descriptors[a.basename],n,!1)},matchDeclaration:function(e){return"Declaration"!==e.type?An(null,new Error("Not a Declaration node")):this.matchProperty(e.property,e.value)},matchProperty:function(e,t){var n=this.checkPropertyName(e);return n?An(null,n):Pn(this,this.getProperty(e),t,!0)},matchType:function(e,t){var n=this.getType(e);return n?Pn(this,n,t,!1):An(null,new bn("Unknown type",e))},match:function(e,t){return"string"==typeof e||e&&e.type?("string"!=typeof e&&e.match||(e=this.createDescriptor(e,"Type","anonymous")),Pn(this,e,t,!1)):An(null,new bn("Bad syntax"))},findValueFragments:function(e,t,n,r){return hn.matchFragments(this,t,this.matchProperty(e,t),n,r)},findDeclarationValueFragments:function(e,t,n){return hn.matchFragments(this,e.value,this.matchDeclaration(e),t,n)},findAllFragments:function(e,t,n){var r=[];return this.syntax.walk(e,{visit:"Declaration",enter:function(e){r.push.apply(r,this.findDeclarationValueFragments(e,t,n))}.bind(this)}),r},getAtrule:function(e,t=!0){var n=ae.keyword(e);return(n.vendor&&t?this.atrules[n.name]||this.atrules[n.basename]:this.atrules[n.name])||null},getAtrulePrelude:function(e,t=!0){const n=this.getAtrule(e,t);return n&&n.prelude||null},getAtruleDescriptor:function(e,t){return this.atrules.hasOwnProperty(e)&&this.atrules.declarators&&this.atrules[e].declarators[t]||null},getProperty:function(e,t=!0){var n=ae.property(e);return(n.vendor&&t?this.properties[n.name]||this.properties[n.basename]:this.properties[n.name])||null},getType:function(e){return this.types.hasOwnProperty(e)?this.types[e]:null},validate:function(){function e(r,i,a,o){if(a.hasOwnProperty(i))return a[i];a[i]=!1,null!==o.syntax&&Nt(o.syntax,(function(o){if("Type"===o.type||"Property"===o.type){var s="Type"===o.type?r.types:r.properties,l="Type"===o.type?t:n;s.hasOwnProperty(o.name)&&!e(r,o.name,l,s[o.name])||(a[i]=!0)}}),this)}var t={},n={};for(var r in this.types)e(this,r,t,this.types[r]);for(var r in this.properties)e(this,r,n,this.properties[r]);return t=Object.keys(t).filter((function(e){return t[e]})),n=Object.keys(n).filter((function(e){return n[e]})),t.length||n.length?{types:t,properties:n}:null},dump:function(e,t){return{generic:this.generic,types:Cn(this.types,!t,e),properties:Cn(this.properties,!t,e),atrules:zn(this.atrules,!t,e)}},toString:function(){return JSON.stringify(this.dump())}};var Ln=Tn,En={SyntaxError:gt,parse:Ot,generate:G,walk:Nt},Dn=Ce.isBOM;var On=function(){this.lines=null,this.columns=null,this.linesAndColumnsComputed=!1};On.prototype={setSource:function(e,t,n,r){this.source=e,this.startOffset=void 0===t?0:t,this.startLine=void 0===n?1:n,this.startColumn=void 0===r?1:r,this.linesAndColumnsComputed=!1},ensureLinesAndColumnsComputed:function(){this.linesAndColumnsComputed||(!function(e,t){for(var n=t.length,r=se(e.lines,n),i=e.startLine,a=se(e.columns,n),o=e.startColumn,s=t.length>0?Dn(t.charCodeAt(0)):0;s<n;s++){var l=t.charCodeAt(s);r[s]=i,a[s]=o++,10!==l&&13!==l&&12!==l||(13===l&&s+1<n&&10===t.charCodeAt(s+1)&&(r[++s]=i,a[s]=o),i++,o=1)}r[s]=i,a[s]=o,e.lines=r,e.columns=a}(this,this.source),this.linesAndColumnsComputed=!0)},getLocation:function(e,t){return this.ensureLinesAndColumnsComputed(),{source:t,offset:this.startOffset+e,line:this.lines[e],column:this.columns[e]}},getLocationRange:function(e,t,n){return this.ensureLinesAndColumnsComputed(),{source:n,start:{offset:this.startOffset+e,line:this.lines[e],column:this.columns[e]},end:{offset:this.startOffset+t,line:this.lines[t],column:this.columns[t]}}}};var Bn=On,In=Ce.TYPE,Nn=In.WhiteSpace,Rn=In.Comment,Mn=function(e){var t=this.createList(),n=null,r={recognizer:e,space:null,ignoreWS:!1,ignoreWSAfter:!1};for(this.scanner.skipSC();!this.scanner.eof;){switch(this.scanner.tokenType){case Rn:this.scanner.next();continue;case Nn:r.ignoreWS?this.scanner.next():r.space=this.WhiteSpace();continue}if(void 0===(n=e.getNode.call(this,r)))break;null!==r.space&&(t.push(r.space),r.space=null),t.push(n),r.ignoreWSAfter?(r.ignoreWSAfter=!1,r.ignoreWS=!0):r.ignoreWS=!1}return t},{findWhiteSpaceStart:jn,cmpStr:_n}=M,Fn=function(){},Wn=h.TYPE,qn=h.NAME,Yn=Wn.WhiteSpace,Un=Wn.Comment,Hn=Wn.Ident,Vn=Wn.Function,Kn=Wn.Url,Gn=Wn.Hash,Qn=Wn.Percentage,Xn=Wn.Number;function Zn(e){return function(){return this[e]()}}var $n=function(e){var t={scanner:new H,locationMap:new Bn,filename:"<unknown>",needPositions:!1,onParseError:Fn,onParseErrorThrow:!1,parseAtrulePrelude:!0,parseRulePrelude:!0,parseValue:!0,parseCustomProperty:!1,readSequence:Mn,createList:function(){return new a},createSingleNodeList:function(e){return(new a).appendData(e)},getFirstListNode:function(e){return e&&e.first()},getLastListNode:function(e){return e.last()},parseWithFallback:function(e,t){var n=this.scanner.tokenIndex;try{return e.call(this)}catch(e){if(this.onParseErrorThrow)throw e;var r=t.call(this,n);return this.onParseErrorThrow=!0,this.onParseError(e,r),this.onParseErrorThrow=!1,r}},lookupNonWSType:function(e){do{var t=this.scanner.lookupType(e++);if(t!==Yn)return t}while(0!==t);return 0},eat:function(e){if(this.scanner.tokenType!==e){var t=this.scanner.tokenStart,n=qn[e]+" is expected";switch(e){case Hn:this.scanner.tokenType===Vn||this.scanner.tokenType===Kn?(t=this.scanner.tokenEnd-1,n="Identifier is expected but function found"):n="Identifier is expected";break;case Gn:this.scanner.isDelim(35)&&(this.scanner.next(),t++,n="Name is expected");break;case Qn:this.scanner.tokenType===Xn&&(t=this.scanner.tokenEnd,n="Percent sign is expected");break;default:this.scanner.source.charCodeAt(this.scanner.tokenStart)===e&&(t+=1)}this.error(n,t)}this.scanner.next()},consume:function(e){var t=this.scanner.getTokenValue();return this.eat(e),t},consumeFunctionName:function(){var e=this.scanner.source.substring(this.scanner.tokenStart,this.scanner.tokenEnd-1);return this.eat(Vn),e},getLocation:function(e,t){return this.needPositions?this.locationMap.getLocationRange(e,t,this.filename):null},getLocationFromList:function(e){if(this.needPositions){var t=this.getFirstListNode(e),n=this.getLastListNode(e);return this.locationMap.getLocationRange(null!==t?t.loc.start.offset-this.locationMap.startOffset:this.scanner.tokenStart,null!==n?n.loc.end.offset-this.locationMap.startOffset:this.scanner.tokenStart,this.filename)}return null},error:function(e,t){var n=void 0!==t&&t<this.scanner.source.length?this.locationMap.getLocation(t):this.scanner.eof?this.locationMap.getLocation(jn(this.scanner.source,this.scanner.source.length-1)):this.locationMap.getLocation(this.scanner.tokenStart);throw new l(e||"Unexpected input",this.scanner.source,n.offset,n.line,n.column)}};for(var n in e=function(e){var t={context:{},scope:{},atrule:{},pseudo:{}};if(e.parseContext)for(var n in e.parseContext)switch(typeof e.parseContext[n]){case"function":t.context[n]=e.parseContext[n];break;case"string":t.context[n]=Zn(e.parseContext[n])}if(e.scope)for(var n in e.scope)t.scope[n]=e.scope[n];if(e.atrule)for(var n in e.atrule){var r=e.atrule[n];r.parse&&(t.atrule[n]=r.parse)}if(e.pseudo)for(var n in e.pseudo){var i=e.pseudo[n];i.parse&&(t.pseudo[n]=i.parse)}if(e.node)for(var n in e.node)t[n]=e.node[n].parse;return t}(e||{}))t[n]=e[n];return function(e,n){var r,i=(n=n||{}).context||"default",a=n.onComment;if(Ce(e,t.scanner),t.locationMap.setSource(e,n.offset,n.line,n.column),t.filename=n.filename||"<unknown>",t.needPositions=Boolean(n.positions),t.onParseError="function"==typeof n.onParseError?n.onParseError:Fn,t.onParseErrorThrow=!1,t.parseAtrulePrelude=!("parseAtrulePrelude"in n)||Boolean(n.parseAtrulePrelude),t.parseRulePrelude=!("parseRulePrelude"in n)||Boolean(n.parseRulePrelude),t.parseValue=!("parseValue"in n)||Boolean(n.parseValue),t.parseCustomProperty="parseCustomProperty"in n&&Boolean(n.parseCustomProperty),!t.context.hasOwnProperty(i))throw new Error("Unknown context `"+i+"`");return"function"==typeof a&&t.scanner.forEachToken((n,r,i)=>{if(n===Un){const n=t.getLocation(r,i),o=_n(e,i-2,i,"*/")?e.slice(r+2,i-2):e.slice(r+2,i);a(o,n)}}),r=t.context[i].call(t,n),t.scanner.eof||t.error(),r}},Jn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),er=function(e){if(0<=e&&e<Jn.length)return Jn[e];throw new TypeError("Must be between 0 and 63: "+e)};var tr=function(e){var t,n="",r=function(e){return e<0?1+(-e<<1):0+(e<<1)}(e);do{t=31&r,(r>>>=5)>0&&(t|=32),n+=er(t)}while(r>0);return n};var nr=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e,t){t.getArg=function(e,t,n){if(t in e)return e[t];if(3===arguments.length)return n;throw new Error('"'+t+'" is a required argument.')};var n=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,r=/^data:.+\,.+$/;function i(e){var t=e.match(n);return t?{scheme:t[1],auth:t[2],host:t[3],port:t[4],path:t[5]}:null}function a(e){var t="";return e.scheme&&(t+=e.scheme+":"),t+="//",e.auth&&(t+=e.auth+"@"),e.host&&(t+=e.host),e.port&&(t+=":"+e.port),e.path&&(t+=e.path),t}function o(e){var n=e,r=i(e);if(r){if(!r.path)return e;n=r.path}for(var o,s=t.isAbsolute(n),l=n.split(/\/+/),c=0,u=l.length-1;u>=0;u--)"."===(o=l[u])?l.splice(u,1):".."===o?c++:c>0&&(""===o?(l.splice(u+1,c),c=0):(l.splice(u,2),c--));return""===(n=l.join("/"))&&(n=s?"/":"."),r?(r.path=n,a(r)):n}function s(e,t){""===e&&(e="."),""===t&&(t=".");var n=i(t),s=i(e);if(s&&(e=s.path||"/"),n&&!n.scheme)return s&&(n.scheme=s.scheme),a(n);if(n||t.match(r))return t;if(s&&!s.host&&!s.path)return s.host=t,a(s);var l="/"===t.charAt(0)?t:o(e.replace(/\/+$/,"")+"/"+t);return s?(s.path=l,a(s)):l}t.urlParse=i,t.urlGenerate=a,t.normalize=o,t.join=s,t.isAbsolute=function(e){return"/"===e.charAt(0)||n.test(e)},t.relative=function(e,t){""===e&&(e="."),e=e.replace(/\/$/,"");for(var n=0;0!==t.indexOf(e+"/");){var r=e.lastIndexOf("/");if(r<0)return t;if((e=e.slice(0,r)).match(/^([^\/]+:\/)?\/*$/))return t;++n}return Array(n+1).join("../")+t.substr(e.length+1)};var l=!("__proto__"in Object.create(null));function c(e){return e}function u(e){if(!e)return!1;var t=e.length;if(t<9)return!1;if(95!==e.charCodeAt(t-1)||95!==e.charCodeAt(t-2)||111!==e.charCodeAt(t-3)||116!==e.charCodeAt(t-4)||111!==e.charCodeAt(t-5)||114!==e.charCodeAt(t-6)||112!==e.charCodeAt(t-7)||95!==e.charCodeAt(t-8)||95!==e.charCodeAt(t-9))return!1;for(var n=t-10;n>=0;n--)if(36!==e.charCodeAt(n))return!1;return!0}function h(e,t){return e===t?0:null===e?1:null===t?-1:e>t?1:-1}t.toSetString=l?c:function(e){return u(e)?"$"+e:e},t.fromSetString=l?c:function(e){return u(e)?e.slice(1):e},t.compareByOriginalPositions=function(e,t,n){var r=h(e.source,t.source);return 0!==r||0!==(r=e.originalLine-t.originalLine)||0!==(r=e.originalColumn-t.originalColumn)||n||0!==(r=e.generatedColumn-t.generatedColumn)||0!==(r=e.generatedLine-t.generatedLine)?r:h(e.name,t.name)},t.compareByGeneratedPositionsDeflated=function(e,t,n){var r=e.generatedLine-t.generatedLine;return 0!==r||0!==(r=e.generatedColumn-t.generatedColumn)||n||0!==(r=h(e.source,t.source))||0!==(r=e.originalLine-t.originalLine)||0!==(r=e.originalColumn-t.originalColumn)?r:h(e.name,t.name)},t.compareByGeneratedPositionsInflated=function(e,t){var n=e.generatedLine-t.generatedLine;return 0!==n||0!==(n=e.generatedColumn-t.generatedColumn)||0!==(n=h(e.source,t.source))||0!==(n=e.originalLine-t.originalLine)||0!==(n=e.originalColumn-t.originalColumn)?n:h(e.name,t.name)},t.parseSourceMapInput=function(e){return JSON.parse(e.replace(/^\)]}'[^\n]*\n/,""))},t.computeSourceURL=function(e,t,n){if(t=t||"",e&&("/"!==e[e.length-1]&&"/"!==t[0]&&(e+="/"),t=e+t),n){var r=i(n);if(!r)throw new Error("sourceMapURL could not be parsed");if(r.path){var l=r.path.lastIndexOf("/");l>=0&&(r.path=r.path.substring(0,l+1))}t=s(a(r),t)}return o(t)}})),rr=(nr.getArg,nr.urlParse,nr.urlGenerate,nr.normalize,nr.join,nr.isAbsolute,nr.relative,nr.toSetString,nr.fromSetString,nr.compareByOriginalPositions,nr.compareByGeneratedPositionsDeflated,nr.compareByGeneratedPositionsInflated,nr.parseSourceMapInput,nr.computeSourceURL,Object.prototype.hasOwnProperty),ir="undefined"!=typeof Map;function ar(){this._array=[],this._set=ir?new Map:Object.create(null)}ar.fromArray=function(e,t){for(var n=new ar,r=0,i=e.length;r<i;r++)n.add(e[r],t);return n},ar.prototype.size=function(){return ir?this._set.size:Object.getOwnPropertyNames(this._set).length},ar.prototype.add=function(e,t){var n=ir?e:nr.toSetString(e),r=ir?this.has(e):rr.call(this._set,n),i=this._array.length;r&&!t||this._array.push(e),r||(ir?this._set.set(e,i):this._set[n]=i)},ar.prototype.has=function(e){if(ir)return this._set.has(e);var t=nr.toSetString(e);return rr.call(this._set,t)},ar.prototype.indexOf=function(e){if(ir){var t=this._set.get(e);if(t>=0)return t}else{var n=nr.toSetString(e);if(rr.call(this._set,n))return this._set[n]}throw new Error('"'+e+'" is not in the set.')},ar.prototype.at=function(e){if(e>=0&&e<this._array.length)return this._array[e];throw new Error("No element indexed by "+e)},ar.prototype.toArray=function(){return this._array.slice()};var or={ArraySet:ar};function sr(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}sr.prototype.unsortedForEach=function(e,t){this._array.forEach(e,t)},sr.prototype.add=function(e){var t,n,r,i,a,o;t=this._last,n=e,r=t.generatedLine,i=n.generatedLine,a=t.generatedColumn,o=n.generatedColumn,i>r||i==r&&o>=a||nr.compareByGeneratedPositionsInflated(t,n)<=0?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e))},sr.prototype.toArray=function(){return this._sorted||(this._array.sort(nr.compareByGeneratedPositionsInflated),this._sorted=!0),this._array};var lr=or.ArraySet,cr={MappingList:sr}.MappingList;function ur(e){e||(e={}),this._file=nr.getArg(e,"file",null),this._sourceRoot=nr.getArg(e,"sourceRoot",null),this._skipValidation=nr.getArg(e,"skipValidation",!1),this._sources=new lr,this._names=new lr,this._mappings=new cr,this._sourcesContents=null}ur.prototype._version=3,ur.fromSourceMap=function(e){var t=e.sourceRoot,n=new ur({file:e.file,sourceRoot:t});return e.eachMapping((function(e){var r={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(r.source=e.source,null!=t&&(r.source=nr.relative(t,r.source)),r.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(r.name=e.name)),n.addMapping(r)})),e.sources.forEach((function(r){var i=r;null!==t&&(i=nr.relative(t,r)),n._sources.has(i)||n._sources.add(i);var a=e.sourceContentFor(r);null!=a&&n.setSourceContent(r,a)})),n},ur.prototype.addMapping=function(e){var t=nr.getArg(e,"generated"),n=nr.getArg(e,"original",null),r=nr.getArg(e,"source",null),i=nr.getArg(e,"name",null);this._skipValidation||this._validateMapping(t,n,r,i),null!=r&&(r=String(r),this._sources.has(r)||this._sources.add(r)),null!=i&&(i=String(i),this._names.has(i)||this._names.add(i)),this._mappings.add({generatedLine:t.line,generatedColumn:t.column,originalLine:null!=n&&n.line,originalColumn:null!=n&&n.column,source:r,name:i})},ur.prototype.setSourceContent=function(e,t){var n=e;null!=this._sourceRoot&&(n=nr.relative(this._sourceRoot,n)),null!=t?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[nr.toSetString(n)]=t):this._sourcesContents&&(delete this._sourcesContents[nr.toSetString(n)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},ur.prototype.applySourceMap=function(e,t,n){var r=t;if(null==t){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');r=e.file}var i=this._sourceRoot;null!=i&&(r=nr.relative(i,r));var a=new lr,o=new lr;this._mappings.unsortedForEach((function(t){if(t.source===r&&null!=t.originalLine){var s=e.originalPositionFor({line:t.originalLine,column:t.originalColumn});null!=s.source&&(t.source=s.source,null!=n&&(t.source=nr.join(n,t.source)),null!=i&&(t.source=nr.relative(i,t.source)),t.originalLine=s.line,t.originalColumn=s.column,null!=s.name&&(t.name=s.name))}var l=t.source;null==l||a.has(l)||a.add(l);var c=t.name;null==c||o.has(c)||o.add(c)}),this),this._sources=a,this._names=o,e.sources.forEach((function(t){var r=e.sourceContentFor(t);null!=r&&(null!=n&&(t=nr.join(n,t)),null!=i&&(t=nr.relative(i,t)),this.setSourceContent(t,r))}),this)},ur.prototype._validateMapping=function(e,t,n,r){if(t&&"number"!=typeof t.line&&"number"!=typeof t.column)throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if((!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0)||t||n||r)&&!(e&&"line"in e&&"column"in e&&t&&"line"in t&&"column"in t&&e.line>0&&e.column>=0&&t.line>0&&t.column>=0&&n))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:n,original:t,name:r}))},ur.prototype._serializeMappings=function(){for(var e,t,n,r,i=0,a=1,o=0,s=0,l=0,c=0,u="",h=this._mappings.toArray(),p=0,d=h.length;p<d;p++){if(e="",(t=h[p]).generatedLine!==a)for(i=0;t.generatedLine!==a;)e+=";",a++;else if(p>0){if(!nr.compareByGeneratedPositionsInflated(t,h[p-1]))continue;e+=","}e+=tr(t.generatedColumn-i),i=t.generatedColumn,null!=t.source&&(r=this._sources.indexOf(t.source),e+=tr(r-c),c=r,e+=tr(t.originalLine-1-s),s=t.originalLine-1,e+=tr(t.originalColumn-o),o=t.originalColumn,null!=t.name&&(n=this._names.indexOf(t.name),e+=tr(n-l),l=n)),u+=e}return u},ur.prototype._generateSourcesContent=function(e,t){return e.map((function(e){if(!this._sourcesContents)return null;null!=t&&(e=nr.relative(t,e));var n=nr.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,n)?this._sourcesContents[n]:null}),this)},ur.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},ur.prototype.toString=function(){return JSON.stringify(this.toJSON())};var hr={SourceMapGenerator:ur}.SourceMapGenerator,pr={Atrule:!0,Selector:!0,Declaration:!0},dr=Object.prototype.hasOwnProperty;function mr(e,t){var n=e.children,r=null;"function"!=typeof t?n.forEach(this.node,this):n.forEach((function(e){null!==r&&t.call(this,r),this.node(e),r=e}),this)}var gr=function(e){function t(e){if(!dr.call(n,e.type))throw new Error("Unknown node type: "+e.type);n[e.type].call(this,e)}var n={};if(e.node)for(var r in e.node)n[r]=e.node[r].generate;return function(e,n){var r="",i={children:mr,node:t,chunk:function(e){r+=e},result:function(){return r}};return n&&("function"==typeof n.decorator&&(i=n.decorator(i)),n.sourceMap&&(i=function(e){var t=new hr,n=1,r=0,i={line:1,column:0},a={line:0,column:0},o=!1,s={line:1,column:0},l={generated:s},c=e.node;e.node=function(e){if(e.loc&&e.loc.start&&pr.hasOwnProperty(e.type)){var u=e.loc.start.line,h=e.loc.start.column-1;a.line===u&&a.column===h||(a.line=u,a.column=h,i.line=n,i.column=r,o&&(o=!1,i.line===s.line&&i.column===s.column||t.addMapping(l)),o=!0,t.addMapping({source:e.loc.source,original:a,generated:i}))}c.call(this,e),o&&pr.hasOwnProperty(e.type)&&(s.line=n,s.column=r)};var u=e.chunk;e.chunk=function(e){for(var t=0;t<e.length;t++)10===e.charCodeAt(t)?(n++,r=0):r++;u(e)};var h=e.result;return e.result=function(){return o&&t.addMapping(l),{css:h(),map:t}},e}(i))),i.node(e),i.result()}},fr=Object.prototype.hasOwnProperty,br=function(){};function yr(e){return"function"==typeof e?e:br}function kr(e,t){return function(n,r,i){n.type===t&&e.call(this,n,r,i)}}function vr(e,t){var n=t.structure,r=[];for(var i in n)if(!1!==fr.call(n,i)){var a=n[i],o={name:i,type:!1,nullable:!1};Array.isArray(n[i])||(a=[n[i]]);for(var s=0;s<a.length;s++){var l=a[s];null===l?o.nullable=!0:"string"==typeof l?o.type="node":Array.isArray(l)&&(o.type="list")}o.type&&r.push(o)}return r.length?{context:t.walkContext,fields:r}:null}function xr(e,t){var n=e.fields.slice(),r=e.context,i="string"==typeof r;return t&&n.reverse(),function(e,a,o,s){var l;i&&(l=a[r],a[r]=e);for(var c=0;c<n.length;c++){var u=n[c],h=e[u.name];if(!u.nullable||h)if("list"===u.type){if(t?h.reduceRight(s,!1):h.reduce(s,!1))return!0}else if(o(h))return!0}i&&(a[r]=l)}}function wr(e){return{Atrule:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block},Rule:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block},Declaration:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block,DeclarationList:e.DeclarationList}}}var Sr=function(e){var t=function(e){var t={};for(var n in e.node)if(fr.call(e.node,n)){var r=e.node[n];if(!r.structure)throw new Error("Missed `structure` field in `"+n+"` node type definition");t[n]=vr(0,r)}return t}(e),n={},r={},i=Symbol("break-walk"),a=Symbol("skip-node");for(var o in t)fr.call(t,o)&&null!==t[o]&&(n[o]=xr(t[o],!1),r[o]=xr(t[o],!0));var s=wr(n),l=wr(r),c=function(e,o){function c(e,t,n){var r=h.call(m,e,t,n);return r===i||r!==a&&(!(!d.hasOwnProperty(e.type)||!d[e.type](e,m,c,u))||p.call(m,e,t,n)===i)}var u=(e,t,n,r)=>e||c(t,n,r),h=br,p=br,d=n,m={break:i,skip:a,root:e,stylesheet:null,atrule:null,atrulePrelude:null,rule:null,selector:null,block:null,declaration:null,function:null};if("function"==typeof o)h=o;else if(o&&(h=yr(o.enter),p=yr(o.leave),o.reverse&&(d=r),o.visit)){if(s.hasOwnProperty(o.visit))d=o.reverse?l[o.visit]:s[o.visit];else if(!t.hasOwnProperty(o.visit))throw new Error("Bad value `"+o.visit+"` for `visit` option (should be: "+Object.keys(t).join(", ")+")");h=kr(h,o.visit),p=kr(p,o.visit)}if(h===br&&p===br)throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function");c(e)};return c.break=i,c.skip=a,c.find=function(e,t){var n=null;return c(e,(function(e,r,a){if(t.call(this,e,r,a))return n=e,i})),n},c.findLast=function(e,t){var n=null;return c(e,{reverse:!0,enter:function(e,r,a){if(t.call(this,e,r,a))return n=e,i}}),n},c.findAll=function(e,t){var n=[];return c(e,(function(e,r,i){t.call(this,e,r,i)&&n.push(e)})),n},c},Cr=function e(t){var n={};for(var r in t){var i=t[r];i&&(Array.isArray(i)||i instanceof a?i=i.map(e):i.constructor===Object&&(i=e(i))),n[r]=i}return n};const zr=Object.prototype.hasOwnProperty,Ar={generic:!0,types:Er,atrules:{prelude:Dr,descriptors:Dr},properties:Er,parseContext:function(e,t){return Object.assign(e,t)},scope:function e(t,n){for(const r in n)zr.call(n,r)&&(Pr(t[r])?e(t[r],Tr(n[r])):t[r]=Tr(n[r]));return t},atrule:["parse"],pseudo:["parse"],node:["name","structure","parse","generate","walkContext"]};function Pr(e){return e&&e.constructor===Object}function Tr(e){return Pr(e)?Object.assign({},e):e}function Lr(e,t){return"string"==typeof t&&/^\s*\|/.test(t)?"string"==typeof e?e+t:t.replace(/^\s*\|\s*/,""):t||null}function Er(e,t){if("string"==typeof t)return Lr(e,t);const n=Object.assign({},e);for(let r in t)zr.call(t,r)&&(n[r]=Lr(zr.call(e,r)?e[r]:void 0,t[r]));return n}function Dr(e,t){const n=Er(e,t);return!Pr(n)||Object.keys(n).length?n:null}var Or=(e,t)=>function e(t,n,r){for(const i in r)if(!1!==zr.call(r,i))if(!0===r[i])i in n&&zr.call(n,i)&&(t[i]=Tr(n[i]));else if(r[i])if("function"==typeof r[i]){const e=r[i];t[i]=e({},t[i]),t[i]=e(t[i]||{},n[i])}else if(Pr(r[i])){const a={};for(let n in t[i])a[n]=e({},t[i][n],r[i]);for(let t in n[i])a[t]=e(a[t]||{},n[i][t],r[i]);t[i]=a}else if(Array.isArray(r[i])){const a={},o=r[i].reduce((function(e,t){return e[t]=!0,e}),{});for(const[n,r]of Object.entries(t[i]||{}))a[n]={},r&&e(a[n],r,o);for(const t in n[i])zr.call(n[i],t)&&(a[t]||(a[t]={}),n[i]&&n[i][t]&&e(a[t],n[i][t],o));t[i]=a}return t}(e,t,Ar);function Br(e){var t=$n(e),n=Sr(e),r=gr(e),i=function(e){return{fromPlainObject:function(t){return e(t,{enter:function(e){e.children&&e.children instanceof a==!1&&(e.children=(new a).fromArray(e.children))}}),t},toPlainObject:function(t){return e(t,{leave:function(e){e.children&&e.children instanceof a&&(e.children=e.children.toArray())}}),t}}}(n),o={List:a,SyntaxError:l,TokenStream:H,Lexer:Ln,vendorPrefix:ae.vendorPrefix,keyword:ae.keyword,property:ae.property,isCustomProperty:ae.isCustomProperty,definitionSyntax:En,lexer:null,createLexer:function(e){return new Ln(e,o,o.lexer.structure)},tokenize:Ce,parse:t,walk:n,generate:r,find:n.find,findLast:n.findLast,findAll:n.findAll,clone:Cr,fromPlainObject:i.fromPlainObject,toPlainObject:i.toPlainObject,createSyntax:function(e){return Br(Or({},e))},fork:function(t){var n=Or({},e);return Br("function"==typeof t?t(n,Object.assign):Or(n,t))}};return o.lexer=new Ln({generic:!0,types:e.types,atrules:e.atrules,properties:e.properties,node:e.node},o),o}var Ir=function(e){return Br(Or({},e))},Nr={generic:!0,types:{"absolute-size":"xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large","alpha-value":"<number>|<percentage>","angle-percentage":"<angle>|<percentage>","angular-color-hint":"<angle-percentage>","angular-color-stop":"<color>&&<color-stop-angle>?","angular-color-stop-list":"[<angular-color-stop> [, <angular-color-hint>]?]# , <angular-color-stop>","animateable-feature":"scroll-position|contents|<custom-ident>",attachment:"scroll|fixed|local","attr()":"attr( <attr-name> <type-or-unit>? [, <attr-fallback>]? )","attr-matcher":"['~'|'|'|'^'|'$'|'*']? '='","attr-modifier":"i|s","attribute-selector":"'[' <wq-name> ']'|'[' <wq-name> <attr-matcher> [<string-token>|<ident-token>] <attr-modifier>? ']'","auto-repeat":"repeat( [auto-fill|auto-fit] , [<line-names>? <fixed-size>]+ <line-names>? )","auto-track-list":"[<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>? <auto-repeat> [<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>?","baseline-position":"[first|last]? baseline","basic-shape":"<inset()>|<circle()>|<ellipse()>|<polygon()>|<path()>","bg-image":"none|<image>","bg-layer":"<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>","bg-position":"[[left|center|right|top|bottom|<length-percentage>]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]|[center|[left|right] <length-percentage>?]&&[center|[top|bottom] <length-percentage>?]]","bg-size":"[<length-percentage>|auto]{1,2}|cover|contain","blur()":"blur( <length> )","blend-mode":"normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|hard-light|soft-light|difference|exclusion|hue|saturation|color|luminosity",box:"border-box|padding-box|content-box","brightness()":"brightness( <number-percentage> )","calc()":"calc( <calc-sum> )","calc-sum":"<calc-product> [['+'|'-'] <calc-product>]*","calc-product":"<calc-value> ['*' <calc-value>|'/' <number>]*","calc-value":"<number>|<dimension>|<percentage>|( <calc-sum> )","cf-final-image":"<image>|<color>","cf-mixing-image":"<percentage>?&&<image>","circle()":"circle( [<shape-radius>]? [at <position>]? )","clamp()":"clamp( <calc-sum>#{3} )","class-selector":"'.' <ident-token>","clip-source":"<url>",color:"<rgb()>|<rgba()>|<hsl()>|<hsla()>|<hex-color>|<named-color>|currentcolor|<deprecated-system-color>","color-stop":"<color-stop-length>|<color-stop-angle>","color-stop-angle":"<angle-percentage>{1,2}","color-stop-length":"<length-percentage>{1,2}","color-stop-list":"[<linear-color-stop> [, <linear-color-hint>]?]# , <linear-color-stop>",combinator:"'>'|'+'|'~'|['||']","common-lig-values":"[common-ligatures|no-common-ligatures]","compat-auto":"searchfield|textarea|push-button|slider-horizontal|checkbox|radio|square-button|menulist|listbox|meter|progress-bar|button","composite-style":"clear|copy|source-over|source-in|source-out|source-atop|destination-over|destination-in|destination-out|destination-atop|xor","compositing-operator":"add|subtract|intersect|exclude","compound-selector":"[<type-selector>? <subclass-selector>* [<pseudo-element-selector> <pseudo-class-selector>*]*]!","compound-selector-list":"<compound-selector>#","complex-selector":"<compound-selector> [<combinator>? <compound-selector>]*","complex-selector-list":"<complex-selector>#","conic-gradient()":"conic-gradient( [from <angle>]? [at <position>]? , <angular-color-stop-list> )","contextual-alt-values":"[contextual|no-contextual]","content-distribution":"space-between|space-around|space-evenly|stretch","content-list":"[<string>|contents|<image>|<quote>|<target>|<leader()>|<attr()>|counter( <ident> , <'list-style-type'>? )]+","content-position":"center|start|end|flex-start|flex-end","content-replacement":"<image>","contrast()":"contrast( [<number-percentage>] )","counter()":"counter( <custom-ident> , <counter-style>? )","counter-style":"<counter-style-name>|symbols( )","counter-style-name":"<custom-ident>","counters()":"counters( <custom-ident> , <string> , <counter-style>? )","cross-fade()":"cross-fade( <cf-mixing-image> , <cf-final-image>? )","cubic-bezier-timing-function":"ease|ease-in|ease-out|ease-in-out|cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )","deprecated-system-color":"ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText","discretionary-lig-values":"[discretionary-ligatures|no-discretionary-ligatures]","display-box":"contents|none","display-inside":"flow|flow-root|table|flex|grid|ruby","display-internal":"table-row-group|table-header-group|table-footer-group|table-row|table-cell|table-column-group|table-column|table-caption|ruby-base|ruby-text|ruby-base-container|ruby-text-container","display-legacy":"inline-block|inline-list-item|inline-table|inline-flex|inline-grid","display-listitem":"<display-outside>?&&[flow|flow-root]?&&list-item","display-outside":"block|inline|run-in","drop-shadow()":"drop-shadow( <length>{2,3} <color>? )","east-asian-variant-values":"[jis78|jis83|jis90|jis04|simplified|traditional]","east-asian-width-values":"[full-width|proportional-width]","element()":"element( <custom-ident> , [first|start|last|first-except]? )|element( <id-selector> )","ellipse()":"ellipse( [<shape-radius>{2}]? [at <position>]? )","ending-shape":"circle|ellipse","env()":"env( <custom-ident> , <declaration-value>? )","explicit-track-list":"[<line-names>? <track-size>]+ <line-names>?","family-name":"<string>|<custom-ident>+","feature-tag-value":"<string> [<integer>|on|off]?","feature-type":"@stylistic|@historical-forms|@styleset|@character-variant|@swash|@ornaments|@annotation","feature-value-block":"<feature-type> '{' <feature-value-declaration-list> '}'","feature-value-block-list":"<feature-value-block>+","feature-value-declaration":"<custom-ident> : <integer>+ ;","feature-value-declaration-list":"<feature-value-declaration>","feature-value-name":"<custom-ident>","fill-rule":"nonzero|evenodd","filter-function":"<blur()>|<brightness()>|<contrast()>|<drop-shadow()>|<grayscale()>|<hue-rotate()>|<invert()>|<opacity()>|<saturate()>|<sepia()>","filter-function-list":"[<filter-function>|<url>]+","final-bg-layer":"<'background-color'>||<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>","fit-content()":"fit-content( [<length>|<percentage>] )","fixed-breadth":"<length-percentage>","fixed-repeat":"repeat( [<positive-integer>] , [<line-names>? <fixed-size>]+ <line-names>? )","fixed-size":"<fixed-breadth>|minmax( <fixed-breadth> , <track-breadth> )|minmax( <inflexible-breadth> , <fixed-breadth> )","font-stretch-absolute":"normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded|<percentage>","font-variant-css21":"[normal|small-caps]","font-weight-absolute":"normal|bold|<number [1,1000]>","frequency-percentage":"<frequency>|<percentage>","general-enclosed":"[<function-token> <any-value> )]|( <ident> <any-value> )","generic-family":"serif|sans-serif|cursive|fantasy|monospace|-apple-system","generic-name":"serif|sans-serif|cursive|fantasy|monospace","geometry-box":"<shape-box>|fill-box|stroke-box|view-box",gradient:"<linear-gradient()>|<repeating-linear-gradient()>|<radial-gradient()>|<repeating-radial-gradient()>|<conic-gradient()>|<-legacy-gradient>","grayscale()":"grayscale( <number-percentage> )","grid-line":"auto|<custom-ident>|[<integer>&&<custom-ident>?]|[span&&[<integer>||<custom-ident>]]","historical-lig-values":"[historical-ligatures|no-historical-ligatures]","hsl()":"hsl( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )","hsla()":"hsla( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )",hue:"<number>|<angle>","hue-rotate()":"hue-rotate( <angle> )",image:"<url>|<image()>|<image-set()>|<element()>|<paint()>|<cross-fade()>|<gradient>","image()":"image( <image-tags>? [<image-src>? , <color>?]! )","image-set()":"image-set( <image-set-option># )","image-set-option":"[<image>|<string>] <resolution>","image-src":"<url>|<string>","image-tags":"ltr|rtl","inflexible-breadth":"<length>|<percentage>|min-content|max-content|auto","inset()":"inset( <length-percentage>{1,4} [round <'border-radius'>]? )","invert()":"invert( <number-percentage> )","keyframes-name":"<custom-ident>|<string>","keyframe-block":"<keyframe-selector># { <declaration-list> }","keyframe-block-list":"<keyframe-block>+","keyframe-selector":"from|to|<percentage>","leader()":"leader( <leader-type> )","leader-type":"dotted|solid|space|<string>","length-percentage":"<length>|<percentage>","line-names":"'[' <custom-ident>* ']'","line-name-list":"[<line-names>|<name-repeat>]+","line-style":"none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset","line-width":"<length>|thin|medium|thick","linear-color-hint":"<length-percentage>","linear-color-stop":"<color> <color-stop-length>?","linear-gradient()":"linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )","mask-layer":"<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||<geometry-box>||[<geometry-box>|no-clip]||<compositing-operator>||<masking-mode>","mask-position":"[<length-percentage>|left|center|right] [<length-percentage>|top|center|bottom]?","mask-reference":"none|<image>|<mask-source>","mask-source":"<url>","masking-mode":"alpha|luminance|match-source","matrix()":"matrix( <number>#{6} )","matrix3d()":"matrix3d( <number>#{16} )","max()":"max( <calc-sum># )","media-and":"<media-in-parens> [and <media-in-parens>]+","media-condition":"<media-not>|<media-and>|<media-or>|<media-in-parens>","media-condition-without-or":"<media-not>|<media-and>|<media-in-parens>","media-feature":"( [<mf-plain>|<mf-boolean>|<mf-range>] )","media-in-parens":"( <media-condition> )|<media-feature>|<general-enclosed>","media-not":"not <media-in-parens>","media-or":"<media-in-parens> [or <media-in-parens>]+","media-query":"<media-condition>|[not|only]? <media-type> [and <media-condition-without-or>]?","media-query-list":"<media-query>#","media-type":"<ident>","mf-boolean":"<mf-name>","mf-name":"<ident>","mf-plain":"<mf-name> : <mf-value>","mf-range":"<mf-name> ['<'|'>']? '='? <mf-value>|<mf-value> ['<'|'>']? '='? <mf-name>|<mf-value> '<' '='? <mf-name> '<' '='? <mf-value>|<mf-value> '>' '='? <mf-name> '>' '='? <mf-value>","mf-value":"<number>|<dimension>|<ident>|<ratio>","min()":"min( <calc-sum># )","minmax()":"minmax( [<length>|<percentage>|min-content|max-content|auto] , [<length>|<percentage>|<flex>|min-content|max-content|auto] )","named-color":"transparent|aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen|<-non-standard-color>","namespace-prefix":"<ident>","ns-prefix":"[<ident-token>|'*']? '|'","number-percentage":"<number>|<percentage>","numeric-figure-values":"[lining-nums|oldstyle-nums]","numeric-fraction-values":"[diagonal-fractions|stacked-fractions]","numeric-spacing-values":"[proportional-nums|tabular-nums]",nth:"<an-plus-b>|even|odd","opacity()":"opacity( [<number-percentage>] )","overflow-position":"unsafe|safe","outline-radius":"<length>|<percentage>","page-body":"<declaration>? [; <page-body>]?|<page-margin-box> <page-body>","page-margin-box":"<page-margin-box-type> '{' <declaration-list> '}'","page-margin-box-type":"@top-left-corner|@top-left|@top-center|@top-right|@top-right-corner|@bottom-left-corner|@bottom-left|@bottom-center|@bottom-right|@bottom-right-corner|@left-top|@left-middle|@left-bottom|@right-top|@right-middle|@right-bottom","page-selector-list":"[<page-selector>#]?","page-selector":"<pseudo-page>+|<ident> <pseudo-page>*","path()":"path( [<fill-rule> ,]? <string> )","paint()":"paint( <ident> , <declaration-value>? )","perspective()":"perspective( <length> )","polygon()":"polygon( <fill-rule>? , [<length-percentage> <length-percentage>]# )",position:"[[left|center|right]||[top|center|bottom]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]?|[[left|right] <length-percentage>]&&[[top|bottom] <length-percentage>]]","pseudo-class-selector":"':' <ident-token>|':' <function-token> <any-value> ')'","pseudo-element-selector":"':' <pseudo-class-selector>","pseudo-page":": [left|right|first|blank]",quote:"open-quote|close-quote|no-open-quote|no-close-quote","radial-gradient()":"radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )","relative-selector":"<combinator>? <complex-selector>","relative-selector-list":"<relative-selector>#","relative-size":"larger|smaller","repeat-style":"repeat-x|repeat-y|[repeat|space|round|no-repeat]{1,2}","repeating-linear-gradient()":"repeating-linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )","repeating-radial-gradient()":"repeating-radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )","rgb()":"rgb( <percentage>{3} [/ <alpha-value>]? )|rgb( <number>{3} [/ <alpha-value>]? )|rgb( <percentage>#{3} , <alpha-value>? )|rgb( <number>#{3} , <alpha-value>? )","rgba()":"rgba( <percentage>{3} [/ <alpha-value>]? )|rgba( <number>{3} [/ <alpha-value>]? )|rgba( <percentage>#{3} , <alpha-value>? )|rgba( <number>#{3} , <alpha-value>? )","rotate()":"rotate( [<angle>|<zero>] )","rotate3d()":"rotate3d( <number> , <number> , <number> , [<angle>|<zero>] )","rotateX()":"rotateX( [<angle>|<zero>] )","rotateY()":"rotateY( [<angle>|<zero>] )","rotateZ()":"rotateZ( [<angle>|<zero>] )","saturate()":"saturate( <number-percentage> )","scale()":"scale( <number> , <number>? )","scale3d()":"scale3d( <number> , <number> , <number> )","scaleX()":"scaleX( <number> )","scaleY()":"scaleY( <number> )","scaleZ()":"scaleZ( <number> )","self-position":"center|start|end|self-start|self-end|flex-start|flex-end","shape-radius":"<length-percentage>|closest-side|farthest-side","skew()":"skew( [<angle>|<zero>] , [<angle>|<zero>]? )","skewX()":"skewX( [<angle>|<zero>] )","skewY()":"skewY( [<angle>|<zero>] )","sepia()":"sepia( <number-percentage> )",shadow:"inset?&&<length>{2,4}&&<color>?","shadow-t":"[<length>{2,3}&&<color>?]",shape:"rect( <top> , <right> , <bottom> , <left> )|rect( <top> <right> <bottom> <left> )","shape-box":"<box>|margin-box","side-or-corner":"[left|right]||[top|bottom]","single-animation":"<time>||<timing-function>||<time>||<single-animation-iteration-count>||<single-animation-direction>||<single-animation-fill-mode>||<single-animation-play-state>||[none|<keyframes-name>]","single-animation-direction":"normal|reverse|alternate|alternate-reverse","single-animation-fill-mode":"none|forwards|backwards|both","single-animation-iteration-count":"infinite|<number>","single-animation-play-state":"running|paused","single-transition":"[none|<single-transition-property>]||<time>||<timing-function>||<time>","single-transition-property":"all|<custom-ident>",size:"closest-side|farthest-side|closest-corner|farthest-corner|<length>|<length-percentage>{2}","step-position":"jump-start|jump-end|jump-none|jump-both|start|end","step-timing-function":"step-start|step-end|steps( <integer> [, <step-position>]? )","subclass-selector":"<id-selector>|<class-selector>|<attribute-selector>|<pseudo-class-selector>","supports-condition":"not <supports-in-parens>|<supports-in-parens> [and <supports-in-parens>]*|<supports-in-parens> [or <supports-in-parens>]*","supports-in-parens":"( <supports-condition> )|<supports-feature>|<general-enclosed>","supports-feature":"<supports-decl>|<supports-selector-fn>","supports-decl":"( <declaration> )","supports-selector-fn":"selector( <complex-selector> )",symbol:"<string>|<image>|<custom-ident>",target:"<target-counter()>|<target-counters()>|<target-text()>","target-counter()":"target-counter( [<string>|<url>] , <custom-ident> , <counter-style>? )","target-counters()":"target-counters( [<string>|<url>] , <custom-ident> , <string> , <counter-style>? )","target-text()":"target-text( [<string>|<url>] , [content|before|after|first-letter]? )","time-percentage":"<time>|<percentage>","timing-function":"linear|<cubic-bezier-timing-function>|<step-timing-function>","track-breadth":"<length-percentage>|<flex>|min-content|max-content|auto","track-list":"[<line-names>? [<track-size>|<track-repeat>]]+ <line-names>?","track-repeat":"repeat( [<positive-integer>] , [<line-names>? <track-size>]+ <line-names>? )","track-size":"<track-breadth>|minmax( <inflexible-breadth> , <track-breadth> )|fit-content( [<length>|<percentage>] )","transform-function":"<matrix()>|<translate()>|<translateX()>|<translateY()>|<scale()>|<scaleX()>|<scaleY()>|<rotate()>|<skew()>|<skewX()>|<skewY()>|<matrix3d()>|<translate3d()>|<translateZ()>|<scale3d()>|<scaleZ()>|<rotate3d()>|<rotateX()>|<rotateY()>|<rotateZ()>|<perspective()>","transform-list":"<transform-function>+","translate()":"translate( <length-percentage> , <length-percentage>? )","translate3d()":"translate3d( <length-percentage> , <length-percentage> , <length> )","translateX()":"translateX( <length-percentage> )","translateY()":"translateY( <length-percentage> )","translateZ()":"translateZ( <length> )","type-or-unit":"string|color|url|integer|number|length|angle|time|frequency|cap|ch|em|ex|ic|lh|rlh|rem|vb|vi|vw|vh|vmin|vmax|mm|Q|cm|in|pt|pc|px|deg|grad|rad|turn|ms|s|Hz|kHz|%","type-selector":"<wq-name>|<ns-prefix>? '*'","var()":"var( <custom-property-name> , <declaration-value>? )","viewport-length":"auto|<length-percentage>","wq-name":"<ns-prefix>? <ident-token>","-legacy-gradient":"<-webkit-gradient()>|<-legacy-linear-gradient>|<-legacy-repeating-linear-gradient>|<-legacy-radial-gradient>|<-legacy-repeating-radial-gradient>","-legacy-linear-gradient":"-moz-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-repeating-linear-gradient":"-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-linear-gradient-arguments":"[<angle>|<side-or-corner>]? , <color-stop-list>","-legacy-radial-gradient":"-moz-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-repeating-radial-gradient":"-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-radial-gradient-arguments":"[<position> ,]? [[[<-legacy-radial-gradient-shape>||<-legacy-radial-gradient-size>]|[<length>|<percentage>]{2}] ,]? <color-stop-list>","-legacy-radial-gradient-size":"closest-side|closest-corner|farthest-side|farthest-corner|contain|cover","-legacy-radial-gradient-shape":"circle|ellipse","-non-standard-font":"-apple-system-body|-apple-system-headline|-apple-system-subheadline|-apple-system-caption1|-apple-system-caption2|-apple-system-footnote|-apple-system-short-body|-apple-system-short-headline|-apple-system-short-subheadline|-apple-system-short-caption1|-apple-system-short-footnote|-apple-system-tall-body","-non-standard-color":"-moz-ButtonDefault|-moz-ButtonHoverFace|-moz-ButtonHoverText|-moz-CellHighlight|-moz-CellHighlightText|-moz-Combobox|-moz-ComboboxText|-moz-Dialog|-moz-DialogText|-moz-dragtargetzone|-moz-EvenTreeRow|-moz-Field|-moz-FieldText|-moz-html-CellHighlight|-moz-html-CellHighlightText|-moz-mac-accentdarkestshadow|-moz-mac-accentdarkshadow|-moz-mac-accentface|-moz-mac-accentlightesthighlight|-moz-mac-accentlightshadow|-moz-mac-accentregularhighlight|-moz-mac-accentregularshadow|-moz-mac-chrome-active|-moz-mac-chrome-inactive|-moz-mac-focusring|-moz-mac-menuselect|-moz-mac-menushadow|-moz-mac-menutextselect|-moz-MenuHover|-moz-MenuHoverText|-moz-MenuBarText|-moz-MenuBarHoverText|-moz-nativehyperlinktext|-moz-OddTreeRow|-moz-win-communicationstext|-moz-win-mediatext|-moz-activehyperlinktext|-moz-default-background-color|-moz-default-color|-moz-hyperlinktext|-moz-visitedhyperlinktext|-webkit-activelink|-webkit-focus-ring-color|-webkit-link|-webkit-text","-non-standard-image-rendering":"optimize-contrast|-moz-crisp-edges|-o-crisp-edges|-webkit-optimize-contrast","-non-standard-overflow":"-moz-scrollbars-none|-moz-scrollbars-horizontal|-moz-scrollbars-vertical|-moz-hidden-unscrollable","-non-standard-width":"fill-available|min-intrinsic|intrinsic|-moz-available|-moz-fit-content|-moz-min-content|-moz-max-content|-webkit-min-content|-webkit-max-content","-webkit-gradient()":"-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point>|, <-webkit-gradient-radius> , <-webkit-gradient-point>] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )","-webkit-gradient-color-stop":"from( <color> )|color-stop( [<number-zero-one>|<percentage>] , <color> )|to( <color> )","-webkit-gradient-point":"[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]","-webkit-gradient-radius":"<length>|<percentage>","-webkit-gradient-type":"linear|radial","-webkit-mask-box-repeat":"repeat|stretch|round","-webkit-mask-clip-style":"border|border-box|padding|padding-box|content|content-box|text","-ms-filter-function-list":"<-ms-filter-function>+","-ms-filter-function":"<-ms-filter-function-progid>|<-ms-filter-function-legacy>","-ms-filter-function-progid":"'progid:' [<ident-token> '.']* [<ident-token>|<function-token> <any-value>? )]","-ms-filter-function-legacy":"<ident-token>|<function-token> <any-value>? )","-ms-filter":"<string>",age:"child|young|old","attr-name":"<wq-name>","attr-fallback":"<any-value>","border-radius":"<length-percentage>{1,2}",bottom:"<length>|auto","generic-voice":"[<age>? <gender> <integer>?]",gender:"male|female|neutral",left:"<length>|auto","mask-image":"<mask-reference>#","name-repeat":"repeat( [<positive-integer>|auto-fill] , <line-names>+ )",paint:"none|<color>|<url> [none|<color>]?|context-fill|context-stroke","page-size":"A5|A4|A3|B5|B4|JIS-B5|JIS-B4|letter|legal|ledger",ratio:"<integer> / <integer>",right:"<length>|auto","svg-length":"<percentage>|<length>|<number>","svg-writing-mode":"lr-tb|rl-tb|tb-rl|lr|rl|tb",top:"<length>|auto","track-group":"'(' [<string>* <track-minmax> <string>*]+ ')' ['[' <positive-integer> ']']?|<track-minmax>","track-list-v0":"[<string>* <track-group> <string>*]+|none","track-minmax":"minmax( <track-breadth> , <track-breadth> )|auto|<track-breadth>|fit-content",x:"<number>",y:"<number>",declaration:"<ident-token> : <declaration-value>? ['!' important]?","declaration-list":"[<declaration>? ';']* <declaration>?",url:"url( <string> <url-modifier>* )|<url-token>","url-modifier":"<ident>|<function-token> <any-value> )","number-zero-one":"<number [0,1]>","number-one-or-greater":"<number [1,∞]>","positive-integer":"<integer [0,∞]>","-non-standard-display":"-ms-inline-flexbox|-ms-grid|-ms-inline-grid|-webkit-flex|-webkit-inline-flex|-webkit-box|-webkit-inline-box|-moz-inline-stack|-moz-box|-moz-inline-box"},properties:{"--*":"<declaration-value>","-ms-accelerator":"false|true","-ms-block-progression":"tb|rl|bt|lr","-ms-content-zoom-chaining":"none|chained","-ms-content-zooming":"none|zoom","-ms-content-zoom-limit":"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>","-ms-content-zoom-limit-max":"<percentage>","-ms-content-zoom-limit-min":"<percentage>","-ms-content-zoom-snap":"<'-ms-content-zoom-snap-type'>||<'-ms-content-zoom-snap-points'>","-ms-content-zoom-snap-points":"snapInterval( <percentage> , <percentage> )|snapList( <percentage># )","-ms-content-zoom-snap-type":"none|proximity|mandatory","-ms-filter":"<string>","-ms-flow-from":"[none|<custom-ident>]#","-ms-flow-into":"[none|<custom-ident>]#","-ms-grid-columns":"none|<track-list>|<auto-track-list>","-ms-grid-rows":"none|<track-list>|<auto-track-list>","-ms-high-contrast-adjust":"auto|none","-ms-hyphenate-limit-chars":"auto|<integer>{1,3}","-ms-hyphenate-limit-lines":"no-limit|<integer>","-ms-hyphenate-limit-zone":"<percentage>|<length>","-ms-ime-align":"auto|after","-ms-overflow-style":"auto|none|scrollbar|-ms-autohiding-scrollbar","-ms-scrollbar-3dlight-color":"<color>","-ms-scrollbar-arrow-color":"<color>","-ms-scrollbar-base-color":"<color>","-ms-scrollbar-darkshadow-color":"<color>","-ms-scrollbar-face-color":"<color>","-ms-scrollbar-highlight-color":"<color>","-ms-scrollbar-shadow-color":"<color>","-ms-scrollbar-track-color":"<color>","-ms-scroll-chaining":"chained|none","-ms-scroll-limit":"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>","-ms-scroll-limit-x-max":"auto|<length>","-ms-scroll-limit-x-min":"<length>","-ms-scroll-limit-y-max":"auto|<length>","-ms-scroll-limit-y-min":"<length>","-ms-scroll-rails":"none|railed","-ms-scroll-snap-points-x":"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )","-ms-scroll-snap-points-y":"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )","-ms-scroll-snap-type":"none|proximity|mandatory","-ms-scroll-snap-x":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>","-ms-scroll-snap-y":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>","-ms-scroll-translation":"none|vertical-to-horizontal","-ms-text-autospace":"none|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space","-ms-touch-select":"grippers|none","-ms-user-select":"none|element|text","-ms-wrap-flow":"auto|both|start|end|maximum|clear","-ms-wrap-margin":"<length>","-ms-wrap-through":"wrap|none","-moz-appearance":"none|button|button-arrow-down|button-arrow-next|button-arrow-previous|button-arrow-up|button-bevel|button-focus|caret|checkbox|checkbox-container|checkbox-label|checkmenuitem|dualbutton|groupbox|listbox|listitem|menuarrow|menubar|menucheckbox|menuimage|menuitem|menuitemtext|menulist|menulist-button|menulist-text|menulist-textfield|menupopup|menuradio|menuseparator|meterbar|meterchunk|progressbar|progressbar-vertical|progresschunk|progresschunk-vertical|radio|radio-container|radio-label|radiomenuitem|range|range-thumb|resizer|resizerpanel|scale-horizontal|scalethumbend|scalethumb-horizontal|scalethumbstart|scalethumbtick|scalethumb-vertical|scale-vertical|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|separator|sheet|spinner|spinner-downbutton|spinner-textfield|spinner-upbutton|splitter|statusbar|statusbarpanel|tab|tabpanel|tabpanels|tab-scroll-arrow-back|tab-scroll-arrow-forward|textfield|textfield-multiline|toolbar|toolbarbutton|toolbarbutton-dropdown|toolbargripper|toolbox|tooltip|treeheader|treeheadercell|treeheadersortarrow|treeitem|treeline|treetwisty|treetwistyopen|treeview|-moz-mac-unified-toolbar|-moz-win-borderless-glass|-moz-win-browsertabbar-toolbox|-moz-win-communicationstext|-moz-win-communications-toolbox|-moz-win-exclude-glass|-moz-win-glass|-moz-win-mediatext|-moz-win-media-toolbox|-moz-window-button-box|-moz-window-button-box-maximized|-moz-window-button-close|-moz-window-button-maximize|-moz-window-button-minimize|-moz-window-button-restore|-moz-window-frame-bottom|-moz-window-frame-left|-moz-window-frame-right|-moz-window-titlebar|-moz-window-titlebar-maximized","-moz-binding":"<url>|none","-moz-border-bottom-colors":"<color>+|none","-moz-border-left-colors":"<color>+|none","-moz-border-right-colors":"<color>+|none","-moz-border-top-colors":"<color>+|none","-moz-context-properties":"none|[fill|fill-opacity|stroke|stroke-opacity]#","-moz-float-edge":"border-box|content-box|margin-box|padding-box","-moz-force-broken-image-icon":"<integer [0,1]>","-moz-image-region":"<shape>|auto","-moz-orient":"inline|block|horizontal|vertical","-moz-outline-radius":"<outline-radius>{1,4} [/ <outline-radius>{1,4}]?","-moz-outline-radius-bottomleft":"<outline-radius>","-moz-outline-radius-bottomright":"<outline-radius>","-moz-outline-radius-topleft":"<outline-radius>","-moz-outline-radius-topright":"<outline-radius>","-moz-stack-sizing":"ignore|stretch-to-fit","-moz-text-blink":"none|blink","-moz-user-focus":"ignore|normal|select-after|select-before|select-menu|select-same|select-all|none","-moz-user-input":"auto|none|enabled|disabled","-moz-user-modify":"read-only|read-write|write-only","-moz-window-dragging":"drag|no-drag","-moz-window-shadow":"default|menu|tooltip|sheet|none","-webkit-appearance":"none|button|button-bevel|caps-lock-indicator|caret|checkbox|default-button|inner-spin-button|listbox|listitem|media-controls-background|media-controls-fullscreen-background|media-current-time-display|media-enter-fullscreen-button|media-exit-fullscreen-button|media-fullscreen-button|media-mute-button|media-overlay-play-button|media-play-button|media-seek-back-button|media-seek-forward-button|media-slider|media-sliderthumb|media-time-remaining-display|media-toggle-closed-captions-button|media-volume-slider|media-volume-slider-container|media-volume-sliderthumb|menulist|menulist-button|menulist-text|menulist-textfield|meter|progress-bar|progress-bar-value|push-button|radio|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbargripper-horizontal|scrollbargripper-vertical|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|searchfield-cancel-button|searchfield-decoration|searchfield-results-button|searchfield-results-decoration|slider-horizontal|slider-vertical|sliderthumb-horizontal|sliderthumb-vertical|square-button|textarea|textfield|-apple-pay-button","-webkit-border-before":"<'border-width'>||<'border-style'>||<'color'>","-webkit-border-before-color":"<'color'>","-webkit-border-before-style":"<'border-style'>","-webkit-border-before-width":"<'border-width'>","-webkit-box-reflect":"[above|below|right|left]? <length>? <image>?","-webkit-line-clamp":"none|<integer>","-webkit-mask":"[<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||[<box>|border|padding|content|text]||[<box>|border|padding|content]]#","-webkit-mask-attachment":"<attachment>#","-webkit-mask-clip":"[<box>|border|padding|content|text]#","-webkit-mask-composite":"<composite-style>#","-webkit-mask-image":"<mask-reference>#","-webkit-mask-origin":"[<box>|border|padding|content]#","-webkit-mask-position":"<position>#","-webkit-mask-position-x":"[<length-percentage>|left|center|right]#","-webkit-mask-position-y":"[<length-percentage>|top|center|bottom]#","-webkit-mask-repeat":"<repeat-style>#","-webkit-mask-repeat-x":"repeat|no-repeat|space|round","-webkit-mask-repeat-y":"repeat|no-repeat|space|round","-webkit-mask-size":"<bg-size>#","-webkit-overflow-scrolling":"auto|touch","-webkit-tap-highlight-color":"<color>","-webkit-text-fill-color":"<color>","-webkit-text-stroke":"<length>||<color>","-webkit-text-stroke-color":"<color>","-webkit-text-stroke-width":"<length>","-webkit-touch-callout":"default|none","-webkit-user-modify":"read-only|read-write|read-write-plaintext-only","align-content":"normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>","align-items":"normal|stretch|<baseline-position>|[<overflow-position>? <self-position>]","align-self":"auto|normal|stretch|<baseline-position>|<overflow-position>? <self-position>","align-tracks":"[normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>]#",all:"initial|inherit|unset|revert",animation:"<single-animation>#","animation-delay":"<time>#","animation-direction":"<single-animation-direction>#","animation-duration":"<time>#","animation-fill-mode":"<single-animation-fill-mode>#","animation-iteration-count":"<single-animation-iteration-count>#","animation-name":"[none|<keyframes-name>]#","animation-play-state":"<single-animation-play-state>#","animation-timing-function":"<timing-function>#",appearance:"none|auto|textfield|menulist-button|<compat-auto>","aspect-ratio":"auto|<ratio>",azimuth:"<angle>|[[left-side|far-left|left|center-left|center|center-right|right|far-right|right-side]||behind]|leftwards|rightwards","backdrop-filter":"none|<filter-function-list>","backface-visibility":"visible|hidden",background:"[<bg-layer> ,]* <final-bg-layer>","background-attachment":"<attachment>#","background-blend-mode":"<blend-mode>#","background-clip":"<box>#","background-color":"<color>","background-image":"<bg-image>#","background-origin":"<box>#","background-position":"<bg-position>#","background-position-x":"[center|[[left|right|x-start|x-end]? <length-percentage>?]!]#","background-position-y":"[center|[[top|bottom|y-start|y-end]? <length-percentage>?]!]#","background-repeat":"<repeat-style>#","background-size":"<bg-size>#","block-overflow":"clip|ellipsis|<string>","block-size":"<'width'>",border:"<line-width>||<line-style>||<color>","border-block":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-color":"<'border-top-color'>{1,2}","border-block-style":"<'border-top-style'>","border-block-width":"<'border-top-width'>","border-block-end":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-end-color":"<'border-top-color'>","border-block-end-style":"<'border-top-style'>","border-block-end-width":"<'border-top-width'>","border-block-start":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-start-color":"<'border-top-color'>","border-block-start-style":"<'border-top-style'>","border-block-start-width":"<'border-top-width'>","border-bottom":"<line-width>||<line-style>||<color>","border-bottom-color":"<'border-top-color'>","border-bottom-left-radius":"<length-percentage>{1,2}","border-bottom-right-radius":"<length-percentage>{1,2}","border-bottom-style":"<line-style>","border-bottom-width":"<line-width>","border-collapse":"collapse|separate","border-color":"<color>{1,4}","border-end-end-radius":"<length-percentage>{1,2}","border-end-start-radius":"<length-percentage>{1,2}","border-image":"<'border-image-source'>||<'border-image-slice'> [/ <'border-image-width'>|/ <'border-image-width'>? / <'border-image-outset'>]?||<'border-image-repeat'>","border-image-outset":"[<length>|<number>]{1,4}","border-image-repeat":"[stretch|repeat|round|space]{1,2}","border-image-slice":"<number-percentage>{1,4}&&fill?","border-image-source":"none|<image>","border-image-width":"[<length-percentage>|<number>|auto]{1,4}","border-inline":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-end":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-color":"<'border-top-color'>{1,2}","border-inline-style":"<'border-top-style'>","border-inline-width":"<'border-top-width'>","border-inline-end-color":"<'border-top-color'>","border-inline-end-style":"<'border-top-style'>","border-inline-end-width":"<'border-top-width'>","border-inline-start":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-start-color":"<'border-top-color'>","border-inline-start-style":"<'border-top-style'>","border-inline-start-width":"<'border-top-width'>","border-left":"<line-width>||<line-style>||<color>","border-left-color":"<color>","border-left-style":"<line-style>","border-left-width":"<line-width>","border-radius":"<length-percentage>{1,4} [/ <length-percentage>{1,4}]?","border-right":"<line-width>||<line-style>||<color>","border-right-color":"<color>","border-right-style":"<line-style>","border-right-width":"<line-width>","border-spacing":"<length> <length>?","border-start-end-radius":"<length-percentage>{1,2}","border-start-start-radius":"<length-percentage>{1,2}","border-style":"<line-style>{1,4}","border-top":"<line-width>||<line-style>||<color>","border-top-color":"<color>","border-top-left-radius":"<length-percentage>{1,2}","border-top-right-radius":"<length-percentage>{1,2}","border-top-style":"<line-style>","border-top-width":"<line-width>","border-width":"<line-width>{1,4}",bottom:"<length>|<percentage>|auto","box-align":"start|center|end|baseline|stretch","box-decoration-break":"slice|clone","box-direction":"normal|reverse|inherit","box-flex":"<number>","box-flex-group":"<integer>","box-lines":"single|multiple","box-ordinal-group":"<integer>","box-orient":"horizontal|vertical|inline-axis|block-axis|inherit","box-pack":"start|center|end|justify","box-shadow":"none|<shadow>#","box-sizing":"content-box|border-box","break-after":"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region","break-before":"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region","break-inside":"auto|avoid|avoid-page|avoid-column|avoid-region","caption-side":"top|bottom|block-start|block-end|inline-start|inline-end","caret-color":"auto|<color>",clear:"none|left|right|both|inline-start|inline-end",clip:"<shape>|auto","clip-path":"<clip-source>|[<basic-shape>||<geometry-box>]|none",color:"<color>","color-adjust":"economy|exact","column-count":"<integer>|auto","column-fill":"auto|balance|balance-all","column-gap":"normal|<length-percentage>","column-rule":"<'column-rule-width'>||<'column-rule-style'>||<'column-rule-color'>","column-rule-color":"<color>","column-rule-style":"<'border-style'>","column-rule-width":"<'border-width'>","column-span":"none|all","column-width":"<length>|auto",columns:"<'column-width'>||<'column-count'>",contain:"none|strict|content|[size||layout||style||paint]",content:"normal|none|[<content-replacement>|<content-list>] [/ <string>]?","counter-increment":"[<custom-ident> <integer>?]+|none","counter-reset":"[<custom-ident> <integer>?]+|none","counter-set":"[<custom-ident> <integer>?]+|none",cursor:"[[<url> [<x> <y>]? ,]* [auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|e-resize|n-resize|ne-resize|nw-resize|s-resize|se-resize|sw-resize|w-resize|ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize|row-resize|all-scroll|zoom-in|zoom-out|grab|grabbing|hand|-webkit-grab|-webkit-grabbing|-webkit-zoom-in|-webkit-zoom-out|-moz-grab|-moz-grabbing|-moz-zoom-in|-moz-zoom-out]]",direction:"ltr|rtl",display:"[<display-outside>||<display-inside>]|<display-listitem>|<display-internal>|<display-box>|<display-legacy>|<-non-standard-display>","empty-cells":"show|hide",filter:"none|<filter-function-list>|<-ms-filter-function-list>",flex:"none|[<'flex-grow'> <'flex-shrink'>?||<'flex-basis'>]","flex-basis":"content|<'width'>","flex-direction":"row|row-reverse|column|column-reverse","flex-flow":"<'flex-direction'>||<'flex-wrap'>","flex-grow":"<number>","flex-shrink":"<number>","flex-wrap":"nowrap|wrap|wrap-reverse",float:"left|right|none|inline-start|inline-end",font:"[[<'font-style'>||<font-variant-css21>||<'font-weight'>||<'font-stretch'>]? <'font-size'> [/ <'line-height'>]? <'font-family'>]|caption|icon|menu|message-box|small-caption|status-bar","font-family":"[<family-name>|<generic-family>]#","font-feature-settings":"normal|<feature-tag-value>#","font-kerning":"auto|normal|none","font-language-override":"normal|<string>","font-optical-sizing":"auto|none","font-variation-settings":"normal|[<string> <number>]#","font-size":"<absolute-size>|<relative-size>|<length-percentage>","font-size-adjust":"none|<number>","font-smooth":"auto|never|always|<absolute-size>|<length>","font-stretch":"<font-stretch-absolute>","font-style":"normal|italic|oblique <angle>?","font-synthesis":"none|[weight||style]","font-variant":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]","font-variant-alternates":"normal|[stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )]","font-variant-caps":"normal|small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps","font-variant-east-asian":"normal|[<east-asian-variant-values>||<east-asian-width-values>||ruby]","font-variant-ligatures":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>]","font-variant-numeric":"normal|[<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero]","font-variant-position":"normal|sub|super","font-weight":"<font-weight-absolute>|bolder|lighter",gap:"<'row-gap'> <'column-gap'>?",grid:"<'grid-template'>|<'grid-template-rows'> / [auto-flow&&dense?] <'grid-auto-columns'>?|[auto-flow&&dense?] <'grid-auto-rows'>? / <'grid-template-columns'>","grid-area":"<grid-line> [/ <grid-line>]{0,3}","grid-auto-columns":"<track-size>+","grid-auto-flow":"[row|column]||dense","grid-auto-rows":"<track-size>+","grid-column":"<grid-line> [/ <grid-line>]?","grid-column-end":"<grid-line>","grid-column-gap":"<length-percentage>","grid-column-start":"<grid-line>","grid-gap":"<'grid-row-gap'> <'grid-column-gap'>?","grid-row":"<grid-line> [/ <grid-line>]?","grid-row-end":"<grid-line>","grid-row-gap":"<length-percentage>","grid-row-start":"<grid-line>","grid-template":"none|[<'grid-template-rows'> / <'grid-template-columns'>]|[<line-names>? <string> <track-size>? <line-names>?]+ [/ <explicit-track-list>]?","grid-template-areas":"none|<string>+","grid-template-columns":"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?","grid-template-rows":"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?","hanging-punctuation":"none|[first||[force-end|allow-end]||last]",height:"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )",hyphens:"none|manual|auto","image-orientation":"from-image|<angle>|[<angle>? flip]","image-rendering":"auto|crisp-edges|pixelated|optimizeSpeed|optimizeQuality|<-non-standard-image-rendering>","image-resolution":"[from-image||<resolution>]&&snap?","ime-mode":"auto|normal|active|inactive|disabled","initial-letter":"normal|[<number> <integer>?]","initial-letter-align":"[auto|alphabetic|hanging|ideographic]","inline-size":"<'width'>",inset:"<'top'>{1,4}","inset-block":"<'top'>{1,2}","inset-block-end":"<'top'>","inset-block-start":"<'top'>","inset-inline":"<'top'>{1,2}","inset-inline-end":"<'top'>","inset-inline-start":"<'top'>",isolation:"auto|isolate","justify-content":"normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]","justify-items":"normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]|legacy|legacy&&[left|right|center]","justify-self":"auto|normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]","justify-tracks":"[normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]]#",left:"<length>|<percentage>|auto","letter-spacing":"normal|<length-percentage>","line-break":"auto|loose|normal|strict|anywhere","line-clamp":"none|<integer>","line-height":"normal|<number>|<length>|<percentage>","line-height-step":"<length>","list-style":"<'list-style-type'>||<'list-style-position'>||<'list-style-image'>","list-style-image":"<url>|none","list-style-position":"inside|outside","list-style-type":"<counter-style>|<string>|none",margin:"[<length>|<percentage>|auto]{1,4}","margin-block":"<'margin-left'>{1,2}","margin-block-end":"<'margin-left'>","margin-block-start":"<'margin-left'>","margin-bottom":"<length>|<percentage>|auto","margin-inline":"<'margin-left'>{1,2}","margin-inline-end":"<'margin-left'>","margin-inline-start":"<'margin-left'>","margin-left":"<length>|<percentage>|auto","margin-right":"<length>|<percentage>|auto","margin-top":"<length>|<percentage>|auto","margin-trim":"none|in-flow|all",mask:"<mask-layer>#","mask-border":"<'mask-border-source'>||<'mask-border-slice'> [/ <'mask-border-width'>? [/ <'mask-border-outset'>]?]?||<'mask-border-repeat'>||<'mask-border-mode'>","mask-border-mode":"luminance|alpha","mask-border-outset":"[<length>|<number>]{1,4}","mask-border-repeat":"[stretch|repeat|round|space]{1,2}","mask-border-slice":"<number-percentage>{1,4} fill?","mask-border-source":"none|<image>","mask-border-width":"[<length-percentage>|<number>|auto]{1,4}","mask-clip":"[<geometry-box>|no-clip]#","mask-composite":"<compositing-operator>#","mask-image":"<mask-reference>#","mask-mode":"<masking-mode>#","mask-origin":"<geometry-box>#","mask-position":"<position>#","mask-repeat":"<repeat-style>#","mask-size":"<bg-size>#","mask-type":"luminance|alpha","masonry-auto-flow":"[pack|next]||[definite-first|ordered]","math-style":"normal|compact","max-block-size":"<'max-width'>","max-height":"none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )","max-inline-size":"<'max-width'>","max-lines":"none|<integer>","max-width":"none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>","min-block-size":"<'min-width'>","min-height":"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )","min-inline-size":"<'min-width'>","min-width":"auto|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>","mix-blend-mode":"<blend-mode>","object-fit":"fill|contain|cover|none|scale-down","object-position":"<position>",offset:"[<'offset-position'>? [<'offset-path'> [<'offset-distance'>||<'offset-rotate'>]?]?]! [/ <'offset-anchor'>]?","offset-anchor":"auto|<position>","offset-distance":"<length-percentage>","offset-path":"none|ray( [<angle>&&<size>&&contain?] )|<path()>|<url>|[<basic-shape>||<geometry-box>]","offset-position":"auto|<position>","offset-rotate":"[auto|reverse]||<angle>",opacity:"<alpha-value>",order:"<integer>",orphans:"<integer>",outline:"[<'outline-color'>||<'outline-style'>||<'outline-width'>]","outline-color":"<color>|invert","outline-offset":"<length>","outline-style":"auto|<'border-style'>","outline-width":"<line-width>",overflow:"[visible|hidden|clip|scroll|auto]{1,2}|<-non-standard-overflow>","overflow-anchor":"auto|none","overflow-block":"visible|hidden|clip|scroll|auto","overflow-clip-box":"padding-box|content-box","overflow-inline":"visible|hidden|clip|scroll|auto","overflow-wrap":"normal|break-word|anywhere","overflow-x":"visible|hidden|clip|scroll|auto","overflow-y":"visible|hidden|clip|scroll|auto","overscroll-behavior":"[contain|none|auto]{1,2}","overscroll-behavior-block":"contain|none|auto","overscroll-behavior-inline":"contain|none|auto","overscroll-behavior-x":"contain|none|auto","overscroll-behavior-y":"contain|none|auto",padding:"[<length>|<percentage>]{1,4}","padding-block":"<'padding-left'>{1,2}","padding-block-end":"<'padding-left'>","padding-block-start":"<'padding-left'>","padding-bottom":"<length>|<percentage>","padding-inline":"<'padding-left'>{1,2}","padding-inline-end":"<'padding-left'>","padding-inline-start":"<'padding-left'>","padding-left":"<length>|<percentage>","padding-right":"<length>|<percentage>","padding-top":"<length>|<percentage>","page-break-after":"auto|always|avoid|left|right|recto|verso","page-break-before":"auto|always|avoid|left|right|recto|verso","page-break-inside":"auto|avoid","paint-order":"normal|[fill||stroke||markers]",perspective:"none|<length>","perspective-origin":"<position>","place-content":"<'align-content'> <'justify-content'>?","place-items":"<'align-items'> <'justify-items'>?","place-self":"<'align-self'> <'justify-self'>?","pointer-events":"auto|none|visiblePainted|visibleFill|visibleStroke|visible|painted|fill|stroke|all|inherit",position:"static|relative|absolute|sticky|fixed|-webkit-sticky",quotes:"none|auto|[<string> <string>]+",resize:"none|both|horizontal|vertical|block|inline",right:"<length>|<percentage>|auto",rotate:"none|<angle>|[x|y|z|<number>{3}]&&<angle>","row-gap":"normal|<length-percentage>","ruby-align":"start|center|space-between|space-around","ruby-merge":"separate|collapse|auto","ruby-position":"over|under|inter-character",scale:"none|<number>{1,3}","scrollbar-color":"auto|dark|light|<color>{2}","scrollbar-gutter":"auto|[stable|always]&&both?&&force?","scrollbar-width":"auto|thin|none","scroll-behavior":"auto|smooth","scroll-margin":"<length>{1,4}","scroll-margin-block":"<length>{1,2}","scroll-margin-block-start":"<length>","scroll-margin-block-end":"<length>","scroll-margin-bottom":"<length>","scroll-margin-inline":"<length>{1,2}","scroll-margin-inline-start":"<length>","scroll-margin-inline-end":"<length>","scroll-margin-left":"<length>","scroll-margin-right":"<length>","scroll-margin-top":"<length>","scroll-padding":"[auto|<length-percentage>]{1,4}","scroll-padding-block":"[auto|<length-percentage>]{1,2}","scroll-padding-block-start":"auto|<length-percentage>","scroll-padding-block-end":"auto|<length-percentage>","scroll-padding-bottom":"auto|<length-percentage>","scroll-padding-inline":"[auto|<length-percentage>]{1,2}","scroll-padding-inline-start":"auto|<length-percentage>","scroll-padding-inline-end":"auto|<length-percentage>","scroll-padding-left":"auto|<length-percentage>","scroll-padding-right":"auto|<length-percentage>","scroll-padding-top":"auto|<length-percentage>","scroll-snap-align":"[none|start|end|center]{1,2}","scroll-snap-coordinate":"none|<position>#","scroll-snap-destination":"<position>","scroll-snap-points-x":"none|repeat( <length-percentage> )","scroll-snap-points-y":"none|repeat( <length-percentage> )","scroll-snap-stop":"normal|always","scroll-snap-type":"none|[x|y|block|inline|both] [mandatory|proximity]?","scroll-snap-type-x":"none|mandatory|proximity","scroll-snap-type-y":"none|mandatory|proximity","shape-image-threshold":"<alpha-value>","shape-margin":"<length-percentage>","shape-outside":"none|<shape-box>||<basic-shape>|<image>","tab-size":"<integer>|<length>","table-layout":"auto|fixed","text-align":"start|end|left|right|center|justify|match-parent","text-align-last":"auto|start|end|left|right|center|justify","text-combine-upright":"none|all|[digits <integer>?]","text-decoration":"<'text-decoration-line'>||<'text-decoration-style'>||<'text-decoration-color'>||<'text-decoration-thickness'>","text-decoration-color":"<color>","text-decoration-line":"none|[underline||overline||line-through||blink]|spelling-error|grammar-error","text-decoration-skip":"none|[objects||[spaces|[leading-spaces||trailing-spaces]]||edges||box-decoration]","text-decoration-skip-ink":"auto|all|none","text-decoration-style":"solid|double|dotted|dashed|wavy","text-decoration-thickness":"auto|from-font|<length>|<percentage>","text-emphasis":"<'text-emphasis-style'>||<'text-emphasis-color'>","text-emphasis-color":"<color>","text-emphasis-position":"[over|under]&&[right|left]","text-emphasis-style":"none|[[filled|open]||[dot|circle|double-circle|triangle|sesame]]|<string>","text-indent":"<length-percentage>&&hanging?&&each-line?","text-justify":"auto|inter-character|inter-word|none","text-orientation":"mixed|upright|sideways","text-overflow":"[clip|ellipsis|<string>]{1,2}","text-rendering":"auto|optimizeSpeed|optimizeLegibility|geometricPrecision","text-shadow":"none|<shadow-t>#","text-size-adjust":"none|auto|<percentage>","text-transform":"none|capitalize|uppercase|lowercase|full-width|full-size-kana","text-underline-offset":"auto|<length>|<percentage>","text-underline-position":"auto|from-font|[under||[left|right]]",top:"<length>|<percentage>|auto","touch-action":"auto|none|[[pan-x|pan-left|pan-right]||[pan-y|pan-up|pan-down]||pinch-zoom]|manipulation",transform:"none|<transform-list>","transform-box":"content-box|border-box|fill-box|stroke-box|view-box","transform-origin":"[<length-percentage>|left|center|right|top|bottom]|[[<length-percentage>|left|center|right]&&[<length-percentage>|top|center|bottom]] <length>?","transform-style":"flat|preserve-3d",transition:"<single-transition>#","transition-delay":"<time>#","transition-duration":"<time>#","transition-property":"none|<single-transition-property>#","transition-timing-function":"<timing-function>#",translate:"none|<length-percentage> [<length-percentage> <length>?]?","unicode-bidi":"normal|embed|isolate|bidi-override|isolate-override|plaintext|-moz-isolate|-moz-isolate-override|-moz-plaintext|-webkit-isolate|-webkit-isolate-override|-webkit-plaintext","user-select":"auto|text|none|contain|all","vertical-align":"baseline|sub|super|text-top|text-bottom|middle|top|bottom|<percentage>|<length>",visibility:"visible|hidden|collapse","white-space":"normal|pre|nowrap|pre-wrap|pre-line|break-spaces",widows:"<integer>",width:"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )|fit-content|-moz-fit-content|-webkit-fit-content","will-change":"auto|<animateable-feature>#","word-break":"normal|break-all|keep-all|break-word","word-spacing":"normal|<length-percentage>","word-wrap":"normal|break-word","writing-mode":"horizontal-tb|vertical-rl|vertical-lr|sideways-rl|sideways-lr|<svg-writing-mode>","z-index":"auto|<integer>",zoom:"normal|reset|<number>|<percentage>","-moz-background-clip":"padding|border","-moz-border-radius-bottomleft":"<'border-bottom-left-radius'>","-moz-border-radius-bottomright":"<'border-bottom-right-radius'>","-moz-border-radius-topleft":"<'border-top-left-radius'>","-moz-border-radius-topright":"<'border-bottom-right-radius'>","-moz-control-character-visibility":"visible|hidden","-moz-osx-font-smoothing":"auto|grayscale","-moz-user-select":"none|text|all|-moz-none","-ms-flex-align":"start|end|center|baseline|stretch","-ms-flex-item-align":"auto|start|end|center|baseline|stretch","-ms-flex-line-pack":"start|end|center|justify|distribute|stretch","-ms-flex-negative":"<'flex-shrink'>","-ms-flex-pack":"start|end|center|justify|distribute","-ms-flex-order":"<integer>","-ms-flex-positive":"<'flex-grow'>","-ms-flex-preferred-size":"<'flex-basis'>","-ms-interpolation-mode":"nearest-neighbor|bicubic","-ms-grid-column-align":"start|end|center|stretch","-ms-grid-row-align":"start|end|center|stretch","-ms-hyphenate-limit-last":"none|always|column|page|spread","-webkit-background-clip":"[<box>|border|padding|content|text]#","-webkit-column-break-after":"always|auto|avoid","-webkit-column-break-before":"always|auto|avoid","-webkit-column-break-inside":"always|auto|avoid","-webkit-font-smoothing":"auto|none|antialiased|subpixel-antialiased","-webkit-mask-box-image":"[<url>|<gradient>|none] [<length-percentage>{4} <-webkit-mask-box-repeat>{2}]?","-webkit-print-color-adjust":"economy|exact","-webkit-text-security":"none|circle|disc|square","-webkit-user-drag":"none|element|auto","-webkit-user-select":"auto|none|text|all","alignment-baseline":"auto|baseline|before-edge|text-before-edge|middle|central|after-edge|text-after-edge|ideographic|alphabetic|hanging|mathematical","baseline-shift":"baseline|sub|super|<svg-length>",behavior:"<url>+","clip-rule":"nonzero|evenodd",cue:"<'cue-before'> <'cue-after'>?","cue-after":"<url> <decibel>?|none","cue-before":"<url> <decibel>?|none","dominant-baseline":"auto|use-script|no-change|reset-size|ideographic|alphabetic|hanging|mathematical|central|middle|text-after-edge|text-before-edge",fill:"<paint>","fill-opacity":"<number-zero-one>","fill-rule":"nonzero|evenodd","glyph-orientation-horizontal":"<angle>","glyph-orientation-vertical":"<angle>",kerning:"auto|<svg-length>",marker:"none|<url>","marker-end":"none|<url>","marker-mid":"none|<url>","marker-start":"none|<url>",pause:"<'pause-before'> <'pause-after'>?","pause-after":"<time>|none|x-weak|weak|medium|strong|x-strong","pause-before":"<time>|none|x-weak|weak|medium|strong|x-strong",rest:"<'rest-before'> <'rest-after'>?","rest-after":"<time>|none|x-weak|weak|medium|strong|x-strong","rest-before":"<time>|none|x-weak|weak|medium|strong|x-strong","shape-rendering":"auto|optimizeSpeed|crispEdges|geometricPrecision",src:"[<url> [format( <string># )]?|local( <family-name> )]#",speak:"auto|none|normal","speak-as":"normal|spell-out||digits||[literal-punctuation|no-punctuation]",stroke:"<paint>","stroke-dasharray":"none|[<svg-length>+]#","stroke-dashoffset":"<svg-length>","stroke-linecap":"butt|round|square","stroke-linejoin":"miter|round|bevel","stroke-miterlimit":"<number-one-or-greater>","stroke-opacity":"<number-zero-one>","stroke-width":"<svg-length>","text-anchor":"start|middle|end","unicode-range":"<urange>#","voice-balance":"<number>|left|center|right|leftwards|rightwards","voice-duration":"auto|<time>","voice-family":"[[<family-name>|<generic-voice>] ,]* [<family-name>|<generic-voice>]|preserve","voice-pitch":"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]","voice-range":"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]","voice-rate":"[normal|x-slow|slow|medium|fast|x-fast]||<percentage>","voice-stress":"normal|strong|moderate|none|reduced","voice-volume":"silent|[[x-soft|soft|medium|loud|x-loud]||<decibel>]"},atrules:{charset:{prelude:"<string>",descriptors:null},"counter-style":{prelude:"<counter-style-name>",descriptors:{"additive-symbols":"[<integer>&&<symbol>]#",fallback:"<counter-style-name>",negative:"<symbol> <symbol>?",pad:"<integer>&&<symbol>",prefix:"<symbol>",range:"[[<integer>|infinite]{2}]#|auto","speak-as":"auto|bullets|numbers|words|spell-out|<counter-style-name>",suffix:"<symbol>",symbols:"<symbol>+",system:"cyclic|numeric|alphabetic|symbolic|additive|[fixed <integer>?]|[extends <counter-style-name>]"}},document:{prelude:"[<url>|url-prefix( <string> )|domain( <string> )|media-document( <string> )|regexp( <string> )]#",descriptors:null},"font-face":{prelude:null,descriptors:{"font-display":"[auto|block|swap|fallback|optional]","font-family":"<family-name>","font-feature-settings":"normal|<feature-tag-value>#","font-variation-settings":"normal|[<string> <number>]#","font-stretch":"<font-stretch-absolute>{1,2}","font-style":"normal|italic|oblique <angle>{0,2}","font-weight":"<font-weight-absolute>{1,2}","font-variant":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]",src:"[<url> [format( <string># )]?|local( <family-name> )]#","unicode-range":"<urange>#"}},"font-feature-values":{prelude:"<family-name>#",descriptors:null},import:{prelude:"[<string>|<url>] [<media-query-list>]?",descriptors:null},keyframes:{prelude:"<keyframes-name>",descriptors:null},media:{prelude:"<media-query-list>",descriptors:null},namespace:{prelude:"<namespace-prefix>? [<string>|<url>]",descriptors:null},page:{prelude:"<page-selector-list>",descriptors:{bleed:"auto|<length>",marks:"none|[crop||cross]",size:"<length>{1,2}|auto|[<page-size>||[portrait|landscape]]"}},property:{prelude:"<custom-property-name>",descriptors:{syntax:"<string>",inherits:"true|false","initial-value":"<string>"}},supports:{prelude:"<supports-condition>",descriptors:null},viewport:{prelude:null,descriptors:{height:"<viewport-length>{1,2}","max-height":"<viewport-length>","max-width":"<viewport-length>","max-zoom":"auto|<number>|<percentage>","min-height":"<viewport-length>","min-width":"<viewport-length>","min-zoom":"auto|<number>|<percentage>",orientation:"auto|portrait|landscape","user-zoom":"zoom|fixed","viewport-fit":"auto|contain|cover",width:"<viewport-length>{1,2}",zoom:"auto|<number>|<percentage>"}}}},Rr=Ce.cmpChar,Mr=Ce.isDigit,jr=Ce.TYPE,_r=jr.WhiteSpace,Fr=jr.Comment,Wr=jr.Ident,qr=jr.Number,Yr=jr.Dimension;function Ur(e,t){var n=this.scanner.tokenStart+e,r=this.scanner.source.charCodeAt(n);for(43!==r&&45!==r||(t&&this.error("Number sign is not allowed"),n++);n<this.scanner.tokenEnd;n++)Mr(this.scanner.source.charCodeAt(n))||this.error("Integer is expected",n)}function Hr(e){return Ur.call(this,0,e)}function Vr(e,t){if(!Rr(this.scanner.source,this.scanner.tokenStart+e,t)){var n="";switch(t){case 110:n="N is expected";break;case 45:n="HyphenMinus is expected"}this.error(n,this.scanner.tokenStart+e)}}function Kr(){for(var e=0,t=0,n=this.scanner.tokenType;n===_r||n===Fr;)n=this.scanner.lookupType(++e);if(n!==qr){if(!this.scanner.isDelim(43,e)&&!this.scanner.isDelim(45,e))return null;t=this.scanner.isDelim(43,e)?43:45;do{n=this.scanner.lookupType(++e)}while(n===_r||n===Fr);n!==qr&&(this.scanner.skip(e),Hr.call(this,!0))}return e>0&&this.scanner.skip(e),0===t&&43!==(n=this.scanner.source.charCodeAt(this.scanner.tokenStart))&&45!==n&&this.error("Number sign is expected"),Hr.call(this,0!==t),45===t?"-"+this.consume(qr):this.consume(qr)}var Gr={name:"AnPlusB",structure:{a:[String,null],b:[String,null]},parse:function(){var e=this.scanner.tokenStart,t=null,n=null;if(this.scanner.tokenType===qr)Hr.call(this,!1),n=this.consume(qr);else if(this.scanner.tokenType===Wr&&Rr(this.scanner.source,this.scanner.tokenStart,45))switch(t="-1",Vr.call(this,1,110),this.scanner.getTokenLength()){case 2:this.scanner.next(),n=Kr.call(this);break;case 3:Vr.call(this,2,45),this.scanner.next(),this.scanner.skipSC(),Hr.call(this,!0),n="-"+this.consume(qr);break;default:Vr.call(this,2,45),Ur.call(this,3,!0),this.scanner.next(),n=this.scanner.substrToCursor(e+2)}else if(this.scanner.tokenType===Wr||this.scanner.isDelim(43)&&this.scanner.lookupType(1)===Wr){var r=0;switch(t="1",this.scanner.isDelim(43)&&(r=1,this.scanner.next()),Vr.call(this,0,110),this.scanner.getTokenLength()){case 1:this.scanner.next(),n=Kr.call(this);break;case 2:Vr.call(this,1,45),this.scanner.next(),this.scanner.skipSC(),Hr.call(this,!0),n="-"+this.consume(qr);break;default:Vr.call(this,1,45),Ur.call(this,2,!0),this.scanner.next(),n=this.scanner.substrToCursor(e+r+1)}}else if(this.scanner.tokenType===Yr){for(var i=this.scanner.source.charCodeAt(this.scanner.tokenStart),a=(r=43===i||45===i,this.scanner.tokenStart+r);a<this.scanner.tokenEnd&&Mr(this.scanner.source.charCodeAt(a));a++);a===this.scanner.tokenStart+r&&this.error("Integer is expected",this.scanner.tokenStart+r),Vr.call(this,a-this.scanner.tokenStart,110),t=this.scanner.source.substring(e,a),a+1===this.scanner.tokenEnd?(this.scanner.next(),n=Kr.call(this)):(Vr.call(this,a-this.scanner.tokenStart+1,45),a+2===this.scanner.tokenEnd?(this.scanner.next(),this.scanner.skipSC(),Hr.call(this,!0),n="-"+this.consume(qr)):(Ur.call(this,a-this.scanner.tokenStart+2,!0),this.scanner.next(),n=this.scanner.substrToCursor(a+1)))}else this.error();return null!==t&&43===t.charCodeAt(0)&&(t=t.substr(1)),null!==n&&43===n.charCodeAt(0)&&(n=n.substr(1)),{type:"AnPlusB",loc:this.getLocation(e,this.scanner.tokenStart),a:t,b:n}},generate:function(e){var t=null!==e.a&&void 0!==e.a,n=null!==e.b&&void 0!==e.b;t?(this.chunk("+1"===e.a?"+n":"1"===e.a?"n":"-1"===e.a?"-n":e.a+"n"),n&&("-"===(n=String(e.b)).charAt(0)||"+"===n.charAt(0)?(this.chunk(n.charAt(0)),this.chunk(n.substr(1))):(this.chunk("+"),this.chunk(n)))):this.chunk(String(e.b))}},Qr=Ce.TYPE,Xr=Qr.WhiteSpace,Zr=Qr.Semicolon,$r=Qr.LeftCurlyBracket,Jr=Qr.Delim;function ei(){return this.scanner.tokenIndex>0&&this.scanner.lookupType(-1)===Xr?this.scanner.tokenIndex>1?this.scanner.getTokenStart(this.scanner.tokenIndex-1):this.scanner.firstCharOffset:this.scanner.tokenStart}function ti(){return 0}var ni={name:"Raw",structure:{value:String},parse:function(e,t,n){var r,i=this.scanner.getTokenStart(e);return this.scanner.skip(this.scanner.getRawLength(e,t||ti)),r=n&&this.scanner.tokenStart>i?ei.call(this):this.scanner.tokenStart,{type:"Raw",loc:this.getLocation(i,r),value:this.scanner.source.substring(i,r)}},generate:function(e){this.chunk(e.value)},mode:{default:ti,leftCurlyBracket:function(e){return e===$r?1:0},leftCurlyBracketOrSemicolon:function(e){return e===$r||e===Zr?1:0},exclamationMarkOrSemicolon:function(e,t,n){return e===Jr&&33===t.charCodeAt(n)||e===Zr?1:0},semicolonIncluded:function(e){return e===Zr?2:0}}},ri=Ce.TYPE,ii=ni.mode,ai=ri.AtKeyword,oi=ri.Semicolon,si=ri.LeftCurlyBracket,li=ri.RightCurlyBracket;function ci(e){return this.Raw(e,ii.leftCurlyBracketOrSemicolon,!0)}function ui(){for(var e,t=1;e=this.scanner.lookupType(t);t++){if(e===li)return!0;if(e===si||e===ai)return!1}return!1}var hi={name:"Atrule",structure:{name:String,prelude:["AtrulePrelude","Raw",null],block:["Block",null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null,i=null;switch(this.eat(ai),t=(e=this.scanner.substrToCursor(n+1)).toLowerCase(),this.scanner.skipSC(),!1===this.scanner.eof&&this.scanner.tokenType!==si&&this.scanner.tokenType!==oi&&(this.parseAtrulePrelude?"AtrulePrelude"===(r=this.parseWithFallback(this.AtrulePrelude.bind(this,e),ci)).type&&null===r.children.head&&(r=null):r=ci.call(this,this.scanner.tokenIndex),this.scanner.skipSC()),this.scanner.tokenType){case oi:this.scanner.next();break;case si:i=this.atrule.hasOwnProperty(t)&&"function"==typeof this.atrule[t].block?this.atrule[t].block.call(this):this.Block(ui.call(this))}return{type:"Atrule",loc:this.getLocation(n,this.scanner.tokenStart),name:e,prelude:r,block:i}},generate:function(e){this.chunk("@"),this.chunk(e.name),null!==e.prelude&&(this.chunk(" "),this.node(e.prelude)),e.block?this.node(e.block):this.chunk(";")},walkContext:"atrule"},pi=Ce.TYPE,di=pi.Semicolon,mi=pi.LeftCurlyBracket,gi={name:"AtrulePrelude",structure:{children:[[]]},parse:function(e){var t=null;return null!==e&&(e=e.toLowerCase()),this.scanner.skipSC(),t=this.atrule.hasOwnProperty(e)&&"function"==typeof this.atrule[e].prelude?this.atrule[e].prelude.call(this):this.readSequence(this.scope.AtrulePrelude),this.scanner.skipSC(),!0!==this.scanner.eof&&this.scanner.tokenType!==mi&&this.scanner.tokenType!==di&&this.error("Semicolon or block is expected"),null===t&&(t=this.createList()),{type:"AtrulePrelude",loc:this.getLocationFromList(t),children:t}},generate:function(e){this.children(e)},walkContext:"atrulePrelude"},fi=Ce.TYPE,bi=fi.Ident,yi=fi.String,ki=fi.Colon,vi=fi.LeftSquareBracket,xi=fi.RightSquareBracket;function wi(){this.scanner.eof&&this.error("Unexpected end of input");var e=this.scanner.tokenStart,t=!1,n=!0;return this.scanner.isDelim(42)?(t=!0,n=!1,this.scanner.next()):this.scanner.isDelim(124)||this.eat(bi),this.scanner.isDelim(124)?61!==this.scanner.source.charCodeAt(this.scanner.tokenStart+1)?(this.scanner.next(),this.eat(bi)):t&&this.error("Identifier is expected",this.scanner.tokenEnd):t&&this.error("Vertical line is expected"),n&&this.scanner.tokenType===ki&&(this.scanner.next(),this.eat(bi)),{type:"Identifier",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}}function Si(){var e=this.scanner.tokenStart,t=this.scanner.source.charCodeAt(e);return 61!==t&&126!==t&&94!==t&&36!==t&&42!==t&&124!==t&&this.error("Attribute selector (=, ~=, ^=, $=, *=, |=) is expected"),this.scanner.next(),61!==t&&(this.scanner.isDelim(61)||this.error("Equal sign is expected"),this.scanner.next()),this.scanner.substrToCursor(e)}var Ci={name:"AttributeSelector",structure:{name:"Identifier",matcher:[String,null],value:["String","Identifier",null],flags:[String,null]},parse:function(){var e,t=this.scanner.tokenStart,n=null,r=null,i=null;return this.eat(vi),this.scanner.skipSC(),e=wi.call(this),this.scanner.skipSC(),this.scanner.tokenType!==xi&&(this.scanner.tokenType!==bi&&(n=Si.call(this),this.scanner.skipSC(),r=this.scanner.tokenType===yi?this.String():this.Identifier(),this.scanner.skipSC()),this.scanner.tokenType===bi&&(i=this.scanner.getTokenValue(),this.scanner.next(),this.scanner.skipSC())),this.eat(xi),{type:"AttributeSelector",loc:this.getLocation(t,this.scanner.tokenStart),name:e,matcher:n,value:r,flags:i}},generate:function(e){var t=" ";this.chunk("["),this.node(e.name),null!==e.matcher&&(this.chunk(e.matcher),null!==e.value&&(this.node(e.value),"String"===e.value.type&&(t=""))),null!==e.flags&&(this.chunk(t),this.chunk(e.flags)),this.chunk("]")}},zi=Ce.TYPE,Ai=ni.mode,Pi=zi.WhiteSpace,Ti=zi.Comment,Li=zi.Semicolon,Ei=zi.AtKeyword,Di=zi.LeftCurlyBracket,Oi=zi.RightCurlyBracket;function Bi(e){return this.Raw(e,null,!0)}function Ii(){return this.parseWithFallback(this.Rule,Bi)}function Ni(e){return this.Raw(e,Ai.semicolonIncluded,!0)}function Ri(){if(this.scanner.tokenType===Li)return Ni.call(this,this.scanner.tokenIndex);var e=this.parseWithFallback(this.Declaration,Ni);return this.scanner.tokenType===Li&&this.scanner.next(),e}var Mi={name:"Block",structure:{children:[["Atrule","Rule","Declaration"]]},parse:function(e){var t=e?Ri:Ii,n=this.scanner.tokenStart,r=this.createList();this.eat(Di);e:for(;!this.scanner.eof;)switch(this.scanner.tokenType){case Oi:break e;case Pi:case Ti:this.scanner.next();break;case Ei:r.push(this.parseWithFallback(this.Atrule,Bi));break;default:r.push(t.call(this))}return this.scanner.eof||this.eat(Oi),{type:"Block",loc:this.getLocation(n,this.scanner.tokenStart),children:r}},generate:function(e){this.chunk("{"),this.children(e,(function(e){"Declaration"===e.type&&this.chunk(";")})),this.chunk("}")},walkContext:"block"},ji=Ce.TYPE,_i=ji.LeftSquareBracket,Fi=ji.RightSquareBracket,Wi={name:"Brackets",structure:{children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart;return this.eat(_i),n=e.call(this,t),this.scanner.eof||this.eat(Fi),{type:"Brackets",loc:this.getLocation(r,this.scanner.tokenStart),children:n}},generate:function(e){this.chunk("["),this.children(e),this.chunk("]")}},qi=Ce.TYPE.CDC,Yi={name:"CDC",structure:[],parse:function(){var e=this.scanner.tokenStart;return this.eat(qi),{type:"CDC",loc:this.getLocation(e,this.scanner.tokenStart)}},generate:function(){this.chunk("--\x3e")}},Ui=Ce.TYPE.CDO,Hi={name:"CDO",structure:[],parse:function(){var e=this.scanner.tokenStart;return this.eat(Ui),{type:"CDO",loc:this.getLocation(e,this.scanner.tokenStart)}},generate:function(){this.chunk("\x3c!--")}},Vi=Ce.TYPE.Ident,Ki={name:"ClassSelector",structure:{name:String},parse:function(){return this.scanner.isDelim(46)||this.error("Full stop is expected"),this.scanner.next(),{type:"ClassSelector",loc:this.getLocation(this.scanner.tokenStart-1,this.scanner.tokenEnd),name:this.consume(Vi)}},generate:function(e){this.chunk("."),this.chunk(e.name)}},Gi=Ce.TYPE.Ident,Qi={name:"Combinator",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 62:case 43:case 126:this.scanner.next();break;case 47:this.scanner.next(),this.scanner.tokenType===Gi&&!1!==this.scanner.lookupValue(0,"deep")||this.error("Identifier `deep` is expected"),this.scanner.next(),this.scanner.isDelim(47)||this.error("Solidus is expected"),this.scanner.next();break;default:this.error("Combinator is expected")}return{type:"Combinator",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.name)}},Xi=Ce.TYPE.Comment,Zi={name:"Comment",structure:{value:String},parse:function(){var e=this.scanner.tokenStart,t=this.scanner.tokenEnd;return this.eat(Xi),t-e+2>=2&&42===this.scanner.source.charCodeAt(t-2)&&47===this.scanner.source.charCodeAt(t-1)&&(t-=2),{type:"Comment",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e+2,t)}},generate:function(e){this.chunk("/*"),this.chunk(e.value),this.chunk("*/")}},$i=ae.isCustomProperty,Ji=Ce.TYPE,ea=ni.mode,ta=Ji.Ident,na=Ji.Hash,ra=Ji.Colon,ia=Ji.Semicolon,aa=Ji.Delim,oa=Ji.WhiteSpace;function sa(e){return this.Raw(e,ea.exclamationMarkOrSemicolon,!0)}function la(e){return this.Raw(e,ea.exclamationMarkOrSemicolon,!1)}function ca(){var e=this.scanner.tokenIndex,t=this.Value();return"Raw"!==t.type&&!1===this.scanner.eof&&this.scanner.tokenType!==ia&&!1===this.scanner.isDelim(33)&&!1===this.scanner.isBalanceEdge(e)&&this.error(),t}var ua={name:"Declaration",structure:{important:[Boolean,String],property:String,value:["Value","Raw"]},parse:function(){var e,t=this.scanner.tokenStart,n=this.scanner.tokenIndex,r=ha.call(this),i=$i(r),a=i?this.parseCustomProperty:this.parseValue,o=i?la:sa,s=!1;this.scanner.skipSC(),this.eat(ra);const l=this.scanner.tokenIndex;if(i||this.scanner.skipSC(),e=a?this.parseWithFallback(ca,o):o.call(this,this.scanner.tokenIndex),i&&"Value"===e.type&&e.children.isEmpty())for(let t=l-this.scanner.tokenIndex;t<=0;t++)if(this.scanner.lookupType(t)===oa){e.children.appendData({type:"WhiteSpace",loc:null,value:" "});break}return this.scanner.isDelim(33)&&(s=pa.call(this),this.scanner.skipSC()),!1===this.scanner.eof&&this.scanner.tokenType!==ia&&!1===this.scanner.isBalanceEdge(n)&&this.error(),{type:"Declaration",loc:this.getLocation(t,this.scanner.tokenStart),important:s,property:r,value:e}},generate:function(e){this.chunk(e.property),this.chunk(":"),this.node(e.value),e.important&&this.chunk(!0===e.important?"!important":"!"+e.important)},walkContext:"declaration"};function ha(){var e=this.scanner.tokenStart;if(this.scanner.tokenType===aa)switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 42:case 36:case 43:case 35:case 38:this.scanner.next();break;case 47:this.scanner.next(),this.scanner.isDelim(47)&&this.scanner.next()}return this.scanner.tokenType===na?this.eat(na):this.eat(ta),this.scanner.substrToCursor(e)}function pa(){this.eat(aa),this.scanner.skipSC();var e=this.consume(ta);return"important"===e||e}var da=Ce.TYPE,ma=ni.mode,ga=da.WhiteSpace,fa=da.Comment,ba=da.Semicolon;function ya(e){return this.Raw(e,ma.semicolonIncluded,!0)}var ka={name:"DeclarationList",structure:{children:[["Declaration"]]},parse:function(){for(var e=this.createList();!this.scanner.eof;)switch(this.scanner.tokenType){case ga:case fa:case ba:this.scanner.next();break;default:e.push(this.parseWithFallback(this.Declaration,ya))}return{type:"DeclarationList",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e,(function(e){"Declaration"===e.type&&this.chunk(";")}))}},va=M.consumeNumber,xa=Ce.TYPE.Dimension,wa={name:"Dimension",structure:{value:String,unit:String},parse:function(){var e=this.scanner.tokenStart,t=va(this.scanner.source,e);return this.eat(xa),{type:"Dimension",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e,t),unit:this.scanner.source.substring(t,this.scanner.tokenStart)}},generate:function(e){this.chunk(e.value),this.chunk(e.unit)}},Sa=Ce.TYPE.RightParenthesis,Ca={name:"Function",structure:{name:String,children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart,i=this.consumeFunctionName(),a=i.toLowerCase();return n=t.hasOwnProperty(a)?t[a].call(this,t):e.call(this,t),this.scanner.eof||this.eat(Sa),{type:"Function",loc:this.getLocation(r,this.scanner.tokenStart),name:i,children:n}},generate:function(e){this.chunk(e.name),this.chunk("("),this.children(e),this.chunk(")")},walkContext:"function"},za=Ce.TYPE.Hash,Aa={name:"Hash",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return this.eat(za),{type:"Hash",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e+1)}},generate:function(e){this.chunk("#"),this.chunk(e.value)}},Pa=Ce.TYPE.Ident,Ta={name:"Identifier",structure:{name:String},parse:function(){return{type:"Identifier",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),name:this.consume(Pa)}},generate:function(e){this.chunk(e.name)}},La=Ce.TYPE.Hash,Ea={name:"IdSelector",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;return this.eat(La),{type:"IdSelector",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e+1)}},generate:function(e){this.chunk("#"),this.chunk(e.name)}},Da=Ce.TYPE,Oa=Da.Ident,Ba=Da.Number,Ia=Da.Dimension,Na=Da.LeftParenthesis,Ra=Da.RightParenthesis,Ma=Da.Colon,ja=Da.Delim,_a={name:"MediaFeature",structure:{name:String,value:["Identifier","Number","Dimension","Ratio",null]},parse:function(){var e,t=this.scanner.tokenStart,n=null;if(this.eat(Na),this.scanner.skipSC(),e=this.consume(Oa),this.scanner.skipSC(),this.scanner.tokenType!==Ra){switch(this.eat(Ma),this.scanner.skipSC(),this.scanner.tokenType){case Ba:n=this.lookupNonWSType(1)===ja?this.Ratio():this.Number();break;case Ia:n=this.Dimension();break;case Oa:n=this.Identifier();break;default:this.error("Number, dimension, ratio or identifier is expected")}this.scanner.skipSC()}return this.eat(Ra),{type:"MediaFeature",loc:this.getLocation(t,this.scanner.tokenStart),name:e,value:n}},generate:function(e){this.chunk("("),this.chunk(e.name),null!==e.value&&(this.chunk(":"),this.node(e.value)),this.chunk(")")}},Fa=Ce.TYPE,Wa=Fa.WhiteSpace,qa=Fa.Comment,Ya=Fa.Ident,Ua=Fa.LeftParenthesis,Ha={name:"MediaQuery",structure:{children:[["Identifier","MediaFeature","WhiteSpace"]]},parse:function(){this.scanner.skipSC();var e=this.createList(),t=null,n=null;e:for(;!this.scanner.eof;){switch(this.scanner.tokenType){case qa:this.scanner.next();continue;case Wa:n=this.WhiteSpace();continue;case Ya:t=this.Identifier();break;case Ua:t=this.MediaFeature();break;default:break e}null!==n&&(e.push(n),n=null),e.push(t)}return null===t&&this.error("Identifier or parenthesis is expected"),{type:"MediaQuery",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e)}},Va=Ce.TYPE.Comma,Ka={name:"MediaQueryList",structure:{children:[["MediaQuery"]]},parse:function(e){var t=this.createList();for(this.scanner.skipSC();!this.scanner.eof&&(t.push(this.MediaQuery(e)),this.scanner.tokenType===Va);)this.scanner.next();return{type:"MediaQueryList",loc:this.getLocationFromList(t),children:t}},generate:function(e){this.children(e,(function(){this.chunk(",")}))}},Ga=Ce.TYPE.Number,Qa={name:"Number",structure:{value:String},parse:function(){return{type:"Number",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),value:this.consume(Ga)}},generate:function(e){this.chunk(e.value)}},Xa={name:"Operator",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return this.scanner.next(),{type:"Operator",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.value)}},Za=Ce.TYPE,$a=Za.LeftParenthesis,Ja=Za.RightParenthesis,eo={name:"Parentheses",structure:{children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart;return this.eat($a),n=e.call(this,t),this.scanner.eof||this.eat(Ja),{type:"Parentheses",loc:this.getLocation(r,this.scanner.tokenStart),children:n}},generate:function(e){this.chunk("("),this.children(e),this.chunk(")")}},to=M.consumeNumber,no=Ce.TYPE.Percentage,ro={name:"Percentage",structure:{value:String},parse:function(){var e=this.scanner.tokenStart,t=to(this.scanner.source,e);return this.eat(no),{type:"Percentage",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e,t)}},generate:function(e){this.chunk(e.value),this.chunk("%")}},io=Ce.TYPE,ao=io.Ident,oo=io.Function,so=io.Colon,lo=io.RightParenthesis,co={name:"PseudoClassSelector",structure:{name:String,children:[["Raw"],null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null;return this.eat(so),this.scanner.tokenType===oo?(t=(e=this.consumeFunctionName()).toLowerCase(),this.pseudo.hasOwnProperty(t)?(this.scanner.skipSC(),r=this.pseudo[t].call(this),this.scanner.skipSC()):(r=this.createList()).push(this.Raw(this.scanner.tokenIndex,null,!1)),this.eat(lo)):e=this.consume(ao),{type:"PseudoClassSelector",loc:this.getLocation(n,this.scanner.tokenStart),name:e,children:r}},generate:function(e){this.chunk(":"),this.chunk(e.name),null!==e.children&&(this.chunk("("),this.children(e),this.chunk(")"))},walkContext:"function"},uo=Ce.TYPE,ho=uo.Ident,po=uo.Function,mo=uo.Colon,go=uo.RightParenthesis,fo={name:"PseudoElementSelector",structure:{name:String,children:[["Raw"],null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null;return this.eat(mo),this.eat(mo),this.scanner.tokenType===po?(t=(e=this.consumeFunctionName()).toLowerCase(),this.pseudo.hasOwnProperty(t)?(this.scanner.skipSC(),r=this.pseudo[t].call(this),this.scanner.skipSC()):(r=this.createList()).push(this.Raw(this.scanner.tokenIndex,null,!1)),this.eat(go)):e=this.consume(ho),{type:"PseudoElementSelector",loc:this.getLocation(n,this.scanner.tokenStart),name:e,children:r}},generate:function(e){this.chunk("::"),this.chunk(e.name),null!==e.children&&(this.chunk("("),this.children(e),this.chunk(")"))},walkContext:"function"},bo=Ce.isDigit,yo=Ce.TYPE,ko=yo.Number,vo=yo.Delim;function xo(){this.scanner.skipWS();for(var e=this.consume(ko),t=0;t<e.length;t++){var n=e.charCodeAt(t);bo(n)||46===n||this.error("Unsigned number is expected",this.scanner.tokenStart-e.length+t)}return 0===Number(e)&&this.error("Zero number is not allowed",this.scanner.tokenStart-e.length),e}var wo={name:"Ratio",structure:{left:String,right:String},parse:function(){var e,t=this.scanner.tokenStart,n=xo.call(this);return this.scanner.skipWS(),this.scanner.isDelim(47)||this.error("Solidus is expected"),this.eat(vo),e=xo.call(this),{type:"Ratio",loc:this.getLocation(t,this.scanner.tokenStart),left:n,right:e}},generate:function(e){this.chunk(e.left),this.chunk("/"),this.chunk(e.right)}},So=Ce.TYPE,Co=ni.mode,zo=So.LeftCurlyBracket;function Ao(e){return this.Raw(e,Co.leftCurlyBracket,!0)}function Po(){var e=this.SelectorList();return"Raw"!==e.type&&!1===this.scanner.eof&&this.scanner.tokenType!==zo&&this.error(),e}var To={name:"Rule",structure:{prelude:["SelectorList","Raw"],block:["Block"]},parse:function(){var e,t,n=this.scanner.tokenIndex,r=this.scanner.tokenStart;return e=this.parseRulePrelude?this.parseWithFallback(Po,Ao):Ao.call(this,n),t=this.Block(!0),{type:"Rule",loc:this.getLocation(r,this.scanner.tokenStart),prelude:e,block:t}},generate:function(e){this.node(e.prelude),this.node(e.block)},walkContext:"rule"},Lo=Ce.TYPE.Comma,Eo={name:"SelectorList",structure:{children:[["Selector","Raw"]]},parse:function(){for(var e=this.createList();!this.scanner.eof&&(e.push(this.Selector()),this.scanner.tokenType===Lo);)this.scanner.next();return{type:"SelectorList",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e,(function(){this.chunk(",")}))},walkContext:"selector"},Do=Ce.TYPE.String,Oo={name:"String",structure:{value:String},parse:function(){return{type:"String",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),value:this.consume(Do)}},generate:function(e){this.chunk(e.value)}},Bo=Ce.TYPE,Io=Bo.WhiteSpace,No=Bo.Comment,Ro=Bo.AtKeyword,Mo=Bo.CDO,jo=Bo.CDC;function _o(e){return this.Raw(e,null,!1)}var Fo={name:"StyleSheet",structure:{children:[["Comment","CDO","CDC","Atrule","Rule","Raw"]]},parse:function(){for(var e,t=this.scanner.tokenStart,n=this.createList();!this.scanner.eof;){switch(this.scanner.tokenType){case Io:this.scanner.next();continue;case No:if(33!==this.scanner.source.charCodeAt(this.scanner.tokenStart+2)){this.scanner.next();continue}e=this.Comment();break;case Mo:e=this.CDO();break;case jo:e=this.CDC();break;case Ro:e=this.parseWithFallback(this.Atrule,_o);break;default:e=this.parseWithFallback(this.Rule,_o)}n.push(e)}return{type:"StyleSheet",loc:this.getLocation(t,this.scanner.tokenStart),children:n}},generate:function(e){this.children(e)},walkContext:"stylesheet"},Wo=Ce.TYPE.Ident;function qo(){this.scanner.tokenType!==Wo&&!1===this.scanner.isDelim(42)&&this.error("Identifier or asterisk is expected"),this.scanner.next()}var Yo={name:"TypeSelector",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;return this.scanner.isDelim(124)?(this.scanner.next(),qo.call(this)):(qo.call(this),this.scanner.isDelim(124)&&(this.scanner.next(),qo.call(this))),{type:"TypeSelector",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.name)}},Uo=Ce.isHexDigit,Ho=Ce.cmpChar,Vo=Ce.TYPE,Ko=Ce.NAME,Go=Vo.Ident,Qo=Vo.Number,Xo=Vo.Dimension;function Zo(e,t){for(var n=this.scanner.tokenStart+e,r=0;n<this.scanner.tokenEnd;n++){var i=this.scanner.source.charCodeAt(n);if(45===i&&t&&0!==r)return 0===Zo.call(this,e+r+1,!1)&&this.error(),-1;Uo(i)||this.error(t&&0!==r?"HyphenMinus"+(r<6?" or hex digit":"")+" is expected":r<6?"Hex digit is expected":"Unexpected input",n),++r>6&&this.error("Too many hex digits",n)}return this.scanner.next(),r}function $o(e){for(var t=0;this.scanner.isDelim(63);)++t>e&&this.error("Too many question marks"),this.scanner.next()}function Jo(e){this.scanner.source.charCodeAt(this.scanner.tokenStart)!==e&&this.error(Ko[e]+" is expected")}function es(){var e=0;return this.scanner.isDelim(43)?(this.scanner.next(),this.scanner.tokenType===Go?void((e=Zo.call(this,0,!0))>0&&$o.call(this,6-e)):this.scanner.isDelim(63)?(this.scanner.next(),void $o.call(this,5)):void this.error("Hex digit or question mark is expected")):this.scanner.tokenType===Qo?(Jo.call(this,43),e=Zo.call(this,1,!0),this.scanner.isDelim(63)?void $o.call(this,6-e):this.scanner.tokenType===Xo||this.scanner.tokenType===Qo?(Jo.call(this,45),void Zo.call(this,1,!1)):void 0):this.scanner.tokenType===Xo?(Jo.call(this,43),void((e=Zo.call(this,1,!0))>0&&$o.call(this,6-e))):void this.error()}var ts={name:"UnicodeRange",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return Ho(this.scanner.source,e,117)||this.error("U is expected"),Ho(this.scanner.source,e+1,43)||this.error("Plus sign is expected"),this.scanner.next(),es.call(this),{type:"UnicodeRange",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.value)}},ns=Ce.isWhiteSpace,rs=Ce.cmpStr,is=Ce.TYPE,as=is.Function,os=is.Url,ss=is.RightParenthesis,ls={name:"Url",structure:{value:["String","Raw"]},parse:function(){var e,t=this.scanner.tokenStart;switch(this.scanner.tokenType){case os:for(var n=t+4,r=this.scanner.tokenEnd-1;n<r&&ns(this.scanner.source.charCodeAt(n));)n++;for(;n<r&&ns(this.scanner.source.charCodeAt(r-1));)r--;e={type:"Raw",loc:this.getLocation(n,r),value:this.scanner.source.substring(n,r)},this.eat(os);break;case as:rs(this.scanner.source,this.scanner.tokenStart,this.scanner.tokenEnd,"url(")||this.error("Function name must be `url`"),this.eat(as),this.scanner.skipSC(),e=this.String(),this.scanner.skipSC(),this.eat(ss);break;default:this.error("Url or Function is expected")}return{type:"Url",loc:this.getLocation(t,this.scanner.tokenStart),value:e}},generate:function(e){this.chunk("url"),this.chunk("("),this.node(e.value),this.chunk(")")}},cs=Ce.TYPE.WhiteSpace,us=Object.freeze({type:"WhiteSpace",loc:null,value:" "}),hs={AnPlusB:Gr,Atrule:hi,AtrulePrelude:gi,AttributeSelector:Ci,Block:Mi,Brackets:Wi,CDC:Yi,CDO:Hi,ClassSelector:Ki,Combinator:Qi,Comment:Zi,Declaration:ua,DeclarationList:ka,Dimension:wa,Function:Ca,Hash:Aa,Identifier:Ta,IdSelector:Ea,MediaFeature:_a,MediaQuery:Ha,MediaQueryList:Ka,Nth:{name:"Nth",structure:{nth:["AnPlusB","Identifier"],selector:["SelectorList",null]},parse:function(e){this.scanner.skipSC();var t,n=this.scanner.tokenStart,r=n,i=null;return t=this.scanner.lookupValue(0,"odd")||this.scanner.lookupValue(0,"even")?this.Identifier():this.AnPlusB(),this.scanner.skipSC(),e&&this.scanner.lookupValue(0,"of")?(this.scanner.next(),i=this.SelectorList(),this.needPositions&&(r=this.getLastListNode(i.children).loc.end.offset)):this.needPositions&&(r=t.loc.end.offset),{type:"Nth",loc:this.getLocation(n,r),nth:t,selector:i}},generate:function(e){this.node(e.nth),null!==e.selector&&(this.chunk(" of "),this.node(e.selector))}},Number:Qa,Operator:Xa,Parentheses:eo,Percentage:ro,PseudoClassSelector:co,PseudoElementSelector:fo,Ratio:wo,Raw:ni,Rule:To,Selector:{name:"Selector",structure:{children:[["TypeSelector","IdSelector","ClassSelector","AttributeSelector","PseudoClassSelector","PseudoElementSelector","Combinator","WhiteSpace"]]},parse:function(){var e=this.readSequence(this.scope.Selector);return null===this.getFirstListNode(e)&&this.error("Selector is expected"),{type:"Selector",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e)}},SelectorList:Eo,String:Oo,StyleSheet:Fo,TypeSelector:Yo,UnicodeRange:ts,Url:ls,Value:{name:"Value",structure:{children:[[]]},parse:function(){var e=this.scanner.tokenStart,t=this.readSequence(this.scope.Value);return{type:"Value",loc:this.getLocation(e,this.scanner.tokenStart),children:t}},generate:function(e){this.children(e)}},WhiteSpace:{name:"WhiteSpace",structure:{value:String},parse:function(){return this.eat(cs),us},generate:function(e){this.chunk(e.value)}}},ps={generic:!0,types:Nr.types,atrules:Nr.atrules,properties:Nr.properties,node:hs},ds=Ce.cmpChar,ms=Ce.cmpStr,gs=Ce.TYPE,fs=gs.Ident,bs=gs.String,ys=gs.Number,ks=gs.Function,vs=gs.Url,xs=gs.Hash,ws=gs.Dimension,Ss=gs.Percentage,Cs=gs.LeftParenthesis,zs=gs.LeftSquareBracket,As=gs.Comma,Ps=gs.Delim,Ts=function(e){switch(this.scanner.tokenType){case xs:return this.Hash();case As:return e.space=null,e.ignoreWSAfter=!0,this.Operator();case Cs:return this.Parentheses(this.readSequence,e.recognizer);case zs:return this.Brackets(this.readSequence,e.recognizer);case bs:return this.String();case ws:return this.Dimension();case Ss:return this.Percentage();case ys:return this.Number();case ks:return ms(this.scanner.source,this.scanner.tokenStart,this.scanner.tokenEnd,"url(")?this.Url():this.Function(this.readSequence,e.recognizer);case vs:return this.Url();case fs:return ds(this.scanner.source,this.scanner.tokenStart,117)&&ds(this.scanner.source,this.scanner.tokenStart+1,43)?this.UnicodeRange():this.Identifier();case Ps:var t=this.scanner.source.charCodeAt(this.scanner.tokenStart);if(47===t||42===t||43===t||45===t)return this.Operator();35===t&&this.error("Hex or identifier is expected",this.scanner.tokenStart+1)}},Ls={getNode:Ts},Es=Ce.TYPE,Ds=Es.Delim,Os=Es.Ident,Bs=Es.Dimension,Is=Es.Percentage,Ns=Es.Number,Rs=Es.Hash,Ms=Es.Colon,js=Es.LeftSquareBracket;var _s={getNode:function(e){switch(this.scanner.tokenType){case js:return this.AttributeSelector();case Rs:return this.IdSelector();case Ms:return this.scanner.lookupType(1)===Ms?this.PseudoElementSelector():this.PseudoClassSelector();case Os:return this.TypeSelector();case Ns:case Is:return this.Percentage();case Bs:46===this.scanner.source.charCodeAt(this.scanner.tokenStart)&&this.error("Identifier is expected",this.scanner.tokenStart+1);break;case Ds:switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 43:case 62:case 126:return e.space=null,e.ignoreWSAfter=!0,this.Combinator();case 47:return this.Combinator();case 46:return this.ClassSelector();case 42:case 124:return this.TypeSelector();case 35:return this.IdSelector()}}}},Fs=Ce.TYPE,Ws=ni.mode,qs=Fs.Comma,Ys=Fs.WhiteSpace,Us={AtrulePrelude:Ls,Selector:_s,Value:{getNode:Ts,expression:function(){return this.createSingleNodeList(this.Raw(this.scanner.tokenIndex,null,!1))},var:function(){var e=this.createList();if(this.scanner.skipSC(),e.push(this.Identifier()),this.scanner.skipSC(),this.scanner.tokenType===qs){e.push(this.Operator());const t=this.scanner.tokenIndex,n=this.parseCustomProperty?this.Value(null):this.Raw(this.scanner.tokenIndex,Ws.exclamationMarkOrSemicolon,!1);if("Value"===n.type&&n.children.isEmpty())for(let e=t-this.scanner.tokenIndex;e<=0;e++)if(this.scanner.lookupType(e)===Ys){n.children.appendData({type:"WhiteSpace",loc:null,value:" "});break}e.push(n)}return e}}},Hs=Ce.TYPE,Vs=Hs.String,Ks=Hs.Ident,Gs=Hs.Url,Qs=Hs.Function,Xs=Hs.LeftParenthesis,Zs={parse:{prelude:function(){var e=this.createList();switch(this.scanner.skipSC(),this.scanner.tokenType){case Vs:e.push(this.String());break;case Gs:case Qs:e.push(this.Url());break;default:this.error("String or url() is expected")}return this.lookupNonWSType(0)!==Ks&&this.lookupNonWSType(0)!==Xs||(e.push(this.WhiteSpace()),e.push(this.MediaQueryList())),e},block:null}},$s=Ce.TYPE,Js=$s.WhiteSpace,el=$s.Comment,tl=$s.Ident,nl=$s.Function,rl=$s.Colon,il=$s.LeftParenthesis;function al(){return this.createSingleNodeList(this.Raw(this.scanner.tokenIndex,null,!1))}function ol(){return this.scanner.skipSC(),this.scanner.tokenType===tl&&this.lookupNonWSType(1)===rl?this.createSingleNodeList(this.Declaration()):sl.call(this)}function sl(){var e,t=this.createList(),n=null;this.scanner.skipSC();e:for(;!this.scanner.eof;){switch(this.scanner.tokenType){case Js:n=this.WhiteSpace();continue;case el:this.scanner.next();continue;case nl:e=this.Function(al,this.scope.AtrulePrelude);break;case tl:e=this.Identifier();break;case il:e=this.Parentheses(ol,this.scope.AtrulePrelude);break;default:break e}null!==n&&(t.push(n),n=null),t.push(e)}return t}var ll,cl={parse:function(){return this.createSingleNodeList(this.SelectorList())}},ul={parse:function(){return this.createSingleNodeList(this.Nth(!0))}},hl={parse:function(){return this.createSingleNodeList(this.Nth(!1))}},pl={parseContext:{default:"StyleSheet",stylesheet:"StyleSheet",atrule:"Atrule",atrulePrelude:function(e){return this.AtrulePrelude(e.atrule?String(e.atrule):null)},mediaQueryList:"MediaQueryList",mediaQuery:"MediaQuery",rule:"Rule",selectorList:"SelectorList",selector:"Selector",block:function(){return this.Block(!0)},declarationList:"DeclarationList",declaration:"Declaration",value:"Value"},scope:Us,atrule:{"font-face":{parse:{prelude:null,block:function(){return this.Block(!0)}}},import:Zs,media:{parse:{prelude:function(){return this.createSingleNodeList(this.MediaQueryList())},block:function(){return this.Block(!1)}}},page:{parse:{prelude:function(){return this.createSingleNodeList(this.SelectorList())},block:function(){return this.Block(!0)}}},supports:{parse:{prelude:function(){var e=sl.call(this);return null===this.getFirstListNode(e)&&this.error("Condition is expected"),e},block:function(){return this.Block(!1)}}}},pseudo:{dir:{parse:function(){return this.createSingleNodeList(this.Identifier())}},has:{parse:function(){return this.createSingleNodeList(this.SelectorList())}},lang:{parse:function(){return this.createSingleNodeList(this.Identifier())}},matches:cl,not:cl,"nth-child":ul,"nth-last-child":ul,"nth-last-of-type":hl,"nth-of-type":hl,slotted:{parse:function(){return this.createSingleNodeList(this.Selector())}}},node:hs},dl={node:hs},ml={version:"1.1.3"},gl=(ll=Object.freeze({__proto__:null,version:"1.1.3",default:ml}))&&ll.default||ll;var fl=Ir(function(){for(var e={},t=0;t<arguments.length;t++){var n=arguments[t];for(var r in n)e[r]=n[r]}return e}(ps,pl,dl)),bl=gl.version;return fl.version=bl,fl}));
diff --git a/node_modules/css-tree/lib/common/List.js b/node_modules/css-tree/lib/common/List.js
new file mode 100644
index 0000000..5da834a
--- /dev/null
+++ b/node_modules/css-tree/lib/common/List.js
@@ -0,0 +1,576 @@
+//
+//                              list
+//                            ┌──────┐
+//             ┌──────────────┼─head │
+//             │              │ tail─┼──────────────┐
+//             │              └──────┘              │
+//             ▼                                    ▼
+//            item        item        item        item
+//          ┌──────┐    ┌──────┐    ┌──────┐    ┌──────┐
+//  null ◀──┼─prev │◀───┼─prev │◀───┼─prev │◀───┼─prev │
+//          │ next─┼───▶│ next─┼───▶│ next─┼───▶│ next─┼──▶ null
+//          ├──────┤    ├──────┤    ├──────┤    ├──────┤
+//          │ data │    │ data │    │ data │    │ data │
+//          └──────┘    └──────┘    └──────┘    └──────┘
+//
+
+function createItem(data) {
+    return {
+        prev: null,
+        next: null,
+        data: data
+    };
+}
+
+function allocateCursor(node, prev, next) {
+    var cursor;
+
+    if (cursors !== null) {
+        cursor = cursors;
+        cursors = cursors.cursor;
+        cursor.prev = prev;
+        cursor.next = next;
+        cursor.cursor = node.cursor;
+    } else {
+        cursor = {
+            prev: prev,
+            next: next,
+            cursor: node.cursor
+        };
+    }
+
+    node.cursor = cursor;
+
+    return cursor;
+}
+
+function releaseCursor(node) {
+    var cursor = node.cursor;
+
+    node.cursor = cursor.cursor;
+    cursor.prev = null;
+    cursor.next = null;
+    cursor.cursor = cursors;
+    cursors = cursor;
+}
+
+var cursors = null;
+var List = function() {
+    this.cursor = null;
+    this.head = null;
+    this.tail = null;
+};
+
+List.createItem = createItem;
+List.prototype.createItem = createItem;
+
+List.prototype.updateCursors = function(prevOld, prevNew, nextOld, nextNew) {
+    var cursor = this.cursor;
+
+    while (cursor !== null) {
+        if (cursor.prev === prevOld) {
+            cursor.prev = prevNew;
+        }
+
+        if (cursor.next === nextOld) {
+            cursor.next = nextNew;
+        }
+
+        cursor = cursor.cursor;
+    }
+};
+
+List.prototype.getSize = function() {
+    var size = 0;
+    var cursor = this.head;
+
+    while (cursor) {
+        size++;
+        cursor = cursor.next;
+    }
+
+    return size;
+};
+
+List.prototype.fromArray = function(array) {
+    var cursor = null;
+
+    this.head = null;
+
+    for (var i = 0; i < array.length; i++) {
+        var item = createItem(array[i]);
+
+        if (cursor !== null) {
+            cursor.next = item;
+        } else {
+            this.head = item;
+        }
+
+        item.prev = cursor;
+        cursor = item;
+    }
+
+    this.tail = cursor;
+
+    return this;
+};
+
+List.prototype.toArray = function() {
+    var cursor = this.head;
+    var result = [];
+
+    while (cursor) {
+        result.push(cursor.data);
+        cursor = cursor.next;
+    }
+
+    return result;
+};
+
+List.prototype.toJSON = List.prototype.toArray;
+
+List.prototype.isEmpty = function() {
+    return this.head === null;
+};
+
+List.prototype.first = function() {
+    return this.head && this.head.data;
+};
+
+List.prototype.last = function() {
+    return this.tail && this.tail.data;
+};
+
+List.prototype.each = function(fn, context) {
+    var item;
+
+    if (context === undefined) {
+        context = this;
+    }
+
+    // push cursor
+    var cursor = allocateCursor(this, null, this.head);
+
+    while (cursor.next !== null) {
+        item = cursor.next;
+        cursor.next = item.next;
+
+        fn.call(context, item.data, item, this);
+    }
+
+    // pop cursor
+    releaseCursor(this);
+};
+
+List.prototype.forEach = List.prototype.each;
+
+List.prototype.eachRight = function(fn, context) {
+    var item;
+
+    if (context === undefined) {
+        context = this;
+    }
+
+    // push cursor
+    var cursor = allocateCursor(this, this.tail, null);
+
+    while (cursor.prev !== null) {
+        item = cursor.prev;
+        cursor.prev = item.prev;
+
+        fn.call(context, item.data, item, this);
+    }
+
+    // pop cursor
+    releaseCursor(this);
+};
+
+List.prototype.forEachRight = List.prototype.eachRight;
+
+List.prototype.reduce = function(fn, initialValue, context) {
+    var item;
+
+    if (context === undefined) {
+        context = this;
+    }
+
+    // push cursor
+    var cursor = allocateCursor(this, null, this.head);
+    var acc = initialValue;
+
+    while (cursor.next !== null) {
+        item = cursor.next;
+        cursor.next = item.next;
+
+        acc = fn.call(context, acc, item.data, item, this);
+    }
+
+    // pop cursor
+    releaseCursor(this);
+
+    return acc;
+};
+
+List.prototype.reduceRight = function(fn, initialValue, context) {
+    var item;
+
+    if (context === undefined) {
+        context = this;
+    }
+
+    // push cursor
+    var cursor = allocateCursor(this, this.tail, null);
+    var acc = initialValue;
+
+    while (cursor.prev !== null) {
+        item = cursor.prev;
+        cursor.prev = item.prev;
+
+        acc = fn.call(context, acc, item.data, item, this);
+    }
+
+    // pop cursor
+    releaseCursor(this);
+
+    return acc;
+};
+
+List.prototype.nextUntil = function(start, fn, context) {
+    if (start === null) {
+        return;
+    }
+
+    var item;
+
+    if (context === undefined) {
+        context = this;
+    }
+
+    // push cursor
+    var cursor = allocateCursor(this, null, start);
+
+    while (cursor.next !== null) {
+        item = cursor.next;
+        cursor.next = item.next;
+
+        if (fn.call(context, item.data, item, this)) {
+            break;
+        }
+    }
+
+    // pop cursor
+    releaseCursor(this);
+};
+
+List.prototype.prevUntil = function(start, fn, context) {
+    if (start === null) {
+        return;
+    }
+
+    var item;
+
+    if (context === undefined) {
+        context = this;
+    }
+
+    // push cursor
+    var cursor = allocateCursor(this, start, null);
+
+    while (cursor.prev !== null) {
+        item = cursor.prev;
+        cursor.prev = item.prev;
+
+        if (fn.call(context, item.data, item, this)) {
+            break;
+        }
+    }
+
+    // pop cursor
+    releaseCursor(this);
+};
+
+List.prototype.some = function(fn, context) {
+    var cursor = this.head;
+
+    if (context === undefined) {
+        context = this;
+    }
+
+    while (cursor !== null) {
+        if (fn.call(context, cursor.data, cursor, this)) {
+            return true;
+        }
+
+        cursor = cursor.next;
+    }
+
+    return false;
+};
+
+List.prototype.map = function(fn, context) {
+    var result = new List();
+    var cursor = this.head;
+
+    if (context === undefined) {
+        context = this;
+    }
+
+    while (cursor !== null) {
+        result.appendData(fn.call(context, cursor.data, cursor, this));
+        cursor = cursor.next;
+    }
+
+    return result;
+};
+
+List.prototype.filter = function(fn, context) {
+    var result = new List();
+    var cursor = this.head;
+
+    if (context === undefined) {
+        context = this;
+    }
+
+    while (cursor !== null) {
+        if (fn.call(context, cursor.data, cursor, this)) {
+            result.appendData(cursor.data);
+        }
+        cursor = cursor.next;
+    }
+
+    return result;
+};
+
+List.prototype.clear = function() {
+    this.head = null;
+    this.tail = null;
+};
+
+List.prototype.copy = function() {
+    var result = new List();
+    var cursor = this.head;
+
+    while (cursor !== null) {
+        result.insert(createItem(cursor.data));
+        cursor = cursor.next;
+    }
+
+    return result;
+};
+
+List.prototype.prepend = function(item) {
+    //      head
+    //    ^
+    // item
+    this.updateCursors(null, item, this.head, item);
+
+    // insert to the beginning of the list
+    if (this.head !== null) {
+        // new item <- first item
+        this.head.prev = item;
+
+        // new item -> first item
+        item.next = this.head;
+    } else {
+        // if list has no head, then it also has no tail
+        // in this case tail points to the new item
+        this.tail = item;
+    }
+
+    // head always points to new item
+    this.head = item;
+
+    return this;
+};
+
+List.prototype.prependData = function(data) {
+    return this.prepend(createItem(data));
+};
+
+List.prototype.append = function(item) {
+    return this.insert(item);
+};
+
+List.prototype.appendData = function(data) {
+    return this.insert(createItem(data));
+};
+
+List.prototype.insert = function(item, before) {
+    if (before !== undefined && before !== null) {
+        // prev   before
+        //      ^
+        //     item
+        this.updateCursors(before.prev, item, before, item);
+
+        if (before.prev === null) {
+            // insert to the beginning of list
+            if (this.head !== before) {
+                throw new Error('before doesn\'t belong to list');
+            }
+
+            // since head points to before therefore list doesn't empty
+            // no need to check tail
+            this.head = item;
+            before.prev = item;
+            item.next = before;
+
+            this.updateCursors(null, item);
+        } else {
+
+            // insert between two items
+            before.prev.next = item;
+            item.prev = before.prev;
+
+            before.prev = item;
+            item.next = before;
+        }
+    } else {
+        // tail
+        //      ^
+        //      item
+        this.updateCursors(this.tail, item, null, item);
+
+        // insert to the ending of the list
+        if (this.tail !== null) {
+            // last item -> new item
+            this.tail.next = item;
+
+            // last item <- new item
+            item.prev = this.tail;
+        } else {
+            // if list has no tail, then it also has no head
+            // in this case head points to new item
+            this.head = item;
+        }
+
+        // tail always points to new item
+        this.tail = item;
+    }
+
+    return this;
+};
+
+List.prototype.insertData = function(data, before) {
+    return this.insert(createItem(data), before);
+};
+
+List.prototype.remove = function(item) {
+    //      item
+    //       ^
+    // prev     next
+    this.updateCursors(item, item.prev, item, item.next);
+
+    if (item.prev !== null) {
+        item.prev.next = item.next;
+    } else {
+        if (this.head !== item) {
+            throw new Error('item doesn\'t belong to list');
+        }
+
+        this.head = item.next;
+    }
+
+    if (item.next !== null) {
+        item.next.prev = item.prev;
+    } else {
+        if (this.tail !== item) {
+            throw new Error('item doesn\'t belong to list');
+        }
+
+        this.tail = item.prev;
+    }
+
+    item.prev = null;
+    item.next = null;
+
+    return item;
+};
+
+List.prototype.push = function(data) {
+    this.insert(createItem(data));
+};
+
+List.prototype.pop = function() {
+    if (this.tail !== null) {
+        return this.remove(this.tail);
+    }
+};
+
+List.prototype.unshift = function(data) {
+    this.prepend(createItem(data));
+};
+
+List.prototype.shift = function() {
+    if (this.head !== null) {
+        return this.remove(this.head);
+    }
+};
+
+List.prototype.prependList = function(list) {
+    return this.insertList(list, this.head);
+};
+
+List.prototype.appendList = function(list) {
+    return this.insertList(list);
+};
+
+List.prototype.insertList = function(list, before) {
+    // ignore empty lists
+    if (list.head === null) {
+        return this;
+    }
+
+    if (before !== undefined && before !== null) {
+        this.updateCursors(before.prev, list.tail, before, list.head);
+
+        // insert in the middle of dist list
+        if (before.prev !== null) {
+            // before.prev <-> list.head
+            before.prev.next = list.head;
+            list.head.prev = before.prev;
+        } else {
+            this.head = list.head;
+        }
+
+        before.prev = list.tail;
+        list.tail.next = before;
+    } else {
+        this.updateCursors(this.tail, list.tail, null, list.head);
+
+        // insert to end of the list
+        if (this.tail !== null) {
+            // if destination list has a tail, then it also has a head,
+            // but head doesn't change
+
+            // dest tail -> source head
+            this.tail.next = list.head;
+
+            // dest tail <- source head
+            list.head.prev = this.tail;
+        } else {
+            // if list has no a tail, then it also has no a head
+            // in this case points head to new item
+            this.head = list.head;
+        }
+
+        // tail always start point to new item
+        this.tail = list.tail;
+    }
+
+    list.head = null;
+    list.tail = null;
+
+    return this;
+};
+
+List.prototype.replace = function(oldItem, newItemOrList) {
+    if ('head' in newItemOrList) {
+        this.insertList(newItemOrList, oldItem);
+    } else {
+        this.insert(newItemOrList, oldItem);
+    }
+
+    this.remove(oldItem);
+};
+
+module.exports = List;
diff --git a/node_modules/css-tree/lib/common/OffsetToLocation.js b/node_modules/css-tree/lib/common/OffsetToLocation.js
new file mode 100644
index 0000000..eee8228
--- /dev/null
+++ b/node_modules/css-tree/lib/common/OffsetToLocation.js
@@ -0,0 +1,91 @@
+var adoptBuffer = require('./adopt-buffer');
+var isBOM = require('../tokenizer').isBOM;
+
+var N = 10;
+var F = 12;
+var R = 13;
+
+function computeLinesAndColumns(host, source) {
+    var sourceLength = source.length;
+    var lines = adoptBuffer(host.lines, sourceLength); // +1
+    var line = host.startLine;
+    var columns = adoptBuffer(host.columns, sourceLength);
+    var column = host.startColumn;
+    var startOffset = source.length > 0 ? isBOM(source.charCodeAt(0)) : 0;
+
+    for (var i = startOffset; i < sourceLength; i++) { // -1
+        var code = source.charCodeAt(i);
+
+        lines[i] = line;
+        columns[i] = column++;
+
+        if (code === N || code === R || code === F) {
+            if (code === R && i + 1 < sourceLength && source.charCodeAt(i + 1) === N) {
+                i++;
+                lines[i] = line;
+                columns[i] = column;
+            }
+
+            line++;
+            column = 1;
+        }
+    }
+
+    lines[i] = line;
+    columns[i] = column;
+
+    host.lines = lines;
+    host.columns = columns;
+}
+
+var OffsetToLocation = function() {
+    this.lines = null;
+    this.columns = null;
+    this.linesAndColumnsComputed = false;
+};
+
+OffsetToLocation.prototype = {
+    setSource: function(source, startOffset, startLine, startColumn) {
+        this.source = source;
+        this.startOffset = typeof startOffset === 'undefined' ? 0 : startOffset;
+        this.startLine = typeof startLine === 'undefined' ? 1 : startLine;
+        this.startColumn = typeof startColumn === 'undefined' ? 1 : startColumn;
+        this.linesAndColumnsComputed = false;
+    },
+
+    ensureLinesAndColumnsComputed: function() {
+        if (!this.linesAndColumnsComputed) {
+            computeLinesAndColumns(this, this.source);
+            this.linesAndColumnsComputed = true;
+        }
+    },
+    getLocation: function(offset, filename) {
+        this.ensureLinesAndColumnsComputed();
+
+        return {
+            source: filename,
+            offset: this.startOffset + offset,
+            line: this.lines[offset],
+            column: this.columns[offset]
+        };
+    },
+    getLocationRange: function(start, end, filename) {
+        this.ensureLinesAndColumnsComputed();
+
+        return {
+            source: filename,
+            start: {
+                offset: this.startOffset + start,
+                line: this.lines[start],
+                column: this.columns[start]
+            },
+            end: {
+                offset: this.startOffset + end,
+                line: this.lines[end],
+                column: this.columns[end]
+            }
+        };
+    }
+};
+
+module.exports = OffsetToLocation;
diff --git a/node_modules/css-tree/lib/common/SyntaxError.js b/node_modules/css-tree/lib/common/SyntaxError.js
new file mode 100644
index 0000000..0cbf16a
--- /dev/null
+++ b/node_modules/css-tree/lib/common/SyntaxError.js
@@ -0,0 +1,82 @@
+var createCustomError = require('../utils/createCustomError');
+var MAX_LINE_LENGTH = 100;
+var OFFSET_CORRECTION = 60;
+var TAB_REPLACEMENT = '    ';
+
+function sourceFragment(error, extraLines) {
+    function processLines(start, end) {
+        return lines.slice(start, end).map(function(line, idx) {
+            var num = String(start + idx + 1);
+
+            while (num.length < maxNumLength) {
+                num = ' ' + num;
+            }
+
+            return num + ' |' + line;
+        }).join('\n');
+    }
+
+    var lines = error.source.split(/\r\n?|\n|\f/);
+    var line = error.line;
+    var column = error.column;
+    var startLine = Math.max(1, line - extraLines) - 1;
+    var endLine = Math.min(line + extraLines, lines.length + 1);
+    var maxNumLength = Math.max(4, String(endLine).length) + 1;
+    var cutLeft = 0;
+
+    // column correction according to replaced tab before column
+    column += (TAB_REPLACEMENT.length - 1) * (lines[line - 1].substr(0, column - 1).match(/\t/g) || []).length;
+
+    if (column > MAX_LINE_LENGTH) {
+        cutLeft = column - OFFSET_CORRECTION + 3;
+        column = OFFSET_CORRECTION - 2;
+    }
+
+    for (var i = startLine; i <= endLine; i++) {
+        if (i >= 0 && i < lines.length) {
+            lines[i] = lines[i].replace(/\t/g, TAB_REPLACEMENT);
+            lines[i] =
+                (cutLeft > 0 && lines[i].length > cutLeft ? '\u2026' : '') +
+                lines[i].substr(cutLeft, MAX_LINE_LENGTH - 2) +
+                (lines[i].length > cutLeft + MAX_LINE_LENGTH - 1 ? '\u2026' : '');
+        }
+    }
+
+    return [
+        processLines(startLine, line),
+        new Array(column + maxNumLength + 2).join('-') + '^',
+        processLines(line, endLine)
+    ].filter(Boolean).join('\n');
+}
+
+var SyntaxError = function(message, source, offset, line, column) {
+    var error = createCustomError('SyntaxError', message);
+
+    error.source = source;
+    error.offset = offset;
+    error.line = line;
+    error.column = column;
+
+    error.sourceFragment = function(extraLines) {
+        return sourceFragment(error, isNaN(extraLines) ? 0 : extraLines);
+    };
+    Object.defineProperty(error, 'formattedMessage', {
+        get: function() {
+            return (
+                'Parse error: ' + error.message + '\n' +
+                sourceFragment(error, 2)
+            );
+        }
+    });
+
+    // for backward capability
+    error.parseError = {
+        offset: offset,
+        line: line,
+        column: column
+    };
+
+    return error;
+};
+
+module.exports = SyntaxError;
diff --git a/node_modules/css-tree/lib/common/TokenStream.js b/node_modules/css-tree/lib/common/TokenStream.js
new file mode 100644
index 0000000..c41ed1b
--- /dev/null
+++ b/node_modules/css-tree/lib/common/TokenStream.js
@@ -0,0 +1,219 @@
+var constants = require('../tokenizer/const');
+var TYPE = constants.TYPE;
+var NAME = constants.NAME;
+
+var utils = require('../tokenizer/utils');
+var cmpStr = utils.cmpStr;
+
+var EOF = TYPE.EOF;
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+
+var OFFSET_MASK = 0x00FFFFFF;
+var TYPE_SHIFT = 24;
+
+var TokenStream = function() {
+    this.offsetAndType = null;
+    this.balance = null;
+
+    this.reset();
+};
+
+TokenStream.prototype = {
+    reset: function() {
+        this.eof = false;
+        this.tokenIndex = -1;
+        this.tokenType = 0;
+        this.tokenStart = this.firstCharOffset;
+        this.tokenEnd = this.firstCharOffset;
+    },
+
+    lookupType: function(offset) {
+        offset += this.tokenIndex;
+
+        if (offset < this.tokenCount) {
+            return this.offsetAndType[offset] >> TYPE_SHIFT;
+        }
+
+        return EOF;
+    },
+    lookupOffset: function(offset) {
+        offset += this.tokenIndex;
+
+        if (offset < this.tokenCount) {
+            return this.offsetAndType[offset - 1] & OFFSET_MASK;
+        }
+
+        return this.source.length;
+    },
+    lookupValue: function(offset, referenceStr) {
+        offset += this.tokenIndex;
+
+        if (offset < this.tokenCount) {
+            return cmpStr(
+                this.source,
+                this.offsetAndType[offset - 1] & OFFSET_MASK,
+                this.offsetAndType[offset] & OFFSET_MASK,
+                referenceStr
+            );
+        }
+
+        return false;
+    },
+    getTokenStart: function(tokenIndex) {
+        if (tokenIndex === this.tokenIndex) {
+            return this.tokenStart;
+        }
+
+        if (tokenIndex > 0) {
+            return tokenIndex < this.tokenCount
+                ? this.offsetAndType[tokenIndex - 1] & OFFSET_MASK
+                : this.offsetAndType[this.tokenCount] & OFFSET_MASK;
+        }
+
+        return this.firstCharOffset;
+    },
+
+    // TODO: -> skipUntilBalanced
+    getRawLength: function(startToken, mode) {
+        var cursor = startToken;
+        var balanceEnd;
+        var offset = this.offsetAndType[Math.max(cursor - 1, 0)] & OFFSET_MASK;
+        var type;
+
+        loop:
+        for (; cursor < this.tokenCount; cursor++) {
+            balanceEnd = this.balance[cursor];
+
+            // stop scanning on balance edge that points to offset before start token
+            if (balanceEnd < startToken) {
+                break loop;
+            }
+
+            type = this.offsetAndType[cursor] >> TYPE_SHIFT;
+
+            // check token is stop type
+            switch (mode(type, this.source, offset)) {
+                case 1:
+                    break loop;
+
+                case 2:
+                    cursor++;
+                    break loop;
+
+                default:
+                    // fast forward to the end of balanced block
+                    if (this.balance[balanceEnd] === cursor) {
+                        cursor = balanceEnd;
+                    }
+
+                    offset = this.offsetAndType[cursor] & OFFSET_MASK;
+            }
+        }
+
+        return cursor - this.tokenIndex;
+    },
+    isBalanceEdge: function(pos) {
+        return this.balance[this.tokenIndex] < pos;
+    },
+    isDelim: function(code, offset) {
+        if (offset) {
+            return (
+                this.lookupType(offset) === TYPE.Delim &&
+                this.source.charCodeAt(this.lookupOffset(offset)) === code
+            );
+        }
+
+        return (
+            this.tokenType === TYPE.Delim &&
+            this.source.charCodeAt(this.tokenStart) === code
+        );
+    },
+
+    getTokenValue: function() {
+        return this.source.substring(this.tokenStart, this.tokenEnd);
+    },
+    getTokenLength: function() {
+        return this.tokenEnd - this.tokenStart;
+    },
+    substrToCursor: function(start) {
+        return this.source.substring(start, this.tokenStart);
+    },
+
+    skipWS: function() {
+        for (var i = this.tokenIndex, skipTokenCount = 0; i < this.tokenCount; i++, skipTokenCount++) {
+            if ((this.offsetAndType[i] >> TYPE_SHIFT) !== WHITESPACE) {
+                break;
+            }
+        }
+
+        if (skipTokenCount > 0) {
+            this.skip(skipTokenCount);
+        }
+    },
+    skipSC: function() {
+        while (this.tokenType === WHITESPACE || this.tokenType === COMMENT) {
+            this.next();
+        }
+    },
+    skip: function(tokenCount) {
+        var next = this.tokenIndex + tokenCount;
+
+        if (next < this.tokenCount) {
+            this.tokenIndex = next;
+            this.tokenStart = this.offsetAndType[next - 1] & OFFSET_MASK;
+            next = this.offsetAndType[next];
+            this.tokenType = next >> TYPE_SHIFT;
+            this.tokenEnd = next & OFFSET_MASK;
+        } else {
+            this.tokenIndex = this.tokenCount;
+            this.next();
+        }
+    },
+    next: function() {
+        var next = this.tokenIndex + 1;
+
+        if (next < this.tokenCount) {
+            this.tokenIndex = next;
+            this.tokenStart = this.tokenEnd;
+            next = this.offsetAndType[next];
+            this.tokenType = next >> TYPE_SHIFT;
+            this.tokenEnd = next & OFFSET_MASK;
+        } else {
+            this.tokenIndex = this.tokenCount;
+            this.eof = true;
+            this.tokenType = EOF;
+            this.tokenStart = this.tokenEnd = this.source.length;
+        }
+    },
+
+    forEachToken(fn) {
+        for (var i = 0, offset = this.firstCharOffset; i < this.tokenCount; i++) {
+            var start = offset;
+            var item = this.offsetAndType[i];
+            var end = item & OFFSET_MASK;
+            var type = item >> TYPE_SHIFT;
+
+            offset = end;
+
+            fn(type, start, end, i);
+        }
+    },
+
+    dump() {
+        var tokens = new Array(this.tokenCount);
+
+        this.forEachToken((type, start, end, index) => {
+            tokens[index] = {
+                idx: index,
+                type: NAME[type],
+                chunk: this.source.substring(start, end),
+                balance: this.balance[index]
+            };
+        });
+
+        return tokens;
+    }
+};
+
+module.exports = TokenStream;
diff --git a/node_modules/css-tree/lib/common/adopt-buffer.js b/node_modules/css-tree/lib/common/adopt-buffer.js
new file mode 100644
index 0000000..ef35b9b
--- /dev/null
+++ b/node_modules/css-tree/lib/common/adopt-buffer.js
@@ -0,0 +1,10 @@
+var MIN_SIZE = 16 * 1024;
+var SafeUint32Array = typeof Uint32Array !== 'undefined' ? Uint32Array : Array; // fallback on Array when TypedArray is not supported
+
+module.exports = function adoptBuffer(buffer, size) {
+    if (buffer === null || buffer.length < size) {
+        return new SafeUint32Array(Math.max(size + 1024, MIN_SIZE));
+    }
+
+    return buffer;
+};
diff --git a/node_modules/css-tree/lib/convertor/create.js b/node_modules/css-tree/lib/convertor/create.js
new file mode 100644
index 0000000..f2d1983
--- /dev/null
+++ b/node_modules/css-tree/lib/convertor/create.js
@@ -0,0 +1,28 @@
+var List = require('../common/List');
+
+module.exports = function createConvertors(walk) {
+    return {
+        fromPlainObject: function(ast) {
+            walk(ast, {
+                enter: function(node) {
+                    if (node.children && node.children instanceof List === false) {
+                        node.children = new List().fromArray(node.children);
+                    }
+                }
+            });
+
+            return ast;
+        },
+        toPlainObject: function(ast) {
+            walk(ast, {
+                leave: function(node) {
+                    if (node.children && node.children instanceof List) {
+                        node.children = node.children.toArray();
+                    }
+                }
+            });
+
+            return ast;
+        }
+    };
+};
diff --git a/node_modules/css-tree/lib/convertor/index.js b/node_modules/css-tree/lib/convertor/index.js
new file mode 100644
index 0000000..3248a57
--- /dev/null
+++ b/node_modules/css-tree/lib/convertor/index.js
@@ -0,0 +1,3 @@
+var createConvertor = require('./create');
+
+module.exports = createConvertor(require('../walker'));
diff --git a/node_modules/css-tree/lib/definition-syntax/SyntaxError.js b/node_modules/css-tree/lib/definition-syntax/SyntaxError.js
new file mode 100644
index 0000000..1f2f051
--- /dev/null
+++ b/node_modules/css-tree/lib/definition-syntax/SyntaxError.js
@@ -0,0 +1,14 @@
+var createCustomError = require('../utils/createCustomError');
+
+module.exports = function SyntaxError(message, input, offset) {
+    var error = createCustomError('SyntaxError', message);
+
+    error.input = input;
+    error.offset = offset;
+    error.rawMessage = message;
+    error.message = error.rawMessage + '\n' +
+        '  ' + error.input + '\n' +
+        '--' + new Array((error.offset || error.input.length) + 1).join('-') + '^';
+
+    return error;
+};
diff --git a/node_modules/css-tree/lib/definition-syntax/generate.js b/node_modules/css-tree/lib/definition-syntax/generate.js
new file mode 100644
index 0000000..786ad2a
--- /dev/null
+++ b/node_modules/css-tree/lib/definition-syntax/generate.js
@@ -0,0 +1,129 @@
+function noop(value) {
+    return value;
+}
+
+function generateMultiplier(multiplier) {
+    if (multiplier.min === 0 && multiplier.max === 0) {
+        return '*';
+    }
+
+    if (multiplier.min === 0 && multiplier.max === 1) {
+        return '?';
+    }
+
+    if (multiplier.min === 1 && multiplier.max === 0) {
+        return multiplier.comma ? '#' : '+';
+    }
+
+    if (multiplier.min === 1 && multiplier.max === 1) {
+        return '';
+    }
+
+    return (
+        (multiplier.comma ? '#' : '') +
+        (multiplier.min === multiplier.max
+            ? '{' + multiplier.min + '}'
+            : '{' + multiplier.min + ',' + (multiplier.max !== 0 ? multiplier.max : '') + '}'
+        )
+    );
+}
+
+function generateTypeOpts(node) {
+    switch (node.type) {
+        case 'Range':
+            return (
+                ' [' +
+                (node.min === null ? '-∞' : node.min) +
+                ',' +
+                (node.max === null ? '∞' : node.max) +
+                ']'
+            );
+
+        default:
+            throw new Error('Unknown node type `' + node.type + '`');
+    }
+}
+
+function generateSequence(node, decorate, forceBraces, compact) {
+    var combinator = node.combinator === ' ' || compact ? node.combinator : ' ' + node.combinator + ' ';
+    var result = node.terms.map(function(term) {
+        return generate(term, decorate, forceBraces, compact);
+    }).join(combinator);
+
+    if (node.explicit || forceBraces) {
+        result = (compact || result[0] === ',' ? '[' : '[ ') + result + (compact ? ']' : ' ]');
+    }
+
+    return result;
+}
+
+function generate(node, decorate, forceBraces, compact) {
+    var result;
+
+    switch (node.type) {
+        case 'Group':
+            result =
+                generateSequence(node, decorate, forceBraces, compact) +
+                (node.disallowEmpty ? '!' : '');
+            break;
+
+        case 'Multiplier':
+            // return since node is a composition
+            return (
+                generate(node.term, decorate, forceBraces, compact) +
+                decorate(generateMultiplier(node), node)
+            );
+
+        case 'Type':
+            result = '<' + node.name + (node.opts ? decorate(generateTypeOpts(node.opts), node.opts) : '') + '>';
+            break;
+
+        case 'Property':
+            result = '<\'' + node.name + '\'>';
+            break;
+
+        case 'Keyword':
+            result = node.name;
+            break;
+
+        case 'AtKeyword':
+            result = '@' + node.name;
+            break;
+
+        case 'Function':
+            result = node.name + '(';
+            break;
+
+        case 'String':
+        case 'Token':
+            result = node.value;
+            break;
+
+        case 'Comma':
+            result = ',';
+            break;
+
+        default:
+            throw new Error('Unknown node type `' + node.type + '`');
+    }
+
+    return decorate(result, node);
+}
+
+module.exports = function(node, options) {
+    var decorate = noop;
+    var forceBraces = false;
+    var compact = false;
+
+    if (typeof options === 'function') {
+        decorate = options;
+    } else if (options) {
+        forceBraces = Boolean(options.forceBraces);
+        compact = Boolean(options.compact);
+        if (typeof options.decorate === 'function') {
+            decorate = options.decorate;
+        }
+    }
+
+    return generate(node, decorate, forceBraces, compact);
+};
diff --git a/node_modules/css-tree/lib/definition-syntax/index.js b/node_modules/css-tree/lib/definition-syntax/index.js
new file mode 100644
index 0000000..282234a
--- /dev/null
+++ b/node_modules/css-tree/lib/definition-syntax/index.js
@@ -0,0 +1,6 @@
+module.exports = {
+    SyntaxError: require('./SyntaxError'),
+    parse: require('./parse'),
+    generate: require('./generate'),
+    walk: require('./walk')
+};
diff --git a/node_modules/css-tree/lib/definition-syntax/parse.js b/node_modules/css-tree/lib/definition-syntax/parse.js
new file mode 100644
index 0000000..004ac57
--- /dev/null
+++ b/node_modules/css-tree/lib/definition-syntax/parse.js
@@ -0,0 +1,568 @@
+var Tokenizer = require('./tokenizer');
+var TAB = 9;
+var N = 10;
+var F = 12;
+var R = 13;
+var SPACE = 32;
+var EXCLAMATIONMARK = 33;    // !
+var NUMBERSIGN = 35;         // #
+var AMPERSAND = 38;          // &
+var APOSTROPHE = 39;         // '
+var LEFTPARENTHESIS = 40;    // (
+var RIGHTPARENTHESIS = 41;   // )
+var ASTERISK = 42;           // *
+var PLUSSIGN = 43;           // +
+var COMMA = 44;              // ,
+var HYPERMINUS = 45;         // -
+var LESSTHANSIGN = 60;       // <
+var GREATERTHANSIGN = 62;    // >
+var QUESTIONMARK = 63;       // ?
+var COMMERCIALAT = 64;       // @
+var LEFTSQUAREBRACKET = 91;  // [
+var RIGHTSQUAREBRACKET = 93; // ]
+var LEFTCURLYBRACKET = 123;  // {
+var VERTICALLINE = 124;      // |
+var RIGHTCURLYBRACKET = 125; // }
+var INFINITY = 8734;         // ∞
+var NAME_CHAR = createCharMap(function(ch) {
+    return /[a-zA-Z0-9\-]/.test(ch);
+});
+var COMBINATOR_PRECEDENCE = {
+    ' ': 1,
+    '&&': 2,
+    '||': 3,
+    '|': 4
+};
+
+function createCharMap(fn) {
+    var array = typeof Uint32Array === 'function' ? new Uint32Array(128) : new Array(128);
+    for (var i = 0; i < 128; i++) {
+        array[i] = fn(String.fromCharCode(i)) ? 1 : 0;
+    }
+    return array;
+}
+
+function scanSpaces(tokenizer) {
+    return tokenizer.substringToPos(
+        tokenizer.findWsEnd(tokenizer.pos)
+    );
+}
+
+function scanWord(tokenizer) {
+    var end = tokenizer.pos;
+
+    for (; end < tokenizer.str.length; end++) {
+        var code = tokenizer.str.charCodeAt(end);
+        if (code >= 128 || NAME_CHAR[code] === 0) {
+            break;
+        }
+    }
+
+    if (tokenizer.pos === end) {
+        tokenizer.error('Expect a keyword');
+    }
+
+    return tokenizer.substringToPos(end);
+}
+
+function scanNumber(tokenizer) {
+    var end = tokenizer.pos;
+
+    for (; end < tokenizer.str.length; end++) {
+        var code = tokenizer.str.charCodeAt(end);
+        if (code < 48 || code > 57) {
+            break;
+        }
+    }
+
+    if (tokenizer.pos === end) {
+        tokenizer.error('Expect a number');
+    }
+
+    return tokenizer.substringToPos(end);
+}
+
+function scanString(tokenizer) {
+    var end = tokenizer.str.indexOf('\'', tokenizer.pos + 1);
+
+    if (end === -1) {
+        tokenizer.pos = tokenizer.str.length;
+        tokenizer.error('Expect an apostrophe');
+    }
+
+    return tokenizer.substringToPos(end + 1);
+}
+
+function readMultiplierRange(tokenizer) {
+    var min = null;
+    var max = null;
+
+    tokenizer.eat(LEFTCURLYBRACKET);
+
+    min = scanNumber(tokenizer);
+
+    if (tokenizer.charCode() === COMMA) {
+        tokenizer.pos++;
+        if (tokenizer.charCode() !== RIGHTCURLYBRACKET) {
+            max = scanNumber(tokenizer);
+        }
+    } else {
+        max = min;
+    }
+
+    tokenizer.eat(RIGHTCURLYBRACKET);
+
+    return {
+        min: Number(min),
+        max: max ? Number(max) : 0
+    };
+}
+
+function readMultiplier(tokenizer) {
+    var range = null;
+    var comma = false;
+
+    switch (tokenizer.charCode()) {
+        case ASTERISK:
+            tokenizer.pos++;
+
+            range = {
+                min: 0,
+                max: 0
+            };
+
+            break;
+
+        case PLUSSIGN:
+            tokenizer.pos++;
+
+            range = {
+                min: 1,
+                max: 0
+            };
+
+            break;
+
+        case QUESTIONMARK:
+            tokenizer.pos++;
+
+            range = {
+                min: 0,
+                max: 1
+            };
+
+            break;
+
+        case NUMBERSIGN:
+            tokenizer.pos++;
+
+            comma = true;
+
+            if (tokenizer.charCode() === LEFTCURLYBRACKET) {
+                range = readMultiplierRange(tokenizer);
+            } else {
+                range = {
+                    min: 1,
+                    max: 0
+                };
+            }
+
+            break;
+
+        case LEFTCURLYBRACKET:
+            range = readMultiplierRange(tokenizer);
+            break;
+
+        default:
+            return null;
+    }
+
+    return {
+        type: 'Multiplier',
+        comma: comma,
+        min: range.min,
+        max: range.max,
+        term: null
+    };
+}
+
+function maybeMultiplied(tokenizer, node) {
+    var multiplier = readMultiplier(tokenizer);
+
+    if (multiplier !== null) {
+        multiplier.term = node;
+        return multiplier;
+    }
+
+    return node;
+}
+
+function maybeToken(tokenizer) {
+    var ch = tokenizer.peek();
+
+    if (ch === '') {
+        return null;
+    }
+
+    return {
+        type: 'Token',
+        value: ch
+    };
+}
+
+function readProperty(tokenizer) {
+    var name;
+
+    tokenizer.eat(LESSTHANSIGN);
+    tokenizer.eat(APOSTROPHE);
+
+    name = scanWord(tokenizer);
+
+    tokenizer.eat(APOSTROPHE);
+    tokenizer.eat(GREATERTHANSIGN);
+
+    return maybeMultiplied(tokenizer, {
+        type: 'Property',
+        name: name
+    });
+}
+
+// https://drafts.csswg.org/css-values-3/#numeric-ranges
+// 4.1. Range Restrictions and Range Definition Notation
+//
+// Range restrictions can be annotated in the numeric type notation using CSS bracketed
+// range notation—[min,max]—within the angle brackets, after the identifying keyword,
+// indicating a closed range between (and including) min and max.
+// For example, <integer [0, 10]> indicates an integer between 0 and 10, inclusive.
+function readTypeRange(tokenizer) {
+    // use null for Infinity to make AST format JSON serializable/deserializable
+    var min = null; // -Infinity
+    var max = null; // Infinity
+    var sign = 1;
+
+    tokenizer.eat(LEFTSQUAREBRACKET);
+
+    if (tokenizer.charCode() === HYPERMINUS) {
+        tokenizer.peek();
+        sign = -1;
+    }
+
+    if (sign == -1 && tokenizer.charCode() === INFINITY) {
+        tokenizer.peek();
+    } else {
+        min = sign * Number(scanNumber(tokenizer));
+    }
+
+    scanSpaces(tokenizer);
+    tokenizer.eat(COMMA);
+    scanSpaces(tokenizer);
+
+    if (tokenizer.charCode() === INFINITY) {
+        tokenizer.peek();
+    } else {
+        sign = 1;
+
+        if (tokenizer.charCode() === HYPERMINUS) {
+            tokenizer.peek();
+            sign = -1;
+        }
+
+        max = sign * Number(scanNumber(tokenizer));
+    }
+
+    tokenizer.eat(RIGHTSQUAREBRACKET);
+
+    // If no range is indicated, either by using the bracketed range notation
+    // or in the property description, then [−∞,∞] is assumed.
+    if (min === null && max === null) {
+        return null;
+    }
+
+    return {
+        type: 'Range',
+        min: min,
+        max: max
+    };
+}
+
+function readType(tokenizer) {
+    var name;
+    var opts = null;
+
+    tokenizer.eat(LESSTHANSIGN);
+    name = scanWord(tokenizer);
+
+    if (tokenizer.charCode() === LEFTPARENTHESIS &&
+        tokenizer.nextCharCode() === RIGHTPARENTHESIS) {
+        tokenizer.pos += 2;
+        name += '()';
+    }
+
+    if (tokenizer.charCodeAt(tokenizer.findWsEnd(tokenizer.pos)) === LEFTSQUAREBRACKET) {
+        scanSpaces(tokenizer);
+        opts = readTypeRange(tokenizer);
+    }
+
+    tokenizer.eat(GREATERTHANSIGN);
+
+    return maybeMultiplied(tokenizer, {
+        type: 'Type',
+        name: name,
+        opts: opts
+    });
+}
+
+function readKeywordOrFunction(tokenizer) {
+    var name;
+
+    name = scanWord(tokenizer);
+
+    if (tokenizer.charCode() === LEFTPARENTHESIS) {
+        tokenizer.pos++;
+
+        return {
+            type: 'Function',
+            name: name
+        };
+    }
+
+    return maybeMultiplied(tokenizer, {
+        type: 'Keyword',
+        name: name
+    });
+}
+
+function regroupTerms(terms, combinators) {
+    function createGroup(terms, combinator) {
+        return {
+            type: 'Group',
+            terms: terms,
+            combinator: combinator,
+            disallowEmpty: false,
+            explicit: false
+        };
+    }
+
+    combinators = Object.keys(combinators).sort(function(a, b) {
+        return COMBINATOR_PRECEDENCE[a] - COMBINATOR_PRECEDENCE[b];
+    });
+
+    while (combinators.length > 0) {
+        var combinator = combinators.shift();
+        for (var i = 0, subgroupStart = 0; i < terms.length; i++) {
+            var term = terms[i];
+            if (term.type === 'Combinator') {
+                if (term.value === combinator) {
+                    if (subgroupStart === -1) {
+                        subgroupStart = i - 1;
+                    }
+                    terms.splice(i, 1);
+                    i--;
+                } else {
+                    if (subgroupStart !== -1 && i - subgroupStart > 1) {
+                        terms.splice(
+                            subgroupStart,
+                            i - subgroupStart,
+                            createGroup(terms.slice(subgroupStart, i), combinator)
+                        );
+                        i = subgroupStart + 1;
+                    }
+                    subgroupStart = -1;
+                }
+            }
+        }
+
+        if (subgroupStart !== -1 && combinators.length) {
+            terms.splice(
+                subgroupStart,
+                i - subgroupStart,
+                createGroup(terms.slice(subgroupStart, i), combinator)
+            );
+        }
+    }
+
+    return combinator;
+}
+
+function readImplicitGroup(tokenizer) {
+    var terms = [];
+    var combinators = {};
+    var token;
+    var prevToken = null;
+    var prevTokenPos = tokenizer.pos;
+
+    while (token = peek(tokenizer)) {
+        if (token.type !== 'Spaces') {
+            if (token.type === 'Combinator') {
+                // check for combinator in group beginning and double combinator sequence
+                if (prevToken === null || prevToken.type === 'Combinator') {
+                    tokenizer.pos = prevTokenPos;
+                    tokenizer.error('Unexpected combinator');
+                }
+
+                combinators[token.value] = true;
+            } else if (prevToken !== null && prevToken.type !== 'Combinator') {
+                combinators[' '] = true;  // a b
+                terms.push({
+                    type: 'Combinator',
+                    value: ' '
+                });
+            }
+
+            terms.push(token);
+            prevToken = token;
+            prevTokenPos = tokenizer.pos;
+        }
+    }
+
+    // check for combinator in group ending
+    if (prevToken !== null && prevToken.type === 'Combinator') {
+        tokenizer.pos -= prevTokenPos;
+        tokenizer.error('Unexpected combinator');
+    }
+
+    return {
+        type: 'Group',
+        terms: terms,
+        combinator: regroupTerms(terms, combinators) || ' ',
+        disallowEmpty: false,
+        explicit: false
+    };
+}
+
+function readGroup(tokenizer) {
+    var result;
+
+    tokenizer.eat(LEFTSQUAREBRACKET);
+    result = readImplicitGroup(tokenizer);
+    tokenizer.eat(RIGHTSQUAREBRACKET);
+
+    result.explicit = true;
+
+    if (tokenizer.charCode() === EXCLAMATIONMARK) {
+        tokenizer.pos++;
+        result.disallowEmpty = true;
+    }
+
+    return result;
+}
+
+function peek(tokenizer) {
+    var code = tokenizer.charCode();
+
+    if (code < 128 && NAME_CHAR[code] === 1) {
+        return readKeywordOrFunction(tokenizer);
+    }
+
+    switch (code) {
+        case RIGHTSQUAREBRACKET:
+            // don't eat, stop scan a group
+            break;
+
+        case LEFTSQUAREBRACKET:
+            return maybeMultiplied(tokenizer, readGroup(tokenizer));
+
+        case LESSTHANSIGN:
+            return tokenizer.nextCharCode() === APOSTROPHE
+                ? readProperty(tokenizer)
+                : readType(tokenizer);
+
+        case VERTICALLINE:
+            return {
+                type: 'Combinator',
+                value: tokenizer.substringToPos(
+                    tokenizer.nextCharCode() === VERTICALLINE
+                        ? tokenizer.pos + 2
+                        : tokenizer.pos + 1
+                )
+            };
+
+        case AMPERSAND:
+            tokenizer.pos++;
+            tokenizer.eat(AMPERSAND);
+
+            return {
+                type: 'Combinator',
+                value: '&&'
+            };
+
+        case COMMA:
+            tokenizer.pos++;
+            return {
+                type: 'Comma'
+            };
+
+        case APOSTROPHE:
+            return maybeMultiplied(tokenizer, {
+                type: 'String',
+                value: scanString(tokenizer)
+            });
+
+        case SPACE:
+        case TAB:
+        case N:
+        case R:
+        case F:
+            return {
+                type: 'Spaces',
+                value: scanSpaces(tokenizer)
+            };
+
+        case COMMERCIALAT:
+            code = tokenizer.nextCharCode();
+
+            if (code < 128 && NAME_CHAR[code] === 1) {
+                tokenizer.pos++;
+                return {
+                    type: 'AtKeyword',
+                    name: scanWord(tokenizer)
+                };
+            }
+
+            return maybeToken(tokenizer);
+
+        case ASTERISK:
+        case PLUSSIGN:
+        case QUESTIONMARK:
+        case NUMBERSIGN:
+        case EXCLAMATIONMARK:
+            // prohibited tokens (used as a multiplier start)
+            break;
+
+        case LEFTCURLYBRACKET:
+            // LEFTCURLYBRACKET is allowed since mdn/data uses it w/o quoting
+            // check next char isn't a number, because it's likely a disjoined multiplier
+            code = tokenizer.nextCharCode();
+
+            if (code < 48 || code > 57) {
+                return maybeToken(tokenizer);
+            }
+
+            break;
+
+        default:
+            return maybeToken(tokenizer);
+    }
+}
+
+function parse(source) {
+    var tokenizer = new Tokenizer(source);
+    var result = readImplicitGroup(tokenizer);
+
+    if (tokenizer.pos !== source.length) {
+        tokenizer.error('Unexpected input');
+    }
+
+    // reduce redundant groups with single group term
+    if (result.terms.length === 1 && result.terms[0].type === 'Group') {
+        result = result.terms[0];
+    }
+
+    return result;
+}
+
+// warm up parse to elimitate code branches that never execute
+// fix soft deoptimizations (insufficient type feedback)
+parse('[a&&<b>#|<\'c\'>*||e() f{2} /,(% g#{1,2} h{2,})]!');
+
+module.exports = parse;
diff --git a/node_modules/css-tree/lib/definition-syntax/tokenizer.js b/node_modules/css-tree/lib/definition-syntax/tokenizer.js
new file mode 100644
index 0000000..81ee681
--- /dev/null
+++ b/node_modules/css-tree/lib/definition-syntax/tokenizer.js
@@ -0,0 +1,55 @@
+var SyntaxError = require('./SyntaxError');
+
+var TAB = 9;
+var N = 10;
+var F = 12;
+var R = 13;
+var SPACE = 32;
+
+var Tokenizer = function(str) {
+    this.str = str;
+    this.pos = 0;
+};
+
+Tokenizer.prototype = {
+    charCodeAt: function(pos) {
+        return pos < this.str.length ? this.str.charCodeAt(pos) : 0;
+    },
+    charCode: function() {
+        return this.charCodeAt(this.pos);
+    },
+    nextCharCode: function() {
+        return this.charCodeAt(this.pos + 1);
+    },
+    nextNonWsCode: function(pos) {
+        return this.charCodeAt(this.findWsEnd(pos));
+    },
+    findWsEnd: function(pos) {
+        for (; pos < this.str.length; pos++) {
+            var code = this.str.charCodeAt(pos);
+            if (code !== R && code !== N && code !== F && code !== SPACE && code !== TAB) {
+                break;
+            }
+        }
+
+        return pos;
+    },
+    substringToPos: function(end) {
+        return this.str.substring(this.pos, this.pos = end);
+    },
+    eat: function(code) {
+        if (this.charCode() !== code) {
+            this.error('Expect `' + String.fromCharCode(code) + '`');
+        }
+
+        this.pos++;
+    },
+    peek: function() {
+        return this.pos < this.str.length ? this.str.charAt(this.pos++) : '';
+    },
+    error: function(message) {
+        throw new SyntaxError(message, this.str, this.pos);
+    }
+};
+
+module.exports = Tokenizer;
diff --git a/node_modules/css-tree/lib/definition-syntax/walk.js b/node_modules/css-tree/lib/definition-syntax/walk.js
new file mode 100644
index 0000000..7ba80e9
--- /dev/null
+++ b/node_modules/css-tree/lib/definition-syntax/walk.js
@@ -0,0 +1,52 @@
+var noop = function() {};
+
+function ensureFunction(value) {
+    return typeof value === 'function' ? value : noop;
+}
+
+module.exports = function(node, options, context) {
+    function walk(node) {
+        enter.call(context, node);
+
+        switch (node.type) {
+            case 'Group':
+                node.terms.forEach(walk);
+                break;
+
+            case 'Multiplier':
+                walk(node.term);
+                break;
+
+            case 'Type':
+            case 'Property':
+            case 'Keyword':
+            case 'AtKeyword':
+            case 'Function':
+            case 'String':
+            case 'Token':
+            case 'Comma':
+                break;
+
+            default:
+                throw new Error('Unknown type: ' + node.type);
+        }
+
+        leave.call(context, node);
+    }
+
+    var enter = noop;
+    var leave = noop;
+
+    if (typeof options === 'function') {
+        enter = options;
+    } else if (options) {
+        enter = ensureFunction(options.enter);
+        leave = ensureFunction(options.leave);
+    }
+
+    if (enter === noop && leave === noop) {
+        throw new Error('Neither `enter` nor `leave` walker handler is set or both aren\'t a function');
+    }
+
+    walk(node, context);
+};
diff --git a/node_modules/css-tree/lib/generator/create.js b/node_modules/css-tree/lib/generator/create.js
new file mode 100644
index 0000000..90fb973
--- /dev/null
+++ b/node_modules/css-tree/lib/generator/create.js
@@ -0,0 +1,66 @@
+var sourceMap = require('./sourceMap');
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+function processChildren(node, delimeter) {
+    var list = node.children;
+    var prev = null;
+
+    if (typeof delimeter !== 'function') {
+        list.forEach(this.node, this);
+    } else {
+        list.forEach(function(node) {
+            if (prev !== null) {
+                delimeter.call(this, prev);
+            }
+
+            this.node(node);
+            prev = node;
+        }, this);
+    }
+}
+
+module.exports = function createGenerator(config) {
+    function processNode(node) {
+        if (hasOwnProperty.call(types, node.type)) {
+            types[node.type].call(this, node);
+        } else {
+            throw new Error('Unknown node type: ' + node.type);
+        }
+    }
+
+    var types = {};
+
+    if (config.node) {
+        for (var name in config.node) {
+            types[name] = config.node[name].generate;
+        }
+    }
+
+    return function(node, options) {
+        var buffer = '';
+        var handlers = {
+            children: processChildren,
+            node: processNode,
+            chunk: function(chunk) {
+                buffer += chunk;
+            },
+            result: function() {
+                return buffer;
+            }
+        };
+
+        if (options) {
+            if (typeof options.decorator === 'function') {
+                handlers = options.decorator(handlers);
+            }
+
+            if (options.sourceMap) {
+                handlers = sourceMap(handlers);
+            }
+        }
+
+        handlers.node(node);
+
+        return handlers.result();
+    };
+};
diff --git a/node_modules/css-tree/lib/generator/index.js b/node_modules/css-tree/lib/generator/index.js
new file mode 100644
index 0000000..5bd86a8
--- /dev/null
+++ b/node_modules/css-tree/lib/generator/index.js
@@ -0,0 +1,4 @@
+var createGenerator = require('./create');
+var config = require('../syntax/config/parser');
+
+module.exports = createGenerator(config);
diff --git a/node_modules/css-tree/lib/generator/sourceMap.js b/node_modules/css-tree/lib/generator/sourceMap.js
new file mode 100644
index 0000000..720c190
--- /dev/null
+++ b/node_modules/css-tree/lib/generator/sourceMap.js
@@ -0,0 +1,95 @@
+var SourceMapGenerator = require('source-map/lib/source-map-generator').SourceMapGenerator;
+var trackNodes = {
+    Atrule: true,
+    Selector: true,
+    Declaration: true
+};
+
+module.exports = function generateSourceMap(handlers) {
+    var map = new SourceMapGenerator();
+    var line = 1;
+    var column = 0;
+    var generated = {
+        line: 1,
+        column: 0
+    };
+    var original = {
+        line: 0, // should be zero to add first mapping
+        column: 0
+    };
+    var sourceMappingActive = false;
+    var activatedGenerated = {
+        line: 1,
+        column: 0
+    };
+    var activatedMapping = {
+        generated: activatedGenerated
+    };
+
+    var handlersNode = handlers.node;
+    handlers.node = function(node) {
+        if (node.loc && node.loc.start && trackNodes.hasOwnProperty(node.type)) {
+            var nodeLine = node.loc.start.line;
+            var nodeColumn = node.loc.start.column - 1;
+
+            if (original.line !== nodeLine ||
+                original.column !== nodeColumn) {
+                original.line = nodeLine;
+                original.column = nodeColumn;
+
+                generated.line = line;
+                generated.column = column;
+
+                if (sourceMappingActive) {
+                    sourceMappingActive = false;
+                    if (generated.line !== activatedGenerated.line ||
+                        generated.column !== activatedGenerated.column) {
+                        map.addMapping(activatedMapping);
+                    }
+                }
+
+                sourceMappingActive = true;
+                map.addMapping({
+                    source: node.loc.source,
+                    original: original,
+                    generated: generated
+                });
+            }
+        }
+
+        handlersNode.call(this, node);
+
+        if (sourceMappingActive && trackNodes.hasOwnProperty(node.type)) {
+            activatedGenerated.line = line;
+            activatedGenerated.column = column;
+        }
+    };
+
+    var handlersChunk = handlers.chunk;
+    handlers.chunk = function(chunk) {
+        for (var i = 0; i < chunk.length; i++) {
+            if (chunk.charCodeAt(i) === 10) { // \n
+                line++;
+                column = 0;
+            } else {
+                column++;
+            }
+        }
+
+        handlersChunk(chunk);
+    };
+
+    var handlersResult = handlers.result;
+    handlers.result = function() {
+        if (sourceMappingActive) {
+            map.addMapping(activatedMapping);
+        }
+
+        return {
+            css: handlersResult(),
+            map: map
+        };
+    };
+
+    return handlers;
+};
diff --git a/node_modules/css-tree/lib/index.js b/node_modules/css-tree/lib/index.js
new file mode 100644
index 0000000..7688ab9
--- /dev/null
+++ b/node_modules/css-tree/lib/index.js
@@ -0,0 +1 @@
+module.exports = require('./syntax');
diff --git a/node_modules/css-tree/lib/lexer/Lexer.js b/node_modules/css-tree/lib/lexer/Lexer.js
new file mode 100644
index 0000000..9484881
--- /dev/null
+++ b/node_modules/css-tree/lib/lexer/Lexer.js
@@ -0,0 +1,466 @@
+var SyntaxReferenceError = require('./error').SyntaxReferenceError;
+var SyntaxMatchError = require('./error').SyntaxMatchError;
+var names = require('../utils/names');
+var generic = require('./generic');
+var parse = require('../definition-syntax/parse');
+var generate = require('../definition-syntax/generate');
+var walk = require('../definition-syntax/walk');
+var prepareTokens = require('./prepare-tokens');
+var buildMatchGraph = require('./match-graph').buildMatchGraph;
+var matchAsTree = require('./match').matchAsTree;
+var trace = require('./trace');
+var search = require('./search');
+var getStructureFromConfig = require('./structure').getStructureFromConfig;
+var cssWideKeywords = buildMatchGraph('inherit | initial | unset');
+var cssWideKeywordsWithExpression = buildMatchGraph('inherit | initial | unset | <-ms-legacy-expression>');
+
+function dumpMapSyntax(map, compact, syntaxAsAst) {
+    var result = {};
+
+    for (var name in map) {
+        if (map[name].syntax) {
+            result[name] = syntaxAsAst
+                ? map[name].syntax
+                : generate(map[name].syntax, { compact: compact });
+        }
+    }
+
+    return result;
+}
+
+function dumpAtruleMapSyntax(map, compact, syntaxAsAst) {
+    const result = {};
+
+    for (const [name, atrule] of Object.entries(map)) {
+        result[name] = {
+            prelude: atrule.prelude && (
+                syntaxAsAst
+                    ? atrule.prelude.syntax
+                    : generate(atrule.prelude.syntax, { compact })
+            ),
+            descriptors: atrule.descriptors && dumpMapSyntax(atrule.descriptors, compact, syntaxAsAst)
+        };
+    }
+
+    return result;
+}
+
+function valueHasVar(tokens) {
+    for (var i = 0; i < tokens.length; i++) {
+        if (tokens[i].value.toLowerCase() === 'var(') {
+            return true;
+        }
+    }
+
+    return false;
+}
+
+function buildMatchResult(match, error, iterations) {
+    return {
+        matched: match,
+        iterations: iterations,
+        error: error,
+        getTrace: trace.getTrace,
+        isType: trace.isType,
+        isProperty: trace.isProperty,
+        isKeyword: trace.isKeyword
+    };
+}
+
+function matchSyntax(lexer, syntax, value, useCommon) {
+    var tokens = prepareTokens(value, lexer.syntax);
+    var result;
+
+    if (valueHasVar(tokens)) {
+        return buildMatchResult(null, new Error('Matching for a tree with var() is not supported'));
+    }
+
+    if (useCommon) {
+        result = matchAsTree(tokens, lexer.valueCommonSyntax, lexer);
+    }
+
+    if (!useCommon || !result.match) {
+        result = matchAsTree(tokens, syntax.match, lexer);
+        if (!result.match) {
+            return buildMatchResult(
+                null,
+                new SyntaxMatchError(result.reason, syntax.syntax, value, result),
+                result.iterations
+            );
+        }
+    }
+
+    return buildMatchResult(result.match, null, result.iterations);
+}
+
+var Lexer = function(config, syntax, structure) {
+    this.valueCommonSyntax = cssWideKeywords;
+    this.syntax = syntax;
+    this.generic = false;
+    this.atrules = {};
+    this.properties = {};
+    this.types = {};
+    this.structure = structure || getStructureFromConfig(config);
+
+    if (config) {
+        if (config.types) {
+            for (var name in config.types) {
+                this.addType_(name, config.types[name]);
+            }
+        }
+
+        if (config.generic) {
+            this.generic = true;
+            for (var name in generic) {
+                this.addType_(name, generic[name]);
+            }
+        }
+
+        if (config.atrules) {
+            for (var name in config.atrules) {
+                this.addAtrule_(name, config.atrules[name]);
+            }
+        }
+
+        if (config.properties) {
+            for (var name in config.properties) {
+                this.addProperty_(name, config.properties[name]);
+            }
+        }
+    }
+};
+
+Lexer.prototype = {
+    structure: {},
+    checkStructure: function(ast) {
+        function collectWarning(node, message) {
+            warns.push({
+                node: node,
+                message: message
+            });
+        }
+
+        var structure = this.structure;
+        var warns = [];
+
+        this.syntax.walk(ast, function(node) {
+            if (structure.hasOwnProperty(node.type)) {
+                structure[node.type].check(node, collectWarning);
+            } else {
+                collectWarning(node, 'Unknown node type `' + node.type + '`');
+            }
+        });
+
+        return warns.length ? warns : false;
+    },
+
+    createDescriptor: function(syntax, type, name, parent = null) {
+        var ref = {
+            type: type,
+            name: name
+        };
+        var descriptor = {
+            type: type,
+            name: name,
+            parent: parent,
+            syntax: null,
+            match: null
+        };
+
+        if (typeof syntax === 'function') {
+            descriptor.match = buildMatchGraph(syntax, ref);
+        } else {
+            if (typeof syntax === 'string') {
+                // lazy parsing on first access
+                Object.defineProperty(descriptor, 'syntax', {
+                    get: function() {
+                        Object.defineProperty(descriptor, 'syntax', {
+                            value: parse(syntax)
+                        });
+
+                        return descriptor.syntax;
+                    }
+                });
+            } else {
+                descriptor.syntax = syntax;
+            }
+
+            // lazy graph build on first access
+            Object.defineProperty(descriptor, 'match', {
+                get: function() {
+                    Object.defineProperty(descriptor, 'match', {
+                        value: buildMatchGraph(descriptor.syntax, ref)
+                    });
+
+                    return descriptor.match;
+                }
+            });
+        }
+
+        return descriptor;
+    },
+    addAtrule_: function(name, syntax) {
+        if (!syntax) {
+            return;
+        }
+
+        this.atrules[name] = {
+            type: 'Atrule',
+            name: name,
+            prelude: syntax.prelude ? this.createDescriptor(syntax.prelude, 'AtrulePrelude', name) : null,
+            descriptors: syntax.descriptors
+                ? Object.keys(syntax.descriptors).reduce((res, descName) => {
+                    res[descName] = this.createDescriptor(syntax.descriptors[descName], 'AtruleDescriptor', descName, name);
+                    return res;
+                }, {})
+                : null
+        };
+    },
+    addProperty_: function(name, syntax) {
+        if (!syntax) {
+            return;
+        }
+
+        this.properties[name] = this.createDescriptor(syntax, 'Property', name);
+    },
+    addType_: function(name, syntax) {
+        if (!syntax) {
+            return;
+        }
+
+        this.types[name] = this.createDescriptor(syntax, 'Type', name);
+
+        if (syntax === generic['-ms-legacy-expression']) {
+            this.valueCommonSyntax = cssWideKeywordsWithExpression;
+        }
+    },
+
+    checkAtruleName: function(atruleName) {
+        if (!this.getAtrule(atruleName)) {
+            return new SyntaxReferenceError('Unknown at-rule', '@' + atruleName);
+        }
+    },
+    checkAtrulePrelude: function(atruleName, prelude) {
+        let error = this.checkAtruleName(atruleName);
+
+        if (error) {
+            return error;
+        }
+
+        var atrule = this.getAtrule(atruleName);
+
+        if (!atrule.prelude && prelude) {
+            return new SyntaxError('At-rule `@' + atruleName + '` should not contain a prelude');
+        }
+
+        if (atrule.prelude && !prelude) {
+            return new SyntaxError('At-rule `@' + atruleName + '` should contain a prelude');
+        }
+    },
+    checkAtruleDescriptorName: function(atruleName, descriptorName) {
+        let error = this.checkAtruleName(atruleName);
+
+        if (error) {
+            return error;
+        }
+
+        var atrule = this.getAtrule(atruleName);
+        var descriptor = names.keyword(descriptorName);
+
+        if (!atrule.descriptors) {
+            return new SyntaxError('At-rule `@' + atruleName + '` has no known descriptors');
+        }
+
+        if (!atrule.descriptors[descriptor.name] &&
+            !atrule.descriptors[descriptor.basename]) {
+            return new SyntaxReferenceError('Unknown at-rule descriptor', descriptorName);
+        }
+    },
+    checkPropertyName: function(propertyName) {
+        var property = names.property(propertyName);
+
+        // don't match syntax for a custom property
+        if (property.custom) {
+            return new Error('Lexer matching doesn\'t applicable for custom properties');
+        }
+
+        if (!this.getProperty(propertyName)) {
+            return new SyntaxReferenceError('Unknown property', propertyName);
+        }
+    },
+
+    matchAtrulePrelude: function(atruleName, prelude) {
+        var error = this.checkAtrulePrelude(atruleName, prelude);
+
+        if (error) {
+            return buildMatchResult(null, error);
+        }
+
+        if (!prelude) {
+            return buildMatchResult(null, null);
+        }
+
+        return matchSyntax(this, this.getAtrule(atruleName).prelude, prelude, false);
+    },
+    matchAtruleDescriptor: function(atruleName, descriptorName, value) {
+        var error = this.checkAtruleDescriptorName(atruleName, descriptorName);
+
+        if (error) {
+            return buildMatchResult(null, error);
+        }
+
+        var atrule = this.getAtrule(atruleName);
+        var descriptor = names.keyword(descriptorName);
+
+        return matchSyntax(this, atrule.descriptors[descriptor.name] || atrule.descriptors[descriptor.basename], value, false);
+    },
+    matchDeclaration: function(node) {
+        if (node.type !== 'Declaration') {
+            return buildMatchResult(null, new Error('Not a Declaration node'));
+        }
+
+        return this.matchProperty(node.property, node.value);
+    },
+    matchProperty: function(propertyName, value) {
+        var error = this.checkPropertyName(propertyName);
+
+        if (error) {
+            return buildMatchResult(null, error);
+        }
+
+        return matchSyntax(this, this.getProperty(propertyName), value, true);
+    },
+    matchType: function(typeName, value) {
+        var typeSyntax = this.getType(typeName);
+
+        if (!typeSyntax) {
+            return buildMatchResult(null, new SyntaxReferenceError('Unknown type', typeName));
+        }
+
+        return matchSyntax(this, typeSyntax, value, false);
+    },
+    match: function(syntax, value) {
+        if (typeof syntax !== 'string' && (!syntax || !syntax.type)) {
+            return buildMatchResult(null, new SyntaxReferenceError('Bad syntax'));
+        }
+
+        if (typeof syntax === 'string' || !syntax.match) {
+            syntax = this.createDescriptor(syntax, 'Type', 'anonymous');
+        }
+
+        return matchSyntax(this, syntax, value, false);
+    },
+
+    findValueFragments: function(propertyName, value, type, name) {
+        return search.matchFragments(this, value, this.matchProperty(propertyName, value), type, name);
+    },
+    findDeclarationValueFragments: function(declaration, type, name) {
+        return search.matchFragments(this, declaration.value, this.matchDeclaration(declaration), type, name);
+    },
+    findAllFragments: function(ast, type, name) {
+        var result = [];
+
+        this.syntax.walk(ast, {
+            visit: 'Declaration',
+            enter: function(declaration) {
+                result.push.apply(result, this.findDeclarationValueFragments(declaration, type, name));
+            }.bind(this)
+        });
+
+        return result;
+    },
+
+    getAtrule: function(atruleName, fallbackBasename = true) {
+        var atrule = names.keyword(atruleName);
+        var atruleEntry = atrule.vendor && fallbackBasename
+            ? this.atrules[atrule.name] || this.atrules[atrule.basename]
+            : this.atrules[atrule.name];
+
+        return atruleEntry || null;
+    },
+    getAtrulePrelude: function(atruleName, fallbackBasename = true) {
+        const atrule = this.getAtrule(atruleName, fallbackBasename);
+
+        return atrule && atrule.prelude || null;
+    },
+    getAtruleDescriptor: function(atruleName, name) {
+        return this.atrules.hasOwnProperty(atruleName) && this.atrules.declarators
+            ? this.atrules[atruleName].declarators[name] || null
+            : null;
+    },
+    getProperty: function(propertyName, fallbackBasename = true) {
+        var property = names.property(propertyName);
+        var propertyEntry = property.vendor && fallbackBasename
+            ? this.properties[property.name] || this.properties[property.basename]
+            : this.properties[property.name];
+
+        return propertyEntry || null;
+    },
+    getType: function(name) {
+        return this.types.hasOwnProperty(name) ? this.types[name] : null;
+    },
+
+    validate: function() {
+        function validate(syntax, name, broken, descriptor) {
+            if (broken.hasOwnProperty(name)) {
+                return broken[name];
+            }
+
+            broken[name] = false;
+            if (descriptor.syntax !== null) {
+                walk(descriptor.syntax, function(node) {
+                    if (node.type !== 'Type' && node.type !== 'Property') {
+                        return;
+                    }
+
+                    var map = node.type === 'Type' ? syntax.types : syntax.properties;
+                    var brokenMap = node.type === 'Type' ? brokenTypes : brokenProperties;
+
+                    if (!map.hasOwnProperty(node.name) || validate(syntax, node.name, brokenMap, map[node.name])) {
+                        broken[name] = true;
+                    }
+                }, this);
+            }
+        }
+
+        var brokenTypes = {};
+        var brokenProperties = {};
+
+        for (var key in this.types) {
+            validate(this, key, brokenTypes, this.types[key]);
+        }
+
+        for (var key in this.properties) {
+            validate(this, key, brokenProperties, this.properties[key]);
+        }
+
+        brokenTypes = Object.keys(brokenTypes).filter(function(name) {
+            return brokenTypes[name];
+        });
+        brokenProperties = Object.keys(brokenProperties).filter(function(name) {
+            return brokenProperties[name];
+        });
+
+        if (brokenTypes.length || brokenProperties.length) {
+            return {
+                types: brokenTypes,
+                properties: brokenProperties
+            };
+        }
+
+        return null;
+    },
+    dump: function(syntaxAsAst, pretty) {
+        return {
+            generic: this.generic,
+            types: dumpMapSyntax(this.types, !pretty, syntaxAsAst),
+            properties: dumpMapSyntax(this.properties, !pretty, syntaxAsAst),
+            atrules: dumpAtruleMapSyntax(this.atrules, !pretty, syntaxAsAst)
+        };
+    },
+    toString: function() {
+        return JSON.stringify(this.dump());
+    }
+};
+
+module.exports = Lexer;
diff --git a/node_modules/css-tree/lib/lexer/error.js b/node_modules/css-tree/lib/lexer/error.js
new file mode 100644
index 0000000..2a6af15
--- /dev/null
+++ b/node_modules/css-tree/lib/lexer/error.js
@@ -0,0 +1,127 @@
+const createCustomError = require('../utils/createCustomError');
+const generate = require('../definition-syntax/generate');
+const defaultLoc = { offset: 0, line: 1, column: 1 };
+
+function locateMismatch(matchResult, node) {
+    const tokens = matchResult.tokens;
+    const longestMatch = matchResult.longestMatch;
+    const mismatchNode = longestMatch < tokens.length ? tokens[longestMatch].node || null : null;
+    const badNode = mismatchNode !== node ? mismatchNode : null;
+    let mismatchOffset = 0;
+    let mismatchLength = 0;
+    let entries = 0;
+    let css = '';
+    let start;
+    let end;
+
+    for (let i = 0; i < tokens.length; i++) {
+        const token = tokens[i].value;
+
+        if (i === longestMatch) {
+            mismatchLength = token.length;
+            mismatchOffset = css.length;
+        }
+
+        if (badNode !== null && tokens[i].node === badNode) {
+            if (i <= longestMatch) {
+                entries++;
+            } else {
+                entries = 0;
+            }
+        }
+
+        css += token;
+    }
+
+    if (longestMatch === tokens.length || entries > 1) { // last
+        start = fromLoc(badNode || node, 'end') || buildLoc(defaultLoc, css);
+        end = buildLoc(start);
+    } else {
+        start = fromLoc(badNode, 'start') ||
+            buildLoc(fromLoc(node, 'start') || defaultLoc, css.slice(0, mismatchOffset));
+        end = fromLoc(badNode, 'end') ||
+            buildLoc(start, css.substr(mismatchOffset, mismatchLength));
+    }
+
+    return {
+        css,
+        mismatchOffset,
+        mismatchLength,
+        start,
+        end
+    };
+}
+
+function fromLoc(node, point) {
+    const value = node && node.loc && node.loc[point];
+
+    if (value) {
+        return 'line' in value ? buildLoc(value) : value;
+    }
+
+    return null;
+}
+
+function buildLoc({ offset, line, column }, extra) {
+    const loc = {
+        offset,
+        line,
+        column
+    };
+
+    if (extra) {
+        const lines = extra.split(/\n|\r\n?|\f/);
+
+        loc.offset += extra.length;
+        loc.line += lines.length - 1;
+        loc.column = lines.length === 1 ? loc.column + extra.length : lines.pop().length + 1;
+    }
+
+    return loc;
+}
+
+const SyntaxReferenceError = function(type, referenceName) {
+    const error = createCustomError(
+        'SyntaxReferenceError',
+        type + (referenceName ? ' `' + referenceName + '`' : '')
+    );
+
+    error.reference = referenceName;
+
+    return error;
+};
+
+const SyntaxMatchError = function(message, syntax, node, matchResult) {
+    const error = createCustomError('SyntaxMatchError', message);
+    const {
+        css,
+        mismatchOffset,
+        mismatchLength,
+        start,
+        end
+    } = locateMismatch(matchResult, node);
+
+    error.rawMessage = message;
+    error.syntax = syntax ? generate(syntax) : '<generic>';
+    error.css = css;
+    error.mismatchOffset = mismatchOffset;
+    error.mismatchLength = mismatchLength;
+    error.message = message + '\n' +
+        '  syntax: ' + error.syntax + '\n' +
+        '   value: ' + (css || '<empty string>') + '\n' +
+        '  --------' + new Array(error.mismatchOffset + 1).join('-') + '^';
+
+    Object.assign(error, start);
+    error.loc = {
+        source: (node && node.loc && node.loc.source) || '<unknown>',
+        start,
+        end
+    };
+
+    return error;
+};
+
+module.exports = {
+    SyntaxReferenceError,
+    SyntaxMatchError
+};
diff --git a/node_modules/css-tree/lib/lexer/generic-an-plus-b.js b/node_modules/css-tree/lib/lexer/generic-an-plus-b.js
new file mode 100644
index 0000000..7b8a818
--- /dev/null
+++ b/node_modules/css-tree/lib/lexer/generic-an-plus-b.js
@@ -0,0 +1,236 @@
+var isDigit = require('../tokenizer').isDigit;
+var cmpChar = require('../tokenizer').cmpChar;
+var TYPE = require('../tokenizer').TYPE;
+
+var DELIM = TYPE.Delim;
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+var IDENT = TYPE.Ident;
+var NUMBER = TYPE.Number;
+var DIMENSION = TYPE.Dimension;
+var PLUSSIGN = 0x002B;    // U+002B PLUS SIGN (+)
+var HYPHENMINUS = 0x002D; // U+002D HYPHEN-MINUS (-)
+var N = 0x006E;           // U+006E LATIN SMALL LETTER N (n)
+var DISALLOW_SIGN = true;
+var ALLOW_SIGN = false;
+
+function isDelim(token, code) {
+    return token !== null && token.type === DELIM && token.value.charCodeAt(0) === code;
+}
+
+function skipSC(token, offset, getNextToken) {
+    while (token !== null && (token.type === WHITESPACE || token.type === COMMENT)) {
+        token = getNextToken(++offset);
+    }
+
+    return offset;
+}
+
+function checkInteger(token, valueOffset, disallowSign, offset) {
+    if (!token) {
+        return 0;
+    }
+
+    var code = token.value.charCodeAt(valueOffset);
+
+    if (code === PLUSSIGN || code === HYPHENMINUS) {
+        if (disallowSign) {
+            // Number sign is not allowed
+            return 0;
+        }
+        valueOffset++;
+    }
+
+    for (; valueOffset < token.value.length; valueOffset++) {
+        if (!isDigit(token.value.charCodeAt(valueOffset))) {
+            // Integer is expected
+            return 0;
+        }
+    }
+
+    return offset + 1;
+}
+
+// ... <signed-integer>
+// ... ['+' | '-'] <signless-integer>
+function consumeB(token, offset_, getNextToken) {
+    var sign = false;
+    var offset = skipSC(token, offset_, getNextToken);
+
+    token = getNextToken(offset);
+
+    if (token === null) {
+        return offset_;
+    }
+
+    if (token.type !== NUMBER) {
+        if (isDelim(token, PLUSSIGN) || isDelim(token, HYPHENMINUS)) {
+            sign = true;
+            offset = skipSC(getNextToken(++offset), offset, getNextToken);
+            token = getNextToken(offset);
+
+            if (token === null && token.type !== NUMBER) {
+                return 0;
+            }
+        } else {
+            return offset_;
+        }
+    }
+
+    if (!sign) {
+        var code = token.value.charCodeAt(0);
+        if (code !== PLUSSIGN && code !== HYPHENMINUS) {
+            // Number sign is expected
+            return 0;
+        }
+    }
+
+    return checkInteger(token, sign ? 0 : 1, sign, offset);
+}
+
+// An+B microsyntax https://www.w3.org/TR/css-syntax-3/#anb
+module.exports = function anPlusB(token, getNextToken) {
+    /* eslint-disable brace-style*/
+    var offset = 0;
+
+    if (!token) {
+        return 0;
+    }
+
+    // <integer>
+    if (token.type === NUMBER) {
+        return checkInteger(token, 0, ALLOW_SIGN, offset); // b
+    }
+
+    // -n
+    // -n <signed-integer>
+    // -n ['+' | '-'] <signless-integer>
+    // -n- <signless-integer>
+    // <dashndashdigit-ident>
+    else if (token.type === IDENT && token.value.charCodeAt(0) === HYPHENMINUS) {
+        // expect 1st char is N
+        if (!cmpChar(token.value, 1, N)) {
+            return 0;
+        }
+
+        switch (token.value.length) {
+            // -n
+            // -n <signed-integer>
+            // -n ['+' | '-'] <signless-integer>
+            case 2:
+                return consumeB(getNextToken(++offset), offset, getNextToken);
+
+            // -n- <signless-integer>
+            case 3:
+                if (token.value.charCodeAt(2) !== HYPHENMINUS) {
+                    return 0;
+                }
+
+                offset = skipSC(getNextToken(++offset), offset, getNextToken);
+                token = getNextToken(offset);
+
+                return checkInteger(token, 0, DISALLOW_SIGN, offset);
+
+            // <dashndashdigit-ident>
+            default:
+                if (token.value.charCodeAt(2) !== HYPHENMINUS) {
+                    return 0;
+                }
+
+                return checkInteger(token, 3, DISALLOW_SIGN, offset);
+        }
+    }
+
+    // '+'? n
+    // '+'? n <signed-integer>
+    // '+'? n ['+' | '-'] <signless-integer>
+    // '+'? n- <signless-integer>
+    // '+'? <ndashdigit-ident>
+    else if (token.type === IDENT || (isDelim(token, PLUSSIGN) && getNextToken(offset + 1).type === IDENT)) {
+        // just ignore a plus
+        if (token.type !== IDENT) {
+            token = getNextToken(++offset);
+        }
+
+        if (token === null || !cmpChar(token.value, 0, N)) {
+            return 0;
+        }
+
+        switch (token.value.length) {
+            // '+'? n
+            // '+'? n <signed-integer>
+            // '+'? n ['+' | '-'] <signless-integer>
+            case 1:
+                return consumeB(getNextToken(++offset), offset, getNextToken);
+
+            // '+'? n- <signless-integer>
+            case 2:
+                if (token.value.charCodeAt(1) !== HYPHENMINUS) {
+                    return 0;
+                }
+
+                offset = skipSC(getNextToken(++offset), offset, getNextToken);
+                token = getNextToken(offset);
+
+                return checkInteger(token, 0, DISALLOW_SIGN, offset);
+
+            // '+'? <ndashdigit-ident>
+            default:
+                if (token.value.charCodeAt(1) !== HYPHENMINUS) {
+                    return 0;
+                }
+
+                return checkInteger(token, 2, DISALLOW_SIGN, offset);
+        }
+    }
+
+    // <ndashdigit-dimension>
+    // <ndash-dimension> <signless-integer>
+    // <n-dimension>
+    // <n-dimension> <signed-integer>
+    // <n-dimension> ['+' | '-'] <signless-integer>
+    else if (token.type === DIMENSION) {
+        var code = token.value.charCodeAt(0);
+        var sign = code === PLUSSIGN || code === HYPHENMINUS ? 1 : 0;
+
+        for (var i = sign; i < token.value.length; i++) {
+            if (!isDigit(token.value.charCodeAt(i))) {
+                break;
+            }
+        }
+
+        if (i === sign) {
+            // Integer is expected
+            return 0;
+        }
+
+        if (!cmpChar(token.value, i, N)) {
+            return 0;
+        }
+
+        // <n-dimension>
+        // <n-dimension> <signed-integer>
+        // <n-dimension> ['+' | '-'] <signless-integer>
+        if (i + 1 === token.value.length) {
+            return consumeB(getNextToken(++offset), offset, getNextToken);
+        } else {
+            if (token.value.charCodeAt(i + 1) !== HYPHENMINUS) {
+                return 0;
+            }
+
+            // <ndash-dimension> <signless-integer>
+            if (i + 2 === token.value.length) {
+                offset = skipSC(getNextToken(++offset), offset, getNextToken);
+                token = getNextToken(offset);
+
+                return checkInteger(token, 0, DISALLOW_SIGN, offset);
+            }
+            // <ndashdigit-dimension>
+            else {
+                return checkInteger(token, i + 2, DISALLOW_SIGN, offset);
+            }
+        }
+    }
+
+    return 0;
+};
diff --git a/node_modules/css-tree/lib/lexer/generic-urange.js b/node_modules/css-tree/lib/lexer/generic-urange.js
new file mode 100644
index 0000000..2556d70
--- /dev/null
+++ b/node_modules/css-tree/lib/lexer/generic-urange.js
@@ -0,0 +1,159 @@
+var isHexDigit = require('../tokenizer').isHexDigit;
+var cmpChar = require('../tokenizer').cmpChar;
+var TYPE = require('../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var DELIM = TYPE.Delim;
+var NUMBER = TYPE.Number;
+var DIMENSION = TYPE.Dimension;
+var PLUSSIGN = 0x002B;     // U+002B PLUS SIGN (+)
+var HYPHENMINUS = 0x002D;  // U+002D HYPHEN-MINUS (-)
+var QUESTIONMARK = 0x003F; // U+003F QUESTION MARK (?)
+var U = 0x0075;            // U+0075 LATIN SMALL LETTER U (u)
+
+function isDelim(token, code) {
+    return token !== null && token.type === DELIM && token.value.charCodeAt(0) === code;
+}
+
+function startsWith(token, code) {
+    return token.value.charCodeAt(0) === code;
+}
+
+function hexSequence(token, offset, allowDash) {
+    for (var pos = offset, hexlen = 0; pos < token.value.length; pos++) {
+        var code = token.value.charCodeAt(pos);
+
+        if (code === HYPHENMINUS && allowDash && hexlen !== 0) {
+            if (hexSequence(token, offset + hexlen + 1, false) > 0) {
+                return 6; // dissallow following question marks
+            }
+
+            return 0; // dash at the ending of a hex sequence is not allowed
+        }
+
+        if (!isHexDigit(code)) {
+            return 0; // not a hex digit
+        }
+
+        if (++hexlen > 6) {
+            return 0; // too many hex digits
+        };
+    }
+
+    return hexlen;
+}
+
+function withQuestionMarkSequence(consumed, length, getNextToken) {
+    if (!consumed) {
+        return 0; // nothing consumed
+    }
+
+    while (isDelim(getNextToken(length), QUESTIONMARK)) {
+        if (++consumed > 6) {
+            return 0; // too many question marks
+        }
+
+        length++;
+    }
+
+    return length;
+}
+
+// https://drafts.csswg.org/css-syntax/#urange
+// Informally, the <urange> production has three forms:
+// U+0001
+//      Defines a range consisting of a single code point, in this case the code point "1".
+// U+0001-00ff
+//      Defines a range of codepoints between the first and the second value, in this case
+//      the range between "1" and "ff" (255 in decimal) inclusive.
+// U+00??
+//      Defines a range of codepoints where the "?" characters range over all hex digits,
+//      in this case defining the same as the value U+0000-00ff.
+// In each form, a maximum of 6 digits is allowed for each hexadecimal number (if you treat "?" as a hexadecimal digit).
+//
+// <urange> =
+//   u '+' <ident-token> '?'* |
+//   u <dimension-token> '?'* |
+//   u <number-token> '?'* |
+//   u <number-token> <dimension-token> |
+//   u <number-token> <number-token> |
+//   u '+' '?'+
+module.exports = function urange(token, getNextToken) {
+    var length = 0;
+
+    // should start with `u` or `U`
+    if (token === null || token.type !== IDENT || !cmpChar(token.value, 0, U)) {
+        return 0;
+    }
+
+    token = getNextToken(++length);
+    if (token === null) {
+        return 0;
+    }
+
+    // u '+' <ident-token> '?'*
+    // u '+' '?'+
+    if (isDelim(token, PLUSSIGN)) {
+        token = getNextToken(++length);
+        if (token === null) {
+            return 0;
+        }
+
+        if (token.type === IDENT) {
+            // u '+' <ident-token> '?'*
+            return withQuestionMarkSequence(hexSequence(token, 0, true), ++length, getNextToken);
+        }
+
+        if (isDelim(token, QUESTIONMARK)) {
+            // u '+' '?'+
+            return withQuestionMarkSequence(1, ++length, getNextToken);
+        }
+
+        // Hex digit or question mark is expected
+        return 0;
+    }
+
+    // u <number-token> '?'*
+    // u <number-token> <dimension-token>
+    // u <number-token> <number-token>
+    if (token.type === NUMBER) {
+        if (!startsWith(token, PLUSSIGN)) {
+            return 0;
+        }
+
+        var consumedHexLength = hexSequence(token, 1, true);
+        if (consumedHexLength === 0) {
+            return 0;
+        }
+
+        token = getNextToken(++length);
+        if (token === null) {
+            // u <number-token> <eof>
+            return length;
+        }
+
+        if (token.type === DIMENSION || token.type === NUMBER) {
+            // u <number-token> <dimension-token>
+            // u <number-token> <number-token>
+            if (!startsWith(token, HYPHENMINUS) || !hexSequence(token, 1, false)) {
+                return 0;
+            }
+
+            return length + 1;
+        }
+
+        // u <number-token> '?'*
+        return withQuestionMarkSequence(consumedHexLength, length, getNextToken);
+    }
+
+    // u <dimension-token> '?'*
+    if (token.type === DIMENSION) {
+        if (!startsWith(token, PLUSSIGN)) {
+            return 0;
+        }
+
+        return withQuestionMarkSequence(hexSequence(token, 1, true), ++length, getNextToken);
+    }
+
+    return 0;
+};
diff --git a/node_modules/css-tree/lib/lexer/generic.js b/node_modules/css-tree/lib/lexer/generic.js
new file mode 100644
index 0000000..c5b733a
--- /dev/null
+++ b/node_modules/css-tree/lib/lexer/generic.js
@@ -0,0 +1,585 @@
+var tokenizer = require('../tokenizer');
+var isIdentifierStart = tokenizer.isIdentifierStart;
+var isHexDigit = tokenizer.isHexDigit;
+var isDigit = tokenizer.isDigit;
+var cmpStr = tokenizer.cmpStr;
+var consumeNumber = tokenizer.consumeNumber;
+var TYPE = tokenizer.TYPE;
+var anPlusB = require('./generic-an-plus-b');
+var urange = require('./generic-urange');
+
+var cssWideKeywords = ['unset', 'initial', 'inherit'];
+var calcFunctionNames = ['calc(', '-moz-calc(', '-webkit-calc('];
+
+// https://www.w3.org/TR/css-values-3/#lengths
+var LENGTH = {
+    // absolute length units
+    'px': true,
+    'mm': true,
+    'cm': true,
+    'in': true,
+    'pt': true,
+    'pc': true,
+    'q': true,
+
+    // relative length units
+    'em': true,
+    'ex': true,
+    'ch': true,
+    'rem': true,
+
+    // viewport-percentage lengths
+    'vh': true,
+    'vw': true,
+    'vmin': true,
+    'vmax': true,
+    'vm': true
+};
+
+var ANGLE = {
+    'deg': true,
+    'grad': true,
+    'rad': true,
+    'turn': true
+};
+
+var TIME = {
+    's': true,
+    'ms': true
+};
+
+var FREQUENCY = {
+    'hz': true,
+    'khz': true
+};
+
+// https://www.w3.org/TR/css-values-3/#resolution (https://drafts.csswg.org/css-values/#resolution)
+var RESOLUTION = {
+    'dpi': true,
+    'dpcm': true,
+    'dppx': true,
+    'x': true      // https://github.com/w3c/csswg-drafts/issues/461
+};
+
+// https://drafts.csswg.org/css-grid/#fr-unit
+var FLEX = {
+    'fr': true
+};
+
+// https://www.w3.org/TR/css3-speech/#mixing-props-voice-volume
+var DECIBEL = {
+    'db': true
+};
+
+// https://www.w3.org/TR/css3-speech/#voice-props-voice-pitch
+var SEMITONES = {
+    'st': true
+};
+
+// safe char code getter
+function charCode(str, index) {
+    return index < str.length ? str.charCodeAt(index) : 0;
+}
+
+function eqStr(actual, expected) {
+    return cmpStr(actual, 0, actual.length, expected);
+}
+
+function eqStrAny(actual, expected) {
+    for (var i = 0; i < expected.length; i++) {
+        if (eqStr(actual, expected[i])) {
+            return true;
+        }
+    }
+
+    return false;
+}
+
+// IE postfix hack, i.e. 123\0 or 123px\9
+function isPostfixIeHack(str, offset) {
+    if (offset !== str.length - 2) {
+        return false;
+    }
+
+    return (
+        str.charCodeAt(offset) === 0x005C &&  // U+005C REVERSE SOLIDUS (\)
+        isDigit(str.charCodeAt(offset + 1))
+    );
+}
+
+function outOfRange(opts, value, numEnd) {
+    if (opts && opts.type === 'Range') {
+        var num = Number(
+            numEnd !== undefined && numEnd !== value.length
+                ? value.substr(0, numEnd)
+                : value
+        );
+
+        if (isNaN(num)) {
+            return true;
+        }
+
+        if (opts.min !== null && num < opts.min) {
+            return true;
+        }
+
+        if (opts.max !== null && num > opts.max) {
+            return true;
+        }
+    }
+
+    return false;
+}
+
+function consumeFunction(token, getNextToken) {
+    var startIdx = token.index;
+    var length = 0;
+
+    // balanced token consuming
+    do {
+        length++;
+
+        if (token.balance <= startIdx) {
+            break;
+        }
+    } while (token = getNextToken(length));
+
+    return length;
+}
+
+// TODO: implement
+// can be used wherever <length>, <frequency>, <angle>, <time>, <percentage>, <number>, or <integer> values are allowed
+// https://drafts.csswg.org/css-values/#calc-notation
+function calc(next) {
+    return function(token, getNextToken, opts) {
+        if (token === null) {
+            return 0;
+        }
+
+        if (token.type === TYPE.Function && eqStrAny(token.value, calcFunctionNames)) {
+            return consumeFunction(token, getNextToken);
+        }
+
+        return next(token, getNextToken, opts);
+    };
+}
+
+function tokenType(expectedTokenType) {
+    return function(token) {
+        if (token === null || token.type !== expectedTokenType) {
+            return 0;
+        }
+
+        return 1;
+    };
+}
+
+function func(name) {
+    name = name + '(';
+
+    return function(token, getNextToken) {
+        if (token !== null && eqStr(token.value, name)) {
+            return consumeFunction(token, getNextToken);
+        }
+
+        return 0;
+    };
+}
+
+// =========================
+// Complex types
+//
+
+// https://drafts.csswg.org/css-values-4/#custom-idents
+// 4.2. Author-defined Identifiers: the <custom-ident> type
+// Some properties accept arbitrary author-defined identifiers as a component value.
+// This generic data type is denoted by <custom-ident>, and represents any valid CSS identifier
+// that would not be misinterpreted as a pre-defined keyword in that property’s value definition.
+//
+// See also: https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident
+function customIdent(token) {
+    if (token === null || token.type !== TYPE.Ident) {
+        return 0;
+    }
+
+    var name = token.value.toLowerCase();
+
+    // The CSS-wide keywords are not valid <custom-ident>s
+    if (eqStrAny(name, cssWideKeywords)) {
+        return 0;
+    }
+
+    // The default keyword is reserved and is also not a valid <custom-ident>
+    if (eqStr(name, 'default')) {
+        return 0;
+    }
+
+    // TODO: ignore property specific keywords (as described https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident)
+    // Specifications using <custom-ident> must specify clearly what other keywords
+    // are excluded from <custom-ident>, if any—for example by saying that any pre-defined keywords
+    // in that property’s value definition are excluded. Excluded keywords are excluded
+    // in all ASCII case permutations.
+
+    return 1;
+}
+
+// https://drafts.csswg.org/css-variables/#typedef-custom-property-name
+// A custom property is any property whose name starts with two dashes (U+002D HYPHEN-MINUS), like --foo.
+// The <custom-property-name> production corresponds to this: it’s defined as any valid identifier
+// that starts with two dashes, except -- itself, which is reserved for future use by CSS.
+// NOTE: Current implementation treat `--` as a valid name since most (all?) major browsers treat it as valid.
+function customPropertyName(token) {
+    // ... defined as any valid identifier
+    if (token === null || token.type !== TYPE.Ident) {
+        return 0;
+    }
+
+    // ... that starts with two dashes (U+002D HYPHEN-MINUS)
+    if (charCode(token.value, 0) !== 0x002D || charCode(token.value, 1) !== 0x002D) {
+        return 0;
+    }
+
+    return 1;
+}
+
+// https://drafts.csswg.org/css-color-4/#hex-notation
+// The syntax of a <hex-color> is a <hash-token> token whose value consists of 3, 4, 6, or 8 hexadecimal digits.
+// In other words, a hex color is written as a hash character, "#", followed by some number of digits 0-9 or
+// letters a-f (the case of the letters doesn’t matter - #00ff00 is identical to #00FF00).
+function hexColor(token) {
+    if (token === null || token.type !== TYPE.Hash) {
+        return 0;
+    }
+
+    var length = token.value.length;
+
+    // valid values (length): #rgb (4), #rgba (5), #rrggbb (7), #rrggbbaa (9)
+    if (length !== 4 && length !== 5 && length !== 7 && length !== 9) {
+        return 0;
+    }
+
+    for (var i = 1; i < length; i++) {
+        if (!isHexDigit(token.value.charCodeAt(i))) {
+            return 0;
+        }
+    }
+
+    return 1;
+}
+
+function idSelector(token) {
+    if (token === null || token.type !== TYPE.Hash) {
+        return 0;
+    }
+
+    if (!isIdentifierStart(charCode(token.value, 1), charCode(token.value, 2), charCode(token.value, 3))) {
+        return 0;
+    }
+
+    return 1;
+}
+
+// https://drafts.csswg.org/css-syntax/#any-value
+// It represents the entirety of what a valid declaration can have as its value.
+function declarationValue(token, getNextToken) {
+    if (!token) {
+        return 0;
+    }
+
+    var length = 0;
+    var level = 0;
+    var startIdx = token.index;
+
+    // The <declaration-value> production matches any sequence of one or more tokens,
+    // so long as the sequence ...
+    scan:
+    do {
+        switch (token.type) {
+            // ... does not contain <bad-string-token>, <bad-url-token>,
+            case TYPE.BadString:
+            case TYPE.BadUrl:
+                break scan;
+
+            // ... unmatched <)-token>, <]-token>, or <}-token>,
+            case TYPE.RightCurlyBracket:
+            case TYPE.RightParenthesis:
+            case TYPE.RightSquareBracket:
+                if (token.balance > token.index || token.balance < startIdx) {
+                    break scan;
+                }
+
+                level--;
+                break;
+
+            // ... or top-level <semicolon-token> tokens
+            case TYPE.Semicolon:
+                if (level === 0) {
+                    break scan;
+                }
+
+                break;
+
+            // ... or <delim-token> tokens with a value of "!"
+            case TYPE.Delim:
+                if (token.value === '!' && level === 0) {
+                    break scan;
+                }
+
+                break;
+
+            case TYPE.Function:
+            case TYPE.LeftParenthesis:
+            case TYPE.LeftSquareBracket:
+            case TYPE.LeftCurlyBracket:
+                level++;
+                break;
+        }
+
+        length++;
+
+        // until balance closing
+        if (token.balance <= startIdx) {
+            break;
+        }
+    } while (token = getNextToken(length));
+
+    return length;
+}
+
+// https://drafts.csswg.org/css-syntax/#any-value
+// The <any-value> production is identical to <declaration-value>, but also
+// allows top-level <semicolon-token> tokens and <delim-token> tokens
+// with a value of "!". It represents the entirety of what valid CSS can be in any context.
+function anyValue(token, getNextToken) {
+    if (!token) {
+        return 0;
+    }
+
+    var startIdx = token.index;
+    var length = 0;
+
+    // The <any-value> production matches any sequence of one or more tokens,
+    // so long as the sequence ...
+    scan:
+    do {
+        switch (token.type) {
+            // ... does not contain <bad-string-token>, <bad-url-token>,
+            case TYPE.BadString:
+            case TYPE.BadUrl:
+                break scan;
+
+            // ... unmatched <)-token>, <]-token>, or <}-token>,
+            case TYPE.RightCurlyBracket:
+            case TYPE.RightParenthesis:
+            case TYPE.RightSquareBracket:
+                if (token.balance > token.index || token.balance < startIdx) {
+                    break scan;
+                }
+
+                break;
+        }
+
+        length++;
+
+        // until balance closing
+        if (token.balance <= startIdx) {
+            break;
+        }
+    } while (token = getNextToken(length));
+
+    return length;
+}
+
+// =========================
+// Dimensions
+//
+
+function dimension(type) {
+    return function(token, getNextToken, opts) {
+        if (token === null || token.type !== TYPE.Dimension) {
+            return 0;
+        }
+
+        var numberEnd = consumeNumber(token.value, 0);
+
+        // check unit
+        if (type !== null) {
+            // check for IE postfix hack, i.e. 123px\0 or 123px\9
+            var reverseSolidusOffset = token.value.indexOf('\\', numberEnd);
+            var unit = reverseSolidusOffset === -1 || !isPostfixIeHack(token.value, reverseSolidusOffset)
+                ? token.value.substr(numberEnd)
+                : token.value.substring(numberEnd, reverseSolidusOffset);
+
+            if (type.hasOwnProperty(unit.toLowerCase()) === false) {
+                return 0;
+            }
+        }
+
+        // check range if specified
+        if (outOfRange(opts, token.value, numberEnd)) {
+            return 0;
+        }
+
+        return 1;
+    };
+}
+
+// =========================
+// Percentage
+//
+
+// §5.5. Percentages: the <percentage> type
+// https://drafts.csswg.org/css-values-4/#percentages
+function percentage(token, getNextToken, opts) {
+    // ... corresponds to the <percentage-token> production
+    if (token === null || token.type !== TYPE.Percentage) {
+        return 0;
+    }
+
+    // check range if specified
+    if (outOfRange(opts, token.value, token.value.length - 1)) {
+        return 0;
+    }
+
+    return 1;
+}
+
+// =========================
+// Numeric
+//
+
+// https://drafts.csswg.org/css-values-4/#numbers
+// The value <zero> represents a literal number with the value 0. Expressions that merely
+// evaluate to a <number> with the value 0 (for example, calc(0)) do not match <zero>;
+// only literal <number-token>s do.
+function zero(next) {
+    if (typeof next !== 'function') {
+        next = function() {
+            return 0;
+        };
+    }
+
+    return function(token, getNextToken, opts) {
+        if (token !== null && token.type === TYPE.Number) {
+            if (Number(token.value) === 0) {
+                return 1;
+            }
+        }
+
+        return next(token, getNextToken, opts);
+    };
+}
+
+// § 5.3. Real Numbers: the <number> type
+// https://drafts.csswg.org/css-values-4/#numbers
+// Number values are denoted by <number>, and represent real numbers, possibly with a fractional component.
+// ... It corresponds to the <number-token> production
+function number(token, getNextToken, opts) {
+    if (token === null) {
+        return 0;
+    }
+
+    var numberEnd = consumeNumber(token.value, 0);
+    var isNumber = numberEnd === token.value.length;
+    if (!isNumber && !isPostfixIeHack(token.value, numberEnd)) {
+        return 0;
+    }
+
+    // check range if specified
+    if (outOfRange(opts, token.value, numberEnd)) {
+        return 0;
+    }
+
+    return 1;
+}
+
+// §5.2. Integers: the <integer> type
+// https://drafts.csswg.org/css-values-4/#integers
+function integer(token, getNextToken, opts) {
+    // ... corresponds to a subset of the <number-token> production
+    if (token === null || token.type !== TYPE.Number) {
+        return 0;
+    }
+
+    // The first digit of an integer may be immediately preceded by `-` or `+` to indicate the integer’s sign.
+    var i = token.value.charCodeAt(0) === 0x002B ||       // U+002B PLUS SIGN (+)
+            token.value.charCodeAt(0) === 0x002D ? 1 : 0; // U+002D HYPHEN-MINUS (-)
+
+    // When written literally, an integer is one or more decimal digits 0 through 9 ...
+    for (; i < token.value.length; i++) {
+        if (!isDigit(token.value.charCodeAt(i))) {
+            return 0;
+        }
+    }
+
+    // check range if specified
+    if (outOfRange(opts, token.value, i)) {
+        return 0;
+    }
+
+    return 1;
+}
+
+module.exports = {
+    // token types
+    'ident-token': tokenType(TYPE.Ident),
+    'function-token': tokenType(TYPE.Function),
+    'at-keyword-token': tokenType(TYPE.AtKeyword),
+    'hash-token': tokenType(TYPE.Hash),
+    'string-token': tokenType(TYPE.String),
+    'bad-string-token': tokenType(TYPE.BadString),
+    'url-token': tokenType(TYPE.Url),
+    'bad-url-token': tokenType(TYPE.BadUrl),
+    'delim-token': tokenType(TYPE.Delim),
+    'number-token': tokenType(TYPE.Number),
+    'percentage-token': tokenType(TYPE.Percentage),
+    'dimension-token': tokenType(TYPE.Dimension),
+    'whitespace-token': tokenType(TYPE.WhiteSpace),
+    'CDO-token': tokenType(TYPE.CDO),
+    'CDC-token': tokenType(TYPE.CDC),
+    'colon-token': tokenType(TYPE.Colon),
+    'semicolon-token': tokenType(TYPE.Semicolon),
+    'comma-token': tokenType(TYPE.Comma),
+    '[-token': tokenType(TYPE.LeftSquareBracket),
+    ']-token': tokenType(TYPE.RightSquareBracket),
+    '(-token': tokenType(TYPE.LeftParenthesis),
+    ')-token': tokenType(TYPE.RightParenthesis),
+    '{-token': tokenType(TYPE.LeftCurlyBracket),
+    '}-token': tokenType(TYPE.RightCurlyBracket),
+
+    // token type aliases
+    'string': tokenType(TYPE.String),
+    'ident': tokenType(TYPE.Ident),
+
+    // complex types
+    'custom-ident': customIdent,
+    'custom-property-name': customPropertyName,
+    'hex-color': hexColor,
+    'id-selector': idSelector, // element( <id-selector> )
+    'an-plus-b': anPlusB,
+    'urange': urange,
+    'declaration-value': declarationValue,
+    'any-value': anyValue,
+
+    // dimensions
+    'dimension': calc(dimension(null)),
+    'angle': calc(dimension(ANGLE)),
+    'decibel': calc(dimension(DECIBEL)),
+    'frequency': calc(dimension(FREQUENCY)),
+    'flex': calc(dimension(FLEX)),
+    'length': calc(zero(dimension(LENGTH))),
+    'resolution': calc(dimension(RESOLUTION)),
+    'semitones': calc(dimension(SEMITONES)),
+    'time': calc(dimension(TIME)),
+
+    // percentage
+    'percentage': calc(percentage),
+
+    // numeric
+    'zero': zero(),
+    'number': calc(number),
+    'integer': calc(integer),
+
+    // old IE stuff
+    '-ms-legacy-expression': func('expression')
+};
diff --git a/node_modules/css-tree/lib/lexer/index.js b/node_modules/css-tree/lib/lexer/index.js
new file mode 100644
index 0000000..e29f392
--- /dev/null
+++ b/node_modules/css-tree/lib/lexer/index.js
@@ -0,0 +1,3 @@
+module.exports = {
+    Lexer: require('./Lexer')
+};
diff --git a/node_modules/css-tree/lib/lexer/match-graph.js b/node_modules/css-tree/lib/lexer/match-graph.js
new file mode 100644
index 0000000..3d27704
--- /dev/null
+++ b/node_modules/css-tree/lib/lexer/match-graph.js
@@ -0,0 +1,455 @@
+var parse = require('../definition-syntax/parse');
+
+var MATCH = { type: 'Match' };
+var MISMATCH = { type: 'Mismatch' };
+var DISALLOW_EMPTY = { type: 'DisallowEmpty' };
+var LEFTPARENTHESIS = 40;  // (
+var RIGHTPARENTHESIS = 41; // )
+
+function createCondition(match, thenBranch, elseBranch) {
+    // reduce node count
+    if (thenBranch === MATCH && elseBranch === MISMATCH) {
+        return match;
+    }
+
+    if (match === MATCH && thenBranch === MATCH && elseBranch === MATCH) {
+        return match;
+    }
+
+    if (match.type === 'If' && match.else === MISMATCH && thenBranch === MATCH) {
+        thenBranch = match.then;
+        match = match.match;
+    }
+
+    return {
+        type: 'If',
+        match: match,
+        then: thenBranch,
+        else: elseBranch
+    };
+}
+
+function isFunctionType(name) {
+    return (
+        name.length > 2 &&
+        name.charCodeAt(name.length - 2) === LEFTPARENTHESIS &&
+        name.charCodeAt(name.length - 1) === RIGHTPARENTHESIS
+    );
+}
+
+function isEnumCapatible(term) {
+    return (
+        term.type === 'Keyword' ||
+        term.type === 'AtKeyword' ||
+        term.type === 'Function' ||
+        term.type === 'Type' && isFunctionType(term.name)
+    );
+}
+
+function buildGroupMatchGraph(combinator, terms, atLeastOneTermMatched) {
+    switch (combinator) {
+        case ' ':
+            // Juxtaposing components means that all of them must occur, in the given order.
+            //
+            // a b c
+            // =
+            // match a
+            //   then match b
+            //     then match c
+            //       then MATCH
+            //       else MISMATCH
+            //     else MISMATCH
+            //   else MISMATCH
+            var result = MATCH;
+
+            for (var i = terms.length - 1; i >= 0; i--) {
+                var term = terms[i];
+
+                result = createCondition(
+                    term,
+                    result,
+                    MISMATCH
+                );
+            };
+
+            return result;
+
+        case '|':
+            // A bar (|) separates two or more alternatives: exactly one of them must occur.
+            //
+            // a | b | c
+            // =
+            // match a
+            //   then MATCH
+            //   else match b
+            //     then MATCH
+            //     else match c
+            //       then MATCH
+            //       else MISMATCH
+
+            var result = MISMATCH;
+            var map = null;
+
+            for (var i = terms.length - 1; i >= 0; i--) {
+                var term = terms[i];
+
+                // reduce sequence of keywords into a Enum
+                if (isEnumCapatible(term)) {
+                    if (map === null && i > 0 && isEnumCapatible(terms[i - 1])) {
+                        map = Object.create(null);
+                        result = createCondition(
+                            {
+                                type: 'Enum',
+                                map: map
+                            },
+                            MATCH,
+                            result
+                        );
+                    }
+
+                    if (map !== null) {
+                        var key = (isFunctionType(term.name) ? term.name.slice(0, -1) : term.name).toLowerCase();
+                        if (key in map === false) {
+                            map[key] = term;
+                            continue;
+                        }
+                    }
+                }
+
+                map = null;
+
+                // create a new conditonal node
+                result = createCondition(
+                    term,
+                    MATCH,
+                    result
+                );
+            };
+
+            return result;
+
+        case '&&':
+            // A double ampersand (&&) separates two or more components,
+            // all of which must occur, in any order.
+
+            // Use MatchOnce for groups with a large number of terms,
+            // since &&-groups produces at least N!-node trees
+            if (terms.length > 5) {
+                return {
+                    type: 'MatchOnce',
+                    terms: terms,
+                    all: true
+                };
+            }
+
+            // Use a combination tree for groups with small number of terms
+            //
+            // a && b && c
+            // =
+            // match a
+            //   then [b && c]
+            //   else match b
+            //     then [a && c]
+            //     else match c
+            //       then [a && b]
+            //       else MISMATCH
+            //
+            // a && b
+            // =
+            // match a
+            //   then match b
+            //     then MATCH
+            //     else MISMATCH
+            //   else match b
+            //     then match a
+            //       then MATCH
+            //       else MISMATCH
+            //     else MISMATCH
+            var result = MISMATCH;
+
+            for (var i = terms.length - 1; i >= 0; i--) {
+                var term = terms[i];
+                var thenClause;
+
+                if (terms.length > 1) {
+                    thenClause = buildGroupMatchGraph(
+                        combinator,
+                        terms.filter(function(newGroupTerm) {
+                            return newGroupTerm !== term;
+                        }),
+                        false
+                    );
+                } else {
+                    thenClause = MATCH;
+                }
+
+                result = createCondition(
+                    term,
+                    thenClause,
+                    result
+                );
+            };
+
+            return result;
+
+        case '||':
+            // A double bar (||) separates two or more options:
+            // one or more of them must occur, in any order.
+
+            // Use MatchOnce for groups with a large number of terms,
+            // since ||-groups produces at least N!-node trees
+            if (terms.length > 5) {
+                return {
+                    type: 'MatchOnce',
+                    terms: terms,
+                    all: false
+                };
+            }
+
+            // Use a combination tree for groups with small number of terms
+            //
+            // a || b || c
+            // =
+            // match a
+            //   then [b || c]
+            //   else match b
+            //     then [a || c]
+            //     else match c
+            //       then [a || b]
+            //       else MISMATCH
+            //
+            // a || b
+            // =
+            // match a
+            //   then match b
+            //     then MATCH
+            //     else MATCH
+            //   else match b
+            //     then match a
+            //       then MATCH
+            //       else MATCH
+            //     else MISMATCH
+            var result = atLeastOneTermMatched ? MATCH : MISMATCH;
+
+            for (var i = terms.length - 1; i >= 0; i--) {
+                var term = terms[i];
+                var thenClause;
+
+                if (terms.length > 1) {
+                    thenClause = buildGroupMatchGraph(
+                        combinator,
+                        terms.filter(function(newGroupTerm) {
+                            return newGroupTerm !== term;
+                        }),
+                        true
+                    );
+                } else {
+                    thenClause = MATCH;
+                }
+
+                result = createCondition(
+                    term,
+                    thenClause,
+                    result
+                );
+            };
+
+            return result;
+    }
+}
+
+function buildMultiplierMatchGraph(node) {
+    var result = MATCH;
+    var matchTerm = buildMatchGraph(node.term);
+
+    if (node.max === 0) {
+        // disable repeating of empty match to prevent infinite loop
+        matchTerm = createCondition(
+            matchTerm,
+            DISALLOW_EMPTY,
+            MISMATCH
+        );
+
+        // an occurrence count is not limited, make a cycle;
+        // to collect more terms on each following matching mismatch
+        result = createCondition(
+            matchTerm,
+            null, // will be a loop
+            MISMATCH
+        );
+
+        result.then = createCondition(
+            MATCH,
+            MATCH,
+            result // make a loop
+        );
+
+        if (node.comma) {
+            result.then.else = createCondition(
+                { type: 'Comma', syntax: node },
+                result,
+                MISMATCH
+            );
+        }
+    } else {
+        // create a match node chain for [min .. max] interval with optional matches
+        for (var i = node.min || 1; i <= node.max; i++) {
+            if (node.comma && result !== MATCH) {
+                result = createCondition(
+                    { type: 'Comma', syntax: node },
+                    result,
+                    MISMATCH
+                );
+            }
+
+            result = createCondition(
+                matchTerm,
+                createCondition(
+                    MATCH,
+                    MATCH,
+                    result
+                ),
+                MISMATCH
+            );
+        }
+    }
+
+    if (node.min === 0) {
+        // allow zero match
+        result = createCondition(
+            MATCH,
+            MATCH,
+            result
+        );
+    } else {
+        // create a match node chain to collect [0 ... min - 1] required matches
+        for (var i = 0; i < node.min - 1; i++) {
+            if (node.comma && result !== MATCH) {
+                result = createCondition(
+                    { type: 'Comma', syntax: node },
+                    result,
+                    MISMATCH
+                );
+            }
+
+            result = createCondition(
+                matchTerm,
+                result,
+                MISMATCH
+            );
+        }
+    }
+
+    return result;
+}
+
+function buildMatchGraph(node) {
+    if (typeof node === 'function') {
+        return {
+            type: 'Generic',
+            fn: node
+        };
+    }
+
+    switch (node.type) {
+        case 'Group':
+            var result = buildGroupMatchGraph(
+                node.combinator,
+                node.terms.map(buildMatchGraph),
+                false
+            );
+
+            if (node.disallowEmpty) {
+                result = createCondition(
+                    result,
+                    DISALLOW_EMPTY,
+                    MISMATCH
+                );
+            }
+
+            return result;
+
+        case 'Multiplier':
+            return buildMultiplierMatchGraph(node);
+
+        case 'Type':
+        case 'Property':
+            return {
+                type: node.type,
+                name: node.name,
+                syntax: node
+            };
+
+        case 'Keyword':
+            return {
+                type: node.type,
+                name: node.name.toLowerCase(),
+                syntax: node
+            };
+
+        case 'AtKeyword':
+            return {
+                type: node.type,
+                name: '@' + node.name.toLowerCase(),
+                syntax: node
+            };
+
+        case 'Function':
+            return {
+                type: node.type,
+                name: node.name.toLowerCase() + '(',
+                syntax: node
+            };
+
+        case 'String':
+            // convert a one char length String to a Token
+            if (node.value.length === 3) {
+                return {
+                    type: 'Token',
+                    value: node.value.charAt(1),
+                    syntax: node
+                };
+            }
+
+            // otherwise use it as is
+            return {
+                type: node.type,
+                value: node.value.substr(1, node.value.length - 2).replace(/\\'/g, '\''),
+                syntax: node
+            };
+
+        case 'Token':
+            return {
+                type: node.type,
+                value: node.value,
+                syntax: node
+            };
+
+        case 'Comma':
+            return {
+                type: node.type,
+                syntax: node
+            };
+
+        default:
+            throw new Error('Unknown node type:', node.type);
+    }
+}
+
+module.exports = {
+    MATCH: MATCH,
+    MISMATCH: MISMATCH,
+    DISALLOW_EMPTY: DISALLOW_EMPTY,
+    buildMatchGraph: function(syntaxTree, ref) {
+        if (typeof syntaxTree === 'string') {
+            syntaxTree = parse(syntaxTree);
+        }
+
+        return {
+            type: 'MatchGraph',
+            match: buildMatchGraph(syntaxTree),
+            syntax: ref || null,
+            source: syntaxTree
+        };
+    }
+};
diff --git a/node_modules/css-tree/lib/lexer/match.js b/node_modules/css-tree/lib/lexer/match.js
new file mode 100644
index 0000000..333ed7f
--- /dev/null
+++ b/node_modules/css-tree/lib/lexer/match.js
@@ -0,0 +1,639 @@
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+var matchGraph = require('./match-graph');
+var MATCH = matchGraph.MATCH;
+var MISMATCH = matchGraph.MISMATCH;
+var DISALLOW_EMPTY = matchGraph.DISALLOW_EMPTY;
+var TYPE = require('../tokenizer/const').TYPE;
+
+var STUB = 0;
+var TOKEN = 1;
+var OPEN_SYNTAX = 2;
+var CLOSE_SYNTAX = 3;
+
+var EXIT_REASON_MATCH = 'Match';
+var EXIT_REASON_MISMATCH = 'Mismatch';
+var EXIT_REASON_ITERATION_LIMIT = 'Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)';
+
+var ITERATION_LIMIT = 15000;
+var totalIterationCount = 0;
+
+function reverseList(list) {
+    var prev = null;
+    var next = null;
+    var item = list;
+
+    while (item !== null) {
+        next = item.prev;
+        item.prev = prev;
+        prev = item;
+        item = next;
+    }
+
+    return prev;
+}
+
+function areStringsEqualCaseInsensitive(testStr, referenceStr) {
+    if (testStr.length !== referenceStr.length) {
+        return false;
+    }
+
+    for (var i = 0; i < testStr.length; i++) {
+        var testCode = testStr.charCodeAt(i);
+        var referenceCode = referenceStr.charCodeAt(i);
+
+        // testCode.toLowerCase() for U+0041 LATIN CAPITAL LETTER A (A) .. U+005A LATIN CAPITAL LETTER Z (Z).
+        if (testCode >= 0x0041 && testCode <= 0x005A) {
+            testCode = testCode | 32;
+        }
+
+        if (testCode !== referenceCode) {
+            return false;
+        }
+    }
+
+    return true;
+}
+
+function isContextEdgeDelim(token) {
+    if (token.type !== TYPE.Delim) {
+        return false;
+    }
+
+    // Fix matching for unicode-range: U+30??, U+FF00-FF9F
+    // Probably we need to check out previous match instead
+    return token.value !== '?';
+}
+
+function isCommaContextStart(token) {
+    if (token === null) {
+        return true;
+    }
+
+    return (
+        token.type === TYPE.Comma ||
+        token.type === TYPE.Function ||
+        token.type === TYPE.LeftParenthesis ||
+        token.type === TYPE.LeftSquareBracket ||
+        token.type === TYPE.LeftCurlyBracket ||
+        isContextEdgeDelim(token)
+    );
+}
+
+function isCommaContextEnd(token) {
+    if (token === null) {
+        return true;
+    }
+
+    return (
+        token.type === TYPE.RightParenthesis ||
+        token.type === TYPE.RightSquareBracket ||
+        token.type === TYPE.RightCurlyBracket ||
+        token.type === TYPE.Delim
+    );
+}
+
+function internalMatch(tokens, state, syntaxes) {
+    function moveToNextToken() {
+        do {
+            tokenIndex++;
+            token = tokenIndex < tokens.length ? tokens[tokenIndex] : null;
+        } while (token !== null && (token.type === TYPE.WhiteSpace || token.type === TYPE.Comment));
+    }
+
+    function getNextToken(offset) {
+        var nextIndex = tokenIndex + offset;
+
+        return nextIndex < tokens.length ? tokens[nextIndex] : null;
+    }
+
+    function stateSnapshotFromSyntax(nextState, prev) {
+        return {
+            nextState: nextState,
+            matchStack: matchStack,
+            syntaxStack: syntaxStack,
+            thenStack: thenStack,
+            tokenIndex: tokenIndex,
+            prev: prev
+        };
+    }
+
+    function pushThenStack(nextState) {
+        thenStack = {
+            nextState: nextState,
+            matchStack: matchStack,
+            syntaxStack: syntaxStack,
+            prev: thenStack
+        };
+    }
+
+    function pushElseStack(nextState) {
+        elseStack = stateSnapshotFromSyntax(nextState, elseStack);
+    }
+
+    function addTokenToMatch() {
+        matchStack = {
+            type: TOKEN,
+            syntax: state.syntax,
+            token: token,
+            prev: matchStack
+        };
+
+        moveToNextToken();
+        syntaxStash = null;
+
+        if (tokenIndex > longestMatch) {
+            longestMatch = tokenIndex;
+        }
+    }
+
+    function openSyntax() {
+        syntaxStack = {
+            syntax: state.syntax,
+            opts: state.syntax.opts || (syntaxStack !== null && syntaxStack.opts) || null,
+            prev: syntaxStack
+        };
+
+        matchStack = {
+            type: OPEN_SYNTAX,
+            syntax: state.syntax,
+            token: matchStack.token,
+            prev: matchStack
+        };
+    }
+
+    function closeSyntax() {
+        if (matchStack.type === OPEN_SYNTAX) {
+            matchStack = matchStack.prev;
+        } else {
+            matchStack = {
+                type: CLOSE_SYNTAX,
+                syntax: syntaxStack.syntax,
+                token: matchStack.token,
+                prev: matchStack
+            };
+        }
+
+        syntaxStack = syntaxStack.prev;
+    }
+
+    var syntaxStack = null;
+    var thenStack = null;
+    var elseStack = null;
+
+    // null – stashing allowed, nothing stashed
+    // false – stashing disabled, nothing stashed
+    // anithing else – fail stashable syntaxes, some syntax stashed
+    var syntaxStash = null;
+
+    var iterationCount = 0; // count iterations and prevent infinite loop
+    var exitReason = null;
+
+    var token = null;
+    var tokenIndex = -1;
+    var longestMatch = 0;
+    var matchStack = {
+        type: STUB,
+        syntax: null,
+        token: null,
+        prev: null
+    };
+
+    moveToNextToken();
+
+    while (exitReason === null && ++iterationCount < ITERATION_LIMIT) {
+        // function mapList(list, fn) {
+        //     var result = [];
+        //     while (list) {
+        //         result.unshift(fn(list));
+        //         list = list.prev;
+        //     }
+        //     return result;
+        // }
+        // console.log('--\n',
+        //     '#' + iterationCount,
+        //     require('util').inspect({
+        //         match: mapList(matchStack, x => x.type === TOKEN ? x.token && x.token.value : x.syntax ? ({ [OPEN_SYNTAX]: '<', [CLOSE_SYNTAX]: '</' }[x.type] || x.type) + '!' + x.syntax.name : null),
+        //         token: token && token.value,
+        //         tokenIndex,
+        //         syntax: syntax.type + (syntax.id ? ' #' + syntax.id : '')
+        //     }, { depth: null })
+        // );
+        switch (state.type) {
+            case 'Match':
+                if (thenStack === null) {
+                    // turn to MISMATCH when some tokens left unmatched
+                    if (token !== null) {
+                        // doesn't mismatch if just one token left and it's an IE hack
+                        if (tokenIndex !== tokens.length - 1 || (token.value !== '\\0' && token.value !== '\\9')) {
+                            state = MISMATCH;
+                            break;
+                        }
+                    }
+
+                    // break the main loop, return a result - MATCH
+                    exitReason = EXIT_REASON_MATCH;
+                    break;
+                }
+
+                // go to next syntax (`then` branch)
+                state = thenStack.nextState;
+
+                // check match is not empty
+                if (state === DISALLOW_EMPTY) {
+                    if (thenStack.matchStack === matchStack) {
+                        state = MISMATCH;
+                        break;
+                    } else {
+                        state = MATCH;
+                    }
+                }
+
+                // close syntax if needed
+                while (thenStack.syntaxStack !== syntaxStack) {
+                    closeSyntax();
+                }
+
+                // pop stack
+                thenStack = thenStack.prev;
+                break;
+
+            case 'Mismatch':
+                // when some syntax is stashed
+                if (syntaxStash !== null && syntaxStash !== false) {
+                    // there is no else branches or a branch reduce match stack
+                    if (elseStack === null || tokenIndex > elseStack.tokenIndex) {
+                        // restore state from the stash
+                        elseStack = syntaxStash;
+                        syntaxStash = false; // disable stashing
+                    }
+                } else if (elseStack === null) {
+                    // no else branches -> break the main loop
+                    // return a result - MISMATCH
+                    exitReason = EXIT_REASON_MISMATCH;
+                    break;
+                }
+
+                // go to next syntax (`else` branch)
+                state = elseStack.nextState;
+
+                // restore all the rest stack states
+                thenStack = elseStack.thenStack;
+                syntaxStack = elseStack.syntaxStack;
+                matchStack = elseStack.matchStack;
+                tokenIndex = elseStack.tokenIndex;
+                token = tokenIndex < tokens.length ? tokens[tokenIndex] : null;
+
+                // pop stack
+                elseStack = elseStack.prev;
+                break;
+
+            case 'MatchGraph':
+                state = state.match;
+                break;
+
+            case 'If':
+                // IMPORTANT: else stack push must go first,
+                // since it stores the state of thenStack before changes
+                if (state.else !== MISMATCH) {
+                    pushElseStack(state.else);
+                }
+
+                if (state.then !== MATCH) {
+                    pushThenStack(state.then);
+                }
+
+                state = state.match;
+                break;
+
+            case 'MatchOnce':
+                state = {
+                    type: 'MatchOnceBuffer',
+                    syntax: state,
+                    index: 0,
+                    mask: 0
+                };
+                break;
+
+            case 'MatchOnceBuffer':
+                var terms = state.syntax.terms;
+
+                if (state.index === terms.length) {
+                    // no matches at all or it's required all terms to be matched
+                    if (state.mask === 0 || state.syntax.all) {
+                        state = MISMATCH;
+                        break;
+                    }
+
+                    // a partial match is ok
+                    state = MATCH;
+                    break;
+                }
+
+                // all terms are matched
+                if (state.mask === (1 << terms.length) - 1) {
+                    state = MATCH;
+                    break;
+                }
+
+                for (; state.index < terms.length; state.index++) {
+                    var matchFlag = 1 << state.index;
+
+                    if ((state.mask & matchFlag) === 0) {
+                        // IMPORTANT: else stack push must go first,
+                        // since it stores the state of thenStack before changes
+                        pushElseStack(state);
+                        pushThenStack({
+                            type: 'AddMatchOnce',
+                            syntax: state.syntax,
+                            mask: state.mask | matchFlag
+                        });
+
+                        // match
+                        state = terms[state.index++];
+                        break;
+                    }
+                }
+                break;
+
+            case 'AddMatchOnce':
+                state = {
+                    type: 'MatchOnceBuffer',
+                    syntax: state.syntax,
+                    index: 0,
+                    mask: state.mask
+                };
+                break;
+
+            case 'Enum':
+                if (token !== null) {
+                    var name = token.value.toLowerCase();
+
+                    // drop \0 and \9 hack from keyword name
+                    if (name.indexOf('\\') !== -1) {
+                        name = name.replace(/\\[09].*$/, '');
+                    }
+
+                    if (hasOwnProperty.call(state.map, name)) {
+                        state = state.map[name];
+                        break;
+                    }
+                }
+
+                state = MISMATCH;
+                break;
+
+            case 'Generic':
+                var opts = syntaxStack !== null ? syntaxStack.opts : null;
+                var lastTokenIndex = tokenIndex + Math.floor(state.fn(token, getNextToken, opts));
+
+                if (!isNaN(lastTokenIndex) && lastTokenIndex > tokenIndex) {
+                    while (tokenIndex < lastTokenIndex) {
+                        addTokenToMatch();
+                    }
+
+                    state = MATCH;
+                } else {
+                    state = MISMATCH;
+                }
+
+                break;
+
+            case 'Type':
+            case 'Property':
+                var syntaxDict = state.type === 'Type' ? 'types' : 'properties';
+                var dictSyntax = hasOwnProperty.call(syntaxes, syntaxDict) ? syntaxes[syntaxDict][state.name] : null;
+
+                if (!dictSyntax || !dictSyntax.match) {
+                    throw new Error(
+                        'Bad syntax reference: ' +
+                        (state.type === 'Type'
+                            ? '<' + state.name + '>'
+                            : '<\'' + state.name + '\'>')
+                    );
+                }
+
+                // stash a syntax for types with low priority
+                if (syntaxStash !== false && token !== null && state.type === 'Type') {
+                    var lowPriorityMatching =
+                        // https://drafts.csswg.org/css-values-4/#custom-idents
+                        // When parsing positionally-ambiguous keywords in a property value, a <custom-ident> production
+                        // can only claim the keyword if no other unfulfilled production can claim it.
+                        (state.name === 'custom-ident' && token.type === TYPE.Ident) ||
+
+                        // https://drafts.csswg.org/css-values-4/#lengths
+                        // ... if a `0` could be parsed as either a <number> or a <length> in a property (such as line-height),
+                        // it must parse as a <number>
+                        (state.name === 'length' && token.value === '0');
+
+                    if (lowPriorityMatching) {
+                        if (syntaxStash === null) {
+                            syntaxStash = stateSnapshotFromSyntax(state, elseStack);
+                        }
+
+                        state = MISMATCH;
+                        break;
+                    }
+                }
+
+                openSyntax();
+                state = dictSyntax.match;
+                break;
+
+            case 'Keyword':
+                var name = state.name;
+
+                if (token !== null) {
+                    var keywordName = token.value;
+
+                    // drop \0 and \9 hack from keyword name
+                    if (keywordName.indexOf('\\') !== -1) {
+                        keywordName = keywordName.replace(/\\[09].*$/, '');
+                    }
+
+                    if (areStringsEqualCaseInsensitive(keywordName, name)) {
+                        addTokenToMatch();
+                        state = MATCH;
+                        break;
+                    }
+                }
+
+                state = MISMATCH;
+                break;
+
+            case 'AtKeyword':
+            case 'Function':
+                if (token !== null && areStringsEqualCaseInsensitive(token.value, state.name)) {
+                    addTokenToMatch();
+                    state = MATCH;
+                    break;
+                }
+
+                state = MISMATCH;
+                break;
+
+            case 'Token':
+                if (token !== null && token.value === state.value) {
+                    addTokenToMatch();
+                    state = MATCH;
+                    break;
+                }
+
+                state = MISMATCH;
+                break;
+
+            case 'Comma':
+                if (token !== null && token.type === TYPE.Comma) {
+                    if (isCommaContextStart(matchStack.token)) {
+                        state = MISMATCH;
+                    } else {
+                        addTokenToMatch();
+                        state = isCommaContextEnd(token) ? MISMATCH : MATCH;
+                    }
+                } else {
+                    state = isCommaContextStart(matchStack.token) || isCommaContextEnd(token) ? MATCH : MISMATCH;
+                }
+
+                break;
+
+            case 'String':
+                var string = '';
+
+                for (var lastTokenIndex = tokenIndex; lastTokenIndex < tokens.length && string.length < state.value.length; lastTokenIndex++) {
+                    string += tokens[lastTokenIndex].value;
+                }
+
+                if (areStringsEqualCaseInsensitive(string, state.value)) {
+                    while (tokenIndex < lastTokenIndex) {
+                        addTokenToMatch();
+                    }
+
+                    state = MATCH;
+                } else {
+                    state = MISMATCH;
+                }
+
+                break;
+
+            default:
+                throw new Error('Unknown node type: ' + state.type);
+        }
+    }
+
+    totalIterationCount += iterationCount;
+
+    switch (exitReason) {
+        case null:
+            console.warn('[csstree-match] BREAK after ' + ITERATION_LIMIT + ' iterations');
+            exitReason = EXIT_REASON_ITERATION_LIMIT;
+            matchStack = null;
+            break;
+
+        case EXIT_REASON_MATCH:
+            while (syntaxStack !== null) {
+                closeSyntax();
+            }
+            break;
+
+        default:
+            matchStack = null;
+    }
+
+    return {
+        tokens: tokens,
+        reason: exitReason,
+        iterations: iterationCount,
+        match: matchStack,
+        longestMatch: longestMatch
+    };
+}
+
+function matchAsList(tokens, matchGraph, syntaxes) {
+    var matchResult = internalMatch(tokens, matchGraph, syntaxes || {});
+
+    if (matchResult.match !== null) {
+        var item = reverseList(matchResult.match).prev;
+
+        matchResult.match = [];
+
+        while (item !== null) {
+            switch (item.type) {
+                case STUB:
+                    break;
+
+                case OPEN_SYNTAX:
+                case CLOSE_SYNTAX:
+                    matchResult.match.push({
+                        type: item.type,
+                        syntax: item.syntax
+                    });
+                    break;
+
+                default:
+                    matchResult.match.push({
+                        token: item.token.value,
+                        node: item.token.node
+                    });
+                    break;
+            }
+
+            item = item.prev;
+        }
+    }
+
+    return matchResult;
+}
+
+function matchAsTree(tokens, matchGraph, syntaxes) {
+    var matchResult = internalMatch(tokens, matchGraph, syntaxes || {});
+
+    if (matchResult.match === null) {
+        return matchResult;
+    }
+
+    var item = matchResult.match;
+    var host = matchResult.match = {
+        syntax: matchGraph.syntax || null,
+        match: []
+    };
+    var hostStack = [host];
+
+    // revert a list and start with 2nd item since 1st is a stub item
+    item = reverseList(item).prev;
+
+    // build a tree
+    while (item !== null) {
+        switch (item.type) {
+            case OPEN_SYNTAX:
+                host.match.push(host = {
+                    syntax: item.syntax,
+                    match: []
+                });
+                hostStack.push(host);
+                break;
+
+            case CLOSE_SYNTAX:
+                hostStack.pop();
+                host = hostStack[hostStack.length - 1];
+                break;
+
+            default:
+                host.match.push({
+                    syntax: item.syntax || null,
+                    token: item.token.value,
+                    node: item.token.node
+                });
+        }
+
+        item = item.prev;
+    }
+
+    return matchResult;
+}
+
+module.exports = {
+    matchAsList: matchAsList,
+    matchAsTree: matchAsTree,
+    getTotalIterationCount: function() {
+        return totalIterationCount;
+    }
+};
diff --git a/node_modules/css-tree/lib/lexer/prepare-tokens.js b/node_modules/css-tree/lib/lexer/prepare-tokens.js
new file mode 100644
index 0000000..0a9d65e
--- /dev/null
+++ b/node_modules/css-tree/lib/lexer/prepare-tokens.js
@@ -0,0 +1,73 @@
+var tokenize = require('../tokenizer');
+var TokenStream = require('../common/TokenStream');
+var tokenStream = new TokenStream();
+var astToTokens = {
+    decorator: function(handlers) {
+        var curNode = null;
+        var prev = { len: 0, node: null };
+        var nodes = [prev];
+        var buffer = '';
+
+        return {
+            children: handlers.children,
+            node: function(node) {
+                var tmp = curNode;
+                curNode = node;
+                handlers.node.call(this, node);
+                curNode = tmp;
+            },
+            chunk: function(chunk) {
+                buffer += chunk;
+                if (prev.node !== curNode) {
+                    nodes.push({
+                        len: chunk.length,
+                        node: curNode
+                    });
+                } else {
+                    prev.len += chunk.length;
+                }
+            },
+            result: function() {
+                return prepareTokens(buffer, nodes);
+            }
+        };
+    }
+};
+
+function prepareTokens(str, nodes) {
+    var tokens = [];
+    var nodesOffset = 0;
+    var nodesIndex = 0;
+    var currentNode = nodes ? nodes[nodesIndex].node : null;
+
+    tokenize(str, tokenStream);
+
+    while (!tokenStream.eof) {
+        if (nodes) {
+            while (nodesIndex < nodes.length && nodesOffset + nodes[nodesIndex].len <= tokenStream.tokenStart) {
+                nodesOffset += nodes[nodesIndex++].len;
+                currentNode = nodes[nodesIndex].node;
+            }
+        }
+
+        tokens.push({
+            type: tokenStream.tokenType,
+            value: tokenStream.getTokenValue(),
+            index: tokenStream.tokenIndex, // TODO: remove it, temporary solution
+            balance: tokenStream.balance[tokenStream.tokenIndex], // TODO: remove it, temporary solution
+            node: currentNode
+        });
+        tokenStream.next();
+        // console.log({ ...tokens[tokens.length - 1], node: undefined });
+    }
+
+    return tokens;
+}
+
+module.exports = function(value, syntax) {
+    if (typeof value === 'string') {
+        return prepareTokens(value, null);
+    }
+
+    return syntax.generate(value, astToTokens);
+};
diff --git a/node_modules/css-tree/lib/lexer/search.js b/node_modules/css-tree/lib/lexer/search.js
new file mode 100644
index 0000000..7e270ab
--- /dev/null
+++ b/node_modules/css-tree/lib/lexer/search.js
@@ -0,0 +1,65 @@
+var List = require('../common/List');
+
+function getFirstMatchNode(matchNode) {
+    if ('node' in matchNode) {
+        return matchNode.node;
+    }
+
+    return getFirstMatchNode(matchNode.match[0]);
+}
+
+function getLastMatchNode(matchNode) {
+    if ('node' in matchNode) {
+        return matchNode.node;
+    }
+
+    return getLastMatchNode(matchNode.match[matchNode.match.length - 1]);
+}
+
+function matchFragments(lexer, ast, match, type, name) {
+    function findFragments(matchNode) {
+        if (matchNode.syntax !== null &&
+            matchNode.syntax.type === type &&
+            matchNode.syntax.name === name) {
+            var start = getFirstMatchNode(matchNode);
+            var end = getLastMatchNode(matchNode);
+
+            lexer.syntax.walk(ast, function(node, item, list) {
+                if (node === start) {
+                    var nodes = new List();
+
+                    do {
+                        nodes.appendData(item.data);
+
+                        if (item.data === end) {
+                            break;
+                        }
+
+                        item = item.next;
+                    } while (item !== null);
+
+                    fragments.push({
+                        parent: list,
+                        nodes: nodes
+                    });
+                }
+            });
+        }
+
+        if (Array.isArray(matchNode.match)) {
+            matchNode.match.forEach(findFragments);
+        }
+    }
+
+    var fragments = [];
+
+    if (match.matched !== null) {
+        findFragments(match.matched);
+    }
+
+    return fragments;
+}
+
+module.exports = {
+    matchFragments: matchFragments
+};
diff --git a/node_modules/css-tree/lib/lexer/structure.js b/node_modules/css-tree/lib/lexer/structure.js
new file mode 100644
index 0000000..e1239dd
--- /dev/null
+++ b/node_modules/css-tree/lib/lexer/structure.js
@@ -0,0 +1,163 @@
+var List = require('../common/List');
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+function isValidNumber(value) {
+    // Number.isInteger(value) && value >= 0
+    return (
+        typeof value === 'number' &&
+        isFinite(value) &&
+        Math.floor(value) === value &&
+        value >= 0
+    );
+}
+
+function isValidLocation(loc) {
+    return (
+        Boolean(loc) &&
+        isValidNumber(loc.offset) &&
+        isValidNumber(loc.line) &&
+        isValidNumber(loc.column)
+    );
+}
+
+function createNodeStructureChecker(type, fields) {
+    return function checkNode(node, warn) {
+        if (!node || node.constructor !== Object) {
+            return warn(node, 'Type of node should be an Object');
+        }
+
+        for (var key in node) {
+            var valid = true;
+
+            if (hasOwnProperty.call(node, key) === false) {
+                continue;
+            }
+
+            if (key === 'type') {
+                if (node.type !== type) {
+                    warn(node, 'Wrong node type `' + node.type + '`, expected `' + type + '`');
+                }
+            } else if (key === 'loc') {
+                if (node.loc === null) {
+                    continue;
+                } else if (node.loc && node.loc.constructor === Object) {
+                    if (typeof node.loc.source !== 'string') {
+                        key += '.source';
+                    } else if (!isValidLocation(node.loc.start)) {
+                        key += '.start';
+                    } else if (!isValidLocation(node.loc.end)) {
+                        key += '.end';
+                    } else {
+                        continue;
+                    }
+                }
+
+                valid = false;
+            } else if (fields.hasOwnProperty(key)) {
+                for (var i = 0, valid = false; !valid && i < fields[key].length; i++) {
+                    var fieldType = fields[key][i];
+
+                    switch (fieldType) {
+                        case String:
+                            valid = typeof node[key] === 'string';
+                            break;
+
+                        case Boolean:
+                            valid = typeof node[key] === 'boolean';
+                            break;
+
+                        case null:
+                            valid = node[key] === null;
+                            break;
+
+                        default:
+                            if (typeof fieldType === 'string') {
+                                valid = node[key] && node[key].type === fieldType;
+                            } else if (Array.isArray(fieldType)) {
+                                valid = node[key] instanceof List;
+                            }
+                    }
+                }
+            } else {
+                warn(node, 'Unknown field `' + key + '` for ' + type + ' node type');
+            }
+
+            if (!valid) {
+                warn(node, 'Bad value for `' + type + '.' + key + '`');
+            }
+        }
+
+        for (var key in fields) {
+            if (hasOwnProperty.call(fields, key) &&
+                hasOwnProperty.call(node, key) === false) {
+                warn(node, 'Field `' + type + '.' + key + '` is missed');
+            }
+        }
+    };
+}
+
+function processStructure(name, nodeType) {
+    var structure = nodeType.structure;
+    var fields = {
+        type: String,
+        loc: true
+    };
+    var docs = {
+        type: '"' + name + '"'
+    };
+
+    for (var key in structure) {
+        if (hasOwnProperty.call(structure, key) === false) {
+            continue;
+        }
+
+        var docsTypes = [];
+        var fieldTypes = fields[key] = Array.isArray(structure[key])
+            ? structure[key].slice()
+            : [structure[key]];
+
+        for (var i = 0; i < fieldTypes.length; i++) {
+            var fieldType = fieldTypes[i];
+            if (fieldType === String || fieldType === Boolean) {
+                docsTypes.push(fieldType.name);
+            } else if (fieldType === null) {
+                docsTypes.push('null');
+            } else if (typeof fieldType === 'string') {
+                docsTypes.push('<' + fieldType + '>');
+            } else if (Array.isArray(fieldType)) {
+                docsTypes.push('List'); // TODO: use type enum
+            } else {
+                throw new Error('Wrong value `' + fieldType + '` in `' + name + '.' + key + '` structure definition');
+            }
+        }
+
+        docs[key] = docsTypes.join(' | ');
+    }
+
+    return {
+        docs: docs,
+        check: createNodeStructureChecker(name, fields)
+    };
+}
+
+module.exports = {
+    getStructureFromConfig: function(config) {
+        var structure = {};
+
+        if (config.node) {
+            for (var name in config.node) {
+                if (hasOwnProperty.call(config.node, name)) {
+                    var nodeType = config.node[name];
+
+                    if (nodeType.structure) {
+                        structure[name] = processStructure(name, nodeType);
+                    } else {
+                        throw new Error('Missed `structure` field in `' + name + '` node type definition');
+                    }
+                }
+            }
+        }
+
+        return structure;
+    }
+};
diff --git a/node_modules/css-tree/lib/lexer/trace.js b/node_modules/css-tree/lib/lexer/trace.js
new file mode 100644
index 0000000..3a45e53
--- /dev/null
+++ b/node_modules/css-tree/lib/lexer/trace.js
@@ -0,0 +1,79 @@
+function getTrace(node) {
+    function shouldPutToTrace(syntax) {
+        if (syntax === null) {
+            return false;
+        }
+
+        return (
+            syntax.type === 'Type' ||
+            syntax.type === 'Property' ||
+            syntax.type === 'Keyword'
+        );
+    }
+
+    function hasMatch(matchNode) {
+        if (Array.isArray(matchNode.match)) {
+            // use for-loop for better perfomance
+            for (var i = 0; i < matchNode.match.length; i++) {
+                if (hasMatch(matchNode.match[i])) {
+                    if (shouldPutToTrace(matchNode.syntax)) {
+                        result.unshift(matchNode.syntax);
+                    }
+
+                    return true;
+                }
+            }
+        } else if (matchNode.node === node) {
+            result = shouldPutToTrace(matchNode.syntax)
+                ? [matchNode.syntax]
+                : [];
+
+            return true;
+        }
+
+        return false;
+    }
+
+    var result = null;
+
+    if (this.matched !== null) {
+        hasMatch(this.matched);
+    }
+
+    return result;
+}
+
+function testNode(match, node, fn) {
+    var trace = getTrace.call(match, node);
+
+    if (trace === null) {
+        return false;
+    }
+
+    return trace.some(fn);
+}
+
+function isType(node, type) {
+    return testNode(this, node, function(matchNode) {
+        return matchNode.type === 'Type' && matchNode.name === type;
+    });
+}
+
+function isProperty(node, property) {
+    return testNode(this, node, function(matchNode) {
+        return matchNode.type === 'Property' && matchNode.name === property;
+    });
+}
+
+function isKeyword(node) {
+    return testNode(this, node, function(matchNode) {
+        return matchNode.type === 'Keyword';
+    });
+}
+
+module.exports = {
+    getTrace: getTrace,
+    isType: isType,
+    isProperty: isProperty,
+    isKeyword: isKeyword
+};
diff --git a/node_modules/css-tree/lib/parser/create.js b/node_modules/css-tree/lib/parser/create.js
new file mode 100644
index 0000000..a01f625
--- /dev/null
+++ b/node_modules/css-tree/lib/parser/create.js
@@ -0,0 +1,304 @@
+var OffsetToLocation = require('../common/OffsetToLocation');
+var SyntaxError = require('../common/SyntaxError');
+var TokenStream = require('../common/TokenStream');
+var List = require('../common/List');
+var tokenize = require('../tokenizer');
+var constants = require('../tokenizer/const');
+var { findWhiteSpaceStart, cmpStr } = require('../tokenizer/utils');
+var sequence = require('./sequence');
+var noop = function() {};
+
+var TYPE = constants.TYPE;
+var NAME = constants.NAME;
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+var IDENT = TYPE.Ident;
+var FUNCTION = TYPE.Function;
+var URL = TYPE.Url;
+var HASH = TYPE.Hash;
+var PERCENTAGE = TYPE.Percentage;
+var NUMBER = TYPE.Number;
+var NUMBERSIGN = 0x0023; // U+0023 NUMBER SIGN (#)
+var NULL = 0;
+
+function createParseContext(name) {
+    return function() {
+        return this[name]();
+    };
+}
+
+function processConfig(config) {
+    var parserConfig = {
+        context: {},
+        scope: {},
+        atrule: {},
+        pseudo: {}
+    };
+
+    if (config.parseContext) {
+        for (var name in config.parseContext) {
+            switch (typeof config.parseContext[name]) {
+                case 'function':
+                    parserConfig.context[name] = config.parseContext[name];
+                    break;
+
+                case 'string':
+                    parserConfig.context[name] = createParseContext(config.parseContext[name]);
+                    break;
+            }
+        }
+    }
+
+    if (config.scope) {
+        for (var name in config.scope) {
+            parserConfig.scope[name] = config.scope[name];
+        }
+    }
+
+    if (config.atrule) {
+        for (var name in config.atrule) {
+            var atrule = config.atrule[name];
+
+            if (atrule.parse) {
+                parserConfig.atrule[name] = atrule.parse;
+            }
+        }
+    }
+
+    if (config.pseudo) {
+        for (var name in config.pseudo) {
+            var pseudo = config.pseudo[name];
+
+            if (pseudo.parse) {
+                parserConfig.pseudo[name] = pseudo.parse;
+            }
+        }
+    }
+
+    if (config.node) {
+        for (var name in config.node) {
+            parserConfig[name] = config.node[name].parse;
+        }
+    }
+
+    return parserConfig;
+}
+
+module.exports = function createParser(config) {
+    var parser = {
+        scanner: new TokenStream(),
+        locationMap: new OffsetToLocation(),
+
+        filename: '<unknown>',
+        needPositions: false,
+        onParseError: noop,
+        onParseErrorThrow: false,
+        parseAtrulePrelude: true,
+        parseRulePrelude: true,
+        parseValue: true,
+        parseCustomProperty: false,
+
+        readSequence: sequence,
+
+        createList: function() {
+            return new List();
+        },
+        createSingleNodeList: function(node) {
+            return new List().appendData(node);
+        },
+        getFirstListNode: function(list) {
+            return list && list.first();
+        },
+        getLastListNode: function(list) {
+            return list.last();
+        },
+
+        parseWithFallback: function(consumer, fallback) {
+            var startToken = this.scanner.tokenIndex;
+
+            try {
+                return consumer.call(this);
+            } catch (e) {
+                if (this.onParseErrorThrow) {
+                    throw e;
+                }
+
+                var fallbackNode = fallback.call(this, startToken);
+
+                this.onParseErrorThrow = true;
+                this.onParseError(e, fallbackNode);
+                this.onParseErrorThrow = false;
+
+                return fallbackNode;
+            }
+        },
+
+        lookupNonWSType: function(offset) {
+            do {
+                var type = this.scanner.lookupType(offset++);
+                if (type !== WHITESPACE) {
+                    return type;
+                }
+            } while (type !== NULL);
+
+            return NULL;
+        },
+
+        eat: function(tokenType) {
+            if (this.scanner.tokenType !== tokenType) {
+                var offset = this.scanner.tokenStart;
+                var message = NAME[tokenType] + ' is expected';
+
+                // tweak message and offset
+                switch (tokenType) {
+                    case IDENT:
+                        // when identifier is expected but there is a function or url
+                        if (this.scanner.tokenType === FUNCTION || this.scanner.tokenType === URL) {
+                            offset = this.scanner.tokenEnd - 1;
+                            message = 'Identifier is expected but function found';
+                        } else {
+                            message = 'Identifier is expected';
+                        }
+                        break;
+
+                    case HASH:
+                        if (this.scanner.isDelim(NUMBERSIGN)) {
+                            this.scanner.next();
+                            offset++;
+                            message = 'Name is expected';
+                        }
+                        break;
+
+                    case PERCENTAGE:
+                        if (this.scanner.tokenType === NUMBER) {
+                            offset = this.scanner.tokenEnd;
+                            message = 'Percent sign is expected';
+                        }
+                        break;
+
+                    default:
+                        // when test type is part of another token show error for current position + 1
+                        // e.g. eat(HYPHENMINUS) will fail on "-foo", but pointing on "-" is odd
+                        if (this.scanner.source.charCodeAt(this.scanner.tokenStart) === tokenType) {
+                            offset = offset + 1;
+                        }
+                }
+
+                this.error(message, offset);
+            }
+
+            this.scanner.next();
+        },
+
+        consume: function(tokenType) {
+            var value = this.scanner.getTokenValue();
+
+            this.eat(tokenType);
+
+            return value;
+        },
+        consumeFunctionName: function() {
+            var name = this.scanner.source.substring(this.scanner.tokenStart, this.scanner.tokenEnd - 1);
+
+            this.eat(FUNCTION);
+
+            return name;
+        },
+
+        getLocation: function(start, end) {
+            if (this.needPositions) {
+                return this.locationMap.getLocationRange(
+                    start,
+                    end,
+                    this.filename
+                );
+            }
+
+            return null;
+        },
+        getLocationFromList: function(list) {
+            if (this.needPositions) {
+                var head = this.getFirstListNode(list);
+                var tail = this.getLastListNode(list);
+                return this.locationMap.getLocationRange(
+                    head !== null ? head.loc.start.offset - this.locationMap.startOffset : this.scanner.tokenStart,
+                    tail !== null ? tail.loc.end.offset - this.locationMap.startOffset : this.scanner.tokenStart,
+                    this.filename
+                );
+            }
+
+            return null;
+        },
+
+        error: function(message, offset) {
+            var location = typeof offset !== 'undefined' && offset < this.scanner.source.length
+                ? this.locationMap.getLocation(offset)
+                : this.scanner.eof
+                    ? this.locationMap.getLocation(findWhiteSpaceStart(this.scanner.source, this.scanner.source.length - 1))
+                    : this.locationMap.getLocation(this.scanner.tokenStart);
+
+            throw new SyntaxError(
+                message || 'Unexpected input',
+                this.scanner.source,
+                location.offset,
+                location.line,
+                location.column
+            );
+        }
+    };
+
+    config = processConfig(config || {});
+    for (var key in config) {
+        parser[key] = config[key];
+    }
+
+    return function(source, options) {
+        options = options || {};
+
+        var context = options.context || 'default';
+        var onComment = options.onComment;
+        var ast;
+
+        tokenize(source, parser.scanner);
+        parser.locationMap.setSource(
+            source,
+            options.offset,
+            options.line,
+            options.column
+        );
+
+        parser.filename = options.filename || '<unknown>';
+        parser.needPositions = Boolean(options.positions);
+        parser.onParseError = typeof options.onParseError === 'function' ? options.onParseError : noop;
+        parser.onParseErrorThrow = false;
+        parser.parseAtrulePrelude = 'parseAtrulePrelude' in options ? Boolean(options.parseAtrulePrelude) : true;
+        parser.parseRulePrelude = 'parseRulePrelude' in options ? Boolean(options.parseRulePrelude) : true;
+        parser.parseValue = 'parseValue' in options ? Boolean(options.parseValue) : true;
+        parser.parseCustomProperty = 'parseCustomProperty' in options ? Boolean(options.parseCustomProperty) : false;
+
+        if (!parser.context.hasOwnProperty(context)) {
+            throw new Error('Unknown context `' + context + '`');
+        }
+
+        if (typeof onComment === 'function') {
+            parser.scanner.forEachToken((type, start, end) => {
+                if (type === COMMENT) {
+                    const loc = parser.getLocation(start, end);
+                    const value = cmpStr(source, end - 2, end, '*/')
+                        ? source.slice(start + 2, end - 2)
+                        : source.slice(start + 2, end);
+
+                    onComment(value, loc);
+                }
+            });
+        }
+
+        ast = parser.context[context].call(parser, options);
+
+        if (!parser.scanner.eof) {
+            parser.error();
+        }
+
+        return ast;
+    };
+};
diff --git a/node_modules/css-tree/lib/parser/index.js b/node_modules/css-tree/lib/parser/index.js
new file mode 100644
index 0000000..1cba9c3
--- /dev/null
+++ b/node_modules/css-tree/lib/parser/index.js
@@ -0,0 +1,4 @@
+var createParser = require('./create');
+var config = require('../syntax/config/parser');
+
+module.exports = createParser(config);
diff --git a/node_modules/css-tree/lib/parser/sequence.js b/node_modules/css-tree/lib/parser/sequence.js
new file mode 100644
index 0000000..44647e5
--- /dev/null
+++ b/node_modules/css-tree/lib/parser/sequence.js
@@ -0,0 +1,54 @@
+var TYPE = require('../tokenizer').TYPE;
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+
+module.exports = function readSequence(recognizer) {
+    var children = this.createList();
+    var child = null;
+    var context = {
+        recognizer: recognizer,
+        space: null,
+        ignoreWS: false,
+        ignoreWSAfter: false
+    };
+
+    this.scanner.skipSC();
+
+    while (!this.scanner.eof) {
+        switch (this.scanner.tokenType) {
+            case COMMENT:
+                this.scanner.next();
+                continue;
+
+            case WHITESPACE:
+                if (context.ignoreWS) {
+                    this.scanner.next();
+                } else {
+                    context.space = this.WhiteSpace();
+                }
+                continue;
+        }
+
+        child = recognizer.getNode.call(this, context);
+
+        if (child === undefined) {
+            break;
+        }
+
+        if (context.space !== null) {
+            children.push(context.space);
+            context.space = null;
+        }
+
+        children.push(child);
+
+        if (context.ignoreWSAfter) {
+            context.ignoreWSAfter = false;
+            context.ignoreWS = true;
+        } else {
+            context.ignoreWS = false;
+        }
+    }
+
+    return children;
+};
diff --git a/node_modules/css-tree/lib/syntax/atrule/font-face.js b/node_modules/css-tree/lib/syntax/atrule/font-face.js
new file mode 100644
index 0000000..ea33ad9
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/atrule/font-face.js
@@ -0,0 +1,8 @@
+module.exports = {
+    parse: {
+        prelude: null,
+        block: function() {
+            return this.Block(true);
+        }
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/atrule/import.js b/node_modules/css-tree/lib/syntax/atrule/import.js
new file mode 100644
index 0000000..58bda97
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/atrule/import.js
@@ -0,0 +1,40 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var STRING = TYPE.String;
+var IDENT = TYPE.Ident;
+var URL = TYPE.Url;
+var FUNCTION = TYPE.Function;
+var LEFTPARENTHESIS = TYPE.LeftParenthesis;
+
+module.exports = {
+    parse: {
+        prelude: function() {
+            var children = this.createList();
+
+            this.scanner.skipSC();
+
+            switch (this.scanner.tokenType) {
+                case STRING:
+                    children.push(this.String());
+                    break;
+
+                case URL:
+                case FUNCTION:
+                    children.push(this.Url());
+                    break;
+
+                default:
+                    this.error('String or url() is expected');
+            }
+
+            if (this.lookupNonWSType(0) === IDENT ||
+                this.lookupNonWSType(0) === LEFTPARENTHESIS) {
+                children.push(this.WhiteSpace());
+                children.push(this.MediaQueryList());
+            }
+
+            return children;
+        },
+        block: null
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/atrule/index.js b/node_modules/css-tree/lib/syntax/atrule/index.js
new file mode 100644
index 0000000..5098cfb
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/atrule/index.js
@@ -0,0 +1,7 @@
+module.exports = {
+    'font-face': require('./font-face'),
+    'import': require('./import'),
+    'media': require('./media'),
+    'page': require('./page'),
+    'supports': require('./supports')
+};
diff --git a/node_modules/css-tree/lib/syntax/atrule/media.js b/node_modules/css-tree/lib/syntax/atrule/media.js
new file mode 100644
index 0000000..f148346
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/atrule/media.js
@@ -0,0 +1,12 @@
+module.exports = {
+    parse: {
+        prelude: function() {
+            return this.createSingleNodeList(
+                this.MediaQueryList()
+            );
+        },
+        block: function() {
+            return this.Block(false);
+        }
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/atrule/page.js b/node_modules/css-tree/lib/syntax/atrule/page.js
new file mode 100644
index 0000000..aa2229f
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/atrule/page.js
@@ -0,0 +1,12 @@
+module.exports = {
+    parse: {
+        prelude: function() {
+            return this.createSingleNodeList(
+                this.SelectorList()
+            );
+        },
+        block: function() {
+            return this.Block(true);
+        }
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/atrule/supports.js b/node_modules/css-tree/lib/syntax/atrule/supports.js
new file mode 100644
index 0000000..75fa1d8
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/atrule/supports.js
@@ -0,0 +1,89 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+var IDENT = TYPE.Ident;
+var FUNCTION = TYPE.Function;
+var COLON = TYPE.Colon;
+var LEFTPARENTHESIS = TYPE.LeftParenthesis;
+
+function consumeRaw() {
+    return this.createSingleNodeList(
+        this.Raw(this.scanner.tokenIndex, null, false)
+    );
+}
+
+function parentheses() {
+    this.scanner.skipSC();
+
+    if (this.scanner.tokenType === IDENT &&
+        this.lookupNonWSType(1) === COLON) {
+        return this.createSingleNodeList(
+            this.Declaration()
+        );
+    }
+
+    return readSequence.call(this);
+}
+
+function readSequence() {
+    var children = this.createList();
+    var space = null;
+    var child;
+
+    this.scanner.skipSC();
+
+    scan:
+    while (!this.scanner.eof) {
+        switch (this.scanner.tokenType) {
+            case WHITESPACE:
+                space = this.WhiteSpace();
+                continue;
+
+            case COMMENT:
+                this.scanner.next();
+                continue;
+
+            case FUNCTION:
+                child = this.Function(consumeRaw, this.scope.AtrulePrelude);
+                break;
+
+            case IDENT:
+                child = this.Identifier();
+                break;
+
+            case LEFTPARENTHESIS:
+                child = this.Parentheses(parentheses, this.scope.AtrulePrelude);
+                break;
+
+            default:
+                break scan;
+        }
+
+        if (space !== null) {
+            children.push(space);
+            space = null;
+        }
+
+        children.push(child);
+    }
+
+    return children;
+}
+
+module.exports = {
+    parse: {
+        prelude: function() {
+            var children = readSequence.call(this);
+
+            if (this.getFirstListNode(children) === null) {
+                this.error('Condition is expected');
+            }
+
+            return children;
+        },
+        block: function() {
+            return this.Block(false);
+        }
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/config/lexer.js b/node_modules/css-tree/lib/syntax/config/lexer.js
new file mode 100644
index 0000000..2c58b0f
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/config/lexer.js
@@ -0,0 +1,9 @@
+var data = require('../../../data');
+
+module.exports = {
+    generic: true,
+    types: data.types,
+    atrules: data.atrules,
+    properties: data.properties,
+    node: require('../node')
+};
diff --git a/node_modules/css-tree/lib/syntax/config/mix.js b/node_modules/css-tree/lib/syntax/config/mix.js
new file mode 100644
index 0000000..8eb57ec
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/config/mix.js
@@ -0,0 +1,140 @@
+const hasOwnProperty = Object.prototype.hasOwnProperty;
+const shape = {
+    generic: true,
+    types: appendOrAssign,
+    atrules: {
+        prelude: appendOrAssignOrNull,
+        descriptors: appendOrAssignOrNull
+    },
+    properties: appendOrAssign,
+    parseContext: assign,
+    scope: deepAssign,
+    atrule: ['parse'],
+    pseudo: ['parse'],
+    node: ['name', 'structure', 'parse', 'generate', 'walkContext']
+};
+
+function isObject(value) {
+    return value && value.constructor === Object;
+}
+
+function copy(value) {
+    return isObject(value)
+        ? Object.assign({}, value)
+        : value;
+}
+
+function assign(dest, src) {
+    return Object.assign(dest, src);
+}
+
+function deepAssign(dest, src) {
+    for (const key in src) {
+        if (hasOwnProperty.call(src, key)) {
+            if (isObject(dest[key])) {
+                deepAssign(dest[key], copy(src[key]));
+            } else {
+                dest[key] = copy(src[key]);
+            }
+        }
+    }
+
+    return dest;
+}
+
+function append(a, b) {
+    if (typeof b === 'string' && /^\s*\|/.test(b)) {
+        return typeof a === 'string'
+            ? a + b
+            : b.replace(/^\s*\|\s*/, '');
+    }
+
+    return b || null;
+}
+
+function appendOrAssign(a, b) {
+    if (typeof b === 'string') {
+        return append(a, b);
+    }
+
+    const result = Object.assign({}, a);
+    for (let key in b) {
+        if (hasOwnProperty.call(b, key)) {
+            result[key] = append(hasOwnProperty.call(a, key) ? a[key] : undefined, b[key]);
+        }
+    }
+
+    return result;
+}
+
+function appendOrAssignOrNull(a, b) {
+    const result = appendOrAssign(a, b);
+
+    return !isObject(result) || Object.keys(result).length
+        ? result
+        : null;
+}
+
+function mix(dest, src, shape) {
+    for (const key in shape) {
+        if (hasOwnProperty.call(shape, key) === false) {
+            continue;
+        }
+
+        if (shape[key] === true) {
+            if (key in src) {
+                if (hasOwnProperty.call(src, key)) {
+                    dest[key] = copy(src[key]);
+                }
+            }
+        } else if (shape[key]) {
+            if (typeof shape[key] === 'function') {
+                const fn = shape[key];
+                dest[key] = fn({}, dest[key]);
+                dest[key] = fn(dest[key] || {}, src[key]);
+            } else if (isObject(shape[key])) {
+                const result = {};
+
+                for (let name in dest[key]) {
+                    result[name] = mix({}, dest[key][name], shape[key]);
+                }
+
+                for (let name in src[key]) {
+                    result[name] = mix(result[name] || {}, src[key][name], shape[key]);
+                }
+
+                dest[key] = result;
+            } else if (Array.isArray(shape[key])) {
+                const res = {};
+                const innerShape = shape[key].reduce(function(s, k) {
+                    s[k] = true;
+                    return s;
+                }, {});
+
+                for (const [name, value] of Object.entries(dest[key] || {})) {
+                    res[name] = {};
+                    if (value) {
+                        mix(res[name], value, innerShape);
+                    }
+                }
+
+                for (const name in src[key]) {
+                    if (hasOwnProperty.call(src[key], name)) {
+                        if (!res[name]) {
+                            res[name] = {};
+                        }
+
+                        if (src[key] && src[key][name]) {
+                            mix(res[name], src[key][name], innerShape);
+                        }
+                    }
+                }
+
+                dest[key] = res;
+            }
+        }
+    }
+    return dest;
+}
+
+module.exports = (dest, src) => mix(dest, src, shape);
diff --git a/node_modules/css-tree/lib/syntax/config/parser.js b/node_modules/css-tree/lib/syntax/config/parser.js
new file mode 100644
index 0000000..88d2921
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/config/parser.js
@@ -0,0 +1,25 @@
+module.exports = {
+    parseContext: {
+        default: 'StyleSheet',
+        stylesheet: 'StyleSheet',
+        atrule: 'Atrule',
+        atrulePrelude: function(options) {
+            return this.AtrulePrelude(options.atrule ? String(options.atrule) : null);
+        },
+        mediaQueryList: 'MediaQueryList',
+        mediaQuery: 'MediaQuery',
+        rule: 'Rule',
+        selectorList: 'SelectorList',
+        selector: 'Selector',
+        block: function() {
+            return this.Block(true);
+        },
+        declarationList: 'DeclarationList',
+        declaration: 'Declaration',
+        value: 'Value'
+    },
+    scope: require('../scope'),
+    atrule: require('../atrule'),
+    pseudo: require('../pseudo'),
+    node: require('../node')
+};
diff --git a/node_modules/css-tree/lib/syntax/config/walker.js b/node_modules/css-tree/lib/syntax/config/walker.js
new file mode 100644
index 0000000..3a030de
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/config/walker.js
@@ -0,0 +1,3 @@
+module.exports = {
+    node: require('../node')
+};
diff --git a/node_modules/css-tree/lib/syntax/create.js b/node_modules/css-tree/lib/syntax/create.js
new file mode 100644
index 0000000..68b6d16
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/create.js
@@ -0,0 +1,77 @@
+var List = require('../common/List');
+var SyntaxError = require('../common/SyntaxError');
+var TokenStream = require('../common/TokenStream');
+var Lexer = require('../lexer/Lexer');
+var definitionSyntax = require('../definition-syntax');
+var tokenize = require('../tokenizer');
+var createParser = require('../parser/create');
+var createGenerator = require('../generator/create');
+var createConvertor = require('../convertor/create');
+var createWalker = require('../walker/create');
+var clone = require('../utils/clone');
+var names = require('../utils/names');
+var mix = require('./config/mix');
+
+function createSyntax(config) {
+    var parse = createParser(config);
+    var walk = createWalker(config);
+    var generate = createGenerator(config);
+    var convert = createConvertor(walk);
+
+    var syntax = {
+        List: List,
+        SyntaxError: SyntaxError,
+        TokenStream: TokenStream,
+        Lexer: Lexer,
+
+        vendorPrefix: names.vendorPrefix,
+        keyword: names.keyword,
+        property: names.property,
+        isCustomProperty: names.isCustomProperty,
+
+        definitionSyntax: definitionSyntax,
+        lexer: null,
+        createLexer: function(config) {
+            return new Lexer(config, syntax, syntax.lexer.structure);
+        },
+
+        tokenize: tokenize,
+        parse: parse,
+        walk: walk,
+        generate: generate,
+
+        find: walk.find,
+        findLast: walk.findLast,
+        findAll: walk.findAll,
+
+        clone: clone,
+        fromPlainObject: convert.fromPlainObject,
+        toPlainObject: convert.toPlainObject,
+
+        createSyntax: function(config) {
+            return createSyntax(mix({}, config));
+        },
+        fork: function(extension) {
+            var base = mix({}, config); // copy of config
+            return createSyntax(
+                typeof extension === 'function'
+                    ? extension(base, Object.assign)
+                    : mix(base, extension)
+            );
+        }
+    };
+
+    syntax.lexer = new Lexer({
+        generic: true,
+        types: config.types,
+        atrules: config.atrules,
+        properties: config.properties,
+        node: config.node
+    }, syntax);
+
+    return syntax;
+};
+
+exports.create = function(config) {
+    return createSyntax(mix({}, config));
+};
diff --git a/node_modules/css-tree/lib/syntax/function/expression.js b/node_modules/css-tree/lib/syntax/function/expression.js
new file mode 100644
index 0000000..e76f631
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/function/expression.js
@@ -0,0 +1,7 @@
+// legacy IE function
+// expression( <any-value> )
+module.exports = function() {
+    return this.createSingleNodeList(
+        this.Raw(this.scanner.tokenIndex, null, false)
+    );
+};
diff --git a/node_modules/css-tree/lib/syntax/function/var.js b/node_modules/css-tree/lib/syntax/function/var.js
new file mode 100644
index 0000000..ba55b48
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/function/var.js
@@ -0,0 +1,43 @@
+var TYPE = require('../../tokenizer').TYPE;
+var rawMode = require('../node/Raw').mode;
+
+var COMMA = TYPE.Comma;
+var WHITESPACE = TYPE.WhiteSpace;
+
+// var( <ident> , <value>? )
+module.exports = function() {
+    var children = this.createList();
+
+    this.scanner.skipSC();
+
+    // NOTE: Don't check more than a first argument is an ident, rest checks are for lexer
+    children.push(this.Identifier());
+
+    this.scanner.skipSC();
+
+    if (this.scanner.tokenType === COMMA) {
+        children.push(this.Operator());
+
+        const startIndex = this.scanner.tokenIndex;
+        const value = this.parseCustomProperty
+            ? this.Value(null)
+            : this.Raw(this.scanner.tokenIndex, rawMode.exclamationMarkOrSemicolon, false);
+
+        if (value.type === 'Value' && value.children.isEmpty()) {
+            for (let offset = startIndex - this.scanner.tokenIndex; offset <= 0; offset++) {
+                if (this.scanner.lookupType(offset) === WHITESPACE) {
+                    value.children.appendData({
+                        type: 'WhiteSpace',
+                        loc: null,
+                        value: ' '
+                    });
+                    break;
+                }
+            }
+        }
+
+        children.push(value);
+    }
+
+    return children;
+};
diff --git a/node_modules/css-tree/lib/syntax/index.js b/node_modules/css-tree/lib/syntax/index.js
new file mode 100644
index 0000000..065ea04
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/index.js
@@ -0,0 +1,21 @@
+function merge() {
+    var dest = {};
+
+    for (var i = 0; i < arguments.length; i++) {
+        var src = arguments[i];
+        for (var key in src) {
+            dest[key] = src[key];
+        }
+    }
+
+    return dest;
+}
+
+module.exports = require('./create').create(
+    merge(
+        require('./config/lexer'),
+        require('./config/parser'),
+        require('./config/walker')
+    )
+);
+module.exports.version = require('../../package.json').version;
diff --git a/node_modules/css-tree/lib/syntax/node/AnPlusB.js b/node_modules/css-tree/lib/syntax/node/AnPlusB.js
new file mode 100644
index 0000000..d33d21a
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/AnPlusB.js
@@ -0,0 +1,297 @@
+var cmpChar = require('../../tokenizer').cmpChar;
+var isDigit = require('../../tokenizer').isDigit;
+var TYPE = require('../../tokenizer').TYPE;
+
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+var IDENT = TYPE.Ident;
+var NUMBER = TYPE.Number;
+var DIMENSION = TYPE.Dimension;
+var PLUSSIGN = 0x002B;    // U+002B PLUS SIGN (+)
+var HYPHENMINUS = 0x002D; // U+002D HYPHEN-MINUS (-)
+var N = 0x006E;           // U+006E LATIN SMALL LETTER N (n)
+var DISALLOW_SIGN = true;
+var ALLOW_SIGN = false;
+
+function checkInteger(offset, disallowSign) {
+    var pos = this.scanner.tokenStart + offset;
+    var code = this.scanner.source.charCodeAt(pos);
+
+    if (code === PLUSSIGN || code === HYPHENMINUS) {
+        if (disallowSign) {
+            this.error('Number sign is not allowed');
+        }
+        pos++;
+    }
+
+    for (; pos < this.scanner.tokenEnd; pos++) {
+        if (!isDigit(this.scanner.source.charCodeAt(pos))) {
+            this.error('Integer is expected', pos);
+        }
+    }
+}
+
+function checkTokenIsInteger(disallowSign) {
+    return checkInteger.call(this, 0, disallowSign);
+}
+
+function expectCharCode(offset, code) {
+    if (!cmpChar(this.scanner.source, this.scanner.tokenStart + offset, code)) {
+        var msg = '';
+
+        switch (code) {
+            case N:
+                msg = 'N is expected';
+                break;
+            case HYPHENMINUS:
+                msg = 'HyphenMinus is expected';
+                break;
+        }
+
+        this.error(msg, this.scanner.tokenStart + offset);
+    }
+}
+
+// ... <signed-integer>
+// ... ['+' | '-'] <signless-integer>
+function consumeB() {
+    var offset = 0;
+    var sign = 0;
+    var type = this.scanner.tokenType;
+
+    while (type === WHITESPACE || type === COMMENT) {
+        type = this.scanner.lookupType(++offset);
+    }
+
+    if (type !== NUMBER) {
+        if (this.scanner.isDelim(PLUSSIGN, offset) ||
+            this.scanner.isDelim(HYPHENMINUS, offset)) {
+            sign = this.scanner.isDelim(PLUSSIGN, offset) ? PLUSSIGN : HYPHENMINUS;
+
+            do {
+                type = this.scanner.lookupType(++offset);
+            } while (type === WHITESPACE || type === COMMENT);
+
+            if (type !== NUMBER) {
+                this.scanner.skip(offset);
+                checkTokenIsInteger.call(this, DISALLOW_SIGN);
+            }
+        } else {
+            return null;
+        }
+    }
+
+    if (offset > 0) {
+        this.scanner.skip(offset);
+    }
+
+    if (sign === 0) {
+        type = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+        if (type !== PLUSSIGN && type !== HYPHENMINUS) {
+            this.error('Number sign is expected');
+        }
+    }
+
+    checkTokenIsInteger.call(this, sign !== 0);
+    return sign === HYPHENMINUS ? '-' + this.consume(NUMBER) : this.consume(NUMBER);
+}
+
+// An+B microsyntax https://www.w3.org/TR/css-syntax-3/#anb
+module.exports = {
+    name: 'AnPlusB',
+    structure: {
+        a: [String, null],
+        b: [String, null]
+    },
+    parse: function() {
+        /* eslint-disable brace-style*/
+        var start = this.scanner.tokenStart;
+        var a = null;
+        var b = null;
+
+        // <integer>
+        if (this.scanner.tokenType === NUMBER) {
+            checkTokenIsInteger.call(this, ALLOW_SIGN);
+            b = this.consume(NUMBER);
+        }
+
+        // -n
+        // -n <signed-integer>
+        // -n ['+' | '-'] <signless-integer>
+        // -n- <signless-integer>
+        // <dashndashdigit-ident>
+        else if (this.scanner.tokenType === IDENT && cmpChar(this.scanner.source, this.scanner.tokenStart, HYPHENMINUS)) {
+            a = '-1';
+
+            expectCharCode.call(this, 1, N);
+
+            switch (this.scanner.getTokenLength()) {
+                // -n
+                // -n <signed-integer>
+                // -n ['+' | '-'] <signless-integer>
+                case 2:
+                    this.scanner.next();
+                    b = consumeB.call(this);
+                    break;
+
+                // -n- <signless-integer>
+                case 3:
+                    expectCharCode.call(this, 2, HYPHENMINUS);
+
+                    this.scanner.next();
+                    this.scanner.skipSC();
+
+                    checkTokenIsInteger.call(this, DISALLOW_SIGN);
+
+                    b = '-' + this.consume(NUMBER);
+                    break;
+
+                // <dashndashdigit-ident>
+                default:
+                    expectCharCode.call(this, 2, HYPHENMINUS);
+                    checkInteger.call(this, 3, DISALLOW_SIGN);
+                    this.scanner.next();
+
+                    b = this.scanner.substrToCursor(start + 2);
+            }
+        }
+
+        // '+'? n
+        // '+'? n <signed-integer>
+        // '+'? n ['+' | '-'] <signless-integer>
+        // '+'? n- <signless-integer>
+        // '+'? <ndashdigit-ident>
+        else if (this.scanner.tokenType === IDENT || (this.scanner.isDelim(PLUSSIGN) && this.scanner.lookupType(1) === IDENT)) {
+            var sign = 0;
+            a = '1';
+
+            // just ignore a plus
+            if (this.scanner.isDelim(PLUSSIGN)) {
+                sign = 1;
+                this.scanner.next();
+            }
+
+            expectCharCode.call(this, 0, N);
+
+            switch (this.scanner.getTokenLength()) {
+                // '+'? n
+                // '+'? n <signed-integer>
+                // '+'? n ['+' | '-'] <signless-integer>
+                case 1:
+                    this.scanner.next();
+                    b = consumeB.call(this);
+                    break;
+
+                // '+'? n- <signless-integer>
+                case 2:
+                    expectCharCode.call(this, 1, HYPHENMINUS);
+
+                    this.scanner.next();
+                    this.scanner.skipSC();
+
+                    checkTokenIsInteger.call(this, DISALLOW_SIGN);
+
+                    b = '-' + this.consume(NUMBER);
+                    break;
+
+                // '+'? <ndashdigit-ident>
+                default:
+                    expectCharCode.call(this, 1, HYPHENMINUS);
+                    checkInteger.call(this, 2, DISALLOW_SIGN);
+                    this.scanner.next();
+
+                    b = this.scanner.substrToCursor(start + sign + 1);
+            }
+        }
+
+        // <ndashdigit-dimension>
+        // <ndash-dimension> <signless-integer>
+        // <n-dimension>
+        // <n-dimension> <signed-integer>
+        // <n-dimension> ['+' | '-'] <signless-integer>
+        else if (this.scanner.tokenType === DIMENSION) {
+            var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+            var sign = code === PLUSSIGN || code === HYPHENMINUS;
+
+            for (var i = this.scanner.tokenStart + sign; i < this.scanner.tokenEnd; i++) {
+                if (!isDigit(this.scanner.source.charCodeAt(i))) {
+                    break;
+                }
+            }
+
+            if (i === this.scanner.tokenStart + sign) {
+                this.error('Integer is expected', this.scanner.tokenStart + sign);
+            }
+
+            expectCharCode.call(this, i - this.scanner.tokenStart, N);
+            a = this.scanner.source.substring(start, i);
+
+            // <n-dimension>
+            // <n-dimension> <signed-integer>
+            // <n-dimension> ['+' | '-'] <signless-integer>
+            if (i + 1 === this.scanner.tokenEnd) {
+                this.scanner.next();
+                b = consumeB.call(this);
+            } else {
+                expectCharCode.call(this, i - this.scanner.tokenStart + 1, HYPHENMINUS);
+
+                // <ndash-dimension> <signless-integer>
+                if (i + 2 === this.scanner.tokenEnd) {
+                    this.scanner.next();
+                    this.scanner.skipSC();
+                    checkTokenIsInteger.call(this, DISALLOW_SIGN);
+                    b = '-' + this.consume(NUMBER);
+                }
+                // <ndashdigit-dimension>
+                else {
+                    checkInteger.call(this, i - this.scanner.tokenStart + 2, DISALLOW_SIGN);
+                    this.scanner.next();
+                    b = this.scanner.substrToCursor(i + 1);
+                }
+            }
+        } else {
+            this.error();
+        }
+
+        if (a !== null && a.charCodeAt(0) === PLUSSIGN) {
+            a = a.substr(1);
+        }
+
+        if (b !== null && b.charCodeAt(0) === PLUSSIGN) {
+            b = b.substr(1);
+        }
+
+        return {
+            type: 'AnPlusB',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            a: a,
+            b: b
+        };
+    },
+    generate: function(node) {
+        var a = node.a !== null && node.a !== undefined;
+        var b = node.b !== null && node.b !== undefined;
+
+        if (a) {
+            this.chunk(
+                node.a === '+1' ? '+n' : // eslint-disable-line operator-linebreak, indent
+                node.a ===  '1' ?  'n' : // eslint-disable-line operator-linebreak, indent
+                node.a === '-1' ? '-n' : // eslint-disable-line operator-linebreak, indent
+                node.a + 'n'             // eslint-disable-line operator-linebreak, indent
+            );
+
+            if (b) {
+                b = String(node.b);
+                if (b.charAt(0) === '-' || b.charAt(0) === '+') {
+                    this.chunk(b.charAt(0));
+                    this.chunk(b.substr(1));
+                } else {
+                    this.chunk('+');
+                    this.chunk(b);
+                }
+            }
+        } else {
+            this.chunk(String(node.b));
+        }
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Atrule.js b/node_modules/css-tree/lib/syntax/node/Atrule.js
new file mode 100644
index 0000000..284499f
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Atrule.js
@@ -0,0 +1,107 @@
+var TYPE = require('../../tokenizer').TYPE;
+var rawMode = require('./Raw').mode;
+
+var ATKEYWORD = TYPE.AtKeyword;
+var SEMICOLON = TYPE.Semicolon;
+var LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;
+var RIGHTCURLYBRACKET = TYPE.RightCurlyBracket;
+
+function consumeRaw(startToken) {
+    return this.Raw(startToken, rawMode.leftCurlyBracketOrSemicolon, true);
+}
+
+function isDeclarationBlockAtrule() {
+    for (var offset = 1, type; type = this.scanner.lookupType(offset); offset++) {
+        if (type === RIGHTCURLYBRACKET) {
+            return true;
+        }
+
+        if (type === LEFTCURLYBRACKET ||
+            type === ATKEYWORD) {
+            return false;
+        }
+    }
+
+    return false;
+}
+
+module.exports = {
+    name: 'Atrule',
+    structure: {
+        name: String,
+        prelude: ['AtrulePrelude', 'Raw', null],
+        block: ['Block', null]
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+        var name;
+        var nameLowerCase;
+        var prelude = null;
+        var block = null;
+
+        this.eat(ATKEYWORD);
+
+        name = this.scanner.substrToCursor(start + 1);
+        nameLowerCase = name.toLowerCase();
+        this.scanner.skipSC();
+
+        // parse prelude
+        if (this.scanner.eof === false &&
+            this.scanner.tokenType !== LEFTCURLYBRACKET &&
+            this.scanner.tokenType !== SEMICOLON) {
+            if (this.parseAtrulePrelude) {
+                prelude = this.parseWithFallback(this.AtrulePrelude.bind(this, name), consumeRaw);
+
+                // turn empty AtrulePrelude into null
+                if (prelude.type === 'AtrulePrelude' && prelude.children.head === null) {
+                    prelude = null;
+                }
+            } else {
+                prelude = consumeRaw.call(this, this.scanner.tokenIndex);
+            }
+
+            this.scanner.skipSC();
+        }
+
+        switch (this.scanner.tokenType) {
+            case SEMICOLON:
+                this.scanner.next();
+                break;
+
+            case LEFTCURLYBRACKET:
+                if (this.atrule.hasOwnProperty(nameLowerCase) &&
+                    typeof this.atrule[nameLowerCase].block === 'function') {
+                    block = this.atrule[nameLowerCase].block.call(this);
+                } else {
+                    // TODO: should consume block content as Raw?
+                    block = this.Block(isDeclarationBlockAtrule.call(this));
+                }
+
+                break;
+        }
+
+        return {
+            type: 'Atrule',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            name: name,
+            prelude: prelude,
+            block: block
+        };
+    },
+    generate: function(node) {
+        this.chunk('@');
+        this.chunk(node.name);
+
+        if (node.prelude !== null) {
+            this.chunk(' ');
+            this.node(node.prelude);
+        }
+
+        if (node.block) {
+            this.node(node.block);
+        } else {
+            this.chunk(';');
+        }
+    },
+    walkContext: 'atrule'
+};
diff --git a/node_modules/css-tree/lib/syntax/node/AtrulePrelude.js b/node_modules/css-tree/lib/syntax/node/AtrulePrelude.js
new file mode 100644
index 0000000..f9f21ff
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/AtrulePrelude.js
@@ -0,0 +1,51 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var SEMICOLON = TYPE.Semicolon;
+var LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;
+
+module.exports = {
+    name: 'AtrulePrelude',
+    structure: {
+        children: [[]]
+    },
+    parse: function(name) {
+        var children = null;
+
+        if (name !== null) {
+            name = name.toLowerCase();
+        }
+
+        this.scanner.skipSC();
+
+        if (this.atrule.hasOwnProperty(name) &&
+            typeof this.atrule[name].prelude === 'function') {
+            // custom consumer
+            children = this.atrule[name].prelude.call(this);
+        } else {
+            // default consumer
+            children = this.readSequence(this.scope.AtrulePrelude);
+        }
+
+        this.scanner.skipSC();
+
+        if (this.scanner.eof !== true &&
+            this.scanner.tokenType !== LEFTCURLYBRACKET &&
+            this.scanner.tokenType !== SEMICOLON) {
+            this.error('Semicolon or block is expected');
+        }
+
+        if (children === null) {
+            children = this.createList();
+        }
+
+        return {
+            type: 'AtrulePrelude',
+            loc: this.getLocationFromList(children),
+            children: children
+        };
+    },
+    generate: function(node) {
+        this.children(node);
+    },
+    walkContext: 'atrulePrelude'
+};
diff --git a/node_modules/css-tree/lib/syntax/node/AttributeSelector.js b/node_modules/css-tree/lib/syntax/node/AttributeSelector.js
new file mode 100644
index 0000000..656446c
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/AttributeSelector.js
@@ -0,0 +1,165 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var STRING = TYPE.String;
+var COLON = TYPE.Colon;
+var LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;
+var RIGHTSQUAREBRACKET = TYPE.RightSquareBracket;
+var DOLLARSIGN = 0x0024;       // U+0024 DOLLAR SIGN ($)
+var ASTERISK = 0x002A;         // U+002A ASTERISK (*)
+var EQUALSSIGN = 0x003D;       // U+003D EQUALS SIGN (=)
+var CIRCUMFLEXACCENT = 0x005E; // U+005E (^)
+var VERTICALLINE = 0x007C;     // U+007C VERTICAL LINE (|)
+var TILDE = 0x007E;            // U+007E TILDE (~)
+
+function getAttributeName() {
+    if (this.scanner.eof) {
+        this.error('Unexpected end of input');
+    }
+
+    var start = this.scanner.tokenStart;
+    var expectIdent = false;
+    var checkColon = true;
+
+    if (this.scanner.isDelim(ASTERISK)) {
+        expectIdent = true;
+        checkColon = false;
+        this.scanner.next();
+    } else if (!this.scanner.isDelim(VERTICALLINE)) {
+        this.eat(IDENT);
+    }
+
+    if (this.scanner.isDelim(VERTICALLINE)) {
+        if (this.scanner.source.charCodeAt(this.scanner.tokenStart + 1) !== EQUALSSIGN) {
+            this.scanner.next();
+            this.eat(IDENT);
+        } else if (expectIdent) {
+            this.error('Identifier is expected', this.scanner.tokenEnd);
+        }
+    } else if (expectIdent) {
+        this.error('Vertical line is expected');
+    }
+
+    if (checkColon && this.scanner.tokenType === COLON) {
+        this.scanner.next();
+        this.eat(IDENT);
+    }
+
+    return {
+        type: 'Identifier',
+        loc: this.getLocation(start, this.scanner.tokenStart),
+        name: this.scanner.substrToCursor(start)
+    };
+}
+
+function getOperator() {
+    var start = this.scanner.tokenStart;
+    var code = this.scanner.source.charCodeAt(start);
+
+    if (code !== EQUALSSIGN &&        // =
+        code !== TILDE &&             // ~=
+        code !== CIRCUMFLEXACCENT &&  // ^=
+        code !== DOLLARSIGN &&        // $=
+        code !== ASTERISK &&          // *=
+        code !== VERTICALLINE         // |=
+    ) {
+        this.error('Attribute selector (=, ~=, ^=, $=, *=, |=) is expected');
+    }
+
+    this.scanner.next();
+
+    if (code !== EQUALSSIGN) {
+        if (!this.scanner.isDelim(EQUALSSIGN)) {
+            this.error('Equal sign is expected');
+        }
+
+        this.scanner.next();
+    }
+
+    return this.scanner.substrToCursor(start);
+}
+
+// '[' <wq-name> ']'
+// '[' <wq-name> <attr-matcher> [ <string-token> | <ident-token> ] <attr-modifier>? ']'
+module.exports = {
+    name: 'AttributeSelector',
+    structure: {
+        name: 'Identifier',
+        matcher: [String, null],
+        value: ['String', 'Identifier', null],
+        flags: [String, null]
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+        var name;
+        var matcher = null;
+        var value = null;
+        var flags = null;
+
+        this.eat(LEFTSQUAREBRACKET);
+        this.scanner.skipSC();
+
+        name = getAttributeName.call(this);
+        this.scanner.skipSC();
+
+        if (this.scanner.tokenType !== RIGHTSQUAREBRACKET) {
+            // avoid case `[name i]`
+            if (this.scanner.tokenType !== IDENT) {
+                matcher = getOperator.call(this);
+
+                this.scanner.skipSC();
+
+                value = this.scanner.tokenType === STRING
+                    ? this.String()
+                    : this.Identifier();
+
+                this.scanner.skipSC();
+            }
+
+            // attribute flags
+            if (this.scanner.tokenType === IDENT) {
+                flags = this.scanner.getTokenValue();
+                this.scanner.next();
+
+                this.scanner.skipSC();
+            }
+        }
+
+        this.eat(RIGHTSQUAREBRACKET);
+
+        return {
+            type: 'AttributeSelector',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            name: name,
+            matcher: matcher,
+            value: value,
+            flags: flags
+        };
+    },
+    generate: function(node) {
+        var flagsPrefix = ' ';
+
+        this.chunk('[');
+        this.node(node.name);
+
+        if (node.matcher !== null) {
+            this.chunk(node.matcher);
+
+            if (node.value !== null) {
+                this.node(node.value);
+
+                // space between string and flags is not required
+                if (node.value.type === 'String') {
+                    flagsPrefix = '';
+                }
+            }
+        }
+
+        if (node.flags !== null) {
+            this.chunk(flagsPrefix);
+            this.chunk(node.flags);
+        }
+
+        this.chunk(']');
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Block.js b/node_modules/css-tree/lib/syntax/node/Block.js
new file mode 100644
index 0000000..b4fc6ba
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Block.js
@@ -0,0 +1,91 @@
+var TYPE = require('../../tokenizer').TYPE;
+var rawMode = require('./Raw').mode;
+
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+var SEMICOLON = TYPE.Semicolon;
+var ATKEYWORD = TYPE.AtKeyword;
+var LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;
+var RIGHTCURLYBRACKET = TYPE.RightCurlyBracket;
+
+function consumeRaw(startToken) {
+    return this.Raw(startToken, null, true);
+}
+function consumeRule() {
+    return this.parseWithFallback(this.Rule, consumeRaw);
+}
+function consumeRawDeclaration(startToken) {
+    return this.Raw(startToken, rawMode.semicolonIncluded, true);
+}
+function consumeDeclaration() {
+    if (this.scanner.tokenType === SEMICOLON) {
+        return consumeRawDeclaration.call(this, this.scanner.tokenIndex);
+    }
+
+    var node = this.parseWithFallback(this.Declaration, consumeRawDeclaration);
+
+    if (this.scanner.tokenType === SEMICOLON) {
+        this.scanner.next();
+    }
+
+    return node;
+}
+
+module.exports = {
+    name: 'Block',
+    structure: {
+        children: [[
+            'Atrule',
+            'Rule',
+            'Declaration'
+        ]]
+    },
+    parse: function(isDeclaration) {
+        var consumer = isDeclaration ? consumeDeclaration : consumeRule;
+
+        var start = this.scanner.tokenStart;
+        var children = this.createList();
+
+        this.eat(LEFTCURLYBRACKET);
+
+        scan:
+        while (!this.scanner.eof) {
+            switch (this.scanner.tokenType) {
+                case RIGHTCURLYBRACKET:
+                    break scan;
+
+                case WHITESPACE:
+                case COMMENT:
+                    this.scanner.next();
+                    break;
+
+                case ATKEYWORD:
+                    children.push(this.parseWithFallback(this.Atrule, consumeRaw));
+                    break;
+
+                default:
+                    children.push(consumer.call(this));
+            }
+        }
+
+        if (!this.scanner.eof) {
+            this.eat(RIGHTCURLYBRACKET);
+        }
+
+        return {
+            type: 'Block',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            children: children
+        };
+    },
+    generate: function(node) {
+        this.chunk('{');
+        this.children(node, function(prev) {
+            if (prev.type === 'Declaration') {
+                this.chunk(';');
+            }
+        });
+        this.chunk('}');
+    },
+    walkContext: 'block'
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Brackets.js b/node_modules/css-tree/lib/syntax/node/Brackets.js
new file mode 100644
index 0000000..a81c474
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Brackets.js
@@ -0,0 +1,34 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;
+var RIGHTSQUAREBRACKET = TYPE.RightSquareBracket;
+
+module.exports = {
+    name: 'Brackets',
+    structure: {
+        children: [[]]
+    },
+    parse: function(readSequence, recognizer) {
+        var start = this.scanner.tokenStart;
+        var children = null;
+
+        this.eat(LEFTSQUAREBRACKET);
+
+        children = readSequence.call(this, recognizer);
+
+        if (!this.scanner.eof) {
+            this.eat(RIGHTSQUAREBRACKET);
+        }
+
+        return {
+            type: 'Brackets',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            children: children
+        };
+    },
+    generate: function(node) {
+        this.chunk('[');
+        this.children(node);
+        this.chunk(']');
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/CDC.js b/node_modules/css-tree/lib/syntax/node/CDC.js
new file mode 100644
index 0000000..885b258
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/CDC.js
@@ -0,0 +1,19 @@
+var CDC = require('../../tokenizer').TYPE.CDC;
+
+module.exports = {
+    name: 'CDC',
+    structure: [],
+    parse: function() {
+        var start = this.scanner.tokenStart;
+
+        this.eat(CDC); // -->
+
+        return {
+            type: 'CDC',
+            loc: this.getLocation(start, this.scanner.tokenStart)
+        };
+    },
+    generate: function() {
+        this.chunk('-->');
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/CDO.js b/node_modules/css-tree/lib/syntax/node/CDO.js
new file mode 100644
index 0000000..f701be7
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/CDO.js
@@ -0,0 +1,19 @@
+var CDO = require('../../tokenizer').TYPE.CDO;
+
+module.exports = {
+    name: 'CDO',
+    structure: [],
+    parse: function() {
+        var start = this.scanner.tokenStart;
+
+        this.eat(CDO); // <!--
+
+        return {
+            type: 'CDO',
+            loc: this.getLocation(start, this.scanner.tokenStart)
+        };
+    },
+    generate: function() {
+        this.chunk('<!--');
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/ClassSelector.js b/node_modules/css-tree/lib/syntax/node/ClassSelector.js
new file mode 100644
index 0000000..c84d69b
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/ClassSelector.js
@@ -0,0 +1,29 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var FULLSTOP = 0x002E; // U+002E FULL STOP (.)
+
+// '.' ident
+module.exports = {
+    name: 'ClassSelector',
+    structure: {
+        name: String
+    },
+    parse: function() {
+        if (!this.scanner.isDelim(FULLSTOP)) {
+            this.error('Full stop is expected');
+        }
+
+        this.scanner.next();
+
+        return {
+            type: 'ClassSelector',
+            loc: this.getLocation(this.scanner.tokenStart - 1, this.scanner.tokenEnd),
+            name: this.consume(IDENT)
+        };
+    },
+    generate: function(node) {
+        this.chunk('.');
+        this.chunk(node.name);
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Combinator.js b/node_modules/css-tree/lib/syntax/node/Combinator.js
new file mode 100644
index 0000000..308ca81
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Combinator.js
@@ -0,0 +1,55 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var PLUSSIGN = 0x002B;        // U+002B PLUS SIGN (+)
+var SOLIDUS = 0x002F;         // U+002F SOLIDUS (/)
+var GREATERTHANSIGN = 0x003E; // U+003E GREATER-THAN SIGN (>)
+var TILDE = 0x007E;           // U+007E TILDE (~)
+
+// + | > | ~ | /deep/
+module.exports = {
+    name: 'Combinator',
+    structure: {
+        name: String
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+        var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+
+        switch (code) {
+            case GREATERTHANSIGN:
+            case PLUSSIGN:
+            case TILDE:
+                this.scanner.next();
+                break;
+
+            case SOLIDUS:
+                this.scanner.next();
+
+                if (this.scanner.tokenType !== IDENT || this.scanner.lookupValue(0, 'deep') === false) {
+                    this.error('Identifier `deep` is expected');
+                }
+
+                this.scanner.next();
+
+                if (!this.scanner.isDelim(SOLIDUS)) {
+                    this.error('Solidus is expected');
+                }
+
+                this.scanner.next();
+                break;
+
+            default:
+                this.error('Combinator is expected');
+        }
+
+        return {
+            type: 'Combinator',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            name: this.scanner.substrToCursor(start)
+        };
+    },
+    generate: function(node) {
+        this.chunk(node.name);
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Comment.js b/node_modules/css-tree/lib/syntax/node/Comment.js
new file mode 100644
index 0000000..9f0e2f4
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Comment.js
@@ -0,0 +1,36 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var COMMENT = TYPE.Comment;
+var ASTERISK = 0x002A;        // U+002A ASTERISK (*)
+var SOLIDUS = 0x002F;         // U+002F SOLIDUS (/)
+
+// '/*' .* '*/'
+module.exports = {
+    name: 'Comment',
+    structure: {
+        value: String
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+        var end = this.scanner.tokenEnd;
+
+        this.eat(COMMENT);
+
+        if ((end - start + 2) >= 2 &&
+            this.scanner.source.charCodeAt(end - 2) === ASTERISK &&
+            this.scanner.source.charCodeAt(end - 1) === SOLIDUS) {
+            end -= 2;
+        }
+
+        return {
+            type: 'Comment',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            value: this.scanner.source.substring(start + 2, end)
+        };
+    },
+    generate: function(node) {
+        this.chunk('/*');
+        this.chunk(node.value);
+        this.chunk('*/');
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Declaration.js b/node_modules/css-tree/lib/syntax/node/Declaration.js
new file mode 100644
index 0000000..0792836
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Declaration.js
@@ -0,0 +1,169 @@
+var isCustomProperty = require('../../utils/names').isCustomProperty;
+var TYPE = require('../../tokenizer').TYPE;
+var rawMode = require('./Raw').mode;
+
+var IDENT = TYPE.Ident;
+var HASH = TYPE.Hash;
+var COLON = TYPE.Colon;
+var SEMICOLON = TYPE.Semicolon;
+var DELIM = TYPE.Delim;
+var WHITESPACE = TYPE.WhiteSpace;
+var EXCLAMATIONMARK = 0x0021; // U+0021 EXCLAMATION MARK (!)
+var NUMBERSIGN = 0x0023;      // U+0023 NUMBER SIGN (#)
+var DOLLARSIGN = 0x0024;      // U+0024 DOLLAR SIGN ($)
+var AMPERSAND = 0x0026;       // U+0026 ANPERSAND (&)
+var ASTERISK = 0x002A;        // U+002A ASTERISK (*)
+var PLUSSIGN = 0x002B;        // U+002B PLUS SIGN (+)
+var SOLIDUS = 0x002F;         // U+002F SOLIDUS (/)
+
+function consumeValueRaw(startToken) {
+    return this.Raw(startToken, rawMode.exclamationMarkOrSemicolon, true);
+}
+
+function consumeCustomPropertyRaw(startToken) {
+    return this.Raw(startToken, rawMode.exclamationMarkOrSemicolon, false);
+}
+
+function consumeValue() {
+    var startValueToken = this.scanner.tokenIndex;
+    var value = this.Value();
+
+    if (value.type !== 'Raw' &&
+        this.scanner.eof === false &&
+        this.scanner.tokenType !== SEMICOLON &&
+        this.scanner.isDelim(EXCLAMATIONMARK) === false &&
+        this.scanner.isBalanceEdge(startValueToken) === false) {
+        this.error();
+    }
+
+    return value;
+}
+
+module.exports = {
+    name: 'Declaration',
+    structure: {
+        important: [Boolean, String],
+        property: String,
+        value: ['Value', 'Raw']
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+        var startToken = this.scanner.tokenIndex;
+        var property = readProperty.call(this);
+        var customProperty = isCustomProperty(property);
+        var parseValue = customProperty ? this.parseCustomProperty : this.parseValue;
+        var consumeRaw = customProperty ? consumeCustomPropertyRaw : consumeValueRaw;
+        var important = false;
+        var value;
+
+        this.scanner.skipSC();
+        this.eat(COLON);
+
+        const valueStart = this.scanner.tokenIndex;
+
+        if (!customProperty) {
+            this.scanner.skipSC();
+        }
+
+        if (parseValue) {
+            value = this.parseWithFallback(consumeValue, consumeRaw);
+        } else {
+            value = consumeRaw.call(this, this.scanner.tokenIndex);
+        }
+
+        if (customProperty && value.type === 'Value' && value.children.isEmpty()) {
+            for (let offset = valueStart - this.scanner.tokenIndex; offset <= 0; offset++) {
+                if (this.scanner.lookupType(offset) === WHITESPACE) {
+                    value.children.appendData({
+                        type: 'WhiteSpace',
+                        loc: null,
+                        value: ' '
+                    });
+                    break;
+                }
+            }
+        }
+
+        if (this.scanner.isDelim(EXCLAMATIONMARK)) {
+            important = getImportant.call(this);
+            this.scanner.skipSC();
+        }
+
+        // Do not include semicolon to range per spec
+        // https://drafts.csswg.org/css-syntax/#declaration-diagram
+
+        if (this.scanner.eof === false &&
+            this.scanner.tokenType !== SEMICOLON &&
+            this.scanner.isBalanceEdge(startToken) === false) {
+            this.error();
+        }
+
+        return {
+            type: 'Declaration',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            important: important,
+            property: property,
+            value: value
+        };
+    },
+    generate: function(node) {
+        this.chunk(node.property);
+        this.chunk(':');
+        this.node(node.value);
+
+        if (node.important) {
+            this.chunk(node.important === true ? '!important' : '!' + node.important);
+        }
+    },
+    walkContext: 'declaration'
+};
+
+function readProperty() {
+    var start = this.scanner.tokenStart;
+    var prefix = 0;
+
+    // hacks
+    if (this.scanner.tokenType === DELIM) {
+        switch (this.scanner.source.charCodeAt(this.scanner.tokenStart)) {
+            case ASTERISK:
+            case DOLLARSIGN:
+            case PLUSSIGN:
+            case NUMBERSIGN:
+            case AMPERSAND:
+                this.scanner.next();
+                break;
+
+            // TODO: not sure we should support this hack
+            case SOLIDUS:
+                this.scanner.next();
+                if (this.scanner.isDelim(SOLIDUS)) {
+                    this.scanner.next();
+                }
+                break;
+        }
+    }
+
+    if (prefix) {
+        this.scanner.skip(prefix);
+    }
+
+    if (this.scanner.tokenType === HASH) {
+        this.eat(HASH);
+    } else {
+        this.eat(IDENT);
+    }
+
+    return this.scanner.substrToCursor(start);
+}
+
+// ! ws* important
+function getImportant() {
+    this.eat(DELIM);
+    this.scanner.skipSC();
+
+    var important = this.consume(IDENT);
+
+    // store original value in case it differ from `important`
+    // for better original source restoring and hacks like `!ie` support
+    return important === 'important' ? true : important;
+}
diff --git a/node_modules/css-tree/lib/syntax/node/DeclarationList.js b/node_modules/css-tree/lib/syntax/node/DeclarationList.js
new file mode 100644
index 0000000..084b5c6
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/DeclarationList.js
@@ -0,0 +1,49 @@
+var TYPE = require('../../tokenizer').TYPE;
+var rawMode = require('./Raw').mode;
+
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+var SEMICOLON = TYPE.Semicolon;
+
+function consumeRaw(startToken) {
+    return this.Raw(startToken, rawMode.semicolonIncluded, true);
+}
+
+module.exports = {
+    name: 'DeclarationList',
+    structure: {
+        children: [[
+            'Declaration'
+        ]]
+    },
+    parse: function() {
+        var children = this.createList();
+
+        scan:
+        while (!this.scanner.eof) {
+            switch (this.scanner.tokenType) {
+                case WHITESPACE:
+                case COMMENT:
+                case SEMICOLON:
+                    this.scanner.next();
+                    break;
+
+                default:
+                    children.push(this.parseWithFallback(this.Declaration, consumeRaw));
+            }
+        }
+
+        return {
+            type: 'DeclarationList',
+            loc: this.getLocationFromList(children),
+            children: children
+        };
+    },
+    generate: function(node) {
+        this.children(node, function(prev) {
+            if (prev.type === 'Declaration') {
+                this.chunk(';');
+            }
+        });
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Dimension.js b/node_modules/css-tree/lib/syntax/node/Dimension.js
new file mode 100644
index 0000000..186f6ee
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Dimension.js
@@ -0,0 +1,29 @@
+var consumeNumber = require('../../tokenizer/utils').consumeNumber;
+var TYPE = require('../../tokenizer').TYPE;
+
+var DIMENSION = TYPE.Dimension;
+
+module.exports = {
+    name: 'Dimension',
+    structure: {
+        value: String,
+        unit: String
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+        var numberEnd = consumeNumber(this.scanner.source, start);
+
+        this.eat(DIMENSION);
+
+        return {
+            type: 'Dimension',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            value: this.scanner.source.substring(start, numberEnd),
+            unit: this.scanner.source.substring(numberEnd, this.scanner.tokenStart)
+        };
+    },
+    generate: function(node) {
+        this.chunk(node.value);
+        this.chunk(node.unit);
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Function.js b/node_modules/css-tree/lib/syntax/node/Function.js
new file mode 100644
index 0000000..9e6b420
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Function.js
@@ -0,0 +1,40 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var RIGHTPARENTHESIS = TYPE.RightParenthesis;
+
+// <function-token> <sequence> )
+module.exports = {
+    name: 'Function',
+    structure: {
+        name: String,
+        children: [[]]
+    },
+    parse: function(readSequence, recognizer) {
+        var start = this.scanner.tokenStart;
+        var name = this.consumeFunctionName();
+        var nameLowerCase = name.toLowerCase();
+        var children;
+
+        children = recognizer.hasOwnProperty(nameLowerCase)
+            ? recognizer[nameLowerCase].call(this, recognizer)
+            : readSequence.call(this, recognizer);
+
+        if (!this.scanner.eof) {
+            this.eat(RIGHTPARENTHESIS);
+        }
+
+        return {
+            type: 'Function',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            name: name,
+            children: children
+        };
+    },
+    generate: function(node) {
+        this.chunk(node.name);
+        this.chunk('(');
+        this.children(node);
+        this.chunk(')');
+    },
+    walkContext: 'function'
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Hash.js b/node_modules/css-tree/lib/syntax/node/Hash.js
new file mode 100644
index 0000000..5632636
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Hash.js
@@ -0,0 +1,26 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var HASH = TYPE.Hash;
+
+// '#' ident
+module.exports = {
+    name: 'Hash',
+    structure: {
+        value: String
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+
+        this.eat(HASH);
+
+        return {
+            type: 'Hash',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            value: this.scanner.substrToCursor(start + 1)
+        };
+    },
+    generate: function(node) {
+        this.chunk('#');
+        this.chunk(node.value);
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/IdSelector.js b/node_modules/css-tree/lib/syntax/node/IdSelector.js
new file mode 100644
index 0000000..b35fd96
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/IdSelector.js
@@ -0,0 +1,27 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var HASH = TYPE.Hash;
+
+// <hash-token>
+module.exports = {
+    name: 'IdSelector',
+    structure: {
+        name: String
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+
+        // TODO: check value is an ident
+        this.eat(HASH);
+
+        return {
+            type: 'IdSelector',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            name: this.scanner.substrToCursor(start + 1)
+        };
+    },
+    generate: function(node) {
+        this.chunk('#');
+        this.chunk(node.name);
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Identifier.js b/node_modules/css-tree/lib/syntax/node/Identifier.js
new file mode 100644
index 0000000..3fce2b4
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Identifier.js
@@ -0,0 +1,20 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+
+module.exports = {
+    name: 'Identifier',
+    structure: {
+        name: String
+    },
+    parse: function() {
+        return {
+            type: 'Identifier',
+            loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),
+            name: this.consume(IDENT)
+        };
+    },
+    generate: function(node) {
+        this.chunk(node.name);
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/MediaFeature.js b/node_modules/css-tree/lib/syntax/node/MediaFeature.js
new file mode 100644
index 0000000..bdc7bc2
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/MediaFeature.js
@@ -0,0 +1,76 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var NUMBER = TYPE.Number;
+var DIMENSION = TYPE.Dimension;
+var LEFTPARENTHESIS = TYPE.LeftParenthesis;
+var RIGHTPARENTHESIS = TYPE.RightParenthesis;
+var COLON = TYPE.Colon;
+var DELIM = TYPE.Delim;
+
+module.exports = {
+    name: 'MediaFeature',
+    structure: {
+        name: String,
+        value: ['Identifier', 'Number', 'Dimension', 'Ratio', null]
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+        var name;
+        var value = null;
+
+        this.eat(LEFTPARENTHESIS);
+        this.scanner.skipSC();
+
+        name = this.consume(IDENT);
+        this.scanner.skipSC();
+
+        if (this.scanner.tokenType !== RIGHTPARENTHESIS) {
+            this.eat(COLON);
+            this.scanner.skipSC();
+
+            switch (this.scanner.tokenType) {
+                case NUMBER:
+                    if (this.lookupNonWSType(1) === DELIM) {
+                        value = this.Ratio();
+                    } else {
+                        value = this.Number();
+                    }
+
+                    break;
+
+                case DIMENSION:
+                    value = this.Dimension();
+                    break;
+
+                case IDENT:
+                    value = this.Identifier();
+
+                    break;
+
+                default:
+                    this.error('Number, dimension, ratio or identifier is expected');
+            }
+
+            this.scanner.skipSC();
+        }
+
+        this.eat(RIGHTPARENTHESIS);
+
+        return {
+            type: 'MediaFeature',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            name: name,
+            value: value
+        };
+    },
+    generate: function(node) {
+        this.chunk('(');
+        this.chunk(node.name);
+        if (node.value !== null) {
+            this.chunk(':');
+            this.node(node.value);
+        }
+        this.chunk(')');
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/MediaQuery.js b/node_modules/css-tree/lib/syntax/node/MediaQuery.js
new file mode 100644
index 0000000..e0c74ce
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/MediaQuery.js
@@ -0,0 +1,68 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+var IDENT = TYPE.Ident;
+var LEFTPARENTHESIS = TYPE.LeftParenthesis;
+
+module.exports = {
+    name: 'MediaQuery',
+    structure: {
+        children: [[
+            'Identifier',
+            'MediaFeature',
+            'WhiteSpace'
+        ]]
+    },
+    parse: function() {
+        this.scanner.skipSC();
+
+        var children = this.createList();
+        var child = null;
+        var space = null;
+
+        scan:
+        while (!this.scanner.eof) {
+            switch (this.scanner.tokenType) {
+                case COMMENT:
+                    this.scanner.next();
+                    continue;
+
+                case WHITESPACE:
+                    space = this.WhiteSpace();
+                    continue;
+
+                case IDENT:
+                    child = this.Identifier();
+                    break;
+
+                case LEFTPARENTHESIS:
+                    child = this.MediaFeature();
+                    break;
+
+                default:
+                    break scan;
+            }
+
+            if (space !== null) {
+                children.push(space);
+                space = null;
+            }
+
+            children.push(child);
+        }
+
+        if (child === null) {
+            this.error('Identifier or parenthesis is expected');
+        }
+
+        return {
+            type: 'MediaQuery',
+            loc: this.getLocationFromList(children),
+            children: children
+        };
+    },
+    generate: function(node) {
+        this.children(node);
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/MediaQueryList.js b/node_modules/css-tree/lib/syntax/node/MediaQueryList.js
new file mode 100644
index 0000000..a25a965
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/MediaQueryList.js
@@ -0,0 +1,36 @@
+var COMMA = require('../../tokenizer').TYPE.Comma;
+
+module.exports = {
+    name: 'MediaQueryList',
+    structure: {
+        children: [[
+            'MediaQuery'
+        ]]
+    },
+    parse: function(relative) {
+        var children = this.createList();
+
+        this.scanner.skipSC();
+
+        while (!this.scanner.eof) {
+            children.push(this.MediaQuery(relative));
+
+            if (this.scanner.tokenType !== COMMA) {
+                break;
+            }
+
+            this.scanner.next();
+        }
+
+        return {
+            type: 'MediaQueryList',
+            loc: this.getLocationFromList(children),
+            children: children
+        };
+    },
+    generate: function(node) {
+        this.children(node, function() {
+            this.chunk(',');
+        });
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Nth.js b/node_modules/css-tree/lib/syntax/node/Nth.js
new file mode 100644
index 0000000..43835cc
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Nth.js
@@ -0,0 +1,51 @@
+module.exports = {
+    name: 'Nth',
+    structure: {
+        nth: ['AnPlusB', 'Identifier'],
+        selector: ['SelectorList', null]
+    },
+    parse: function(allowOfClause) {
+        this.scanner.skipSC();
+
+        var start = this.scanner.tokenStart;
+        var end = start;
+        var selector = null;
+        var query;
+
+        if (this.scanner.lookupValue(0, 'odd') || this.scanner.lookupValue(0, 'even')) {
+            query = this.Identifier();
+        } else {
+            query = this.AnPlusB();
+        }
+
+        this.scanner.skipSC();
+
+        if (allowOfClause && this.scanner.lookupValue(0, 'of')) {
+            this.scanner.next();
+
+            selector = this.SelectorList();
+
+            if (this.needPositions) {
+                end = this.getLastListNode(selector.children).loc.end.offset;
+            }
+        } else {
+            if (this.needPositions) {
+                end = query.loc.end.offset;
+            }
+        }
+
+        return {
+            type: 'Nth',
+            loc: this.getLocation(start, end),
+            nth: query,
+            selector: selector
+        };
+    },
+    generate: function(node) {
+        this.node(node.nth);
+        if (node.selector !== null) {
+            this.chunk(' of ');
+            this.node(node.selector);
+        }
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Number.js b/node_modules/css-tree/lib/syntax/node/Number.js
new file mode 100644
index 0000000..1c01936
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Number.js
@@ -0,0 +1,18 @@
+var NUMBER = require('../../tokenizer').TYPE.Number;
+
+module.exports = {
+    name: 'Number',
+    structure: {
+        value: String
+    },
+    parse: function() {
+        return {
+            type: 'Number',
+            loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),
+            value: this.consume(NUMBER)
+        };
+    },
+    generate: function(node) {
+        this.chunk(node.value);
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Operator.js b/node_modules/css-tree/lib/syntax/node/Operator.js
new file mode 100644
index 0000000..d94259a
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Operator.js
@@ -0,0 +1,21 @@
+// '/' | '*' | ',' | ':' | '+' | '-'
+module.exports = {
+    name: 'Operator',
+    structure: {
+        value: String
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+
+        this.scanner.next();
+
+        return {
+            type: 'Operator',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            value: this.scanner.substrToCursor(start)
+        };
+    },
+    generate: function(node) {
+        this.chunk(node.value);
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Parentheses.js b/node_modules/css-tree/lib/syntax/node/Parentheses.js
new file mode 100644
index 0000000..19efe6f
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Parentheses.js
@@ -0,0 +1,34 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var LEFTPARENTHESIS = TYPE.LeftParenthesis;
+var RIGHTPARENTHESIS = TYPE.RightParenthesis;
+
+module.exports = {
+    name: 'Parentheses',
+    structure: {
+        children: [[]]
+    },
+    parse: function(readSequence, recognizer) {
+        var start = this.scanner.tokenStart;
+        var children = null;
+
+        this.eat(LEFTPARENTHESIS);
+
+        children = readSequence.call(this, recognizer);
+
+        if (!this.scanner.eof) {
+            this.eat(RIGHTPARENTHESIS);
+        }
+
+        return {
+            type: 'Parentheses',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            children: children
+        };
+    },
+    generate: function(node) {
+        this.chunk('(');
+        this.children(node);
+        this.chunk(')');
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Percentage.js b/node_modules/css-tree/lib/syntax/node/Percentage.js
new file mode 100644
index 0000000..99b7641
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Percentage.js
@@ -0,0 +1,27 @@
+var consumeNumber = require('../../tokenizer/utils').consumeNumber;
+var TYPE = require('../../tokenizer').TYPE;
+
+var PERCENTAGE = TYPE.Percentage;
+
+module.exports = {
+    name: 'Percentage',
+    structure: {
+        value: String
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+        var numberEnd = consumeNumber(this.scanner.source, start);
+
+        this.eat(PERCENTAGE);
+
+        return {
+            type: 'Percentage',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            value: this.scanner.source.substring(start, numberEnd)
+        };
+    },
+    generate: function(node) {
+        this.chunk(node.value);
+        this.chunk('%');
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/PseudoClassSelector.js b/node_modules/css-tree/lib/syntax/node/PseudoClassSelector.js
new file mode 100644
index 0000000..282e236
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/PseudoClassSelector.js
@@ -0,0 +1,61 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var FUNCTION = TYPE.Function;
+var COLON = TYPE.Colon;
+var RIGHTPARENTHESIS = TYPE.RightParenthesis;
+
+// : [ <ident> | <function-token> <any-value>? ) ]
+module.exports = {
+    name: 'PseudoClassSelector',
+    structure: {
+        name: String,
+        children: [['Raw'], null]
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+        var children = null;
+        var name;
+        var nameLowerCase;
+
+        this.eat(COLON);
+
+        if (this.scanner.tokenType === FUNCTION) {
+            name = this.consumeFunctionName();
+            nameLowerCase = name.toLowerCase();
+
+            if (this.pseudo.hasOwnProperty(nameLowerCase)) {
+                this.scanner.skipSC();
+                children = this.pseudo[nameLowerCase].call(this);
+                this.scanner.skipSC();
+            } else {
+                children = this.createList();
+                children.push(
+                    this.Raw(this.scanner.tokenIndex, null, false)
+                );
+            }
+
+            this.eat(RIGHTPARENTHESIS);
+        } else {
+            name = this.consume(IDENT);
+        }
+
+        return {
+            type: 'PseudoClassSelector',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            name: name,
+            children: children
+        };
+    },
+    generate: function(node) {
+        this.chunk(':');
+        this.chunk(node.name);
+
+        if (node.children !== null) {
+            this.chunk('(');
+            this.children(node);
+            this.chunk(')');
+        }
+    },
+    walkContext: 'function'
+};
diff --git a/node_modules/css-tree/lib/syntax/node/PseudoElementSelector.js b/node_modules/css-tree/lib/syntax/node/PseudoElementSelector.js
new file mode 100644
index 0000000..b736cea
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/PseudoElementSelector.js
@@ -0,0 +1,62 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var FUNCTION = TYPE.Function;
+var COLON = TYPE.Colon;
+var RIGHTPARENTHESIS = TYPE.RightParenthesis;
+
+// :: [ <ident> | <function-token> <any-value>? ) ]
+module.exports = {
+    name: 'PseudoElementSelector',
+    structure: {
+        name: String,
+        children: [['Raw'], null]
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+        var children = null;
+        var name;
+        var nameLowerCase;
+
+        this.eat(COLON);
+        this.eat(COLON);
+
+        if (this.scanner.tokenType === FUNCTION) {
+            name = this.consumeFunctionName();
+            nameLowerCase = name.toLowerCase();
+
+            if (this.pseudo.hasOwnProperty(nameLowerCase)) {
+                this.scanner.skipSC();
+                children = this.pseudo[nameLowerCase].call(this);
+                this.scanner.skipSC();
+            } else {
+                children = this.createList();
+                children.push(
+                    this.Raw(this.scanner.tokenIndex, null, false)
+                );
+            }
+
+            this.eat(RIGHTPARENTHESIS);
+        } else {
+            name = this.consume(IDENT);
+        }
+
+        return {
+            type: 'PseudoElementSelector',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            name: name,
+            children: children
+        };
+    },
+    generate: function(node) {
+        this.chunk('::');
+        this.chunk(node.name);
+
+        if (node.children !== null) {
+            this.chunk('(');
+            this.children(node);
+            this.chunk(')');
+        }
+    },
+    walkContext: 'function'
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Ratio.js b/node_modules/css-tree/lib/syntax/node/Ratio.js
new file mode 100644
index 0000000..940fee5
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Ratio.js
@@ -0,0 +1,66 @@
+var isDigit = require('../../tokenizer').isDigit;
+var TYPE = require('../../tokenizer').TYPE;
+
+var NUMBER = TYPE.Number;
+var DELIM = TYPE.Delim;
+var SOLIDUS = 0x002F;  // U+002F SOLIDUS (/)
+var FULLSTOP = 0x002E; // U+002E FULL STOP (.)
+
+// Terms of <ratio> should be a positive numbers (not zero or negative)
+// (see https://drafts.csswg.org/mediaqueries-3/#values)
+// However, -o-min-device-pixel-ratio takes fractional values as a ratio's term
+// and this is using by various sites. Therefore we relax checking on parse
+// to test a term is unsigned number without an exponent part.
+// Additional checking may be applied on lexer validation.
+function consumeNumber() {
+    this.scanner.skipWS();
+
+    var value = this.consume(NUMBER);
+
+    for (var i = 0; i < value.length; i++) {
+        var code = value.charCodeAt(i);
+        if (!isDigit(code) && code !== FULLSTOP) {
+            this.error('Unsigned number is expected', this.scanner.tokenStart - value.length + i);
+        }
+    }
+
+    if (Number(value) === 0) {
+        this.error('Zero number is not allowed', this.scanner.tokenStart - value.length);
+    }
+
+    return value;
+}
+
+// <positive-integer> S* '/' S* <positive-integer>
+module.exports = {
+    name: 'Ratio',
+    structure: {
+        left: String,
+        right: String
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+        var left = consumeNumber.call(this);
+        var right;
+
+        this.scanner.skipWS();
+
+        if (!this.scanner.isDelim(SOLIDUS)) {
+            this.error('Solidus is expected');
+        }
+        this.eat(DELIM);
+        right = consumeNumber.call(this);
+
+        return {
+            type: 'Ratio',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            left: left,
+            right: right
+        };
+    },
+    generate: function(node) {
+        this.chunk(node.left);
+        this.chunk('/');
+        this.chunk(node.right);
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Raw.js b/node_modules/css-tree/lib/syntax/node/Raw.js
new file mode 100644
index 0000000..a47deb4
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Raw.js
@@ -0,0 +1,87 @@
+var tokenizer = require('../../tokenizer');
+var TYPE = tokenizer.TYPE;
+
+var WhiteSpace = TYPE.WhiteSpace;
+var Semicolon = TYPE.Semicolon;
+var LeftCurlyBracket = TYPE.LeftCurlyBracket;
+var Delim = TYPE.Delim;
+var EXCLAMATIONMARK = 0x0021; // U+0021 EXCLAMATION MARK (!)
+
+function getOffsetExcludeWS() {
+    if (this.scanner.tokenIndex > 0) {
+        if (this.scanner.lookupType(-1) === WhiteSpace) {
+            return this.scanner.tokenIndex > 1
+                ? this.scanner.getTokenStart(this.scanner.tokenIndex - 1)
+                : this.scanner.firstCharOffset;
+        }
+    }
+
+    return this.scanner.tokenStart;
+}
+
+// 0, 0, false
+function balanceEnd() {
+    return 0;
+}
+
+// LEFTCURLYBRACKET, 0, false
+function leftCurlyBracket(tokenType) {
+    return tokenType === LeftCurlyBracket ? 1 : 0;
+}
+
+// LEFTCURLYBRACKET, SEMICOLON, false
+function leftCurlyBracketOrSemicolon(tokenType) {
+    return tokenType === LeftCurlyBracket || tokenType === Semicolon ? 1 : 0;
+}
+
+// EXCLAMATIONMARK, SEMICOLON, false
+function exclamationMarkOrSemicolon(tokenType, source, offset) {
+    if (tokenType === Delim && source.charCodeAt(offset) === EXCLAMATIONMARK) {
+        return 1;
+    }
+
+    return tokenType === Semicolon ? 1 : 0;
+}
+
+// 0, SEMICOLON, true
+function semicolonIncluded(tokenType) {
+    return tokenType === Semicolon ? 2 : 0;
+}
+
+module.exports = {
+    name: 'Raw',
+    structure: {
+        value: String
+    },
+    parse: function(startToken, mode, excludeWhiteSpace) {
+        var startOffset = this.scanner.getTokenStart(startToken);
+        var endOffset;
+
+        this.scanner.skip(
+            this.scanner.getRawLength(startToken, mode || balanceEnd)
+        );
+
+        if (excludeWhiteSpace && this.scanner.tokenStart > startOffset) {
+            endOffset = getOffsetExcludeWS.call(this);
+        } else {
+            endOffset = this.scanner.tokenStart;
+        }
+
+        return {
+            type: 'Raw',
+            loc: this.getLocation(startOffset, endOffset),
+            value: this.scanner.source.substring(startOffset, endOffset)
+        };
+    },
+    generate: function(node) {
+        this.chunk(node.value);
+    },
+
+    mode: {
+        default: balanceEnd,
+        leftCurlyBracket: leftCurlyBracket,
+        leftCurlyBracketOrSemicolon: leftCurlyBracketOrSemicolon,
+        exclamationMarkOrSemicolon: exclamationMarkOrSemicolon,
+        semicolonIncluded: semicolonIncluded
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Rule.js b/node_modules/css-tree/lib/syntax/node/Rule.js
new file mode 100644
index 0000000..2f1aaa2
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Rule.js
@@ -0,0 +1,54 @@
+var TYPE = require('../../tokenizer').TYPE;
+var rawMode = require('./Raw').mode;
+
+var LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;
+
+function consumeRaw(startToken) {
+    return this.Raw(startToken, rawMode.leftCurlyBracket, true);
+}
+
+function consumePrelude() {
+    var prelude = this.SelectorList();
+
+    if (prelude.type !== 'Raw' &&
+        this.scanner.eof === false &&
+        this.scanner.tokenType !== LEFTCURLYBRACKET) {
+        this.error();
+    }
+
+    return prelude;
+}
+
+module.exports = {
+    name: 'Rule',
+    structure: {
+        prelude: ['SelectorList', 'Raw'],
+        block: ['Block']
+    },
+    parse: function() {
+        var startToken = this.scanner.tokenIndex;
+        var startOffset = this.scanner.tokenStart;
+        var prelude;
+        var block;
+
+        if (this.parseRulePrelude) {
+            prelude = this.parseWithFallback(consumePrelude, consumeRaw);
+        } else {
+            prelude = consumeRaw.call(this, startToken);
+        }
+
+        block = this.Block(true);
+
+        return {
+            type: 'Rule',
+            loc: this.getLocation(startOffset, this.scanner.tokenStart),
+            prelude: prelude,
+            block: block
+        };
+    },
+    generate: function(node) {
+        this.node(node.prelude);
+        this.node(node.block);
+    },
+    walkContext: 'rule'
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Selector.js b/node_modules/css-tree/lib/syntax/node/Selector.js
new file mode 100644
index 0000000..a1b17f3
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Selector.js
@@ -0,0 +1,32 @@
+module.exports = {
+    name: 'Selector',
+    structure: {
+        children: [[
+            'TypeSelector',
+            'IdSelector',
+            'ClassSelector',
+            'AttributeSelector',
+            'PseudoClassSelector',
+            'PseudoElementSelector',
+            'Combinator',
+            'WhiteSpace'
+        ]]
+    },
+    parse: function() {
+        var children = this.readSequence(this.scope.Selector);
+
+        // nothing were consumed
+        if (this.getFirstListNode(children) === null) {
+            this.error('Selector is expected');
+        }
+
+        return {
+            type: 'Selector',
+            loc: this.getLocationFromList(children),
+            children: children
+        };
+    },
+    generate: function(node) {
+        this.children(node);
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/SelectorList.js b/node_modules/css-tree/lib/syntax/node/SelectorList.js
new file mode 100644
index 0000000..70dd7c5
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/SelectorList.js
@@ -0,0 +1,39 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var COMMA = TYPE.Comma;
+
+module.exports = {
+    name: 'SelectorList',
+    structure: {
+        children: [[
+            'Selector',
+            'Raw'
+        ]]
+    },
+    parse: function() {
+        var children = this.createList();
+
+        while (!this.scanner.eof) {
+            children.push(this.Selector());
+
+            if (this.scanner.tokenType === COMMA) {
+                this.scanner.next();
+                continue;
+            }
+
+            break;
+        }
+
+        return {
+            type: 'SelectorList',
+            loc: this.getLocationFromList(children),
+            children: children
+        };
+    },
+    generate: function(node) {
+        this.children(node, function() {
+            this.chunk(',');
+        });
+    },
+    walkContext: 'selector'
+};
diff --git a/node_modules/css-tree/lib/syntax/node/String.js b/node_modules/css-tree/lib/syntax/node/String.js
new file mode 100644
index 0000000..d3b8cc1
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/String.js
@@ -0,0 +1,18 @@
+var STRING = require('../../tokenizer').TYPE.String;
+
+module.exports = {
+    name: 'String',
+    structure: {
+        value: String
+    },
+    parse: function() {
+        return {
+            type: 'String',
+            loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),
+            value: this.consume(STRING)
+        };
+    },
+    generate: function(node) {
+        this.chunk(node.value);
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/StyleSheet.js b/node_modules/css-tree/lib/syntax/node/StyleSheet.js
new file mode 100644
index 0000000..db332cf
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/StyleSheet.js
@@ -0,0 +1,81 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+var ATKEYWORD = TYPE.AtKeyword;
+var CDO = TYPE.CDO;
+var CDC = TYPE.CDC;
+var EXCLAMATIONMARK = 0x0021; // U+0021 EXCLAMATION MARK (!)
+
+function consumeRaw(startToken) {
+    return this.Raw(startToken, null, false);
+}
+
+module.exports = {
+    name: 'StyleSheet',
+    structure: {
+        children: [[
+            'Comment',
+            'CDO',
+            'CDC',
+            'Atrule',
+            'Rule',
+            'Raw'
+        ]]
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+        var children = this.createList();
+        var child;
+
+        scan:
+        while (!this.scanner.eof) {
+            switch (this.scanner.tokenType) {
+                case WHITESPACE:
+                    this.scanner.next();
+                    continue;
+
+                case COMMENT:
+                    // ignore comments except exclamation comments (i.e. /*! .. */) on top level
+                    if (this.scanner.source.charCodeAt(this.scanner.tokenStart + 2) !== EXCLAMATIONMARK) {
+                        this.scanner.next();
+                        continue;
+                    }
+
+                    child = this.Comment();
+                    break;
+
+                case CDO: // <!--
+                    child = this.CDO();
+                    break;
+
+                case CDC: // -->
+                    child = this.CDC();
+                    break;
+
+                // CSS Syntax Module Level 3
+                // §2.2 Error handling
+                // At the "top level" of a stylesheet, an <at-keyword-token> starts an at-rule.
+                case ATKEYWORD:
+                    child = this.parseWithFallback(this.Atrule, consumeRaw);
+                    break;
+
+                // Anything else starts a qualified rule ...
+                default:
+                    child = this.parseWithFallback(this.Rule, consumeRaw);
+            }
+
+            children.push(child);
+        }
+
+        return {
+            type: 'StyleSheet',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            children: children
+        };
+    },
+    generate: function(node) {
+        this.children(node);
+    },
+    walkContext: 'stylesheet'
+};
diff --git a/node_modules/css-tree/lib/syntax/node/TypeSelector.js b/node_modules/css-tree/lib/syntax/node/TypeSelector.js
new file mode 100644
index 0000000..c8a692c
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/TypeSelector.js
@@ -0,0 +1,53 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var ASTERISK = 0x002A;     // U+002A ASTERISK (*)
+var VERTICALLINE = 0x007C; // U+007C VERTICAL LINE (|)
+
+function eatIdentifierOrAsterisk() {
+    if (this.scanner.tokenType !== IDENT &&
+        this.scanner.isDelim(ASTERISK) === false) {
+        this.error('Identifier or asterisk is expected');
+    }
+
+    this.scanner.next();
+}
+
+// ident
+// ident|ident
+// ident|*
+// *
+// *|ident
+// *|*
+// |ident
+// |*
+module.exports = {
+    name: 'TypeSelector',
+    structure: {
+        name: String
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+
+        if (this.scanner.isDelim(VERTICALLINE)) {
+            this.scanner.next();
+            eatIdentifierOrAsterisk.call(this);
+        } else {
+            eatIdentifierOrAsterisk.call(this);
+
+            if (this.scanner.isDelim(VERTICALLINE)) {
+                this.scanner.next();
+                eatIdentifierOrAsterisk.call(this);
+            }
+        }
+
+        return {
+            type: 'TypeSelector',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            name: this.scanner.substrToCursor(start)
+        };
+    },
+    generate: function(node) {
+        this.chunk(node.name);
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/UnicodeRange.js b/node_modules/css-tree/lib/syntax/node/UnicodeRange.js
new file mode 100644
index 0000000..f3ca607
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/UnicodeRange.js
@@ -0,0 +1,173 @@
+var isHexDigit = require('../../tokenizer').isHexDigit;
+var cmpChar = require('../../tokenizer').cmpChar;
+var TYPE = require('../../tokenizer').TYPE;
+var NAME = require('../../tokenizer').NAME;
+
+var IDENT = TYPE.Ident;
+var NUMBER = TYPE.Number;
+var DIMENSION = TYPE.Dimension;
+var PLUSSIGN = 0x002B;     // U+002B PLUS SIGN (+)
+var HYPHENMINUS = 0x002D;  // U+002D HYPHEN-MINUS (-)
+var QUESTIONMARK = 0x003F; // U+003F QUESTION MARK (?)
+var U = 0x0075;            // U+0075 LATIN SMALL LETTER U (u)
+
+function eatHexSequence(offset, allowDash) {
+    for (var pos = this.scanner.tokenStart + offset, len = 0; pos < this.scanner.tokenEnd; pos++) {
+        var code = this.scanner.source.charCodeAt(pos);
+
+        if (code === HYPHENMINUS && allowDash && len !== 0) {
+            if (eatHexSequence.call(this, offset + len + 1, false) === 0) {
+                this.error();
+            }
+
+            return -1;
+        }
+
+        if (!isHexDigit(code)) {
+            this.error(
+                allowDash && len !== 0
+                    ? 'HyphenMinus' + (len < 6 ? ' or hex digit' : '') + ' is expected'
+                    : (len < 6 ? 'Hex digit is expected' : 'Unexpected input'),
+                pos
+            );
+        }
+
+        if (++len > 6) {
+            this.error('Too many hex digits', pos);
+        };
+    }
+
+    this.scanner.next();
+    return len;
+}
+
+function eatQuestionMarkSequence(max) {
+    var count = 0;
+
+    while (this.scanner.isDelim(QUESTIONMARK)) {
+        if (++count > max) {
+            this.error('Too many question marks');
+        }
+
+        this.scanner.next();
+    }
+}
+
+function startsWith(code) {
+    if (this.scanner.source.charCodeAt(this.scanner.tokenStart) !== code) {
+        this.error(NAME[code] + ' is expected');
+    }
+}
+
+// https://drafts.csswg.org/css-syntax/#urange
+// Informally, the <urange> production has three forms:
+// U+0001
+//      Defines a range consisting of a single code point, in this case the code point "1".
+// U+0001-00ff
+//      Defines a range of codepoints between the first and the second value, in this case
+//      the range between "1" and "ff" (255 in decimal) inclusive.
+// U+00??
+//      Defines a range of codepoints where the "?" characters range over all hex digits,
+//      in this case defining the same as the value U+0000-00ff.
+// In each form, a maximum of 6 digits is allowed for each hexadecimal number (if you treat "?" as a hexadecimal digit).
+//
+// <urange> =
+//   u '+' <ident-token> '?'* |
+//   u <dimension-token> '?'* |
+//   u <number-token> '?'* |
+//   u <number-token> <dimension-token> |
+//   u <number-token> <number-token> |
+//   u '+' '?'+
+function scanUnicodeRange() {
+    var hexLength = 0;
+
+    // u '+' <ident-token> '?'*
+    // u '+' '?'+
+    if (this.scanner.isDelim(PLUSSIGN)) {
+        this.scanner.next();
+
+        if (this.scanner.tokenType === IDENT) {
+            hexLength = eatHexSequence.call(this, 0, true);
+            if (hexLength > 0) {
+                eatQuestionMarkSequence.call(this, 6 - hexLength);
+            }
+            return;
+        }
+
+        if (this.scanner.isDelim(QUESTIONMARK)) {
+            this.scanner.next();
+            eatQuestionMarkSequence.call(this, 5);
+            return;
+        }
+
+        this.error('Hex digit or question mark is expected');
+        return;
+    }
+
+    // u <number-token> '?'*
+    // u <number-token> <dimension-token>
+    // u <number-token> <number-token>
+    if (this.scanner.tokenType === NUMBER) {
+        startsWith.call(this, PLUSSIGN);
+        hexLength = eatHexSequence.call(this, 1, true);
+
+        if (this.scanner.isDelim(QUESTIONMARK)) {
+            eatQuestionMarkSequence.call(this, 6 - hexLength);
+            return;
+        }
+
+        if (this.scanner.tokenType === DIMENSION ||
+            this.scanner.tokenType === NUMBER) {
+            startsWith.call(this, HYPHENMINUS);
+            eatHexSequence.call(this, 1, false);
+            return;
+        }
+
+        return;
+    }
+
+    // u <dimension-token> '?'*
+    if (this.scanner.tokenType === DIMENSION) {
+        startsWith.call(this, PLUSSIGN);
+        hexLength = eatHexSequence.call(this, 1, true);
+
+        if (hexLength > 0) {
+            eatQuestionMarkSequence.call(this, 6 - hexLength);
+        }
+
+        return;
+    }
+
+    this.error();
+}
+
+module.exports = {
+    name: 'UnicodeRange',
+    structure: {
+        value: String
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+
+        // U or u
+        if (!cmpChar(this.scanner.source, start, U)) {
+            this.error('U is expected');
+        }
+
+        if (!cmpChar(this.scanner.source, start + 1, PLUSSIGN)) {
+            this.error('Plus sign is expected');
+        }
+
+        this.scanner.next();
+        scanUnicodeRange.call(this);
+
+        return {
+            type: 'UnicodeRange',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            value: this.scanner.substrToCursor(start)
+        };
+    },
+    generate: function(node) {
+        this.chunk(node.value);
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Url.js b/node_modules/css-tree/lib/syntax/node/Url.js
new file mode 100644
index 0000000..91c6f59
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Url.js
@@ -0,0 +1,69 @@
+var isWhiteSpace = require('../../tokenizer').isWhiteSpace;
+var cmpStr = require('../../tokenizer').cmpStr;
+var TYPE = require('../../tokenizer').TYPE;
+
+var FUNCTION = TYPE.Function;
+var URL = TYPE.Url;
+var RIGHTPARENTHESIS = TYPE.RightParenthesis;
+
+// <url-token> | <function-token> <string> )
+module.exports = {
+    name: 'Url',
+    structure: {
+        value: ['String', 'Raw']
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+        var value;
+
+        switch (this.scanner.tokenType) {
+            case URL:
+                var rawStart = start + 4;
+                var rawEnd = this.scanner.tokenEnd - 1;
+
+                while (rawStart < rawEnd && isWhiteSpace(this.scanner.source.charCodeAt(rawStart))) {
+                    rawStart++;
+                }
+
+                while (rawStart < rawEnd && isWhiteSpace(this.scanner.source.charCodeAt(rawEnd - 1))) {
+                    rawEnd--;
+                }
+
+                value = {
+                    type: 'Raw',
+                    loc: this.getLocation(rawStart, rawEnd),
+                    value: this.scanner.source.substring(rawStart, rawEnd)
+                };
+
+                this.eat(URL);
+                break;
+
+            case FUNCTION:
+                if (!cmpStr(this.scanner.source, this.scanner.tokenStart, this.scanner.tokenEnd, 'url(')) {
+                    this.error('Function name must be `url`');
+                }
+
+                this.eat(FUNCTION);
+                this.scanner.skipSC();
+                value = this.String();
+                this.scanner.skipSC();
+                this.eat(RIGHTPARENTHESIS);
+                break;
+
+            default:
+                this.error('Url or Function is expected');
+        }
+
+        return {
+            type: 'Url',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            value: value
+        };
+    },
+    generate: function(node) {
+        this.chunk('url');
+        this.chunk('(');
+        this.node(node.value);
+        this.chunk(')');
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/Value.js b/node_modules/css-tree/lib/syntax/node/Value.js
new file mode 100644
index 0000000..6dcb265
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/Value.js
@@ -0,0 +1,19 @@
+module.exports = {
+    name: 'Value',
+    structure: {
+        children: [[]]
+    },
+    parse: function() {
+        var start = this.scanner.tokenStart;
+        var children = this.readSequence(this.scope.Value);
+
+        return {
+            type: 'Value',
+            loc: this.getLocation(start, this.scanner.tokenStart),
+            children: children
+        };
+    },
+    generate: function(node) {
+        this.children(node);
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/WhiteSpace.js b/node_modules/css-tree/lib/syntax/node/WhiteSpace.js
new file mode 100644
index 0000000..0c6a363
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/WhiteSpace.js
@@ -0,0 +1,26 @@
+var WHITESPACE = require('../../tokenizer').TYPE.WhiteSpace;
+var SPACE = Object.freeze({
+    type: 'WhiteSpace',
+    loc: null,
+    value: ' '
+});
+
+module.exports = {
+    name: 'WhiteSpace',
+    structure: {
+        value: String
+    },
+    parse: function() {
+        this.eat(WHITESPACE);
+        return SPACE;
+
+        // return {
+        //     type: 'WhiteSpace',
+        //     loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),
+        //     value: this.consume(WHITESPACE)
+        // };
+    },
+    generate: function(node) {
+        this.chunk(node.value);
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/node/index.js b/node_modules/css-tree/lib/syntax/node/index.js
new file mode 100644
index 0000000..182b2cf
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/node/index.js
@@ -0,0 +1,42 @@
+module.exports = {
+    AnPlusB: require('./AnPlusB'),
+    Atrule: require('./Atrule'),
+    AtrulePrelude: require('./AtrulePrelude'),
+    AttributeSelector: require('./AttributeSelector'),
+    Block: require('./Block'),
+    Brackets: require('./Brackets'),
+    CDC: require('./CDC'),
+    CDO: require('./CDO'),
+    ClassSelector: require('./ClassSelector'),
+    Combinator: require('./Combinator'),
+    Comment: require('./Comment'),
+    Declaration: require('./Declaration'),
+    DeclarationList: require('./DeclarationList'),
+    Dimension: require('./Dimension'),
+    Function: require('./Function'),
+    Hash: require('./Hash'),
+    Identifier: require('./Identifier'),
+    IdSelector: require('./IdSelector'),
+    MediaFeature: require('./MediaFeature'),
+    MediaQuery: require('./MediaQuery'),
+    MediaQueryList: require('./MediaQueryList'),
+    Nth: require('./Nth'),
+    Number: require('./Number'),
+    Operator: require('./Operator'),
+    Parentheses: require('./Parentheses'),
+    Percentage: require('./Percentage'),
+    PseudoClassSelector: require('./PseudoClassSelector'),
+    PseudoElementSelector: require('./PseudoElementSelector'),
+    Ratio: require('./Ratio'),
+    Raw: require('./Raw'),
+    Rule: require('./Rule'),
+    Selector: require('./Selector'),
+    SelectorList: require('./SelectorList'),
+    String: require('./String'),
+    StyleSheet: require('./StyleSheet'),
+    TypeSelector: require('./TypeSelector'),
+    UnicodeRange: require('./UnicodeRange'),
+    Url: require('./Url'),
+    Value: require('./Value'),
+    WhiteSpace: require('./WhiteSpace')
+};
diff --git a/node_modules/css-tree/lib/syntax/pseudo/common/nth.js b/node_modules/css-tree/lib/syntax/pseudo/common/nth.js
new file mode 100644
index 0000000..c201e7e
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/pseudo/common/nth.js
@@ -0,0 +1,9 @@
+var DISALLOW_OF_CLAUSE = false;
+
+module.exports = {
+    parse: function nth() {
+        return this.createSingleNodeList(
+            this.Nth(DISALLOW_OF_CLAUSE)
+        );
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/pseudo/common/nthWithOfClause.js b/node_modules/css-tree/lib/syntax/pseudo/common/nthWithOfClause.js
new file mode 100644
index 0000000..527bd1a
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/pseudo/common/nthWithOfClause.js
@@ -0,0 +1,9 @@
+var ALLOW_OF_CLAUSE = true;
+
+module.exports = {
+    parse: function nthWithOfClause() {
+        return this.createSingleNodeList(
+            this.Nth(ALLOW_OF_CLAUSE)
+        );
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/pseudo/common/selectorList.js b/node_modules/css-tree/lib/syntax/pseudo/common/selectorList.js
new file mode 100644
index 0000000..7f87d08
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/pseudo/common/selectorList.js
@@ -0,0 +1,7 @@
+module.exports = {
+    parse: function selectorList() {
+        return this.createSingleNodeList(
+            this.SelectorList()
+        );
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/pseudo/dir.js b/node_modules/css-tree/lib/syntax/pseudo/dir.js
new file mode 100644
index 0000000..10f7232
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/pseudo/dir.js
@@ -0,0 +1,7 @@
+module.exports = {
+    parse: function() {
+        return this.createSingleNodeList(
+            this.Identifier()
+        );
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/pseudo/has.js b/node_modules/css-tree/lib/syntax/pseudo/has.js
new file mode 100644
index 0000000..0e6b583
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/pseudo/has.js
@@ -0,0 +1,7 @@
+module.exports = {
+    parse: function() {
+        return this.createSingleNodeList(
+            this.SelectorList()
+        );
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/pseudo/index.js b/node_modules/css-tree/lib/syntax/pseudo/index.js
new file mode 100644
index 0000000..eb68aef
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/pseudo/index.js
@@ -0,0 +1,12 @@
+module.exports = {
+    'dir': require('./dir'),
+    'has': require('./has'),
+    'lang': require('./lang'),
+    'matches': require('./matches'),
+    'not': require('./not'),
+    'nth-child': require('./nth-child'),
+    'nth-last-child': require('./nth-last-child'),
+    'nth-last-of-type': require('./nth-last-of-type'),
+    'nth-of-type': require('./nth-of-type'),
+    'slotted': require('./slotted')
+};
diff --git a/node_modules/css-tree/lib/syntax/pseudo/lang.js b/node_modules/css-tree/lib/syntax/pseudo/lang.js
new file mode 100644
index 0000000..10f7232
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/pseudo/lang.js
@@ -0,0 +1,7 @@
+module.exports = {
+    parse: function() {
+        return this.createSingleNodeList(
+            this.Identifier()
+        );
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/pseudo/matches.js b/node_modules/css-tree/lib/syntax/pseudo/matches.js
new file mode 100644
index 0000000..43aa085
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/pseudo/matches.js
@@ -0,0 +1 @@
+module.exports = require('./common/selectorList');
diff --git a/node_modules/css-tree/lib/syntax/pseudo/not.js b/node_modules/css-tree/lib/syntax/pseudo/not.js
new file mode 100644
index 0000000..43aa085
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/pseudo/not.js
@@ -0,0 +1 @@
+module.exports = require('./common/selectorList');
diff --git a/node_modules/css-tree/lib/syntax/pseudo/nth-child.js b/node_modules/css-tree/lib/syntax/pseudo/nth-child.js
new file mode 100644
index 0000000..ed62028
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/pseudo/nth-child.js
@@ -0,0 +1 @@
+module.exports = require('./common/nthWithOfClause');
diff --git a/node_modules/css-tree/lib/syntax/pseudo/nth-last-child.js b/node_modules/css-tree/lib/syntax/pseudo/nth-last-child.js
new file mode 100644
index 0000000..ed62028
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/pseudo/nth-last-child.js
@@ -0,0 +1 @@
+module.exports = require('./common/nthWithOfClause');
diff --git a/node_modules/css-tree/lib/syntax/pseudo/nth-last-of-type.js b/node_modules/css-tree/lib/syntax/pseudo/nth-last-of-type.js
new file mode 100644
index 0000000..9417189
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/pseudo/nth-last-of-type.js
@@ -0,0 +1 @@
+module.exports = require('./common/nth');
diff --git a/node_modules/css-tree/lib/syntax/pseudo/nth-of-type.js b/node_modules/css-tree/lib/syntax/pseudo/nth-of-type.js
new file mode 100644
index 0000000..9417189
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/pseudo/nth-of-type.js
@@ -0,0 +1 @@
+module.exports = require('./common/nth');
diff --git a/node_modules/css-tree/lib/syntax/pseudo/slotted.js b/node_modules/css-tree/lib/syntax/pseudo/slotted.js
new file mode 100644
index 0000000..9719f44
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/pseudo/slotted.js
@@ -0,0 +1,7 @@
+module.exports = {
+    parse: function compoundSelector() {
+        return this.createSingleNodeList(
+            this.Selector()
+        );
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/scope/atrulePrelude.js b/node_modules/css-tree/lib/syntax/scope/atrulePrelude.js
new file mode 100644
index 0000000..a4bcab6
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/scope/atrulePrelude.js
@@ -0,0 +1,3 @@
+module.exports = {
+    getNode: require('./default')
+};
diff --git a/node_modules/css-tree/lib/syntax/scope/default.js b/node_modules/css-tree/lib/syntax/scope/default.js
new file mode 100644
index 0000000..a1c6a31
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/scope/default.js
@@ -0,0 +1,87 @@
+var cmpChar = require('../../tokenizer').cmpChar;
+var cmpStr = require('../../tokenizer').cmpStr;
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var STRING = TYPE.String;
+var NUMBER = TYPE.Number;
+var FUNCTION = TYPE.Function;
+var URL = TYPE.Url;
+var HASH = TYPE.Hash;
+var DIMENSION = TYPE.Dimension;
+var PERCENTAGE = TYPE.Percentage;
+var LEFTPARENTHESIS = TYPE.LeftParenthesis;
+var LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;
+var COMMA = TYPE.Comma;
+var DELIM = TYPE.Delim;
+var NUMBERSIGN = 0x0023;  // U+0023 NUMBER SIGN (#)
+var ASTERISK = 0x002A;    // U+002A ASTERISK (*)
+var PLUSSIGN = 0x002B;    // U+002B PLUS SIGN (+)
+var HYPHENMINUS = 0x002D; // U+002D HYPHEN-MINUS (-)
+var SOLIDUS = 0x002F;     // U+002F SOLIDUS (/)
+var U = 0x0075;           // U+0075 LATIN SMALL LETTER U (u)
+
+module.exports = function defaultRecognizer(context) {
+    switch (this.scanner.tokenType) {
+        case HASH:
+            return this.Hash();
+
+        case COMMA:
+            context.space = null;
+            context.ignoreWSAfter = true;
+            return this.Operator();
+
+        case LEFTPARENTHESIS:
+            return this.Parentheses(this.readSequence, context.recognizer);
+
+        case LEFTSQUAREBRACKET:
+            return this.Brackets(this.readSequence, context.recognizer);
+
+        case STRING:
+            return this.String();
+
+        case DIMENSION:
+            return this.Dimension();
+
+        case PERCENTAGE:
+            return this.Percentage();
+
+        case NUMBER:
+            return this.Number();
+
+        case FUNCTION:
+            return cmpStr(this.scanner.source, this.scanner.tokenStart, this.scanner.tokenEnd, 'url(')
+                ? this.Url()
+                : this.Function(this.readSequence, context.recognizer);
+
+        case URL:
+            return this.Url();
+
+        case IDENT:
+            // check for unicode range, it should start with u+ or U+
+            if (cmpChar(this.scanner.source, this.scanner.tokenStart, U) &&
+                cmpChar(this.scanner.source, this.scanner.tokenStart + 1, PLUSSIGN)) {
+                return this.UnicodeRange();
+            } else {
+                return this.Identifier();
+            }
+
+        case DELIM:
+            var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+
+            if (code === SOLIDUS ||
+                code === ASTERISK ||
+                code === PLUSSIGN ||
+                code === HYPHENMINUS) {
+                return this.Operator(); // TODO: replace with Delim
+            }
+
+            // TODO: produce a node with Delim node type
+
+            if (code === NUMBERSIGN) {
+                this.error('Hex or identifier is expected', this.scanner.tokenStart + 1);
+            }
+
+            break;
+    }
+};
diff --git a/node_modules/css-tree/lib/syntax/scope/index.js b/node_modules/css-tree/lib/syntax/scope/index.js
new file mode 100644
index 0000000..d217ff8
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/scope/index.js
@@ -0,0 +1,5 @@
+module.exports = {
+    AtrulePrelude: require('./atrulePrelude'),
+    Selector: require('./selector'),
+    Value: require('./value')
+};
diff --git a/node_modules/css-tree/lib/syntax/scope/selector.js b/node_modules/css-tree/lib/syntax/scope/selector.js
new file mode 100644
index 0000000..7cb990b
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/scope/selector.js
@@ -0,0 +1,80 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var DELIM = TYPE.Delim;
+var IDENT = TYPE.Ident;
+var DIMENSION = TYPE.Dimension;
+var PERCENTAGE = TYPE.Percentage;
+var NUMBER = TYPE.Number;
+var HASH = TYPE.Hash;
+var COLON = TYPE.Colon;
+var LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;
+var NUMBERSIGN = 0x0023;      // U+0023 NUMBER SIGN (#)
+var ASTERISK = 0x002A;        // U+002A ASTERISK (*)
+var PLUSSIGN = 0x002B;        // U+002B PLUS SIGN (+)
+var SOLIDUS = 0x002F;         // U+002F SOLIDUS (/)
+var FULLSTOP = 0x002E;        // U+002E FULL STOP (.)
+var GREATERTHANSIGN = 0x003E; // U+003E GREATER-THAN SIGN (>)
+var VERTICALLINE = 0x007C;    // U+007C VERTICAL LINE (|)
+var TILDE = 0x007E;           // U+007E TILDE (~)
+
+function getNode(context) {
+    switch (this.scanner.tokenType) {
+        case LEFTSQUAREBRACKET:
+            return this.AttributeSelector();
+
+        case HASH:
+            return this.IdSelector();
+
+        case COLON:
+            if (this.scanner.lookupType(1) === COLON) {
+                return this.PseudoElementSelector();
+            } else {
+                return this.PseudoClassSelector();
+            }
+
+        case IDENT:
+            return this.TypeSelector();
+
+        case NUMBER:
+        case PERCENTAGE:
+            return this.Percentage();
+
+        case DIMENSION:
+            // throws when .123ident
+            if (this.scanner.source.charCodeAt(this.scanner.tokenStart) === FULLSTOP) {
+                this.error('Identifier is expected', this.scanner.tokenStart + 1);
+            }
+            break;
+
+        case DELIM:
+            var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+
+            switch (code) {
+                case PLUSSIGN:
+                case GREATERTHANSIGN:
+                case TILDE:
+                    context.space = null;
+                    context.ignoreWSAfter = true;
+                    return this.Combinator();
+
+                case SOLIDUS:  // /deep/
+                    return this.Combinator();
+
+                case FULLSTOP:
+                    return this.ClassSelector();
+
+                case ASTERISK:
+                case VERTICALLINE:
+                    return this.TypeSelector();
+
+                case NUMBERSIGN:
+                    return this.IdSelector();
+            }
+
+            break;
+    }
+};
+
+module.exports = {
+    getNode: getNode
+};
diff --git a/node_modules/css-tree/lib/syntax/scope/value.js b/node_modules/css-tree/lib/syntax/scope/value.js
new file mode 100644
index 0000000..0403eb8
--- /dev/null
+++ b/node_modules/css-tree/lib/syntax/scope/value.js
@@ -0,0 +1,5 @@
+module.exports = {
+    getNode: require('./default'),
+    'expression': require('../function/expression'),
+    'var': require('../function/var')
+};
diff --git a/node_modules/css-tree/lib/tokenizer/char-code-definitions.js b/node_modules/css-tree/lib/tokenizer/char-code-definitions.js
new file mode 100644
index 0000000..fb9ec3f
--- /dev/null
+++ b/node_modules/css-tree/lib/tokenizer/char-code-definitions.js
@@ -0,0 +1,249 @@
+var EOF = 0;
+
+// https://drafts.csswg.org/css-syntax-3/
+// § 4.2. Definitions
+
+// digit
+// A code point between U+0030 DIGIT ZERO (0) and U+0039 DIGIT NINE (9).
+function isDigit(code) {
+    return code >= 0x0030 && code <= 0x0039;
+}
+
+// hex digit
+// A digit, or a code point between U+0041 LATIN CAPITAL LETTER A (A) and U+0046 LATIN CAPITAL LETTER F (F),
+// or a code point between U+0061 LATIN SMALL LETTER A (a) and U+0066 LATIN SMALL LETTER F (f).
+function isHexDigit(code) {
+    return (
+        isDigit(code) || // 0 .. 9
+        (code >= 0x0041 && code <= 0x0046) || // A .. F
+        (code >= 0x0061 && code <= 0x0066)    // a .. f
+    );
+}
+
+// uppercase letter
+// A code point between U+0041 LATIN CAPITAL LETTER A (A) and U+005A LATIN CAPITAL LETTER Z (Z).
+function isUppercaseLetter(code) {
+    return code >= 0x0041 && code <= 0x005A;
+}
+
+// lowercase letter
+// A code point between U+0061 LATIN SMALL LETTER A (a) and U+007A LATIN SMALL LETTER Z (z).
+function isLowercaseLetter(code) {
+    return code >= 0x0061 && code <= 0x007A;
+}
+
+// letter
+// An uppercase letter or a lowercase letter.
+function isLetter(code) {
+    return isUppercaseLetter(code) || isLowercaseLetter(code);
+}
+
+// non-ASCII code point
+// A code point with a value equal to or greater than U+0080 <control>.
+function isNonAscii(code) {
+    return code >= 0x0080;
+}
+
+// name-start code point
+// A letter, a non-ASCII code point, or U+005F LOW LINE (_).
+function isNameStart(code) {
+    return isLetter(code) || isNonAscii(code) || code === 0x005F;
+}
+
+// name code point
+// A name-start code point, a digit, or U+002D HYPHEN-MINUS (-).
+function isName(code) {
+    return isNameStart(code) || isDigit(code) || code === 0x002D;
+}
+
+// non-printable code point
+// A code point between U+0000 NULL and U+0008 BACKSPACE, or U+000B LINE TABULATION,
+// or a code point between U+000E SHIFT OUT and U+001F INFORMATION SEPARATOR ONE, or U+007F DELETE.
+function isNonPrintable(code) {
+    return (
+        (code >= 0x0000 && code <= 0x0008) ||
+        (code === 0x000B) ||
+        (code >= 0x000E && code <= 0x001F) ||
+        (code === 0x007F)
+    );
+}
+
+// newline
+// U+000A LINE FEED. Note that U+000D CARRIAGE RETURN and U+000C FORM FEED are not included in this definition,
+// as they are converted to U+000A LINE FEED during preprocessing.
+// TODO: we doesn't do a preprocessing, so check a code point for U+000D CARRIAGE RETURN and U+000C FORM FEED
+function isNewline(code) {
+    return code === 0x000A || code === 0x000D || code === 0x000C;
+}
+
+// whitespace
+// A newline, U+0009 CHARACTER TABULATION, or U+0020 SPACE.
+function isWhiteSpace(code) {
+    return isNewline(code) || code === 0x0020 || code === 0x0009;
+}
+
+// § 4.3.8. Check if two code points are a valid escape
+function isValidEscape(first, second) {
+    // If the first code point is not U+005C REVERSE SOLIDUS (\), return false.
+    if (first !== 0x005C) {
+        return false;
+    }
+
+    // Otherwise, if the second code point is a newline or EOF, return false.
+    if (isNewline(second) || second === EOF) {
+        return false;
+    }
+
+    // Otherwise, return true.
+    return true;
+}
+
+// § 4.3.9. Check if three code points would start an identifier
+function isIdentifierStart(first, second, third) {
+    // Look at the first code point:
+
+    // U+002D HYPHEN-MINUS
+    if (first === 0x002D) {
+        // If the second code point is a name-start code point or a U+002D HYPHEN-MINUS,
+        // or the second and third code points are a valid escape, return true. Otherwise, return false.
+        return (
+            isNameStart(second) ||
+            second === 0x002D ||
+            isValidEscape(second, third)
+        );
+    }
+
+    // name-start code point
+    if (isNameStart(first)) {
+        // Return true.
+        return true;
+    }
+
+    // U+005C REVERSE SOLIDUS (\)
+    if (first === 0x005C) {
+        // If the first and second code points are a valid escape, return true. Otherwise, return false.
+        return isValidEscape(first, second);
+    }
+
+    // anything else
+    // Return false.
+    return false;
+}
+
+// § 4.3.10. Check if three code points would start a number
+function isNumberStart(first, second, third) {
+    // Look at the first code point:
+
+    // U+002B PLUS SIGN (+)
+    // U+002D HYPHEN-MINUS (-)
+    if (first === 0x002B || first === 0x002D) {
+        // If the second code point is a digit, return true.
+        if (isDigit(second)) {
+            return 2;
+        }
+
+        // Otherwise, if the second code point is a U+002E FULL STOP (.)
+        // and the third code point is a digit, return true.
+        // Otherwise, return false.
+        return second === 0x002E && isDigit(third) ? 3 : 0;
+    }
+
+    // U+002E FULL STOP (.)
+    if (first === 0x002E) {
+        // If the second code point is a digit, return true. Otherwise, return false.
+        return isDigit(second) ? 2 : 0;
+    }
+
+    // digit
+    if (isDigit(first)) {
+        // Return true.
+        return 1;
+    }
+
+    // anything else
+    // Return false.
+    return 0;
+}
+
+//
+// Misc
+//
+
+// detect BOM (https://en.wikipedia.org/wiki/Byte_order_mark)
+function isBOM(code) {
+    // UTF-16BE
+    if (code === 0xFEFF) {
+        return 1;
+    }
+
+    // UTF-16LE
+    if (code === 0xFFFE) {
+        return 1;
+    }
+
+    return 0;
+}
+
+// Fast code category
+//
+// https://drafts.csswg.org/css-syntax/#tokenizer-definitions
+// > non-ASCII code point
+// >   A code point with a value equal to or greater than U+0080 <control>
+// > name-start code point
+// >   A letter, a non-ASCII code point, or U+005F LOW LINE (_).
+// > name code point
+// >   A name-start code point, a digit, or U+002D HYPHEN-MINUS (-)
+// That means only ASCII code points has a special meaning and we define a maps for 0..127 codes only
+var CATEGORY = new Array(0x80);
+charCodeCategory.Eof = 0x80;
+charCodeCategory.WhiteSpace = 0x82;
+charCodeCategory.Digit = 0x83;
+charCodeCategory.NameStart = 0x84;
+charCodeCategory.NonPrintable = 0x85;
+
+for (var i = 0; i < CATEGORY.length; i++) {
+    switch (true) {
+        case isWhiteSpace(i):
+            CATEGORY[i] = charCodeCategory.WhiteSpace;
+            break;
+
+        case isDigit(i):
+            CATEGORY[i] = charCodeCategory.Digit;
+            break;
+
+        case isNameStart(i):
+            CATEGORY[i] = charCodeCategory.NameStart;
+            break;
+
+        case isNonPrintable(i):
+            CATEGORY[i] = charCodeCategory.NonPrintable;
+            break;
+
+        default:
+            CATEGORY[i] = i || charCodeCategory.Eof;
+    }
+}
+
+function charCodeCategory(code) {
+    return code < 0x80 ? CATEGORY[code] : charCodeCategory.NameStart;
+};
+
+module.exports = {
+    isDigit: isDigit,
+    isHexDigit: isHexDigit,
+    isUppercaseLetter: isUppercaseLetter,
+    isLowercaseLetter: isLowercaseLetter,
+    isLetter: isLetter,
+    isNonAscii: isNonAscii,
+    isNameStart: isNameStart,
+    isName: isName,
+    isNonPrintable: isNonPrintable,
+    isNewline: isNewline,
+    isWhiteSpace: isWhiteSpace,
+    isValidEscape: isValidEscape,
+    isIdentifierStart: isIdentifierStart,
+    isNumberStart: isNumberStart,
+
+    isBOM: isBOM,
+    charCodeCategory: charCodeCategory
+};
diff --git a/node_modules/css-tree/lib/tokenizer/const.js b/node_modules/css-tree/lib/tokenizer/const.js
new file mode 100644
index 0000000..e0f8869
--- /dev/null
+++ b/node_modules/css-tree/lib/tokenizer/const.js
@@ -0,0 +1,40 @@
+// CSS Syntax Module Level 3
+// https://www.w3.org/TR/css-syntax-3/
+var TYPE = {
+    EOF: 0,                 // <EOF-token>
+    Ident: 1,               // <ident-token>
+    Function: 2,            // <function-token>
+    AtKeyword: 3,           // <at-keyword-token>
+    Hash: 4,                // <hash-token>
+    String: 5,              // <string-token>
+    BadString: 6,           // <bad-string-token>
+    Url: 7,                 // <url-token>
+    BadUrl: 8,              // <bad-url-token>
+    Delim: 9,               // <delim-token>
+    Number: 10,             // <number-token>
+    Percentage: 11,         // <percentage-token>
+    Dimension: 12,          // <dimension-token>
+    WhiteSpace: 13,         // <whitespace-token>
+    CDO: 14,                // <CDO-token>
+    CDC: 15,                // <CDC-token>
+    Colon: 16,              // <colon-token>     :
+    Semicolon: 17,          // <semicolon-token> ;
+    Comma: 18,              // <comma-token>     ,
+    LeftSquareBracket: 19,  // <[-token>
+    RightSquareBracket: 20, // <]-token>
+    LeftParenthesis: 21,    // <(-token>
+    RightParenthesis: 22,   // <)-token>
+    LeftCurlyBracket: 23,   // <{-token>
+    RightCurlyBracket: 24,  // <}-token>
+    Comment: 25
+};
+
+var NAME = Object.keys(TYPE).reduce(function(result, key) {
+    result[TYPE[key]] = key;
+    return result;
+}, {});
+
+module.exports = {
+    TYPE: TYPE,
+    NAME: NAME
+};
diff --git a/node_modules/css-tree/lib/tokenizer/index.js b/node_modules/css-tree/lib/tokenizer/index.js
new file mode 100644
index 0000000..dd7ada2
--- /dev/null
+++ b/node_modules/css-tree/lib/tokenizer/index.js
@@ -0,0 +1,591 @@
+var TokenStream = require('../common/TokenStream');
+var adoptBuffer = require('../common/adopt-buffer');
+
+var constants = require('./const');
+var TYPE = constants.TYPE;
+
+var charCodeDefinitions = require('./char-code-definitions');
+var isNewline = charCodeDefinitions.isNewline;
+var isName = charCodeDefinitions.isName;
+var isValidEscape = charCodeDefinitions.isValidEscape;
+var isNumberStart = charCodeDefinitions.isNumberStart;
+var isIdentifierStart = charCodeDefinitions.isIdentifierStart;
+var charCodeCategory = charCodeDefinitions.charCodeCategory;
+var isBOM = charCodeDefinitions.isBOM;
+
+var utils = require('./utils');
+var cmpStr = utils.cmpStr;
+var getNewlineLength = utils.getNewlineLength;
+var findWhiteSpaceEnd = utils.findWhiteSpaceEnd;
+var consumeEscaped = utils.consumeEscaped;
+var consumeName = utils.consumeName;
+var consumeNumber = utils.consumeNumber;
+var consumeBadUrlRemnants = utils.consumeBadUrlRemnants;
+
+var OFFSET_MASK = 0x00FFFFFF;
+var TYPE_SHIFT = 24;
+
+function tokenize(source, stream) {
+    function getCharCode(offset) {
+        return offset < sourceLength ? source.charCodeAt(offset) : 0;
+    }
+
+    // § 4.3.3. Consume a numeric token
+    function consumeNumericToken() {
+        // Consume a number and let number be the result.
+        offset = consumeNumber(source, offset);
+
+        // If the next 3 input code points would start an identifier, then:
+        if (isIdentifierStart(getCharCode(offset), getCharCode(offset + 1), getCharCode(offset + 2))) {
+            // Create a <dimension-token> with the same value and type flag as number, and a unit set initially to the empty string.
+            // Consume a name. Set the <dimension-token>’s unit to the returned value.
+            // Return the <dimension-token>.
+            type = TYPE.Dimension;
+            offset = consumeName(source, offset);
+            return;
+        }
+
+        // Otherwise, if the next input code point is U+0025 PERCENTAGE SIGN (%), consume it.
+        if (getCharCode(offset) === 0x0025) {
+            // Create a <percentage-token> with the same value as number, and return it.
+            type = TYPE.Percentage;
+            offset++;
+            return;
+        }
+
+        // Otherwise, create a <number-token> with the same value and type flag as number, and return it.
+        type = TYPE.Number;
+    }
+
+    // § 4.3.4. Consume an ident-like token
+    function consumeIdentLikeToken() {
+        const nameStartOffset = offset;
+
+        // Consume a name, and let string be the result.
+        offset = consumeName(source, offset);
+
+        // If string’s value is an ASCII case-insensitive match for "url",
+        // and the next input code point is U+0028 LEFT PARENTHESIS ((), consume it.
+        if (cmpStr(source, nameStartOffset, offset, 'url') && getCharCode(offset) === 0x0028) {
+            // While the next two input code points are whitespace, consume the next input code point.
+            offset = findWhiteSpaceEnd(source, offset + 1);
+
+            // If the next one or two input code points are U+0022 QUOTATION MARK ("), U+0027 APOSTROPHE ('),
+            // or whitespace followed by U+0022 QUOTATION MARK (") or U+0027 APOSTROPHE ('),
+            // then create a <function-token> with its value set to string and return it.
+            if (getCharCode(offset) === 0x0022 ||
+                getCharCode(offset) === 0x0027) {
+                type = TYPE.Function;
+                offset = nameStartOffset + 4;
+                return;
+            }
+
+            // Otherwise, consume a url token, and return it.
+            consumeUrlToken();
+            return;
+        }
+
+        // Otherwise, if the next input code point is U+0028 LEFT PARENTHESIS ((), consume it.
+        // Create a <function-token> with its value set to string and return it.
+        if (getCharCode(offset) === 0x0028) {
+            type = TYPE.Function;
+            offset++;
+            return;
+        }
+
+        // Otherwise, create an <ident-token> with its value set to string and return it.
+        type = TYPE.Ident;
+    }
+
+    // § 4.3.5. Consume a string token
+    function consumeStringToken(endingCodePoint) {
+        // This algorithm may be called with an ending code point, which denotes the code point
+        // that ends the string. If an ending code point is not specified,
+        // the current input code point is used.
+        if (!endingCodePoint) {
+            endingCodePoint = getCharCode(offset++);
+        }
+
+        // Initially create a <string-token> with its value set to the empty string.
+        type = TYPE.String;
+
+        // Repeatedly consume the next input code point from the stream:
+        for (; offset < source.length; offset++) {
+            var code = source.charCodeAt(offset);
+
+            switch (charCodeCategory(code)) {
+                // ending code point
+                case endingCodePoint:
+                    // Return the <string-token>.
+                    offset++;
+                    return;
+
+                // EOF
+                case charCodeCategory.Eof:
+                    // This is a parse error. Return the <string-token>.
+                    return;
+
+                // newline
+                case charCodeCategory.WhiteSpace:
+                    if (isNewline(code)) {
+                        // This is a parse error. Reconsume the current input code point,
+                        // create a <bad-string-token>, and return it.
+                        offset += getNewlineLength(source, offset, code);
+                        type = TYPE.BadString;
+                        return;
+                    }
+                    break;
+
+                // U+005C REVERSE SOLIDUS (\)
+                case 0x005C:
+                    // If the next input code point is EOF, do nothing.
+                    if (offset === source.length - 1) {
+                        break;
+                    }
+
+                    var nextCode = getCharCode(offset + 1);
+
+                    // Otherwise, if the next input code point is a newline, consume it.
+                    if (isNewline(nextCode)) {
+                        offset += getNewlineLength(source, offset + 1, nextCode);
+                    } else if (isValidEscape(code, nextCode)) {
+                        // Otherwise, (the stream starts with a valid escape) consume
+                        // an escaped code point and append the returned code point to
+                        // the <string-token>’s value.
+                        offset = consumeEscaped(source, offset) - 1;
+                    }
+                    break;
+
+                // anything else
+                // Append the current input code point to the <string-token>’s value.
+            }
+        }
+    }
+
+    // § 4.3.6. Consume a url token
+    // Note: This algorithm assumes that the initial "url(" has already been consumed.
+    // This algorithm also assumes that it’s being called to consume an "unquoted" value, like url(foo).
+    // A quoted value, like url("foo"), is parsed as a <function-token>. Consume an ident-like token
+    // automatically handles this distinction; this algorithm shouldn’t be called directly otherwise.
+    function consumeUrlToken() {
+        // Initially create a <url-token> with its value set to the empty string.
+        type = TYPE.Url;
+
+        // Consume as much whitespace as possible.
+        offset = findWhiteSpaceEnd(source, offset);
+
+        // Repeatedly consume the next input code point from the stream:
+        for (; offset < source.length; offset++) {
+            var code = source.charCodeAt(offset);
+
+            switch (charCodeCategory(code)) {
+                // U+0029 RIGHT PARENTHESIS ())
+                case 0x0029:
+                    // Return the <url-token>.
+                    offset++;
+                    return;
+
+                // EOF
+                case charCodeCategory.Eof:
+                    // This is a parse error. Return the <url-token>.
+                    return;
+
+                // whitespace
+                case charCodeCategory.WhiteSpace:
+                    // Consume as much whitespace as possible.
+                    offset = findWhiteSpaceEnd(source, offset);
+
+                    // If the next input code point is U+0029 RIGHT PARENTHESIS ()) or EOF,
+                    // consume it and return the <url-token>
+                    // (if EOF was encountered, this is a parse error);
+                    if (getCharCode(offset) === 0x0029 || offset >= source.length) {
+                        if (offset < source.length) {
+                            offset++;
+                        }
+                        return;
+                    }
+
+                    // otherwise, consume the remnants of a bad url, create a <bad-url-token>,
+                    // and return it.
+                    offset = consumeBadUrlRemnants(source, offset);
+                    type = TYPE.BadUrl;
+                    return;
+
+                // U+0022 QUOTATION MARK (")
+                // U+0027 APOSTROPHE (')
+                // U+0028 LEFT PARENTHESIS (()
+                // non-printable code point
+                case 0x0022:
+                case 0x0027:
+                case 0x0028:
+                case charCodeCategory.NonPrintable:
+                    // This is a parse error. Consume the remnants of a bad url,
+                    // create a <bad-url-token>, and return it.
+                    offset = consumeBadUrlRemnants(source, offset);
+                    type = TYPE.BadUrl;
+                    return;
+
+                // U+005C REVERSE SOLIDUS (\)
+                case 0x005C:
+                    // If the stream starts with a valid escape, consume an escaped code point and
+                    // append the returned code point to the <url-token>’s value.
+                    if (isValidEscape(code, getCharCode(offset + 1))) {
+                        offset = consumeEscaped(source, offset) - 1;
+                        break;
+                    }
+
+                    // Otherwise, this is a parse error. Consume the remnants of a bad url,
+                    // create a <bad-url-token>, and return it.
+                    offset = consumeBadUrlRemnants(source, offset);
+                    type = TYPE.BadUrl;
+                    return;
+
+                // anything else
+                // Append the current input code point to the <url-token>’s value.
+            }
+        }
+    }
+
+    if (!stream) {
+        stream = new TokenStream();
+    }
+
+    // ensure source is a string
+    source = String(source || '');
+
+    var sourceLength = source.length;
+    var offsetAndType = adoptBuffer(stream.offsetAndType, sourceLength + 1); // +1 because of eof-token
+    var balance = adoptBuffer(stream.balance, sourceLength + 1);
+    var tokenCount = 0;
+    var start = isBOM(getCharCode(0));
+    var offset = start;
+    var balanceCloseType = 0;
+    var balanceStart = 0;
+    var balancePrev = 0;
+
+    // https://drafts.csswg.org/css-syntax-3/#consume-token
+    // § 4.3.1. Consume a token
+    while (offset < sourceLength) {
+        var code = source.charCodeAt(offset);
+        var type = 0;
+
+        balance[tokenCount] = sourceLength;
+
+        switch (charCodeCategory(code)) {
+            // whitespace
+            case charCodeCategory.WhiteSpace:
+                // Consume as much whitespace as possible. Return a <whitespace-token>.
+                type = TYPE.WhiteSpace;
+                offset = findWhiteSpaceEnd(source, offset + 1);
+                break;
+
+            // U+0022 QUOTATION MARK (")
+            case 0x0022:
+                // Consume a string token and return it.
+                consumeStringToken();
+                break;
+
+            // U+0023 NUMBER SIGN (#)
+            case 0x0023:
+                // If the next input code point is a name code point or the next two input code points are a valid escape, then:
+                if (isName(getCharCode(offset + 1)) || isValidEscape(getCharCode(offset + 1), getCharCode(offset + 2))) {
+                    // Create a <hash-token>.
+                    type = TYPE.Hash;
+
+                    // If the next 3 input code points would start an identifier, set the <hash-token>’s type flag to "id".
+                    // if (isIdentifierStart(getCharCode(offset + 1), getCharCode(offset + 2), getCharCode(offset + 3))) {
+                    //     // TODO: set id flag
+                    // }
+
+                    // Consume a name, and set the <hash-token>’s value to the returned string.
+                    offset = consumeName(source, offset + 1);
+
+                    // Return the <hash-token>.
+                } else {
+                    // Otherwise, return a <delim-token> with its value set to the current input code point.
+                    type = TYPE.Delim;
+                    offset++;
+                }
+
+                break;
+
+            // U+0027 APOSTROPHE (')
+            case 0x0027:
+                // Consume a string token and return it.
+                consumeStringToken();
+                break;
+
+            // U+0028 LEFT PARENTHESIS (()
+            case 0x0028:
+                // Return a <(-token>.
+                type = TYPE.LeftParenthesis;
+                offset++;
+                break;
+
+            // U+0029 RIGHT PARENTHESIS ())
+            case 0x0029:
+                // Return a <)-token>.
+                type = TYPE.RightParenthesis;
+                offset++;
+                break;
+
+            // U+002B PLUS SIGN (+)
+            case 0x002B:
+                // If the input stream starts with a number, ...
+                if (isNumberStart(code, getCharCode(offset + 1), getCharCode(offset + 2))) {
+                    // ... reconsume the current input code point, consume a numeric token, and return it.
+                    consumeNumericToken();
+                } else {
+                    // Otherwise, return a <delim-token> with its value set to the current input code point.
+                    type = TYPE.Delim;
+                    offset++;
+                }
+                break;
+
+            // U+002C COMMA (,)
+            case 0x002C:
+                // Return a <comma-token>.
+                type = TYPE.Comma;
+                offset++;
+                break;
+
+            // U+002D HYPHEN-MINUS (-)
+            case 0x002D:
+                // If the input stream starts with a number, reconsume the current input code point, consume a numeric token, and return it.
+                if (isNumberStart(code, getCharCode(offset + 1), getCharCode(offset + 2))) {
+                    consumeNumericToken();
+                } else {
+                    // Otherwise, if the next 2 input code points are U+002D HYPHEN-MINUS U+003E GREATER-THAN SIGN (->), consume them and return a <CDC-token>.
+                    if (getCharCode(offset + 1) === 0x002D &&
+                        getCharCode(offset + 2) === 0x003E) {
+                        type = TYPE.CDC;
+                        offset = offset + 3;
+                    } else {
+                        // Otherwise, if the input stream starts with an identifier, ...
+                        if (isIdentifierStart(code, getCharCode(offset + 1), getCharCode(offset + 2))) {
+                            // ... reconsume the current input code point, consume an ident-like token, and return it.
+                            consumeIdentLikeToken();
+                        } else {
+                            // Otherwise, return a <delim-token> with its value set to the current input code point.
+                            type = TYPE.Delim;
+                            offset++;
+                        }
+                    }
+                }
+                break;
+
+            // U+002E FULL STOP (.)
+            case 0x002E:
+                // If the input stream starts with a number, ...
+                if (isNumberStart(code, getCharCode(offset + 1), getCharCode(offset + 2))) {
+                    // ... reconsume the current input code point, consume a numeric token, and return it.
+                    consumeNumericToken();
+                } else {
+                    // Otherwise, return a <delim-token> with its value set to the current input code point.
+                    type = TYPE.Delim;
+                    offset++;
+                }
+
+                break;
+
+            // U+002F SOLIDUS (/)
+            case 0x002F:
+                // If the next two input code point are U+002F SOLIDUS (/) followed by a U+002A ASTERISK (*),
+                if (getCharCode(offset + 1) === 0x002A) {
+                    // ... consume them and all following code points up to and including the first U+002A ASTERISK (*)
+                    // followed by a U+002F SOLIDUS (/), or up to an EOF code point.
+                    type = TYPE.Comment;
+                    offset = source.indexOf('*/', offset + 2) + 2;
+                    if (offset === 1) {
+                        offset = source.length;
+                    }
+                } else {
+                    type = TYPE.Delim;
+                    offset++;
+                }
+                break;
+
+            // U+003A COLON (:)
+            case 0x003A:
+                // Return a <colon-token>.
+                type = TYPE.Colon;
+                offset++;
+                break;
+
+            // U+003B SEMICOLON (;)
+            case 0x003B:
+                // Return a <semicolon-token>.
+                type = TYPE.Semicolon;
+                offset++;
+                break;
+
+            // U+003C LESS-THAN SIGN (<)
+            case 0x003C:
+                // If the next 3 input code points are U+0021 EXCLAMATION MARK U+002D HYPHEN-MINUS U+002D HYPHEN-MINUS (!--), ...
+                if (getCharCode(offset + 1) === 0x0021 &&
+                    getCharCode(offset + 2) === 0x002D &&
+                    getCharCode(offset + 3) === 0x002D) {
+                    // ... consume them and return a <CDO-token>.
+                    type = TYPE.CDO;
+                    offset = offset + 4;
+                } else {
+                    // Otherwise, return a <delim-token> with its value set to the current input code point.
+                    type = TYPE.Delim;
+                    offset++;
+                }
+
+                break;
+
+            // U+0040 COMMERCIAL AT (@)
+            case 0x0040:
+                // If the next 3 input code points would start an identifier, ...
+                if (isIdentifierStart(getCharCode(offset + 1), getCharCode(offset + 2), getCharCode(offset + 3))) {
+                    // ... consume a name, create an <at-keyword-token> with its value set to the returned value, and return it.
+                    type = TYPE.AtKeyword;
+                    offset = consumeName(source, offset + 1);
+                } else {
+                    // Otherwise, return a <delim-token> with its value set to the current input code point.
+                    type = TYPE.Delim;
+                    offset++;
+                }
+
+                break;
+
+            // U+005B LEFT SQUARE BRACKET ([)
+            case 0x005B:
+                // Return a <[-token>.
+                type = TYPE.LeftSquareBracket;
+                offset++;
+                break;
+
+            // U+005C REVERSE SOLIDUS (\)
+            case 0x005C:
+                // If the input stream starts with a valid escape, ...
+                if (isValidEscape(code, getCharCode(offset + 1))) {
+                    // ... reconsume the current input code point, consume an ident-like token, and return it.
+                    consumeIdentLikeToken();
+                } else {
+                    // Otherwise, this is a parse error. Return a <delim-token> with its value set to the current input code point.
+                    type = TYPE.Delim;
+                    offset++;
+                }
+                break;
+
+            // U+005D RIGHT SQUARE BRACKET (])
+            case 0x005D:
+                // Return a <]-token>.
+                type = TYPE.RightSquareBracket;
+                offset++;
+                break;
+
+            // U+007B LEFT CURLY BRACKET ({)
+            case 0x007B:
+                // Return a <{-token>.
+                type = TYPE.LeftCurlyBracket;
+                offset++;
+                break;
+
+            // U+007D RIGHT CURLY BRACKET (})
+            case 0x007D:
+                // Return a <}-token>.
+                type = TYPE.RightCurlyBracket;
+                offset++;
+                break;
+
+            // digit
+            case charCodeCategory.Digit:
+                // Reconsume the current input code point, consume a numeric token, and return it.
+                consumeNumericToken();
+                break;
+
+            // name-start code point
+            case charCodeCategory.NameStart:
+                // Reconsume the current input code point, consume an ident-like token, and return it.
+                consumeIdentLikeToken();
+                break;
+
+            // EOF
+            case charCodeCategory.Eof:
+                // Return an <EOF-token>.
+                break;
+
+            // anything else
+            default:
+                // Return a <delim-token> with its value set to the current input code point.
+                type = TYPE.Delim;
+                offset++;
+        }
+
+        switch (type) {
+            case balanceCloseType:
+                balancePrev = balanceStart & OFFSET_MASK;
+                balanceStart = balance[balancePrev];
+                balanceCloseType = balanceStart >> TYPE_SHIFT;
+                balance[tokenCount] = balancePrev;
+                balance[balancePrev++] = tokenCount;
+                for (; balancePrev < tokenCount; balancePrev++) {
+                    if (balance[balancePrev] === sourceLength) {
+                        balance[balancePrev] = tokenCount;
+                    }
+                }
+                break;
+
+            case TYPE.LeftParenthesis:
+            case TYPE.Function:
+                balance[tokenCount] = balanceStart;
+                balanceCloseType = TYPE.RightParenthesis;
+                balanceStart = (balanceCloseType << TYPE_SHIFT) | tokenCount;
+                break;
+
+            case TYPE.LeftSquareBracket:
+                balance[tokenCount] = balanceStart;
+                balanceCloseType = TYPE.RightSquareBracket;
+                balanceStart = (balanceCloseType << TYPE_SHIFT) | tokenCount;
+                break;
+
+            case TYPE.LeftCurlyBracket:
+                balance[tokenCount] = balanceStart;
+                balanceCloseType = TYPE.RightCurlyBracket;
+                balanceStart = (balanceCloseType << TYPE_SHIFT) | tokenCount;
+                break;
+        }
+
+        offsetAndType[tokenCount++] = (type << TYPE_SHIFT) | offset;
+    }
+
+    // finalize buffers
+    offsetAndType[tokenCount] = (TYPE.EOF << TYPE_SHIFT) | offset; // <EOF-token>
+    balance[tokenCount] = sourceLength;
+    balance[sourceLength] = sourceLength; // prevents false positive balance match with any token
+    while (balanceStart !== 0) {
+        balancePrev = balanceStart & OFFSET_MASK;
+        balanceStart = balance[balancePrev];
+        balance[balancePrev] = sourceLength;
+    }
+
+    // update stream
+    stream.source = source;
+    stream.firstCharOffset = start;
+    stream.offsetAndType = offsetAndType;
+    stream.tokenCount = tokenCount;
+    stream.balance = balance;
+    stream.reset();
+    stream.next();
+
+    return stream;
+}
+
+// extend tokenizer with constants
+Object.keys(constants).forEach(function(key) {
+    tokenize[key] = constants[key];
+});
+
+// extend tokenizer with static methods from utils
+Object.keys(charCodeDefinitions).forEach(function(key) {
+    tokenize[key] = charCodeDefinitions[key];
+});
+Object.keys(utils).forEach(function(key) {
+    tokenize[key] = utils[key];
+});
+
+module.exports = tokenize;
diff --git a/node_modules/css-tree/lib/tokenizer/utils.js b/node_modules/css-tree/lib/tokenizer/utils.js
new file mode 100644
index 0000000..f5a38ec
--- /dev/null
+++ b/node_modules/css-tree/lib/tokenizer/utils.js
@@ -0,0 +1,243 @@
+var charCodeDef = require('./char-code-definitions');
+var isDigit = charCodeDef.isDigit;
+var isHexDigit = charCodeDef.isHexDigit;
+var isUppercaseLetter = charCodeDef.isUppercaseLetter;
+var isName = charCodeDef.isName;
+var isWhiteSpace = charCodeDef.isWhiteSpace;
+var isValidEscape = charCodeDef.isValidEscape;
+
+function getCharCode(source, offset) {
+    return offset < source.length ? source.charCodeAt(offset) : 0;
+}
+
+function getNewlineLength(source, offset, code) {
+    if (code === 13 /* \r */ && getCharCode(source, offset + 1) === 10 /* \n */) {
+        return 2;
+    }
+
+    return 1;
+}
+
+function cmpChar(testStr, offset, referenceCode) {
+    var code = testStr.charCodeAt(offset);
+
+    // code.toLowerCase() for A..Z
+    if (isUppercaseLetter(code)) {
+        code = code | 32;
+    }
+
+    return code === referenceCode;
+}
+
+function cmpStr(testStr, start, end, referenceStr) {
+    if (end - start !== referenceStr.length) {
+        return false;
+    }
+
+    if (start < 0 || end > testStr.length) {
+        return false;
+    }
+
+    for (var i = start; i < end; i++) {
+        var testCode = testStr.charCodeAt(i);
+        var referenceCode = referenceStr.charCodeAt(i - start);
+
+        // testCode.toLowerCase() for A..Z
+        if (isUppercaseLetter(testCode)) {
+            testCode = testCode | 32;
+        }
+
+        if (testCode !== referenceCode) {
+            return false;
+        }
+    }
+
+    return true;
+}
+
+function findWhiteSpaceStart(source, offset) {
+    for (; offset >= 0; offset--) {
+        if (!isWhiteSpace(source.charCodeAt(offset))) {
+            break;
+        }
+    }
+
+    return offset + 1;
+}
+
+function findWhiteSpaceEnd(source, offset) {
+    for (; offset < source.length; offset++) {
+        if (!isWhiteSpace(source.charCodeAt(offset))) {
+            break;
+        }
+    }
+
+    return offset;
+}
+
+function findDecimalNumberEnd(source, offset) {
+    for (; offset < source.length; offset++) {
+        if (!isDigit(source.charCodeAt(offset))) {
+            break;
+        }
+    }
+
+    return offset;
+}
+
+// § 4.3.7. Consume an escaped code point
+function consumeEscaped(source, offset) {
+    // It assumes that the U+005C REVERSE SOLIDUS (\) has already been consumed and
+    // that the next input code point has already been verified to be part of a valid escape.
+    offset += 2;
+
+    // hex digit
+    if (isHexDigit(getCharCode(source, offset - 1))) {
+        // Consume as many hex digits as possible, but no more than 5.
+        // Note that this means 1-6 hex digits have been consumed in total.
+        for (var maxOffset = Math.min(source.length, offset + 5); offset < maxOffset; offset++) {
+            if (!isHexDigit(getCharCode(source, offset))) {
+                break;
+            }
+        }
+
+        // If the next input code point is whitespace, consume it as well.
+        var code = getCharCode(source, offset);
+        if (isWhiteSpace(code)) {
+            offset += getNewlineLength(source, offset, code);
+        }
+    }
+
+    return offset;
+}
+
+// §4.3.11. Consume a name
+// Note: This algorithm does not do the verification of the first few code points that are necessary
+// to ensure the returned code points would constitute an <ident-token>. If that is the intended use,
+// ensure that the stream starts with an identifier before calling this algorithm.
+function consumeName(source, offset) {
+    // Let result initially be an empty string.
+    // Repeatedly consume the next input code point from the stream:
+    for (; offset < source.length; offset++) {
+        var code = source.charCodeAt(offset);
+
+        // name code point
+        if (isName(code)) {
+            // Append the code point to result.
+            continue;
+        }
+
+        // the stream starts with a valid escape
+        if (isValidEscape(code, getCharCode(source, offset + 1))) {
+            // Consume an escaped code point. Append the returned code point to result.
+            offset = consumeEscaped(source, offset) - 1;
+            continue;
+        }
+
+        // anything else
+        // Reconsume the current input code point. Return result.
+        break;
+    }
+
+    return offset;
+}
+
+// §4.3.12. Consume a number
+function consumeNumber(source, offset) {
+    var code = source.charCodeAt(offset);
+
+    // 2. If the next input code point is U+002B PLUS SIGN (+) or U+002D HYPHEN-MINUS (-),
+    // consume it and append it to repr.
+    if (code === 0x002B || code === 0x002D) {
+        code = source.charCodeAt(offset += 1);
+    }
+
+    // 3. While the next input code point is a digit, consume it and append it to repr.
+    if (isDigit(code)) {
+        offset = findDecimalNumberEnd(source, offset + 1);
+        code = source.charCodeAt(offset);
+    }
+
+    // 4. If the next 2 input code points are U+002E FULL STOP (.) followed by a digit, then:
+    if (code === 0x002E && isDigit(source.charCodeAt(offset + 1))) {
+        // 4.1 Consume them.
+        // 4.2 Append them to repr.
+        code = source.charCodeAt(offset += 2);
+
+        // 4.3 Set type to "number".
+        // TODO
+
+        // 4.4 While the next input code point is a digit, consume it and append it to repr.
+
+        offset = findDecimalNumberEnd(source, offset);
+    }
+
+    // 5. If the next 2 or 3 input code points are U+0045 LATIN CAPITAL LETTER E (E)
+    // or U+0065 LATIN SMALL LETTER E (e), ... , followed by a digit, then:
+    if (cmpChar(source, offset, 101 /* e */)) {
+        var sign = 0;
+        code = source.charCodeAt(offset + 1);
+
+        // ... optionally followed by U+002D HYPHEN-MINUS (-) or U+002B PLUS SIGN (+) ...
+        if (code === 0x002D || code === 0x002B) {
+            sign = 1;
+            code = source.charCodeAt(offset + 2);
+        }
+
+        // ... followed by a digit
+        if (isDigit(code)) {
+            // 5.1 Consume them.
+            // 5.2 Append them to repr.
+
+            // 5.3 Set type to "number".
+            // TODO
+
+            // 5.4 While the next input code point is a digit, consume it and append it to repr.
+            offset = findDecimalNumberEnd(source, offset + 1 + sign + 1);
+        }
+    }
+
+    return offset;
+}
+
+// § 4.3.14. Consume the remnants of a bad url
+// ... its sole use is to consume enough of the input stream to reach a recovery point
+// where normal tokenizing can resume.
+function consumeBadUrlRemnants(source, offset) {
+    // Repeatedly consume the next input code point from the stream:
+    for (; offset < source.length; offset++) {
+        var code = source.charCodeAt(offset);
+
+        // U+0029 RIGHT PARENTHESIS ())
+        // EOF
+        if (code === 0x0029) {
+            // Return.
+            offset++;
+            break;
+        }
+
+        if (isValidEscape(code, getCharCode(source, offset + 1))) {
+            // Consume an escaped code point.
+            // Note: This allows an escaped right parenthesis ("\)") to be encountered
+            // without ending the <bad-url-token>. This is otherwise identical to
+            // the "anything else" clause.
+            offset = consumeEscaped(source, offset);
+        }
+    }
+
+    return offset;
+}
+
+module.exports = {
+    consumeEscaped: consumeEscaped,
+    consumeName: consumeName,
+    consumeNumber: consumeNumber,
+    consumeBadUrlRemnants: consumeBadUrlRemnants,
+
+    cmpChar: cmpChar,
+    cmpStr: cmpStr,
+
+    getNewlineLength: getNewlineLength,
+    findWhiteSpaceStart: findWhiteSpaceStart,
+    findWhiteSpaceEnd: findWhiteSpaceEnd
+};
diff --git a/node_modules/css-tree/lib/utils/clone.js b/node_modules/css-tree/lib/utils/clone.js
new file mode 100644
index 0000000..927294b
--- /dev/null
+++ b/node_modules/css-tree/lib/utils/clone.js
@@ -0,0 +1,21 @@
+var List = require('../common/List');
+
+module.exports = function clone(node) {
+    var result = {};
+
+    for (var key in node) {
+        var value = node[key];
+
+        if (value) {
+            if (Array.isArray(value) || value instanceof List) {
+                value = value.map(clone);
+            } else if (value.constructor === Object) {
+                value = clone(value);
+            }
+        }
+
+        result[key] = value;
+    }
+
+    return result;
+};
diff --git a/node_modules/css-tree/lib/utils/createCustomError.js b/node_modules/css-tree/lib/utils/createCustomError.js
new file mode 100644
index 0000000..59285d8
--- /dev/null
+++ b/node_modules/css-tree/lib/utils/createCustomError.js
@@ -0,0 +1,17 @@
+module.exports = function createCustomError(name, message) {
+    // use Object.create(), because some VMs prevent setting line/column otherwise
+    // (iOS Safari 10 even throws an exception)
+    var error = Object.create(SyntaxError.prototype);
+    var errorStack = new Error();
+
+    error.name = name;
+    error.message = message;
+
+    Object.defineProperty(error, 'stack', {
+        get: function() {
+            return (errorStack.stack || '').replace(/^(.+\n){1,3}/, name + ': ' + message + '\n');
+        }
+    });
+
+    return error;
+};
diff --git a/node_modules/css-tree/lib/utils/names.js b/node_modules/css-tree/lib/utils/names.js
new file mode 100644
index 0000000..fdc3f1f
--- /dev/null
+++ b/node_modules/css-tree/lib/utils/names.js
@@ -0,0 +1,104 @@
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+var keywords = Object.create(null);
+var properties = Object.create(null);
+var HYPHENMINUS = 45; // '-'.charCodeAt()
+
+function isCustomProperty(str, offset) {
+    offset = offset || 0;
+
+    return str.length - offset >= 2 &&
+           str.charCodeAt(offset) === HYPHENMINUS &&
+           str.charCodeAt(offset + 1) === HYPHENMINUS;
+}
+
+function getVendorPrefix(str, offset) {
+    offset = offset || 0;
+
+    // verdor prefix should be at least 3 chars length
+    if (str.length - offset >= 3) {
+        // vendor prefix starts with hyper minus following non-hyper minus
+        if (str.charCodeAt(offset) === HYPHENMINUS &&
+            str.charCodeAt(offset + 1) !== HYPHENMINUS) {
+            // vendor prefix should contain a hyper minus at the ending
+            var secondDashIndex = str.indexOf('-', offset + 2);
+
+            if (secondDashIndex !== -1) {
+                return str.substring(offset, secondDashIndex + 1);
+            }
+        }
+    }
+
+    return '';
+}
+
+function getKeywordDescriptor(keyword) {
+    if (hasOwnProperty.call(keywords, keyword)) {
+        return keywords[keyword];
+    }
+
+    var name = keyword.toLowerCase();
+
+    if (hasOwnProperty.call(keywords, name)) {
+        return keywords[keyword] = keywords[name];
+    }
+
+    var custom = isCustomProperty(name, 0);
+    var vendor = !custom ? getVendorPrefix(name, 0) : '';
+
+    return keywords[keyword] = Object.freeze({
+        basename: name.substr(vendor.length),
+        name: name,
+        vendor: vendor,
+        prefix: vendor,
+        custom: custom
+    });
+}
+
+function getPropertyDescriptor(property) {
+    if (hasOwnProperty.call(properties, property)) {
+        return properties[property];
+    }
+
+    var name = property;
+    var hack = property[0];
+
+    if (hack === '/') {
+        hack = property[1] === '/' ? '//' : '/';
+    } else if (hack !== '_' &&
+               hack !== '*' &&
+               hack !== '$' &&
+               hack !== '#' &&
+               hack !== '+' &&
+               hack !== '&') {
+        hack = '';
+    }
+
+    var custom = isCustomProperty(name, hack.length);
+
+    // re-use result when possible (the same as for lower case)
+    if (!custom) {
+        name = name.toLowerCase();
+        if (hasOwnProperty.call(properties, name)) {
+            return properties[property] = properties[name];
+        }
+    }
+
+    var vendor = !custom ? getVendorPrefix(name, hack.length) : '';
+    var prefix = name.substr(0, hack.length + vendor.length);
+
+    return properties[property] = Object.freeze({
+        basename: name.substr(prefix.length),
+        name: name.substr(hack.length),
+        hack: hack,
+        vendor: vendor,
+        prefix: prefix,
+        custom: custom
+    });
+}
+
+module.exports = {
+    keyword: getKeywordDescriptor,
+    property: getPropertyDescriptor,
+    isCustomProperty: isCustomProperty,
+    vendorPrefix: getVendorPrefix
+};
diff --git a/node_modules/css-tree/lib/walker/create.js b/node_modules/css-tree/lib/walker/create.js
new file mode 100644
index 0000000..1731465
--- /dev/null
+++ b/node_modules/css-tree/lib/walker/create.js
@@ -0,0 +1,284 @@
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+var noop = function() {};
+
+function ensureFunction(value) {
+    return typeof value === 'function' ? value : noop;
+}
+
+function invokeForType(fn, type) {
+    return function(node, item, list) {
+        if (node.type === type) {
+            fn.call(this, node, item, list);
+        }
+    };
+}
+
+function getWalkersFromStructure(name, nodeType) {
+    var structure = nodeType.structure;
+    var walkers = [];
+
+    for (var key in structure) {
+        if (hasOwnProperty.call(structure, key) === false) {
+            continue;
+        }
+
+        var fieldTypes = structure[key];
+        var walker = {
+            name: key,
+            type: false,
+            nullable: false
+        };
+
+        if (!Array.isArray(structure[key])) {
+            fieldTypes = [structure[key]];
+        }
+
+        for (var i = 0; i < fieldTypes.length; i++) {
+            var fieldType = fieldTypes[i];
+            if (fieldType === null) {
+                walker.nullable = true;
+            } else if (typeof fieldType === 'string') {
+                walker.type = 'node';
+            } else if (Array.isArray(fieldType)) {
+                walker.type = 'list';
+            }
+        }
+
+        if (walker.type) {
+            walkers.push(walker);
+        }
+    }
+
+    if (walkers.length) {
+        return {
+            context: nodeType.walkContext,
+            fields: walkers
+        };
+    }
+
+    return null;
+}
+
+function getTypesFromConfig(config) {
+    var types = {};
+
+    for (var name in config.node) {
+        if (hasOwnProperty.call(config.node, name)) {
+            var nodeType = config.node[name];
+
+            if (!nodeType.structure) {
+                throw new Error('Missed `structure` field in `' + name + '` node type definition');
+            }
+
+            types[name] = getWalkersFromStructure(name, nodeType);
+        }
+    }
+
+    return types;
+}
+
+function createTypeIterator(config, reverse) {
+    var fields = config.fields.slice();
+    var contextName = config.context;
+    var useContext = typeof contextName === 'string';
+
+    if (reverse) {
+        fields.reverse();
+    }
+
+    return function(node, context, walk, walkReducer) {
+        var prevContextValue;
+
+        if (useContext) {
+            prevContextValue = context[contextName];
+            context[contextName] = node;
+        }
+
+        for (var i = 0; i < fields.length; i++) {
+            var field = fields[i];
+            var ref = node[field.name];
+
+            if (!field.nullable || ref) {
+                if (field.type === 'list') {
+                    var breakWalk = reverse
+                        ? ref.reduceRight(walkReducer, false)
+                        : ref.reduce(walkReducer, false);
+
+                    if (breakWalk) {
+                        return true;
+                    }
+                } else if (walk(ref)) {
+                    return true;
+                }
+            }
+        }
+
+        if (useContext) {
+            context[contextName] = prevContextValue;
+        }
+    };
+}
+
+function createFastTraveralMap(iterators) {
+    return {
+        Atrule: {
+            StyleSheet: iterators.StyleSheet,
+            Atrule: iterators.Atrule,
+            Rule: iterators.Rule,
+            Block: iterators.Block
+        },
+        Rule: {
+            StyleSheet: iterators.StyleSheet,
+            Atrule: iterators.Atrule,
+            Rule: iterators.Rule,
+            Block: iterators.Block
+        },
+        Declaration: {
+            StyleSheet: iterators.StyleSheet,
+            Atrule: iterators.Atrule,
+            Rule: iterators.Rule,
+            Block: iterators.Block,
+            DeclarationList: iterators.DeclarationList
+        }
+    };
+}
+
+module.exports = function createWalker(config) {
+    var types = getTypesFromConfig(config);
+    var iteratorsNatural = {};
+    var iteratorsReverse = {};
+    var breakWalk = Symbol('break-walk');
+    var skipNode = Symbol('skip-node');
+
+    for (var name in types) {
+        if (hasOwnProperty.call(types, name) && types[name] !== null) {
+            iteratorsNatural[name] = createTypeIterator(types[name], false);
+            iteratorsReverse[name] = createTypeIterator(types[name], true);
+        }
+    }
+
+    var fastTraversalIteratorsNatural = createFastTraveralMap(iteratorsNatural);
+    var fastTraversalIteratorsReverse = createFastTraveralMap(iteratorsReverse);
+
+    var walk = function(root, options) {
+        function walkNode(node, item, list) {
+            var enterRet = enter.call(context, node, item, list);
+
+            if (enterRet === breakWalk) {
+                debugger;
+                return true;
+            }
+
+            if (enterRet === skipNode) {
+                return false;
+            }
+
+            if (iterators.hasOwnProperty(node.type)) {
+                if (iterators[node.type](node, context, walkNode, walkReducer)) {
+                    return true;
+                }
+            }
+
+            if (leave.call(context, node, item, list) === breakWalk) {
+                return true;
+            }
+
+            return false;
+        }
+
+        var walkReducer = (ret, data, item, list) => ret || walkNode(data, item, list);
+        var enter = noop;
+        var leave = noop;
+        var iterators = iteratorsNatural;
+        var context = {
+            break: breakWalk,
+            skip: skipNode,
+
+            root: root,
+            stylesheet: null,
+            atrule: null,
+            atrulePrelude: null,
+            rule: null,
+            selector: null,
+            block: null,
+            declaration: null,
+            function: null
+        };
+
+        if (typeof options === 'function') {
+            enter = options;
+        } else if (options) {
+            enter = ensureFunction(options.enter);
+            leave = ensureFunction(options.leave);
+
+            if (options.reverse) {
+                iterators = iteratorsReverse;
+            }
+
+            if (options.visit) {
+                if (fastTraversalIteratorsNatural.hasOwnProperty(options.visit)) {
+                    iterators = options.reverse
+                        ? fastTraversalIteratorsReverse[options.visit]
+                        : fastTraversalIteratorsNatural[options.visit];
+                } else if (!types.hasOwnProperty(options.visit)) {
+                    throw new Error('Bad value `' + options.visit + '` for `visit` option (should be: ' + Object.keys(types).join(', ') + ')');
+                }
+
+                enter = invokeForType(enter, options.visit);
+                leave = invokeForType(leave, options.visit);
+            }
+        }
+
+        if (enter === noop && leave === noop) {
+            throw new Error('Neither `enter` nor `leave` walker handler is set or both aren\'t a function');
+        }
+
+        walkNode(root);
+    };
+
+    walk.break = breakWalk;
+    walk.skip = skipNode;
+
+    walk.find = function(ast, fn) {
+        var found = null;
+
+        walk(ast, function(node, item, list) {
+            if (fn.call(this, node, item, list)) {
+                found = node;
+                return breakWalk;
+            }
+        });
+
+        return found;
+    };
+
+    walk.findLast = function(ast, fn) {
+        var found = null;
+
+        walk(ast, {
+            reverse: true,
+            enter: function(node, item, list) {
+                if (fn.call(this, node, item, list)) {
+                    found = node;
+                    return breakWalk;
+                }
+            }
+        });
+
+        return found;
+    };
+
+    walk.findAll = function(ast, fn) {
+        var found = [];
+
+        walk(ast, function(node, item, list) {
+            if (fn.call(this, node, item, list)) {
+                found.push(node);
+            }
+        });
+
+        return found;
+    };
+
+    return walk;
+};
diff --git a/node_modules/css-tree/lib/walker/index.js b/node_modules/css-tree/lib/walker/index.js
new file mode 100644
index 0000000..f3f0d6d
--- /dev/null
+++ b/node_modules/css-tree/lib/walker/index.js
@@ -0,0 +1,4 @@
+var createWalker = require('./create');
+var config = require('../syntax/config/walker');
+
+module.exports = createWalker(config);
diff --git a/node_modules/css-tree/package.json b/node_modules/css-tree/package.json
new file mode 100644
index 0000000..0bb7770
--- /dev/null
+++ b/node_modules/css-tree/package.json
@@ -0,0 +1,60 @@
+{
+  "name": "css-tree",
+  "version": "1.1.3",
+  "description": "A tool set for CSS: fast detailed parser (CSS \u2192 AST), walker (AST traversal), generator (AST \u2192 CSS) and lexer (validation and matching) based on specs and browser implementations",
+  "author": "Roman Dvornov <rdvornov@gmail.com> (https://github.com/lahmatiy)",
+  "license": "MIT",
+  "repository": "csstree/csstree",
+  "keywords": [
+    "css",
+    "ast",
+    "tokenizer",
+    "parser",
+    "walker",
+    "lexer",
+    "generator",
+    "utils",
+    "syntax",
+    "validation"
+  ],
+  "main": "lib/index.js",
+  "unpkg": "dist/csstree.min.js",
+  "jsdelivr": "dist/csstree.min.js",
+  "scripts": {
+    "build": "rollup --config",
+    "lint": "eslint data lib scripts test && node scripts/review-syntax-patch --lint && node scripts/update-docs --lint",
+    "lint-and-test": "npm run lint && npm test",
+    "update:docs": "node scripts/update-docs",
+    "review:syntax-patch": "node scripts/review-syntax-patch",
+    "test": "mocha --reporter progress",
+    "coverage": "nyc npm test",
+    "travis": "nyc npm run lint-and-test && npm run coveralls",
+    "coveralls": "nyc report --reporter=text-lcov | coveralls",
+    "prepublishOnly": "npm run build",
+    "hydrogen": "node --trace-hydrogen --trace-phase=Z --trace-deopt --code-comments --hydrogen-track-positions --redirect-code-traces --redirect-code-traces-to=code.asm --trace_hydrogen_file=code.cfg --print-opt-code bin/parse --stat -o /dev/null"
+  },
+  "dependencies": {
+    "mdn-data": "2.0.14",
+    "source-map": "^0.6.1"
+  },
+  "devDependencies": {
+    "@rollup/plugin-commonjs": "^11.0.2",
+    "@rollup/plugin-json": "^4.0.2",
+    "@rollup/plugin-node-resolve": "^7.1.1",
+    "coveralls": "^3.0.9",
+    "eslint": "^6.8.0",
+    "json-to-ast": "^2.1.0",
+    "mocha": "^6.2.3",
+    "nyc": "^14.1.1",
+    "rollup": "^1.32.1",
+    "rollup-plugin-terser": "^5.3.0"
+  },
+  "engines": {
+    "node": ">=8.0.0"
+  },
+  "files": [
+    "data",
+    "dist",
+    "lib"
+  ]
+}
diff --git a/node_modules/css-what/LICENSE b/node_modules/css-what/LICENSE
new file mode 100644
index 0000000..c464f86
--- /dev/null
+++ b/node_modules/css-what/LICENSE
@@ -0,0 +1,11 @@
+Copyright (c) Felix Böhm
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/css-what/lib/index.d.ts b/node_modules/css-what/lib/index.d.ts
new file mode 100644
index 0000000..d474fa1
--- /dev/null
+++ b/node_modules/css-what/lib/index.d.ts
@@ -0,0 +1,4 @@
+export * from "./parse";
+export { default as parse } from "./parse";
+export { default as stringify } from "./stringify";
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-what/lib/index.d.ts.map b/node_modules/css-what/lib/index.d.ts.map
new file mode 100644
index 0000000..4191999
--- /dev/null
+++ b/node_modules/css-what/lib/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC"}
\ No newline at end of file
diff --git a/node_modules/css-what/lib/index.js b/node_modules/css-what/lib/index.js
new file mode 100644
index 0000000..5095250
--- /dev/null
+++ b/node_modules/css-what/lib/index.js
@@ -0,0 +1,21 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.stringify = exports.parse = void 0;
+__exportStar(require("./parse"), exports);
+var parse_1 = require("./parse");
+Object.defineProperty(exports, "parse", { enumerable: true, get: function () { return __importDefault(parse_1).default; } });
+var stringify_1 = require("./stringify");
+Object.defineProperty(exports, "stringify", { enumerable: true, get: function () { return __importDefault(stringify_1).default; } });
diff --git a/node_modules/css-what/lib/parse.d.ts b/node_modules/css-what/lib/parse.d.ts
new file mode 100644
index 0000000..3185a2d
--- /dev/null
+++ b/node_modules/css-what/lib/parse.d.ts
@@ -0,0 +1,70 @@
+export interface Options {
+    /**
+     * When false, tag names will not be lowercased.
+     * @default true
+     */
+    lowerCaseAttributeNames?: boolean;
+    /**
+     * When false, attribute names will not be lowercased.
+     * @default true
+     */
+    lowerCaseTags?: boolean;
+    /**
+     * When `true`, `xmlMode` implies both `lowerCaseTags` and `lowerCaseAttributeNames` are set to `false`.
+     * @default false
+     */
+    xmlMode?: boolean;
+}
+export declare type Selector = PseudoSelector | PseudoElement | AttributeSelector | TagSelector | UniversalSelector | Traversal;
+export interface AttributeSelector {
+    type: "attribute";
+    name: string;
+    action: AttributeAction;
+    value: string;
+    ignoreCase: boolean;
+    namespace: string | null;
+}
+declare type DataType = Selector[][] | null | string;
+export interface PseudoSelector {
+    type: "pseudo";
+    name: string;
+    data: DataType;
+}
+export interface PseudoElement {
+    type: "pseudo-element";
+    name: string;
+}
+export interface TagSelector {
+    type: "tag";
+    name: string;
+    namespace: string | null;
+}
+export interface UniversalSelector {
+    type: "universal";
+    namespace: string | null;
+}
+export interface Traversal {
+    type: TraversalType;
+}
+export declare type AttributeAction = "any" | "element" | "end" | "equals" | "exists" | "hyphen" | "not" | "start";
+export declare type TraversalType = "adjacent" | "child" | "descendant" | "parent" | "sibling";
+/**
+ * Checks whether a specific selector is a traversal.
+ * This is useful eg. in swapping the order of elements that
+ * are not traversals.
+ *
+ * @param selector Selector to check.
+ */
+export declare function isTraversal(selector: Selector): selector is Traversal;
+/**
+ * Parses `selector`, optionally with the passed `options`.
+ *
+ * @param selector Selector to parse.
+ * @param options Options for parsing.
+ * @returns Returns a two-dimensional array.
+ * The first dimension represents selectors separated by commas (eg. `sub1, sub2`),
+ * the second contains the relevant tokens for that selector.
+ */
+export default function parse(selector: string, options?: Options): Selector[][];
+export {};
+//# sourceMappingURL=parse.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-what/lib/parse.d.ts.map b/node_modules/css-what/lib/parse.d.ts.map
new file mode 100644
index 0000000..d295c40
--- /dev/null
+++ b/node_modules/css-what/lib/parse.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACpB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,oBAAY,QAAQ,GACd,cAAc,GACd,aAAa,GACb,iBAAiB,GACjB,WAAW,GACX,iBAAiB,GACjB,SAAS,CAAC;AAEhB,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,aAAK,QAAQ,GAAG,QAAQ,EAAE,EAAE,GAAG,IAAI,GAAG,MAAM,CAAC;AAE7C,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,aAAa,CAAC;CACvB;AAED,oBAAY,eAAe,GACrB,KAAK,GACL,SAAS,GACT,KAAK,GACL,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,KAAK,GACL,OAAO,CAAC;AAEd,oBAAY,aAAa,GACnB,UAAU,GACV,OAAO,GACP,YAAY,GACZ,QAAQ,GACR,SAAS,CAAC;AA6ChB;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,IAAI,SAAS,CAErE;AA4BD;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,UAAU,KAAK,CACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,OAAO,GAClB,QAAQ,EAAE,EAAE,CAUd"}
\ No newline at end of file
diff --git a/node_modules/css-what/lib/parse.js b/node_modules/css-what/lib/parse.js
new file mode 100644
index 0000000..9f8144c
--- /dev/null
+++ b/node_modules/css-what/lib/parse.js
@@ -0,0 +1,292 @@
+"use strict";
+var __spreadArrays = (this && this.__spreadArrays) || function () {
+    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
+    for (var r = Array(s), k = 0, i = 0; i < il; i++)
+        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
+            r[k] = a[j];
+    return r;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isTraversal = void 0;
+var reName = /^[^\\#]?(?:\\(?:[\da-f]{1,6}\s?|.)|[\w\-\u00b0-\uFFFF])+/;
+var reEscape = /\\([\da-f]{1,6}\s?|(\s)|.)/gi;
+// Modified version of https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L87
+var reAttr = /^\s*(?:(\*|[-\w]*)\|)?((?:\\.|[\w\u00b0-\uFFFF-])+)\s*(?:(\S?)=\s*(?:(['"])((?:[^\\]|\\[^])*?)\4|(#?(?:\\.|[\w\u00b0-\uFFFF-])*)|)|)\s*([iI])?\]/;
+var actionTypes = {
+    undefined: "exists",
+    "": "equals",
+    "~": "element",
+    "^": "start",
+    $: "end",
+    "*": "any",
+    "!": "not",
+    "|": "hyphen",
+};
+var Traversals = {
+    ">": "child",
+    "<": "parent",
+    "~": "sibling",
+    "+": "adjacent",
+};
+var attribSelectors = {
+    "#": ["id", "equals"],
+    ".": ["class", "element"],
+};
+// Pseudos, whose data property is parsed as well.
+var unpackPseudos = new Set([
+    "has",
+    "not",
+    "matches",
+    "is",
+    "host",
+    "host-context",
+]);
+var traversalNames = new Set(__spreadArrays([
+    "descendant"
+], Object.keys(Traversals).map(function (k) { return Traversals[k]; })));
+/**
+ * Checks whether a specific selector is a traversal.
+ * This is useful eg. in swapping the order of elements that
+ * are not traversals.
+ *
+ * @param selector Selector to check.
+ */
+function isTraversal(selector) {
+    return traversalNames.has(selector.type);
+}
+exports.isTraversal = isTraversal;
+var stripQuotesFromPseudos = new Set(["contains", "icontains"]);
+var quotes = new Set(['"', "'"]);
+// Unescape function taken from https://github.com/jquery/sizzle/blob/master/src/sizzle.js#L152
+function funescape(_, escaped, escapedWhitespace) {
+    var high = parseInt(escaped, 16) - 0x10000;
+    // NaN means non-codepoint
+    return high !== high || escapedWhitespace
+        ? escaped
+        : high < 0
+            ? // BMP codepoint
+                String.fromCharCode(high + 0x10000)
+            : // Supplemental Plane codepoint (surrogate pair)
+                String.fromCharCode((high >> 10) | 0xd800, (high & 0x3ff) | 0xdc00);
+}
+function unescapeCSS(str) {
+    return str.replace(reEscape, funescape);
+}
+function isWhitespace(c) {
+    return c === " " || c === "\n" || c === "\t" || c === "\f" || c === "\r";
+}
+/**
+ * Parses `selector`, optionally with the passed `options`.
+ *
+ * @param selector Selector to parse.
+ * @param options Options for parsing.
+ * @returns Returns a two-dimensional array.
+ * The first dimension represents selectors separated by commas (eg. `sub1, sub2`),
+ * the second contains the relevant tokens for that selector.
+ */
+function parse(selector, options) {
+    var subselects = [];
+    var endIndex = parseSelector(subselects, "" + selector, options, 0);
+    if (endIndex < selector.length) {
+        throw new Error("Unmatched selector: " + selector.slice(endIndex));
+    }
+    return subselects;
+}
+exports.default = parse;
+function parseSelector(subselects, selector, options, selectorIndex) {
+    var _a, _b;
+    if (options === void 0) { options = {}; }
+    var tokens = [];
+    var sawWS = false;
+    function getName(offset) {
+        var match = selector.slice(selectorIndex + offset).match(reName);
+        if (!match) {
+            throw new Error("Expected name, found " + selector.slice(selectorIndex));
+        }
+        var name = match[0];
+        selectorIndex += offset + name.length;
+        return unescapeCSS(name);
+    }
+    function stripWhitespace(offset) {
+        while (isWhitespace(selector.charAt(selectorIndex + offset)))
+            offset++;
+        selectorIndex += offset;
+    }
+    function isEscaped(pos) {
+        var slashCount = 0;
+        while (selector.charAt(--pos) === "\\")
+            slashCount++;
+        return (slashCount & 1) === 1;
+    }
+    function ensureNotTraversal() {
+        if (tokens.length > 0 && isTraversal(tokens[tokens.length - 1])) {
+            throw new Error("Did not expect successive traversals.");
+        }
+    }
+    stripWhitespace(0);
+    while (selector !== "") {
+        var firstChar = selector.charAt(selectorIndex);
+        if (isWhitespace(firstChar)) {
+            sawWS = true;
+            stripWhitespace(1);
+        }
+        else if (firstChar in Traversals) {
+            ensureNotTraversal();
+            tokens.push({ type: Traversals[firstChar] });
+            sawWS = false;
+            stripWhitespace(1);
+        }
+        else if (firstChar === ",") {
+            if (tokens.length === 0) {
+                throw new Error("Empty sub-selector");
+            }
+            subselects.push(tokens);
+            tokens = [];
+            sawWS = false;
+            stripWhitespace(1);
+        }
+        else {
+            if (sawWS) {
+                ensureNotTraversal();
+                tokens.push({ type: "descendant" });
+                sawWS = false;
+            }
+            if (firstChar in attribSelectors) {
+                var _c = attribSelectors[firstChar], name_1 = _c[0], action = _c[1];
+                tokens.push({
+                    type: "attribute",
+                    name: name_1,
+                    action: action,
+                    value: getName(1),
+                    ignoreCase: false,
+                    namespace: null,
+                });
+            }
+            else if (firstChar === "[") {
+                var attributeMatch = selector
+                    .slice(selectorIndex + 1)
+                    .match(reAttr);
+                if (!attributeMatch) {
+                    throw new Error("Malformed attribute selector: " + selector.slice(selectorIndex));
+                }
+                var completeSelector = attributeMatch[0], _d = attributeMatch[1], namespace = _d === void 0 ? null : _d, baseName = attributeMatch[2], actionType = attributeMatch[3], _e = attributeMatch[5], quotedValue = _e === void 0 ? "" : _e, _f = attributeMatch[6], value = _f === void 0 ? quotedValue : _f, ignoreCase = attributeMatch[7];
+                selectorIndex += completeSelector.length + 1;
+                var name_2 = unescapeCSS(baseName);
+                if ((_a = options.lowerCaseAttributeNames) !== null && _a !== void 0 ? _a : !options.xmlMode) {
+                    name_2 = name_2.toLowerCase();
+                }
+                tokens.push({
+                    type: "attribute",
+                    name: name_2,
+                    action: actionTypes[actionType],
+                    value: unescapeCSS(value),
+                    namespace: namespace,
+                    ignoreCase: !!ignoreCase,
+                });
+            }
+            else if (firstChar === ":") {
+                if (selector.charAt(selectorIndex + 1) === ":") {
+                    tokens.push({
+                        type: "pseudo-element",
+                        name: getName(2).toLowerCase(),
+                    });
+                    continue;
+                }
+                var name_3 = getName(1).toLowerCase();
+                var data = null;
+                if (selector.charAt(selectorIndex) === "(") {
+                    if (unpackPseudos.has(name_3)) {
+                        if (quotes.has(selector.charAt(selectorIndex + 1))) {
+                            throw new Error("Pseudo-selector " + name_3 + " cannot be quoted");
+                        }
+                        data = [];
+                        selectorIndex = parseSelector(data, selector, options, selectorIndex + 1);
+                        if (selector.charAt(selectorIndex) !== ")") {
+                            throw new Error("Missing closing parenthesis in :" + name_3 + " (" + selector + ")");
+                        }
+                        selectorIndex += 1;
+                    }
+                    else {
+                        selectorIndex += 1;
+                        var start = selectorIndex;
+                        var counter = 1;
+                        for (; counter > 0 && selectorIndex < selector.length; selectorIndex++) {
+                            if (selector.charAt(selectorIndex) === "(" &&
+                                !isEscaped(selectorIndex)) {
+                                counter++;
+                            }
+                            else if (selector.charAt(selectorIndex) === ")" &&
+                                !isEscaped(selectorIndex)) {
+                                counter--;
+                            }
+                        }
+                        if (counter) {
+                            throw new Error("Parenthesis not matched");
+                        }
+                        data = selector.slice(start, selectorIndex - 1);
+                        if (stripQuotesFromPseudos.has(name_3)) {
+                            var quot = data.charAt(0);
+                            if (quot === data.slice(-1) && quotes.has(quot)) {
+                                data = data.slice(1, -1);
+                            }
+                            data = unescapeCSS(data);
+                        }
+                    }
+                }
+                tokens.push({ type: "pseudo", name: name_3, data: data });
+            }
+            else {
+                var namespace = null;
+                var name_4 = void 0;
+                if (firstChar === "*") {
+                    selectorIndex += 1;
+                    name_4 = "*";
+                }
+                else if (reName.test(selector.slice(selectorIndex))) {
+                    name_4 = getName(0);
+                }
+                else {
+                    /*
+                     * We have finished parsing the selector.
+                     * Remove descendant tokens at the end if they exist,
+                     * and return the last index, so that parsing can be
+                     * picked up from here.
+                     */
+                    if (tokens.length &&
+                        tokens[tokens.length - 1].type === "descendant") {
+                        tokens.pop();
+                    }
+                    addToken(subselects, tokens);
+                    return selectorIndex;
+                }
+                if (selector.charAt(selectorIndex) === "|") {
+                    namespace = name_4;
+                    if (selector.charAt(selectorIndex + 1) === "*") {
+                        name_4 = "*";
+                        selectorIndex += 2;
+                    }
+                    else {
+                        name_4 = getName(1);
+                    }
+                }
+                if (name_4 === "*") {
+                    tokens.push({ type: "universal", namespace: namespace });
+                }
+                else {
+                    if ((_b = options.lowerCaseTags) !== null && _b !== void 0 ? _b : !options.xmlMode) {
+                        name_4 = name_4.toLowerCase();
+                    }
+                    tokens.push({ type: "tag", name: name_4, namespace: namespace });
+                }
+            }
+        }
+    }
+    addToken(subselects, tokens);
+    return selectorIndex;
+}
+function addToken(subselects, tokens) {
+    if (subselects.length > 0 && tokens.length === 0) {
+        throw new Error("Empty sub-selector");
+    }
+    subselects.push(tokens);
+}
diff --git a/node_modules/css-what/lib/stringify.d.ts b/node_modules/css-what/lib/stringify.d.ts
new file mode 100644
index 0000000..407050e
--- /dev/null
+++ b/node_modules/css-what/lib/stringify.d.ts
@@ -0,0 +1,8 @@
+import { Selector } from "./parse";
+/**
+ * Turns `selector` back into a string.
+ *
+ * @param selector Selector to stringify.
+ */
+export default function stringify(selector: Selector[][]): string;
+//# sourceMappingURL=stringify.d.ts.map
\ No newline at end of file
diff --git a/node_modules/css-what/lib/stringify.d.ts.map b/node_modules/css-what/lib/stringify.d.ts.map
new file mode 100644
index 0000000..6845e4a
--- /dev/null
+++ b/node_modules/css-what/lib/stringify.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"stringify.d.ts","sourceRoot":"","sources":["../src/stringify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAyBnC;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,GAAG,MAAM,CAEhE"}
\ No newline at end of file
diff --git a/node_modules/css-what/lib/stringify.js b/node_modules/css-what/lib/stringify.js
new file mode 100644
index 0000000..664b69e
--- /dev/null
+++ b/node_modules/css-what/lib/stringify.js
@@ -0,0 +1,102 @@
+"use strict";
+var __spreadArrays = (this && this.__spreadArrays) || function () {
+    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
+    for (var r = Array(s), k = 0, i = 0; i < il; i++)
+        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
+            r[k] = a[j];
+    return r;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var actionTypes = {
+    equals: "",
+    element: "~",
+    start: "^",
+    end: "$",
+    any: "*",
+    not: "!",
+    hyphen: "|",
+};
+var charsToEscape = new Set(__spreadArrays(Object.keys(actionTypes)
+    .map(function (typeKey) { return actionTypes[typeKey]; })
+    .filter(Boolean), [
+    ":",
+    "[",
+    "]",
+    " ",
+    "\\",
+    "(",
+    ")",
+]));
+/**
+ * Turns `selector` back into a string.
+ *
+ * @param selector Selector to stringify.
+ */
+function stringify(selector) {
+    return selector.map(stringifySubselector).join(", ");
+}
+exports.default = stringify;
+function stringifySubselector(token) {
+    return token.map(stringifyToken).join("");
+}
+function stringifyToken(token) {
+    switch (token.type) {
+        // Simple types
+        case "child":
+            return " > ";
+        case "parent":
+            return " < ";
+        case "sibling":
+            return " ~ ";
+        case "adjacent":
+            return " + ";
+        case "descendant":
+            return " ";
+        case "universal":
+            return getNamespace(token.namespace) + "*";
+        case "tag":
+            return getNamespacedName(token);
+        case "pseudo-element":
+            return "::" + escapeName(token.name);
+        case "pseudo":
+            if (token.data === null)
+                return ":" + escapeName(token.name);
+            if (typeof token.data === "string") {
+                return ":" + escapeName(token.name) + "(" + escapeName(token.data) + ")";
+            }
+            return ":" + escapeName(token.name) + "(" + stringify(token.data) + ")";
+        case "attribute": {
+            if (token.name === "id" &&
+                token.action === "equals" &&
+                !token.ignoreCase &&
+                !token.namespace) {
+                return "#" + escapeName(token.value);
+            }
+            if (token.name === "class" &&
+                token.action === "element" &&
+                !token.ignoreCase &&
+                !token.namespace) {
+                return "." + escapeName(token.value);
+            }
+            var name_1 = getNamespacedName(token);
+            if (token.action === "exists") {
+                return "[" + name_1 + "]";
+            }
+            return "[" + name_1 + actionTypes[token.action] + "='" + escapeName(token.value) + "'" + (token.ignoreCase ? "i" : "") + "]";
+        }
+    }
+}
+function getNamespacedName(token) {
+    return "" + getNamespace(token.namespace) + escapeName(token.name);
+}
+function getNamespace(namespace) {
+    return namespace
+        ? (namespace === "*" ? "*" : escapeName(namespace)) + "|"
+        : "";
+}
+function escapeName(str) {
+    return str
+        .split("")
+        .map(function (c) { return (charsToEscape.has(c) ? "\\" + c : c); })
+        .join("");
+}
diff --git a/node_modules/css-what/package.json b/node_modules/css-what/package.json
new file mode 100644
index 0000000..24eb6a8
--- /dev/null
+++ b/node_modules/css-what/package.json
@@ -0,0 +1,55 @@
+{
+  "author": "Felix B\u00f6hm <me@feedic.com> (http://feedic.com)",
+  "name": "css-what",
+  "description": "a CSS selector parser",
+  "version": "4.0.0",
+  "funding": "https://github.com/sponsors/fb55",
+  "repository": {
+    "url": "https://github.com/fb55/css-what"
+  },
+  "main": "lib/index.js",
+  "types": "lib/index.d.ts",
+  "files": [
+    "lib/**/*"
+  ],
+  "scripts": {
+    "test": "jest --coverage -u && npm run lint",
+    "coverage": "cat coverage/lcov.info | coveralls",
+    "lint": "npm run lint:es && npm run lint:prettier",
+    "lint:es": "eslint src",
+    "lint:prettier": "npm run prettier -- --check",
+    "format": "npm run format:es && npm run format:prettier",
+    "format:es": "npm run lint:es -- --fix",
+    "format:prettier": "npm run prettier -- --write",
+    "prettier": "prettier '**/*.{ts,md,json,yml}'",
+    "build": "tsc",
+    "prepare": "npm run build"
+  },
+  "dependencies": {},
+  "devDependencies": {
+    "@types/jest": "^26.0.3",
+    "@types/node": "^14.0.5",
+    "@typescript-eslint/eslint-plugin": "^4.1.0",
+    "@typescript-eslint/parser": "^4.1.0",
+    "coveralls": "^3.0.5",
+    "eslint": "^7.0.0",
+    "eslint-config-prettier": "^6.0.0",
+    "eslint-plugin-node": "^11.1.0",
+    "jest": "^26.0.1",
+    "prettier": "^2.0.5",
+    "ts-jest": "^26.0.0",
+    "typescript": "^4.0.2"
+  },
+  "optionalDependencies": {},
+  "engines": {
+    "node": ">= 6"
+  },
+  "license": "BSD-2-Clause",
+  "jest": {
+    "preset": "ts-jest",
+    "testEnvironment": "node"
+  },
+  "prettier": {
+    "tabWidth": 4
+  }
+}
diff --git a/node_modules/css-what/readme.md b/node_modules/css-what/readme.md
new file mode 100644
index 0000000..e9c3e9b
--- /dev/null
+++ b/node_modules/css-what/readme.md
@@ -0,0 +1,70 @@
+# css-what [![Build Status](https://secure.travis-ci.org/fb55/css-what.svg?branch=master)](http://travis-ci.org/fb55/css-what)
+
+a CSS selector parser
+
+## Example
+
+```js
+const CSSwhat = require("css-what")
+CSSwhat.parse("foo[bar]:baz")
+
+~> [
+    [
+        { type: "tag", name: "foo" },
+        {
+            type: "attribute",
+            name: "bar",
+            action: "exists",
+            value: "",
+            ignoreCase: false
+        },
+        { type: "pseudo", name: "baz", data: null }
+    ]
+]
+```
+
+## API
+
+**`CSSwhat.parse(selector, options)` - Parses `selector`, optionally with the passed `options`.**
+
+The function returns a two-dimensional array. The first array represents selectors separated by commas (eg. `sub1, sub2`), the second contains the relevant tokens for that selector. Possible token types are:
+
+| name             | properties                              | example       | output                                                                                   |
+| ---------------- | --------------------------------------- | ------------- | ---------------------------------------------------------------------------------------- |
+| `tag`            | `name`                                  | `div`         | `{ type: 'tag', name: 'div' }`                                                           |
+| `universal`      | -                                       | `*`           | `{ type: 'universal' }`                                                                  |
+| `pseudo`         | `name`, `data`                          | `:name(data)` | `{ type: 'pseudo', name: 'name', data: 'data' }`                                         |
+| `pseudo`         | `name`, `data`                          | `:name`       | `{ type: 'pseudo', name: 'name', data: null }`                                           |
+| `pseudo-element` | `name`                                  | `::name`      | `{ type: 'pseudo-element', name: 'name' }`                                               |
+| `attribute`      | `name`, `action`, `value`, `ignoreCase` | `[attr]`      | `{ type: 'attribute', name: 'attr', action: 'exists', value: '', ignoreCase: false }`    |
+| `attribute`      | `name`, `action`, `value`, `ignoreCase` | `[attr=val]`  | `{ type: 'attribute', name: 'attr', action: 'equals', value: 'val', ignoreCase: false }` |
+| `attribute`      | `name`, `action`, `value`, `ignoreCase` | `[attr^=val]` | `{ type: 'attribute', name: 'attr', action: 'start', value: 'val', ignoreCase: false }`  |
+| `attribute`      | `name`, `action`, `value`, `ignoreCase` | `[attr$=val]` | `{ type: 'attribute', name: 'attr', action: 'end', value: 'val', ignoreCase: false }`    |
+| `child`          | -                                       | `>`           | `{ type: 'child' }`                                                                      |
+| `parent`         | -                                       | `<`           | `{ type: 'parent' }`                                                                     |
+| `sibling`        | -                                       | `~`           | `{ type: 'sibling' }`                                                                    |
+| `adjacent`       | -                                       | `+`           | `{ type: 'adjacent' }`                                                                   |
+| `descendant`     | -                                       |               | `{ type: 'descendant' }`                                                                 |
+
+**Options:**
+
+-   `lowerCaseTags`: When false, tag names will not be lowercased. Defaults to `true`.
+-   `lowerCaseAttributeNames`: When false, attribute names will not be lowercased. Defaults to `true`.
+-   `xmlMode`: When `true`, `xmlMode` implies both `lowerCaseTags` and `lowerCaseAttributeNames` are set to `false`.
+
+**`CSSwhat.stringify(selector)` - Turns `selector` back into a string.**
+
+---
+
+License: BSD-2-Clause
+
+## Security contact information
+
+To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security).
+Tidelift will coordinate the fix and disclosure.
+
+## `css-what` for enterprise
+
+Available as part of the Tidelift Subscription
+
+The maintainers of `css-what` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-css-what?utm_source=npm-css-what&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
diff --git a/node_modules/csso/CHANGELOG.md b/node_modules/csso/CHANGELOG.md
new file mode 100644
index 0000000..8532124
--- /dev/null
+++ b/node_modules/csso/CHANGELOG.md
@@ -0,0 +1,421 @@
+## 4.2.0 (November 26, 2020)
+
+- Trim Custom Property values when possible (#393)
+- Fixed removing unit for zero-length dimentions in `min()`, `max()` and `clamp()` functions (#426)
+- Fixed crash on bad value in TRBL declaration value (#412)
+
+## 4.1.1 (November 15, 2020)
+
+- Fixed build setup to exclude full `mdn/data` that reduced the lib size:
+    * dist/csso.js: 794.5Kb -> 255.2Kb
+    * dist/csso.min.js: 394.4Kb -> 194.2Kb
+    * package size: 237.8 kB -> 156.1 kB
+    * package unpacked size: 1.3 MB -> 586.8 kB
+
+## 4.1.0 (October 27, 2020)
+
+- Bumped [CSSTree](https://github.com/csstree/csstree) to `^1.0.0`
+- Fixed wrongly merging of TRBL values when one of them contains `var()` (#420)
+- Fixed wrongly merging of pseudo class and element with the same name, e.g. `:-ms-input-placeholder` and `::-ms-input-placeholder` (#383, #416)
+- Fixed wrongly merging of `overflow` fallback (#415)
+
+## 4.0.3 (March 24, 2020)
+
+- Prevented percent sign removal in `flex`/`-ms-flex` (#410)
+- Fixed restructuring optimisation in some cases (@charlessuh & @chsuh, #358, #411)
+- Bumped dependencies (@AviVahl, #409)
+
+## 4.0.2 (October 28, 2019)
+
+- Fixed clean stage to avoid exceptions when source has unparsed or bad parts (#380)
+- Fixed wrong percentage sign removal for zero values (#395)
+
+## 4.0.1 (October 22, 2019)
+
+- Bumped CSSTree to [`1.0.0-alpha.37`](https://github.com/csstree/csstree/releases/tag/v1.0.0-alpha.37) to avoid source map generation inconsistency across Node.js versions
+
+## 4.0.0 (October 21, 2019)
+
+- Dropped support for Node.js < 8
+- Refreshed dev dependencies and scripts
+- Bumped [CSSTree](https://github.com/csstree/csstree) to `1.0.0-alpha.36` (#399)
+- Changed bundle files: `dist/csso.js` and `dist/csso.min.js` instead single `dist/csso-browser.js` (min version)
+- Expose `compress()` as `syntax.compress()`
+
+## 3.5.1 (June 7, 2018)
+
+- Bumped [CSSTree](https://github.com/csstree/csstree) to `1.0.0-alpha.29` (fixes some issues)
+
+## 3.5.0 (January 14, 2018)
+
+- Migrated to [CSSTree](https://github.com/csstree/csstree) `1.0.0-alpha.27`
+
+## 3.4.0 (November 3, 2017)
+
+- Added percent sign removal for zero percentages for some properties that is safe (@RubaXa, #286)
+- Removed unit removal for zero values in `-ms-flex` due it breaks flex in IE10/11 (#362)
+- Improved performance of selectors comparison (@smelukov, #343)
+
+## 3.3.1 (October 17, 2017)
+
+- Fixed merge of `position` declarations when `sticky` fallback is using (@gruzzilkin, #356)
+
+## 3.3.0 (October 12, 2017)
+
+- Migrated to [CSSTree](https://github.com/csstree/csstree) `1.0.0-alpha25`
+    - Changed AST format (see [CSSTree change log](https://github.com/csstree/csstree/blob/master/HISTORY.md) for details)
+    - Fixed performance issue when generate CSS with source map (quadratic increase in time depending on the size of the CSS)
+
+## 3.2.0 (September 10, 2017)
+
+- Fixed named color compression to apply only when an identifier is guaranteed to be a color
+- Added lifting of `@keyframes` to the beginning of style sheet (chunk), but after `@charset` and `@import` rules
+- Added removal of `@keyframes`, `@media` and `@supports` with no prelude
+- Added removal of duplicate `@keyframes` (#202)
+- Added new option `forceMediaMerge` to force media rules merging. It's unsafe in general, but works fine in many cases. Use it on your own risk (#350)
+- Bumped `CSSTree` to `1.0.0-alpha23`
+
+## 3.1.1 (April 25, 2017)
+
+- Fixed crash on a number processing when it used not in a list (#335)
+
+## 3.1.0 (April 24, 2017)
+
+- Implemented optimisation for `none` keyword in `border` and `outline` properties (@zoobestik, #41)
+- Implemented replacing `rgba(x, x, x, 0)` to `transparent`
+- Fixed plus sign omitting for numbers following identifier, hex color, number or unicode range, since it can change the meaning of CSS (e.g. `calc(1px+2px)` has been optimized to `calc(1px2px)` before, now it stays the same)
+- Improved usage filtering for nested selectors (i.e. for `:nth-*()`, `:has()`, `:matches` and other pseudos)
+- Implemented `blacklist` filtering in usage (#334, see [Black list filtering](https://github.com/css/csso#black-list-filtering))
+- Improved white space removing, now white spaces are removing in the beginning and at the ending of sequences, and between stylesheet and block nodes
+- Bumped `CSSTree` to `1.0.0-alpha19`
+
+## 3.0.1 (March 14, 2017)
+
+- Fixed declaration merging when declaration contains an `!important`
+
+## 3.0.0 (March 13, 2017)
+
+- Migrated to [CSSTree](https://github.com/csstree/csstree) as AST backend and exposed its API behind `syntax` property
+- Extracted CLI into standalone package [css/csso-cli](https://github.com/css/csso-cli)
+
+## 2.3.1 (January 6, 2017)
+
+- Added `\0` IE hack support (#320)
+
+## 2.3.0 (October 25, 2016)
+
+- Added `beforeCompress` and `afterCompress` options support (#316)
+- Fixed crash on empty argument in function (#317)
+
+## 2.2.1 (July 25, 2016)
+
+- Fixed shorthand optimisation issue when value has a color value or something unknown (#311)
+- Fixed `cursor` broken fallback (#306)
+
+## 2.2.0 (June 23, 2016)
+
+- Implement AST cloning by adding `clone()` [function](https://github.com/css/csso#cloneast) and `clone` [option](https://github.com/css/csso#compressast-options) for `compress()` function (#296)
+- Fix parse and translate attribute selector with flags but w/o operator (i.e. `[attrName i]`)
+- Don't merge rules with flagged attribute selectors with others (#291)
+- Take in account functions when merge TRBL-properties (#297, thanks to @ArturAralin)
+- Improve partial merge (#304)
+- Tweak scanner, reduce code deoptimizations and other small improvements
+
+## 2.1.1 (May 11, 2016)
+
+- Fix wrong declaration with `\9` hack merge (#295)
+
+## 2.1.0 (May 8, 2016)
+
+- New option `comments` to specify what comments to left: `exclamation`, `first-exclamation` and `none`
+- Add `offset` to CSS parse error details
+- Fix token `offset` computation
+
+## 2.0.0 (April 5, 2016)
+
+- No more `gonzales` AST format and related code
+- `minify()` and `minifyBlock()` is always return an object as result now (i.e. `{ css: String, map: SourceMapGenerator or null }`)
+- `parse()`
+    - Returns AST in new format (so called `internal`)
+    - Dynamic scanner implemented
+    - New AST format + dynamic scanner = performance boost and less memory consumption
+    - No more `context` argument, context should be specified via `options`
+    - Supported contexts now: `stylesheet`, `atrule`, `atruleExpression`, `ruleset`, `selector`, `simpleSelector`, `block`, `declaration` and `value` 
+    - Drop `needPositions` option, `positions` option should be used instead
+    - Drop `needInfo` option, `info` object is attaching to nodes when some information is requested by `options`
+    - `options` should be an object, otherwise it treats as empty object
+- `compress()`
+    - No more AST converting (performance boost and less memory consumption)
+    - Drop `outputAst` option
+    - Returns an object as result instead of AST (i.e. `{ ast: Object }`)
+- Drop methods: `justDoIt()`, `stringify()`, `cleanInfo()`
+
+## 1.8.1 (March 30, 2016)
+
+- Don't remove spaces after function/braces/urls since unsafe (#289)
+
+## 1.8.0 (March 24, 2016)
+
+- Usage data support:
+    - Filter rulesets by tag names, class names and ids white lists.
+    - More aggressive ruleset moving using class name scopes information.
+    - New CLI option `--usage` to pass usage data file.
+- Improve initial ruleset merge
+    - Change order of ruleset processing, now it's left to right. Previously unmerged rulesets may prevent lookup and other rulesets merge.
+    - Difference in pseudo signature just prevents ruleset merging, but don't stop lookup.
+    - Simplify block comparison (performance).
+- New method `csso.minifyBlock()` for css block compression (e.g. `style` attribute content).
+- Ruleset merge improvement: at-rules with block (like `@media` or `@supports`) now can be skipped during ruleset merge lookup if doesn't contain something prevents it.
+- FIX: Add negation (`:not()`) to pseudo signature to avoid unsafe merge (old browsers doesn't support it).
+- FIX: Check nested parts of value when compute compatibility. It fixes unsafe property merging.
+
+## 1.7.1 (March 16, 2016)
+
+- pass block mode to tokenizer for correct parsing of declarations properties with `//` hack
+- fix wrongly `@import` and `@charset` removal on double exclamation comment
+
+## 1.7.0 (March 10, 2016)
+
+- support for [CSS Custom Properties](https://www.w3.org/TR/css-variables/) (#279)
+- rework RTBL properties merge – better merge for values with special units and don't merge values with CSS-wide keywords (#255)
+- remove redundant universal selectors (#178)
+- take in account `!important` when check for property overriding (#280)
+- don't merge `text-align` declarations with some values (#281)
+- add spaces around `/deep/` combinator on translate, since it together with universal selector can produce a comment
+- better keyword and property name resolving (tolerant to hacks and so on)
+- integration improvements
+    - compression log function could be customized by `logger` option for `compress()` and `minify()`
+    - make possible to set initial line and column for parser
+
+## 1.6.4 (March 1, 2016)
+
+- `npm` publish issue (#276)
+
+## 1.6.3 (February 29, 2016)
+
+- add `file` to generated source map since other tools can relay on it in source map transform chain
+
+## 1.6.2 (February 29, 2016)
+
+- tweak some parse error messages and their positions
+- fix `:not()` parsing and selector groups in `:not()` is supported now (#215)
+- `needPosition` parser option is deprecated, `positions` option should be used instead (`needPosition` is used still if `positions` option omitted)
+- expose internal AST API as `csso.internal.*`
+- `minify()` adds `sourcesContent` by default when source map is generated
+- bring back support for node.js `0.10` until major release (#275)
+
+## 1.6.1 (February 28, 2016)
+
+- fix exception on zero length dimension compress outside declaration (#273)
+
+## 1.6.0 (February 27, 2016)
+
+- **source maps support**
+- parser remake:
+    - various parsing issues fixed
+    - fix unicode sequence processing in ident (#191)
+    - support for flags in attribute selector (#270)
+    - position (line and column) of parse error (#109)
+    - 4x performance boost, less memory consumption
+- compressor refactoring
+    - internal AST is using doubly linked lists (with safe transformation support during iteration) instead of arrays
+    - rename `restructuring` to `restructure` option for `minify()`/`compress()` (`restructuring` is alias for `restructure` now, with lower priority)
+    - unquote urls when possible (#141, #60)
+- setup code coverage and a number of related fixes
+- add eslint to check unused things
+
+## 1.5.4 (January 27, 2016)
+
+- one more fix (in `restructRuleset` this time) with merge of rulesets when a ruleset with same specificity places between them (#264)
+- disable partial merge of rulesets in `@keyframes` rulesets (until sure it's correct)
+
+## 1.5.3 (January 25, 2016)
+
+- don't override display values with different browser support (#259)
+- fix publish issue (one of modules leak in development state)
+
+## 1.5.2 (January 24, 2016)
+
+- don't merge rulesets if between them a ruleset with same specificity (#264)
+
+## 1.5.1 (January 14, 2016)
+
+- ensure `-` is not used as an identifier in attribute selectors (thanks to @mathiasbynens)
+- fix broken `justDoIt()` function
+- various small fixes
+
+## 1.5.0 (January 14, 2016)
+
+### Parser
+
+- attach minus to number
+
+### Compressor
+
+- split code base into small modules and related refactoring
+- introduce internal AST format for compressor (`gonzales`→`internal` and `internal`→`gonzales` convertors, walkers, translator)
+- various optimizations: no snapshots, using caches and indexes
+- sort selectors, merge selectors in alphabet order
+- compute selector's specificity
+- better ruleset restructuring, improve compression of partially equal blocks
+- better ruleset merge – not only closest but also disjoined by other rulesets when safe
+- join `@media` with same query
+- `outputAst` – new option to specify output AST format (`gonzales` by default for backward compatibility)
+- remove quotes surrounding attribute values in attribute selectors when possible (#73)
+- replace `from`→`0%` and `100%`→`to` at `@keyframes` (#205)
+- prevent partial merge of rulesets at `@keyframes` (#80, #197)
+
+### API
+
+- walker for `gonzales` AST was implemented
+
+### CLI
+
+- new option `--stat` (output stat in `stderr`)
+- new optional parameter `level` for `--debug` option
+
+## 1.4.4 (December 10, 2015)
+
+- prevent removal of spaces after braces that before identifier that breaking at-rules expressions (#258)
+
+## 1.4.3 (December 4, 2015)
+
+- fix unicode-range parsing that cause to wrong function detection (#250)
+
+## 1.4.2 (November 9, 2015)
+
+- allow spaces between `progid:` and rest part of value for IE's `filter` property as `autoprefixer` generates this kind of code (#249)
+- fixes for Windows:
+  - correct processing new lines
+  - normalize file content in test suite
+- fixes to work in strict mode (#252)
+- init compressor dictionaries for every css block (#248, #251)
+- bump uglify-js version
+
+## 1.4.1 (October 20, 2015)
+
+- allow merge for `display` property (#167, #244)
+- more accurate `rect` (`clip` property value) merge
+- fix typo when specifying options in cli (thanks to @Taritsyn)
+- fix safe unit values merge with keyword values (#244)
+- fix wrong descendant combinator removal (#246)
+- build browser version on `prepublish` (thanks to @silentroach)
+- parser: store whitespaces as single token (performance and reduce memory consumption)
+- rearrange compress tests layout
+
+## 1.4 (October 16, 2015)
+
+Bringing project back to life. Changed files structure, cleaned up and refactored most of sources.
+
+### Common
+
+- single code base (no more `src` folder)
+- build browser version with `browserify` (no more `make`, and `web` folder), browser version is available at `dist/csso-browser.js`
+- main file is `lib/index.js` now
+- minimal `node.js` version is `0.12` now
+- restrict file list to publish on npm (no more useless folders and files in package)
+- add `jscs` to control code style
+- automate `gh-pages` update
+- util functions reworked
+- translator reworked
+- test suite reworked
+- compressor refactored
+- initial parser refactoring
+
+### API
+
+- new method `minify(src, options)`, options:
+  - `restructuring` – if set to `false`, disable structure optimisations (`true` by default)
+  - `debug` - outputs intermediate state of CSS during compression (`false` by default)
+- deprecate `justDoIt()` method (use `minify` instead)
+- rename `treeToString()` method to `stringify()`
+- drop `printTree()` method
+- AST node info
+  - `column` and `offset` added
+  - `ln` renamed to `line`
+  - fix line counting across multiple files and input with CR LF (#147)
+
+### CLI
+
+- completely reworked, use [clap](https://github.com/lahmatiy/clap) to parse argv
+- add support for input from stdin (#128)
+- drop undocumented and obsoleted options `--rule` and `--parser` (suppose nobody use it)
+- drop `-off` alias for `--restructure-off` as incorrect (only one letter options should starts with single `-`)
+- new option `--debug` that reflecting to `options.debug` for `minify`
+
+### Parsing and optimizations
+
+- keep all exclamation comments (#194)
+- add `/deep/` combinator support (#209)
+- attribute selector
+  - allow colon in attribute name (#237)
+  - support for namespaces (#233)
+- color
+  - support all css/html colors
+  - convert `hsla` to `rgba` and `hls` to `rgb`
+  - convert `rgba` with 1 as alpha value to `rgb` (#122)
+  - interpolate `rgb` and `rgba` percentage values to absolute values
+  - replace percentage values in `rgba` for normalized/interpolated values
+  - lowercase hex colors and color names (#169)
+  - fix color minification when hex value replaced for color name (#176)
+  - fit rgb values to 0..255 range (#181)
+- calc
+  - remove spaces for multiple operator in calc
+  - don't remove units inside calc (#222)
+  - fix wrong white space removal around `+` and `-` (#228)
+- don't remove units in `flex` property as it could change value meaning (#200)
+- don't merge `\9` hack values (#231)
+- merge property values only if they have the same functions (#150, #227)
+- don't merge property values with some sort of units (#140, #161)
+- fix `!important` issue for `top-right-bottom-left` properties (#189)
+- fix `top-right-bottom-left` properties merge (#139, #175)
+- support for unicode-range (#148)
+- don't crash on ruleset with no selector (#135)
+- tolerant to class names that starts with digit (#99, #105)
+- fix background compressing (#170)
+
+## 1.3.12 (October 8, 2015)
+
+- Case insensitive check for `!important` (#187)
+- Fix problems with using `csso` as cli command on Windows (#83, #136, #142 and others)
+- Remove byte order marker (the UTF-8 BOM) from input
+- Don't strip space between funktion-funktion and funktion-vhash (#134)
+- Don't merge TRBL values having \9 (hack for IE8 in bootstrap) (#159, #214, #230, #231 and others)
+- Don't strip units off dimensions of non-length (#226, #229 and others)
+
+## 1.3.7 (February 11, 2013)
+
+- Gonzales 1.0.7.
+
+## 1.3.6 (November 26, 2012)
+
+- Gonzales 1.0.6.
+
+## 1.3.5 (October 28, 2012)
+
+- Gonzales 1.0.5.
+- Protecting copyright notices in CSS: https://github.com/css/csso/issues/92
+- Zero CSS throws an error: https://github.com/css/csso/issues/96
+- Don't minify the second `0s` in Firefox for animations: https://github.com/css/csso/issues/100
+- Japan manual
+- BEM ready documentation
+
+## 1.3.4 (October 10, 2012)
+
+- @page inside @media Causes Error: https://github.com/css/csso/issues/90
+
+## 1.3.3 (October 9, 2012)
+
+- CSSO 1.3.2 compresses ".t-1" and ".t-01" as identical classes: https://github.com/css/csso/issues/88
+
+## 1.3.2 (October 8, 2012)
+
+- filter + important breaks CSSO v1.3.1: https://github.com/css/csso/issues/87
+
+## 1.3.1 (October 8, 2012)
+
+- "filter" IE property breaks CSSO v1.3.0: https://github.com/css/csso/issues/86
+
+## 1.3.0 (October 4, 2012)
+
+- PeCode CSS parser replaced by Gonzales CSS parser
diff --git a/node_modules/csso/LICENSE b/node_modules/csso/LICENSE
new file mode 100644
index 0000000..9f982eb
--- /dev/null
+++ b/node_modules/csso/LICENSE
@@ -0,0 +1,20 @@
+Copyright (C) 2015-2019 by Roman Dvornov
+Copyright (C) 2011-2015 by Sergey Kryzhanovsky
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/csso/README.md b/node_modules/csso/README.md
new file mode 100644
index 0000000..6395bc1
--- /dev/null
+++ b/node_modules/csso/README.md
@@ -0,0 +1,372 @@
+[![NPM version](https://img.shields.io/npm/v/csso.svg)](https://www.npmjs.com/package/csso)
+[![Build Status](https://travis-ci.org/css/csso.svg?branch=master)](https://travis-ci.org/css/csso)
+[![Coverage Status](https://coveralls.io/repos/github/css/csso/badge.svg?branch=master)](https://coveralls.io/github/css/csso?branch=master)
+[![NPM Downloads](https://img.shields.io/npm/dm/csso.svg)](https://www.npmjs.com/package/csso)
+[![Twitter](https://img.shields.io/badge/Twitter-@cssoptimizer-blue.svg)](https://twitter.com/cssoptimizer)
+
+CSSO (CSS Optimizer) is a CSS minifier. It performs three sort of transformations: cleaning (removing redundant), compression (replacement for shorter form) and restructuring (merge of declarations, rulesets and so on). As a result your CSS becomes much smaller.
+
+[![Originated by Yandex](https://cdn.rawgit.com/css/csso/8d1b89211ac425909f735e7d5df87ee16c2feec6/docs/yandex.svg)](https://www.yandex.com/)
+[![Sponsored by Avito](https://cdn.rawgit.com/css/csso/8d1b89211ac425909f735e7d5df87ee16c2feec6/docs/avito.svg)](https://www.avito.ru/)
+
+## Ready to use
+
+- [Web interface](http://css.github.io/csso/csso.html)
+- [csso-cli](https://github.com/css/csso-cli) – command line interface
+- [gulp-csso](https://github.com/ben-eb/gulp-csso) – `Gulp` plugin
+- [grunt-csso](https://github.com/t32k/grunt-csso) – `Grunt` plugin
+- [broccoli-csso](https://github.com/sindresorhus/broccoli-csso) – `Broccoli` plugin
+- [postcss-csso](https://github.com/lahmatiy/postcss-csso) – `PostCSS` plugin
+- [csso-loader](https://github.com/sandark7/csso-loader) – `webpack` loader
+- [csso-webpack-plugin](https://github.com/zoobestik/csso-webpack-plugin) – `webpack` plugin
+- [CSSO Visual Studio Code plugin](https://marketplace.visualstudio.com/items?itemName=Aneryu.csso)
+
+## Install
+
+```
+npm install csso
+```
+
+## API
+
+<!-- TOC depthfrom:3 -->
+
+- [minify(source[, options])](#minifysource-options)
+- [minifyBlock(source[, options])](#minifyblocksource-options)
+- [syntax.compress(ast[, options])](#syntaxcompressast-options)
+- [Source maps](#source-maps)
+- [Usage data](#usage-data)
+    - [White list filtering](#white-list-filtering)
+    - [Black list filtering](#black-list-filtering)
+    - [Scopes](#scopes)
+
+<!-- /TOC -->
+
+Basic usage:
+
+```js
+var csso = require('csso');
+
+var minifiedCss = csso.minify('.test { color: #ff0000; }').css;
+
+console.log(minifiedCss);
+// .test{color:red}
+```
+
+CSSO is based on [CSSTree](https://github.com/csstree/csstree) to parse CSS into AST, AST traversal and to generate AST back to CSS. All `CSSTree` API is available behind `syntax` field. You may minify CSS step by step:
+
+```js
+var csso = require('csso');
+var ast = csso.syntax.parse('.test { color: #ff0000; }');
+var compressedAst = csso.syntax.compress(ast).ast;
+var minifiedCss = csso.syntax.generate(compressedAst);
+
+console.log(minifiedCss);
+// .test{color:red}
+```
+
+> Warning: CSSO uses early versions of CSSTree that still in active development. CSSO doesn't guarantee API behind `syntax` field or AST format will not change in future releases of CSSO, since it's subject to change in CSSTree. Be careful with CSSO updates if you use `syntax` API until this warning removal.
+
+### minify(source[, options])
+
+Minify `source` CSS passed as `String`.
+
+```js
+var result = csso.minify('.test { color: #ff0000; }', {
+    restructure: false,   // don't change CSS structure, i.e. don't merge declarations, rulesets etc
+    debug: true           // show additional debug information:
+                          // true or number from 1 to 3 (greater number - more details)
+});
+
+console.log(result.css);
+// > .test{color:red}
+```
+
+Returns an object with properties:
+
+- css `String` – resulting CSS
+- map `Object` – instance of [`SourceMapGenerator`](https://github.com/mozilla/source-map#sourcemapgenerator) or `null`
+
+Options:
+
+- sourceMap
+
+  Type: `Boolean`  
+  Default: `false`
+
+  Generate a source map when `true`.
+
+- filename
+
+  Type: `String`  
+  Default: `'<unknown>'`
+
+  Filename of input CSS, uses for source map generation.
+
+- debug
+
+  Type: `Boolean`  
+  Default: `false`
+
+  Output debug information to `stderr`.
+
+- beforeCompress
+
+  Type: `function(ast, options)` or `Array<function(ast, options)>` or `null`  
+  Default: `null`
+
+  Called right after parse is run.
+
+- afterCompress
+
+  Type: `function(compressResult, options)` or `Array<function(compressResult, options)>` or `null`  
+  Default: `null`
+
+  Called right after [`syntax.compress()`](#syntaxcompressast-options) is run.
+
+- Other options are the same as for [`syntax.compress()`](#syntaxcompressast-options) function.
+
+### minifyBlock(source[, options])
+
+The same as `minify()` but for list of declarations. Usually it's a `style` attribute value.
+
+```js
+var result = csso.minifyBlock('color: rgba(255, 0, 0, 1); color: #ff0000');
+
+console.log(result.css);
+// > color:red
+```
+
+### syntax.compress(ast[, options])
+
+Does the main task – compress an AST. This is CSSO's extension in CSSTree syntax API.
+
+> NOTE: `syntax.compress()` performs AST compression by transforming input AST by default (since AST cloning is expensive and needed in rare cases). Use `clone` option with truthy value in case you want to keep input AST untouched.
+
+Returns an object with properties:
+
+- ast `Object` – resulting AST
+
+Options:
+
+- restructure
+
+  Type: `Boolean`  
+  Default: `true`
+
+  Disable or enable a structure optimisations.
+
+- forceMediaMerge
+
+  Type: `Boolean`  
+  Default: `false`
+
+  Enables merging of `@media` rules with the same media query by splitted by other rules. The optimisation is unsafe in general, but should work fine in most cases. Use it on your own risk.
+
+- clone
+
+  Type: `Boolean`  
+  Default: `false`
+
+  Transform a copy of input AST if `true`. Useful in case of AST reuse.
+
+- comments
+
+  Type: `String` or `Boolean`  
+  Default: `true`
+
+  Specify what comments to leave:
+
+  - `'exclamation'` or `true` – leave all exclamation comments (i.e. `/*! .. */`)
+  - `'first-exclamation'` – remove every comment except first one
+  - `false` – remove all comments
+
+- usage
+
+  Type: `Object` or `null`  
+  Default: `null`
+
+  Usage data for advanced optimisations (see [Usage data](#usage-data) for details)
+
+- logger
+
+  Type: `Function` or `null`  
+  Default: `null`
+
+  Function to track every step of transformation.
+
+### Source maps
+
+To get a source map set `true` for `sourceMap` option. Additianaly `filename` option can be passed to specify source file. When `sourceMap` option is `true`, `map` field of result object will contain a [`SourceMapGenerator`](https://github.com/mozilla/source-map#sourcemapgenerator) instance. This object can be mixed with another source map or translated to string.
+
+```js
+var csso = require('csso');
+var css = fs.readFileSync('path/to/my.css', 'utf8');
+var result = csso.minify(css, {
+  filename: 'path/to/my.css', // will be added to source map as reference to source file
+  sourceMap: true             // generate source map
+});
+
+console.log(result);
+// { css: '...minified...', map: SourceMapGenerator {} }
+
+console.log(result.map.toString());
+// '{ .. source map content .. }'
+```
+
+Example of generating source map with respect of source map from input CSS:
+
+```js
+var require('source-map');
+var csso = require('csso');
+var inputFile = 'path/to/my.css';
+var input = fs.readFileSync(inputFile, 'utf8');
+var inputMap = input.match(/\/\*# sourceMappingURL=(\S+)\s*\*\/\s*$/);
+var output = csso.minify(input, {
+  filename: inputFile,
+  sourceMap: true
+});
+
+// apply input source map to output
+if (inputMap) {
+  output.map.applySourceMap(
+    new SourceMapConsumer(inputMap[1]),
+    inputFile
+  )
+}
+
+// result CSS with source map
+console.log(
+  output.css +
+  '/*# sourceMappingURL=data:application/json;base64,' +
+  new Buffer(output.map.toString()).toString('base64') +
+  ' */'
+);
+```
+
+### Usage data
+
+`CSSO` can use data about how `CSS` is used in a markup for better compression. File with this data (`JSON`) can be set using `usage` option. Usage data may contain following sections:
+
+- `blacklist` – a set of black lists (see [Black list filtering](#black-list-filtering))
+- `tags` – white list of tags
+- `ids` – white list of ids
+- `classes` – white list of classes
+- `scopes` – groups of classes which never used with classes from other groups on the same element
+
+All sections are optional. Value of `tags`, `ids` and `classes` should be an array of a string, value of `scopes` should be an array of arrays of strings. Other values are ignoring.
+
+#### White list filtering
+
+`tags`, `ids` and `classes` are using on clean stage to filter selectors that contain something not in the lists. Selectors are filtering only by those kind of simple selector which white list is specified. For example, if only `tags` list is specified then type selectors are checking, and if all type selectors in selector present in list or selector has no any type selector it isn't filter.
+
+> `ids` and `classes` are case sensitive, `tags` – is not.
+
+Input CSS:
+
+```css
+* { color: green; }
+ul, ol, li { color: blue; }
+UL.foo, span.bar { color: red; }
+```
+
+Usage data:
+
+```json
+{
+    "tags": ["ul", "LI"]
+}
+```
+
+Resulting CSS:
+
+```css
+*{color:green}ul,li{color:blue}ul.foo{color:red}
+```
+
+Filtering performs for nested selectors too. `:not()` pseudos content is ignoring since the result of matching is unpredictable. Example for the same usage data as above:
+
+```css
+:nth-child(2n of ul, ol) { color: red }
+:nth-child(3n + 1 of img) { color: yellow }
+:not(div, ol, ul) { color: green }
+:has(:matches(ul, ol), ul, ol) { color: blue }
+```
+
+Turns into:
+
+```css
+:nth-child(2n of ul){color:red}:not(div,ol,ul){color:green}:has(:matches(ul),ul){color:blue}
+```
+
+#### Black list filtering
+
+Black list filtering performs the same as white list filtering, but filters things that mentioned in the lists. `blacklist` can contain the lists `tags`, `ids` and `classes`.
+
+Black list has a higher priority, so when something mentioned in the white list and in the black list then white list occurrence is ignoring. The `:not()` pseudos content ignoring as well.
+
+```css
+* { color: green; }
+ul, ol, li { color: blue; }
+UL.foo, li.bar { color: red; }
+```
+
+Usage data:
+
+```json
+{
+    "blacklist": {
+        "tags": ["ul"]
+    },
+    "tags": ["ul", "LI"]
+}
+```
+
+Resulting CSS:
+
+```css
+*{color:green}li{color:blue}li.bar{color:red}
+```
+
+#### Scopes
+
+Scopes is designed for CSS scope isolation solutions such as [css-modules](https://github.com/css-modules/css-modules). Scopes are similar to namespaces and define lists of class names that exclusively used on some markup. This information allows the optimizer to move rules more agressive. Since it assumes selectors from different scopes don't match for the same element. This can improve rule merging.
+
+Suppose we have a file:
+
+```css
+.module1-foo { color: red; }
+.module1-bar { font-size: 1.5em; background: yellow; }
+
+.module2-baz { color: red; }
+.module2-qux { font-size: 1.5em; background: yellow; width: 50px; }
+```
+
+It can be assumed that first two rules are never used with the second two on the same markup. But we can't say that for sure without a markup review. The optimizer doesn't know it either and will perform safe transformations only. The result will be the same as input but with no spaces and some semicolons:
+
+```css
+.module1-foo{color:red}.module1-bar{font-size:1.5em;background:#ff0}.module2-baz{color:red}.module2-qux{font-size:1.5em;background:#ff0;width:50px}
+```
+
+With usage data `CSSO` can produce better output. If follow usage data is provided:
+
+```json
+{
+    "scopes": [
+        ["module1-foo", "module1-bar"],
+        ["module2-baz", "module2-qux"]
+    ]
+}
+```
+
+The result will be (29 bytes extra saving):
+
+```css
+.module1-foo,.module2-baz{color:red}.module1-bar,.module2-qux{font-size:1.5em;background:#ff0}.module2-qux{width:50px}
+```
+
+If class name isn't mentioned in the `scopes` it belongs to default scope. `scopes` data doesn't affect `classes` whitelist. If class name mentioned in `scopes` but missed in `classes` (both sections are specified) it will be filtered.
+
+Note that class name can't be set for several scopes. Also a selector can't have class names from different scopes. In both cases an exception will thrown.
+
+Currently the optimizer doesn't care about changing order safety for out-of-bounds selectors (i.e. selectors that match to elements without class name, e.g. `.scope div` or `.scope ~ :last-child`). It assumes that scoped CSS modules doesn't relay on it's order. It may be fix in future if to be an issue.
diff --git a/node_modules/csso/dist/csso.js b/node_modules/csso/dist/csso.js
new file mode 100644
index 0000000..8e9187b
--- /dev/null
+++ b/node_modules/csso/dist/csso.js
@@ -0,0 +1,3322 @@
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+	typeof define === 'function' && define.amd ? define(['exports'], factory) :
+	(global = global || self, factory(global.csso = {}));
+}(this, (function (exports) { 'use strict';
+
+	var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+	function createCommonjsModule(fn, module) {
+		return module = { exports: {} }, fn(module, module.exports), module.exports;
+	}
+
+	function getCjsExportFromNamespace (n) {
+		return n && n['default'] || n;
+	}
+
+	var csstree_min = createCommonjsModule(function (module, exports) {
+	!function(e,t){module.exports=t();}(commonjsGlobal,(function(){function e(e){return {prev:null,next:null,data:e}}function t(e,t,n){var i;return null!==r?(i=r,r=r.cursor,i.prev=t,i.next=n,i.cursor=e.cursor):i={prev:t,next:n,cursor:e.cursor},e.cursor=i,i}function n(e){var t=e.cursor;e.cursor=t.cursor,t.prev=null,t.next=null,t.cursor=r,r=t;}var r=null,i=function(){this.cursor=null,this.head=null,this.tail=null;};i.createItem=e,i.prototype.createItem=e,i.prototype.updateCursors=function(e,t,n,r){for(var i=this.cursor;null!==i;)i.prev===e&&(i.prev=t),i.next===n&&(i.next=r),i=i.cursor;},i.prototype.getSize=function(){for(var e=0,t=this.head;t;)e++,t=t.next;return e},i.prototype.fromArray=function(t){var n=null;this.head=null;for(var r=0;r<t.length;r++){var i=e(t[r]);null!==n?n.next=i:this.head=i,i.prev=n,n=i;}return this.tail=n,this},i.prototype.toArray=function(){for(var e=this.head,t=[];e;)t.push(e.data),e=e.next;return t},i.prototype.toJSON=i.prototype.toArray,i.prototype.isEmpty=function(){return null===this.head},i.prototype.first=function(){return this.head&&this.head.data},i.prototype.last=function(){return this.tail&&this.tail.data},i.prototype.each=function(e,r){var i;void 0===r&&(r=this);for(var a=t(this,null,this.head);null!==a.next;)i=a.next,a.next=i.next,e.call(r,i.data,i,this);n(this);},i.prototype.forEach=i.prototype.each,i.prototype.eachRight=function(e,r){var i;void 0===r&&(r=this);for(var a=t(this,this.tail,null);null!==a.prev;)i=a.prev,a.prev=i.prev,e.call(r,i.data,i,this);n(this);},i.prototype.forEachRight=i.prototype.eachRight,i.prototype.reduce=function(e,r,i){var a;void 0===i&&(i=this);for(var o=t(this,null,this.head),s=r;null!==o.next;)a=o.next,o.next=a.next,s=e.call(i,s,a.data,a,this);return n(this),s},i.prototype.reduceRight=function(e,r,i){var a;void 0===i&&(i=this);for(var o=t(this,this.tail,null),s=r;null!==o.prev;)a=o.prev,o.prev=a.prev,s=e.call(i,s,a.data,a,this);return n(this),s},i.prototype.nextUntil=function(e,r,i){if(null!==e){var a;void 0===i&&(i=this);for(var o=t(this,null,e);null!==o.next&&(a=o.next,o.next=a.next,!r.call(i,a.data,a,this)););n(this);}},i.prototype.prevUntil=function(e,r,i){if(null!==e){var a;void 0===i&&(i=this);for(var o=t(this,e,null);null!==o.prev&&(a=o.prev,o.prev=a.prev,!r.call(i,a.data,a,this)););n(this);}},i.prototype.some=function(e,t){var n=this.head;for(void 0===t&&(t=this);null!==n;){if(e.call(t,n.data,n,this))return !0;n=n.next;}return !1},i.prototype.map=function(e,t){var n=new i,r=this.head;for(void 0===t&&(t=this);null!==r;)n.appendData(e.call(t,r.data,r,this)),r=r.next;return n},i.prototype.filter=function(e,t){var n=new i,r=this.head;for(void 0===t&&(t=this);null!==r;)e.call(t,r.data,r,this)&&n.appendData(r.data),r=r.next;return n},i.prototype.clear=function(){this.head=null,this.tail=null;},i.prototype.copy=function(){for(var t=new i,n=this.head;null!==n;)t.insert(e(n.data)),n=n.next;return t},i.prototype.prepend=function(e){return this.updateCursors(null,e,this.head,e),null!==this.head?(this.head.prev=e,e.next=this.head):this.tail=e,this.head=e,this},i.prototype.prependData=function(t){return this.prepend(e(t))},i.prototype.append=function(e){return this.insert(e)},i.prototype.appendData=function(t){return this.insert(e(t))},i.prototype.insert=function(e,t){if(null!=t)if(this.updateCursors(t.prev,e,t,e),null===t.prev){if(this.head!==t)throw new Error("before doesn't belong to list");this.head=e,t.prev=e,e.next=t,this.updateCursors(null,e);}else t.prev.next=e,e.prev=t.prev,t.prev=e,e.next=t;else this.updateCursors(this.tail,e,null,e),null!==this.tail?(this.tail.next=e,e.prev=this.tail):this.head=e,this.tail=e;return this},i.prototype.insertData=function(t,n){return this.insert(e(t),n)},i.prototype.remove=function(e){if(this.updateCursors(e,e.prev,e,e.next),null!==e.prev)e.prev.next=e.next;else {if(this.head!==e)throw new Error("item doesn't belong to list");this.head=e.next;}if(null!==e.next)e.next.prev=e.prev;else {if(this.tail!==e)throw new Error("item doesn't belong to list");this.tail=e.prev;}return e.prev=null,e.next=null,e},i.prototype.push=function(t){this.insert(e(t));},i.prototype.pop=function(){if(null!==this.tail)return this.remove(this.tail)},i.prototype.unshift=function(t){this.prepend(e(t));},i.prototype.shift=function(){if(null!==this.head)return this.remove(this.head)},i.prototype.prependList=function(e){return this.insertList(e,this.head)},i.prototype.appendList=function(e){return this.insertList(e)},i.prototype.insertList=function(e,t){return null===e.head||(null!=t?(this.updateCursors(t.prev,e.tail,t,e.head),null!==t.prev?(t.prev.next=e.head,e.head.prev=t.prev):this.head=e.head,t.prev=e.tail,e.tail.next=t):(this.updateCursors(this.tail,e.tail,null,e.head),null!==this.tail?(this.tail.next=e.head,e.head.prev=this.tail):this.head=e.head,this.tail=e.tail),e.head=null,e.tail=null),this},i.prototype.replace=function(e,t){"head"in t?this.insertList(t,e):this.insert(t,e),this.remove(e);};var a=i,o=function(e,t){var n=Object.create(SyntaxError.prototype),r=new Error;return n.name=e,n.message=t,Object.defineProperty(n,"stack",{get:function(){return (r.stack||"").replace(/^(.+\n){1,3}/,e+": "+t+"\n")}}),n};function s(e,t){function n(e,t){return r.slice(e,t).map((function(t,n){for(var r=String(e+n+1);r.length<l;)r=" "+r;return r+" |"+t})).join("\n")}var r=e.source.split(/\r\n?|\n|\f/),i=e.line,a=e.column,o=Math.max(1,i-t)-1,s=Math.min(i+t,r.length+1),l=Math.max(4,String(s).length)+1,c=0;(a+=("    ".length-1)*(r[i-1].substr(0,a-1).match(/\t/g)||[]).length)>100&&(c=a-60+3,a=58);for(var u=o;u<=s;u++)u>=0&&u<r.length&&(r[u]=r[u].replace(/\t/g,"    "),r[u]=(c>0&&r[u].length>c?"…":"")+r[u].substr(c,98)+(r[u].length>c+100-1?"…":""));return [n(o,i),new Array(a+l+2).join("-")+"^",n(i,s)].filter(Boolean).join("\n")}var l=function(e,t,n,r,i){var a=o("SyntaxError",e);return a.source=t,a.offset=n,a.line=r,a.column=i,a.sourceFragment=function(e){return s(a,isNaN(e)?0:e)},Object.defineProperty(a,"formattedMessage",{get:function(){return "Parse error: "+a.message+"\n"+s(a,2)}}),a.parseError={offset:n,line:r,column:i},a},c={EOF:0,Ident:1,Function:2,AtKeyword:3,Hash:4,String:5,BadString:6,Url:7,BadUrl:8,Delim:9,Number:10,Percentage:11,Dimension:12,WhiteSpace:13,CDO:14,CDC:15,Colon:16,Semicolon:17,Comma:18,LeftSquareBracket:19,RightSquareBracket:20,LeftParenthesis:21,RightParenthesis:22,LeftCurlyBracket:23,RightCurlyBracket:24,Comment:25},u=Object.keys(c).reduce((function(e,t){return e[c[t]]=t,e}),{}),h={TYPE:c,NAME:u};function p(e){return e>=48&&e<=57}function d(e){return e>=65&&e<=90}function m(e){return e>=97&&e<=122}function g(e){return d(e)||m(e)}function f(e){return e>=128}function b(e){return g(e)||f(e)||95===e}function y(e){return e>=0&&e<=8||11===e||e>=14&&e<=31||127===e}function k(e){return 10===e||13===e||12===e}function v(e){return k(e)||32===e||9===e}function x(e,t){return 92===e&&(!k(t)&&0!==t)}var w=new Array(128);C.Eof=128,C.WhiteSpace=130,C.Digit=131,C.NameStart=132,C.NonPrintable=133;for(var S=0;S<w.length;S++)switch(!0){case v(S):w[S]=C.WhiteSpace;break;case p(S):w[S]=C.Digit;break;case b(S):w[S]=C.NameStart;break;case y(S):w[S]=C.NonPrintable;break;default:w[S]=S||C.Eof;}function C(e){return e<128?w[e]:C.NameStart}var z={isDigit:p,isHexDigit:function(e){return p(e)||e>=65&&e<=70||e>=97&&e<=102},isUppercaseLetter:d,isLowercaseLetter:m,isLetter:g,isNonAscii:f,isNameStart:b,isName:function(e){return b(e)||p(e)||45===e},isNonPrintable:y,isNewline:k,isWhiteSpace:v,isValidEscape:x,isIdentifierStart:function(e,t,n){return 45===e?b(t)||45===t||x(t,n):!!b(e)||92===e&&x(e,t)},isNumberStart:function(e,t,n){return 43===e||45===e?p(t)?2:46===t&&p(n)?3:0:46===e?p(t)?2:0:p(e)?1:0},isBOM:function(e){return 65279===e||65534===e?1:0},charCodeCategory:C},A=z.isDigit,P=z.isHexDigit,T=z.isUppercaseLetter,L=z.isName,E=z.isWhiteSpace,D=z.isValidEscape;function O(e,t){return t<e.length?e.charCodeAt(t):0}function B(e,t,n){return 13===n&&10===O(e,t+1)?2:1}function I(e,t,n){var r=e.charCodeAt(t);return T(r)&&(r|=32),r===n}function N(e,t){for(;t<e.length&&A(e.charCodeAt(t));t++);return t}function R(e,t){if(P(O(e,(t+=2)-1))){for(var n=Math.min(e.length,t+5);t<n&&P(O(e,t));t++);var r=O(e,t);E(r)&&(t+=B(e,t,r));}return t}var M={consumeEscaped:R,consumeName:function(e,t){for(;t<e.length;t++){var n=e.charCodeAt(t);if(!L(n)){if(!D(n,O(e,t+1)))break;t=R(e,t)-1;}}return t},consumeNumber:function(e,t){var n=e.charCodeAt(t);if(43!==n&&45!==n||(n=e.charCodeAt(t+=1)),A(n)&&(t=N(e,t+1),n=e.charCodeAt(t)),46===n&&A(e.charCodeAt(t+1))&&(n=e.charCodeAt(t+=2),t=N(e,t)),I(e,t,101)){var r=0;45!==(n=e.charCodeAt(t+1))&&43!==n||(r=1,n=e.charCodeAt(t+2)),A(n)&&(t=N(e,t+1+r+1));}return t},consumeBadUrlRemnants:function(e,t){for(;t<e.length;t++){var n=e.charCodeAt(t);if(41===n){t++;break}D(n,O(e,t+1))&&(t=R(e,t));}return t},cmpChar:I,cmpStr:function(e,t,n,r){if(n-t!==r.length)return !1;if(t<0||n>e.length)return !1;for(var i=t;i<n;i++){var a=e.charCodeAt(i),o=r.charCodeAt(i-t);if(T(a)&&(a|=32),a!==o)return !1}return !0},getNewlineLength:B,findWhiteSpaceStart:function(e,t){for(;t>=0&&E(e.charCodeAt(t));t--);return t+1},findWhiteSpaceEnd:function(e,t){for(;t<e.length&&E(e.charCodeAt(t));t++);return t}},j=h.TYPE,_=h.NAME,F=M.cmpStr,W=j.EOF,q=j.WhiteSpace,Y=j.Comment,U=function(){this.offsetAndType=null,this.balance=null,this.reset();};U.prototype={reset:function(){this.eof=!1,this.tokenIndex=-1,this.tokenType=0,this.tokenStart=this.firstCharOffset,this.tokenEnd=this.firstCharOffset;},lookupType:function(e){return (e+=this.tokenIndex)<this.tokenCount?this.offsetAndType[e]>>24:W},lookupOffset:function(e){return (e+=this.tokenIndex)<this.tokenCount?16777215&this.offsetAndType[e-1]:this.source.length},lookupValue:function(e,t){return (e+=this.tokenIndex)<this.tokenCount&&F(this.source,16777215&this.offsetAndType[e-1],16777215&this.offsetAndType[e],t)},getTokenStart:function(e){return e===this.tokenIndex?this.tokenStart:e>0?e<this.tokenCount?16777215&this.offsetAndType[e-1]:16777215&this.offsetAndType[this.tokenCount]:this.firstCharOffset},getRawLength:function(e,t){var n,r=e,i=16777215&this.offsetAndType[Math.max(r-1,0)];e:for(;r<this.tokenCount&&!((n=this.balance[r])<e);r++)switch(t(this.offsetAndType[r]>>24,this.source,i)){case 1:break e;case 2:r++;break e;default:i=16777215&this.offsetAndType[r],this.balance[n]===r&&(r=n);}return r-this.tokenIndex},isBalanceEdge:function(e){return this.balance[this.tokenIndex]<e},isDelim:function(e,t){return t?this.lookupType(t)===j.Delim&&this.source.charCodeAt(this.lookupOffset(t))===e:this.tokenType===j.Delim&&this.source.charCodeAt(this.tokenStart)===e},getTokenValue:function(){return this.source.substring(this.tokenStart,this.tokenEnd)},getTokenLength:function(){return this.tokenEnd-this.tokenStart},substrToCursor:function(e){return this.source.substring(e,this.tokenStart)},skipWS:function(){for(var e=this.tokenIndex,t=0;e<this.tokenCount&&this.offsetAndType[e]>>24===q;e++,t++);t>0&&this.skip(t);},skipSC:function(){for(;this.tokenType===q||this.tokenType===Y;)this.next();},skip:function(e){var t=this.tokenIndex+e;t<this.tokenCount?(this.tokenIndex=t,this.tokenStart=16777215&this.offsetAndType[t-1],t=this.offsetAndType[t],this.tokenType=t>>24,this.tokenEnd=16777215&t):(this.tokenIndex=this.tokenCount,this.next());},next:function(){var e=this.tokenIndex+1;e<this.tokenCount?(this.tokenIndex=e,this.tokenStart=this.tokenEnd,e=this.offsetAndType[e],this.tokenType=e>>24,this.tokenEnd=16777215&e):(this.tokenIndex=this.tokenCount,this.eof=!0,this.tokenType=W,this.tokenStart=this.tokenEnd=this.source.length);},forEachToken(e){for(var t=0,n=this.firstCharOffset;t<this.tokenCount;t++){var r=n,i=this.offsetAndType[t],a=16777215&i;n=a,e(i>>24,r,a,t);}},dump(){var e=new Array(this.tokenCount);return this.forEachToken((t,n,r,i)=>{e[i]={idx:i,type:_[t],chunk:this.source.substring(n,r),balance:this.balance[i]};}),e}};var H=U;function V(e){return e}function K(e,t,n,r){var i,a;switch(e.type){case"Group":i=function(e,t,n,r){var i=" "===e.combinator||r?e.combinator:" "+e.combinator+" ",a=e.terms.map((function(e){return K(e,t,n,r)})).join(i);return (e.explicit||n)&&(a=(r||","===a[0]?"[":"[ ")+a+(r?"]":" ]")),a}(e,t,n,r)+(e.disallowEmpty?"!":"");break;case"Multiplier":return K(e.term,t,n,r)+t(0===(a=e).min&&0===a.max?"*":0===a.min&&1===a.max?"?":1===a.min&&0===a.max?a.comma?"#":"+":1===a.min&&1===a.max?"":(a.comma?"#":"")+(a.min===a.max?"{"+a.min+"}":"{"+a.min+","+(0!==a.max?a.max:"")+"}"),e);case"Type":i="<"+e.name+(e.opts?t(function(e){switch(e.type){case"Range":return " ["+(null===e.min?"-∞":e.min)+","+(null===e.max?"∞":e.max)+"]";default:throw new Error("Unknown node type `"+e.type+"`")}}(e.opts),e.opts):"")+">";break;case"Property":i="<'"+e.name+"'>";break;case"Keyword":i=e.name;break;case"AtKeyword":i="@"+e.name;break;case"Function":i=e.name+"(";break;case"String":case"Token":i=e.value;break;case"Comma":i=",";break;default:throw new Error("Unknown node type `"+e.type+"`")}return t(i,e)}var G=function(e,t){var n=V,r=!1,i=!1;return "function"==typeof t?n=t:t&&(r=Boolean(t.forceBraces),i=Boolean(t.compact),"function"==typeof t.decorate&&(n=t.decorate)),K(e,n,r,i)};const Q={offset:0,line:1,column:1};function X(e,t){const n=e&&e.loc&&e.loc[t];return n?"line"in n?Z(n):n:null}function Z({offset:e,line:t,column:n},r){const i={offset:e,line:t,column:n};if(r){const e=r.split(/\n|\r\n?|\f/);i.offset+=r.length,i.line+=e.length-1,i.column=1===e.length?i.column+r.length:e.pop().length+1;}return i}var $=function(e,t){const n=o("SyntaxReferenceError",e+(t?" `"+t+"`":""));return n.reference=t,n},J=function(e,t,n,r){const i=o("SyntaxMatchError",e),{css:a,mismatchOffset:s,mismatchLength:l,start:c,end:u}=function(e,t){const n=e.tokens,r=e.longestMatch,i=r<n.length&&n[r].node||null,a=i!==t?i:null;let o,s,l=0,c=0,u=0,h="";for(let e=0;e<n.length;e++){const t=n[e].value;e===r&&(c=t.length,l=h.length),null!==a&&n[e].node===a&&(e<=r?u++:u=0),h+=t;}return r===n.length||u>1?(o=X(a||t,"end")||Z(Q,h),s=Z(o)):(o=X(a,"start")||Z(X(t,"start")||Q,h.slice(0,l)),s=X(a,"end")||Z(o,h.substr(l,c))),{css:h,mismatchOffset:l,mismatchLength:c,start:o,end:s}}(r,n);return i.rawMessage=e,i.syntax=t?G(t):"<generic>",i.css=a,i.mismatchOffset=s,i.mismatchLength=l,i.message=e+"\n  syntax: "+i.syntax+"\n   value: "+(a||"<empty string>")+"\n  --------"+new Array(i.mismatchOffset+1).join("-")+"^",Object.assign(i,c),i.loc={source:n&&n.loc&&n.loc.source||"<unknown>",start:c,end:u},i},ee=Object.prototype.hasOwnProperty,te=Object.create(null),ne=Object.create(null);function re(e,t){return t=t||0,e.length-t>=2&&45===e.charCodeAt(t)&&45===e.charCodeAt(t+1)}function ie(e,t){if(t=t||0,e.length-t>=3&&45===e.charCodeAt(t)&&45!==e.charCodeAt(t+1)){var n=e.indexOf("-",t+2);if(-1!==n)return e.substring(t,n+1)}return ""}var ae={keyword:function(e){if(ee.call(te,e))return te[e];var t=e.toLowerCase();if(ee.call(te,t))return te[e]=te[t];var n=re(t,0),r=n?"":ie(t,0);return te[e]=Object.freeze({basename:t.substr(r.length),name:t,vendor:r,prefix:r,custom:n})},property:function(e){if(ee.call(ne,e))return ne[e];var t=e,n=e[0];"/"===n?n="/"===e[1]?"//":"/":"_"!==n&&"*"!==n&&"$"!==n&&"#"!==n&&"+"!==n&&"&"!==n&&(n="");var r=re(t,n.length);if(!r&&(t=t.toLowerCase(),ee.call(ne,t)))return ne[e]=ne[t];var i=r?"":ie(t,n.length),a=t.substr(0,n.length+i.length);return ne[e]=Object.freeze({basename:t.substr(a.length),name:t.substr(n.length),hack:n,vendor:i,prefix:a,custom:r})},isCustomProperty:re,vendorPrefix:ie},oe="undefined"!=typeof Uint32Array?Uint32Array:Array,se=function(e,t){return null===e||e.length<t?new oe(Math.max(t+1024,16384)):e},le=h.TYPE,ce=z.isNewline,ue=z.isName,he=z.isValidEscape,pe=z.isNumberStart,de=z.isIdentifierStart,me=z.charCodeCategory,ge=z.isBOM,fe=M.cmpStr,be=M.getNewlineLength,ye=M.findWhiteSpaceEnd,ke=M.consumeEscaped,ve=M.consumeName,xe=M.consumeNumber,we=M.consumeBadUrlRemnants;function Se(e,t){function n(t){return t<o?e.charCodeAt(t):0}function r(){return h=xe(e,h),de(n(h),n(h+1),n(h+2))?(f=le.Dimension,void(h=ve(e,h))):37===n(h)?(f=le.Percentage,void h++):void(f=le.Number)}function i(){const t=h;return h=ve(e,h),fe(e,t,h,"url")&&40===n(h)?34===n(h=ye(e,h+1))||39===n(h)?(f=le.Function,void(h=t+4)):void function(){for(f=le.Url,h=ye(e,h);h<e.length;h++){var t=e.charCodeAt(h);switch(me(t)){case 41:return void h++;case me.Eof:return;case me.WhiteSpace:return 41===n(h=ye(e,h))||h>=e.length?void(h<e.length&&h++):(h=we(e,h),void(f=le.BadUrl));case 34:case 39:case 40:case me.NonPrintable:return h=we(e,h),void(f=le.BadUrl);case 92:if(he(t,n(h+1))){h=ke(e,h)-1;break}return h=we(e,h),void(f=le.BadUrl)}}}():40===n(h)?(f=le.Function,void h++):void(f=le.Ident)}function a(t){for(t||(t=n(h++)),f=le.String;h<e.length;h++){var r=e.charCodeAt(h);switch(me(r)){case t:return void h++;case me.Eof:return;case me.WhiteSpace:if(ce(r))return h+=be(e,h,r),void(f=le.BadString);break;case 92:if(h===e.length-1)break;var i=n(h+1);ce(i)?h+=be(e,h+1,i):he(r,i)&&(h=ke(e,h)-1);}}}t||(t=new H);for(var o=(e=String(e||"")).length,s=se(t.offsetAndType,o+1),l=se(t.balance,o+1),c=0,u=ge(n(0)),h=u,p=0,d=0,m=0;h<o;){var g=e.charCodeAt(h),f=0;switch(l[c]=o,me(g)){case me.WhiteSpace:f=le.WhiteSpace,h=ye(e,h+1);break;case 34:a();break;case 35:ue(n(h+1))||he(n(h+1),n(h+2))?(f=le.Hash,h=ve(e,h+1)):(f=le.Delim,h++);break;case 39:a();break;case 40:f=le.LeftParenthesis,h++;break;case 41:f=le.RightParenthesis,h++;break;case 43:pe(g,n(h+1),n(h+2))?r():(f=le.Delim,h++);break;case 44:f=le.Comma,h++;break;case 45:pe(g,n(h+1),n(h+2))?r():45===n(h+1)&&62===n(h+2)?(f=le.CDC,h+=3):de(g,n(h+1),n(h+2))?i():(f=le.Delim,h++);break;case 46:pe(g,n(h+1),n(h+2))?r():(f=le.Delim,h++);break;case 47:42===n(h+1)?(f=le.Comment,1===(h=e.indexOf("*/",h+2)+2)&&(h=e.length)):(f=le.Delim,h++);break;case 58:f=le.Colon,h++;break;case 59:f=le.Semicolon,h++;break;case 60:33===n(h+1)&&45===n(h+2)&&45===n(h+3)?(f=le.CDO,h+=4):(f=le.Delim,h++);break;case 64:de(n(h+1),n(h+2),n(h+3))?(f=le.AtKeyword,h=ve(e,h+1)):(f=le.Delim,h++);break;case 91:f=le.LeftSquareBracket,h++;break;case 92:he(g,n(h+1))?i():(f=le.Delim,h++);break;case 93:f=le.RightSquareBracket,h++;break;case 123:f=le.LeftCurlyBracket,h++;break;case 125:f=le.RightCurlyBracket,h++;break;case me.Digit:r();break;case me.NameStart:i();break;case me.Eof:break;default:f=le.Delim,h++;}switch(f){case p:for(p=(d=l[m=16777215&d])>>24,l[c]=m,l[m++]=c;m<c;m++)l[m]===o&&(l[m]=c);break;case le.LeftParenthesis:case le.Function:l[c]=d,d=(p=le.RightParenthesis)<<24|c;break;case le.LeftSquareBracket:l[c]=d,d=(p=le.RightSquareBracket)<<24|c;break;case le.LeftCurlyBracket:l[c]=d,d=(p=le.RightCurlyBracket)<<24|c;}s[c++]=f<<24|h;}for(s[c]=le.EOF<<24|h,l[c]=o,l[o]=o;0!==d;)d=l[m=16777215&d],l[m]=o;return t.source=e,t.firstCharOffset=u,t.offsetAndType=s,t.tokenCount=c,t.balance=l,t.reset(),t.next(),t}Object.keys(h).forEach((function(e){Se[e]=h[e];})),Object.keys(z).forEach((function(e){Se[e]=z[e];})),Object.keys(M).forEach((function(e){Se[e]=M[e];}));var Ce=Se,ze=Ce.isDigit,Ae=Ce.cmpChar,Pe=Ce.TYPE,Te=Pe.Delim,Le=Pe.WhiteSpace,Ee=Pe.Comment,De=Pe.Ident,Oe=Pe.Number,Be=Pe.Dimension;function Ie(e,t){return null!==e&&e.type===Te&&e.value.charCodeAt(0)===t}function Ne(e,t,n){for(;null!==e&&(e.type===Le||e.type===Ee);)e=n(++t);return t}function Re(e,t,n,r){if(!e)return 0;var i=e.value.charCodeAt(t);if(43===i||45===i){if(n)return 0;t++;}for(;t<e.value.length;t++)if(!ze(e.value.charCodeAt(t)))return 0;return r+1}function Me(e,t,n){var r=!1,i=Ne(e,t,n);if(null===(e=n(i)))return t;if(e.type!==Oe){if(!Ie(e,43)&&!Ie(e,45))return t;if(r=!0,i=Ne(n(++i),i,n),null===(e=n(i))&&e.type!==Oe)return 0}if(!r){var a=e.value.charCodeAt(0);if(43!==a&&45!==a)return 0}return Re(e,r?0:1,r,i)}var je=Ce.isHexDigit,_e=Ce.cmpChar,Fe=Ce.TYPE,We=Fe.Ident,qe=Fe.Delim,Ye=Fe.Number,Ue=Fe.Dimension;function He(e,t){return null!==e&&e.type===qe&&e.value.charCodeAt(0)===t}function Ve(e,t){return e.value.charCodeAt(0)===t}function Ke(e,t,n){for(var r=t,i=0;r<e.value.length;r++){var a=e.value.charCodeAt(r);if(45===a&&n&&0!==i)return Ke(e,t+i+1,!1)>0?6:0;if(!je(a))return 0;if(++i>6)return 0}return i}function Ge(e,t,n){if(!e)return 0;for(;He(n(t),63);){if(++e>6)return 0;t++;}return t}var Qe=Ce.isIdentifierStart,Xe=Ce.isHexDigit,Ze=Ce.isDigit,$e=Ce.cmpStr,Je=Ce.consumeNumber,et=Ce.TYPE,tt=["unset","initial","inherit"],nt=["calc(","-moz-calc(","-webkit-calc("];function rt(e,t){return t<e.length?e.charCodeAt(t):0}function it(e,t){return $e(e,0,e.length,t)}function at(e,t){for(var n=0;n<t.length;n++)if(it(e,t[n]))return !0;return !1}function ot(e,t){return t===e.length-2&&(92===e.charCodeAt(t)&&Ze(e.charCodeAt(t+1)))}function st(e,t,n){if(e&&"Range"===e.type){var r=Number(void 0!==n&&n!==t.length?t.substr(0,n):t);if(isNaN(r))return !0;if(null!==e.min&&r<e.min)return !0;if(null!==e.max&&r>e.max)return !0}return !1}function lt(e,t){var n=e.index,r=0;do{if(r++,e.balance<=n)break}while(e=t(r));return r}function ct(e){return function(t,n,r){return null===t?0:t.type===et.Function&&at(t.value,nt)?lt(t,n):e(t,n,r)}}function ut(e){return function(t){return null===t||t.type!==e?0:1}}function ht(e){return function(t,n,r){if(null===t||t.type!==et.Dimension)return 0;var i=Je(t.value,0);if(null!==e){var a=t.value.indexOf("\\",i),o=-1!==a&&ot(t.value,a)?t.value.substring(i,a):t.value.substr(i);if(!1===e.hasOwnProperty(o.toLowerCase()))return 0}return st(r,t.value,i)?0:1}}function pt(e){return "function"!=typeof e&&(e=function(){return 0}),function(t,n,r){return null!==t&&t.type===et.Number&&0===Number(t.value)?1:e(t,n,r)}}var dt,mt={"ident-token":ut(et.Ident),"function-token":ut(et.Function),"at-keyword-token":ut(et.AtKeyword),"hash-token":ut(et.Hash),"string-token":ut(et.String),"bad-string-token":ut(et.BadString),"url-token":ut(et.Url),"bad-url-token":ut(et.BadUrl),"delim-token":ut(et.Delim),"number-token":ut(et.Number),"percentage-token":ut(et.Percentage),"dimension-token":ut(et.Dimension),"whitespace-token":ut(et.WhiteSpace),"CDO-token":ut(et.CDO),"CDC-token":ut(et.CDC),"colon-token":ut(et.Colon),"semicolon-token":ut(et.Semicolon),"comma-token":ut(et.Comma),"[-token":ut(et.LeftSquareBracket),"]-token":ut(et.RightSquareBracket),"(-token":ut(et.LeftParenthesis),")-token":ut(et.RightParenthesis),"{-token":ut(et.LeftCurlyBracket),"}-token":ut(et.RightCurlyBracket),string:ut(et.String),ident:ut(et.Ident),"custom-ident":function(e){if(null===e||e.type!==et.Ident)return 0;var t=e.value.toLowerCase();return at(t,tt)||it(t,"default")?0:1},"custom-property-name":function(e){return null===e||e.type!==et.Ident||45!==rt(e.value,0)||45!==rt(e.value,1)?0:1},"hex-color":function(e){if(null===e||e.type!==et.Hash)return 0;var t=e.value.length;if(4!==t&&5!==t&&7!==t&&9!==t)return 0;for(var n=1;n<t;n++)if(!Xe(e.value.charCodeAt(n)))return 0;return 1},"id-selector":function(e){return null===e||e.type!==et.Hash?0:Qe(rt(e.value,1),rt(e.value,2),rt(e.value,3))?1:0},"an-plus-b":function(e,t){var n=0;if(!e)return 0;if(e.type===Oe)return Re(e,0,!1,n);if(e.type===De&&45===e.value.charCodeAt(0)){if(!Ae(e.value,1,110))return 0;switch(e.value.length){case 2:return Me(t(++n),n,t);case 3:return 45!==e.value.charCodeAt(2)?0:(n=Ne(t(++n),n,t),Re(e=t(n),0,!0,n));default:return 45!==e.value.charCodeAt(2)?0:Re(e,3,!0,n)}}else if(e.type===De||Ie(e,43)&&t(n+1).type===De){if(e.type!==De&&(e=t(++n)),null===e||!Ae(e.value,0,110))return 0;switch(e.value.length){case 1:return Me(t(++n),n,t);case 2:return 45!==e.value.charCodeAt(1)?0:(n=Ne(t(++n),n,t),Re(e=t(n),0,!0,n));default:return 45!==e.value.charCodeAt(1)?0:Re(e,2,!0,n)}}else if(e.type===Be){for(var r=e.value.charCodeAt(0),i=43===r||45===r?1:0,a=i;a<e.value.length&&ze(e.value.charCodeAt(a));a++);return a===i?0:Ae(e.value,a,110)?a+1===e.value.length?Me(t(++n),n,t):45!==e.value.charCodeAt(a+1)?0:a+2===e.value.length?(n=Ne(t(++n),n,t),Re(e=t(n),0,!0,n)):Re(e,a+2,!0,n):0}return 0},urange:function(e,t){var n=0;if(null===e||e.type!==We||!_e(e.value,0,117))return 0;if(null===(e=t(++n)))return 0;if(He(e,43))return null===(e=t(++n))?0:e.type===We?Ge(Ke(e,0,!0),++n,t):He(e,63)?Ge(1,++n,t):0;if(e.type===Ye){if(!Ve(e,43))return 0;var r=Ke(e,1,!0);return 0===r?0:null===(e=t(++n))?n:e.type===Ue||e.type===Ye?Ve(e,45)&&Ke(e,1,!1)?n+1:0:Ge(r,n,t)}return e.type===Ue&&Ve(e,43)?Ge(Ke(e,1,!0),++n,t):0},"declaration-value":function(e,t){if(!e)return 0;var n=0,r=0,i=e.index;e:do{switch(e.type){case et.BadString:case et.BadUrl:break e;case et.RightCurlyBracket:case et.RightParenthesis:case et.RightSquareBracket:if(e.balance>e.index||e.balance<i)break e;r--;break;case et.Semicolon:if(0===r)break e;break;case et.Delim:if("!"===e.value&&0===r)break e;break;case et.Function:case et.LeftParenthesis:case et.LeftSquareBracket:case et.LeftCurlyBracket:r++;}if(n++,e.balance<=i)break}while(e=t(n));return n},"any-value":function(e,t){if(!e)return 0;var n=e.index,r=0;e:do{switch(e.type){case et.BadString:case et.BadUrl:break e;case et.RightCurlyBracket:case et.RightParenthesis:case et.RightSquareBracket:if(e.balance>e.index||e.balance<n)break e}if(r++,e.balance<=n)break}while(e=t(r));return r},dimension:ct(ht(null)),angle:ct(ht({deg:!0,grad:!0,rad:!0,turn:!0})),decibel:ct(ht({db:!0})),frequency:ct(ht({hz:!0,khz:!0})),flex:ct(ht({fr:!0})),length:ct(pt(ht({px:!0,mm:!0,cm:!0,in:!0,pt:!0,pc:!0,q:!0,em:!0,ex:!0,ch:!0,rem:!0,vh:!0,vw:!0,vmin:!0,vmax:!0,vm:!0}))),resolution:ct(ht({dpi:!0,dpcm:!0,dppx:!0,x:!0})),semitones:ct(ht({st:!0})),time:ct(ht({s:!0,ms:!0})),percentage:ct((function(e,t,n){return null===e||e.type!==et.Percentage||st(n,e.value,e.value.length-1)?0:1})),zero:pt(),number:ct((function(e,t,n){if(null===e)return 0;var r=Je(e.value,0);return r===e.value.length||ot(e.value,r)?st(n,e.value,r)?0:1:0})),integer:ct((function(e,t,n){if(null===e||e.type!==et.Number)return 0;for(var r=43===e.value.charCodeAt(0)||45===e.value.charCodeAt(0)?1:0;r<e.value.length;r++)if(!Ze(e.value.charCodeAt(r)))return 0;return st(n,e.value,r)?0:1})),"-ms-legacy-expression":(dt="expression",dt+="(",function(e,t){return null!==e&&it(e.value,dt)?lt(e,t):0})},gt=function(e,t,n){var r=o("SyntaxError",e);return r.input=t,r.offset=n,r.rawMessage=e,r.message=r.rawMessage+"\n  "+r.input+"\n--"+new Array((r.offset||r.input.length)+1).join("-")+"^",r},ft=function(e){this.str=e,this.pos=0;};ft.prototype={charCodeAt:function(e){return e<this.str.length?this.str.charCodeAt(e):0},charCode:function(){return this.charCodeAt(this.pos)},nextCharCode:function(){return this.charCodeAt(this.pos+1)},nextNonWsCode:function(e){return this.charCodeAt(this.findWsEnd(e))},findWsEnd:function(e){for(;e<this.str.length;e++){var t=this.str.charCodeAt(e);if(13!==t&&10!==t&&12!==t&&32!==t&&9!==t)break}return e},substringToPos:function(e){return this.str.substring(this.pos,this.pos=e)},eat:function(e){this.charCode()!==e&&this.error("Expect `"+String.fromCharCode(e)+"`"),this.pos++;},peek:function(){return this.pos<this.str.length?this.str.charAt(this.pos++):""},error:function(e){throw new gt(e,this.str,this.pos)}};var bt=ft,yt=function(e){for(var t="function"==typeof Uint32Array?new Uint32Array(128):new Array(128),n=0;n<128;n++)t[n]=e(String.fromCharCode(n))?1:0;return t}((function(e){return /[a-zA-Z0-9\-]/.test(e)})),kt={" ":1,"&&":2,"||":3,"|":4};function vt(e){return e.substringToPos(e.findWsEnd(e.pos))}function xt(e){for(var t=e.pos;t<e.str.length;t++){var n=e.str.charCodeAt(t);if(n>=128||0===yt[n])break}return e.pos===t&&e.error("Expect a keyword"),e.substringToPos(t)}function wt(e){for(var t=e.pos;t<e.str.length;t++){var n=e.str.charCodeAt(t);if(n<48||n>57)break}return e.pos===t&&e.error("Expect a number"),e.substringToPos(t)}function St(e){var t=e.str.indexOf("'",e.pos+1);return -1===t&&(e.pos=e.str.length,e.error("Expect an apostrophe")),e.substringToPos(t+1)}function Ct(e){var t,n=null;return e.eat(123),t=wt(e),44===e.charCode()?(e.pos++,125!==e.charCode()&&(n=wt(e))):n=t,e.eat(125),{min:Number(t),max:n?Number(n):0}}function zt(e,t){var n=function(e){var t=null,n=!1;switch(e.charCode()){case 42:e.pos++,t={min:0,max:0};break;case 43:e.pos++,t={min:1,max:0};break;case 63:e.pos++,t={min:0,max:1};break;case 35:e.pos++,n=!0,t=123===e.charCode()?Ct(e):{min:1,max:0};break;case 123:t=Ct(e);break;default:return null}return {type:"Multiplier",comma:n,min:t.min,max:t.max,term:null}}(e);return null!==n?(n.term=t,n):t}function At(e){var t=e.peek();return ""===t?null:{type:"Token",value:t}}function Pt(e){var t,n=null;return e.eat(60),t=xt(e),40===e.charCode()&&41===e.nextCharCode()&&(e.pos+=2,t+="()"),91===e.charCodeAt(e.findWsEnd(e.pos))&&(vt(e),n=function(e){var t=null,n=null,r=1;return e.eat(91),45===e.charCode()&&(e.peek(),r=-1),-1==r&&8734===e.charCode()?e.peek():t=r*Number(wt(e)),vt(e),e.eat(44),vt(e),8734===e.charCode()?e.peek():(r=1,45===e.charCode()&&(e.peek(),r=-1),n=r*Number(wt(e))),e.eat(93),null===t&&null===n?null:{type:"Range",min:t,max:n}}(e)),e.eat(62),zt(e,{type:"Type",name:t,opts:n})}function Tt(e,t){function n(e,t){return {type:"Group",terms:e,combinator:t,disallowEmpty:!1,explicit:!1}}for(t=Object.keys(t).sort((function(e,t){return kt[e]-kt[t]}));t.length>0;){for(var r=t.shift(),i=0,a=0;i<e.length;i++){var o=e[i];"Combinator"===o.type&&(o.value===r?(-1===a&&(a=i-1),e.splice(i,1),i--):(-1!==a&&i-a>1&&(e.splice(a,i-a,n(e.slice(a,i),r)),i=a+1),a=-1));}-1!==a&&t.length&&e.splice(a,i-a,n(e.slice(a,i),r));}return r}function Lt(e){for(var t,n=[],r={},i=null,a=e.pos;t=Et(e);)"Spaces"!==t.type&&("Combinator"===t.type?(null!==i&&"Combinator"!==i.type||(e.pos=a,e.error("Unexpected combinator")),r[t.value]=!0):null!==i&&"Combinator"!==i.type&&(r[" "]=!0,n.push({type:"Combinator",value:" "})),n.push(t),i=t,a=e.pos);return null!==i&&"Combinator"===i.type&&(e.pos-=a,e.error("Unexpected combinator")),{type:"Group",terms:n,combinator:Tt(n,r)||" ",disallowEmpty:!1,explicit:!1}}function Et(e){var t=e.charCode();if(t<128&&1===yt[t])return function(e){var t;return t=xt(e),40===e.charCode()?(e.pos++,{type:"Function",name:t}):zt(e,{type:"Keyword",name:t})}(e);switch(t){case 93:break;case 91:return zt(e,function(e){var t;return e.eat(91),t=Lt(e),e.eat(93),t.explicit=!0,33===e.charCode()&&(e.pos++,t.disallowEmpty=!0),t}(e));case 60:return 39===e.nextCharCode()?function(e){var t;return e.eat(60),e.eat(39),t=xt(e),e.eat(39),e.eat(62),zt(e,{type:"Property",name:t})}(e):Pt(e);case 124:return {type:"Combinator",value:e.substringToPos(124===e.nextCharCode()?e.pos+2:e.pos+1)};case 38:return e.pos++,e.eat(38),{type:"Combinator",value:"&&"};case 44:return e.pos++,{type:"Comma"};case 39:return zt(e,{type:"String",value:St(e)});case 32:case 9:case 10:case 13:case 12:return {type:"Spaces",value:vt(e)};case 64:return (t=e.nextCharCode())<128&&1===yt[t]?(e.pos++,{type:"AtKeyword",name:xt(e)}):At(e);case 42:case 43:case 63:case 35:case 33:break;case 123:if((t=e.nextCharCode())<48||t>57)return At(e);break;default:return At(e)}}function Dt(e){var t=new bt(e),n=Lt(t);return t.pos!==e.length&&t.error("Unexpected input"),1===n.terms.length&&"Group"===n.terms[0].type&&(n=n.terms[0]),n}Dt("[a&&<b>#|<'c'>*||e() f{2} /,(% g#{1,2} h{2,})]!");var Ot=Dt,Bt=function(){};function It(e){return "function"==typeof e?e:Bt}var Nt=function(e,t,n){var r=Bt,i=Bt;if("function"==typeof t?r=t:t&&(r=It(t.enter),i=It(t.leave)),r===Bt&&i===Bt)throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function");!function e(t){switch(r.call(n,t),t.type){case"Group":t.terms.forEach(e);break;case"Multiplier":e(t.term);break;case"Type":case"Property":case"Keyword":case"AtKeyword":case"Function":case"String":case"Token":case"Comma":break;default:throw new Error("Unknown type: "+t.type)}i.call(n,t);}(e);},Rt=new H,Mt={decorator:function(e){var t=null,n={len:0,node:null},r=[n],i="";return {children:e.children,node:function(n){var r=t;t=n,e.node.call(this,n),t=r;},chunk:function(e){i+=e,n.node!==t?r.push({len:e.length,node:t}):n.len+=e.length;},result:function(){return jt(i,r)}}}};function jt(e,t){var n=[],r=0,i=0,a=t?t[i].node:null;for(Ce(e,Rt);!Rt.eof;){if(t)for(;i<t.length&&r+t[i].len<=Rt.tokenStart;)r+=t[i++].len,a=t[i].node;n.push({type:Rt.tokenType,value:Rt.getTokenValue(),index:Rt.tokenIndex,balance:Rt.balance[Rt.tokenIndex],node:a}),Rt.next();}return n}var _t={type:"Match"},Ft={type:"Mismatch"},Wt={type:"DisallowEmpty"};function qt(e,t,n){return t===_t&&n===Ft||e===_t&&t===_t&&n===_t?e:("If"===e.type&&e.else===Ft&&t===_t&&(t=e.then,e=e.match),{type:"If",match:e,then:t,else:n})}function Yt(e){return e.length>2&&40===e.charCodeAt(e.length-2)&&41===e.charCodeAt(e.length-1)}function Ut(e){return "Keyword"===e.type||"AtKeyword"===e.type||"Function"===e.type||"Type"===e.type&&Yt(e.name)}function Ht(e){if("function"==typeof e)return {type:"Generic",fn:e};switch(e.type){case"Group":var t=function e(t,n,r){switch(t){case" ":for(var i=_t,a=n.length-1;a>=0;a--){i=qt(l=n[a],i,Ft);}return i;case"|":i=Ft;var o=null;for(a=n.length-1;a>=0;a--){if(Ut(l=n[a])&&(null===o&&a>0&&Ut(n[a-1])&&(i=qt({type:"Enum",map:o=Object.create(null)},_t,i)),null!==o)){var s=(Yt(l.name)?l.name.slice(0,-1):l.name).toLowerCase();if(s in o==!1){o[s]=l;continue}}o=null,i=qt(l,_t,i);}return i;case"&&":if(n.length>5)return {type:"MatchOnce",terms:n,all:!0};for(i=Ft,a=n.length-1;a>=0;a--){var l=n[a];c=n.length>1?e(t,n.filter((function(e){return e!==l})),!1):_t,i=qt(l,c,i);}return i;case"||":if(n.length>5)return {type:"MatchOnce",terms:n,all:!1};for(i=r?_t:Ft,a=n.length-1;a>=0;a--){var c;l=n[a];c=n.length>1?e(t,n.filter((function(e){return e!==l})),!0):_t,i=qt(l,c,i);}return i}}(e.combinator,e.terms.map(Ht),!1);return e.disallowEmpty&&(t=qt(t,Wt,Ft)),t;case"Multiplier":return function(e){var t=_t,n=Ht(e.term);if(0===e.max)n=qt(n,Wt,Ft),(t=qt(n,null,Ft)).then=qt(_t,_t,t),e.comma&&(t.then.else=qt({type:"Comma",syntax:e},t,Ft));else for(var r=e.min||1;r<=e.max;r++)e.comma&&t!==_t&&(t=qt({type:"Comma",syntax:e},t,Ft)),t=qt(n,qt(_t,_t,t),Ft);if(0===e.min)t=qt(_t,_t,t);else for(r=0;r<e.min-1;r++)e.comma&&t!==_t&&(t=qt({type:"Comma",syntax:e},t,Ft)),t=qt(n,t,Ft);return t}(e);case"Type":case"Property":return {type:e.type,name:e.name,syntax:e};case"Keyword":return {type:e.type,name:e.name.toLowerCase(),syntax:e};case"AtKeyword":return {type:e.type,name:"@"+e.name.toLowerCase(),syntax:e};case"Function":return {type:e.type,name:e.name.toLowerCase()+"(",syntax:e};case"String":return 3===e.value.length?{type:"Token",value:e.value.charAt(1),syntax:e}:{type:e.type,value:e.value.substr(1,e.value.length-2).replace(/\\'/g,"'"),syntax:e};case"Token":return {type:e.type,value:e.value,syntax:e};case"Comma":return {type:e.type,syntax:e};default:throw new Error("Unknown node type:",e.type)}}var Vt=_t,Kt=Ft,Gt=Wt,Qt=function(e,t){return "string"==typeof e&&(e=Ot(e)),{type:"MatchGraph",match:Ht(e),syntax:t||null,source:e}},Xt=Object.prototype.hasOwnProperty,Zt=Vt,$t=Kt,Jt=Gt,en=h.TYPE;function tn(e){for(var t=null,n=null,r=e;null!==r;)n=r.prev,r.prev=t,t=r,r=n;return t}function nn(e,t){if(e.length!==t.length)return !1;for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r>=65&&r<=90&&(r|=32),r!==t.charCodeAt(n))return !1}return !0}function rn(e){return null===e||(e.type===en.Comma||e.type===en.Function||e.type===en.LeftParenthesis||e.type===en.LeftSquareBracket||e.type===en.LeftCurlyBracket||function(e){return e.type===en.Delim&&"?"!==e.value}(e))}function an(e){return null===e||(e.type===en.RightParenthesis||e.type===en.RightSquareBracket||e.type===en.RightCurlyBracket||e.type===en.Delim)}function on(e,t,n){function r(){do{b++,f=b<e.length?e[b]:null;}while(null!==f&&(f.type===en.WhiteSpace||f.type===en.Comment))}function i(t){var n=b+t;return n<e.length?e[n]:null}function a(e,t){return {nextState:e,matchStack:k,syntaxStack:u,thenStack:h,tokenIndex:b,prev:t}}function o(e){h={nextState:e,matchStack:k,syntaxStack:u,prev:h};}function s(e){p=a(e,p);}function l(){k={type:1,syntax:t.syntax,token:f,prev:k},r(),d=null,b>y&&(y=b);}function c(){k=2===k.type?k.prev:{type:3,syntax:u.syntax,token:k.token,prev:k},u=u.prev;}var u=null,h=null,p=null,d=null,m=0,g=null,f=null,b=-1,y=0,k={type:0,syntax:null,token:null,prev:null};for(r();null===g&&++m<15e3;)switch(t.type){case"Match":if(null===h){if(null!==f&&(b!==e.length-1||"\\0"!==f.value&&"\\9"!==f.value)){t=$t;break}g="Match";break}if((t=h.nextState)===Jt){if(h.matchStack===k){t=$t;break}t=Zt;}for(;h.syntaxStack!==u;)c();h=h.prev;break;case"Mismatch":if(null!==d&&!1!==d)(null===p||b>p.tokenIndex)&&(p=d,d=!1);else if(null===p){g="Mismatch";break}t=p.nextState,h=p.thenStack,u=p.syntaxStack,k=p.matchStack,b=p.tokenIndex,f=b<e.length?e[b]:null,p=p.prev;break;case"MatchGraph":t=t.match;break;case"If":t.else!==$t&&s(t.else),t.then!==Zt&&o(t.then),t=t.match;break;case"MatchOnce":t={type:"MatchOnceBuffer",syntax:t,index:0,mask:0};break;case"MatchOnceBuffer":var v=t.syntax.terms;if(t.index===v.length){if(0===t.mask||t.syntax.all){t=$t;break}t=Zt;break}if(t.mask===(1<<v.length)-1){t=Zt;break}for(;t.index<v.length;t.index++){var x=1<<t.index;if(0==(t.mask&x)){s(t),o({type:"AddMatchOnce",syntax:t.syntax,mask:t.mask|x}),t=v[t.index++];break}}break;case"AddMatchOnce":t={type:"MatchOnceBuffer",syntax:t.syntax,index:0,mask:t.mask};break;case"Enum":if(null!==f)if(-1!==(A=f.value.toLowerCase()).indexOf("\\")&&(A=A.replace(/\\[09].*$/,"")),Xt.call(t.map,A)){t=t.map[A];break}t=$t;break;case"Generic":var w=null!==u?u.opts:null,S=b+Math.floor(t.fn(f,i,w));if(!isNaN(S)&&S>b){for(;b<S;)l();t=Zt;}else t=$t;break;case"Type":case"Property":var C="Type"===t.type?"types":"properties",z=Xt.call(n,C)?n[C][t.name]:null;if(!z||!z.match)throw new Error("Bad syntax reference: "+("Type"===t.type?"<"+t.name+">":"<'"+t.name+"'>"));if(!1!==d&&null!==f&&"Type"===t.type)if("custom-ident"===t.name&&f.type===en.Ident||"length"===t.name&&"0"===f.value){null===d&&(d=a(t,p)),t=$t;break}u={syntax:t.syntax,opts:t.syntax.opts||null!==u&&u.opts||null,prev:u},k={type:2,syntax:t.syntax,token:k.token,prev:k},t=z.match;break;case"Keyword":var A=t.name;if(null!==f){var P=f.value;if(-1!==P.indexOf("\\")&&(P=P.replace(/\\[09].*$/,"")),nn(P,A)){l(),t=Zt;break}}t=$t;break;case"AtKeyword":case"Function":if(null!==f&&nn(f.value,t.name)){l(),t=Zt;break}t=$t;break;case"Token":if(null!==f&&f.value===t.value){l(),t=Zt;break}t=$t;break;case"Comma":null!==f&&f.type===en.Comma?rn(k.token)?t=$t:(l(),t=an(f)?$t:Zt):t=rn(k.token)||an(f)?Zt:$t;break;case"String":var T="";for(S=b;S<e.length&&T.length<t.value.length;S++)T+=e[S].value;if(nn(T,t.value)){for(;b<S;)l();t=Zt;}else t=$t;break;default:throw new Error("Unknown node type: "+t.type)}switch(g){case null:console.warn("[csstree-match] BREAK after 15000 iterations"),g="Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)",k=null;break;case"Match":for(;null!==u;)c();break;default:k=null;}return {tokens:e,reason:g,iterations:m,match:k,longestMatch:y}}var sn=function(e,t,n){var r=on(e,t,n||{});if(null===r.match)return r;var i=r.match,a=r.match={syntax:t.syntax||null,match:[]},o=[a];for(i=tn(i).prev;null!==i;){switch(i.type){case 2:a.match.push(a={syntax:i.syntax,match:[]}),o.push(a);break;case 3:o.pop(),a=o[o.length-1];break;default:a.match.push({syntax:i.syntax||null,token:i.token.value,node:i.token.node});}i=i.prev;}return r};function ln(e){function t(e){return null!==e&&("Type"===e.type||"Property"===e.type||"Keyword"===e.type)}var n=null;return null!==this.matched&&function r(i){if(Array.isArray(i.match)){for(var a=0;a<i.match.length;a++)if(r(i.match[a]))return t(i.syntax)&&n.unshift(i.syntax),!0}else if(i.node===e)return n=t(i.syntax)?[i.syntax]:[],!0;return !1}(this.matched),n}function cn(e,t,n){var r=ln.call(e,t);return null!==r&&r.some(n)}var un={getTrace:ln,isType:function(e,t){return cn(this,e,(function(e){return "Type"===e.type&&e.name===t}))},isProperty:function(e,t){return cn(this,e,(function(e){return "Property"===e.type&&e.name===t}))},isKeyword:function(e){return cn(this,e,(function(e){return "Keyword"===e.type}))}};var hn={matchFragments:function(e,t,n,r,i){var o=[];return null!==n.matched&&function n(s){if(null!==s.syntax&&s.syntax.type===r&&s.syntax.name===i){var l=function e(t){return "node"in t?t.node:e(t.match[0])}(s),c=function e(t){return "node"in t?t.node:e(t.match[t.match.length-1])}(s);e.syntax.walk(t,(function(e,t,n){if(e===l){var r=new a;do{if(r.appendData(t.data),t.data===c)break;t=t.next;}while(null!==t);o.push({parent:n,nodes:r});}}));}Array.isArray(s.match)&&s.match.forEach(n);}(n.matched),o}},pn=Object.prototype.hasOwnProperty;function dn(e){return "number"==typeof e&&isFinite(e)&&Math.floor(e)===e&&e>=0}function mn(e){return Boolean(e)&&dn(e.offset)&&dn(e.line)&&dn(e.column)}function gn(e,t){return function(n,r){if(!n||n.constructor!==Object)return r(n,"Type of node should be an Object");for(var i in n){var o=!0;if(!1!==pn.call(n,i)){if("type"===i)n.type!==e&&r(n,"Wrong node type `"+n.type+"`, expected `"+e+"`");else if("loc"===i){if(null===n.loc)continue;if(n.loc&&n.loc.constructor===Object)if("string"!=typeof n.loc.source)i+=".source";else if(mn(n.loc.start)){if(mn(n.loc.end))continue;i+=".end";}else i+=".start";o=!1;}else if(t.hasOwnProperty(i)){var s=0;for(o=!1;!o&&s<t[i].length;s++){var l=t[i][s];switch(l){case String:o="string"==typeof n[i];break;case Boolean:o="boolean"==typeof n[i];break;case null:o=null===n[i];break;default:"string"==typeof l?o=n[i]&&n[i].type===l:Array.isArray(l)&&(o=n[i]instanceof a);}}}else r(n,"Unknown field `"+i+"` for "+e+" node type");o||r(n,"Bad value for `"+e+"."+i+"`");}}for(var i in t)pn.call(t,i)&&!1===pn.call(n,i)&&r(n,"Field `"+e+"."+i+"` is missed");}}function fn(e,t){var n=t.structure,r={type:String,loc:!0},i={type:'"'+e+'"'};for(var a in n)if(!1!==pn.call(n,a)){for(var o=[],s=r[a]=Array.isArray(n[a])?n[a].slice():[n[a]],l=0;l<s.length;l++){var c=s[l];if(c===String||c===Boolean)o.push(c.name);else if(null===c)o.push("null");else if("string"==typeof c)o.push("<"+c+">");else {if(!Array.isArray(c))throw new Error("Wrong value `"+c+"` in `"+e+"."+a+"` structure definition");o.push("List");}}i[a]=o.join(" | ");}return {docs:i,check:gn(e,r)}}var bn=$,yn=J,kn=Qt,vn=sn,xn=function(e){var t={};if(e.node)for(var n in e.node)if(pn.call(e.node,n)){var r=e.node[n];if(!r.structure)throw new Error("Missed `structure` field in `"+n+"` node type definition");t[n]=fn(n,r);}return t},wn=kn("inherit | initial | unset"),Sn=kn("inherit | initial | unset | <-ms-legacy-expression>");function Cn(e,t,n){var r={};for(var i in e)e[i].syntax&&(r[i]=n?e[i].syntax:G(e[i].syntax,{compact:t}));return r}function zn(e,t,n){const r={};for(const[i,a]of Object.entries(e))r[i]={prelude:a.prelude&&(n?a.prelude.syntax:G(a.prelude.syntax,{compact:t})),descriptors:a.descriptors&&Cn(a.descriptors,t,n)};return r}function An(e,t,n){return {matched:e,iterations:n,error:t,getTrace:un.getTrace,isType:un.isType,isProperty:un.isProperty,isKeyword:un.isKeyword}}function Pn(e,t,n,r){var i,a=function(e,t){return "string"==typeof e?jt(e,null):t.generate(e,Mt)}(n,e.syntax);return function(e){for(var t=0;t<e.length;t++)if("var("===e[t].value.toLowerCase())return !0;return !1}(a)?An(null,new Error("Matching for a tree with var() is not supported")):(r&&(i=vn(a,e.valueCommonSyntax,e)),r&&i.match||(i=vn(a,t.match,e)).match?An(i.match,null,i.iterations):An(null,new yn(i.reason,t.syntax,n,i),i.iterations))}var Tn=function(e,t,n){if(this.valueCommonSyntax=wn,this.syntax=t,this.generic=!1,this.atrules={},this.properties={},this.types={},this.structure=n||xn(e),e){if(e.types)for(var r in e.types)this.addType_(r,e.types[r]);if(e.generic)for(var r in this.generic=!0,mt)this.addType_(r,mt[r]);if(e.atrules)for(var r in e.atrules)this.addAtrule_(r,e.atrules[r]);if(e.properties)for(var r in e.properties)this.addProperty_(r,e.properties[r]);}};Tn.prototype={structure:{},checkStructure:function(e){function t(e,t){r.push({node:e,message:t});}var n=this.structure,r=[];return this.syntax.walk(e,(function(e){n.hasOwnProperty(e.type)?n[e.type].check(e,t):t(e,"Unknown node type `"+e.type+"`");})),!!r.length&&r},createDescriptor:function(e,t,n,r=null){var i={type:t,name:n},a={type:t,name:n,parent:r,syntax:null,match:null};return "function"==typeof e?a.match=kn(e,i):("string"==typeof e?Object.defineProperty(a,"syntax",{get:function(){return Object.defineProperty(a,"syntax",{value:Ot(e)}),a.syntax}}):a.syntax=e,Object.defineProperty(a,"match",{get:function(){return Object.defineProperty(a,"match",{value:kn(a.syntax,i)}),a.match}})),a},addAtrule_:function(e,t){t&&(this.atrules[e]={type:"Atrule",name:e,prelude:t.prelude?this.createDescriptor(t.prelude,"AtrulePrelude",e):null,descriptors:t.descriptors?Object.keys(t.descriptors).reduce((n,r)=>(n[r]=this.createDescriptor(t.descriptors[r],"AtruleDescriptor",r,e),n),{}):null});},addProperty_:function(e,t){t&&(this.properties[e]=this.createDescriptor(t,"Property",e));},addType_:function(e,t){t&&(this.types[e]=this.createDescriptor(t,"Type",e),t===mt["-ms-legacy-expression"]&&(this.valueCommonSyntax=Sn));},checkAtruleName:function(e){if(!this.getAtrule(e))return new bn("Unknown at-rule","@"+e)},checkAtrulePrelude:function(e,t){let n=this.checkAtruleName(e);if(n)return n;var r=this.getAtrule(e);return !r.prelude&&t?new SyntaxError("At-rule `@"+e+"` should not contain a prelude"):r.prelude&&!t?new SyntaxError("At-rule `@"+e+"` should contain a prelude"):void 0},checkAtruleDescriptorName:function(e,t){let n=this.checkAtruleName(e);if(n)return n;var r=this.getAtrule(e),i=ae.keyword(t);return r.descriptors?r.descriptors[i.name]||r.descriptors[i.basename]?void 0:new bn("Unknown at-rule descriptor",t):new SyntaxError("At-rule `@"+e+"` has no known descriptors")},checkPropertyName:function(e){return ae.property(e).custom?new Error("Lexer matching doesn't applicable for custom properties"):this.getProperty(e)?void 0:new bn("Unknown property",e)},matchAtrulePrelude:function(e,t){var n=this.checkAtrulePrelude(e,t);return n?An(null,n):t?Pn(this,this.getAtrule(e).prelude,t,!0):An(null,null)},matchAtruleDescriptor:function(e,t,n){var r=this.checkAtruleDescriptorName(e,t);if(r)return An(null,r);var i=this.getAtrule(e),a=ae.keyword(t);return Pn(this,i.descriptors[a.name]||i.descriptors[a.basename],n,!0)},matchDeclaration:function(e){return "Declaration"!==e.type?An(null,new Error("Not a Declaration node")):this.matchProperty(e.property,e.value)},matchProperty:function(e,t){var n=this.checkPropertyName(e);return n?An(null,n):Pn(this,this.getProperty(e),t,!0)},matchType:function(e,t){var n=this.getType(e);return n?Pn(this,n,t,!1):An(null,new bn("Unknown type",e))},match:function(e,t){return "string"==typeof e||e&&e.type?("string"!=typeof e&&e.match||(e=this.createDescriptor(e,"Type","anonymous")),Pn(this,e,t,!1)):An(null,new bn("Bad syntax"))},findValueFragments:function(e,t,n,r){return hn.matchFragments(this,t,this.matchProperty(e,t),n,r)},findDeclarationValueFragments:function(e,t,n){return hn.matchFragments(this,e.value,this.matchDeclaration(e),t,n)},findAllFragments:function(e,t,n){var r=[];return this.syntax.walk(e,{visit:"Declaration",enter:function(e){r.push.apply(r,this.findDeclarationValueFragments(e,t,n));}.bind(this)}),r},getAtrule:function(e,t=!0){var n=ae.keyword(e);return (n.vendor&&t?this.atrules[n.name]||this.atrules[n.basename]:this.atrules[n.name])||null},getAtrulePrelude:function(e,t=!0){const n=this.getAtrule(e,t);return n&&n.prelude||null},getAtruleDescriptor:function(e,t){return this.atrules.hasOwnProperty(e)&&this.atrules.declarators&&this.atrules[e].declarators[t]||null},getProperty:function(e,t=!0){var n=ae.property(e);return (n.vendor&&t?this.properties[n.name]||this.properties[n.basename]:this.properties[n.name])||null},getType:function(e){return this.types.hasOwnProperty(e)?this.types[e]:null},validate:function(){function e(r,i,a,o){if(a.hasOwnProperty(i))return a[i];a[i]=!1,null!==o.syntax&&Nt(o.syntax,(function(o){if("Type"===o.type||"Property"===o.type){var s="Type"===o.type?r.types:r.properties,l="Type"===o.type?t:n;s.hasOwnProperty(o.name)&&!e(r,o.name,l,s[o.name])||(a[i]=!0);}}),this);}var t={},n={};for(var r in this.types)e(this,r,t,this.types[r]);for(var r in this.properties)e(this,r,n,this.properties[r]);return t=Object.keys(t).filter((function(e){return t[e]})),n=Object.keys(n).filter((function(e){return n[e]})),t.length||n.length?{types:t,properties:n}:null},dump:function(e,t){return {generic:this.generic,types:Cn(this.types,!t,e),properties:Cn(this.properties,!t,e),atrules:zn(this.atrules,!t,e)}},toString:function(){return JSON.stringify(this.dump())}};var Ln=Tn,En={SyntaxError:gt,parse:Ot,generate:G,walk:Nt},Dn=Ce.isBOM;var On=function(){this.lines=null,this.columns=null,this.linesAndColumnsComputed=!1;};On.prototype={setSource:function(e,t,n,r){this.source=e,this.startOffset=void 0===t?0:t,this.startLine=void 0===n?1:n,this.startColumn=void 0===r?1:r,this.linesAndColumnsComputed=!1;},ensureLinesAndColumnsComputed:function(){this.linesAndColumnsComputed||(!function(e,t){for(var n=t.length,r=se(e.lines,n),i=e.startLine,a=se(e.columns,n),o=e.startColumn,s=t.length>0?Dn(t.charCodeAt(0)):0;s<n;s++){var l=t.charCodeAt(s);r[s]=i,a[s]=o++,10!==l&&13!==l&&12!==l||(13===l&&s+1<n&&10===t.charCodeAt(s+1)&&(r[++s]=i,a[s]=o),i++,o=1);}r[s]=i,a[s]=o,e.lines=r,e.columns=a;}(this,this.source),this.linesAndColumnsComputed=!0);},getLocation:function(e,t){return this.ensureLinesAndColumnsComputed(),{source:t,offset:this.startOffset+e,line:this.lines[e],column:this.columns[e]}},getLocationRange:function(e,t,n){return this.ensureLinesAndColumnsComputed(),{source:n,start:{offset:this.startOffset+e,line:this.lines[e],column:this.columns[e]},end:{offset:this.startOffset+t,line:this.lines[t],column:this.columns[t]}}}};var Bn=On,In=Ce.TYPE,Nn=In.WhiteSpace,Rn=In.Comment,Mn=function(e){var t=this.createList(),n=null,r={recognizer:e,space:null,ignoreWS:!1,ignoreWSAfter:!1};for(this.scanner.skipSC();!this.scanner.eof;){switch(this.scanner.tokenType){case Rn:this.scanner.next();continue;case Nn:r.ignoreWS?this.scanner.next():r.space=this.WhiteSpace();continue}if(void 0===(n=e.getNode.call(this,r)))break;null!==r.space&&(t.push(r.space),r.space=null),t.push(n),r.ignoreWSAfter?(r.ignoreWSAfter=!1,r.ignoreWS=!0):r.ignoreWS=!1;}return t},{findWhiteSpaceStart:jn,cmpStr:_n}=M,Fn=function(){},Wn=h.TYPE,qn=h.NAME,Yn=Wn.WhiteSpace,Un=Wn.Comment,Hn=Wn.Ident,Vn=Wn.Function,Kn=Wn.Url,Gn=Wn.Hash,Qn=Wn.Percentage,Xn=Wn.Number;function Zn(e){return function(){return this[e]()}}var $n=function(e){var t={scanner:new H,locationMap:new Bn,filename:"<unknown>",needPositions:!1,onParseError:Fn,onParseErrorThrow:!1,parseAtrulePrelude:!0,parseRulePrelude:!0,parseValue:!0,parseCustomProperty:!1,readSequence:Mn,createList:function(){return new a},createSingleNodeList:function(e){return (new a).appendData(e)},getFirstListNode:function(e){return e&&e.first()},getLastListNode:function(e){return e.last()},parseWithFallback:function(e,t){var n=this.scanner.tokenIndex;try{return e.call(this)}catch(e){if(this.onParseErrorThrow)throw e;var r=t.call(this,n);return this.onParseErrorThrow=!0,this.onParseError(e,r),this.onParseErrorThrow=!1,r}},lookupNonWSType:function(e){do{var t=this.scanner.lookupType(e++);if(t!==Yn)return t}while(0!==t);return 0},eat:function(e){if(this.scanner.tokenType!==e){var t=this.scanner.tokenStart,n=qn[e]+" is expected";switch(e){case Hn:this.scanner.tokenType===Vn||this.scanner.tokenType===Kn?(t=this.scanner.tokenEnd-1,n="Identifier is expected but function found"):n="Identifier is expected";break;case Gn:this.scanner.isDelim(35)&&(this.scanner.next(),t++,n="Name is expected");break;case Qn:this.scanner.tokenType===Xn&&(t=this.scanner.tokenEnd,n="Percent sign is expected");break;default:this.scanner.source.charCodeAt(this.scanner.tokenStart)===e&&(t+=1);}this.error(n,t);}this.scanner.next();},consume:function(e){var t=this.scanner.getTokenValue();return this.eat(e),t},consumeFunctionName:function(){var e=this.scanner.source.substring(this.scanner.tokenStart,this.scanner.tokenEnd-1);return this.eat(Vn),e},getLocation:function(e,t){return this.needPositions?this.locationMap.getLocationRange(e,t,this.filename):null},getLocationFromList:function(e){if(this.needPositions){var t=this.getFirstListNode(e),n=this.getLastListNode(e);return this.locationMap.getLocationRange(null!==t?t.loc.start.offset-this.locationMap.startOffset:this.scanner.tokenStart,null!==n?n.loc.end.offset-this.locationMap.startOffset:this.scanner.tokenStart,this.filename)}return null},error:function(e,t){var n=void 0!==t&&t<this.scanner.source.length?this.locationMap.getLocation(t):this.scanner.eof?this.locationMap.getLocation(jn(this.scanner.source,this.scanner.source.length-1)):this.locationMap.getLocation(this.scanner.tokenStart);throw new l(e||"Unexpected input",this.scanner.source,n.offset,n.line,n.column)}};for(var n in e=function(e){var t={context:{},scope:{},atrule:{},pseudo:{}};if(e.parseContext)for(var n in e.parseContext)switch(typeof e.parseContext[n]){case"function":t.context[n]=e.parseContext[n];break;case"string":t.context[n]=Zn(e.parseContext[n]);}if(e.scope)for(var n in e.scope)t.scope[n]=e.scope[n];if(e.atrule)for(var n in e.atrule){var r=e.atrule[n];r.parse&&(t.atrule[n]=r.parse);}if(e.pseudo)for(var n in e.pseudo){var i=e.pseudo[n];i.parse&&(t.pseudo[n]=i.parse);}if(e.node)for(var n in e.node)t[n]=e.node[n].parse;return t}(e||{}))t[n]=e[n];return function(e,n){var r,i=(n=n||{}).context||"default",a=n.onComment;if(Ce(e,t.scanner),t.locationMap.setSource(e,n.offset,n.line,n.column),t.filename=n.filename||"<unknown>",t.needPositions=Boolean(n.positions),t.onParseError="function"==typeof n.onParseError?n.onParseError:Fn,t.onParseErrorThrow=!1,t.parseAtrulePrelude=!("parseAtrulePrelude"in n)||Boolean(n.parseAtrulePrelude),t.parseRulePrelude=!("parseRulePrelude"in n)||Boolean(n.parseRulePrelude),t.parseValue=!("parseValue"in n)||Boolean(n.parseValue),t.parseCustomProperty="parseCustomProperty"in n&&Boolean(n.parseCustomProperty),!t.context.hasOwnProperty(i))throw new Error("Unknown context `"+i+"`");return "function"==typeof a&&t.scanner.forEachToken((n,r,i)=>{if(n===Un){const n=t.getLocation(r,i),o=_n(e,i-2,i,"*/")?e.slice(r+2,i-2):e.slice(r+2,i);a(o,n);}}),r=t.context[i].call(t,n),t.scanner.eof||t.error(),r}},Jn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),er=function(e){if(0<=e&&e<Jn.length)return Jn[e];throw new TypeError("Must be between 0 and 63: "+e)};var tr=function(e){var t,n="",r=function(e){return e<0?1+(-e<<1):0+(e<<1)}(e);do{t=31&r,(r>>>=5)>0&&(t|=32),n+=er(t);}while(r>0);return n};var nr=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e,t){t.getArg=function(e,t,n){if(t in e)return e[t];if(3===arguments.length)return n;throw new Error('"'+t+'" is a required argument.')};var n=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,r=/^data:.+\,.+$/;function i(e){var t=e.match(n);return t?{scheme:t[1],auth:t[2],host:t[3],port:t[4],path:t[5]}:null}function a(e){var t="";return e.scheme&&(t+=e.scheme+":"),t+="//",e.auth&&(t+=e.auth+"@"),e.host&&(t+=e.host),e.port&&(t+=":"+e.port),e.path&&(t+=e.path),t}function o(e){var n=e,r=i(e);if(r){if(!r.path)return e;n=r.path;}for(var o,s=t.isAbsolute(n),l=n.split(/\/+/),c=0,u=l.length-1;u>=0;u--)"."===(o=l[u])?l.splice(u,1):".."===o?c++:c>0&&(""===o?(l.splice(u+1,c),c=0):(l.splice(u,2),c--));return ""===(n=l.join("/"))&&(n=s?"/":"."),r?(r.path=n,a(r)):n}function s(e,t){""===e&&(e="."),""===t&&(t=".");var n=i(t),s=i(e);if(s&&(e=s.path||"/"),n&&!n.scheme)return s&&(n.scheme=s.scheme),a(n);if(n||t.match(r))return t;if(s&&!s.host&&!s.path)return s.host=t,a(s);var l="/"===t.charAt(0)?t:o(e.replace(/\/+$/,"")+"/"+t);return s?(s.path=l,a(s)):l}t.urlParse=i,t.urlGenerate=a,t.normalize=o,t.join=s,t.isAbsolute=function(e){return "/"===e.charAt(0)||n.test(e)},t.relative=function(e,t){""===e&&(e="."),e=e.replace(/\/$/,"");for(var n=0;0!==t.indexOf(e+"/");){var r=e.lastIndexOf("/");if(r<0)return t;if((e=e.slice(0,r)).match(/^([^\/]+:\/)?\/*$/))return t;++n;}return Array(n+1).join("../")+t.substr(e.length+1)};var l=!("__proto__"in Object.create(null));function c(e){return e}function u(e){if(!e)return !1;var t=e.length;if(t<9)return !1;if(95!==e.charCodeAt(t-1)||95!==e.charCodeAt(t-2)||111!==e.charCodeAt(t-3)||116!==e.charCodeAt(t-4)||111!==e.charCodeAt(t-5)||114!==e.charCodeAt(t-6)||112!==e.charCodeAt(t-7)||95!==e.charCodeAt(t-8)||95!==e.charCodeAt(t-9))return !1;for(var n=t-10;n>=0;n--)if(36!==e.charCodeAt(n))return !1;return !0}function h(e,t){return e===t?0:null===e?1:null===t?-1:e>t?1:-1}t.toSetString=l?c:function(e){return u(e)?"$"+e:e},t.fromSetString=l?c:function(e){return u(e)?e.slice(1):e},t.compareByOriginalPositions=function(e,t,n){var r=h(e.source,t.source);return 0!==r||0!==(r=e.originalLine-t.originalLine)||0!==(r=e.originalColumn-t.originalColumn)||n||0!==(r=e.generatedColumn-t.generatedColumn)||0!==(r=e.generatedLine-t.generatedLine)?r:h(e.name,t.name)},t.compareByGeneratedPositionsDeflated=function(e,t,n){var r=e.generatedLine-t.generatedLine;return 0!==r||0!==(r=e.generatedColumn-t.generatedColumn)||n||0!==(r=h(e.source,t.source))||0!==(r=e.originalLine-t.originalLine)||0!==(r=e.originalColumn-t.originalColumn)?r:h(e.name,t.name)},t.compareByGeneratedPositionsInflated=function(e,t){var n=e.generatedLine-t.generatedLine;return 0!==n||0!==(n=e.generatedColumn-t.generatedColumn)||0!==(n=h(e.source,t.source))||0!==(n=e.originalLine-t.originalLine)||0!==(n=e.originalColumn-t.originalColumn)?n:h(e.name,t.name)},t.parseSourceMapInput=function(e){return JSON.parse(e.replace(/^\)]}'[^\n]*\n/,""))},t.computeSourceURL=function(e,t,n){if(t=t||"",e&&("/"!==e[e.length-1]&&"/"!==t[0]&&(e+="/"),t=e+t),n){var r=i(n);if(!r)throw new Error("sourceMapURL could not be parsed");if(r.path){var l=r.path.lastIndexOf("/");l>=0&&(r.path=r.path.substring(0,l+1));}t=s(a(r),t);}return o(t)};})),rr=(nr.getArg,nr.urlParse,nr.urlGenerate,nr.normalize,nr.join,nr.isAbsolute,nr.relative,nr.toSetString,nr.fromSetString,nr.compareByOriginalPositions,nr.compareByGeneratedPositionsDeflated,nr.compareByGeneratedPositionsInflated,nr.parseSourceMapInput,nr.computeSourceURL,Object.prototype.hasOwnProperty),ir="undefined"!=typeof Map;function ar(){this._array=[],this._set=ir?new Map:Object.create(null);}ar.fromArray=function(e,t){for(var n=new ar,r=0,i=e.length;r<i;r++)n.add(e[r],t);return n},ar.prototype.size=function(){return ir?this._set.size:Object.getOwnPropertyNames(this._set).length},ar.prototype.add=function(e,t){var n=ir?e:nr.toSetString(e),r=ir?this.has(e):rr.call(this._set,n),i=this._array.length;r&&!t||this._array.push(e),r||(ir?this._set.set(e,i):this._set[n]=i);},ar.prototype.has=function(e){if(ir)return this._set.has(e);var t=nr.toSetString(e);return rr.call(this._set,t)},ar.prototype.indexOf=function(e){if(ir){var t=this._set.get(e);if(t>=0)return t}else {var n=nr.toSetString(e);if(rr.call(this._set,n))return this._set[n]}throw new Error('"'+e+'" is not in the set.')},ar.prototype.at=function(e){if(e>=0&&e<this._array.length)return this._array[e];throw new Error("No element indexed by "+e)},ar.prototype.toArray=function(){return this._array.slice()};var or={ArraySet:ar};function sr(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0};}sr.prototype.unsortedForEach=function(e,t){this._array.forEach(e,t);},sr.prototype.add=function(e){var t,n,r,i,a,o;t=this._last,n=e,r=t.generatedLine,i=n.generatedLine,a=t.generatedColumn,o=n.generatedColumn,i>r||i==r&&o>=a||nr.compareByGeneratedPositionsInflated(t,n)<=0?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e));},sr.prototype.toArray=function(){return this._sorted||(this._array.sort(nr.compareByGeneratedPositionsInflated),this._sorted=!0),this._array};var lr=or.ArraySet,cr={MappingList:sr}.MappingList;function ur(e){e||(e={}),this._file=nr.getArg(e,"file",null),this._sourceRoot=nr.getArg(e,"sourceRoot",null),this._skipValidation=nr.getArg(e,"skipValidation",!1),this._sources=new lr,this._names=new lr,this._mappings=new cr,this._sourcesContents=null;}ur.prototype._version=3,ur.fromSourceMap=function(e){var t=e.sourceRoot,n=new ur({file:e.file,sourceRoot:t});return e.eachMapping((function(e){var r={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(r.source=e.source,null!=t&&(r.source=nr.relative(t,r.source)),r.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(r.name=e.name)),n.addMapping(r);})),e.sources.forEach((function(r){var i=r;null!==t&&(i=nr.relative(t,r)),n._sources.has(i)||n._sources.add(i);var a=e.sourceContentFor(r);null!=a&&n.setSourceContent(r,a);})),n},ur.prototype.addMapping=function(e){var t=nr.getArg(e,"generated"),n=nr.getArg(e,"original",null),r=nr.getArg(e,"source",null),i=nr.getArg(e,"name",null);this._skipValidation||this._validateMapping(t,n,r,i),null!=r&&(r=String(r),this._sources.has(r)||this._sources.add(r)),null!=i&&(i=String(i),this._names.has(i)||this._names.add(i)),this._mappings.add({generatedLine:t.line,generatedColumn:t.column,originalLine:null!=n&&n.line,originalColumn:null!=n&&n.column,source:r,name:i});},ur.prototype.setSourceContent=function(e,t){var n=e;null!=this._sourceRoot&&(n=nr.relative(this._sourceRoot,n)),null!=t?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[nr.toSetString(n)]=t):this._sourcesContents&&(delete this._sourcesContents[nr.toSetString(n)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null));},ur.prototype.applySourceMap=function(e,t,n){var r=t;if(null==t){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');r=e.file;}var i=this._sourceRoot;null!=i&&(r=nr.relative(i,r));var a=new lr,o=new lr;this._mappings.unsortedForEach((function(t){if(t.source===r&&null!=t.originalLine){var s=e.originalPositionFor({line:t.originalLine,column:t.originalColumn});null!=s.source&&(t.source=s.source,null!=n&&(t.source=nr.join(n,t.source)),null!=i&&(t.source=nr.relative(i,t.source)),t.originalLine=s.line,t.originalColumn=s.column,null!=s.name&&(t.name=s.name));}var l=t.source;null==l||a.has(l)||a.add(l);var c=t.name;null==c||o.has(c)||o.add(c);}),this),this._sources=a,this._names=o,e.sources.forEach((function(t){var r=e.sourceContentFor(t);null!=r&&(null!=n&&(t=nr.join(n,t)),null!=i&&(t=nr.relative(i,t)),this.setSourceContent(t,r));}),this);},ur.prototype._validateMapping=function(e,t,n,r){if(t&&"number"!=typeof t.line&&"number"!=typeof t.column)throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if((!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0)||t||n||r)&&!(e&&"line"in e&&"column"in e&&t&&"line"in t&&"column"in t&&e.line>0&&e.column>=0&&t.line>0&&t.column>=0&&n))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:n,original:t,name:r}))},ur.prototype._serializeMappings=function(){for(var e,t,n,r,i=0,a=1,o=0,s=0,l=0,c=0,u="",h=this._mappings.toArray(),p=0,d=h.length;p<d;p++){if(e="",(t=h[p]).generatedLine!==a)for(i=0;t.generatedLine!==a;)e+=";",a++;else if(p>0){if(!nr.compareByGeneratedPositionsInflated(t,h[p-1]))continue;e+=",";}e+=tr(t.generatedColumn-i),i=t.generatedColumn,null!=t.source&&(r=this._sources.indexOf(t.source),e+=tr(r-c),c=r,e+=tr(t.originalLine-1-s),s=t.originalLine-1,e+=tr(t.originalColumn-o),o=t.originalColumn,null!=t.name&&(n=this._names.indexOf(t.name),e+=tr(n-l),l=n)),u+=e;}return u},ur.prototype._generateSourcesContent=function(e,t){return e.map((function(e){if(!this._sourcesContents)return null;null!=t&&(e=nr.relative(t,e));var n=nr.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,n)?this._sourcesContents[n]:null}),this)},ur.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},ur.prototype.toString=function(){return JSON.stringify(this.toJSON())};var hr={SourceMapGenerator:ur}.SourceMapGenerator,pr={Atrule:!0,Selector:!0,Declaration:!0},dr=Object.prototype.hasOwnProperty;function mr(e,t){var n=e.children,r=null;"function"!=typeof t?n.forEach(this.node,this):n.forEach((function(e){null!==r&&t.call(this,r),this.node(e),r=e;}),this);}var gr=function(e){function t(e){if(!dr.call(n,e.type))throw new Error("Unknown node type: "+e.type);n[e.type].call(this,e);}var n={};if(e.node)for(var r in e.node)n[r]=e.node[r].generate;return function(e,n){var r="",i={children:mr,node:t,chunk:function(e){r+=e;},result:function(){return r}};return n&&("function"==typeof n.decorator&&(i=n.decorator(i)),n.sourceMap&&(i=function(e){var t=new hr,n=1,r=0,i={line:1,column:0},a={line:0,column:0},o=!1,s={line:1,column:0},l={generated:s},c=e.node;e.node=function(e){if(e.loc&&e.loc.start&&pr.hasOwnProperty(e.type)){var u=e.loc.start.line,h=e.loc.start.column-1;a.line===u&&a.column===h||(a.line=u,a.column=h,i.line=n,i.column=r,o&&(o=!1,i.line===s.line&&i.column===s.column||t.addMapping(l)),o=!0,t.addMapping({source:e.loc.source,original:a,generated:i}));}c.call(this,e),o&&pr.hasOwnProperty(e.type)&&(s.line=n,s.column=r);};var u=e.chunk;e.chunk=function(e){for(var t=0;t<e.length;t++)10===e.charCodeAt(t)?(n++,r=0):r++;u(e);};var h=e.result;return e.result=function(){return o&&t.addMapping(l),{css:h(),map:t}},e}(i))),i.node(e),i.result()}},fr=Object.prototype.hasOwnProperty,br=function(){};function yr(e){return "function"==typeof e?e:br}function kr(e,t){return function(n,r,i){n.type===t&&e.call(this,n,r,i);}}function vr(e,t){var n=t.structure,r=[];for(var i in n)if(!1!==fr.call(n,i)){var a=n[i],o={name:i,type:!1,nullable:!1};Array.isArray(n[i])||(a=[n[i]]);for(var s=0;s<a.length;s++){var l=a[s];null===l?o.nullable=!0:"string"==typeof l?o.type="node":Array.isArray(l)&&(o.type="list");}o.type&&r.push(o);}return r.length?{context:t.walkContext,fields:r}:null}function xr(e,t){var n=e.fields.slice(),r=e.context,i="string"==typeof r;return t&&n.reverse(),function(e,a,o,s){var l;i&&(l=a[r],a[r]=e);for(var c=0;c<n.length;c++){var u=n[c],h=e[u.name];if(!u.nullable||h)if("list"===u.type){if(t?h.reduceRight(s,!1):h.reduce(s,!1))return !0}else if(o(h))return !0}i&&(a[r]=l);}}function wr(e){return {Atrule:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block},Rule:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block},Declaration:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block,DeclarationList:e.DeclarationList}}}var Sr=function(e){var t=function(e){var t={};for(var n in e.node)if(fr.call(e.node,n)){var r=e.node[n];if(!r.structure)throw new Error("Missed `structure` field in `"+n+"` node type definition");t[n]=vr(0,r);}return t}(e),n={},r={},i=Symbol("break-walk"),a=Symbol("skip-node");for(var o in t)fr.call(t,o)&&null!==t[o]&&(n[o]=xr(t[o],!1),r[o]=xr(t[o],!0));var s=wr(n),l=wr(r),c=function(e,o){function c(e,t,n){var r=h.call(m,e,t,n);return r===i||r!==a&&(!(!d.hasOwnProperty(e.type)||!d[e.type](e,m,c,u))||p.call(m,e,t,n)===i)}var u=(e,t,n,r)=>e||c(t,n,r),h=br,p=br,d=n,m={break:i,skip:a,root:e,stylesheet:null,atrule:null,atrulePrelude:null,rule:null,selector:null,block:null,declaration:null,function:null};if("function"==typeof o)h=o;else if(o&&(h=yr(o.enter),p=yr(o.leave),o.reverse&&(d=r),o.visit)){if(s.hasOwnProperty(o.visit))d=o.reverse?l[o.visit]:s[o.visit];else if(!t.hasOwnProperty(o.visit))throw new Error("Bad value `"+o.visit+"` for `visit` option (should be: "+Object.keys(t).join(", ")+")");h=kr(h,o.visit),p=kr(p,o.visit);}if(h===br&&p===br)throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function");c(e);};return c.break=i,c.skip=a,c.find=function(e,t){var n=null;return c(e,(function(e,r,a){if(t.call(this,e,r,a))return n=e,i})),n},c.findLast=function(e,t){var n=null;return c(e,{reverse:!0,enter:function(e,r,a){if(t.call(this,e,r,a))return n=e,i}}),n},c.findAll=function(e,t){var n=[];return c(e,(function(e,r,i){t.call(this,e,r,i)&&n.push(e);})),n},c},Cr=function e(t){var n={};for(var r in t){var i=t[r];i&&(Array.isArray(i)||i instanceof a?i=i.map(e):i.constructor===Object&&(i=e(i))),n[r]=i;}return n};const zr=Object.prototype.hasOwnProperty,Ar={generic:!0,types:Er,atrules:{prelude:Dr,descriptors:Dr},properties:Er,parseContext:function(e,t){return Object.assign(e,t)},scope:function e(t,n){for(const r in n)zr.call(n,r)&&(Pr(t[r])?e(t[r],Tr(n[r])):t[r]=Tr(n[r]));return t},atrule:["parse"],pseudo:["parse"],node:["name","structure","parse","generate","walkContext"]};function Pr(e){return e&&e.constructor===Object}function Tr(e){return Pr(e)?Object.assign({},e):e}function Lr(e,t){return "string"==typeof t&&/^\s*\|/.test(t)?"string"==typeof e?e+t:t.replace(/^\s*\|\s*/,""):t||null}function Er(e,t){if("string"==typeof t)return Lr(e,t);const n=Object.assign({},e);for(let r in t)zr.call(t,r)&&(n[r]=Lr(zr.call(e,r)?e[r]:void 0,t[r]));return n}function Dr(e,t){const n=Er(e,t);return !Pr(n)||Object.keys(n).length?n:null}var Or=(e,t)=>function e(t,n,r){for(const i in r)if(!1!==zr.call(r,i))if(!0===r[i])i in n&&zr.call(n,i)&&(t[i]=Tr(n[i]));else if(r[i])if("function"==typeof r[i]){const e=r[i];t[i]=e({},t[i]),t[i]=e(t[i]||{},n[i]);}else if(Pr(r[i])){const a={};for(let n in t[i])a[n]=e({},t[i][n],r[i]);for(let t in n[i])a[t]=e(a[t]||{},n[i][t],r[i]);t[i]=a;}else if(Array.isArray(r[i])){const a={},o=r[i].reduce((function(e,t){return e[t]=!0,e}),{});for(const[n,r]of Object.entries(t[i]||{}))a[n]={},r&&e(a[n],r,o);for(const t in n[i])zr.call(n[i],t)&&(a[t]||(a[t]={}),n[i]&&n[i][t]&&e(a[t],n[i][t],o));t[i]=a;}return t}(e,t,Ar);function Br(e){var t=$n(e),n=Sr(e),r=gr(e),i=function(e){return {fromPlainObject:function(t){return e(t,{enter:function(e){e.children&&e.children instanceof a==!1&&(e.children=(new a).fromArray(e.children));}}),t},toPlainObject:function(t){return e(t,{leave:function(e){e.children&&e.children instanceof a&&(e.children=e.children.toArray());}}),t}}}(n),o={List:a,SyntaxError:l,TokenStream:H,Lexer:Ln,vendorPrefix:ae.vendorPrefix,keyword:ae.keyword,property:ae.property,isCustomProperty:ae.isCustomProperty,definitionSyntax:En,lexer:null,createLexer:function(e){return new Ln(e,o,o.lexer.structure)},tokenize:Ce,parse:t,walk:n,generate:r,find:n.find,findLast:n.findLast,findAll:n.findAll,clone:Cr,fromPlainObject:i.fromPlainObject,toPlainObject:i.toPlainObject,createSyntax:function(e){return Br(Or({},e))},fork:function(t){var n=Or({},e);return Br("function"==typeof t?t(n,Object.assign):Or(n,t))}};return o.lexer=new Ln({generic:!0,types:e.types,atrules:e.atrules,properties:e.properties,node:e.node},o),o}var Ir=function(e){return Br(Or({},e))},Nr={generic:!0,types:{"absolute-size":"xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large","alpha-value":"<number>|<percentage>","angle-percentage":"<angle>|<percentage>","angular-color-hint":"<angle-percentage>","angular-color-stop":"<color>&&<color-stop-angle>?","angular-color-stop-list":"[<angular-color-stop> [, <angular-color-hint>]?]# , <angular-color-stop>","animateable-feature":"scroll-position|contents|<custom-ident>",attachment:"scroll|fixed|local","attr()":"attr( <attr-name> <type-or-unit>? [, <attr-fallback>]? )","attr-matcher":"['~'|'|'|'^'|'$'|'*']? '='","attr-modifier":"i|s","attribute-selector":"'[' <wq-name> ']'|'[' <wq-name> <attr-matcher> [<string-token>|<ident-token>] <attr-modifier>? ']'","auto-repeat":"repeat( [auto-fill|auto-fit] , [<line-names>? <fixed-size>]+ <line-names>? )","auto-track-list":"[<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>? <auto-repeat> [<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>?","baseline-position":"[first|last]? baseline","basic-shape":"<inset()>|<circle()>|<ellipse()>|<polygon()>|<path()>","bg-image":"none|<image>","bg-layer":"<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>","bg-position":"[[left|center|right|top|bottom|<length-percentage>]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]|[center|[left|right] <length-percentage>?]&&[center|[top|bottom] <length-percentage>?]]","bg-size":"[<length-percentage>|auto]{1,2}|cover|contain","blur()":"blur( <length> )","blend-mode":"normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|hard-light|soft-light|difference|exclusion|hue|saturation|color|luminosity",box:"border-box|padding-box|content-box","brightness()":"brightness( <number-percentage> )","calc()":"calc( <calc-sum> )","calc-sum":"<calc-product> [['+'|'-'] <calc-product>]*","calc-product":"<calc-value> ['*' <calc-value>|'/' <number>]*","calc-value":"<number>|<dimension>|<percentage>|( <calc-sum> )","cf-final-image":"<image>|<color>","cf-mixing-image":"<percentage>?&&<image>","circle()":"circle( [<shape-radius>]? [at <position>]? )","clamp()":"clamp( <calc-sum>#{3} )","class-selector":"'.' <ident-token>","clip-source":"<url>",color:"<rgb()>|<rgba()>|<hsl()>|<hsla()>|<hex-color>|<named-color>|currentcolor|<deprecated-system-color>","color-stop":"<color-stop-length>|<color-stop-angle>","color-stop-angle":"<angle-percentage>{1,2}","color-stop-length":"<length-percentage>{1,2}","color-stop-list":"[<linear-color-stop> [, <linear-color-hint>]?]# , <linear-color-stop>",combinator:"'>'|'+'|'~'|['||']","common-lig-values":"[common-ligatures|no-common-ligatures]","compat-auto":"searchfield|textarea|push-button|slider-horizontal|checkbox|radio|square-button|menulist|listbox|meter|progress-bar|button","composite-style":"clear|copy|source-over|source-in|source-out|source-atop|destination-over|destination-in|destination-out|destination-atop|xor","compositing-operator":"add|subtract|intersect|exclude","compound-selector":"[<type-selector>? <subclass-selector>* [<pseudo-element-selector> <pseudo-class-selector>*]*]!","compound-selector-list":"<compound-selector>#","complex-selector":"<compound-selector> [<combinator>? <compound-selector>]*","complex-selector-list":"<complex-selector>#","conic-gradient()":"conic-gradient( [from <angle>]? [at <position>]? , <angular-color-stop-list> )","contextual-alt-values":"[contextual|no-contextual]","content-distribution":"space-between|space-around|space-evenly|stretch","content-list":"[<string>|contents|<image>|<quote>|<target>|<leader()>|<attr()>|counter( <ident> , <'list-style-type'>? )]+","content-position":"center|start|end|flex-start|flex-end","content-replacement":"<image>","contrast()":"contrast( [<number-percentage>] )","counter()":"counter( <custom-ident> , <counter-style>? )","counter-style":"<counter-style-name>|symbols( )","counter-style-name":"<custom-ident>","counters()":"counters( <custom-ident> , <string> , <counter-style>? )","cross-fade()":"cross-fade( <cf-mixing-image> , <cf-final-image>? )","cubic-bezier-timing-function":"ease|ease-in|ease-out|ease-in-out|cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )","deprecated-system-color":"ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText","discretionary-lig-values":"[discretionary-ligatures|no-discretionary-ligatures]","display-box":"contents|none","display-inside":"flow|flow-root|table|flex|grid|ruby","display-internal":"table-row-group|table-header-group|table-footer-group|table-row|table-cell|table-column-group|table-column|table-caption|ruby-base|ruby-text|ruby-base-container|ruby-text-container","display-legacy":"inline-block|inline-list-item|inline-table|inline-flex|inline-grid","display-listitem":"<display-outside>?&&[flow|flow-root]?&&list-item","display-outside":"block|inline|run-in","drop-shadow()":"drop-shadow( <length>{2,3} <color>? )","east-asian-variant-values":"[jis78|jis83|jis90|jis04|simplified|traditional]","east-asian-width-values":"[full-width|proportional-width]","element()":"element( <custom-ident> , [first|start|last|first-except]? )|element( <id-selector> )","ellipse()":"ellipse( [<shape-radius>{2}]? [at <position>]? )","ending-shape":"circle|ellipse","env()":"env( <custom-ident> , <declaration-value>? )","explicit-track-list":"[<line-names>? <track-size>]+ <line-names>?","family-name":"<string>|<custom-ident>+","feature-tag-value":"<string> [<integer>|on|off]?","feature-type":"@stylistic|@historical-forms|@styleset|@character-variant|@swash|@ornaments|@annotation","feature-value-block":"<feature-type> '{' <feature-value-declaration-list> '}'","feature-value-block-list":"<feature-value-block>+","feature-value-declaration":"<custom-ident> : <integer>+ ;","feature-value-declaration-list":"<feature-value-declaration>","feature-value-name":"<custom-ident>","fill-rule":"nonzero|evenodd","filter-function":"<blur()>|<brightness()>|<contrast()>|<drop-shadow()>|<grayscale()>|<hue-rotate()>|<invert()>|<opacity()>|<saturate()>|<sepia()>","filter-function-list":"[<filter-function>|<url>]+","final-bg-layer":"<'background-color'>||<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>","fit-content()":"fit-content( [<length>|<percentage>] )","fixed-breadth":"<length-percentage>","fixed-repeat":"repeat( [<positive-integer>] , [<line-names>? <fixed-size>]+ <line-names>? )","fixed-size":"<fixed-breadth>|minmax( <fixed-breadth> , <track-breadth> )|minmax( <inflexible-breadth> , <fixed-breadth> )","font-stretch-absolute":"normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded|<percentage>","font-variant-css21":"[normal|small-caps]","font-weight-absolute":"normal|bold|<number [1,1000]>","frequency-percentage":"<frequency>|<percentage>","general-enclosed":"[<function-token> <any-value> )]|( <ident> <any-value> )","generic-family":"serif|sans-serif|cursive|fantasy|monospace|-apple-system","generic-name":"serif|sans-serif|cursive|fantasy|monospace","geometry-box":"<shape-box>|fill-box|stroke-box|view-box",gradient:"<linear-gradient()>|<repeating-linear-gradient()>|<radial-gradient()>|<repeating-radial-gradient()>|<conic-gradient()>|<-legacy-gradient>","grayscale()":"grayscale( <number-percentage> )","grid-line":"auto|<custom-ident>|[<integer>&&<custom-ident>?]|[span&&[<integer>||<custom-ident>]]","historical-lig-values":"[historical-ligatures|no-historical-ligatures]","hsl()":"hsl( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )","hsla()":"hsla( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )",hue:"<number>|<angle>","hue-rotate()":"hue-rotate( <angle> )",image:"<url>|<image()>|<image-set()>|<element()>|<paint()>|<cross-fade()>|<gradient>","image()":"image( <image-tags>? [<image-src>? , <color>?]! )","image-set()":"image-set( <image-set-option># )","image-set-option":"[<image>|<string>] <resolution>","image-src":"<url>|<string>","image-tags":"ltr|rtl","inflexible-breadth":"<length>|<percentage>|min-content|max-content|auto","inset()":"inset( <length-percentage>{1,4} [round <'border-radius'>]? )","invert()":"invert( <number-percentage> )","keyframes-name":"<custom-ident>|<string>","keyframe-block":"<keyframe-selector># { <declaration-list> }","keyframe-block-list":"<keyframe-block>+","keyframe-selector":"from|to|<percentage>","leader()":"leader( <leader-type> )","leader-type":"dotted|solid|space|<string>","length-percentage":"<length>|<percentage>","line-names":"'[' <custom-ident>* ']'","line-name-list":"[<line-names>|<name-repeat>]+","line-style":"none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset","line-width":"<length>|thin|medium|thick","linear-color-hint":"<length-percentage>","linear-color-stop":"<color> <color-stop-length>?","linear-gradient()":"linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )","mask-layer":"<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||<geometry-box>||[<geometry-box>|no-clip]||<compositing-operator>||<masking-mode>","mask-position":"[<length-percentage>|left|center|right] [<length-percentage>|top|center|bottom]?","mask-reference":"none|<image>|<mask-source>","mask-source":"<url>","masking-mode":"alpha|luminance|match-source","matrix()":"matrix( <number>#{6} )","matrix3d()":"matrix3d( <number>#{16} )","max()":"max( <calc-sum># )","media-and":"<media-in-parens> [and <media-in-parens>]+","media-condition":"<media-not>|<media-and>|<media-or>|<media-in-parens>","media-condition-without-or":"<media-not>|<media-and>|<media-in-parens>","media-feature":"( [<mf-plain>|<mf-boolean>|<mf-range>] )","media-in-parens":"( <media-condition> )|<media-feature>|<general-enclosed>","media-not":"not <media-in-parens>","media-or":"<media-in-parens> [or <media-in-parens>]+","media-query":"<media-condition>|[not|only]? <media-type> [and <media-condition-without-or>]?","media-query-list":"<media-query>#","media-type":"<ident>","mf-boolean":"<mf-name>","mf-name":"<ident>","mf-plain":"<mf-name> : <mf-value>","mf-range":"<mf-name> ['<'|'>']? '='? <mf-value>|<mf-value> ['<'|'>']? '='? <mf-name>|<mf-value> '<' '='? <mf-name> '<' '='? <mf-value>|<mf-value> '>' '='? <mf-name> '>' '='? <mf-value>","mf-value":"<number>|<dimension>|<ident>|<ratio>","min()":"min( <calc-sum># )","minmax()":"minmax( [<length>|<percentage>|min-content|max-content|auto] , [<length>|<percentage>|<flex>|min-content|max-content|auto] )","named-color":"transparent|aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen|<-non-standard-color>","namespace-prefix":"<ident>","ns-prefix":"[<ident-token>|'*']? '|'","number-percentage":"<number>|<percentage>","numeric-figure-values":"[lining-nums|oldstyle-nums]","numeric-fraction-values":"[diagonal-fractions|stacked-fractions]","numeric-spacing-values":"[proportional-nums|tabular-nums]",nth:"<an-plus-b>|even|odd","opacity()":"opacity( [<number-percentage>] )","overflow-position":"unsafe|safe","outline-radius":"<length>|<percentage>","page-body":"<declaration>? [; <page-body>]?|<page-margin-box> <page-body>","page-margin-box":"<page-margin-box-type> '{' <declaration-list> '}'","page-margin-box-type":"@top-left-corner|@top-left|@top-center|@top-right|@top-right-corner|@bottom-left-corner|@bottom-left|@bottom-center|@bottom-right|@bottom-right-corner|@left-top|@left-middle|@left-bottom|@right-top|@right-middle|@right-bottom","page-selector-list":"[<page-selector>#]?","page-selector":"<pseudo-page>+|<ident> <pseudo-page>*","path()":"path( [<fill-rule> ,]? <string> )","paint()":"paint( <ident> , <declaration-value>? )","perspective()":"perspective( <length> )","polygon()":"polygon( <fill-rule>? , [<length-percentage> <length-percentage>]# )",position:"[[left|center|right]||[top|center|bottom]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]?|[[left|right] <length-percentage>]&&[[top|bottom] <length-percentage>]]","pseudo-class-selector":"':' <ident-token>|':' <function-token> <any-value> ')'","pseudo-element-selector":"':' <pseudo-class-selector>","pseudo-page":": [left|right|first|blank]",quote:"open-quote|close-quote|no-open-quote|no-close-quote","radial-gradient()":"radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )","relative-selector":"<combinator>? <complex-selector>","relative-selector-list":"<relative-selector>#","relative-size":"larger|smaller","repeat-style":"repeat-x|repeat-y|[repeat|space|round|no-repeat]{1,2}","repeating-linear-gradient()":"repeating-linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )","repeating-radial-gradient()":"repeating-radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )","rgb()":"rgb( <percentage>{3} [/ <alpha-value>]? )|rgb( <number>{3} [/ <alpha-value>]? )|rgb( <percentage>#{3} , <alpha-value>? )|rgb( <number>#{3} , <alpha-value>? )","rgba()":"rgba( <percentage>{3} [/ <alpha-value>]? )|rgba( <number>{3} [/ <alpha-value>]? )|rgba( <percentage>#{3} , <alpha-value>? )|rgba( <number>#{3} , <alpha-value>? )","rotate()":"rotate( [<angle>|<zero>] )","rotate3d()":"rotate3d( <number> , <number> , <number> , [<angle>|<zero>] )","rotateX()":"rotateX( [<angle>|<zero>] )","rotateY()":"rotateY( [<angle>|<zero>] )","rotateZ()":"rotateZ( [<angle>|<zero>] )","saturate()":"saturate( <number-percentage> )","scale()":"scale( <number> , <number>? )","scale3d()":"scale3d( <number> , <number> , <number> )","scaleX()":"scaleX( <number> )","scaleY()":"scaleY( <number> )","scaleZ()":"scaleZ( <number> )","self-position":"center|start|end|self-start|self-end|flex-start|flex-end","shape-radius":"<length-percentage>|closest-side|farthest-side","skew()":"skew( [<angle>|<zero>] , [<angle>|<zero>]? )","skewX()":"skewX( [<angle>|<zero>] )","skewY()":"skewY( [<angle>|<zero>] )","sepia()":"sepia( <number-percentage> )",shadow:"inset?&&<length>{2,4}&&<color>?","shadow-t":"[<length>{2,3}&&<color>?]",shape:"rect( <top> , <right> , <bottom> , <left> )|rect( <top> <right> <bottom> <left> )","shape-box":"<box>|margin-box","side-or-corner":"[left|right]||[top|bottom]","single-animation":"<time>||<timing-function>||<time>||<single-animation-iteration-count>||<single-animation-direction>||<single-animation-fill-mode>||<single-animation-play-state>||[none|<keyframes-name>]","single-animation-direction":"normal|reverse|alternate|alternate-reverse","single-animation-fill-mode":"none|forwards|backwards|both","single-animation-iteration-count":"infinite|<number>","single-animation-play-state":"running|paused","single-transition":"[none|<single-transition-property>]||<time>||<timing-function>||<time>","single-transition-property":"all|<custom-ident>",size:"closest-side|farthest-side|closest-corner|farthest-corner|<length>|<length-percentage>{2}","step-position":"jump-start|jump-end|jump-none|jump-both|start|end","step-timing-function":"step-start|step-end|steps( <integer> [, <step-position>]? )","subclass-selector":"<id-selector>|<class-selector>|<attribute-selector>|<pseudo-class-selector>","supports-condition":"not <supports-in-parens>|<supports-in-parens> [and <supports-in-parens>]*|<supports-in-parens> [or <supports-in-parens>]*","supports-in-parens":"( <supports-condition> )|<supports-feature>|<general-enclosed>","supports-feature":"<supports-decl>|<supports-selector-fn>","supports-decl":"( <declaration> )","supports-selector-fn":"selector( <complex-selector> )",symbol:"<string>|<image>|<custom-ident>",target:"<target-counter()>|<target-counters()>|<target-text()>","target-counter()":"target-counter( [<string>|<url>] , <custom-ident> , <counter-style>? )","target-counters()":"target-counters( [<string>|<url>] , <custom-ident> , <string> , <counter-style>? )","target-text()":"target-text( [<string>|<url>] , [content|before|after|first-letter]? )","time-percentage":"<time>|<percentage>","timing-function":"linear|<cubic-bezier-timing-function>|<step-timing-function>","track-breadth":"<length-percentage>|<flex>|min-content|max-content|auto","track-list":"[<line-names>? [<track-size>|<track-repeat>]]+ <line-names>?","track-repeat":"repeat( [<positive-integer>] , [<line-names>? <track-size>]+ <line-names>? )","track-size":"<track-breadth>|minmax( <inflexible-breadth> , <track-breadth> )|fit-content( [<length>|<percentage>] )","transform-function":"<matrix()>|<translate()>|<translateX()>|<translateY()>|<scale()>|<scaleX()>|<scaleY()>|<rotate()>|<skew()>|<skewX()>|<skewY()>|<matrix3d()>|<translate3d()>|<translateZ()>|<scale3d()>|<scaleZ()>|<rotate3d()>|<rotateX()>|<rotateY()>|<rotateZ()>|<perspective()>","transform-list":"<transform-function>+","translate()":"translate( <length-percentage> , <length-percentage>? )","translate3d()":"translate3d( <length-percentage> , <length-percentage> , <length> )","translateX()":"translateX( <length-percentage> )","translateY()":"translateY( <length-percentage> )","translateZ()":"translateZ( <length> )","type-or-unit":"string|color|url|integer|number|length|angle|time|frequency|cap|ch|em|ex|ic|lh|rlh|rem|vb|vi|vw|vh|vmin|vmax|mm|Q|cm|in|pt|pc|px|deg|grad|rad|turn|ms|s|Hz|kHz|%","type-selector":"<wq-name>|<ns-prefix>? '*'","var()":"var( <custom-property-name> , <declaration-value>? )","viewport-length":"auto|<length-percentage>","wq-name":"<ns-prefix>? <ident-token>","-legacy-gradient":"<-webkit-gradient()>|<-legacy-linear-gradient>|<-legacy-repeating-linear-gradient>|<-legacy-radial-gradient>|<-legacy-repeating-radial-gradient>","-legacy-linear-gradient":"-moz-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-repeating-linear-gradient":"-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-linear-gradient-arguments":"[<angle>|<side-or-corner>]? , <color-stop-list>","-legacy-radial-gradient":"-moz-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-repeating-radial-gradient":"-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-radial-gradient-arguments":"[<position> ,]? [[[<-legacy-radial-gradient-shape>||<-legacy-radial-gradient-size>]|[<length>|<percentage>]{2}] ,]? <color-stop-list>","-legacy-radial-gradient-size":"closest-side|closest-corner|farthest-side|farthest-corner|contain|cover","-legacy-radial-gradient-shape":"circle|ellipse","-non-standard-font":"-apple-system-body|-apple-system-headline|-apple-system-subheadline|-apple-system-caption1|-apple-system-caption2|-apple-system-footnote|-apple-system-short-body|-apple-system-short-headline|-apple-system-short-subheadline|-apple-system-short-caption1|-apple-system-short-footnote|-apple-system-tall-body","-non-standard-color":"-moz-ButtonDefault|-moz-ButtonHoverFace|-moz-ButtonHoverText|-moz-CellHighlight|-moz-CellHighlightText|-moz-Combobox|-moz-ComboboxText|-moz-Dialog|-moz-DialogText|-moz-dragtargetzone|-moz-EvenTreeRow|-moz-Field|-moz-FieldText|-moz-html-CellHighlight|-moz-html-CellHighlightText|-moz-mac-accentdarkestshadow|-moz-mac-accentdarkshadow|-moz-mac-accentface|-moz-mac-accentlightesthighlight|-moz-mac-accentlightshadow|-moz-mac-accentregularhighlight|-moz-mac-accentregularshadow|-moz-mac-chrome-active|-moz-mac-chrome-inactive|-moz-mac-focusring|-moz-mac-menuselect|-moz-mac-menushadow|-moz-mac-menutextselect|-moz-MenuHover|-moz-MenuHoverText|-moz-MenuBarText|-moz-MenuBarHoverText|-moz-nativehyperlinktext|-moz-OddTreeRow|-moz-win-communicationstext|-moz-win-mediatext|-moz-activehyperlinktext|-moz-default-background-color|-moz-default-color|-moz-hyperlinktext|-moz-visitedhyperlinktext|-webkit-activelink|-webkit-focus-ring-color|-webkit-link|-webkit-text","-non-standard-image-rendering":"optimize-contrast|-moz-crisp-edges|-o-crisp-edges|-webkit-optimize-contrast","-non-standard-overflow":"-moz-scrollbars-none|-moz-scrollbars-horizontal|-moz-scrollbars-vertical|-moz-hidden-unscrollable","-non-standard-width":"fill-available|min-intrinsic|intrinsic|-moz-available|-moz-fit-content|-moz-min-content|-moz-max-content|-webkit-min-content|-webkit-max-content","-webkit-gradient()":"-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point>|, <-webkit-gradient-radius> , <-webkit-gradient-point>] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )","-webkit-gradient-color-stop":"from( <color> )|color-stop( [<number-zero-one>|<percentage>] , <color> )|to( <color> )","-webkit-gradient-point":"[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]","-webkit-gradient-radius":"<length>|<percentage>","-webkit-gradient-type":"linear|radial","-webkit-mask-box-repeat":"repeat|stretch|round","-webkit-mask-clip-style":"border|border-box|padding|padding-box|content|content-box|text","-ms-filter-function-list":"<-ms-filter-function>+","-ms-filter-function":"<-ms-filter-function-progid>|<-ms-filter-function-legacy>","-ms-filter-function-progid":"'progid:' [<ident-token> '.']* [<ident-token>|<function-token> <any-value>? )]","-ms-filter-function-legacy":"<ident-token>|<function-token> <any-value>? )","-ms-filter":"<string>",age:"child|young|old","attr-name":"<wq-name>","attr-fallback":"<any-value>","border-radius":"<length-percentage>{1,2}",bottom:"<length>|auto","generic-voice":"[<age>? <gender> <integer>?]",gender:"male|female|neutral",left:"<length>|auto","mask-image":"<mask-reference>#","name-repeat":"repeat( [<positive-integer>|auto-fill] , <line-names>+ )",paint:"none|<color>|<url> [none|<color>]?|context-fill|context-stroke","page-size":"A5|A4|A3|B5|B4|JIS-B5|JIS-B4|letter|legal|ledger",ratio:"<integer> / <integer>",right:"<length>|auto","svg-length":"<percentage>|<length>|<number>","svg-writing-mode":"lr-tb|rl-tb|tb-rl|lr|rl|tb",top:"<length>|auto","track-group":"'(' [<string>* <track-minmax> <string>*]+ ')' ['[' <positive-integer> ']']?|<track-minmax>","track-list-v0":"[<string>* <track-group> <string>*]+|none","track-minmax":"minmax( <track-breadth> , <track-breadth> )|auto|<track-breadth>|fit-content",x:"<number>",y:"<number>",declaration:"<ident-token> : <declaration-value>? ['!' important]?","declaration-list":"[<declaration>? ';']* <declaration>?",url:"url( <string> <url-modifier>* )|<url-token>","url-modifier":"<ident>|<function-token> <any-value> )","number-zero-one":"<number [0,1]>","number-one-or-greater":"<number [1,∞]>","positive-integer":"<integer [0,∞]>","-non-standard-display":"-ms-inline-flexbox|-ms-grid|-ms-inline-grid|-webkit-flex|-webkit-inline-flex|-webkit-box|-webkit-inline-box|-moz-inline-stack|-moz-box|-moz-inline-box"},properties:{"--*":"<declaration-value>","-ms-accelerator":"false|true","-ms-block-progression":"tb|rl|bt|lr","-ms-content-zoom-chaining":"none|chained","-ms-content-zooming":"none|zoom","-ms-content-zoom-limit":"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>","-ms-content-zoom-limit-max":"<percentage>","-ms-content-zoom-limit-min":"<percentage>","-ms-content-zoom-snap":"<'-ms-content-zoom-snap-type'>||<'-ms-content-zoom-snap-points'>","-ms-content-zoom-snap-points":"snapInterval( <percentage> , <percentage> )|snapList( <percentage># )","-ms-content-zoom-snap-type":"none|proximity|mandatory","-ms-filter":"<string>","-ms-flow-from":"[none|<custom-ident>]#","-ms-flow-into":"[none|<custom-ident>]#","-ms-grid-columns":"none|<track-list>|<auto-track-list>","-ms-grid-rows":"none|<track-list>|<auto-track-list>","-ms-high-contrast-adjust":"auto|none","-ms-hyphenate-limit-chars":"auto|<integer>{1,3}","-ms-hyphenate-limit-lines":"no-limit|<integer>","-ms-hyphenate-limit-zone":"<percentage>|<length>","-ms-ime-align":"auto|after","-ms-overflow-style":"auto|none|scrollbar|-ms-autohiding-scrollbar","-ms-scrollbar-3dlight-color":"<color>","-ms-scrollbar-arrow-color":"<color>","-ms-scrollbar-base-color":"<color>","-ms-scrollbar-darkshadow-color":"<color>","-ms-scrollbar-face-color":"<color>","-ms-scrollbar-highlight-color":"<color>","-ms-scrollbar-shadow-color":"<color>","-ms-scrollbar-track-color":"<color>","-ms-scroll-chaining":"chained|none","-ms-scroll-limit":"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>","-ms-scroll-limit-x-max":"auto|<length>","-ms-scroll-limit-x-min":"<length>","-ms-scroll-limit-y-max":"auto|<length>","-ms-scroll-limit-y-min":"<length>","-ms-scroll-rails":"none|railed","-ms-scroll-snap-points-x":"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )","-ms-scroll-snap-points-y":"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )","-ms-scroll-snap-type":"none|proximity|mandatory","-ms-scroll-snap-x":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>","-ms-scroll-snap-y":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>","-ms-scroll-translation":"none|vertical-to-horizontal","-ms-text-autospace":"none|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space","-ms-touch-select":"grippers|none","-ms-user-select":"none|element|text","-ms-wrap-flow":"auto|both|start|end|maximum|clear","-ms-wrap-margin":"<length>","-ms-wrap-through":"wrap|none","-moz-appearance":"none|button|button-arrow-down|button-arrow-next|button-arrow-previous|button-arrow-up|button-bevel|button-focus|caret|checkbox|checkbox-container|checkbox-label|checkmenuitem|dualbutton|groupbox|listbox|listitem|menuarrow|menubar|menucheckbox|menuimage|menuitem|menuitemtext|menulist|menulist-button|menulist-text|menulist-textfield|menupopup|menuradio|menuseparator|meterbar|meterchunk|progressbar|progressbar-vertical|progresschunk|progresschunk-vertical|radio|radio-container|radio-label|radiomenuitem|range|range-thumb|resizer|resizerpanel|scale-horizontal|scalethumbend|scalethumb-horizontal|scalethumbstart|scalethumbtick|scalethumb-vertical|scale-vertical|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|separator|sheet|spinner|spinner-downbutton|spinner-textfield|spinner-upbutton|splitter|statusbar|statusbarpanel|tab|tabpanel|tabpanels|tab-scroll-arrow-back|tab-scroll-arrow-forward|textfield|textfield-multiline|toolbar|toolbarbutton|toolbarbutton-dropdown|toolbargripper|toolbox|tooltip|treeheader|treeheadercell|treeheadersortarrow|treeitem|treeline|treetwisty|treetwistyopen|treeview|-moz-mac-unified-toolbar|-moz-win-borderless-glass|-moz-win-browsertabbar-toolbox|-moz-win-communicationstext|-moz-win-communications-toolbox|-moz-win-exclude-glass|-moz-win-glass|-moz-win-mediatext|-moz-win-media-toolbox|-moz-window-button-box|-moz-window-button-box-maximized|-moz-window-button-close|-moz-window-button-maximize|-moz-window-button-minimize|-moz-window-button-restore|-moz-window-frame-bottom|-moz-window-frame-left|-moz-window-frame-right|-moz-window-titlebar|-moz-window-titlebar-maximized","-moz-binding":"<url>|none","-moz-border-bottom-colors":"<color>+|none","-moz-border-left-colors":"<color>+|none","-moz-border-right-colors":"<color>+|none","-moz-border-top-colors":"<color>+|none","-moz-context-properties":"none|[fill|fill-opacity|stroke|stroke-opacity]#","-moz-float-edge":"border-box|content-box|margin-box|padding-box","-moz-force-broken-image-icon":"<integer [0,1]>","-moz-image-region":"<shape>|auto","-moz-orient":"inline|block|horizontal|vertical","-moz-outline-radius":"<outline-radius>{1,4} [/ <outline-radius>{1,4}]?","-moz-outline-radius-bottomleft":"<outline-radius>","-moz-outline-radius-bottomright":"<outline-radius>","-moz-outline-radius-topleft":"<outline-radius>","-moz-outline-radius-topright":"<outline-radius>","-moz-stack-sizing":"ignore|stretch-to-fit","-moz-text-blink":"none|blink","-moz-user-focus":"ignore|normal|select-after|select-before|select-menu|select-same|select-all|none","-moz-user-input":"auto|none|enabled|disabled","-moz-user-modify":"read-only|read-write|write-only","-moz-window-dragging":"drag|no-drag","-moz-window-shadow":"default|menu|tooltip|sheet|none","-webkit-appearance":"none|button|button-bevel|caps-lock-indicator|caret|checkbox|default-button|inner-spin-button|listbox|listitem|media-controls-background|media-controls-fullscreen-background|media-current-time-display|media-enter-fullscreen-button|media-exit-fullscreen-button|media-fullscreen-button|media-mute-button|media-overlay-play-button|media-play-button|media-seek-back-button|media-seek-forward-button|media-slider|media-sliderthumb|media-time-remaining-display|media-toggle-closed-captions-button|media-volume-slider|media-volume-slider-container|media-volume-sliderthumb|menulist|menulist-button|menulist-text|menulist-textfield|meter|progress-bar|progress-bar-value|push-button|radio|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbargripper-horizontal|scrollbargripper-vertical|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|searchfield-cancel-button|searchfield-decoration|searchfield-results-button|searchfield-results-decoration|slider-horizontal|slider-vertical|sliderthumb-horizontal|sliderthumb-vertical|square-button|textarea|textfield|-apple-pay-button","-webkit-border-before":"<'border-width'>||<'border-style'>||<'color'>","-webkit-border-before-color":"<'color'>","-webkit-border-before-style":"<'border-style'>","-webkit-border-before-width":"<'border-width'>","-webkit-box-reflect":"[above|below|right|left]? <length>? <image>?","-webkit-line-clamp":"none|<integer>","-webkit-mask":"[<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||[<box>|border|padding|content|text]||[<box>|border|padding|content]]#","-webkit-mask-attachment":"<attachment>#","-webkit-mask-clip":"[<box>|border|padding|content|text]#","-webkit-mask-composite":"<composite-style>#","-webkit-mask-image":"<mask-reference>#","-webkit-mask-origin":"[<box>|border|padding|content]#","-webkit-mask-position":"<position>#","-webkit-mask-position-x":"[<length-percentage>|left|center|right]#","-webkit-mask-position-y":"[<length-percentage>|top|center|bottom]#","-webkit-mask-repeat":"<repeat-style>#","-webkit-mask-repeat-x":"repeat|no-repeat|space|round","-webkit-mask-repeat-y":"repeat|no-repeat|space|round","-webkit-mask-size":"<bg-size>#","-webkit-overflow-scrolling":"auto|touch","-webkit-tap-highlight-color":"<color>","-webkit-text-fill-color":"<color>","-webkit-text-stroke":"<length>||<color>","-webkit-text-stroke-color":"<color>","-webkit-text-stroke-width":"<length>","-webkit-touch-callout":"default|none","-webkit-user-modify":"read-only|read-write|read-write-plaintext-only","align-content":"normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>","align-items":"normal|stretch|<baseline-position>|[<overflow-position>? <self-position>]","align-self":"auto|normal|stretch|<baseline-position>|<overflow-position>? <self-position>","align-tracks":"[normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>]#",all:"initial|inherit|unset|revert",animation:"<single-animation>#","animation-delay":"<time>#","animation-direction":"<single-animation-direction>#","animation-duration":"<time>#","animation-fill-mode":"<single-animation-fill-mode>#","animation-iteration-count":"<single-animation-iteration-count>#","animation-name":"[none|<keyframes-name>]#","animation-play-state":"<single-animation-play-state>#","animation-timing-function":"<timing-function>#",appearance:"none|auto|textfield|menulist-button|<compat-auto>","aspect-ratio":"auto|<ratio>",azimuth:"<angle>|[[left-side|far-left|left|center-left|center|center-right|right|far-right|right-side]||behind]|leftwards|rightwards","backdrop-filter":"none|<filter-function-list>","backface-visibility":"visible|hidden",background:"[<bg-layer> ,]* <final-bg-layer>","background-attachment":"<attachment>#","background-blend-mode":"<blend-mode>#","background-clip":"<box>#","background-color":"<color>","background-image":"<bg-image>#","background-origin":"<box>#","background-position":"<bg-position>#","background-position-x":"[center|[[left|right|x-start|x-end]? <length-percentage>?]!]#","background-position-y":"[center|[[top|bottom|y-start|y-end]? <length-percentage>?]!]#","background-repeat":"<repeat-style>#","background-size":"<bg-size>#","block-overflow":"clip|ellipsis|<string>","block-size":"<'width'>",border:"<line-width>||<line-style>||<color>","border-block":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-color":"<'border-top-color'>{1,2}","border-block-style":"<'border-top-style'>","border-block-width":"<'border-top-width'>","border-block-end":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-end-color":"<'border-top-color'>","border-block-end-style":"<'border-top-style'>","border-block-end-width":"<'border-top-width'>","border-block-start":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-start-color":"<'border-top-color'>","border-block-start-style":"<'border-top-style'>","border-block-start-width":"<'border-top-width'>","border-bottom":"<line-width>||<line-style>||<color>","border-bottom-color":"<'border-top-color'>","border-bottom-left-radius":"<length-percentage>{1,2}","border-bottom-right-radius":"<length-percentage>{1,2}","border-bottom-style":"<line-style>","border-bottom-width":"<line-width>","border-collapse":"collapse|separate","border-color":"<color>{1,4}","border-end-end-radius":"<length-percentage>{1,2}","border-end-start-radius":"<length-percentage>{1,2}","border-image":"<'border-image-source'>||<'border-image-slice'> [/ <'border-image-width'>|/ <'border-image-width'>? / <'border-image-outset'>]?||<'border-image-repeat'>","border-image-outset":"[<length>|<number>]{1,4}","border-image-repeat":"[stretch|repeat|round|space]{1,2}","border-image-slice":"<number-percentage>{1,4}&&fill?","border-image-source":"none|<image>","border-image-width":"[<length-percentage>|<number>|auto]{1,4}","border-inline":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-end":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-color":"<'border-top-color'>{1,2}","border-inline-style":"<'border-top-style'>","border-inline-width":"<'border-top-width'>","border-inline-end-color":"<'border-top-color'>","border-inline-end-style":"<'border-top-style'>","border-inline-end-width":"<'border-top-width'>","border-inline-start":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-start-color":"<'border-top-color'>","border-inline-start-style":"<'border-top-style'>","border-inline-start-width":"<'border-top-width'>","border-left":"<line-width>||<line-style>||<color>","border-left-color":"<color>","border-left-style":"<line-style>","border-left-width":"<line-width>","border-radius":"<length-percentage>{1,4} [/ <length-percentage>{1,4}]?","border-right":"<line-width>||<line-style>||<color>","border-right-color":"<color>","border-right-style":"<line-style>","border-right-width":"<line-width>","border-spacing":"<length> <length>?","border-start-end-radius":"<length-percentage>{1,2}","border-start-start-radius":"<length-percentage>{1,2}","border-style":"<line-style>{1,4}","border-top":"<line-width>||<line-style>||<color>","border-top-color":"<color>","border-top-left-radius":"<length-percentage>{1,2}","border-top-right-radius":"<length-percentage>{1,2}","border-top-style":"<line-style>","border-top-width":"<line-width>","border-width":"<line-width>{1,4}",bottom:"<length>|<percentage>|auto","box-align":"start|center|end|baseline|stretch","box-decoration-break":"slice|clone","box-direction":"normal|reverse|inherit","box-flex":"<number>","box-flex-group":"<integer>","box-lines":"single|multiple","box-ordinal-group":"<integer>","box-orient":"horizontal|vertical|inline-axis|block-axis|inherit","box-pack":"start|center|end|justify","box-shadow":"none|<shadow>#","box-sizing":"content-box|border-box","break-after":"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region","break-before":"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region","break-inside":"auto|avoid|avoid-page|avoid-column|avoid-region","caption-side":"top|bottom|block-start|block-end|inline-start|inline-end","caret-color":"auto|<color>",clear:"none|left|right|both|inline-start|inline-end",clip:"<shape>|auto","clip-path":"<clip-source>|[<basic-shape>||<geometry-box>]|none",color:"<color>","color-adjust":"economy|exact","column-count":"<integer>|auto","column-fill":"auto|balance|balance-all","column-gap":"normal|<length-percentage>","column-rule":"<'column-rule-width'>||<'column-rule-style'>||<'column-rule-color'>","column-rule-color":"<color>","column-rule-style":"<'border-style'>","column-rule-width":"<'border-width'>","column-span":"none|all","column-width":"<length>|auto",columns:"<'column-width'>||<'column-count'>",contain:"none|strict|content|[size||layout||style||paint]",content:"normal|none|[<content-replacement>|<content-list>] [/ <string>]?","counter-increment":"[<custom-ident> <integer>?]+|none","counter-reset":"[<custom-ident> <integer>?]+|none","counter-set":"[<custom-ident> <integer>?]+|none",cursor:"[[<url> [<x> <y>]? ,]* [auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|e-resize|n-resize|ne-resize|nw-resize|s-resize|se-resize|sw-resize|w-resize|ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize|row-resize|all-scroll|zoom-in|zoom-out|grab|grabbing|hand|-webkit-grab|-webkit-grabbing|-webkit-zoom-in|-webkit-zoom-out|-moz-grab|-moz-grabbing|-moz-zoom-in|-moz-zoom-out]]",direction:"ltr|rtl",display:"[<display-outside>||<display-inside>]|<display-listitem>|<display-internal>|<display-box>|<display-legacy>|<-non-standard-display>","empty-cells":"show|hide",filter:"none|<filter-function-list>|<-ms-filter-function-list>",flex:"none|[<'flex-grow'> <'flex-shrink'>?||<'flex-basis'>]","flex-basis":"content|<'width'>","flex-direction":"row|row-reverse|column|column-reverse","flex-flow":"<'flex-direction'>||<'flex-wrap'>","flex-grow":"<number>","flex-shrink":"<number>","flex-wrap":"nowrap|wrap|wrap-reverse",float:"left|right|none|inline-start|inline-end",font:"[[<'font-style'>||<font-variant-css21>||<'font-weight'>||<'font-stretch'>]? <'font-size'> [/ <'line-height'>]? <'font-family'>]|caption|icon|menu|message-box|small-caption|status-bar","font-family":"[<family-name>|<generic-family>]#","font-feature-settings":"normal|<feature-tag-value>#","font-kerning":"auto|normal|none","font-language-override":"normal|<string>","font-optical-sizing":"auto|none","font-variation-settings":"normal|[<string> <number>]#","font-size":"<absolute-size>|<relative-size>|<length-percentage>","font-size-adjust":"none|<number>","font-smooth":"auto|never|always|<absolute-size>|<length>","font-stretch":"<font-stretch-absolute>","font-style":"normal|italic|oblique <angle>?","font-synthesis":"none|[weight||style]","font-variant":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]","font-variant-alternates":"normal|[stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )]","font-variant-caps":"normal|small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps","font-variant-east-asian":"normal|[<east-asian-variant-values>||<east-asian-width-values>||ruby]","font-variant-ligatures":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>]","font-variant-numeric":"normal|[<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero]","font-variant-position":"normal|sub|super","font-weight":"<font-weight-absolute>|bolder|lighter",gap:"<'row-gap'> <'column-gap'>?",grid:"<'grid-template'>|<'grid-template-rows'> / [auto-flow&&dense?] <'grid-auto-columns'>?|[auto-flow&&dense?] <'grid-auto-rows'>? / <'grid-template-columns'>","grid-area":"<grid-line> [/ <grid-line>]{0,3}","grid-auto-columns":"<track-size>+","grid-auto-flow":"[row|column]||dense","grid-auto-rows":"<track-size>+","grid-column":"<grid-line> [/ <grid-line>]?","grid-column-end":"<grid-line>","grid-column-gap":"<length-percentage>","grid-column-start":"<grid-line>","grid-gap":"<'grid-row-gap'> <'grid-column-gap'>?","grid-row":"<grid-line> [/ <grid-line>]?","grid-row-end":"<grid-line>","grid-row-gap":"<length-percentage>","grid-row-start":"<grid-line>","grid-template":"none|[<'grid-template-rows'> / <'grid-template-columns'>]|[<line-names>? <string> <track-size>? <line-names>?]+ [/ <explicit-track-list>]?","grid-template-areas":"none|<string>+","grid-template-columns":"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?","grid-template-rows":"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?","hanging-punctuation":"none|[first||[force-end|allow-end]||last]",height:"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )",hyphens:"none|manual|auto","image-orientation":"from-image|<angle>|[<angle>? flip]","image-rendering":"auto|crisp-edges|pixelated|optimizeSpeed|optimizeQuality|<-non-standard-image-rendering>","image-resolution":"[from-image||<resolution>]&&snap?","ime-mode":"auto|normal|active|inactive|disabled","initial-letter":"normal|[<number> <integer>?]","initial-letter-align":"[auto|alphabetic|hanging|ideographic]","inline-size":"<'width'>",inset:"<'top'>{1,4}","inset-block":"<'top'>{1,2}","inset-block-end":"<'top'>","inset-block-start":"<'top'>","inset-inline":"<'top'>{1,2}","inset-inline-end":"<'top'>","inset-inline-start":"<'top'>",isolation:"auto|isolate","justify-content":"normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]","justify-items":"normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]|legacy|legacy&&[left|right|center]","justify-self":"auto|normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]","justify-tracks":"[normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]]#",left:"<length>|<percentage>|auto","letter-spacing":"normal|<length-percentage>","line-break":"auto|loose|normal|strict|anywhere","line-clamp":"none|<integer>","line-height":"normal|<number>|<length>|<percentage>","line-height-step":"<length>","list-style":"<'list-style-type'>||<'list-style-position'>||<'list-style-image'>","list-style-image":"<url>|none","list-style-position":"inside|outside","list-style-type":"<counter-style>|<string>|none",margin:"[<length>|<percentage>|auto]{1,4}","margin-block":"<'margin-left'>{1,2}","margin-block-end":"<'margin-left'>","margin-block-start":"<'margin-left'>","margin-bottom":"<length>|<percentage>|auto","margin-inline":"<'margin-left'>{1,2}","margin-inline-end":"<'margin-left'>","margin-inline-start":"<'margin-left'>","margin-left":"<length>|<percentage>|auto","margin-right":"<length>|<percentage>|auto","margin-top":"<length>|<percentage>|auto","margin-trim":"none|in-flow|all",mask:"<mask-layer>#","mask-border":"<'mask-border-source'>||<'mask-border-slice'> [/ <'mask-border-width'>? [/ <'mask-border-outset'>]?]?||<'mask-border-repeat'>||<'mask-border-mode'>","mask-border-mode":"luminance|alpha","mask-border-outset":"[<length>|<number>]{1,4}","mask-border-repeat":"[stretch|repeat|round|space]{1,2}","mask-border-slice":"<number-percentage>{1,4} fill?","mask-border-source":"none|<image>","mask-border-width":"[<length-percentage>|<number>|auto]{1,4}","mask-clip":"[<geometry-box>|no-clip]#","mask-composite":"<compositing-operator>#","mask-image":"<mask-reference>#","mask-mode":"<masking-mode>#","mask-origin":"<geometry-box>#","mask-position":"<position>#","mask-repeat":"<repeat-style>#","mask-size":"<bg-size>#","mask-type":"luminance|alpha","masonry-auto-flow":"[pack|next]||[definite-first|ordered]","math-style":"normal|compact","max-block-size":"<'max-width'>","max-height":"none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )","max-inline-size":"<'max-width'>","max-lines":"none|<integer>","max-width":"none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>","min-block-size":"<'min-width'>","min-height":"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )","min-inline-size":"<'min-width'>","min-width":"auto|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>","mix-blend-mode":"<blend-mode>","object-fit":"fill|contain|cover|none|scale-down","object-position":"<position>",offset:"[<'offset-position'>? [<'offset-path'> [<'offset-distance'>||<'offset-rotate'>]?]?]! [/ <'offset-anchor'>]?","offset-anchor":"auto|<position>","offset-distance":"<length-percentage>","offset-path":"none|ray( [<angle>&&<size>&&contain?] )|<path()>|<url>|[<basic-shape>||<geometry-box>]","offset-position":"auto|<position>","offset-rotate":"[auto|reverse]||<angle>",opacity:"<alpha-value>",order:"<integer>",orphans:"<integer>",outline:"[<'outline-color'>||<'outline-style'>||<'outline-width'>]","outline-color":"<color>|invert","outline-offset":"<length>","outline-style":"auto|<'border-style'>","outline-width":"<line-width>",overflow:"[visible|hidden|clip|scroll|auto]{1,2}|<-non-standard-overflow>","overflow-anchor":"auto|none","overflow-block":"visible|hidden|clip|scroll|auto","overflow-clip-box":"padding-box|content-box","overflow-inline":"visible|hidden|clip|scroll|auto","overflow-wrap":"normal|break-word|anywhere","overflow-x":"visible|hidden|clip|scroll|auto","overflow-y":"visible|hidden|clip|scroll|auto","overscroll-behavior":"[contain|none|auto]{1,2}","overscroll-behavior-block":"contain|none|auto","overscroll-behavior-inline":"contain|none|auto","overscroll-behavior-x":"contain|none|auto","overscroll-behavior-y":"contain|none|auto",padding:"[<length>|<percentage>]{1,4}","padding-block":"<'padding-left'>{1,2}","padding-block-end":"<'padding-left'>","padding-block-start":"<'padding-left'>","padding-bottom":"<length>|<percentage>","padding-inline":"<'padding-left'>{1,2}","padding-inline-end":"<'padding-left'>","padding-inline-start":"<'padding-left'>","padding-left":"<length>|<percentage>","padding-right":"<length>|<percentage>","padding-top":"<length>|<percentage>","page-break-after":"auto|always|avoid|left|right|recto|verso","page-break-before":"auto|always|avoid|left|right|recto|verso","page-break-inside":"auto|avoid","paint-order":"normal|[fill||stroke||markers]",perspective:"none|<length>","perspective-origin":"<position>","place-content":"<'align-content'> <'justify-content'>?","place-items":"<'align-items'> <'justify-items'>?","place-self":"<'align-self'> <'justify-self'>?","pointer-events":"auto|none|visiblePainted|visibleFill|visibleStroke|visible|painted|fill|stroke|all|inherit",position:"static|relative|absolute|sticky|fixed|-webkit-sticky",quotes:"none|auto|[<string> <string>]+",resize:"none|both|horizontal|vertical|block|inline",right:"<length>|<percentage>|auto",rotate:"none|<angle>|[x|y|z|<number>{3}]&&<angle>","row-gap":"normal|<length-percentage>","ruby-align":"start|center|space-between|space-around","ruby-merge":"separate|collapse|auto","ruby-position":"over|under|inter-character",scale:"none|<number>{1,3}","scrollbar-color":"auto|dark|light|<color>{2}","scrollbar-gutter":"auto|[stable|always]&&both?&&force?","scrollbar-width":"auto|thin|none","scroll-behavior":"auto|smooth","scroll-margin":"<length>{1,4}","scroll-margin-block":"<length>{1,2}","scroll-margin-block-start":"<length>","scroll-margin-block-end":"<length>","scroll-margin-bottom":"<length>","scroll-margin-inline":"<length>{1,2}","scroll-margin-inline-start":"<length>","scroll-margin-inline-end":"<length>","scroll-margin-left":"<length>","scroll-margin-right":"<length>","scroll-margin-top":"<length>","scroll-padding":"[auto|<length-percentage>]{1,4}","scroll-padding-block":"[auto|<length-percentage>]{1,2}","scroll-padding-block-start":"auto|<length-percentage>","scroll-padding-block-end":"auto|<length-percentage>","scroll-padding-bottom":"auto|<length-percentage>","scroll-padding-inline":"[auto|<length-percentage>]{1,2}","scroll-padding-inline-start":"auto|<length-percentage>","scroll-padding-inline-end":"auto|<length-percentage>","scroll-padding-left":"auto|<length-percentage>","scroll-padding-right":"auto|<length-percentage>","scroll-padding-top":"auto|<length-percentage>","scroll-snap-align":"[none|start|end|center]{1,2}","scroll-snap-coordinate":"none|<position>#","scroll-snap-destination":"<position>","scroll-snap-points-x":"none|repeat( <length-percentage> )","scroll-snap-points-y":"none|repeat( <length-percentage> )","scroll-snap-stop":"normal|always","scroll-snap-type":"none|[x|y|block|inline|both] [mandatory|proximity]?","scroll-snap-type-x":"none|mandatory|proximity","scroll-snap-type-y":"none|mandatory|proximity","shape-image-threshold":"<alpha-value>","shape-margin":"<length-percentage>","shape-outside":"none|<shape-box>||<basic-shape>|<image>","tab-size":"<integer>|<length>","table-layout":"auto|fixed","text-align":"start|end|left|right|center|justify|match-parent","text-align-last":"auto|start|end|left|right|center|justify","text-combine-upright":"none|all|[digits <integer>?]","text-decoration":"<'text-decoration-line'>||<'text-decoration-style'>||<'text-decoration-color'>||<'text-decoration-thickness'>","text-decoration-color":"<color>","text-decoration-line":"none|[underline||overline||line-through||blink]|spelling-error|grammar-error","text-decoration-skip":"none|[objects||[spaces|[leading-spaces||trailing-spaces]]||edges||box-decoration]","text-decoration-skip-ink":"auto|all|none","text-decoration-style":"solid|double|dotted|dashed|wavy","text-decoration-thickness":"auto|from-font|<length>|<percentage>","text-emphasis":"<'text-emphasis-style'>||<'text-emphasis-color'>","text-emphasis-color":"<color>","text-emphasis-position":"[over|under]&&[right|left]","text-emphasis-style":"none|[[filled|open]||[dot|circle|double-circle|triangle|sesame]]|<string>","text-indent":"<length-percentage>&&hanging?&&each-line?","text-justify":"auto|inter-character|inter-word|none","text-orientation":"mixed|upright|sideways","text-overflow":"[clip|ellipsis|<string>]{1,2}","text-rendering":"auto|optimizeSpeed|optimizeLegibility|geometricPrecision","text-shadow":"none|<shadow-t>#","text-size-adjust":"none|auto|<percentage>","text-transform":"none|capitalize|uppercase|lowercase|full-width|full-size-kana","text-underline-offset":"auto|<length>|<percentage>","text-underline-position":"auto|from-font|[under||[left|right]]",top:"<length>|<percentage>|auto","touch-action":"auto|none|[[pan-x|pan-left|pan-right]||[pan-y|pan-up|pan-down]||pinch-zoom]|manipulation",transform:"none|<transform-list>","transform-box":"content-box|border-box|fill-box|stroke-box|view-box","transform-origin":"[<length-percentage>|left|center|right|top|bottom]|[[<length-percentage>|left|center|right]&&[<length-percentage>|top|center|bottom]] <length>?","transform-style":"flat|preserve-3d",transition:"<single-transition>#","transition-delay":"<time>#","transition-duration":"<time>#","transition-property":"none|<single-transition-property>#","transition-timing-function":"<timing-function>#",translate:"none|<length-percentage> [<length-percentage> <length>?]?","unicode-bidi":"normal|embed|isolate|bidi-override|isolate-override|plaintext|-moz-isolate|-moz-isolate-override|-moz-plaintext|-webkit-isolate|-webkit-isolate-override|-webkit-plaintext","user-select":"auto|text|none|contain|all","vertical-align":"baseline|sub|super|text-top|text-bottom|middle|top|bottom|<percentage>|<length>",visibility:"visible|hidden|collapse","white-space":"normal|pre|nowrap|pre-wrap|pre-line|break-spaces",widows:"<integer>",width:"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )","will-change":"auto|<animateable-feature>#","word-break":"normal|break-all|keep-all|break-word","word-spacing":"normal|<length-percentage>","word-wrap":"normal|break-word","writing-mode":"horizontal-tb|vertical-rl|vertical-lr|sideways-rl|sideways-lr|<svg-writing-mode>","z-index":"auto|<integer>",zoom:"normal|reset|<number>|<percentage>","-moz-background-clip":"padding|border","-moz-border-radius-bottomleft":"<'border-bottom-left-radius'>","-moz-border-radius-bottomright":"<'border-bottom-right-radius'>","-moz-border-radius-topleft":"<'border-top-left-radius'>","-moz-border-radius-topright":"<'border-bottom-right-radius'>","-moz-control-character-visibility":"visible|hidden","-moz-osx-font-smoothing":"auto|grayscale","-moz-user-select":"none|text|all|-moz-none","-ms-flex-align":"start|end|center|baseline|stretch","-ms-flex-item-align":"auto|start|end|center|baseline|stretch","-ms-flex-line-pack":"start|end|center|justify|distribute|stretch","-ms-flex-negative":"<'flex-shrink'>","-ms-flex-pack":"start|end|center|justify|distribute","-ms-flex-order":"<integer>","-ms-flex-positive":"<'flex-grow'>","-ms-flex-preferred-size":"<'flex-basis'>","-ms-interpolation-mode":"nearest-neighbor|bicubic","-ms-grid-column-align":"start|end|center|stretch","-ms-grid-row-align":"start|end|center|stretch","-ms-hyphenate-limit-last":"none|always|column|page|spread","-webkit-background-clip":"[<box>|border|padding|content|text]#","-webkit-column-break-after":"always|auto|avoid","-webkit-column-break-before":"always|auto|avoid","-webkit-column-break-inside":"always|auto|avoid","-webkit-font-smoothing":"auto|none|antialiased|subpixel-antialiased","-webkit-mask-box-image":"[<url>|<gradient>|none] [<length-percentage>{4} <-webkit-mask-box-repeat>{2}]?","-webkit-print-color-adjust":"economy|exact","-webkit-text-security":"none|circle|disc|square","-webkit-user-drag":"none|element|auto","-webkit-user-select":"auto|none|text|all","alignment-baseline":"auto|baseline|before-edge|text-before-edge|middle|central|after-edge|text-after-edge|ideographic|alphabetic|hanging|mathematical","baseline-shift":"baseline|sub|super|<svg-length>",behavior:"<url>+","clip-rule":"nonzero|evenodd",cue:"<'cue-before'> <'cue-after'>?","cue-after":"<url> <decibel>?|none","cue-before":"<url> <decibel>?|none","dominant-baseline":"auto|use-script|no-change|reset-size|ideographic|alphabetic|hanging|mathematical|central|middle|text-after-edge|text-before-edge",fill:"<paint>","fill-opacity":"<number-zero-one>","fill-rule":"nonzero|evenodd","glyph-orientation-horizontal":"<angle>","glyph-orientation-vertical":"<angle>",kerning:"auto|<svg-length>",marker:"none|<url>","marker-end":"none|<url>","marker-mid":"none|<url>","marker-start":"none|<url>",pause:"<'pause-before'> <'pause-after'>?","pause-after":"<time>|none|x-weak|weak|medium|strong|x-strong","pause-before":"<time>|none|x-weak|weak|medium|strong|x-strong",rest:"<'rest-before'> <'rest-after'>?","rest-after":"<time>|none|x-weak|weak|medium|strong|x-strong","rest-before":"<time>|none|x-weak|weak|medium|strong|x-strong","shape-rendering":"auto|optimizeSpeed|crispEdges|geometricPrecision",src:"[<url> [format( <string># )]?|local( <family-name> )]#",speak:"auto|none|normal","speak-as":"normal|spell-out||digits||[literal-punctuation|no-punctuation]",stroke:"<paint>","stroke-dasharray":"none|[<svg-length>+]#","stroke-dashoffset":"<svg-length>","stroke-linecap":"butt|round|square","stroke-linejoin":"miter|round|bevel","stroke-miterlimit":"<number-one-or-greater>","stroke-opacity":"<number-zero-one>","stroke-width":"<svg-length>","text-anchor":"start|middle|end","unicode-range":"<urange>#","voice-balance":"<number>|left|center|right|leftwards|rightwards","voice-duration":"auto|<time>","voice-family":"[[<family-name>|<generic-voice>] ,]* [<family-name>|<generic-voice>]|preserve","voice-pitch":"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]","voice-range":"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]","voice-rate":"[normal|x-slow|slow|medium|fast|x-fast]||<percentage>","voice-stress":"normal|strong|moderate|none|reduced","voice-volume":"silent|[[x-soft|soft|medium|loud|x-loud]||<decibel>]"},atrules:{charset:{prelude:"<string>",descriptors:null},"counter-style":{prelude:"<counter-style-name>",descriptors:{"additive-symbols":"[<integer>&&<symbol>]#",fallback:"<counter-style-name>",negative:"<symbol> <symbol>?",pad:"<integer>&&<symbol>",prefix:"<symbol>",range:"[[<integer>|infinite]{2}]#|auto","speak-as":"auto|bullets|numbers|words|spell-out|<counter-style-name>",suffix:"<symbol>",symbols:"<symbol>+",system:"cyclic|numeric|alphabetic|symbolic|additive|[fixed <integer>?]|[extends <counter-style-name>]"}},document:{prelude:"[<url>|url-prefix( <string> )|domain( <string> )|media-document( <string> )|regexp( <string> )]#",descriptors:null},"font-face":{prelude:null,descriptors:{"font-display":"[auto|block|swap|fallback|optional]","font-family":"<family-name>","font-feature-settings":"normal|<feature-tag-value>#","font-variation-settings":"normal|[<string> <number>]#","font-stretch":"<font-stretch-absolute>{1,2}","font-style":"normal|italic|oblique <angle>{0,2}","font-weight":"<font-weight-absolute>{1,2}","font-variant":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]",src:"[<url> [format( <string># )]?|local( <family-name> )]#","unicode-range":"<urange>#"}},"font-feature-values":{prelude:"<family-name>#",descriptors:null},import:{prelude:"[<string>|<url>] [<media-query-list>]?",descriptors:null},keyframes:{prelude:"<keyframes-name>",descriptors:null},media:{prelude:"<media-query-list>",descriptors:null},namespace:{prelude:"<namespace-prefix>? [<string>|<url>]",descriptors:null},page:{prelude:"<page-selector-list>",descriptors:{bleed:"auto|<length>",marks:"none|[crop||cross]",size:"<length>{1,2}|auto|[<page-size>||[portrait|landscape]]"}},property:{prelude:"<custom-property-name>",descriptors:{syntax:"<string>",inherits:"true|false","initial-value":"<string>"}},supports:{prelude:"<supports-condition>",descriptors:null},viewport:{prelude:null,descriptors:{height:"<viewport-length>{1,2}","max-height":"<viewport-length>","max-width":"<viewport-length>","max-zoom":"auto|<number>|<percentage>","min-height":"<viewport-length>","min-width":"<viewport-length>","min-zoom":"auto|<number>|<percentage>",orientation:"auto|portrait|landscape","user-zoom":"zoom|fixed","viewport-fit":"auto|contain|cover",width:"<viewport-length>{1,2}",zoom:"auto|<number>|<percentage>"}}}},Rr=Ce.cmpChar,Mr=Ce.isDigit,jr=Ce.TYPE,_r=jr.WhiteSpace,Fr=jr.Comment,Wr=jr.Ident,qr=jr.Number,Yr=jr.Dimension;function Ur(e,t){var n=this.scanner.tokenStart+e,r=this.scanner.source.charCodeAt(n);for(43!==r&&45!==r||(t&&this.error("Number sign is not allowed"),n++);n<this.scanner.tokenEnd;n++)Mr(this.scanner.source.charCodeAt(n))||this.error("Integer is expected",n);}function Hr(e){return Ur.call(this,0,e)}function Vr(e,t){if(!Rr(this.scanner.source,this.scanner.tokenStart+e,t)){var n="";switch(t){case 110:n="N is expected";break;case 45:n="HyphenMinus is expected";}this.error(n,this.scanner.tokenStart+e);}}function Kr(){for(var e=0,t=0,n=this.scanner.tokenType;n===_r||n===Fr;)n=this.scanner.lookupType(++e);if(n!==qr){if(!this.scanner.isDelim(43,e)&&!this.scanner.isDelim(45,e))return null;t=this.scanner.isDelim(43,e)?43:45;do{n=this.scanner.lookupType(++e);}while(n===_r||n===Fr);n!==qr&&(this.scanner.skip(e),Hr.call(this,!0));}return e>0&&this.scanner.skip(e),0===t&&43!==(n=this.scanner.source.charCodeAt(this.scanner.tokenStart))&&45!==n&&this.error("Number sign is expected"),Hr.call(this,0!==t),45===t?"-"+this.consume(qr):this.consume(qr)}var Gr={name:"AnPlusB",structure:{a:[String,null],b:[String,null]},parse:function(){var e=this.scanner.tokenStart,t=null,n=null;if(this.scanner.tokenType===qr)Hr.call(this,!1),n=this.consume(qr);else if(this.scanner.tokenType===Wr&&Rr(this.scanner.source,this.scanner.tokenStart,45))switch(t="-1",Vr.call(this,1,110),this.scanner.getTokenLength()){case 2:this.scanner.next(),n=Kr.call(this);break;case 3:Vr.call(this,2,45),this.scanner.next(),this.scanner.skipSC(),Hr.call(this,!0),n="-"+this.consume(qr);break;default:Vr.call(this,2,45),Ur.call(this,3,!0),this.scanner.next(),n=this.scanner.substrToCursor(e+2);}else if(this.scanner.tokenType===Wr||this.scanner.isDelim(43)&&this.scanner.lookupType(1)===Wr){var r=0;switch(t="1",this.scanner.isDelim(43)&&(r=1,this.scanner.next()),Vr.call(this,0,110),this.scanner.getTokenLength()){case 1:this.scanner.next(),n=Kr.call(this);break;case 2:Vr.call(this,1,45),this.scanner.next(),this.scanner.skipSC(),Hr.call(this,!0),n="-"+this.consume(qr);break;default:Vr.call(this,1,45),Ur.call(this,2,!0),this.scanner.next(),n=this.scanner.substrToCursor(e+r+1);}}else if(this.scanner.tokenType===Yr){for(var i=this.scanner.source.charCodeAt(this.scanner.tokenStart),a=(r=43===i||45===i,this.scanner.tokenStart+r);a<this.scanner.tokenEnd&&Mr(this.scanner.source.charCodeAt(a));a++);a===this.scanner.tokenStart+r&&this.error("Integer is expected",this.scanner.tokenStart+r),Vr.call(this,a-this.scanner.tokenStart,110),t=this.scanner.source.substring(e,a),a+1===this.scanner.tokenEnd?(this.scanner.next(),n=Kr.call(this)):(Vr.call(this,a-this.scanner.tokenStart+1,45),a+2===this.scanner.tokenEnd?(this.scanner.next(),this.scanner.skipSC(),Hr.call(this,!0),n="-"+this.consume(qr)):(Ur.call(this,a-this.scanner.tokenStart+2,!0),this.scanner.next(),n=this.scanner.substrToCursor(a+1)));}else this.error();return null!==t&&43===t.charCodeAt(0)&&(t=t.substr(1)),null!==n&&43===n.charCodeAt(0)&&(n=n.substr(1)),{type:"AnPlusB",loc:this.getLocation(e,this.scanner.tokenStart),a:t,b:n}},generate:function(e){var t=null!==e.a&&void 0!==e.a,n=null!==e.b&&void 0!==e.b;t?(this.chunk("+1"===e.a?"+n":"1"===e.a?"n":"-1"===e.a?"-n":e.a+"n"),n&&("-"===(n=String(e.b)).charAt(0)||"+"===n.charAt(0)?(this.chunk(n.charAt(0)),this.chunk(n.substr(1))):(this.chunk("+"),this.chunk(n)))):this.chunk(String(e.b));}},Qr=Ce.TYPE,Xr=Qr.WhiteSpace,Zr=Qr.Semicolon,$r=Qr.LeftCurlyBracket,Jr=Qr.Delim;function ei(){return this.scanner.tokenIndex>0&&this.scanner.lookupType(-1)===Xr?this.scanner.tokenIndex>1?this.scanner.getTokenStart(this.scanner.tokenIndex-1):this.scanner.firstCharOffset:this.scanner.tokenStart}function ti(){return 0}var ni={name:"Raw",structure:{value:String},parse:function(e,t,n){var r,i=this.scanner.getTokenStart(e);return this.scanner.skip(this.scanner.getRawLength(e,t||ti)),r=n&&this.scanner.tokenStart>i?ei.call(this):this.scanner.tokenStart,{type:"Raw",loc:this.getLocation(i,r),value:this.scanner.source.substring(i,r)}},generate:function(e){this.chunk(e.value);},mode:{default:ti,leftCurlyBracket:function(e){return e===$r?1:0},leftCurlyBracketOrSemicolon:function(e){return e===$r||e===Zr?1:0},exclamationMarkOrSemicolon:function(e,t,n){return e===Jr&&33===t.charCodeAt(n)||e===Zr?1:0},semicolonIncluded:function(e){return e===Zr?2:0}}},ri=Ce.TYPE,ii=ni.mode,ai=ri.AtKeyword,oi=ri.Semicolon,si=ri.LeftCurlyBracket,li=ri.RightCurlyBracket;function ci(e){return this.Raw(e,ii.leftCurlyBracketOrSemicolon,!0)}function ui(){for(var e,t=1;e=this.scanner.lookupType(t);t++){if(e===li)return !0;if(e===si||e===ai)return !1}return !1}var hi={name:"Atrule",structure:{name:String,prelude:["AtrulePrelude","Raw",null],block:["Block",null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null,i=null;switch(this.eat(ai),t=(e=this.scanner.substrToCursor(n+1)).toLowerCase(),this.scanner.skipSC(),!1===this.scanner.eof&&this.scanner.tokenType!==si&&this.scanner.tokenType!==oi&&(this.parseAtrulePrelude?"AtrulePrelude"===(r=this.parseWithFallback(this.AtrulePrelude.bind(this,e),ci)).type&&null===r.children.head&&(r=null):r=ci.call(this,this.scanner.tokenIndex),this.scanner.skipSC()),this.scanner.tokenType){case oi:this.scanner.next();break;case si:i=this.atrule.hasOwnProperty(t)&&"function"==typeof this.atrule[t].block?this.atrule[t].block.call(this):this.Block(ui.call(this));}return {type:"Atrule",loc:this.getLocation(n,this.scanner.tokenStart),name:e,prelude:r,block:i}},generate:function(e){this.chunk("@"),this.chunk(e.name),null!==e.prelude&&(this.chunk(" "),this.node(e.prelude)),e.block?this.node(e.block):this.chunk(";");},walkContext:"atrule"},pi=Ce.TYPE,di=pi.Semicolon,mi=pi.LeftCurlyBracket,gi={name:"AtrulePrelude",structure:{children:[[]]},parse:function(e){var t=null;return null!==e&&(e=e.toLowerCase()),this.scanner.skipSC(),t=this.atrule.hasOwnProperty(e)&&"function"==typeof this.atrule[e].prelude?this.atrule[e].prelude.call(this):this.readSequence(this.scope.AtrulePrelude),this.scanner.skipSC(),!0!==this.scanner.eof&&this.scanner.tokenType!==mi&&this.scanner.tokenType!==di&&this.error("Semicolon or block is expected"),null===t&&(t=this.createList()),{type:"AtrulePrelude",loc:this.getLocationFromList(t),children:t}},generate:function(e){this.children(e);},walkContext:"atrulePrelude"},fi=Ce.TYPE,bi=fi.Ident,yi=fi.String,ki=fi.Colon,vi=fi.LeftSquareBracket,xi=fi.RightSquareBracket;function wi(){this.scanner.eof&&this.error("Unexpected end of input");var e=this.scanner.tokenStart,t=!1,n=!0;return this.scanner.isDelim(42)?(t=!0,n=!1,this.scanner.next()):this.scanner.isDelim(124)||this.eat(bi),this.scanner.isDelim(124)?61!==this.scanner.source.charCodeAt(this.scanner.tokenStart+1)?(this.scanner.next(),this.eat(bi)):t&&this.error("Identifier is expected",this.scanner.tokenEnd):t&&this.error("Vertical line is expected"),n&&this.scanner.tokenType===ki&&(this.scanner.next(),this.eat(bi)),{type:"Identifier",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}}function Si(){var e=this.scanner.tokenStart,t=this.scanner.source.charCodeAt(e);return 61!==t&&126!==t&&94!==t&&36!==t&&42!==t&&124!==t&&this.error("Attribute selector (=, ~=, ^=, $=, *=, |=) is expected"),this.scanner.next(),61!==t&&(this.scanner.isDelim(61)||this.error("Equal sign is expected"),this.scanner.next()),this.scanner.substrToCursor(e)}var Ci={name:"AttributeSelector",structure:{name:"Identifier",matcher:[String,null],value:["String","Identifier",null],flags:[String,null]},parse:function(){var e,t=this.scanner.tokenStart,n=null,r=null,i=null;return this.eat(vi),this.scanner.skipSC(),e=wi.call(this),this.scanner.skipSC(),this.scanner.tokenType!==xi&&(this.scanner.tokenType!==bi&&(n=Si.call(this),this.scanner.skipSC(),r=this.scanner.tokenType===yi?this.String():this.Identifier(),this.scanner.skipSC()),this.scanner.tokenType===bi&&(i=this.scanner.getTokenValue(),this.scanner.next(),this.scanner.skipSC())),this.eat(xi),{type:"AttributeSelector",loc:this.getLocation(t,this.scanner.tokenStart),name:e,matcher:n,value:r,flags:i}},generate:function(e){var t=" ";this.chunk("["),this.node(e.name),null!==e.matcher&&(this.chunk(e.matcher),null!==e.value&&(this.node(e.value),"String"===e.value.type&&(t=""))),null!==e.flags&&(this.chunk(t),this.chunk(e.flags)),this.chunk("]");}},zi=Ce.TYPE,Ai=ni.mode,Pi=zi.WhiteSpace,Ti=zi.Comment,Li=zi.Semicolon,Ei=zi.AtKeyword,Di=zi.LeftCurlyBracket,Oi=zi.RightCurlyBracket;function Bi(e){return this.Raw(e,null,!0)}function Ii(){return this.parseWithFallback(this.Rule,Bi)}function Ni(e){return this.Raw(e,Ai.semicolonIncluded,!0)}function Ri(){if(this.scanner.tokenType===Li)return Ni.call(this,this.scanner.tokenIndex);var e=this.parseWithFallback(this.Declaration,Ni);return this.scanner.tokenType===Li&&this.scanner.next(),e}var Mi={name:"Block",structure:{children:[["Atrule","Rule","Declaration"]]},parse:function(e){var t=e?Ri:Ii,n=this.scanner.tokenStart,r=this.createList();this.eat(Di);e:for(;!this.scanner.eof;)switch(this.scanner.tokenType){case Oi:break e;case Pi:case Ti:this.scanner.next();break;case Ei:r.push(this.parseWithFallback(this.Atrule,Bi));break;default:r.push(t.call(this));}return this.scanner.eof||this.eat(Oi),{type:"Block",loc:this.getLocation(n,this.scanner.tokenStart),children:r}},generate:function(e){this.chunk("{"),this.children(e,(function(e){"Declaration"===e.type&&this.chunk(";");})),this.chunk("}");},walkContext:"block"},ji=Ce.TYPE,_i=ji.LeftSquareBracket,Fi=ji.RightSquareBracket,Wi={name:"Brackets",structure:{children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart;return this.eat(_i),n=e.call(this,t),this.scanner.eof||this.eat(Fi),{type:"Brackets",loc:this.getLocation(r,this.scanner.tokenStart),children:n}},generate:function(e){this.chunk("["),this.children(e),this.chunk("]");}},qi=Ce.TYPE.CDC,Yi={name:"CDC",structure:[],parse:function(){var e=this.scanner.tokenStart;return this.eat(qi),{type:"CDC",loc:this.getLocation(e,this.scanner.tokenStart)}},generate:function(){this.chunk("--\x3e");}},Ui=Ce.TYPE.CDO,Hi={name:"CDO",structure:[],parse:function(){var e=this.scanner.tokenStart;return this.eat(Ui),{type:"CDO",loc:this.getLocation(e,this.scanner.tokenStart)}},generate:function(){this.chunk("\x3c!--");}},Vi=Ce.TYPE.Ident,Ki={name:"ClassSelector",structure:{name:String},parse:function(){return this.scanner.isDelim(46)||this.error("Full stop is expected"),this.scanner.next(),{type:"ClassSelector",loc:this.getLocation(this.scanner.tokenStart-1,this.scanner.tokenEnd),name:this.consume(Vi)}},generate:function(e){this.chunk("."),this.chunk(e.name);}},Gi=Ce.TYPE.Ident,Qi={name:"Combinator",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 62:case 43:case 126:this.scanner.next();break;case 47:this.scanner.next(),this.scanner.tokenType===Gi&&!1!==this.scanner.lookupValue(0,"deep")||this.error("Identifier `deep` is expected"),this.scanner.next(),this.scanner.isDelim(47)||this.error("Solidus is expected"),this.scanner.next();break;default:this.error("Combinator is expected");}return {type:"Combinator",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.name);}},Xi=Ce.TYPE.Comment,Zi={name:"Comment",structure:{value:String},parse:function(){var e=this.scanner.tokenStart,t=this.scanner.tokenEnd;return this.eat(Xi),t-e+2>=2&&42===this.scanner.source.charCodeAt(t-2)&&47===this.scanner.source.charCodeAt(t-1)&&(t-=2),{type:"Comment",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e+2,t)}},generate:function(e){this.chunk("/*"),this.chunk(e.value),this.chunk("*/");}},$i=ae.isCustomProperty,Ji=Ce.TYPE,ea=ni.mode,ta=Ji.Ident,na=Ji.Hash,ra=Ji.Colon,ia=Ji.Semicolon,aa=Ji.Delim,oa=Ji.WhiteSpace;function sa(e){return this.Raw(e,ea.exclamationMarkOrSemicolon,!0)}function la(e){return this.Raw(e,ea.exclamationMarkOrSemicolon,!1)}function ca(){var e=this.scanner.tokenIndex,t=this.Value();return "Raw"!==t.type&&!1===this.scanner.eof&&this.scanner.tokenType!==ia&&!1===this.scanner.isDelim(33)&&!1===this.scanner.isBalanceEdge(e)&&this.error(),t}var ua={name:"Declaration",structure:{important:[Boolean,String],property:String,value:["Value","Raw"]},parse:function(){var e,t=this.scanner.tokenStart,n=this.scanner.tokenIndex,r=ha.call(this),i=$i(r),a=i?this.parseCustomProperty:this.parseValue,o=i?la:sa,s=!1;this.scanner.skipSC(),this.eat(ra);const l=this.scanner.tokenIndex;if(i||this.scanner.skipSC(),e=a?this.parseWithFallback(ca,o):o.call(this,this.scanner.tokenIndex),i&&"Value"===e.type&&e.children.isEmpty())for(let t=l-this.scanner.tokenIndex;t<=0;t++)if(this.scanner.lookupType(t)===oa){e.children.appendData({type:"WhiteSpace",loc:null,value:" "});break}return this.scanner.isDelim(33)&&(s=pa.call(this),this.scanner.skipSC()),!1===this.scanner.eof&&this.scanner.tokenType!==ia&&!1===this.scanner.isBalanceEdge(n)&&this.error(),{type:"Declaration",loc:this.getLocation(t,this.scanner.tokenStart),important:s,property:r,value:e}},generate:function(e){this.chunk(e.property),this.chunk(":"),this.node(e.value),e.important&&this.chunk(!0===e.important?"!important":"!"+e.important);},walkContext:"declaration"};function ha(){var e=this.scanner.tokenStart;if(this.scanner.tokenType===aa)switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 42:case 36:case 43:case 35:case 38:this.scanner.next();break;case 47:this.scanner.next(),this.scanner.isDelim(47)&&this.scanner.next();}return this.scanner.tokenType===na?this.eat(na):this.eat(ta),this.scanner.substrToCursor(e)}function pa(){this.eat(aa),this.scanner.skipSC();var e=this.consume(ta);return "important"===e||e}var da=Ce.TYPE,ma=ni.mode,ga=da.WhiteSpace,fa=da.Comment,ba=da.Semicolon;function ya(e){return this.Raw(e,ma.semicolonIncluded,!0)}var ka={name:"DeclarationList",structure:{children:[["Declaration"]]},parse:function(){for(var e=this.createList();!this.scanner.eof;)switch(this.scanner.tokenType){case ga:case fa:case ba:this.scanner.next();break;default:e.push(this.parseWithFallback(this.Declaration,ya));}return {type:"DeclarationList",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e,(function(e){"Declaration"===e.type&&this.chunk(";");}));}},va=M.consumeNumber,xa=Ce.TYPE.Dimension,wa={name:"Dimension",structure:{value:String,unit:String},parse:function(){var e=this.scanner.tokenStart,t=va(this.scanner.source,e);return this.eat(xa),{type:"Dimension",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e,t),unit:this.scanner.source.substring(t,this.scanner.tokenStart)}},generate:function(e){this.chunk(e.value),this.chunk(e.unit);}},Sa=Ce.TYPE.RightParenthesis,Ca={name:"Function",structure:{name:String,children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart,i=this.consumeFunctionName(),a=i.toLowerCase();return n=t.hasOwnProperty(a)?t[a].call(this,t):e.call(this,t),this.scanner.eof||this.eat(Sa),{type:"Function",loc:this.getLocation(r,this.scanner.tokenStart),name:i,children:n}},generate:function(e){this.chunk(e.name),this.chunk("("),this.children(e),this.chunk(")");},walkContext:"function"},za=Ce.TYPE.Hash,Aa={name:"Hash",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return this.eat(za),{type:"Hash",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e+1)}},generate:function(e){this.chunk("#"),this.chunk(e.value);}},Pa=Ce.TYPE.Ident,Ta={name:"Identifier",structure:{name:String},parse:function(){return {type:"Identifier",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),name:this.consume(Pa)}},generate:function(e){this.chunk(e.name);}},La=Ce.TYPE.Hash,Ea={name:"IdSelector",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;return this.eat(La),{type:"IdSelector",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e+1)}},generate:function(e){this.chunk("#"),this.chunk(e.name);}},Da=Ce.TYPE,Oa=Da.Ident,Ba=Da.Number,Ia=Da.Dimension,Na=Da.LeftParenthesis,Ra=Da.RightParenthesis,Ma=Da.Colon,ja=Da.Delim,_a={name:"MediaFeature",structure:{name:String,value:["Identifier","Number","Dimension","Ratio",null]},parse:function(){var e,t=this.scanner.tokenStart,n=null;if(this.eat(Na),this.scanner.skipSC(),e=this.consume(Oa),this.scanner.skipSC(),this.scanner.tokenType!==Ra){switch(this.eat(Ma),this.scanner.skipSC(),this.scanner.tokenType){case Ba:n=this.lookupNonWSType(1)===ja?this.Ratio():this.Number();break;case Ia:n=this.Dimension();break;case Oa:n=this.Identifier();break;default:this.error("Number, dimension, ratio or identifier is expected");}this.scanner.skipSC();}return this.eat(Ra),{type:"MediaFeature",loc:this.getLocation(t,this.scanner.tokenStart),name:e,value:n}},generate:function(e){this.chunk("("),this.chunk(e.name),null!==e.value&&(this.chunk(":"),this.node(e.value)),this.chunk(")");}},Fa=Ce.TYPE,Wa=Fa.WhiteSpace,qa=Fa.Comment,Ya=Fa.Ident,Ua=Fa.LeftParenthesis,Ha={name:"MediaQuery",structure:{children:[["Identifier","MediaFeature","WhiteSpace"]]},parse:function(){this.scanner.skipSC();var e=this.createList(),t=null,n=null;e:for(;!this.scanner.eof;){switch(this.scanner.tokenType){case qa:this.scanner.next();continue;case Wa:n=this.WhiteSpace();continue;case Ya:t=this.Identifier();break;case Ua:t=this.MediaFeature();break;default:break e}null!==n&&(e.push(n),n=null),e.push(t);}return null===t&&this.error("Identifier or parenthesis is expected"),{type:"MediaQuery",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e);}},Va=Ce.TYPE.Comma,Ka={name:"MediaQueryList",structure:{children:[["MediaQuery"]]},parse:function(e){var t=this.createList();for(this.scanner.skipSC();!this.scanner.eof&&(t.push(this.MediaQuery(e)),this.scanner.tokenType===Va);)this.scanner.next();return {type:"MediaQueryList",loc:this.getLocationFromList(t),children:t}},generate:function(e){this.children(e,(function(){this.chunk(",");}));}},Ga=Ce.TYPE.Number,Qa={name:"Number",structure:{value:String},parse:function(){return {type:"Number",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),value:this.consume(Ga)}},generate:function(e){this.chunk(e.value);}},Xa={name:"Operator",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return this.scanner.next(),{type:"Operator",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.value);}},Za=Ce.TYPE,$a=Za.LeftParenthesis,Ja=Za.RightParenthesis,eo={name:"Parentheses",structure:{children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart;return this.eat($a),n=e.call(this,t),this.scanner.eof||this.eat(Ja),{type:"Parentheses",loc:this.getLocation(r,this.scanner.tokenStart),children:n}},generate:function(e){this.chunk("("),this.children(e),this.chunk(")");}},to=M.consumeNumber,no=Ce.TYPE.Percentage,ro={name:"Percentage",structure:{value:String},parse:function(){var e=this.scanner.tokenStart,t=to(this.scanner.source,e);return this.eat(no),{type:"Percentage",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e,t)}},generate:function(e){this.chunk(e.value),this.chunk("%");}},io=Ce.TYPE,ao=io.Ident,oo=io.Function,so=io.Colon,lo=io.RightParenthesis,co={name:"PseudoClassSelector",structure:{name:String,children:[["Raw"],null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null;return this.eat(so),this.scanner.tokenType===oo?(t=(e=this.consumeFunctionName()).toLowerCase(),this.pseudo.hasOwnProperty(t)?(this.scanner.skipSC(),r=this.pseudo[t].call(this),this.scanner.skipSC()):(r=this.createList()).push(this.Raw(this.scanner.tokenIndex,null,!1)),this.eat(lo)):e=this.consume(ao),{type:"PseudoClassSelector",loc:this.getLocation(n,this.scanner.tokenStart),name:e,children:r}},generate:function(e){this.chunk(":"),this.chunk(e.name),null!==e.children&&(this.chunk("("),this.children(e),this.chunk(")"));},walkContext:"function"},uo=Ce.TYPE,ho=uo.Ident,po=uo.Function,mo=uo.Colon,go=uo.RightParenthesis,fo={name:"PseudoElementSelector",structure:{name:String,children:[["Raw"],null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null;return this.eat(mo),this.eat(mo),this.scanner.tokenType===po?(t=(e=this.consumeFunctionName()).toLowerCase(),this.pseudo.hasOwnProperty(t)?(this.scanner.skipSC(),r=this.pseudo[t].call(this),this.scanner.skipSC()):(r=this.createList()).push(this.Raw(this.scanner.tokenIndex,null,!1)),this.eat(go)):e=this.consume(ho),{type:"PseudoElementSelector",loc:this.getLocation(n,this.scanner.tokenStart),name:e,children:r}},generate:function(e){this.chunk("::"),this.chunk(e.name),null!==e.children&&(this.chunk("("),this.children(e),this.chunk(")"));},walkContext:"function"},bo=Ce.isDigit,yo=Ce.TYPE,ko=yo.Number,vo=yo.Delim;function xo(){this.scanner.skipWS();for(var e=this.consume(ko),t=0;t<e.length;t++){var n=e.charCodeAt(t);bo(n)||46===n||this.error("Unsigned number is expected",this.scanner.tokenStart-e.length+t);}return 0===Number(e)&&this.error("Zero number is not allowed",this.scanner.tokenStart-e.length),e}var wo={name:"Ratio",structure:{left:String,right:String},parse:function(){var e,t=this.scanner.tokenStart,n=xo.call(this);return this.scanner.skipWS(),this.scanner.isDelim(47)||this.error("Solidus is expected"),this.eat(vo),e=xo.call(this),{type:"Ratio",loc:this.getLocation(t,this.scanner.tokenStart),left:n,right:e}},generate:function(e){this.chunk(e.left),this.chunk("/"),this.chunk(e.right);}},So=Ce.TYPE,Co=ni.mode,zo=So.LeftCurlyBracket;function Ao(e){return this.Raw(e,Co.leftCurlyBracket,!0)}function Po(){var e=this.SelectorList();return "Raw"!==e.type&&!1===this.scanner.eof&&this.scanner.tokenType!==zo&&this.error(),e}var To={name:"Rule",structure:{prelude:["SelectorList","Raw"],block:["Block"]},parse:function(){var e,t,n=this.scanner.tokenIndex,r=this.scanner.tokenStart;return e=this.parseRulePrelude?this.parseWithFallback(Po,Ao):Ao.call(this,n),t=this.Block(!0),{type:"Rule",loc:this.getLocation(r,this.scanner.tokenStart),prelude:e,block:t}},generate:function(e){this.node(e.prelude),this.node(e.block);},walkContext:"rule"},Lo=Ce.TYPE.Comma,Eo={name:"SelectorList",structure:{children:[["Selector","Raw"]]},parse:function(){for(var e=this.createList();!this.scanner.eof&&(e.push(this.Selector()),this.scanner.tokenType===Lo);)this.scanner.next();return {type:"SelectorList",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e,(function(){this.chunk(",");}));},walkContext:"selector"},Do=Ce.TYPE.String,Oo={name:"String",structure:{value:String},parse:function(){return {type:"String",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),value:this.consume(Do)}},generate:function(e){this.chunk(e.value);}},Bo=Ce.TYPE,Io=Bo.WhiteSpace,No=Bo.Comment,Ro=Bo.AtKeyword,Mo=Bo.CDO,jo=Bo.CDC;function _o(e){return this.Raw(e,null,!1)}var Fo={name:"StyleSheet",structure:{children:[["Comment","CDO","CDC","Atrule","Rule","Raw"]]},parse:function(){for(var e,t=this.scanner.tokenStart,n=this.createList();!this.scanner.eof;){switch(this.scanner.tokenType){case Io:this.scanner.next();continue;case No:if(33!==this.scanner.source.charCodeAt(this.scanner.tokenStart+2)){this.scanner.next();continue}e=this.Comment();break;case Mo:e=this.CDO();break;case jo:e=this.CDC();break;case Ro:e=this.parseWithFallback(this.Atrule,_o);break;default:e=this.parseWithFallback(this.Rule,_o);}n.push(e);}return {type:"StyleSheet",loc:this.getLocation(t,this.scanner.tokenStart),children:n}},generate:function(e){this.children(e);},walkContext:"stylesheet"},Wo=Ce.TYPE.Ident;function qo(){this.scanner.tokenType!==Wo&&!1===this.scanner.isDelim(42)&&this.error("Identifier or asterisk is expected"),this.scanner.next();}var Yo={name:"TypeSelector",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;return this.scanner.isDelim(124)?(this.scanner.next(),qo.call(this)):(qo.call(this),this.scanner.isDelim(124)&&(this.scanner.next(),qo.call(this))),{type:"TypeSelector",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.name);}},Uo=Ce.isHexDigit,Ho=Ce.cmpChar,Vo=Ce.TYPE,Ko=Ce.NAME,Go=Vo.Ident,Qo=Vo.Number,Xo=Vo.Dimension;function Zo(e,t){for(var n=this.scanner.tokenStart+e,r=0;n<this.scanner.tokenEnd;n++){var i=this.scanner.source.charCodeAt(n);if(45===i&&t&&0!==r)return 0===Zo.call(this,e+r+1,!1)&&this.error(),-1;Uo(i)||this.error(t&&0!==r?"HyphenMinus"+(r<6?" or hex digit":"")+" is expected":r<6?"Hex digit is expected":"Unexpected input",n),++r>6&&this.error("Too many hex digits",n);}return this.scanner.next(),r}function $o(e){for(var t=0;this.scanner.isDelim(63);)++t>e&&this.error("Too many question marks"),this.scanner.next();}function Jo(e){this.scanner.source.charCodeAt(this.scanner.tokenStart)!==e&&this.error(Ko[e]+" is expected");}function es(){var e=0;return this.scanner.isDelim(43)?(this.scanner.next(),this.scanner.tokenType===Go?void((e=Zo.call(this,0,!0))>0&&$o.call(this,6-e)):this.scanner.isDelim(63)?(this.scanner.next(),void $o.call(this,5)):void this.error("Hex digit or question mark is expected")):this.scanner.tokenType===Qo?(Jo.call(this,43),e=Zo.call(this,1,!0),this.scanner.isDelim(63)?void $o.call(this,6-e):this.scanner.tokenType===Xo||this.scanner.tokenType===Qo?(Jo.call(this,45),void Zo.call(this,1,!1)):void 0):this.scanner.tokenType===Xo?(Jo.call(this,43),void((e=Zo.call(this,1,!0))>0&&$o.call(this,6-e))):void this.error()}var ts={name:"UnicodeRange",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return Ho(this.scanner.source,e,117)||this.error("U is expected"),Ho(this.scanner.source,e+1,43)||this.error("Plus sign is expected"),this.scanner.next(),es.call(this),{type:"UnicodeRange",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.value);}},ns=Ce.isWhiteSpace,rs=Ce.cmpStr,is=Ce.TYPE,as=is.Function,os=is.Url,ss=is.RightParenthesis,ls={name:"Url",structure:{value:["String","Raw"]},parse:function(){var e,t=this.scanner.tokenStart;switch(this.scanner.tokenType){case os:for(var n=t+4,r=this.scanner.tokenEnd-1;n<r&&ns(this.scanner.source.charCodeAt(n));)n++;for(;n<r&&ns(this.scanner.source.charCodeAt(r-1));)r--;e={type:"Raw",loc:this.getLocation(n,r),value:this.scanner.source.substring(n,r)},this.eat(os);break;case as:rs(this.scanner.source,this.scanner.tokenStart,this.scanner.tokenEnd,"url(")||this.error("Function name must be `url`"),this.eat(as),this.scanner.skipSC(),e=this.String(),this.scanner.skipSC(),this.eat(ss);break;default:this.error("Url or Function is expected");}return {type:"Url",loc:this.getLocation(t,this.scanner.tokenStart),value:e}},generate:function(e){this.chunk("url"),this.chunk("("),this.node(e.value),this.chunk(")");}},cs=Ce.TYPE.WhiteSpace,us=Object.freeze({type:"WhiteSpace",loc:null,value:" "}),hs={AnPlusB:Gr,Atrule:hi,AtrulePrelude:gi,AttributeSelector:Ci,Block:Mi,Brackets:Wi,CDC:Yi,CDO:Hi,ClassSelector:Ki,Combinator:Qi,Comment:Zi,Declaration:ua,DeclarationList:ka,Dimension:wa,Function:Ca,Hash:Aa,Identifier:Ta,IdSelector:Ea,MediaFeature:_a,MediaQuery:Ha,MediaQueryList:Ka,Nth:{name:"Nth",structure:{nth:["AnPlusB","Identifier"],selector:["SelectorList",null]},parse:function(e){this.scanner.skipSC();var t,n=this.scanner.tokenStart,r=n,i=null;return t=this.scanner.lookupValue(0,"odd")||this.scanner.lookupValue(0,"even")?this.Identifier():this.AnPlusB(),this.scanner.skipSC(),e&&this.scanner.lookupValue(0,"of")?(this.scanner.next(),i=this.SelectorList(),this.needPositions&&(r=this.getLastListNode(i.children).loc.end.offset)):this.needPositions&&(r=t.loc.end.offset),{type:"Nth",loc:this.getLocation(n,r),nth:t,selector:i}},generate:function(e){this.node(e.nth),null!==e.selector&&(this.chunk(" of "),this.node(e.selector));}},Number:Qa,Operator:Xa,Parentheses:eo,Percentage:ro,PseudoClassSelector:co,PseudoElementSelector:fo,Ratio:wo,Raw:ni,Rule:To,Selector:{name:"Selector",structure:{children:[["TypeSelector","IdSelector","ClassSelector","AttributeSelector","PseudoClassSelector","PseudoElementSelector","Combinator","WhiteSpace"]]},parse:function(){var e=this.readSequence(this.scope.Selector);return null===this.getFirstListNode(e)&&this.error("Selector is expected"),{type:"Selector",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e);}},SelectorList:Eo,String:Oo,StyleSheet:Fo,TypeSelector:Yo,UnicodeRange:ts,Url:ls,Value:{name:"Value",structure:{children:[[]]},parse:function(){var e=this.scanner.tokenStart,t=this.readSequence(this.scope.Value);return {type:"Value",loc:this.getLocation(e,this.scanner.tokenStart),children:t}},generate:function(e){this.children(e);}},WhiteSpace:{name:"WhiteSpace",structure:{value:String},parse:function(){return this.eat(cs),us},generate:function(e){this.chunk(e.value);}}},ps={generic:!0,types:Nr.types,atrules:Nr.atrules,properties:Nr.properties,node:hs},ds=Ce.cmpChar,ms=Ce.cmpStr,gs=Ce.TYPE,fs=gs.Ident,bs=gs.String,ys=gs.Number,ks=gs.Function,vs=gs.Url,xs=gs.Hash,ws=gs.Dimension,Ss=gs.Percentage,Cs=gs.LeftParenthesis,zs=gs.LeftSquareBracket,As=gs.Comma,Ps=gs.Delim,Ts=function(e){switch(this.scanner.tokenType){case xs:return this.Hash();case As:return e.space=null,e.ignoreWSAfter=!0,this.Operator();case Cs:return this.Parentheses(this.readSequence,e.recognizer);case zs:return this.Brackets(this.readSequence,e.recognizer);case bs:return this.String();case ws:return this.Dimension();case Ss:return this.Percentage();case ys:return this.Number();case ks:return ms(this.scanner.source,this.scanner.tokenStart,this.scanner.tokenEnd,"url(")?this.Url():this.Function(this.readSequence,e.recognizer);case vs:return this.Url();case fs:return ds(this.scanner.source,this.scanner.tokenStart,117)&&ds(this.scanner.source,this.scanner.tokenStart+1,43)?this.UnicodeRange():this.Identifier();case Ps:var t=this.scanner.source.charCodeAt(this.scanner.tokenStart);if(47===t||42===t||43===t||45===t)return this.Operator();35===t&&this.error("Hex or identifier is expected",this.scanner.tokenStart+1);}},Ls={getNode:Ts},Es=Ce.TYPE,Ds=Es.Delim,Os=Es.Ident,Bs=Es.Dimension,Is=Es.Percentage,Ns=Es.Number,Rs=Es.Hash,Ms=Es.Colon,js=Es.LeftSquareBracket;var _s={getNode:function(e){switch(this.scanner.tokenType){case js:return this.AttributeSelector();case Rs:return this.IdSelector();case Ms:return this.scanner.lookupType(1)===Ms?this.PseudoElementSelector():this.PseudoClassSelector();case Os:return this.TypeSelector();case Ns:case Is:return this.Percentage();case Bs:46===this.scanner.source.charCodeAt(this.scanner.tokenStart)&&this.error("Identifier is expected",this.scanner.tokenStart+1);break;case Ds:switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 43:case 62:case 126:return e.space=null,e.ignoreWSAfter=!0,this.Combinator();case 47:return this.Combinator();case 46:return this.ClassSelector();case 42:case 124:return this.TypeSelector();case 35:return this.IdSelector()}}}},Fs=Ce.TYPE,Ws=ni.mode,qs=Fs.Comma,Ys=Fs.WhiteSpace,Us={AtrulePrelude:Ls,Selector:_s,Value:{getNode:Ts,expression:function(){return this.createSingleNodeList(this.Raw(this.scanner.tokenIndex,null,!1))},var:function(){var e=this.createList();if(this.scanner.skipSC(),e.push(this.Identifier()),this.scanner.skipSC(),this.scanner.tokenType===qs){e.push(this.Operator());const t=this.scanner.tokenIndex,n=this.parseCustomProperty?this.Value(null):this.Raw(this.scanner.tokenIndex,Ws.exclamationMarkOrSemicolon,!1);if("Value"===n.type&&n.children.isEmpty())for(let e=t-this.scanner.tokenIndex;e<=0;e++)if(this.scanner.lookupType(e)===Ys){n.children.appendData({type:"WhiteSpace",loc:null,value:" "});break}e.push(n);}return e}}},Hs=Ce.TYPE,Vs=Hs.String,Ks=Hs.Ident,Gs=Hs.Url,Qs=Hs.Function,Xs=Hs.LeftParenthesis,Zs={parse:{prelude:function(){var e=this.createList();switch(this.scanner.skipSC(),this.scanner.tokenType){case Vs:e.push(this.String());break;case Gs:case Qs:e.push(this.Url());break;default:this.error("String or url() is expected");}return this.lookupNonWSType(0)!==Ks&&this.lookupNonWSType(0)!==Xs||(e.push(this.WhiteSpace()),e.push(this.MediaQueryList())),e},block:null}},$s=Ce.TYPE,Js=$s.WhiteSpace,el=$s.Comment,tl=$s.Ident,nl=$s.Function,rl=$s.Colon,il=$s.LeftParenthesis;function al(){return this.createSingleNodeList(this.Raw(this.scanner.tokenIndex,null,!1))}function ol(){return this.scanner.skipSC(),this.scanner.tokenType===tl&&this.lookupNonWSType(1)===rl?this.createSingleNodeList(this.Declaration()):sl.call(this)}function sl(){var e,t=this.createList(),n=null;this.scanner.skipSC();e:for(;!this.scanner.eof;){switch(this.scanner.tokenType){case Js:n=this.WhiteSpace();continue;case el:this.scanner.next();continue;case nl:e=this.Function(al,this.scope.AtrulePrelude);break;case tl:e=this.Identifier();break;case il:e=this.Parentheses(ol,this.scope.AtrulePrelude);break;default:break e}null!==n&&(t.push(n),n=null),t.push(e);}return t}var ll,cl={parse:function(){return this.createSingleNodeList(this.SelectorList())}},ul={parse:function(){return this.createSingleNodeList(this.Nth(!0))}},hl={parse:function(){return this.createSingleNodeList(this.Nth(!1))}},pl={parseContext:{default:"StyleSheet",stylesheet:"StyleSheet",atrule:"Atrule",atrulePrelude:function(e){return this.AtrulePrelude(e.atrule?String(e.atrule):null)},mediaQueryList:"MediaQueryList",mediaQuery:"MediaQuery",rule:"Rule",selectorList:"SelectorList",selector:"Selector",block:function(){return this.Block(!0)},declarationList:"DeclarationList",declaration:"Declaration",value:"Value"},scope:Us,atrule:{"font-face":{parse:{prelude:null,block:function(){return this.Block(!0)}}},import:Zs,media:{parse:{prelude:function(){return this.createSingleNodeList(this.MediaQueryList())},block:function(){return this.Block(!1)}}},page:{parse:{prelude:function(){return this.createSingleNodeList(this.SelectorList())},block:function(){return this.Block(!0)}}},supports:{parse:{prelude:function(){var e=sl.call(this);return null===this.getFirstListNode(e)&&this.error("Condition is expected"),e},block:function(){return this.Block(!1)}}}},pseudo:{dir:{parse:function(){return this.createSingleNodeList(this.Identifier())}},has:{parse:function(){return this.createSingleNodeList(this.SelectorList())}},lang:{parse:function(){return this.createSingleNodeList(this.Identifier())}},matches:cl,not:cl,"nth-child":ul,"nth-last-child":ul,"nth-last-of-type":hl,"nth-of-type":hl,slotted:{parse:function(){return this.createSingleNodeList(this.Selector())}}},node:hs},dl={node:hs},ml={version:"1.1.2"},gl=(ll=Object.freeze({__proto__:null,version:"1.1.2",default:ml}))&&ll.default||ll;var fl=Ir(function(){for(var e={},t=0;t<arguments.length;t++){var n=arguments[t];for(var r in n)e[r]=n[r];}return e}(ps,pl,dl)),bl=gl.version;return fl.version=bl,fl}));
+	});
+
+	var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+	function buildMap(list, caseInsensitive) {
+	    var map = Object.create(null);
+
+	    if (!Array.isArray(list)) {
+	        return null;
+	    }
+
+	    for (var i = 0; i < list.length; i++) {
+	        var name = list[i];
+
+	        if (caseInsensitive) {
+	            name = name.toLowerCase();
+	        }
+
+	        map[name] = true;
+	    }
+
+	    return map;
+	}
+
+	function buildList(data) {
+	    if (!data) {
+	        return null;
+	    }
+
+	    var tags = buildMap(data.tags, true);
+	    var ids = buildMap(data.ids);
+	    var classes = buildMap(data.classes);
+
+	    if (tags === null &&
+	        ids === null &&
+	        classes === null) {
+	        return null;
+	    }
+
+	    return {
+	        tags: tags,
+	        ids: ids,
+	        classes: classes
+	    };
+	}
+
+	function buildIndex(data) {
+	    var scopes = false;
+
+	    if (data.scopes && Array.isArray(data.scopes)) {
+	        scopes = Object.create(null);
+
+	        for (var i = 0; i < data.scopes.length; i++) {
+	            var list = data.scopes[i];
+
+	            if (!list || !Array.isArray(list)) {
+	                throw new Error('Wrong usage format');
+	            }
+
+	            for (var j = 0; j < list.length; j++) {
+	                var name = list[j];
+
+	                if (hasOwnProperty.call(scopes, name)) {
+	                    throw new Error('Class can\'t be used for several scopes: ' + name);
+	                }
+
+	                scopes[name] = i + 1;
+	            }
+	        }
+	    }
+
+	    return {
+	        whitelist: buildList(data),
+	        blacklist: buildList(data.blacklist),
+	        scopes: scopes
+	    };
+	}
+
+	var usage = {
+	    buildIndex: buildIndex
+	};
+
+	var utils = {
+	    hasNoChildren: function(node) {
+	        return !node || !node.children || node.children.isEmpty();
+	    },
+	    isNodeChildrenList: function(node, list) {
+	        return node !== null && node.children === list;
+	    }
+	};
+
+	var resolveKeyword = csstree_min.keyword;
+	var { hasNoChildren } = utils;
+
+	var Atrule = function cleanAtrule(node, item, list) {
+	    if (node.block) {
+	        // otherwise removed at-rule don't prevent @import for removal
+	        if (this.stylesheet !== null) {
+	            this.stylesheet.firstAtrulesAllowed = false;
+	        }
+
+	        if (hasNoChildren(node.block)) {
+	            list.remove(item);
+	            return;
+	        }
+	    }
+
+	    switch (node.name) {
+	        case 'charset':
+	            if (hasNoChildren(node.prelude)) {
+	                list.remove(item);
+	                return;
+	            }
+
+	            // if there is any rule before @charset -> remove it
+	            if (item.prev) {
+	                list.remove(item);
+	                return;
+	            }
+
+	            break;
+
+	        case 'import':
+	            if (this.stylesheet === null || !this.stylesheet.firstAtrulesAllowed) {
+	                list.remove(item);
+	                return;
+	            }
+
+	            // if there are some rules that not an @import or @charset before @import
+	            // remove it
+	            list.prevUntil(item.prev, function(rule) {
+	                if (rule.type === 'Atrule') {
+	                    if (rule.name === 'import' || rule.name === 'charset') {
+	                        return;
+	                    }
+	                }
+
+	                this.root.firstAtrulesAllowed = false;
+	                list.remove(item);
+	                return true;
+	            }, this);
+
+	            break;
+
+	        default:
+	            var name = resolveKeyword(node.name).basename;
+	            if (name === 'keyframes' ||
+	                name === 'media' ||
+	                name === 'supports') {
+
+	                // drop at-rule with no prelude
+	                if (hasNoChildren(node.prelude) || hasNoChildren(node.block)) {
+	                    list.remove(item);
+	                }
+	            }
+	    }
+	};
+
+	var Comment = function cleanComment(data, item, list) {
+	    list.remove(item);
+	};
+
+	var property = csstree_min.property;
+
+	var Declaration = function cleanDeclartion(node, item, list) {
+	    if (node.value.children && node.value.children.isEmpty()) {
+	        list.remove(item);
+	        return;
+	    }
+
+	    if (property(node.property).custom) {
+	        if (/\S/.test(node.value.value)) {
+	            node.value.value = node.value.value.trim();
+	        }
+	    }
+	};
+
+	var { isNodeChildrenList } = utils;
+
+	var Raw = function cleanRaw(node, item, list) {
+	    // raw in stylesheet or block children
+	    if (isNodeChildrenList(this.stylesheet, list) ||
+	        isNodeChildrenList(this.block, list)) {
+	        list.remove(item);
+	    }
+	};
+
+	var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
+	var walk = csstree_min.walk;
+	var { hasNoChildren: hasNoChildren$1 } = utils;
+
+	function cleanUnused(selectorList, usageData) {
+	    selectorList.children.each(function(selector, item, list) {
+	        var shouldRemove = false;
+
+	        walk(selector, function(node) {
+	            // ignore nodes in nested selectors
+	            if (this.selector === null || this.selector === selectorList) {
+	                switch (node.type) {
+	                    case 'SelectorList':
+	                        // TODO: remove toLowerCase when pseudo selectors will be normalized
+	                        // ignore selectors inside :not()
+	                        if (this.function === null || this.function.name.toLowerCase() !== 'not') {
+	                            if (cleanUnused(node, usageData)) {
+	                                shouldRemove = true;
+	                            }
+	                        }
+	                        break;
+
+	                    case 'ClassSelector':
+	                        if (usageData.whitelist !== null &&
+	                            usageData.whitelist.classes !== null &&
+	                            !hasOwnProperty$1.call(usageData.whitelist.classes, node.name)) {
+	                            shouldRemove = true;
+	                        }
+	                        if (usageData.blacklist !== null &&
+	                            usageData.blacklist.classes !== null &&
+	                            hasOwnProperty$1.call(usageData.blacklist.classes, node.name)) {
+	                            shouldRemove = true;
+	                        }
+	                        break;
+
+	                    case 'IdSelector':
+	                        if (usageData.whitelist !== null &&
+	                            usageData.whitelist.ids !== null &&
+	                            !hasOwnProperty$1.call(usageData.whitelist.ids, node.name)) {
+	                            shouldRemove = true;
+	                        }
+	                        if (usageData.blacklist !== null &&
+	                            usageData.blacklist.ids !== null &&
+	                            hasOwnProperty$1.call(usageData.blacklist.ids, node.name)) {
+	                            shouldRemove = true;
+	                        }
+	                        break;
+
+	                    case 'TypeSelector':
+	                        // TODO: remove toLowerCase when type selectors will be normalized
+	                        // ignore universal selectors
+	                        if (node.name.charAt(node.name.length - 1) !== '*') {
+	                            if (usageData.whitelist !== null &&
+	                                usageData.whitelist.tags !== null &&
+	                                !hasOwnProperty$1.call(usageData.whitelist.tags, node.name.toLowerCase())) {
+	                                shouldRemove = true;
+	                            }
+	                            if (usageData.blacklist !== null &&
+	                                usageData.blacklist.tags !== null &&
+	                                hasOwnProperty$1.call(usageData.blacklist.tags, node.name.toLowerCase())) {
+	                                shouldRemove = true;
+	                            }
+	                        }
+	                        break;
+	                }
+	            }
+	        });
+
+	        if (shouldRemove) {
+	            list.remove(item);
+	        }
+	    });
+
+	    return selectorList.children.isEmpty();
+	}
+
+	var Rule = function cleanRule(node, item, list, options) {
+	    if (hasNoChildren$1(node.prelude) || hasNoChildren$1(node.block)) {
+	        list.remove(item);
+	        return;
+	    }
+
+	    var usageData = options.usage;
+
+	    if (usageData && (usageData.whitelist !== null || usageData.blacklist !== null)) {
+	        cleanUnused(node.prelude, usageData);
+
+	        if (hasNoChildren$1(node.prelude)) {
+	            list.remove(item);
+	            return;
+	        }
+	    }
+	};
+
+	// remove useless universal selector
+	var TypeSelector = function cleanTypeSelector(node, item, list) {
+	    var name = item.data.name;
+
+	    // check it's a non-namespaced universal selector
+	    if (name !== '*') {
+	        return;
+	    }
+
+	    // remove when universal selector before other selectors
+	    var nextType = item.next && item.next.data.type;
+	    if (nextType === 'IdSelector' ||
+	        nextType === 'ClassSelector' ||
+	        nextType === 'AttributeSelector' ||
+	        nextType === 'PseudoClassSelector' ||
+	        nextType === 'PseudoElementSelector') {
+	        list.remove(item);
+	    }
+	};
+
+	var { isNodeChildrenList: isNodeChildrenList$1 } = utils;
+
+	function isSafeOperator(node) {
+	    return node.type === 'Operator' && node.value !== '+' && node.value !== '-';
+	}
+
+	var WhiteSpace = function cleanWhitespace(node, item, list) {
+	    // remove when first or last item in sequence
+	    if (item.next === null || item.prev === null) {
+	        list.remove(item);
+	        return;
+	    }
+
+	    // white space in stylesheet or block children
+	    if (isNodeChildrenList$1(this.stylesheet, list) ||
+	        isNodeChildrenList$1(this.block, list)) {
+	        list.remove(item);
+	        return;
+	    }
+
+	    if (item.next.data.type === 'WhiteSpace') {
+	        list.remove(item);
+	        return;
+	    }
+
+	    if (isSafeOperator(item.prev.data) || isSafeOperator(item.next.data)) {
+	        list.remove(item);
+	        return;
+	    }
+	};
+
+	var walk$1 = csstree_min.walk;
+	var handlers = {
+	    Atrule: Atrule,
+	    Comment: Comment,
+	    Declaration: Declaration,
+	    Raw: Raw,
+	    Rule: Rule,
+	    TypeSelector: TypeSelector,
+	    WhiteSpace: WhiteSpace
+	};
+
+	var clean = function(ast, options) {
+	    walk$1(ast, {
+	        leave: function(node, item, list) {
+	            if (handlers.hasOwnProperty(node.type)) {
+	                handlers[node.type].call(this, node, item, list, options);
+	            }
+	        }
+	    });
+	};
+
+	var keyframes = function(node) {
+	    node.block.children.each(function(rule) {
+	        rule.prelude.children.each(function(simpleselector) {
+	            simpleselector.children.each(function(data, item) {
+	                if (data.type === 'Percentage' && data.value === '100') {
+	                    item.data = {
+	                        type: 'TypeSelector',
+	                        loc: data.loc,
+	                        name: 'to'
+	                    };
+	                } else if (data.type === 'TypeSelector' && data.name === 'from') {
+	                    item.data = {
+	                        type: 'Percentage',
+	                        loc: data.loc,
+	                        value: '0'
+	                    };
+	                }
+	            });
+	        });
+	    });
+	};
+
+	var resolveKeyword$1 = csstree_min.keyword;
+
+
+	var Atrule$1 = function(node) {
+	    // compress @keyframe selectors
+	    if (resolveKeyword$1(node.name).basename === 'keyframes') {
+	        keyframes(node);
+	    }
+	};
+
+	// Can unquote attribute detection
+	// Adopted implementation of Mathias Bynens
+	// https://github.com/mathiasbynens/mothereff.in/blob/master/unquoted-attributes/eff.js
+	var escapesRx = /\\([0-9A-Fa-f]{1,6})(\r\n|[ \t\n\f\r])?|\\./g;
+	var blockUnquoteRx = /^(-?\d|--)|[\u0000-\u002c\u002e\u002f\u003A-\u0040\u005B-\u005E\u0060\u007B-\u009f]/;
+
+	function canUnquote(value) {
+	    if (value === '' || value === '-') {
+	        return;
+	    }
+
+	    // Escapes are valid, so replace them with a valid non-empty string
+	    value = value.replace(escapesRx, 'a');
+
+	    return !blockUnquoteRx.test(value);
+	}
+
+	var AttributeSelector = function(node) {
+	    var attrValue = node.value;
+
+	    if (!attrValue || attrValue.type !== 'String') {
+	        return;
+	    }
+
+	    var unquotedValue = attrValue.value.replace(/^(.)(.*)\1$/, '$2');
+	    if (canUnquote(unquotedValue)) {
+	        node.value = {
+	            type: 'Identifier',
+	            loc: attrValue.loc,
+	            name: unquotedValue
+	        };
+	    }
+	};
+
+	var font = function compressFont(node) {
+	    var list = node.children;
+
+	    list.eachRight(function(node, item) {
+	        if (node.type === 'Identifier') {
+	            if (node.name === 'bold') {
+	                item.data = {
+	                    type: 'Number',
+	                    loc: node.loc,
+	                    value: '700'
+	                };
+	            } else if (node.name === 'normal') {
+	                var prev = item.prev;
+
+	                if (prev && prev.data.type === 'Operator' && prev.data.value === '/') {
+	                    this.remove(prev);
+	                }
+
+	                this.remove(item);
+	            } else if (node.name === 'medium') {
+	                var next = item.next;
+
+	                if (!next || next.data.type !== 'Operator') {
+	                    this.remove(item);
+	                }
+	            }
+	        }
+	    });
+
+	    // remove redundant spaces
+	    list.each(function(node, item) {
+	        if (node.type === 'WhiteSpace') {
+	            if (!item.prev || !item.next || item.next.data.type === 'WhiteSpace') {
+	                this.remove(item);
+	            }
+	        }
+	    });
+
+	    if (list.isEmpty()) {
+	        list.insert(list.createItem({
+	            type: 'Identifier',
+	            name: 'normal'
+	        }));
+	    }
+	};
+
+	var fontWeight = function compressFontWeight(node) {
+	    var value = node.children.head.data;
+
+	    if (value.type === 'Identifier') {
+	        switch (value.name) {
+	            case 'normal':
+	                node.children.head.data = {
+	                    type: 'Number',
+	                    loc: value.loc,
+	                    value: '400'
+	                };
+	                break;
+	            case 'bold':
+	                node.children.head.data = {
+	                    type: 'Number',
+	                    loc: value.loc,
+	                    value: '700'
+	                };
+	                break;
+	        }
+	    }
+	};
+
+	var List = csstree_min.List;
+
+	var background = function compressBackground(node) {
+	    function lastType() {
+	        if (buffer.length) {
+	            return buffer[buffer.length - 1].type;
+	        }
+	    }
+
+	    function flush() {
+	        if (lastType() === 'WhiteSpace') {
+	            buffer.pop();
+	        }
+
+	        if (!buffer.length) {
+	            buffer.unshift(
+	                {
+	                    type: 'Number',
+	                    loc: null,
+	                    value: '0'
+	                },
+	                {
+	                    type: 'WhiteSpace',
+	                    value: ' '
+	                },
+	                {
+	                    type: 'Number',
+	                    loc: null,
+	                    value: '0'
+	                }
+	            );
+	        }
+
+	        newValue.push.apply(newValue, buffer);
+
+	        buffer = [];
+	    }
+
+	    var newValue = [];
+	    var buffer = [];
+
+	    node.children.each(function(node) {
+	        if (node.type === 'Operator' && node.value === ',') {
+	            flush();
+	            newValue.push(node);
+	            return;
+	        }
+
+	        // remove defaults
+	        if (node.type === 'Identifier') {
+	            if (node.name === 'transparent' ||
+	                node.name === 'none' ||
+	                node.name === 'repeat' ||
+	                node.name === 'scroll') {
+	                return;
+	            }
+	        }
+
+	        // don't add redundant spaces
+	        if (node.type === 'WhiteSpace' && (!buffer.length || lastType() === 'WhiteSpace')) {
+	            return;
+	        }
+
+	        buffer.push(node);
+	    });
+
+	    flush();
+	    node.children = new List().fromArray(newValue);
+	};
+
+	function removeItemAndRedundantWhiteSpace(list, item) {
+	    var prev = item.prev;
+	    var next = item.next;
+
+	    if (next !== null) {
+	        if (next.data.type === 'WhiteSpace' && (prev === null || prev.data.type === 'WhiteSpace')) {
+	            list.remove(next);
+	        }
+	    } else if (prev !== null && prev.data.type === 'WhiteSpace') {
+	        list.remove(prev);
+	    }
+
+	    list.remove(item);
+	}
+
+	var border = function compressBorder(node) {
+	    node.children.each(function(node, item, list) {
+	        if (node.type === 'Identifier' && node.name.toLowerCase() === 'none') {
+	            if (list.head === list.tail) {
+	                // replace `none` for zero when `none` is a single term
+	                item.data = {
+	                    type: 'Number',
+	                    loc: node.loc,
+	                    value: '0'
+	                };
+	            } else {
+	                removeItemAndRedundantWhiteSpace(list, item);
+	            }
+	        }
+	    });
+	};
+
+	var resolveName = csstree_min.property;
+	var handlers$1 = {
+	    'font': font,
+	    'font-weight': fontWeight,
+	    'background': background,
+	    'border': border,
+	    'outline': border
+	};
+
+	var Value = function compressValue(node) {
+	    if (!this.declaration) {
+	        return;
+	    }
+
+	    var property = resolveName(this.declaration.property);
+
+	    if (handlers$1.hasOwnProperty(property.basename)) {
+	        handlers$1[property.basename](node);
+	    }
+	};
+
+	var OMIT_PLUSSIGN = /^(?:\+|(-))?0*(\d*)(?:\.0*|(\.\d*?)0*)?$/;
+	var KEEP_PLUSSIGN = /^([\+\-])?0*(\d*)(?:\.0*|(\.\d*?)0*)?$/;
+	var unsafeToRemovePlusSignAfter = {
+	    Dimension: true,
+	    Hash: true,
+	    Identifier: true,
+	    Number: true,
+	    Raw: true,
+	    UnicodeRange: true
+	};
+
+	function packNumber(value, item) {
+	    // omit plus sign only if no prev or prev is safe type
+	    var regexp = item && item.prev !== null && unsafeToRemovePlusSignAfter.hasOwnProperty(item.prev.data.type)
+	        ? KEEP_PLUSSIGN
+	        : OMIT_PLUSSIGN;
+
+	    // 100 -> '100'
+	    // 00100 -> '100'
+	    // +100 -> '100' (only when safe, e.g. omitting plus sign for 1px+1px leads to single dimension instead of two)
+	    // -100 -> '-100'
+	    // 0.123 -> '.123'
+	    // 0.12300 -> '.123'
+	    // 0.0 -> ''
+	    // 0 -> ''
+	    // -0 -> '-'
+	    value = String(value).replace(regexp, '$1$2$3');
+
+	    if (value === '' || value === '-') {
+	        value = '0';
+	    }
+
+	    return value;
+	}
+
+	var _Number = function(node, item) {
+	    node.value = packNumber(node.value, item);
+	};
+	var pack = packNumber;
+	_Number.pack = pack;
+
+	var packNumber$1 = _Number.pack;
+	var MATH_FUNCTIONS = {
+	    'calc': true,
+	    'min': true,
+	    'max': true,
+	    'clamp': true
+	};
+	var LENGTH_UNIT = {
+	    // absolute length units
+	    'px': true,
+	    'mm': true,
+	    'cm': true,
+	    'in': true,
+	    'pt': true,
+	    'pc': true,
+
+	    // relative length units
+	    'em': true,
+	    'ex': true,
+	    'ch': true,
+	    'rem': true,
+
+	    // viewport-percentage lengths
+	    'vh': true,
+	    'vw': true,
+	    'vmin': true,
+	    'vmax': true,
+	    'vm': true
+	};
+
+	var Dimension = function compressDimension(node, item) {
+	    var value = packNumber$1(node.value, item);
+
+	    node.value = value;
+
+	    if (value === '0' && this.declaration !== null && this.atrulePrelude === null) {
+	        var unit = node.unit.toLowerCase();
+
+	        // only length values can be compressed
+	        if (!LENGTH_UNIT.hasOwnProperty(unit)) {
+	            return;
+	        }
+
+	        // issue #362: shouldn't remove unit in -ms-flex since it breaks flex in IE10/11
+	        // issue #200: shouldn't remove unit in flex since it breaks flex in IE10/11
+	        if (this.declaration.property === '-ms-flex' ||
+	            this.declaration.property === 'flex') {
+	            return;
+	        }
+
+	        // issue #222: don't remove units inside calc
+	        if (this.function && MATH_FUNCTIONS.hasOwnProperty(this.function.name)) {
+	            return;
+	        }
+
+	        item.data = {
+	            type: 'Number',
+	            loc: node.loc,
+	            value: value
+	        };
+	    }
+	};
+
+	var lexer = csstree_min.lexer;
+	var packNumber$2 = _Number.pack;
+	var blacklist = new Set([
+	    // see https://github.com/jakubpawlowicz/clean-css/issues/957
+	    'width',
+	    'min-width',
+	    'max-width',
+	    'height',
+	    'min-height',
+	    'max-height',
+
+	    // issue #410: Don’t remove units in flex-basis value for (-ms-)flex shorthand
+	    // issue #362: shouldn't remove unit in -ms-flex since it breaks flex in IE10/11
+	    // issue #200: shouldn't remove unit in flex since it breaks flex in IE10/11
+	    'flex',
+	    '-ms-flex'
+	]);
+
+	var Percentage = function compressPercentage(node, item) {
+	    node.value = packNumber$2(node.value, item);
+
+	    if (node.value === '0' && this.declaration && !blacklist.has(this.declaration.property)) {
+	        // try to convert a number
+	        item.data = {
+	            type: 'Number',
+	            loc: node.loc,
+	            value: node.value
+	        };
+
+	        // that's ok only when new value matches on length
+	        if (!lexer.matchDeclaration(this.declaration).isType(item.data, 'length')) {
+	            // otherwise rollback changes
+	            item.data = node;
+	        }
+	    }
+	};
+
+	var _String = function(node) {
+	    var value = node.value;
+
+	    // remove escaped newlines, i.e.
+	    // .a { content: "foo\
+	    // bar"}
+	    // ->
+	    // .a { content: "foobar" }
+	    value = value.replace(/\\(\r\n|\r|\n|\f)/g, '');
+
+	    node.value = value;
+	};
+
+	var UNICODE = '\\\\[0-9a-f]{1,6}(\\r\\n|[ \\n\\r\\t\\f])?';
+	var ESCAPE = '(' + UNICODE + '|\\\\[^\\n\\r\\f0-9a-fA-F])';
+	var NONPRINTABLE = '\u0000\u0008\u000b\u000e-\u001f\u007f';
+	var SAFE_URL = new RegExp('^(' + ESCAPE + '|[^\"\'\\(\\)\\\\\\s' + NONPRINTABLE + '])*$', 'i');
+
+	var Url = function(node) {
+	    var value = node.value;
+
+	    if (value.type !== 'String') {
+	        return;
+	    }
+
+	    var quote = value.value[0];
+	    var url = value.value.substr(1, value.value.length - 2);
+
+	    // convert `\\` to `/`
+	    url = url.replace(/\\\\/g, '/');
+
+	    // remove quotes when safe
+	    // https://www.w3.org/TR/css-syntax-3/#url-unquoted-diagram
+	    if (SAFE_URL.test(url)) {
+	        node.value = {
+	            type: 'Raw',
+	            loc: node.value.loc,
+	            value: url
+	        };
+	    } else {
+	        // use double quotes if string has no double quotes
+	        // otherwise use original quotes
+	        // TODO: make better quote type selection
+	        node.value.value = url.indexOf('"') === -1 ? '"' + url + '"' : quote + url + quote;
+	    }
+	};
+
+	var lexer$1 = csstree_min.lexer;
+	var packNumber$3 = _Number.pack;
+
+	// http://www.w3.org/TR/css3-color/#svg-color
+	var NAME_TO_HEX = {
+	    'aliceblue': 'f0f8ff',
+	    'antiquewhite': 'faebd7',
+	    'aqua': '0ff',
+	    'aquamarine': '7fffd4',
+	    'azure': 'f0ffff',
+	    'beige': 'f5f5dc',
+	    'bisque': 'ffe4c4',
+	    'black': '000',
+	    'blanchedalmond': 'ffebcd',
+	    'blue': '00f',
+	    'blueviolet': '8a2be2',
+	    'brown': 'a52a2a',
+	    'burlywood': 'deb887',
+	    'cadetblue': '5f9ea0',
+	    'chartreuse': '7fff00',
+	    'chocolate': 'd2691e',
+	    'coral': 'ff7f50',
+	    'cornflowerblue': '6495ed',
+	    'cornsilk': 'fff8dc',
+	    'crimson': 'dc143c',
+	    'cyan': '0ff',
+	    'darkblue': '00008b',
+	    'darkcyan': '008b8b',
+	    'darkgoldenrod': 'b8860b',
+	    'darkgray': 'a9a9a9',
+	    'darkgrey': 'a9a9a9',
+	    'darkgreen': '006400',
+	    'darkkhaki': 'bdb76b',
+	    'darkmagenta': '8b008b',
+	    'darkolivegreen': '556b2f',
+	    'darkorange': 'ff8c00',
+	    'darkorchid': '9932cc',
+	    'darkred': '8b0000',
+	    'darksalmon': 'e9967a',
+	    'darkseagreen': '8fbc8f',
+	    'darkslateblue': '483d8b',
+	    'darkslategray': '2f4f4f',
+	    'darkslategrey': '2f4f4f',
+	    'darkturquoise': '00ced1',
+	    'darkviolet': '9400d3',
+	    'deeppink': 'ff1493',
+	    'deepskyblue': '00bfff',
+	    'dimgray': '696969',
+	    'dimgrey': '696969',
+	    'dodgerblue': '1e90ff',
+	    'firebrick': 'b22222',
+	    'floralwhite': 'fffaf0',
+	    'forestgreen': '228b22',
+	    'fuchsia': 'f0f',
+	    'gainsboro': 'dcdcdc',
+	    'ghostwhite': 'f8f8ff',
+	    'gold': 'ffd700',
+	    'goldenrod': 'daa520',
+	    'gray': '808080',
+	    'grey': '808080',
+	    'green': '008000',
+	    'greenyellow': 'adff2f',
+	    'honeydew': 'f0fff0',
+	    'hotpink': 'ff69b4',
+	    'indianred': 'cd5c5c',
+	    'indigo': '4b0082',
+	    'ivory': 'fffff0',
+	    'khaki': 'f0e68c',
+	    'lavender': 'e6e6fa',
+	    'lavenderblush': 'fff0f5',
+	    'lawngreen': '7cfc00',
+	    'lemonchiffon': 'fffacd',
+	    'lightblue': 'add8e6',
+	    'lightcoral': 'f08080',
+	    'lightcyan': 'e0ffff',
+	    'lightgoldenrodyellow': 'fafad2',
+	    'lightgray': 'd3d3d3',
+	    'lightgrey': 'd3d3d3',
+	    'lightgreen': '90ee90',
+	    'lightpink': 'ffb6c1',
+	    'lightsalmon': 'ffa07a',
+	    'lightseagreen': '20b2aa',
+	    'lightskyblue': '87cefa',
+	    'lightslategray': '789',
+	    'lightslategrey': '789',
+	    'lightsteelblue': 'b0c4de',
+	    'lightyellow': 'ffffe0',
+	    'lime': '0f0',
+	    'limegreen': '32cd32',
+	    'linen': 'faf0e6',
+	    'magenta': 'f0f',
+	    'maroon': '800000',
+	    'mediumaquamarine': '66cdaa',
+	    'mediumblue': '0000cd',
+	    'mediumorchid': 'ba55d3',
+	    'mediumpurple': '9370db',
+	    'mediumseagreen': '3cb371',
+	    'mediumslateblue': '7b68ee',
+	    'mediumspringgreen': '00fa9a',
+	    'mediumturquoise': '48d1cc',
+	    'mediumvioletred': 'c71585',
+	    'midnightblue': '191970',
+	    'mintcream': 'f5fffa',
+	    'mistyrose': 'ffe4e1',
+	    'moccasin': 'ffe4b5',
+	    'navajowhite': 'ffdead',
+	    'navy': '000080',
+	    'oldlace': 'fdf5e6',
+	    'olive': '808000',
+	    'olivedrab': '6b8e23',
+	    'orange': 'ffa500',
+	    'orangered': 'ff4500',
+	    'orchid': 'da70d6',
+	    'palegoldenrod': 'eee8aa',
+	    'palegreen': '98fb98',
+	    'paleturquoise': 'afeeee',
+	    'palevioletred': 'db7093',
+	    'papayawhip': 'ffefd5',
+	    'peachpuff': 'ffdab9',
+	    'peru': 'cd853f',
+	    'pink': 'ffc0cb',
+	    'plum': 'dda0dd',
+	    'powderblue': 'b0e0e6',
+	    'purple': '800080',
+	    'rebeccapurple': '639',
+	    'red': 'f00',
+	    'rosybrown': 'bc8f8f',
+	    'royalblue': '4169e1',
+	    'saddlebrown': '8b4513',
+	    'salmon': 'fa8072',
+	    'sandybrown': 'f4a460',
+	    'seagreen': '2e8b57',
+	    'seashell': 'fff5ee',
+	    'sienna': 'a0522d',
+	    'silver': 'c0c0c0',
+	    'skyblue': '87ceeb',
+	    'slateblue': '6a5acd',
+	    'slategray': '708090',
+	    'slategrey': '708090',
+	    'snow': 'fffafa',
+	    'springgreen': '00ff7f',
+	    'steelblue': '4682b4',
+	    'tan': 'd2b48c',
+	    'teal': '008080',
+	    'thistle': 'd8bfd8',
+	    'tomato': 'ff6347',
+	    'turquoise': '40e0d0',
+	    'violet': 'ee82ee',
+	    'wheat': 'f5deb3',
+	    'white': 'fff',
+	    'whitesmoke': 'f5f5f5',
+	    'yellow': 'ff0',
+	    'yellowgreen': '9acd32'
+	};
+
+	var HEX_TO_NAME = {
+	    '800000': 'maroon',
+	    '800080': 'purple',
+	    '808000': 'olive',
+	    '808080': 'gray',
+	    '00ffff': 'cyan',
+	    'f0ffff': 'azure',
+	    'f5f5dc': 'beige',
+	    'ffe4c4': 'bisque',
+	    '000000': 'black',
+	    '0000ff': 'blue',
+	    'a52a2a': 'brown',
+	    'ff7f50': 'coral',
+	    'ffd700': 'gold',
+	    '008000': 'green',
+	    '4b0082': 'indigo',
+	    'fffff0': 'ivory',
+	    'f0e68c': 'khaki',
+	    '00ff00': 'lime',
+	    'faf0e6': 'linen',
+	    '000080': 'navy',
+	    'ffa500': 'orange',
+	    'da70d6': 'orchid',
+	    'cd853f': 'peru',
+	    'ffc0cb': 'pink',
+	    'dda0dd': 'plum',
+	    'f00': 'red',
+	    'ff0000': 'red',
+	    'fa8072': 'salmon',
+	    'a0522d': 'sienna',
+	    'c0c0c0': 'silver',
+	    'fffafa': 'snow',
+	    'd2b48c': 'tan',
+	    '008080': 'teal',
+	    'ff6347': 'tomato',
+	    'ee82ee': 'violet',
+	    'f5deb3': 'wheat',
+	    'ffffff': 'white',
+	    'ffff00': 'yellow'
+	};
+
+	function hueToRgb(p, q, t) {
+	    if (t < 0) {
+	        t += 1;
+	    }
+	    if (t > 1) {
+	        t -= 1;
+	    }
+	    if (t < 1 / 6) {
+	        return p + (q - p) * 6 * t;
+	    }
+	    if (t < 1 / 2) {
+	        return q;
+	    }
+	    if (t < 2 / 3) {
+	        return p + (q - p) * (2 / 3 - t) * 6;
+	    }
+	    return p;
+	}
+
+	function hslToRgb(h, s, l, a) {
+	    var r;
+	    var g;
+	    var b;
+
+	    if (s === 0) {
+	        r = g = b = l; // achromatic
+	    } else {
+	        var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
+	        var p = 2 * l - q;
+
+	        r = hueToRgb(p, q, h + 1 / 3);
+	        g = hueToRgb(p, q, h);
+	        b = hueToRgb(p, q, h - 1 / 3);
+	    }
+
+	    return [
+	        Math.round(r * 255),
+	        Math.round(g * 255),
+	        Math.round(b * 255),
+	        a
+	    ];
+	}
+
+	function toHex(value) {
+	    value = value.toString(16);
+	    return value.length === 1 ? '0' + value : value;
+	}
+
+	function parseFunctionArgs(functionArgs, count, rgb) {
+	    var cursor = functionArgs.head;
+	    var args = [];
+	    var wasValue = false;
+
+	    while (cursor !== null) {
+	        var node = cursor.data;
+	        var type = node.type;
+
+	        switch (type) {
+	            case 'Number':
+	            case 'Percentage':
+	                if (wasValue) {
+	                    return;
+	                }
+
+	                wasValue = true;
+	                args.push({
+	                    type: type,
+	                    value: Number(node.value)
+	                });
+	                break;
+
+	            case 'Operator':
+	                if (node.value === ',') {
+	                    if (!wasValue) {
+	                        return;
+	                    }
+	                    wasValue = false;
+	                } else if (wasValue || node.value !== '+') {
+	                    return;
+	                }
+	                break;
+
+	            default:
+	                // something we couldn't understand
+	                return;
+	        }
+
+	        cursor = cursor.next;
+	    }
+
+	    if (args.length !== count) {
+	        // invalid arguments count
+	        // TODO: remove those tokens
+	        return;
+	    }
+
+	    if (args.length === 4) {
+	        if (args[3].type !== 'Number') {
+	            // 4th argument should be a number
+	            // TODO: remove those tokens
+	            return;
+	        }
+
+	        args[3].type = 'Alpha';
+	    }
+
+	    if (rgb) {
+	        if (args[0].type !== args[1].type || args[0].type !== args[2].type) {
+	            // invalid color, numbers and percentage shouldn't be mixed
+	            // TODO: remove those tokens
+	            return;
+	        }
+	    } else {
+	        if (args[0].type !== 'Number' ||
+	            args[1].type !== 'Percentage' ||
+	            args[2].type !== 'Percentage') {
+	            // invalid color, for hsl values should be: number, percentage, percentage
+	            // TODO: remove those tokens
+	            return;
+	        }
+
+	        args[0].type = 'Angle';
+	    }
+
+	    return args.map(function(arg) {
+	        var value = Math.max(0, arg.value);
+
+	        switch (arg.type) {
+	            case 'Number':
+	                // fit value to [0..255] range
+	                value = Math.min(value, 255);
+	                break;
+
+	            case 'Percentage':
+	                // convert 0..100% to value in [0..255] range
+	                value = Math.min(value, 100) / 100;
+
+	                if (!rgb) {
+	                    return value;
+	                }
+
+	                value = 255 * value;
+	                break;
+
+	            case 'Angle':
+	                // fit value to (-360..360) range
+	                return (((value % 360) + 360) % 360) / 360;
+
+	            case 'Alpha':
+	                // fit value to [0..1] range
+	                return Math.min(value, 1);
+	        }
+
+	        return Math.round(value);
+	    });
+	}
+
+	function compressFunction(node, item, list) {
+	    var functionName = node.name;
+	    var args;
+
+	    if (functionName === 'rgba' || functionName === 'hsla') {
+	        args = parseFunctionArgs(node.children, 4, functionName === 'rgba');
+
+	        if (!args) {
+	            // something went wrong
+	            return;
+	        }
+
+	        if (functionName === 'hsla') {
+	            args = hslToRgb.apply(null, args);
+	            node.name = 'rgba';
+	        }
+
+	        if (args[3] === 0) {
+	            // try to replace `rgba(x, x, x, 0)` to `transparent`
+	            // always replace `rgba(0, 0, 0, 0)` to `transparent`
+	            // otherwise avoid replacement in gradients since it may break color transition
+	            // http://stackoverflow.com/questions/11829410/css3-gradient-rendering-issues-from-transparent-to-white
+	            var scopeFunctionName = this.function && this.function.name;
+	            if ((args[0] === 0 && args[1] === 0 && args[2] === 0) ||
+	                !/^(?:to|from|color-stop)$|gradient$/i.test(scopeFunctionName)) {
+
+	                item.data = {
+	                    type: 'Identifier',
+	                    loc: node.loc,
+	                    name: 'transparent'
+	                };
+
+	                return;
+	            }
+	        }
+
+	        if (args[3] !== 1) {
+	            // replace argument values for normalized/interpolated
+	            node.children.each(function(node, item, list) {
+	                if (node.type === 'Operator') {
+	                    if (node.value !== ',') {
+	                        list.remove(item);
+	                    }
+	                    return;
+	                }
+
+	                item.data = {
+	                    type: 'Number',
+	                    loc: node.loc,
+	                    value: packNumber$3(args.shift(), null)
+	                };
+	            });
+
+	            return;
+	        }
+
+	        // otherwise convert to rgb, i.e. rgba(255, 0, 0, 1) -> rgb(255, 0, 0)
+	        functionName = 'rgb';
+	    }
+
+	    if (functionName === 'hsl') {
+	        args = args || parseFunctionArgs(node.children, 3, false);
+
+	        if (!args) {
+	            // something went wrong
+	            return;
+	        }
+
+	        // convert to rgb
+	        args = hslToRgb.apply(null, args);
+	        functionName = 'rgb';
+	    }
+
+	    if (functionName === 'rgb') {
+	        args = args || parseFunctionArgs(node.children, 3, true);
+
+	        if (!args) {
+	            // something went wrong
+	            return;
+	        }
+
+	        // check if color is not at the end and not followed by space
+	        var next = item.next;
+	        if (next && next.data.type !== 'WhiteSpace') {
+	            list.insert(list.createItem({
+	                type: 'WhiteSpace',
+	                value: ' '
+	            }), next);
+	        }
+
+	        item.data = {
+	            type: 'Hash',
+	            loc: node.loc,
+	            value: toHex(args[0]) + toHex(args[1]) + toHex(args[2])
+	        };
+
+	        compressHex(item.data, item);
+	    }
+	}
+
+	function compressIdent(node, item) {
+	    if (this.declaration === null) {
+	        return;
+	    }
+
+	    var color = node.name.toLowerCase();
+
+	    if (NAME_TO_HEX.hasOwnProperty(color) &&
+	        lexer$1.matchDeclaration(this.declaration).isType(node, 'color')) {
+	        var hex = NAME_TO_HEX[color];
+
+	        if (hex.length + 1 <= color.length) {
+	            // replace for shorter hex value
+	            item.data = {
+	                type: 'Hash',
+	                loc: node.loc,
+	                value: hex
+	            };
+	        } else {
+	            // special case for consistent colors
+	            if (color === 'grey') {
+	                color = 'gray';
+	            }
+
+	            // just replace value for lower cased name
+	            node.name = color;
+	        }
+	    }
+	}
+
+	function compressHex(node, item) {
+	    var color = node.value.toLowerCase();
+
+	    // #112233 -> #123
+	    if (color.length === 6 &&
+	        color[0] === color[1] &&
+	        color[2] === color[3] &&
+	        color[4] === color[5]) {
+	        color = color[0] + color[2] + color[4];
+	    }
+
+	    if (HEX_TO_NAME[color]) {
+	        item.data = {
+	            type: 'Identifier',
+	            loc: node.loc,
+	            name: HEX_TO_NAME[color]
+	        };
+	    } else {
+	        node.value = color;
+	    }
+	}
+
+	var color = {
+	    compressFunction: compressFunction,
+	    compressIdent: compressIdent,
+	    compressHex: compressHex
+	};
+
+	var walk$2 = csstree_min.walk;
+	var handlers$2 = {
+	    Atrule: Atrule$1,
+	    AttributeSelector: AttributeSelector,
+	    Value: Value,
+	    Dimension: Dimension,
+	    Percentage: Percentage,
+	    Number: _Number,
+	    String: _String,
+	    Url: Url,
+	    Hash: color.compressHex,
+	    Identifier: color.compressIdent,
+	    Function: color.compressFunction
+	};
+
+	var replace = function(ast) {
+	    walk$2(ast, {
+	        leave: function(node, item, list) {
+	            if (handlers$2.hasOwnProperty(node.type)) {
+	                handlers$2[node.type].call(this, node, item, list);
+	            }
+	        }
+	    });
+	};
+
+	var generate = csstree_min.generate;
+
+	function Index() {
+	    this.seed = 0;
+	    this.map = Object.create(null);
+	}
+
+	Index.prototype.resolve = function(str) {
+	    var index = this.map[str];
+
+	    if (!index) {
+	        index = ++this.seed;
+	        this.map[str] = index;
+	    }
+
+	    return index;
+	};
+
+	var createDeclarationIndexer = function createDeclarationIndexer() {
+	    var ids = new Index();
+
+	    return function markDeclaration(node) {
+	        var id = generate(node);
+
+	        node.id = ids.resolve(id);
+	        node.length = id.length;
+	        node.fingerprint = null;
+
+	        return node;
+	    };
+	};
+
+	var specificity = function specificity(simpleSelector) {
+	    var A = 0;
+	    var B = 0;
+	    var C = 0;
+
+	    simpleSelector.children.each(function walk(node) {
+	        switch (node.type) {
+	            case 'SelectorList':
+	            case 'Selector':
+	                node.children.each(walk);
+	                break;
+
+	            case 'IdSelector':
+	                A++;
+	                break;
+
+	            case 'ClassSelector':
+	            case 'AttributeSelector':
+	                B++;
+	                break;
+
+	            case 'PseudoClassSelector':
+	                switch (node.name.toLowerCase()) {
+	                    case 'not':
+	                        node.children.each(walk);
+	                        break;
+
+	                    case 'before':
+	                    case 'after':
+	                    case 'first-line':
+	                    case 'first-letter':
+	                        C++;
+	                        break;
+
+	                    // TODO: support for :nth-*(.. of <SelectorList>), :matches(), :has()
+	                    default:
+	                        B++;
+	                }
+	                break;
+
+	            case 'PseudoElementSelector':
+	                C++;
+	                break;
+
+	            case 'TypeSelector':
+	                // ignore universal selector
+	                if (node.name.charAt(node.name.length - 1) !== '*') {
+	                    C++;
+	                }
+	                break;
+
+	        }
+	    });
+
+	    return [A, B, C];
+	};
+
+	var generate$1 = csstree_min.generate;
+
+
+	var nonFreezePseudoElements = {
+	    'first-letter': true,
+	    'first-line': true,
+	    'after': true,
+	    'before': true
+	};
+	var nonFreezePseudoClasses = {
+	    'link': true,
+	    'visited': true,
+	    'hover': true,
+	    'active': true,
+	    'first-letter': true,
+	    'first-line': true,
+	    'after': true,
+	    'before': true
+	};
+
+	var processSelector = function freeze(node, usageData) {
+	    var pseudos = Object.create(null);
+	    var hasPseudo = false;
+
+	    node.prelude.children.each(function(simpleSelector) {
+	        var tagName = '*';
+	        var scope = 0;
+
+	        simpleSelector.children.each(function(node) {
+	            switch (node.type) {
+	                case 'ClassSelector':
+	                    if (usageData && usageData.scopes) {
+	                        var classScope = usageData.scopes[node.name] || 0;
+
+	                        if (scope !== 0 && classScope !== scope) {
+	                            throw new Error('Selector can\'t has classes from different scopes: ' + generate$1(simpleSelector));
+	                        }
+
+	                        scope = classScope;
+	                    }
+	                    break;
+
+	                case 'PseudoClassSelector':
+	                    var name = node.name.toLowerCase();
+
+	                    if (!nonFreezePseudoClasses.hasOwnProperty(name)) {
+	                        pseudos[':' + name] = true;
+	                        hasPseudo = true;
+	                    }
+	                    break;
+
+	                case 'PseudoElementSelector':
+	                    var name = node.name.toLowerCase();
+
+	                    if (!nonFreezePseudoElements.hasOwnProperty(name)) {
+	                        pseudos['::' + name] = true;
+	                        hasPseudo = true;
+	                    }
+	                    break;
+
+	                case 'TypeSelector':
+	                    tagName = node.name.toLowerCase();
+	                    break;
+
+	                case 'AttributeSelector':
+	                    if (node.flags) {
+	                        pseudos['[' + node.flags.toLowerCase() + ']'] = true;
+	                        hasPseudo = true;
+	                    }
+	                    break;
+
+	                case 'WhiteSpace':
+	                case 'Combinator':
+	                    tagName = '*';
+	                    break;
+	            }
+	        });
+
+	        simpleSelector.compareMarker = specificity(simpleSelector).toString();
+	        simpleSelector.id = null; // pre-init property to avoid multiple hidden class
+	        simpleSelector.id = generate$1(simpleSelector);
+
+	        if (scope) {
+	            simpleSelector.compareMarker += ':' + scope;
+	        }
+
+	        if (tagName !== '*') {
+	            simpleSelector.compareMarker += ',' + tagName;
+	        }
+	    });
+
+	    // add property to all rule nodes to avoid multiple hidden class
+	    node.pseudoSignature = hasPseudo && Object.keys(pseudos).sort().join(',');
+	};
+
+	var resolveKeyword$2 = csstree_min.keyword;
+	var walk$3 = csstree_min.walk;
+	var generate$2 = csstree_min.generate;
+
+
+
+	var prepare = function prepare(ast, options) {
+	    var markDeclaration = createDeclarationIndexer();
+
+	    walk$3(ast, {
+	        visit: 'Rule',
+	        enter: function processRule(node) {
+	            node.block.children.each(markDeclaration);
+	            processSelector(node, options.usage);
+	        }
+	    });
+
+	    walk$3(ast, {
+	        visit: 'Atrule',
+	        enter: function(node) {
+	            if (node.prelude) {
+	                node.prelude.id = null; // pre-init property to avoid multiple hidden class for generate
+	                node.prelude.id = generate$2(node.prelude);
+	            }
+
+	            // compare keyframe selectors by its values
+	            // NOTE: still no clarification about problems with keyframes selector grouping (issue #197)
+	            if (resolveKeyword$2(node.name).basename === 'keyframes') {
+	                node.block.avoidRulesMerge = true;  /* probably we don't need to prevent those merges for @keyframes
+	                                                       TODO: need to be checked */
+	                node.block.children.each(function(rule) {
+	                    rule.prelude.children.each(function(simpleselector) {
+	                        simpleselector.compareMarker = simpleselector.id;
+	                    });
+	                });
+	            }
+	        }
+	    });
+
+	    return {
+	        declaration: markDeclaration
+	    };
+	};
+
+	var List$1 = csstree_min.List;
+	var resolveKeyword$3 = csstree_min.keyword;
+	var hasOwnProperty$2 = Object.prototype.hasOwnProperty;
+	var walk$4 = csstree_min.walk;
+
+	function addRuleToMap(map, item, list, single) {
+	    var node = item.data;
+	    var name = resolveKeyword$3(node.name).basename;
+	    var id = node.name.toLowerCase() + '/' + (node.prelude ? node.prelude.id : null);
+
+	    if (!hasOwnProperty$2.call(map, name)) {
+	        map[name] = Object.create(null);
+	    }
+
+	    if (single) {
+	        delete map[name][id];
+	    }
+
+	    if (!hasOwnProperty$2.call(map[name], id)) {
+	        map[name][id] = new List$1();
+	    }
+
+	    map[name][id].append(list.remove(item));
+	}
+
+	function relocateAtrules(ast, options) {
+	    var collected = Object.create(null);
+	    var topInjectPoint = null;
+
+	    ast.children.each(function(node, item, list) {
+	        if (node.type === 'Atrule') {
+	            var name = resolveKeyword$3(node.name).basename;
+
+	            switch (name) {
+	                case 'keyframes':
+	                    addRuleToMap(collected, item, list, true);
+	                    return;
+
+	                case 'media':
+	                    if (options.forceMediaMerge) {
+	                        addRuleToMap(collected, item, list, false);
+	                        return;
+	                    }
+	                    break;
+	            }
+
+	            if (topInjectPoint === null &&
+	                name !== 'charset' &&
+	                name !== 'import') {
+	                topInjectPoint = item;
+	            }
+	        } else {
+	            if (topInjectPoint === null) {
+	                topInjectPoint = item;
+	            }
+	        }
+	    });
+
+	    for (var atrule in collected) {
+	        for (var id in collected[atrule]) {
+	            ast.children.insertList(
+	                collected[atrule][id],
+	                atrule === 'media' ? null : topInjectPoint
+	            );
+	        }
+	    }
+	}
+	function isMediaRule(node) {
+	    return node.type === 'Atrule' && node.name === 'media';
+	}
+
+	function processAtrule(node, item, list) {
+	    if (!isMediaRule(node)) {
+	        return;
+	    }
+
+	    var prev = item.prev && item.prev.data;
+
+	    if (!prev || !isMediaRule(prev)) {
+	        return;
+	    }
+
+	    // merge @media with same query
+	    if (node.prelude &&
+	        prev.prelude &&
+	        node.prelude.id === prev.prelude.id) {
+	        prev.block.children.appendList(node.block.children);
+	        list.remove(item);
+
+	        // TODO: use it when we can refer to several points in source
+	        // prev.loc = {
+	        //     primary: prev.loc,
+	        //     merged: node.loc
+	        // };
+	    }
+	}
+
+	var _1MergeAtrule = function rejoinAtrule(ast, options) {
+	    relocateAtrules(ast, options);
+
+	    walk$4(ast, {
+	        visit: 'Atrule',
+	        reverse: true,
+	        enter: processAtrule
+	    });
+	};
+
+	var hasOwnProperty$3 = Object.prototype.hasOwnProperty;
+
+	function isEqualSelectors(a, b) {
+	    var cursor1 = a.head;
+	    var cursor2 = b.head;
+
+	    while (cursor1 !== null && cursor2 !== null && cursor1.data.id === cursor2.data.id) {
+	        cursor1 = cursor1.next;
+	        cursor2 = cursor2.next;
+	    }
+
+	    return cursor1 === null && cursor2 === null;
+	}
+
+	function isEqualDeclarations(a, b) {
+	    var cursor1 = a.head;
+	    var cursor2 = b.head;
+
+	    while (cursor1 !== null && cursor2 !== null && cursor1.data.id === cursor2.data.id) {
+	        cursor1 = cursor1.next;
+	        cursor2 = cursor2.next;
+	    }
+
+	    return cursor1 === null && cursor2 === null;
+	}
+
+	function compareDeclarations(declarations1, declarations2) {
+	    var result = {
+	        eq: [],
+	        ne1: [],
+	        ne2: [],
+	        ne2overrided: []
+	    };
+
+	    var fingerprints = Object.create(null);
+	    var declarations2hash = Object.create(null);
+
+	    for (var cursor = declarations2.head; cursor; cursor = cursor.next)  {
+	        declarations2hash[cursor.data.id] = true;
+	    }
+
+	    for (var cursor = declarations1.head; cursor; cursor = cursor.next)  {
+	        var data = cursor.data;
+
+	        if (data.fingerprint) {
+	            fingerprints[data.fingerprint] = data.important;
+	        }
+
+	        if (declarations2hash[data.id]) {
+	            declarations2hash[data.id] = false;
+	            result.eq.push(data);
+	        } else {
+	            result.ne1.push(data);
+	        }
+	    }
+
+	    for (var cursor = declarations2.head; cursor; cursor = cursor.next)  {
+	        var data = cursor.data;
+
+	        if (declarations2hash[data.id]) {
+	            // when declarations1 has an overriding declaration, this is not a difference
+	            // unless no !important is used on prev and !important is used on the following
+	            if (!hasOwnProperty$3.call(fingerprints, data.fingerprint) ||
+	                (!fingerprints[data.fingerprint] && data.important)) {
+	                result.ne2.push(data);
+	            }
+
+	            result.ne2overrided.push(data);
+	        }
+	    }
+
+	    return result;
+	}
+
+	function addSelectors(dest, source) {
+	    source.each(function(sourceData) {
+	        var newStr = sourceData.id;
+	        var cursor = dest.head;
+
+	        while (cursor) {
+	            var nextStr = cursor.data.id;
+
+	            if (nextStr === newStr) {
+	                return;
+	            }
+
+	            if (nextStr > newStr) {
+	                break;
+	            }
+
+	            cursor = cursor.next;
+	        }
+
+	        dest.insert(dest.createItem(sourceData), cursor);
+	    });
+
+	    return dest;
+	}
+
+	// check if simpleselectors has no equal specificity and element selector
+	function hasSimilarSelectors(selectors1, selectors2) {
+	    var cursor1 = selectors1.head;
+
+	    while (cursor1 !== null) {
+	        var cursor2 = selectors2.head;
+
+	        while (cursor2 !== null) {
+	            if (cursor1.data.compareMarker === cursor2.data.compareMarker) {
+	                return true;
+	            }
+
+	            cursor2 = cursor2.next;
+	        }
+
+	        cursor1 = cursor1.next;
+	    }
+
+	    return false;
+	}
+
+	// test node can't to be skipped
+	function unsafeToSkipNode(node) {
+	    switch (node.type) {
+	        case 'Rule':
+	            // unsafe skip ruleset with selector similarities
+	            return hasSimilarSelectors(node.prelude.children, this);
+
+	        case 'Atrule':
+	            // can skip at-rules with blocks
+	            if (node.block) {
+	                // unsafe skip at-rule if block contains something unsafe to skip
+	                return node.block.children.some(unsafeToSkipNode, this);
+	            }
+	            break;
+
+	        case 'Declaration':
+	            return false;
+	    }
+
+	    // unsafe by default
+	    return true;
+	}
+
+	var utils$1 = {
+	    isEqualSelectors: isEqualSelectors,
+	    isEqualDeclarations: isEqualDeclarations,
+	    compareDeclarations: compareDeclarations,
+	    addSelectors: addSelectors,
+	    hasSimilarSelectors: hasSimilarSelectors,
+	    unsafeToSkipNode: unsafeToSkipNode
+	};
+
+	var walk$5 = csstree_min.walk;
+
+
+	function processRule(node, item, list) {
+	    var selectors = node.prelude.children;
+	    var declarations = node.block.children;
+
+	    list.prevUntil(item.prev, function(prev) {
+	        // skip non-ruleset node if safe
+	        if (prev.type !== 'Rule') {
+	            return utils$1.unsafeToSkipNode.call(selectors, prev);
+	        }
+
+	        var prevSelectors = prev.prelude.children;
+	        var prevDeclarations = prev.block.children;
+
+	        // try to join rulesets with equal pseudo signature
+	        if (node.pseudoSignature === prev.pseudoSignature) {
+	            // try to join by selectors
+	            if (utils$1.isEqualSelectors(prevSelectors, selectors)) {
+	                prevDeclarations.appendList(declarations);
+	                list.remove(item);
+	                return true;
+	            }
+
+	            // try to join by declarations
+	            if (utils$1.isEqualDeclarations(declarations, prevDeclarations)) {
+	                utils$1.addSelectors(prevSelectors, selectors);
+	                list.remove(item);
+	                return true;
+	            }
+	        }
+
+	        // go to prev ruleset if has no selector similarities
+	        return utils$1.hasSimilarSelectors(selectors, prevSelectors);
+	    });
+	}
+
+	// NOTE: direction should be left to right, since rulesets merge to left
+	// ruleset. When direction right to left unmerged rulesets may prevent lookup
+	// TODO: remove initial merge
+	var _2InitialMergeRuleset = function initialMergeRule(ast) {
+	    walk$5(ast, {
+	        visit: 'Rule',
+	        enter: processRule
+	    });
+	};
+
+	var List$2 = csstree_min.List;
+	var walk$6 = csstree_min.walk;
+
+	function processRule$1(node, item, list) {
+	    var selectors = node.prelude.children;
+
+	    // generate new rule sets:
+	    // .a, .b { color: red; }
+	    // ->
+	    // .a { color: red; }
+	    // .b { color: red; }
+
+	    // while there are more than 1 simple selector split for rulesets
+	    while (selectors.head !== selectors.tail) {
+	        var newSelectors = new List$2();
+	        newSelectors.insert(selectors.remove(selectors.head));
+
+	        list.insert(list.createItem({
+	            type: 'Rule',
+	            loc: node.loc,
+	            prelude: {
+	                type: 'SelectorList',
+	                loc: node.prelude.loc,
+	                children: newSelectors
+	            },
+	            block: {
+	                type: 'Block',
+	                loc: node.block.loc,
+	                children: node.block.children.copy()
+	            },
+	            pseudoSignature: node.pseudoSignature
+	        }), item);
+	    }
+	}
+
+	var _3DisjoinRuleset = function disjoinRule(ast) {
+	    walk$6(ast, {
+	        visit: 'Rule',
+	        reverse: true,
+	        enter: processRule$1
+	    });
+	};
+
+	var List$3 = csstree_min.List;
+	var generate$3 = csstree_min.generate;
+	var walk$7 = csstree_min.walk;
+
+	var REPLACE = 1;
+	var REMOVE = 2;
+	var TOP = 0;
+	var RIGHT = 1;
+	var BOTTOM = 2;
+	var LEFT = 3;
+	var SIDES = ['top', 'right', 'bottom', 'left'];
+	var SIDE = {
+	    'margin-top': 'top',
+	    'margin-right': 'right',
+	    'margin-bottom': 'bottom',
+	    'margin-left': 'left',
+
+	    'padding-top': 'top',
+	    'padding-right': 'right',
+	    'padding-bottom': 'bottom',
+	    'padding-left': 'left',
+
+	    'border-top-color': 'top',
+	    'border-right-color': 'right',
+	    'border-bottom-color': 'bottom',
+	    'border-left-color': 'left',
+	    'border-top-width': 'top',
+	    'border-right-width': 'right',
+	    'border-bottom-width': 'bottom',
+	    'border-left-width': 'left',
+	    'border-top-style': 'top',
+	    'border-right-style': 'right',
+	    'border-bottom-style': 'bottom',
+	    'border-left-style': 'left'
+	};
+	var MAIN_PROPERTY = {
+	    'margin': 'margin',
+	    'margin-top': 'margin',
+	    'margin-right': 'margin',
+	    'margin-bottom': 'margin',
+	    'margin-left': 'margin',
+
+	    'padding': 'padding',
+	    'padding-top': 'padding',
+	    'padding-right': 'padding',
+	    'padding-bottom': 'padding',
+	    'padding-left': 'padding',
+
+	    'border-color': 'border-color',
+	    'border-top-color': 'border-color',
+	    'border-right-color': 'border-color',
+	    'border-bottom-color': 'border-color',
+	    'border-left-color': 'border-color',
+	    'border-width': 'border-width',
+	    'border-top-width': 'border-width',
+	    'border-right-width': 'border-width',
+	    'border-bottom-width': 'border-width',
+	    'border-left-width': 'border-width',
+	    'border-style': 'border-style',
+	    'border-top-style': 'border-style',
+	    'border-right-style': 'border-style',
+	    'border-bottom-style': 'border-style',
+	    'border-left-style': 'border-style'
+	};
+
+	function TRBL(name) {
+	    this.name = name;
+	    this.loc = null;
+	    this.iehack = undefined;
+	    this.sides = {
+	        'top': null,
+	        'right': null,
+	        'bottom': null,
+	        'left': null
+	    };
+	}
+
+	TRBL.prototype.getValueSequence = function(declaration, count) {
+	    var values = [];
+	    var iehack = '';
+	    var hasBadValues = declaration.value.type !== 'Value' || declaration.value.children.some(function(child) {
+	        var special = false;
+
+	        switch (child.type) {
+	            case 'Identifier':
+	                switch (child.name) {
+	                    case '\\0':
+	                    case '\\9':
+	                        iehack = child.name;
+	                        return;
+
+	                    case 'inherit':
+	                    case 'initial':
+	                    case 'unset':
+	                    case 'revert':
+	                        special = child.name;
+	                        break;
+	                }
+	                break;
+
+	            case 'Dimension':
+	                switch (child.unit) {
+	                    // is not supported until IE11
+	                    case 'rem':
+
+	                    // v* units is too buggy across browsers and better
+	                    // don't merge values with those units
+	                    case 'vw':
+	                    case 'vh':
+	                    case 'vmin':
+	                    case 'vmax':
+	                    case 'vm': // IE9 supporting "vm" instead of "vmin".
+	                        special = child.unit;
+	                        break;
+	                }
+	                break;
+
+	            case 'Hash': // color
+	            case 'Number':
+	            case 'Percentage':
+	                break;
+
+	            case 'Function':
+	                if (child.name === 'var') {
+	                    return true;
+	                }
+
+	                special = child.name;
+	                break;
+
+	            case 'WhiteSpace':
+	                return false; // ignore space
+
+	            default:
+	                return true;  // bad value
+	        }
+
+	        values.push({
+	            node: child,
+	            special: special,
+	            important: declaration.important
+	        });
+	    });
+
+	    if (hasBadValues || values.length > count) {
+	        return false;
+	    }
+
+	    if (typeof this.iehack === 'string' && this.iehack !== iehack) {
+	        return false;
+	    }
+
+	    this.iehack = iehack; // move outside
+
+	    return values;
+	};
+
+	TRBL.prototype.canOverride = function(side, value) {
+	    var currentValue = this.sides[side];
+
+	    return !currentValue || (value.important && !currentValue.important);
+	};
+
+	TRBL.prototype.add = function(name, declaration) {
+	    function attemptToAdd() {
+	        var sides = this.sides;
+	        var side = SIDE[name];
+
+	        if (side) {
+	            if (side in sides === false) {
+	                return false;
+	            }
+
+	            var values = this.getValueSequence(declaration, 1);
+
+	            if (!values || !values.length) {
+	                return false;
+	            }
+
+	            // can mix only if specials are equal
+	            for (var key in sides) {
+	                if (sides[key] !== null && sides[key].special !== values[0].special) {
+	                    return false;
+	                }
+	            }
+
+	            if (!this.canOverride(side, values[0])) {
+	                return true;
+	            }
+
+	            sides[side] = values[0];
+	            return true;
+	        } else if (name === this.name) {
+	            var values = this.getValueSequence(declaration, 4);
+
+	            if (!values || !values.length) {
+	                return false;
+	            }
+
+	            switch (values.length) {
+	                case 1:
+	                    values[RIGHT] = values[TOP];
+	                    values[BOTTOM] = values[TOP];
+	                    values[LEFT] = values[TOP];
+	                    break;
+
+	                case 2:
+	                    values[BOTTOM] = values[TOP];
+	                    values[LEFT] = values[RIGHT];
+	                    break;
+
+	                case 3:
+	                    values[LEFT] = values[RIGHT];
+	                    break;
+	            }
+
+	            // can mix only if specials are equal
+	            for (var i = 0; i < 4; i++) {
+	                for (var key in sides) {
+	                    if (sides[key] !== null && sides[key].special !== values[i].special) {
+	                        return false;
+	                    }
+	                }
+	            }
+
+	            for (var i = 0; i < 4; i++) {
+	                if (this.canOverride(SIDES[i], values[i])) {
+	                    sides[SIDES[i]] = values[i];
+	                }
+	            }
+
+	            return true;
+	        }
+	    }
+
+	    if (!attemptToAdd.call(this)) {
+	        return false;
+	    }
+
+	    // TODO: use it when we can refer to several points in source
+	    // if (this.loc) {
+	    //     this.loc = {
+	    //         primary: this.loc,
+	    //         merged: declaration.loc
+	    //     };
+	    // } else {
+	    //     this.loc = declaration.loc;
+	    // }
+	    if (!this.loc) {
+	        this.loc = declaration.loc;
+	    }
+
+	    return true;
+	};
+
+	TRBL.prototype.isOkToMinimize = function() {
+	    var top = this.sides.top;
+	    var right = this.sides.right;
+	    var bottom = this.sides.bottom;
+	    var left = this.sides.left;
+
+	    if (top && right && bottom && left) {
+	        var important =
+	            top.important +
+	            right.important +
+	            bottom.important +
+	            left.important;
+
+	        return important === 0 || important === 4;
+	    }
+
+	    return false;
+	};
+
+	TRBL.prototype.getValue = function() {
+	    var result = new List$3();
+	    var sides = this.sides;
+	    var values = [
+	        sides.top,
+	        sides.right,
+	        sides.bottom,
+	        sides.left
+	    ];
+	    var stringValues = [
+	        generate$3(sides.top.node),
+	        generate$3(sides.right.node),
+	        generate$3(sides.bottom.node),
+	        generate$3(sides.left.node)
+	    ];
+
+	    if (stringValues[LEFT] === stringValues[RIGHT]) {
+	        values.pop();
+	        if (stringValues[BOTTOM] === stringValues[TOP]) {
+	            values.pop();
+	            if (stringValues[RIGHT] === stringValues[TOP]) {
+	                values.pop();
+	            }
+	        }
+	    }
+
+	    for (var i = 0; i < values.length; i++) {
+	        if (i) {
+	            result.appendData({ type: 'WhiteSpace', value: ' ' });
+	        }
+
+	        result.appendData(values[i].node);
+	    }
+
+	    if (this.iehack) {
+	        result.appendData({ type: 'WhiteSpace', value: ' ' });
+	        result.appendData({
+	            type: 'Identifier',
+	            loc: null,
+	            name: this.iehack
+	        });
+	    }
+
+	    return {
+	        type: 'Value',
+	        loc: null,
+	        children: result
+	    };
+	};
+
+	TRBL.prototype.getDeclaration = function() {
+	    return {
+	        type: 'Declaration',
+	        loc: this.loc,
+	        important: this.sides.top.important,
+	        property: this.name,
+	        value: this.getValue()
+	    };
+	};
+
+	function processRule$2(rule, shorts, shortDeclarations, lastShortSelector) {
+	    var declarations = rule.block.children;
+	    var selector = rule.prelude.children.first().id;
+
+	    rule.block.children.eachRight(function(declaration, item) {
+	        var property = declaration.property;
+
+	        if (!MAIN_PROPERTY.hasOwnProperty(property)) {
+	            return;
+	        }
+
+	        var key = MAIN_PROPERTY[property];
+	        var shorthand;
+	        var operation;
+
+	        if (!lastShortSelector || selector === lastShortSelector) {
+	            if (key in shorts) {
+	                operation = REMOVE;
+	                shorthand = shorts[key];
+	            }
+	        }
+
+	        if (!shorthand || !shorthand.add(property, declaration)) {
+	            operation = REPLACE;
+	            shorthand = new TRBL(key);
+
+	            // if can't parse value ignore it and break shorthand children
+	            if (!shorthand.add(property, declaration)) {
+	                lastShortSelector = null;
+	                return;
+	            }
+	        }
+
+	        shorts[key] = shorthand;
+	        shortDeclarations.push({
+	            operation: operation,
+	            block: declarations,
+	            item: item,
+	            shorthand: shorthand
+	        });
+
+	        lastShortSelector = selector;
+	    });
+
+	    return lastShortSelector;
+	}
+
+	function processShorthands(shortDeclarations, markDeclaration) {
+	    shortDeclarations.forEach(function(item) {
+	        var shorthand = item.shorthand;
+
+	        if (!shorthand.isOkToMinimize()) {
+	            return;
+	        }
+
+	        if (item.operation === REPLACE) {
+	            item.item.data = markDeclaration(shorthand.getDeclaration());
+	        } else {
+	            item.block.remove(item.item);
+	        }
+	    });
+	}
+
+	var _4RestructShorthand = function restructBlock(ast, indexer) {
+	    var stylesheetMap = {};
+	    var shortDeclarations = [];
+
+	    walk$7(ast, {
+	        visit: 'Rule',
+	        reverse: true,
+	        enter: function(node) {
+	            var stylesheet = this.block || this.stylesheet;
+	            var ruleId = (node.pseudoSignature || '') + '|' + node.prelude.children.first().id;
+	            var ruleMap;
+	            var shorts;
+
+	            if (!stylesheetMap.hasOwnProperty(stylesheet.id)) {
+	                ruleMap = {
+	                    lastShortSelector: null
+	                };
+	                stylesheetMap[stylesheet.id] = ruleMap;
+	            } else {
+	                ruleMap = stylesheetMap[stylesheet.id];
+	            }
+
+	            if (ruleMap.hasOwnProperty(ruleId)) {
+	                shorts = ruleMap[ruleId];
+	            } else {
+	                shorts = {};
+	                ruleMap[ruleId] = shorts;
+	            }
+
+	            ruleMap.lastShortSelector = processRule$2.call(this, node, shorts, shortDeclarations, ruleMap.lastShortSelector);
+	        }
+	    });
+
+	    processShorthands(shortDeclarations, indexer.declaration);
+	};
+
+	var resolveProperty = csstree_min.property;
+	var resolveKeyword$4 = csstree_min.keyword;
+	var walk$8 = csstree_min.walk;
+	var generate$4 = csstree_min.generate;
+	var fingerprintId = 1;
+	var dontRestructure = {
+	    'src': 1 // https://github.com/afelix/csso/issues/50
+	};
+
+	var DONT_MIX_VALUE = {
+	    // https://developer.mozilla.org/en-US/docs/Web/CSS/display#Browser_compatibility
+	    'display': /table|ruby|flex|-(flex)?box$|grid|contents|run-in/i,
+	    // https://developer.mozilla.org/en/docs/Web/CSS/text-align
+	    'text-align': /^(start|end|match-parent|justify-all)$/i
+	};
+
+	var SAFE_VALUES = {
+	    cursor: [
+	        'auto', 'crosshair', 'default', 'move', 'text', 'wait', 'help',
+	        'n-resize', 'e-resize', 's-resize', 'w-resize',
+	        'ne-resize', 'nw-resize', 'se-resize', 'sw-resize',
+	        'pointer', 'progress', 'not-allowed', 'no-drop', 'vertical-text', 'all-scroll',
+	        'col-resize', 'row-resize'
+	    ],
+	    overflow: [
+	        'hidden', 'visible', 'scroll', 'auto'
+	    ],
+	    position: [
+	        'static', 'relative', 'absolute', 'fixed'
+	    ]
+	};
+
+	var NEEDLESS_TABLE = {
+	    'border-width': ['border'],
+	    'border-style': ['border'],
+	    'border-color': ['border'],
+	    'border-top': ['border'],
+	    'border-right': ['border'],
+	    'border-bottom': ['border'],
+	    'border-left': ['border'],
+	    'border-top-width': ['border-top', 'border-width', 'border'],
+	    'border-right-width': ['border-right', 'border-width', 'border'],
+	    'border-bottom-width': ['border-bottom', 'border-width', 'border'],
+	    'border-left-width': ['border-left', 'border-width', 'border'],
+	    'border-top-style': ['border-top', 'border-style', 'border'],
+	    'border-right-style': ['border-right', 'border-style', 'border'],
+	    'border-bottom-style': ['border-bottom', 'border-style', 'border'],
+	    'border-left-style': ['border-left', 'border-style', 'border'],
+	    'border-top-color': ['border-top', 'border-color', 'border'],
+	    'border-right-color': ['border-right', 'border-color', 'border'],
+	    'border-bottom-color': ['border-bottom', 'border-color', 'border'],
+	    'border-left-color': ['border-left', 'border-color', 'border'],
+	    'margin-top': ['margin'],
+	    'margin-right': ['margin'],
+	    'margin-bottom': ['margin'],
+	    'margin-left': ['margin'],
+	    'padding-top': ['padding'],
+	    'padding-right': ['padding'],
+	    'padding-bottom': ['padding'],
+	    'padding-left': ['padding'],
+	    'font-style': ['font'],
+	    'font-variant': ['font'],
+	    'font-weight': ['font'],
+	    'font-size': ['font'],
+	    'font-family': ['font'],
+	    'list-style-type': ['list-style'],
+	    'list-style-position': ['list-style'],
+	    'list-style-image': ['list-style']
+	};
+
+	function getPropertyFingerprint(propertyName, declaration, fingerprints) {
+	    var realName = resolveProperty(propertyName).basename;
+
+	    if (realName === 'background') {
+	        return propertyName + ':' + generate$4(declaration.value);
+	    }
+
+	    var declarationId = declaration.id;
+	    var fingerprint = fingerprints[declarationId];
+
+	    if (!fingerprint) {
+	        switch (declaration.value.type) {
+	            case 'Value':
+	                var vendorId = '';
+	                var iehack = '';
+	                var special = {};
+	                var raw = false;
+
+	                declaration.value.children.each(function walk(node) {
+	                    switch (node.type) {
+	                        case 'Value':
+	                        case 'Brackets':
+	                        case 'Parentheses':
+	                            node.children.each(walk);
+	                            break;
+
+	                        case 'Raw':
+	                            raw = true;
+	                            break;
+
+	                        case 'Identifier':
+	                            var name = node.name;
+
+	                            if (!vendorId) {
+	                                vendorId = resolveKeyword$4(name).vendor;
+	                            }
+
+	                            if (/\\[09]/.test(name)) {
+	                                iehack = RegExp.lastMatch;
+	                            }
+
+	                            if (SAFE_VALUES.hasOwnProperty(realName)) {
+	                                if (SAFE_VALUES[realName].indexOf(name) === -1) {
+	                                    special[name] = true;
+	                                }
+	                            } else if (DONT_MIX_VALUE.hasOwnProperty(realName)) {
+	                                if (DONT_MIX_VALUE[realName].test(name)) {
+	                                    special[name] = true;
+	                                }
+	                            }
+
+	                            break;
+
+	                        case 'Function':
+	                            var name = node.name;
+
+	                            if (!vendorId) {
+	                                vendorId = resolveKeyword$4(name).vendor;
+	                            }
+
+	                            if (name === 'rect') {
+	                                // there are 2 forms of rect:
+	                                //   rect(<top>, <right>, <bottom>, <left>) - standart
+	                                //   rect(<top> <right> <bottom> <left>) – backwards compatible syntax
+	                                // only the same form values can be merged
+	                                var hasComma = node.children.some(function(node) {
+	                                    return node.type === 'Operator' && node.value === ',';
+	                                });
+	                                if (!hasComma) {
+	                                    name = 'rect-backward';
+	                                }
+	                            }
+
+	                            special[name + '()'] = true;
+
+	                            // check nested tokens too
+	                            node.children.each(walk);
+
+	                            break;
+
+	                        case 'Dimension':
+	                            var unit = node.unit;
+
+	                            if (/\\[09]/.test(unit)) {
+	                                iehack = RegExp.lastMatch;
+	                            }
+
+	                            switch (unit) {
+	                                // is not supported until IE11
+	                                case 'rem':
+
+	                                // v* units is too buggy across browsers and better
+	                                // don't merge values with those units
+	                                case 'vw':
+	                                case 'vh':
+	                                case 'vmin':
+	                                case 'vmax':
+	                                case 'vm': // IE9 supporting "vm" instead of "vmin".
+	                                    special[unit] = true;
+	                                    break;
+	                            }
+	                            break;
+	                    }
+	                });
+
+	                fingerprint = raw
+	                    ? '!' + fingerprintId++
+	                    : '!' + Object.keys(special).sort() + '|' + iehack + vendorId;
+	                break;
+
+	            case 'Raw':
+	                fingerprint = '!' + declaration.value.value;
+	                break;
+
+	            default:
+	                fingerprint = generate$4(declaration.value);
+	        }
+
+	        fingerprints[declarationId] = fingerprint;
+	    }
+
+	    return propertyName + fingerprint;
+	}
+
+	function needless(props, declaration, fingerprints) {
+	    var property = resolveProperty(declaration.property);
+
+	    if (NEEDLESS_TABLE.hasOwnProperty(property.basename)) {
+	        var table = NEEDLESS_TABLE[property.basename];
+
+	        for (var i = 0; i < table.length; i++) {
+	            var ppre = getPropertyFingerprint(property.prefix + table[i], declaration, fingerprints);
+	            var prev = props.hasOwnProperty(ppre) ? props[ppre] : null;
+
+	            if (prev && (!declaration.important || prev.item.data.important)) {
+	                return prev;
+	            }
+	        }
+	    }
+	}
+
+	function processRule$3(rule, item, list, props, fingerprints) {
+	    var declarations = rule.block.children;
+
+	    declarations.eachRight(function(declaration, declarationItem) {
+	        var property = declaration.property;
+	        var fingerprint = getPropertyFingerprint(property, declaration, fingerprints);
+	        var prev = props[fingerprint];
+
+	        if (prev && !dontRestructure.hasOwnProperty(property)) {
+	            if (declaration.important && !prev.item.data.important) {
+	                props[fingerprint] = {
+	                    block: declarations,
+	                    item: declarationItem
+	                };
+
+	                prev.block.remove(prev.item);
+
+	                // TODO: use it when we can refer to several points in source
+	                // declaration.loc = {
+	                //     primary: declaration.loc,
+	                //     merged: prev.item.data.loc
+	                // };
+	            } else {
+	                declarations.remove(declarationItem);
+
+	                // TODO: use it when we can refer to several points in source
+	                // prev.item.data.loc = {
+	                //     primary: prev.item.data.loc,
+	                //     merged: declaration.loc
+	                // };
+	            }
+	        } else {
+	            var prev = needless(props, declaration, fingerprints);
+
+	            if (prev) {
+	                declarations.remove(declarationItem);
+
+	                // TODO: use it when we can refer to several points in source
+	                // prev.item.data.loc = {
+	                //     primary: prev.item.data.loc,
+	                //     merged: declaration.loc
+	                // };
+	            } else {
+	                declaration.fingerprint = fingerprint;
+
+	                props[fingerprint] = {
+	                    block: declarations,
+	                    item: declarationItem
+	                };
+	            }
+	        }
+	    });
+
+	    if (declarations.isEmpty()) {
+	        list.remove(item);
+	    }
+	}
+
+	var _6RestructBlock = function restructBlock(ast) {
+	    var stylesheetMap = {};
+	    var fingerprints = Object.create(null);
+
+	    walk$8(ast, {
+	        visit: 'Rule',
+	        reverse: true,
+	        enter: function(node, item, list) {
+	            var stylesheet = this.block || this.stylesheet;
+	            var ruleId = (node.pseudoSignature || '') + '|' + node.prelude.children.first().id;
+	            var ruleMap;
+	            var props;
+
+	            if (!stylesheetMap.hasOwnProperty(stylesheet.id)) {
+	                ruleMap = {};
+	                stylesheetMap[stylesheet.id] = ruleMap;
+	            } else {
+	                ruleMap = stylesheetMap[stylesheet.id];
+	            }
+
+	            if (ruleMap.hasOwnProperty(ruleId)) {
+	                props = ruleMap[ruleId];
+	            } else {
+	                props = {};
+	                ruleMap[ruleId] = props;
+	            }
+
+	            processRule$3.call(this, node, item, list, props, fingerprints);
+	        }
+	    });
+	};
+
+	var walk$9 = csstree_min.walk;
+
+
+	/*
+	    At this step all rules has single simple selector. We try to join by equal
+	    declaration blocks to first rule, e.g.
+
+	    .a { color: red }
+	    b { ... }
+	    .b { color: red }
+	    ->
+	    .a, .b { color: red }
+	    b { ... }
+	*/
+
+	function processRule$4(node, item, list) {
+	    var selectors = node.prelude.children;
+	    var declarations = node.block.children;
+	    var nodeCompareMarker = selectors.first().compareMarker;
+	    var skippedCompareMarkers = {};
+
+	    list.nextUntil(item.next, function(next, nextItem) {
+	        // skip non-ruleset node if safe
+	        if (next.type !== 'Rule') {
+	            return utils$1.unsafeToSkipNode.call(selectors, next);
+	        }
+
+	        if (node.pseudoSignature !== next.pseudoSignature) {
+	            return true;
+	        }
+
+	        var nextFirstSelector = next.prelude.children.head;
+	        var nextDeclarations = next.block.children;
+	        var nextCompareMarker = nextFirstSelector.data.compareMarker;
+
+	        // if next ruleset has same marked as one of skipped then stop joining
+	        if (nextCompareMarker in skippedCompareMarkers) {
+	            return true;
+	        }
+
+	        // try to join by selectors
+	        if (selectors.head === selectors.tail) {
+	            if (selectors.first().id === nextFirstSelector.data.id) {
+	                declarations.appendList(nextDeclarations);
+	                list.remove(nextItem);
+	                return;
+	            }
+	        }
+
+	        // try to join by properties
+	        if (utils$1.isEqualDeclarations(declarations, nextDeclarations)) {
+	            var nextStr = nextFirstSelector.data.id;
+
+	            selectors.some(function(data, item) {
+	                var curStr = data.id;
+
+	                if (nextStr < curStr) {
+	                    selectors.insert(nextFirstSelector, item);
+	                    return true;
+	                }
+
+	                if (!item.next) {
+	                    selectors.insert(nextFirstSelector);
+	                    return true;
+	                }
+	            });
+
+	            list.remove(nextItem);
+	            return;
+	        }
+
+	        // go to next ruleset if current one can be skipped (has no equal specificity nor element selector)
+	        if (nextCompareMarker === nodeCompareMarker) {
+	            return true;
+	        }
+
+	        skippedCompareMarkers[nextCompareMarker] = true;
+	    });
+	}
+
+	var _7MergeRuleset = function mergeRule(ast) {
+	    walk$9(ast, {
+	        visit: 'Rule',
+	        enter: processRule$4
+	    });
+	};
+
+	var List$4 = csstree_min.List;
+	var walk$a = csstree_min.walk;
+
+
+	function calcSelectorLength(list) {
+	    var length = 0;
+
+	    list.each(function(data) {
+	        length += data.id.length + 1;
+	    });
+
+	    return length - 1;
+	}
+
+	function calcDeclarationsLength(tokens) {
+	    var length = 0;
+
+	    for (var i = 0; i < tokens.length; i++) {
+	        length += tokens[i].length;
+	    }
+
+	    return (
+	        length +          // declarations
+	        tokens.length - 1 // delimeters
+	    );
+	}
+
+	function processRule$5(node, item, list) {
+	    var avoidRulesMerge = this.block !== null ? this.block.avoidRulesMerge : false;
+	    var selectors = node.prelude.children;
+	    var block = node.block;
+	    var disallowDownMarkers = Object.create(null);
+	    var allowMergeUp = true;
+	    var allowMergeDown = true;
+
+	    list.prevUntil(item.prev, function(prev, prevItem) {
+	        var prevBlock = prev.block;
+	        var prevType = prev.type;
+
+	        if (prevType !== 'Rule') {
+	            var unsafe = utils$1.unsafeToSkipNode.call(selectors, prev);
+
+	            if (!unsafe && prevType === 'Atrule' && prevBlock) {
+	                walk$a(prevBlock, {
+	                    visit: 'Rule',
+	                    enter: function(node) {
+	                        node.prelude.children.each(function(data) {
+	                            disallowDownMarkers[data.compareMarker] = true;
+	                        });
+	                    }
+	                });
+	            }
+
+	            return unsafe;
+	        }
+
+	        var prevSelectors = prev.prelude.children;
+
+	        if (node.pseudoSignature !== prev.pseudoSignature) {
+	            return true;
+	        }
+
+	        allowMergeDown = !prevSelectors.some(function(selector) {
+	            return selector.compareMarker in disallowDownMarkers;
+	        });
+
+	        // try prev ruleset if simpleselectors has no equal specifity and element selector
+	        if (!allowMergeDown && !allowMergeUp) {
+	            return true;
+	        }
+
+	        // try to join by selectors
+	        if (allowMergeUp && utils$1.isEqualSelectors(prevSelectors, selectors)) {
+	            prevBlock.children.appendList(block.children);
+	            list.remove(item);
+	            return true;
+	        }
+
+	        // try to join by properties
+	        var diff = utils$1.compareDeclarations(block.children, prevBlock.children);
+
+	        // console.log(diff.eq, diff.ne1, diff.ne2);
+
+	        if (diff.eq.length) {
+	            if (!diff.ne1.length && !diff.ne2.length) {
+	                // equal blocks
+	                if (allowMergeDown) {
+	                    utils$1.addSelectors(selectors, prevSelectors);
+	                    list.remove(prevItem);
+	                }
+
+	                return true;
+	            } else if (!avoidRulesMerge) { /* probably we don't need to prevent those merges for @keyframes
+	                                              TODO: need to be checked */
+
+	                if (diff.ne1.length && !diff.ne2.length) {
+	                    // prevBlock is subset block
+	                    var selectorLength = calcSelectorLength(selectors);
+	                    var blockLength = calcDeclarationsLength(diff.eq); // declarations length
+
+	                    if (allowMergeUp && selectorLength < blockLength) {
+	                        utils$1.addSelectors(prevSelectors, selectors);
+	                        block.children = new List$4().fromArray(diff.ne1);
+	                    }
+	                } else if (!diff.ne1.length && diff.ne2.length) {
+	                    // node is subset of prevBlock
+	                    var selectorLength = calcSelectorLength(prevSelectors);
+	                    var blockLength = calcDeclarationsLength(diff.eq); // declarations length
+
+	                    if (allowMergeDown && selectorLength < blockLength) {
+	                        utils$1.addSelectors(selectors, prevSelectors);
+	                        prevBlock.children = new List$4().fromArray(diff.ne2);
+	                    }
+	                } else {
+	                    // diff.ne1.length && diff.ne2.length
+	                    // extract equal block
+	                    var newSelector = {
+	                        type: 'SelectorList',
+	                        loc: null,
+	                        children: utils$1.addSelectors(prevSelectors.copy(), selectors)
+	                    };
+	                    var newBlockLength = calcSelectorLength(newSelector.children) + 2; // selectors length + curly braces length
+	                    var blockLength = calcDeclarationsLength(diff.eq); // declarations length
+
+	                    // create new ruleset if declarations length greater than
+	                    // ruleset description overhead
+	                    if (blockLength >= newBlockLength) {
+	                        var newItem = list.createItem({
+	                            type: 'Rule',
+	                            loc: null,
+	                            prelude: newSelector,
+	                            block: {
+	                                type: 'Block',
+	                                loc: null,
+	                                children: new List$4().fromArray(diff.eq)
+	                            },
+	                            pseudoSignature: node.pseudoSignature
+	                        });
+
+	                        block.children = new List$4().fromArray(diff.ne1);
+	                        prevBlock.children = new List$4().fromArray(diff.ne2overrided);
+
+	                        if (allowMergeUp) {
+	                            list.insert(newItem, prevItem);
+	                        } else {
+	                            list.insert(newItem, item);
+	                        }
+
+	                        return true;
+	                    }
+	                }
+	            }
+	        }
+
+	        if (allowMergeUp) {
+	            // TODO: disallow up merge only if any property interception only (i.e. diff.ne2overrided.length > 0);
+	            // await property families to find property interception correctly
+	            allowMergeUp = !prevSelectors.some(function(prevSelector) {
+	                return selectors.some(function(selector) {
+	                    return selector.compareMarker === prevSelector.compareMarker;
+	                });
+	            });
+	        }
+
+	        prevSelectors.each(function(data) {
+	            disallowDownMarkers[data.compareMarker] = true;
+	        });
+	    });
+	}
+
+	var _8RestructRuleset = function restructRule(ast) {
+	    walk$a(ast, {
+	        visit: 'Rule',
+	        reverse: true,
+	        enter: processRule$5
+	    });
+	};
+
+	var restructure = function(ast, options) {
+	    // prepare ast for restructing
+	    var indexer = prepare(ast, options);
+	    options.logger('prepare', ast);
+
+	    _1MergeAtrule(ast, options);
+	    options.logger('mergeAtrule', ast);
+
+	    _2InitialMergeRuleset(ast);
+	    options.logger('initialMergeRuleset', ast);
+
+	    _3DisjoinRuleset(ast);
+	    options.logger('disjoinRuleset', ast);
+
+	    _4RestructShorthand(ast, indexer);
+	    options.logger('restructShorthand', ast);
+
+	    _6RestructBlock(ast);
+	    options.logger('restructBlock', ast);
+
+	    _7MergeRuleset(ast);
+	    options.logger('mergeRuleset', ast);
+
+	    _8RestructRuleset(ast);
+	    options.logger('restructRuleset', ast);
+	};
+
+	var List$5 = csstree_min.List;
+	var clone = csstree_min.clone;
+
+
+
+
+	var walk$b = csstree_min.walk;
+
+	function readChunk(children, specialComments) {
+	    var buffer = new List$5();
+	    var nonSpaceTokenInBuffer = false;
+	    var protectedComment;
+
+	    children.nextUntil(children.head, function(node, item, list) {
+	        if (node.type === 'Comment') {
+	            if (!specialComments || node.value.charAt(0) !== '!') {
+	                list.remove(item);
+	                return;
+	            }
+
+	            if (nonSpaceTokenInBuffer || protectedComment) {
+	                return true;
+	            }
+
+	            list.remove(item);
+	            protectedComment = node;
+	            return;
+	        }
+
+	        if (node.type !== 'WhiteSpace') {
+	            nonSpaceTokenInBuffer = true;
+	        }
+
+	        buffer.insert(list.remove(item));
+	    });
+
+	    return {
+	        comment: protectedComment,
+	        stylesheet: {
+	            type: 'StyleSheet',
+	            loc: null,
+	            children: buffer
+	        }
+	    };
+	}
+
+	function compressChunk(ast, firstAtrulesAllowed, num, options) {
+	    options.logger('Compress block #' + num, null, true);
+
+	    var seed = 1;
+
+	    if (ast.type === 'StyleSheet') {
+	        ast.firstAtrulesAllowed = firstAtrulesAllowed;
+	        ast.id = seed++;
+	    }
+
+	    walk$b(ast, {
+	        visit: 'Atrule',
+	        enter: function markScopes(node) {
+	            if (node.block !== null) {
+	                node.block.id = seed++;
+	            }
+	        }
+	    });
+	    options.logger('init', ast);
+
+	    // remove redundant
+	    clean(ast, options);
+	    options.logger('clean', ast);
+
+	    // replace nodes for shortened forms
+	    replace(ast);
+	    options.logger('replace', ast);
+
+	    // structure optimisations
+	    if (options.restructuring) {
+	        restructure(ast, options);
+	    }
+
+	    return ast;
+	}
+
+	function getCommentsOption(options) {
+	    var comments = 'comments' in options ? options.comments : 'exclamation';
+
+	    if (typeof comments === 'boolean') {
+	        comments = comments ? 'exclamation' : false;
+	    } else if (comments !== 'exclamation' && comments !== 'first-exclamation') {
+	        comments = false;
+	    }
+
+	    return comments;
+	}
+
+	function getRestructureOption(options) {
+	    if ('restructure' in options) {
+	        return options.restructure;
+	    }
+
+	    return 'restructuring' in options ? options.restructuring : true;
+	}
+
+	function wrapBlock(block) {
+	    return new List$5().appendData({
+	        type: 'Rule',
+	        loc: null,
+	        prelude: {
+	            type: 'SelectorList',
+	            loc: null,
+	            children: new List$5().appendData({
+	                type: 'Selector',
+	                loc: null,
+	                children: new List$5().appendData({
+	                    type: 'TypeSelector',
+	                    loc: null,
+	                    name: 'x'
+	                })
+	            })
+	        },
+	        block: block
+	    });
+	}
+
+	var compress = function compress(ast, options) {
+	    ast = ast || { type: 'StyleSheet', loc: null, children: new List$5() };
+	    options = options || {};
+
+	    var compressOptions = {
+	        logger: typeof options.logger === 'function' ? options.logger : function() {},
+	        restructuring: getRestructureOption(options),
+	        forceMediaMerge: Boolean(options.forceMediaMerge),
+	        usage: options.usage ? usage.buildIndex(options.usage) : false
+	    };
+	    var specialComments = getCommentsOption(options);
+	    var firstAtrulesAllowed = true;
+	    var input;
+	    var output = new List$5();
+	    var chunk;
+	    var chunkNum = 1;
+	    var chunkChildren;
+
+	    if (options.clone) {
+	        ast = clone(ast);
+	    }
+
+	    if (ast.type === 'StyleSheet') {
+	        input = ast.children;
+	        ast.children = output;
+	    } else {
+	        input = wrapBlock(ast);
+	    }
+
+	    do {
+	        chunk = readChunk(input, Boolean(specialComments));
+	        compressChunk(chunk.stylesheet, firstAtrulesAllowed, chunkNum++, compressOptions);
+	        chunkChildren = chunk.stylesheet.children;
+
+	        if (chunk.comment) {
+	            // add \n before comment if there is another content in output
+	            if (!output.isEmpty()) {
+	                output.insert(List$5.createItem({
+	                    type: 'Raw',
+	                    value: '\n'
+	                }));
+	            }
+
+	            output.insert(List$5.createItem(chunk.comment));
+
+	            // add \n after comment if chunk is not empty
+	            if (!chunkChildren.isEmpty()) {
+	                output.insert(List$5.createItem({
+	                    type: 'Raw',
+	                    value: '\n'
+	                }));
+	            }
+	        }
+
+	        if (firstAtrulesAllowed && !chunkChildren.isEmpty()) {
+	            var lastRule = chunkChildren.last();
+
+	            if (lastRule.type !== 'Atrule' ||
+	               (lastRule.name !== 'import' && lastRule.name !== 'charset')) {
+	                firstAtrulesAllowed = false;
+	            }
+	        }
+
+	        if (specialComments !== 'exclamation') {
+	            specialComments = false;
+	        }
+
+	        output.appendList(chunkChildren);
+	    } while (!input.isEmpty());
+
+	    return {
+	        ast: ast
+	    };
+	};
+
+	var version = "4.2.0";
+	var _package = {
+		version: version
+	};
+
+	var _package$1 = /*#__PURE__*/Object.freeze({
+		__proto__: null,
+		version: version,
+		'default': _package
+	});
+
+	var require$$0 = getCjsExportFromNamespace(_package$1);
+
+	var parse = csstree_min.parse;
+
+	var generate$5 = csstree_min.generate;
+
+	function debugOutput(name, options, startTime, data) {
+	    if (options.debug) {
+	        console.error('## ' + name + ' done in %d ms\n', Date.now() - startTime);
+	    }
+
+	    return data;
+	}
+
+	function createDefaultLogger(level) {
+	    var lastDebug;
+
+	    return function logger(title, ast) {
+	        var line = title;
+
+	        if (ast) {
+	            line = '[' + ((Date.now() - lastDebug) / 1000).toFixed(3) + 's] ' + line;
+	        }
+
+	        if (level > 1 && ast) {
+	            var css = generate$5(ast);
+
+	            // when level 2, limit css to 256 symbols
+	            if (level === 2 && css.length > 256) {
+	                css = css.substr(0, 256) + '...';
+	            }
+
+	            line += '\n  ' + css + '\n';
+	        }
+
+	        console.error(line);
+	        lastDebug = Date.now();
+	    };
+	}
+
+	function copy(obj) {
+	    var result = {};
+
+	    for (var key in obj) {
+	        result[key] = obj[key];
+	    }
+
+	    return result;
+	}
+
+	function buildCompressOptions(options) {
+	    options = copy(options);
+
+	    if (typeof options.logger !== 'function' && options.debug) {
+	        options.logger = createDefaultLogger(options.debug);
+	    }
+
+	    return options;
+	}
+
+	function runHandler(ast, options, handlers) {
+	    if (!Array.isArray(handlers)) {
+	        handlers = [handlers];
+	    }
+
+	    handlers.forEach(function(fn) {
+	        fn(ast, options);
+	    });
+	}
+
+	function minify(context, source, options) {
+	    options = options || {};
+
+	    var filename = options.filename || '<unknown>';
+	    var result;
+
+	    // parse
+	    var ast = debugOutput('parsing', options, Date.now(),
+	        parse(source, {
+	            context: context,
+	            filename: filename,
+	            positions: Boolean(options.sourceMap)
+	        })
+	    );
+
+	    // before compress handlers
+	    if (options.beforeCompress) {
+	        debugOutput('beforeCompress', options, Date.now(),
+	            runHandler(ast, options, options.beforeCompress)
+	        );
+	    }
+
+	    // compress
+	    var compressResult = debugOutput('compress', options, Date.now(),
+	        compress(ast, buildCompressOptions(options))
+	    );
+
+	    // after compress handlers
+	    if (options.afterCompress) {
+	        debugOutput('afterCompress', options, Date.now(),
+	            runHandler(compressResult, options, options.afterCompress)
+	        );
+	    }
+
+	    // generate
+	    if (options.sourceMap) {
+	        result = debugOutput('generate(sourceMap: true)', options, Date.now(), (function() {
+	            var tmp = generate$5(compressResult.ast, { sourceMap: true });
+	            tmp.map._file = filename; // since other tools can relay on file in source map transform chain
+	            tmp.map.setSourceContent(filename, source);
+	            return tmp;
+	        }()));
+	    } else {
+	        result = debugOutput('generate', options, Date.now(), {
+	            css: generate$5(compressResult.ast),
+	            map: null
+	        });
+	    }
+
+	    return result;
+	}
+
+	function minifyStylesheet(source, options) {
+	    return minify('stylesheet', source, options);
+	}
+
+	function minifyBlock(source, options) {
+	    return minify('declarationList', source, options);
+	}
+
+	var lib = {
+	    version: require$$0.version,
+
+	    // main methods
+	    minify: minifyStylesheet,
+	    minifyBlock: minifyBlock,
+
+	    // css syntax parser/walkers/generator/etc
+	    syntax: Object.assign({
+	        compress: compress
+	    }, csstree_min)
+	};
+	var lib_1 = lib.version;
+	var lib_2 = lib.minify;
+	var lib_3 = lib.minifyBlock;
+	var lib_4 = lib.syntax;
+
+	exports.default = lib;
+	exports.minify = lib_2;
+	exports.minifyBlock = lib_3;
+	exports.syntax = lib_4;
+	exports.version = lib_1;
+
+	Object.defineProperty(exports, '__esModule', { value: true });
+
+})));
diff --git a/node_modules/csso/dist/csso.min.js b/node_modules/csso/dist/csso.min.js
new file mode 100644
index 0000000..2fe71e5
--- /dev/null
+++ b/node_modules/csso/dist/csso.min.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).csso={})}(this,(function(e){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var t=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e,t){e.exports=function(){function e(e){return{prev:null,next:null,data:e}}function t(e,t,n){var a;return null!==r?(a=r,r=r.cursor,a.prev=t,a.next=n,a.cursor=e.cursor):a={prev:t,next:n,cursor:e.cursor},e.cursor=a,a}function n(e){var t=e.cursor;e.cursor=t.cursor,t.prev=null,t.next=null,t.cursor=r,r=t}var r=null,a=function(){this.cursor=null,this.head=null,this.tail=null};a.createItem=e,a.prototype.createItem=e,a.prototype.updateCursors=function(e,t,n,r){for(var a=this.cursor;null!==a;)a.prev===e&&(a.prev=t),a.next===n&&(a.next=r),a=a.cursor},a.prototype.getSize=function(){for(var e=0,t=this.head;t;)e++,t=t.next;return e},a.prototype.fromArray=function(t){var n=null;this.head=null;for(var r=0;r<t.length;r++){var a=e(t[r]);null!==n?n.next=a:this.head=a,a.prev=n,n=a}return this.tail=n,this},a.prototype.toArray=function(){for(var e=this.head,t=[];e;)t.push(e.data),e=e.next;return t},a.prototype.toJSON=a.prototype.toArray,a.prototype.isEmpty=function(){return null===this.head},a.prototype.first=function(){return this.head&&this.head.data},a.prototype.last=function(){return this.tail&&this.tail.data},a.prototype.each=function(e,r){var a;void 0===r&&(r=this);for(var i=t(this,null,this.head);null!==i.next;)a=i.next,i.next=a.next,e.call(r,a.data,a,this);n(this)},a.prototype.forEach=a.prototype.each,a.prototype.eachRight=function(e,r){var a;void 0===r&&(r=this);for(var i=t(this,this.tail,null);null!==i.prev;)a=i.prev,i.prev=a.prev,e.call(r,a.data,a,this);n(this)},a.prototype.forEachRight=a.prototype.eachRight,a.prototype.reduce=function(e,r,a){var i;void 0===a&&(a=this);for(var o=t(this,null,this.head),s=r;null!==o.next;)i=o.next,o.next=i.next,s=e.call(a,s,i.data,i,this);return n(this),s},a.prototype.reduceRight=function(e,r,a){var i;void 0===a&&(a=this);for(var o=t(this,this.tail,null),s=r;null!==o.prev;)i=o.prev,o.prev=i.prev,s=e.call(a,s,i.data,i,this);return n(this),s},a.prototype.nextUntil=function(e,r,a){if(null!==e){var i;void 0===a&&(a=this);for(var o=t(this,null,e);null!==o.next&&(i=o.next,o.next=i.next,!r.call(a,i.data,i,this)););n(this)}},a.prototype.prevUntil=function(e,r,a){if(null!==e){var i;void 0===a&&(a=this);for(var o=t(this,e,null);null!==o.prev&&(i=o.prev,o.prev=i.prev,!r.call(a,i.data,i,this)););n(this)}},a.prototype.some=function(e,t){var n=this.head;for(void 0===t&&(t=this);null!==n;){if(e.call(t,n.data,n,this))return!0;n=n.next}return!1},a.prototype.map=function(e,t){var n=new a,r=this.head;for(void 0===t&&(t=this);null!==r;)n.appendData(e.call(t,r.data,r,this)),r=r.next;return n},a.prototype.filter=function(e,t){var n=new a,r=this.head;for(void 0===t&&(t=this);null!==r;)e.call(t,r.data,r,this)&&n.appendData(r.data),r=r.next;return n},a.prototype.clear=function(){this.head=null,this.tail=null},a.prototype.copy=function(){for(var t=new a,n=this.head;null!==n;)t.insert(e(n.data)),n=n.next;return t},a.prototype.prepend=function(e){return this.updateCursors(null,e,this.head,e),null!==this.head?(this.head.prev=e,e.next=this.head):this.tail=e,this.head=e,this},a.prototype.prependData=function(t){return this.prepend(e(t))},a.prototype.append=function(e){return this.insert(e)},a.prototype.appendData=function(t){return this.insert(e(t))},a.prototype.insert=function(e,t){if(null!=t)if(this.updateCursors(t.prev,e,t,e),null===t.prev){if(this.head!==t)throw new Error("before doesn't belong to list");this.head=e,t.prev=e,e.next=t,this.updateCursors(null,e)}else t.prev.next=e,e.prev=t.prev,t.prev=e,e.next=t;else this.updateCursors(this.tail,e,null,e),null!==this.tail?(this.tail.next=e,e.prev=this.tail):this.head=e,this.tail=e;return this},a.prototype.insertData=function(t,n){return this.insert(e(t),n)},a.prototype.remove=function(e){if(this.updateCursors(e,e.prev,e,e.next),null!==e.prev)e.prev.next=e.next;else{if(this.head!==e)throw new Error("item doesn't belong to list");this.head=e.next}if(null!==e.next)e.next.prev=e.prev;else{if(this.tail!==e)throw new Error("item doesn't belong to list");this.tail=e.prev}return e.prev=null,e.next=null,e},a.prototype.push=function(t){this.insert(e(t))},a.prototype.pop=function(){if(null!==this.tail)return this.remove(this.tail)},a.prototype.unshift=function(t){this.prepend(e(t))},a.prototype.shift=function(){if(null!==this.head)return this.remove(this.head)},a.prototype.prependList=function(e){return this.insertList(e,this.head)},a.prototype.appendList=function(e){return this.insertList(e)},a.prototype.insertList=function(e,t){return null===e.head||(null!=t?(this.updateCursors(t.prev,e.tail,t,e.head),null!==t.prev?(t.prev.next=e.head,e.head.prev=t.prev):this.head=e.head,t.prev=e.tail,e.tail.next=t):(this.updateCursors(this.tail,e.tail,null,e.head),null!==this.tail?(this.tail.next=e.head,e.head.prev=this.tail):this.head=e.head,this.tail=e.tail),e.head=null,e.tail=null),this},a.prototype.replace=function(e,t){"head"in t?this.insertList(t,e):this.insert(t,e),this.remove(e)};var i=a,o=function(e,t){var n=Object.create(SyntaxError.prototype),r=new Error;return n.name=e,n.message=t,Object.defineProperty(n,"stack",{get:function(){return(r.stack||"").replace(/^(.+\n){1,3}/,e+": "+t+"\n")}}),n};function s(e,t){function n(e,t){return r.slice(e,t).map((function(t,n){for(var r=String(e+n+1);r.length<l;)r=" "+r;return r+" |"+t})).join("\n")}var r=e.source.split(/\r\n?|\n|\f/),a=e.line,i=e.column,o=Math.max(1,a-t)-1,s=Math.min(a+t,r.length+1),l=Math.max(4,String(s).length)+1,c=0;(i+=("    ".length-1)*(r[a-1].substr(0,i-1).match(/\t/g)||[]).length)>100&&(c=i-60+3,i=58);for(var u=o;u<=s;u++)u>=0&&u<r.length&&(r[u]=r[u].replace(/\t/g,"    "),r[u]=(c>0&&r[u].length>c?"…":"")+r[u].substr(c,98)+(r[u].length>c+100-1?"…":""));return[n(o,a),new Array(i+l+2).join("-")+"^",n(a,s)].filter(Boolean).join("\n")}var l=function(e,t,n,r,a){var i=o("SyntaxError",e);return i.source=t,i.offset=n,i.line=r,i.column=a,i.sourceFragment=function(e){return s(i,isNaN(e)?0:e)},Object.defineProperty(i,"formattedMessage",{get:function(){return"Parse error: "+i.message+"\n"+s(i,2)}}),i.parseError={offset:n,line:r,column:a},i},c={EOF:0,Ident:1,Function:2,AtKeyword:3,Hash:4,String:5,BadString:6,Url:7,BadUrl:8,Delim:9,Number:10,Percentage:11,Dimension:12,WhiteSpace:13,CDO:14,CDC:15,Colon:16,Semicolon:17,Comma:18,LeftSquareBracket:19,RightSquareBracket:20,LeftParenthesis:21,RightParenthesis:22,LeftCurlyBracket:23,RightCurlyBracket:24,Comment:25},u=Object.keys(c).reduce((function(e,t){return e[c[t]]=t,e}),{}),h={TYPE:c,NAME:u};function d(e){return e>=48&&e<=57}function p(e){return e>=65&&e<=90}function m(e){return e>=97&&e<=122}function f(e){return p(e)||m(e)}function g(e){return e>=128}function b(e){return f(e)||g(e)||95===e}function y(e){return e>=0&&e<=8||11===e||e>=14&&e<=31||127===e}function v(e){return 10===e||13===e||12===e}function k(e){return v(e)||32===e||9===e}function w(e,t){return 92===e&&!v(t)&&0!==t}var x=new Array(128);C.Eof=128,C.WhiteSpace=130,C.Digit=131,C.NameStart=132,C.NonPrintable=133;for(var S=0;S<x.length;S++)switch(!0){case k(S):x[S]=C.WhiteSpace;break;case d(S):x[S]=C.Digit;break;case b(S):x[S]=C.NameStart;break;case y(S):x[S]=C.NonPrintable;break;default:x[S]=S||C.Eof}function C(e){return e<128?x[e]:C.NameStart}var A={isDigit:d,isHexDigit:function(e){return d(e)||e>=65&&e<=70||e>=97&&e<=102},isUppercaseLetter:p,isLowercaseLetter:m,isLetter:f,isNonAscii:g,isNameStart:b,isName:function(e){return b(e)||d(e)||45===e},isNonPrintable:y,isNewline:v,isWhiteSpace:k,isValidEscape:w,isIdentifierStart:function(e,t,n){return 45===e?b(t)||45===t||w(t,n):!!b(e)||92===e&&w(e,t)},isNumberStart:function(e,t,n){return 43===e||45===e?d(t)?2:46===t&&d(n)?3:0:46===e?d(t)?2:0:d(e)?1:0},isBOM:function(e){return 65279===e||65534===e?1:0},charCodeCategory:C},z=A.isDigit,P=A.isHexDigit,L=A.isUppercaseLetter,T=A.isName,E=A.isWhiteSpace,O=A.isValidEscape;function D(e,t){return t<e.length?e.charCodeAt(t):0}function I(e,t,n){return 13===n&&10===D(e,t+1)?2:1}function R(e,t,n){var r=e.charCodeAt(t);return L(r)&&(r|=32),r===n}function N(e,t){for(;t<e.length&&z(e.charCodeAt(t));t++);return t}function B(e,t){if(P(D(e,(t+=2)-1))){for(var n=Math.min(e.length,t+5);t<n&&P(D(e,t));t++);var r=D(e,t);E(r)&&(t+=I(e,t,r))}return t}var M={consumeEscaped:B,consumeName:function(e,t){for(;t<e.length;t++){var n=e.charCodeAt(t);if(!T(n)){if(!O(n,D(e,t+1)))break;t=B(e,t)-1}}return t},consumeNumber:function(e,t){var n=e.charCodeAt(t);if(43!==n&&45!==n||(n=e.charCodeAt(t+=1)),z(n)&&(t=N(e,t+1),n=e.charCodeAt(t)),46===n&&z(e.charCodeAt(t+1))&&(n=e.charCodeAt(t+=2),t=N(e,t)),R(e,t,101)){var r=0;45!==(n=e.charCodeAt(t+1))&&43!==n||(r=1,n=e.charCodeAt(t+2)),z(n)&&(t=N(e,t+1+r+1))}return t},consumeBadUrlRemnants:function(e,t){for(;t<e.length;t++){var n=e.charCodeAt(t);if(41===n){t++;break}O(n,D(e,t+1))&&(t=B(e,t))}return t},cmpChar:R,cmpStr:function(e,t,n,r){if(n-t!==r.length)return!1;if(t<0||n>e.length)return!1;for(var a=t;a<n;a++){var i=e.charCodeAt(a),o=r.charCodeAt(a-t);if(L(i)&&(i|=32),i!==o)return!1}return!0},getNewlineLength:I,findWhiteSpaceStart:function(e,t){for(;t>=0&&E(e.charCodeAt(t));t--);return t+1},findWhiteSpaceEnd:function(e,t){for(;t<e.length&&E(e.charCodeAt(t));t++);return t}},j=h.TYPE,_=h.NAME,q=M.cmpStr,W=j.EOF,F=j.WhiteSpace,U=j.Comment,Y=function(){this.offsetAndType=null,this.balance=null,this.reset()};Y.prototype={reset:function(){this.eof=!1,this.tokenIndex=-1,this.tokenType=0,this.tokenStart=this.firstCharOffset,this.tokenEnd=this.firstCharOffset},lookupType:function(e){return(e+=this.tokenIndex)<this.tokenCount?this.offsetAndType[e]>>24:W},lookupOffset:function(e){return(e+=this.tokenIndex)<this.tokenCount?16777215&this.offsetAndType[e-1]:this.source.length},lookupValue:function(e,t){return(e+=this.tokenIndex)<this.tokenCount&&q(this.source,16777215&this.offsetAndType[e-1],16777215&this.offsetAndType[e],t)},getTokenStart:function(e){return e===this.tokenIndex?this.tokenStart:e>0?e<this.tokenCount?16777215&this.offsetAndType[e-1]:16777215&this.offsetAndType[this.tokenCount]:this.firstCharOffset},getRawLength:function(e,t){var n,r=e,a=16777215&this.offsetAndType[Math.max(r-1,0)];e:for(;r<this.tokenCount&&!((n=this.balance[r])<e);r++)switch(t(this.offsetAndType[r]>>24,this.source,a)){case 1:break e;case 2:r++;break e;default:a=16777215&this.offsetAndType[r],this.balance[n]===r&&(r=n)}return r-this.tokenIndex},isBalanceEdge:function(e){return this.balance[this.tokenIndex]<e},isDelim:function(e,t){return t?this.lookupType(t)===j.Delim&&this.source.charCodeAt(this.lookupOffset(t))===e:this.tokenType===j.Delim&&this.source.charCodeAt(this.tokenStart)===e},getTokenValue:function(){return this.source.substring(this.tokenStart,this.tokenEnd)},getTokenLength:function(){return this.tokenEnd-this.tokenStart},substrToCursor:function(e){return this.source.substring(e,this.tokenStart)},skipWS:function(){for(var e=this.tokenIndex,t=0;e<this.tokenCount&&this.offsetAndType[e]>>24===F;e++,t++);t>0&&this.skip(t)},skipSC:function(){for(;this.tokenType===F||this.tokenType===U;)this.next()},skip:function(e){var t=this.tokenIndex+e;t<this.tokenCount?(this.tokenIndex=t,this.tokenStart=16777215&this.offsetAndType[t-1],t=this.offsetAndType[t],this.tokenType=t>>24,this.tokenEnd=16777215&t):(this.tokenIndex=this.tokenCount,this.next())},next:function(){var e=this.tokenIndex+1;e<this.tokenCount?(this.tokenIndex=e,this.tokenStart=this.tokenEnd,e=this.offsetAndType[e],this.tokenType=e>>24,this.tokenEnd=16777215&e):(this.tokenIndex=this.tokenCount,this.eof=!0,this.tokenType=W,this.tokenStart=this.tokenEnd=this.source.length)},forEachToken(e){for(var t=0,n=this.firstCharOffset;t<this.tokenCount;t++){var r=n,a=this.offsetAndType[t],i=16777215&a;n=i,e(a>>24,r,i,t)}},dump(){var e=new Array(this.tokenCount);return this.forEachToken((t,n,r,a)=>{e[a]={idx:a,type:_[t],chunk:this.source.substring(n,r),balance:this.balance[a]}}),e}};var H=Y;function V(e){return e}var K=function(e,t){var n=V,r=!1,a=!1;return"function"==typeof t?n=t:t&&(r=Boolean(t.forceBraces),a=Boolean(t.compact),"function"==typeof t.decorate&&(n=t.decorate)),function e(t,n,r,a){var i,o;switch(t.type){case"Group":i=function(t,n,r,a){var i=" "===t.combinator||a?t.combinator:" "+t.combinator+" ",o=t.terms.map((function(t){return e(t,n,r,a)})).join(i);return(t.explicit||r)&&(o=(a||","===o[0]?"[":"[ ")+o+(a?"]":" ]")),o}(t,n,r,a)+(t.disallowEmpty?"!":"");break;case"Multiplier":return e(t.term,n,r,a)+n(0===(o=t).min&&0===o.max?"*":0===o.min&&1===o.max?"?":1===o.min&&0===o.max?o.comma?"#":"+":1===o.min&&1===o.max?"":(o.comma?"#":"")+(o.min===o.max?"{"+o.min+"}":"{"+o.min+","+(0!==o.max?o.max:"")+"}"),t);case"Type":i="<"+t.name+(t.opts?n(function(e){switch(e.type){case"Range":return" ["+(null===e.min?"-∞":e.min)+","+(null===e.max?"∞":e.max)+"]";default:throw new Error("Unknown node type `"+e.type+"`")}}(t.opts),t.opts):"")+">";break;case"Property":i="<'"+t.name+"'>";break;case"Keyword":i=t.name;break;case"AtKeyword":i="@"+t.name;break;case"Function":i=t.name+"(";break;case"String":case"Token":i=t.value;break;case"Comma":i=",";break;default:throw new Error("Unknown node type `"+t.type+"`")}return n(i,t)}(e,n,r,a)};const G={offset:0,line:1,column:1};function $(e,t){const n=e&&e.loc&&e.loc[t];return n?"line"in n?Q(n):n:null}function Q({offset:e,line:t,column:n},r){const a={offset:e,line:t,column:n};if(r){const e=r.split(/\n|\r\n?|\f/);a.offset+=r.length,a.line+=e.length-1,a.column=1===e.length?a.column+r.length:e.pop().length+1}return a}var X=Object.prototype.hasOwnProperty,Z=Object.create(null),J=Object.create(null);function ee(e,t){return t=t||0,e.length-t>=2&&45===e.charCodeAt(t)&&45===e.charCodeAt(t+1)}function te(e,t){if(t=t||0,e.length-t>=3&&45===e.charCodeAt(t)&&45!==e.charCodeAt(t+1)){var n=e.indexOf("-",t+2);if(-1!==n)return e.substring(t,n+1)}return""}var ne={keyword:function(e){if(X.call(Z,e))return Z[e];var t=e.toLowerCase();if(X.call(Z,t))return Z[e]=Z[t];var n=ee(t,0),r=n?"":te(t,0);return Z[e]=Object.freeze({basename:t.substr(r.length),name:t,vendor:r,prefix:r,custom:n})},property:function(e){if(X.call(J,e))return J[e];var t=e,n=e[0];"/"===n?n="/"===e[1]?"//":"/":"_"!==n&&"*"!==n&&"$"!==n&&"#"!==n&&"+"!==n&&"&"!==n&&(n="");var r=ee(t,n.length);if(!r&&(t=t.toLowerCase(),X.call(J,t)))return J[e]=J[t];var a=r?"":te(t,n.length),i=t.substr(0,n.length+a.length);return J[e]=Object.freeze({basename:t.substr(i.length),name:t.substr(n.length),hack:n,vendor:a,prefix:i,custom:r})},isCustomProperty:ee,vendorPrefix:te},re="undefined"!=typeof Uint32Array?Uint32Array:Array,ae=function(e,t){return null===e||e.length<t?new re(Math.max(t+1024,16384)):e},ie=h.TYPE,oe=A.isNewline,se=A.isName,le=A.isValidEscape,ce=A.isNumberStart,ue=A.isIdentifierStart,he=A.charCodeCategory,de=A.isBOM,pe=M.cmpStr,me=M.getNewlineLength,fe=M.findWhiteSpaceEnd,ge=M.consumeEscaped,be=M.consumeName,ye=M.consumeNumber,ve=M.consumeBadUrlRemnants;function ke(e,t){function n(t){return t<o?e.charCodeAt(t):0}function r(){return h=ye(e,h),ue(n(h),n(h+1),n(h+2))?(g=ie.Dimension,void(h=be(e,h))):37===n(h)?(g=ie.Percentage,void h++):void(g=ie.Number)}function a(){const t=h;return h=be(e,h),pe(e,t,h,"url")&&40===n(h)?34===n(h=fe(e,h+1))||39===n(h)?(g=ie.Function,void(h=t+4)):void function(){for(g=ie.Url,h=fe(e,h);h<e.length;h++){var t=e.charCodeAt(h);switch(he(t)){case 41:return void h++;case he.Eof:return;case he.WhiteSpace:return 41===n(h=fe(e,h))||h>=e.length?void(h<e.length&&h++):(h=ve(e,h),void(g=ie.BadUrl));case 34:case 39:case 40:case he.NonPrintable:return h=ve(e,h),void(g=ie.BadUrl);case 92:if(le(t,n(h+1))){h=ge(e,h)-1;break}return h=ve(e,h),void(g=ie.BadUrl)}}}():40===n(h)?(g=ie.Function,void h++):void(g=ie.Ident)}function i(t){for(t||(t=n(h++)),g=ie.String;h<e.length;h++){var r=e.charCodeAt(h);switch(he(r)){case t:return void h++;case he.Eof:return;case he.WhiteSpace:if(oe(r))return h+=me(e,h,r),void(g=ie.BadString);break;case 92:if(h===e.length-1)break;var a=n(h+1);oe(a)?h+=me(e,h+1,a):le(r,a)&&(h=ge(e,h)-1)}}}t||(t=new H);for(var o=(e=String(e||"")).length,s=ae(t.offsetAndType,o+1),l=ae(t.balance,o+1),c=0,u=de(n(0)),h=u,d=0,p=0,m=0;h<o;){var f=e.charCodeAt(h),g=0;switch(l[c]=o,he(f)){case he.WhiteSpace:g=ie.WhiteSpace,h=fe(e,h+1);break;case 34:i();break;case 35:se(n(h+1))||le(n(h+1),n(h+2))?(g=ie.Hash,h=be(e,h+1)):(g=ie.Delim,h++);break;case 39:i();break;case 40:g=ie.LeftParenthesis,h++;break;case 41:g=ie.RightParenthesis,h++;break;case 43:ce(f,n(h+1),n(h+2))?r():(g=ie.Delim,h++);break;case 44:g=ie.Comma,h++;break;case 45:ce(f,n(h+1),n(h+2))?r():45===n(h+1)&&62===n(h+2)?(g=ie.CDC,h+=3):ue(f,n(h+1),n(h+2))?a():(g=ie.Delim,h++);break;case 46:ce(f,n(h+1),n(h+2))?r():(g=ie.Delim,h++);break;case 47:42===n(h+1)?(g=ie.Comment,1===(h=e.indexOf("*/",h+2)+2)&&(h=e.length)):(g=ie.Delim,h++);break;case 58:g=ie.Colon,h++;break;case 59:g=ie.Semicolon,h++;break;case 60:33===n(h+1)&&45===n(h+2)&&45===n(h+3)?(g=ie.CDO,h+=4):(g=ie.Delim,h++);break;case 64:ue(n(h+1),n(h+2),n(h+3))?(g=ie.AtKeyword,h=be(e,h+1)):(g=ie.Delim,h++);break;case 91:g=ie.LeftSquareBracket,h++;break;case 92:le(f,n(h+1))?a():(g=ie.Delim,h++);break;case 93:g=ie.RightSquareBracket,h++;break;case 123:g=ie.LeftCurlyBracket,h++;break;case 125:g=ie.RightCurlyBracket,h++;break;case he.Digit:r();break;case he.NameStart:a();break;case he.Eof:break;default:g=ie.Delim,h++}switch(g){case d:for(d=(p=l[m=16777215&p])>>24,l[c]=m,l[m++]=c;m<c;m++)l[m]===o&&(l[m]=c);break;case ie.LeftParenthesis:case ie.Function:l[c]=p,p=(d=ie.RightParenthesis)<<24|c;break;case ie.LeftSquareBracket:l[c]=p,p=(d=ie.RightSquareBracket)<<24|c;break;case ie.LeftCurlyBracket:l[c]=p,p=(d=ie.RightCurlyBracket)<<24|c}s[c++]=g<<24|h}for(s[c]=ie.EOF<<24|h,l[c]=o,l[o]=o;0!==p;)p=l[m=16777215&p],l[m]=o;return t.source=e,t.firstCharOffset=u,t.offsetAndType=s,t.tokenCount=c,t.balance=l,t.reset(),t.next(),t}Object.keys(h).forEach((function(e){ke[e]=h[e]})),Object.keys(A).forEach((function(e){ke[e]=A[e]})),Object.keys(M).forEach((function(e){ke[e]=M[e]}));var we=ke,xe=we.isDigit,Se=we.cmpChar,Ce=we.TYPE,Ae=Ce.Delim,ze=Ce.WhiteSpace,Pe=Ce.Comment,Le=Ce.Ident,Te=Ce.Number,Ee=Ce.Dimension;function Oe(e,t){return null!==e&&e.type===Ae&&e.value.charCodeAt(0)===t}function De(e,t,n){for(;null!==e&&(e.type===ze||e.type===Pe);)e=n(++t);return t}function Ie(e,t,n,r){if(!e)return 0;var a=e.value.charCodeAt(t);if(43===a||45===a){if(n)return 0;t++}for(;t<e.value.length;t++)if(!xe(e.value.charCodeAt(t)))return 0;return r+1}function Re(e,t,n){var r=!1,a=De(e,t,n);if(null===(e=n(a)))return t;if(e.type!==Te){if(!Oe(e,43)&&!Oe(e,45))return t;if(r=!0,a=De(n(++a),a,n),null===(e=n(a))&&e.type!==Te)return 0}if(!r){var i=e.value.charCodeAt(0);if(43!==i&&45!==i)return 0}return Ie(e,r?0:1,r,a)}var Ne=we.isHexDigit,Be=we.cmpChar,Me=we.TYPE,je=Me.Ident,_e=Me.Delim,qe=Me.Number,We=Me.Dimension;function Fe(e,t){return null!==e&&e.type===_e&&e.value.charCodeAt(0)===t}function Ue(e,t){return e.value.charCodeAt(0)===t}function Ye(e,t,n){for(var r=t,a=0;r<e.value.length;r++){var i=e.value.charCodeAt(r);if(45===i&&n&&0!==a)return Ye(e,t+a+1,!1)>0?6:0;if(!Ne(i))return 0;if(++a>6)return 0}return a}function He(e,t,n){if(!e)return 0;for(;Fe(n(t),63);){if(++e>6)return 0;t++}return t}var Ve=we.isIdentifierStart,Ke=we.isHexDigit,Ge=we.isDigit,$e=we.cmpStr,Qe=we.consumeNumber,Xe=we.TYPE,Ze=["unset","initial","inherit"],Je=["calc(","-moz-calc(","-webkit-calc("];function et(e,t){return t<e.length?e.charCodeAt(t):0}function tt(e,t){return $e(e,0,e.length,t)}function nt(e,t){for(var n=0;n<t.length;n++)if(tt(e,t[n]))return!0;return!1}function rt(e,t){return t===e.length-2&&92===e.charCodeAt(t)&&Ge(e.charCodeAt(t+1))}function at(e,t,n){if(e&&"Range"===e.type){var r=Number(void 0!==n&&n!==t.length?t.substr(0,n):t);if(isNaN(r))return!0;if(null!==e.min&&r<e.min)return!0;if(null!==e.max&&r>e.max)return!0}return!1}function it(e,t){var n=e.index,r=0;do{if(r++,e.balance<=n)break}while(e=t(r));return r}function ot(e){return function(t,n,r){return null===t?0:t.type===Xe.Function&&nt(t.value,Je)?it(t,n):e(t,n,r)}}function st(e){return function(t){return null===t||t.type!==e?0:1}}function lt(e){return function(t,n,r){if(null===t||t.type!==Xe.Dimension)return 0;var a=Qe(t.value,0);if(null!==e){var i=t.value.indexOf("\\",a),o=-1!==i&&rt(t.value,i)?t.value.substring(a,i):t.value.substr(a);if(!1===e.hasOwnProperty(o.toLowerCase()))return 0}return at(r,t.value,a)?0:1}}function ct(e){return"function"!=typeof e&&(e=function(){return 0}),function(t,n,r){return null!==t&&t.type===Xe.Number&&0===Number(t.value)?1:e(t,n,r)}}var ut={"ident-token":st(Xe.Ident),"function-token":st(Xe.Function),"at-keyword-token":st(Xe.AtKeyword),"hash-token":st(Xe.Hash),"string-token":st(Xe.String),"bad-string-token":st(Xe.BadString),"url-token":st(Xe.Url),"bad-url-token":st(Xe.BadUrl),"delim-token":st(Xe.Delim),"number-token":st(Xe.Number),"percentage-token":st(Xe.Percentage),"dimension-token":st(Xe.Dimension),"whitespace-token":st(Xe.WhiteSpace),"CDO-token":st(Xe.CDO),"CDC-token":st(Xe.CDC),"colon-token":st(Xe.Colon),"semicolon-token":st(Xe.Semicolon),"comma-token":st(Xe.Comma),"[-token":st(Xe.LeftSquareBracket),"]-token":st(Xe.RightSquareBracket),"(-token":st(Xe.LeftParenthesis),")-token":st(Xe.RightParenthesis),"{-token":st(Xe.LeftCurlyBracket),"}-token":st(Xe.RightCurlyBracket),string:st(Xe.String),ident:st(Xe.Ident),"custom-ident":function(e){if(null===e||e.type!==Xe.Ident)return 0;var t=e.value.toLowerCase();return nt(t,Ze)||tt(t,"default")?0:1},"custom-property-name":function(e){return null===e||e.type!==Xe.Ident||45!==et(e.value,0)||45!==et(e.value,1)?0:1},"hex-color":function(e){if(null===e||e.type!==Xe.Hash)return 0;var t=e.value.length;if(4!==t&&5!==t&&7!==t&&9!==t)return 0;for(var n=1;n<t;n++)if(!Ke(e.value.charCodeAt(n)))return 0;return 1},"id-selector":function(e){return null===e||e.type!==Xe.Hash?0:Ve(et(e.value,1),et(e.value,2),et(e.value,3))?1:0},"an-plus-b":function(e,t){var n=0;if(!e)return 0;if(e.type===Te)return Ie(e,0,!1,n);if(e.type===Le&&45===e.value.charCodeAt(0)){if(!Se(e.value,1,110))return 0;switch(e.value.length){case 2:return Re(t(++n),n,t);case 3:return 45!==e.value.charCodeAt(2)?0:(n=De(t(++n),n,t),Ie(e=t(n),0,!0,n));default:return 45!==e.value.charCodeAt(2)?0:Ie(e,3,!0,n)}}else if(e.type===Le||Oe(e,43)&&t(n+1).type===Le){if(e.type!==Le&&(e=t(++n)),null===e||!Se(e.value,0,110))return 0;switch(e.value.length){case 1:return Re(t(++n),n,t);case 2:return 45!==e.value.charCodeAt(1)?0:(n=De(t(++n),n,t),Ie(e=t(n),0,!0,n));default:return 45!==e.value.charCodeAt(1)?0:Ie(e,2,!0,n)}}else if(e.type===Ee){for(var r=e.value.charCodeAt(0),a=43===r||45===r?1:0,i=a;i<e.value.length&&xe(e.value.charCodeAt(i));i++);return i===a?0:Se(e.value,i,110)?i+1===e.value.length?Re(t(++n),n,t):45!==e.value.charCodeAt(i+1)?0:i+2===e.value.length?(n=De(t(++n),n,t),Ie(e=t(n),0,!0,n)):Ie(e,i+2,!0,n):0}return 0},urange:function(e,t){var n=0;if(null===e||e.type!==je||!Be(e.value,0,117))return 0;if(null===(e=t(++n)))return 0;if(Fe(e,43))return null===(e=t(++n))?0:e.type===je?He(Ye(e,0,!0),++n,t):Fe(e,63)?He(1,++n,t):0;if(e.type===qe){if(!Ue(e,43))return 0;var r=Ye(e,1,!0);return 0===r?0:null===(e=t(++n))?n:e.type===We||e.type===qe?Ue(e,45)&&Ye(e,1,!1)?n+1:0:He(r,n,t)}return e.type===We&&Ue(e,43)?He(Ye(e,1,!0),++n,t):0},"declaration-value":function(e,t){if(!e)return 0;var n=0,r=0,a=e.index;e:do{switch(e.type){case Xe.BadString:case Xe.BadUrl:break e;case Xe.RightCurlyBracket:case Xe.RightParenthesis:case Xe.RightSquareBracket:if(e.balance>e.index||e.balance<a)break e;r--;break;case Xe.Semicolon:if(0===r)break e;break;case Xe.Delim:if("!"===e.value&&0===r)break e;break;case Xe.Function:case Xe.LeftParenthesis:case Xe.LeftSquareBracket:case Xe.LeftCurlyBracket:r++}if(n++,e.balance<=a)break}while(e=t(n));return n},"any-value":function(e,t){if(!e)return 0;var n=e.index,r=0;e:do{switch(e.type){case Xe.BadString:case Xe.BadUrl:break e;case Xe.RightCurlyBracket:case Xe.RightParenthesis:case Xe.RightSquareBracket:if(e.balance>e.index||e.balance<n)break e}if(r++,e.balance<=n)break}while(e=t(r));return r},dimension:ot(lt(null)),angle:ot(lt({deg:!0,grad:!0,rad:!0,turn:!0})),decibel:ot(lt({db:!0})),frequency:ot(lt({hz:!0,khz:!0})),flex:ot(lt({fr:!0})),length:ot(ct(lt({px:!0,mm:!0,cm:!0,in:!0,pt:!0,pc:!0,q:!0,em:!0,ex:!0,ch:!0,rem:!0,vh:!0,vw:!0,vmin:!0,vmax:!0,vm:!0}))),resolution:ot(lt({dpi:!0,dpcm:!0,dppx:!0,x:!0})),semitones:ot(lt({st:!0})),time:ot(lt({s:!0,ms:!0})),percentage:ot((function(e,t,n){return null===e||e.type!==Xe.Percentage||at(n,e.value,e.value.length-1)?0:1})),zero:ct(),number:ot((function(e,t,n){if(null===e)return 0;var r=Qe(e.value,0);return r===e.value.length||rt(e.value,r)?at(n,e.value,r)?0:1:0})),integer:ot((function(e,t,n){if(null===e||e.type!==Xe.Number)return 0;for(var r=43===e.value.charCodeAt(0)||45===e.value.charCodeAt(0)?1:0;r<e.value.length;r++)if(!Ge(e.value.charCodeAt(r)))return 0;return at(n,e.value,r)?0:1})),"-ms-legacy-expression":function(e,t){return null!==e&&tt(e.value,"expression(")?it(e,t):0}},ht=function(e,t,n){var r=o("SyntaxError",e);return r.input=t,r.offset=n,r.rawMessage=e,r.message=r.rawMessage+"\n  "+r.input+"\n--"+new Array((r.offset||r.input.length)+1).join("-")+"^",r},dt=function(e){this.str=e,this.pos=0};dt.prototype={charCodeAt:function(e){return e<this.str.length?this.str.charCodeAt(e):0},charCode:function(){return this.charCodeAt(this.pos)},nextCharCode:function(){return this.charCodeAt(this.pos+1)},nextNonWsCode:function(e){return this.charCodeAt(this.findWsEnd(e))},findWsEnd:function(e){for(;e<this.str.length;e++){var t=this.str.charCodeAt(e);if(13!==t&&10!==t&&12!==t&&32!==t&&9!==t)break}return e},substringToPos:function(e){return this.str.substring(this.pos,this.pos=e)},eat:function(e){this.charCode()!==e&&this.error("Expect `"+String.fromCharCode(e)+"`"),this.pos++},peek:function(){return this.pos<this.str.length?this.str.charAt(this.pos++):""},error:function(e){throw new ht(e,this.str,this.pos)}};var pt=dt,mt=function(e){for(var t="function"==typeof Uint32Array?new Uint32Array(128):new Array(128),n=0;n<128;n++)t[n]=e(String.fromCharCode(n))?1:0;return t}((function(e){return/[a-zA-Z0-9\-]/.test(e)})),ft={" ":1,"&&":2,"||":3,"|":4};function gt(e){return e.substringToPos(e.findWsEnd(e.pos))}function bt(e){for(var t=e.pos;t<e.str.length;t++){var n=e.str.charCodeAt(t);if(n>=128||0===mt[n])break}return e.pos===t&&e.error("Expect a keyword"),e.substringToPos(t)}function yt(e){for(var t=e.pos;t<e.str.length;t++){var n=e.str.charCodeAt(t);if(n<48||n>57)break}return e.pos===t&&e.error("Expect a number"),e.substringToPos(t)}function vt(e){var t=e.str.indexOf("'",e.pos+1);return-1===t&&(e.pos=e.str.length,e.error("Expect an apostrophe")),e.substringToPos(t+1)}function kt(e){var t,n=null;return e.eat(123),t=yt(e),44===e.charCode()?(e.pos++,125!==e.charCode()&&(n=yt(e))):n=t,e.eat(125),{min:Number(t),max:n?Number(n):0}}function wt(e,t){var n=function(e){var t=null,n=!1;switch(e.charCode()){case 42:e.pos++,t={min:0,max:0};break;case 43:e.pos++,t={min:1,max:0};break;case 63:e.pos++,t={min:0,max:1};break;case 35:e.pos++,n=!0,t=123===e.charCode()?kt(e):{min:1,max:0};break;case 123:t=kt(e);break;default:return null}return{type:"Multiplier",comma:n,min:t.min,max:t.max,term:null}}(e);return null!==n?(n.term=t,n):t}function xt(e){var t=e.peek();return""===t?null:{type:"Token",value:t}}function St(e,t){function n(e,t){return{type:"Group",terms:e,combinator:t,disallowEmpty:!1,explicit:!1}}for(t=Object.keys(t).sort((function(e,t){return ft[e]-ft[t]}));t.length>0;){for(var r=t.shift(),a=0,i=0;a<e.length;a++){var o=e[a];"Combinator"===o.type&&(o.value===r?(-1===i&&(i=a-1),e.splice(a,1),a--):(-1!==i&&a-i>1&&(e.splice(i,a-i,n(e.slice(i,a),r)),a=i+1),i=-1))}-1!==i&&t.length&&e.splice(i,a-i,n(e.slice(i,a),r))}return r}function Ct(e){for(var t,n=[],r={},a=null,i=e.pos;t=At(e);)"Spaces"!==t.type&&("Combinator"===t.type?(null!==a&&"Combinator"!==a.type||(e.pos=i,e.error("Unexpected combinator")),r[t.value]=!0):null!==a&&"Combinator"!==a.type&&(r[" "]=!0,n.push({type:"Combinator",value:" "})),n.push(t),a=t,i=e.pos);return null!==a&&"Combinator"===a.type&&(e.pos-=i,e.error("Unexpected combinator")),{type:"Group",terms:n,combinator:St(n,r)||" ",disallowEmpty:!1,explicit:!1}}function At(e){var t=e.charCode();if(t<128&&1===mt[t])return function(e){var t;return t=bt(e),40===e.charCode()?(e.pos++,{type:"Function",name:t}):wt(e,{type:"Keyword",name:t})}(e);switch(t){case 93:break;case 91:return wt(e,function(e){var t;return e.eat(91),t=Ct(e),e.eat(93),t.explicit=!0,33===e.charCode()&&(e.pos++,t.disallowEmpty=!0),t}(e));case 60:return 39===e.nextCharCode()?function(e){var t;return e.eat(60),e.eat(39),t=bt(e),e.eat(39),e.eat(62),wt(e,{type:"Property",name:t})}(e):function(e){var t,n=null;return e.eat(60),t=bt(e),40===e.charCode()&&41===e.nextCharCode()&&(e.pos+=2,t+="()"),91===e.charCodeAt(e.findWsEnd(e.pos))&&(gt(e),n=function(e){var t=null,n=null,r=1;return e.eat(91),45===e.charCode()&&(e.peek(),r=-1),-1==r&&8734===e.charCode()?e.peek():t=r*Number(yt(e)),gt(e),e.eat(44),gt(e),8734===e.charCode()?e.peek():(r=1,45===e.charCode()&&(e.peek(),r=-1),n=r*Number(yt(e))),e.eat(93),null===t&&null===n?null:{type:"Range",min:t,max:n}}(e)),e.eat(62),wt(e,{type:"Type",name:t,opts:n})}(e);case 124:return{type:"Combinator",value:e.substringToPos(124===e.nextCharCode()?e.pos+2:e.pos+1)};case 38:return e.pos++,e.eat(38),{type:"Combinator",value:"&&"};case 44:return e.pos++,{type:"Comma"};case 39:return wt(e,{type:"String",value:vt(e)});case 32:case 9:case 10:case 13:case 12:return{type:"Spaces",value:gt(e)};case 64:return(t=e.nextCharCode())<128&&1===mt[t]?(e.pos++,{type:"AtKeyword",name:bt(e)}):xt(e);case 42:case 43:case 63:case 35:case 33:break;case 123:if((t=e.nextCharCode())<48||t>57)return xt(e);break;default:return xt(e)}}function zt(e){var t=new pt(e),n=Ct(t);return t.pos!==e.length&&t.error("Unexpected input"),1===n.terms.length&&"Group"===n.terms[0].type&&(n=n.terms[0]),n}zt("[a&&<b>#|<'c'>*||e() f{2} /,(% g#{1,2} h{2,})]!");var Pt=zt,Lt=function(){};function Tt(e){return"function"==typeof e?e:Lt}var Et=function(e,t,n){var r=Lt,a=Lt;if("function"==typeof t?r=t:t&&(r=Tt(t.enter),a=Tt(t.leave)),r===Lt&&a===Lt)throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function");!function e(t){switch(r.call(n,t),t.type){case"Group":t.terms.forEach(e);break;case"Multiplier":e(t.term);break;case"Type":case"Property":case"Keyword":case"AtKeyword":case"Function":case"String":case"Token":case"Comma":break;default:throw new Error("Unknown type: "+t.type)}a.call(n,t)}(e)},Ot=new H,Dt={decorator:function(e){var t=null,n={len:0,node:null},r=[n],a="";return{children:e.children,node:function(n){var r=t;t=n,e.node.call(this,n),t=r},chunk:function(e){a+=e,n.node!==t?r.push({len:e.length,node:t}):n.len+=e.length},result:function(){return It(a,r)}}}};function It(e,t){var n=[],r=0,a=0,i=t?t[a].node:null;for(we(e,Ot);!Ot.eof;){if(t)for(;a<t.length&&r+t[a].len<=Ot.tokenStart;)r+=t[a++].len,i=t[a].node;n.push({type:Ot.tokenType,value:Ot.getTokenValue(),index:Ot.tokenIndex,balance:Ot.balance[Ot.tokenIndex],node:i}),Ot.next()}return n}var Rt={type:"Match"},Nt={type:"Mismatch"},Bt={type:"DisallowEmpty"};function Mt(e,t,n){return t===Rt&&n===Nt||e===Rt&&t===Rt&&n===Rt?e:("If"===e.type&&e.else===Nt&&t===Rt&&(t=e.then,e=e.match),{type:"If",match:e,then:t,else:n})}function jt(e){return e.length>2&&40===e.charCodeAt(e.length-2)&&41===e.charCodeAt(e.length-1)}function _t(e){return"Keyword"===e.type||"AtKeyword"===e.type||"Function"===e.type||"Type"===e.type&&jt(e.name)}function qt(e){if("function"==typeof e)return{type:"Generic",fn:e};switch(e.type){case"Group":var t=function e(t,n,r){switch(t){case" ":for(var a=Rt,i=n.length-1;i>=0;i--)a=Mt(l=n[i],a,Nt);return a;case"|":a=Nt;var o=null;for(i=n.length-1;i>=0;i--){if(_t(l=n[i])&&(null===o&&i>0&&_t(n[i-1])&&(a=Mt({type:"Enum",map:o=Object.create(null)},Rt,a)),null!==o)){var s=(jt(l.name)?l.name.slice(0,-1):l.name).toLowerCase();if(s in o==0){o[s]=l;continue}}o=null,a=Mt(l,Rt,a)}return a;case"&&":if(n.length>5)return{type:"MatchOnce",terms:n,all:!0};for(a=Nt,i=n.length-1;i>=0;i--){var l=n[i];c=n.length>1?e(t,n.filter((function(e){return e!==l})),!1):Rt,a=Mt(l,c,a)}return a;case"||":if(n.length>5)return{type:"MatchOnce",terms:n,all:!1};for(a=r?Rt:Nt,i=n.length-1;i>=0;i--){var c;l=n[i],c=n.length>1?e(t,n.filter((function(e){return e!==l})),!0):Rt,a=Mt(l,c,a)}return a}}(e.combinator,e.terms.map(qt),!1);return e.disallowEmpty&&(t=Mt(t,Bt,Nt)),t;case"Multiplier":return function(e){var t=Rt,n=qt(e.term);if(0===e.max)n=Mt(n,Bt,Nt),(t=Mt(n,null,Nt)).then=Mt(Rt,Rt,t),e.comma&&(t.then.else=Mt({type:"Comma",syntax:e},t,Nt));else for(var r=e.min||1;r<=e.max;r++)e.comma&&t!==Rt&&(t=Mt({type:"Comma",syntax:e},t,Nt)),t=Mt(n,Mt(Rt,Rt,t),Nt);if(0===e.min)t=Mt(Rt,Rt,t);else for(r=0;r<e.min-1;r++)e.comma&&t!==Rt&&(t=Mt({type:"Comma",syntax:e},t,Nt)),t=Mt(n,t,Nt);return t}(e);case"Type":case"Property":return{type:e.type,name:e.name,syntax:e};case"Keyword":return{type:e.type,name:e.name.toLowerCase(),syntax:e};case"AtKeyword":return{type:e.type,name:"@"+e.name.toLowerCase(),syntax:e};case"Function":return{type:e.type,name:e.name.toLowerCase()+"(",syntax:e};case"String":return 3===e.value.length?{type:"Token",value:e.value.charAt(1),syntax:e}:{type:e.type,value:e.value.substr(1,e.value.length-2).replace(/\\'/g,"'"),syntax:e};case"Token":return{type:e.type,value:e.value,syntax:e};case"Comma":return{type:e.type,syntax:e};default:throw new Error("Unknown node type:",e.type)}}var Wt=Rt,Ft=Nt,Ut=Bt,Yt=Object.prototype.hasOwnProperty,Ht=Wt,Vt=Ft,Kt=Ut,Gt=h.TYPE;function $t(e,t){if(e.length!==t.length)return!1;for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r>=65&&r<=90&&(r|=32),r!==t.charCodeAt(n))return!1}return!0}function Qt(e){return null===e||e.type===Gt.Comma||e.type===Gt.Function||e.type===Gt.LeftParenthesis||e.type===Gt.LeftSquareBracket||e.type===Gt.LeftCurlyBracket||function(e){return e.type===Gt.Delim&&"?"!==e.value}(e)}function Xt(e){return null===e||e.type===Gt.RightParenthesis||e.type===Gt.RightSquareBracket||e.type===Gt.RightCurlyBracket||e.type===Gt.Delim}function Zt(e){function t(e){return null!==e&&("Type"===e.type||"Property"===e.type||"Keyword"===e.type)}var n=null;return null!==this.matched&&function r(a){if(Array.isArray(a.match)){for(var i=0;i<a.match.length;i++)if(r(a.match[i]))return t(a.syntax)&&n.unshift(a.syntax),!0}else if(a.node===e)return n=t(a.syntax)?[a.syntax]:[],!0;return!1}(this.matched),n}function Jt(e,t,n){var r=Zt.call(e,t);return null!==r&&r.some(n)}var en={getTrace:Zt,isType:function(e,t){return Jt(this,e,(function(e){return"Type"===e.type&&e.name===t}))},isProperty:function(e,t){return Jt(this,e,(function(e){return"Property"===e.type&&e.name===t}))},isKeyword:function(e){return Jt(this,e,(function(e){return"Keyword"===e.type}))}},tn=function(e,t,n,r,a){var o=[];return null!==n.matched&&function n(s){if(null!==s.syntax&&s.syntax.type===r&&s.syntax.name===a){var l=function e(t){return"node"in t?t.node:e(t.match[0])}(s),c=function e(t){return"node"in t?t.node:e(t.match[t.match.length-1])}(s);e.syntax.walk(t,(function(e,t,n){if(e===l){var r=new i;do{if(r.appendData(t.data),t.data===c)break;t=t.next}while(null!==t);o.push({parent:n,nodes:r})}}))}Array.isArray(s.match)&&s.match.forEach(n)}(n.matched),o},nn=Object.prototype.hasOwnProperty;function rn(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e&&e>=0}function an(e){return Boolean(e)&&rn(e.offset)&&rn(e.line)&&rn(e.column)}function on(e,t){return function(n,r){if(!n||n.constructor!==Object)return r(n,"Type of node should be an Object");for(var a in n){var o=!0;if(!1!==nn.call(n,a)){if("type"===a)n.type!==e&&r(n,"Wrong node type `"+n.type+"`, expected `"+e+"`");else if("loc"===a){if(null===n.loc)continue;if(n.loc&&n.loc.constructor===Object)if("string"!=typeof n.loc.source)a+=".source";else if(an(n.loc.start)){if(an(n.loc.end))continue;a+=".end"}else a+=".start";o=!1}else if(t.hasOwnProperty(a)){var s=0;for(o=!1;!o&&s<t[a].length;s++){var l=t[a][s];switch(l){case String:o="string"==typeof n[a];break;case Boolean:o="boolean"==typeof n[a];break;case null:o=null===n[a];break;default:"string"==typeof l?o=n[a]&&n[a].type===l:Array.isArray(l)&&(o=n[a]instanceof i)}}}else r(n,"Unknown field `"+a+"` for "+e+" node type");o||r(n,"Bad value for `"+e+"."+a+"`")}}for(var a in t)nn.call(t,a)&&!1===nn.call(n,a)&&r(n,"Field `"+e+"."+a+"` is missed")}}function sn(e,t){var n=t.structure,r={type:String,loc:!0},a={type:'"'+e+'"'};for(var i in n)if(!1!==nn.call(n,i)){for(var o=[],s=r[i]=Array.isArray(n[i])?n[i].slice():[n[i]],l=0;l<s.length;l++){var c=s[l];if(c===String||c===Boolean)o.push(c.name);else if(null===c)o.push("null");else if("string"==typeof c)o.push("<"+c+">");else{if(!Array.isArray(c))throw new Error("Wrong value `"+c+"` in `"+e+"."+i+"` structure definition");o.push("List")}}a[i]=o.join(" | ")}return{docs:a,check:on(e,r)}}var ln=function(e,t){const n=o("SyntaxReferenceError",e+(t?" `"+t+"`":""));return n.reference=t,n},cn=function(e,t,n,r){const a=o("SyntaxMatchError",e),{css:i,mismatchOffset:s,mismatchLength:l,start:c,end:u}=function(e,t){const n=e.tokens,r=e.longestMatch,a=r<n.length&&n[r].node||null,i=a!==t?a:null;let o,s,l=0,c=0,u=0,h="";for(let e=0;e<n.length;e++){const t=n[e].value;e===r&&(c=t.length,l=h.length),null!==i&&n[e].node===i&&(e<=r?u++:u=0),h+=t}return r===n.length||u>1?(o=$(i||t,"end")||Q(G,h),s=Q(o)):(o=$(i,"start")||Q($(t,"start")||G,h.slice(0,l)),s=$(i,"end")||Q(o,h.substr(l,c))),{css:h,mismatchOffset:l,mismatchLength:c,start:o,end:s}}(r,n);return a.rawMessage=e,a.syntax=t?K(t):"<generic>",a.css=i,a.mismatchOffset=s,a.mismatchLength=l,a.message=e+"\n  syntax: "+a.syntax+"\n   value: "+(i||"<empty string>")+"\n  --------"+new Array(a.mismatchOffset+1).join("-")+"^",Object.assign(a,c),a.loc={source:n&&n.loc&&n.loc.source||"<unknown>",start:c,end:u},a},un=function(e,t){return"string"==typeof e&&(e=Pt(e)),{type:"MatchGraph",match:qt(e),syntax:t||null,source:e}},hn=function(e,t,n){var r=function(e,t,n){function r(){do{b++,g=b<e.length?e[b]:null}while(null!==g&&(g.type===Gt.WhiteSpace||g.type===Gt.Comment))}function a(t){var n=b+t;return n<e.length?e[n]:null}function i(e,t){return{nextState:e,matchStack:v,syntaxStack:u,thenStack:h,tokenIndex:b,prev:t}}function o(e){h={nextState:e,matchStack:v,syntaxStack:u,prev:h}}function s(e){d=i(e,d)}function l(){v={type:1,syntax:t.syntax,token:g,prev:v},r(),p=null,b>y&&(y=b)}function c(){v=2===v.type?v.prev:{type:3,syntax:u.syntax,token:v.token,prev:v},u=u.prev}var u=null,h=null,d=null,p=null,m=0,f=null,g=null,b=-1,y=0,v={type:0,syntax:null,token:null,prev:null};for(r();null===f&&++m<15e3;)switch(t.type){case"Match":if(null===h){if(null!==g&&(b!==e.length-1||"\\0"!==g.value&&"\\9"!==g.value)){t=Vt;break}f="Match";break}if((t=h.nextState)===Kt){if(h.matchStack===v){t=Vt;break}t=Ht}for(;h.syntaxStack!==u;)c();h=h.prev;break;case"Mismatch":if(null!==p&&!1!==p)(null===d||b>d.tokenIndex)&&(d=p,p=!1);else if(null===d){f="Mismatch";break}t=d.nextState,h=d.thenStack,u=d.syntaxStack,v=d.matchStack,b=d.tokenIndex,g=b<e.length?e[b]:null,d=d.prev;break;case"MatchGraph":t=t.match;break;case"If":t.else!==Vt&&s(t.else),t.then!==Ht&&o(t.then),t=t.match;break;case"MatchOnce":t={type:"MatchOnceBuffer",syntax:t,index:0,mask:0};break;case"MatchOnceBuffer":var k=t.syntax.terms;if(t.index===k.length){if(0===t.mask||t.syntax.all){t=Vt;break}t=Ht;break}if(t.mask===(1<<k.length)-1){t=Ht;break}for(;t.index<k.length;t.index++){var w=1<<t.index;if(0==(t.mask&w)){s(t),o({type:"AddMatchOnce",syntax:t.syntax,mask:t.mask|w}),t=k[t.index++];break}}break;case"AddMatchOnce":t={type:"MatchOnceBuffer",syntax:t.syntax,index:0,mask:t.mask};break;case"Enum":if(null!==g&&(-1!==(z=g.value.toLowerCase()).indexOf("\\")&&(z=z.replace(/\\[09].*$/,"")),Yt.call(t.map,z))){t=t.map[z];break}t=Vt;break;case"Generic":var x=null!==u?u.opts:null,S=b+Math.floor(t.fn(g,a,x));if(!isNaN(S)&&S>b){for(;b<S;)l();t=Ht}else t=Vt;break;case"Type":case"Property":var C="Type"===t.type?"types":"properties",A=Yt.call(n,C)?n[C][t.name]:null;if(!A||!A.match)throw new Error("Bad syntax reference: "+("Type"===t.type?"<"+t.name+">":"<'"+t.name+"'>"));if(!1!==p&&null!==g&&"Type"===t.type&&("custom-ident"===t.name&&g.type===Gt.Ident||"length"===t.name&&"0"===g.value)){null===p&&(p=i(t,d)),t=Vt;break}u={syntax:t.syntax,opts:t.syntax.opts||null!==u&&u.opts||null,prev:u},v={type:2,syntax:t.syntax,token:v.token,prev:v},t=A.match;break;case"Keyword":var z=t.name;if(null!==g){var P=g.value;if(-1!==P.indexOf("\\")&&(P=P.replace(/\\[09].*$/,"")),$t(P,z)){l(),t=Ht;break}}t=Vt;break;case"AtKeyword":case"Function":if(null!==g&&$t(g.value,t.name)){l(),t=Ht;break}t=Vt;break;case"Token":if(null!==g&&g.value===t.value){l(),t=Ht;break}t=Vt;break;case"Comma":null!==g&&g.type===Gt.Comma?Qt(v.token)?t=Vt:(l(),t=Xt(g)?Vt:Ht):t=Qt(v.token)||Xt(g)?Ht:Vt;break;case"String":var L="";for(S=b;S<e.length&&L.length<t.value.length;S++)L+=e[S].value;if($t(L,t.value)){for(;b<S;)l();t=Ht}else t=Vt;break;default:throw new Error("Unknown node type: "+t.type)}switch(f){case null:console.warn("[csstree-match] BREAK after 15000 iterations"),f="Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)",v=null;break;case"Match":for(;null!==u;)c();break;default:v=null}return{tokens:e,reason:f,iterations:m,match:v,longestMatch:y}}(e,t,n||{});if(null===r.match)return r;var a=r.match,i=r.match={syntax:t.syntax||null,match:[]},o=[i];for(a=function(e){for(var t=null,n=null,r=e;null!==r;)n=r.prev,r.prev=t,t=r,r=n;return t}(a).prev;null!==a;){switch(a.type){case 2:i.match.push(i={syntax:a.syntax,match:[]}),o.push(i);break;case 3:o.pop(),i=o[o.length-1];break;default:i.match.push({syntax:a.syntax||null,token:a.token.value,node:a.token.node})}a=a.prev}return r},dn=un("inherit | initial | unset"),pn=un("inherit | initial | unset | <-ms-legacy-expression>");function mn(e,t,n){var r={};for(var a in e)e[a].syntax&&(r[a]=n?e[a].syntax:K(e[a].syntax,{compact:t}));return r}function fn(e,t,n){const r={};for(const[a,i]of Object.entries(e))r[a]={prelude:i.prelude&&(n?i.prelude.syntax:K(i.prelude.syntax,{compact:t})),descriptors:i.descriptors&&mn(i.descriptors,t,n)};return r}function gn(e,t,n){return{matched:e,iterations:n,error:t,getTrace:en.getTrace,isType:en.isType,isProperty:en.isProperty,isKeyword:en.isKeyword}}function bn(e,t,n,r){var a,i=function(e,t){return"string"==typeof e?It(e,null):t.generate(e,Dt)}(n,e.syntax);return function(e){for(var t=0;t<e.length;t++)if("var("===e[t].value.toLowerCase())return!0;return!1}(i)?gn(null,new Error("Matching for a tree with var() is not supported")):(r&&(a=hn(i,e.valueCommonSyntax,e)),r&&a.match||(a=hn(i,t.match,e)).match?gn(a.match,null,a.iterations):gn(null,new cn(a.reason,t.syntax,n,a),a.iterations))}var yn=function(e,t,n){if(this.valueCommonSyntax=dn,this.syntax=t,this.generic=!1,this.atrules={},this.properties={},this.types={},this.structure=n||function(e){var t={};if(e.node)for(var n in e.node)if(nn.call(e.node,n)){var r=e.node[n];if(!r.structure)throw new Error("Missed `structure` field in `"+n+"` node type definition");t[n]=sn(n,r)}return t}(e),e){if(e.types)for(var r in e.types)this.addType_(r,e.types[r]);if(e.generic)for(var r in this.generic=!0,ut)this.addType_(r,ut[r]);if(e.atrules)for(var r in e.atrules)this.addAtrule_(r,e.atrules[r]);if(e.properties)for(var r in e.properties)this.addProperty_(r,e.properties[r])}};yn.prototype={structure:{},checkStructure:function(e){function t(e,t){r.push({node:e,message:t})}var n=this.structure,r=[];return this.syntax.walk(e,(function(e){n.hasOwnProperty(e.type)?n[e.type].check(e,t):t(e,"Unknown node type `"+e.type+"`")})),!!r.length&&r},createDescriptor:function(e,t,n,r=null){var a={type:t,name:n},i={type:t,name:n,parent:r,syntax:null,match:null};return"function"==typeof e?i.match=un(e,a):("string"==typeof e?Object.defineProperty(i,"syntax",{get:function(){return Object.defineProperty(i,"syntax",{value:Pt(e)}),i.syntax}}):i.syntax=e,Object.defineProperty(i,"match",{get:function(){return Object.defineProperty(i,"match",{value:un(i.syntax,a)}),i.match}})),i},addAtrule_:function(e,t){t&&(this.atrules[e]={type:"Atrule",name:e,prelude:t.prelude?this.createDescriptor(t.prelude,"AtrulePrelude",e):null,descriptors:t.descriptors?Object.keys(t.descriptors).reduce((n,r)=>(n[r]=this.createDescriptor(t.descriptors[r],"AtruleDescriptor",r,e),n),{}):null})},addProperty_:function(e,t){t&&(this.properties[e]=this.createDescriptor(t,"Property",e))},addType_:function(e,t){t&&(this.types[e]=this.createDescriptor(t,"Type",e),t===ut["-ms-legacy-expression"]&&(this.valueCommonSyntax=pn))},checkAtruleName:function(e){if(!this.getAtrule(e))return new ln("Unknown at-rule","@"+e)},checkAtrulePrelude:function(e,t){let n=this.checkAtruleName(e);if(n)return n;var r=this.getAtrule(e);return!r.prelude&&t?new SyntaxError("At-rule `@"+e+"` should not contain a prelude"):r.prelude&&!t?new SyntaxError("At-rule `@"+e+"` should contain a prelude"):void 0},checkAtruleDescriptorName:function(e,t){let n=this.checkAtruleName(e);if(n)return n;var r=this.getAtrule(e),a=ne.keyword(t);return r.descriptors?r.descriptors[a.name]||r.descriptors[a.basename]?void 0:new ln("Unknown at-rule descriptor",t):new SyntaxError("At-rule `@"+e+"` has no known descriptors")},checkPropertyName:function(e){return ne.property(e).custom?new Error("Lexer matching doesn't applicable for custom properties"):this.getProperty(e)?void 0:new ln("Unknown property",e)},matchAtrulePrelude:function(e,t){var n=this.checkAtrulePrelude(e,t);return n?gn(null,n):t?bn(this,this.getAtrule(e).prelude,t,!0):gn(null,null)},matchAtruleDescriptor:function(e,t,n){var r=this.checkAtruleDescriptorName(e,t);if(r)return gn(null,r);var a=this.getAtrule(e),i=ne.keyword(t);return bn(this,a.descriptors[i.name]||a.descriptors[i.basename],n,!0)},matchDeclaration:function(e){return"Declaration"!==e.type?gn(null,new Error("Not a Declaration node")):this.matchProperty(e.property,e.value)},matchProperty:function(e,t){var n=this.checkPropertyName(e);return n?gn(null,n):bn(this,this.getProperty(e),t,!0)},matchType:function(e,t){var n=this.getType(e);return n?bn(this,n,t,!1):gn(null,new ln("Unknown type",e))},match:function(e,t){return"string"==typeof e||e&&e.type?("string"!=typeof e&&e.match||(e=this.createDescriptor(e,"Type","anonymous")),bn(this,e,t,!1)):gn(null,new ln("Bad syntax"))},findValueFragments:function(e,t,n,r){return tn(this,t,this.matchProperty(e,t),n,r)},findDeclarationValueFragments:function(e,t,n){return tn(this,e.value,this.matchDeclaration(e),t,n)},findAllFragments:function(e,t,n){var r=[];return this.syntax.walk(e,{visit:"Declaration",enter:function(e){r.push.apply(r,this.findDeclarationValueFragments(e,t,n))}.bind(this)}),r},getAtrule:function(e,t=!0){var n=ne.keyword(e);return(n.vendor&&t?this.atrules[n.name]||this.atrules[n.basename]:this.atrules[n.name])||null},getAtrulePrelude:function(e,t=!0){const n=this.getAtrule(e,t);return n&&n.prelude||null},getAtruleDescriptor:function(e,t){return this.atrules.hasOwnProperty(e)&&this.atrules.declarators&&this.atrules[e].declarators[t]||null},getProperty:function(e,t=!0){var n=ne.property(e);return(n.vendor&&t?this.properties[n.name]||this.properties[n.basename]:this.properties[n.name])||null},getType:function(e){return this.types.hasOwnProperty(e)?this.types[e]:null},validate:function(){function e(r,a,i,o){if(i.hasOwnProperty(a))return i[a];i[a]=!1,null!==o.syntax&&Et(o.syntax,(function(o){if("Type"===o.type||"Property"===o.type){var s="Type"===o.type?r.types:r.properties,l="Type"===o.type?t:n;s.hasOwnProperty(o.name)&&!e(r,o.name,l,s[o.name])||(i[a]=!0)}}),this)}var t={},n={};for(var r in this.types)e(this,r,t,this.types[r]);for(var r in this.properties)e(this,r,n,this.properties[r]);return t=Object.keys(t).filter((function(e){return t[e]})),n=Object.keys(n).filter((function(e){return n[e]})),t.length||n.length?{types:t,properties:n}:null},dump:function(e,t){return{generic:this.generic,types:mn(this.types,!t,e),properties:mn(this.properties,!t,e),atrules:fn(this.atrules,!t,e)}},toString:function(){return JSON.stringify(this.dump())}};var vn=yn,kn={SyntaxError:ht,parse:Pt,generate:K,walk:Et},wn=we.isBOM,xn=function(){this.lines=null,this.columns=null,this.linesAndColumnsComputed=!1};xn.prototype={setSource:function(e,t,n,r){this.source=e,this.startOffset=void 0===t?0:t,this.startLine=void 0===n?1:n,this.startColumn=void 0===r?1:r,this.linesAndColumnsComputed=!1},ensureLinesAndColumnsComputed:function(){this.linesAndColumnsComputed||(function(e,t){for(var n=t.length,r=ae(e.lines,n),a=e.startLine,i=ae(e.columns,n),o=e.startColumn,s=t.length>0?wn(t.charCodeAt(0)):0;s<n;s++){var l=t.charCodeAt(s);r[s]=a,i[s]=o++,10!==l&&13!==l&&12!==l||(13===l&&s+1<n&&10===t.charCodeAt(s+1)&&(r[++s]=a,i[s]=o),a++,o=1)}r[s]=a,i[s]=o,e.lines=r,e.columns=i}(this,this.source),this.linesAndColumnsComputed=!0)},getLocation:function(e,t){return this.ensureLinesAndColumnsComputed(),{source:t,offset:this.startOffset+e,line:this.lines[e],column:this.columns[e]}},getLocationRange:function(e,t,n){return this.ensureLinesAndColumnsComputed(),{source:n,start:{offset:this.startOffset+e,line:this.lines[e],column:this.columns[e]},end:{offset:this.startOffset+t,line:this.lines[t],column:this.columns[t]}}}};var Sn=xn,Cn=we.TYPE,An=Cn.WhiteSpace,zn=Cn.Comment,Pn=function(e){var t=this.createList(),n=null,r={recognizer:e,space:null,ignoreWS:!1,ignoreWSAfter:!1};for(this.scanner.skipSC();!this.scanner.eof;){switch(this.scanner.tokenType){case zn:this.scanner.next();continue;case An:r.ignoreWS?this.scanner.next():r.space=this.WhiteSpace();continue}if(void 0===(n=e.getNode.call(this,r)))break;null!==r.space&&(t.push(r.space),r.space=null),t.push(n),r.ignoreWSAfter?(r.ignoreWSAfter=!1,r.ignoreWS=!0):r.ignoreWS=!1}return t},{findWhiteSpaceStart:Ln,cmpStr:Tn}=M,En=function(){},On=h.TYPE,Dn=h.NAME,In=On.WhiteSpace,Rn=On.Comment,Nn=On.Ident,Bn=On.Function,Mn=On.Url,jn=On.Hash,_n=On.Percentage,qn=On.Number;function Wn(e){return function(){return this[e]()}}var Fn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),Un=function(e){if(0<=e&&e<Fn.length)return Fn[e];throw new TypeError("Must be between 0 and 63: "+e)},Yn=function(e){var t,n="",r=function(e){return e<0?1+(-e<<1):0+(e<<1)}(e);do{t=31&r,(r>>>=5)>0&&(t|=32),n+=Un(t)}while(r>0);return n},Hn=function(e,t){return function(e,t){t.getArg=function(e,t,n){if(t in e)return e[t];if(3===arguments.length)return n;throw new Error('"'+t+'" is a required argument.')};var n=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,r=/^data:.+\,.+$/;function a(e){var t=e.match(n);return t?{scheme:t[1],auth:t[2],host:t[3],port:t[4],path:t[5]}:null}function i(e){var t="";return e.scheme&&(t+=e.scheme+":"),t+="//",e.auth&&(t+=e.auth+"@"),e.host&&(t+=e.host),e.port&&(t+=":"+e.port),e.path&&(t+=e.path),t}function o(e){var n=e,r=a(e);if(r){if(!r.path)return e;n=r.path}for(var o,s=t.isAbsolute(n),l=n.split(/\/+/),c=0,u=l.length-1;u>=0;u--)"."===(o=l[u])?l.splice(u,1):".."===o?c++:c>0&&(""===o?(l.splice(u+1,c),c=0):(l.splice(u,2),c--));return""===(n=l.join("/"))&&(n=s?"/":"."),r?(r.path=n,i(r)):n}function s(e,t){""===e&&(e="."),""===t&&(t=".");var n=a(t),s=a(e);if(s&&(e=s.path||"/"),n&&!n.scheme)return s&&(n.scheme=s.scheme),i(n);if(n||t.match(r))return t;if(s&&!s.host&&!s.path)return s.host=t,i(s);var l="/"===t.charAt(0)?t:o(e.replace(/\/+$/,"")+"/"+t);return s?(s.path=l,i(s)):l}t.urlParse=a,t.urlGenerate=i,t.normalize=o,t.join=s,t.isAbsolute=function(e){return"/"===e.charAt(0)||n.test(e)},t.relative=function(e,t){""===e&&(e="."),e=e.replace(/\/$/,"");for(var n=0;0!==t.indexOf(e+"/");){var r=e.lastIndexOf("/");if(r<0)return t;if((e=e.slice(0,r)).match(/^([^\/]+:\/)?\/*$/))return t;++n}return Array(n+1).join("../")+t.substr(e.length+1)};var l=!("__proto__"in Object.create(null));function c(e){return e}function u(e){if(!e)return!1;var t=e.length;if(t<9)return!1;if(95!==e.charCodeAt(t-1)||95!==e.charCodeAt(t-2)||111!==e.charCodeAt(t-3)||116!==e.charCodeAt(t-4)||111!==e.charCodeAt(t-5)||114!==e.charCodeAt(t-6)||112!==e.charCodeAt(t-7)||95!==e.charCodeAt(t-8)||95!==e.charCodeAt(t-9))return!1;for(var n=t-10;n>=0;n--)if(36!==e.charCodeAt(n))return!1;return!0}function h(e,t){return e===t?0:null===e?1:null===t?-1:e>t?1:-1}t.toSetString=l?c:function(e){return u(e)?"$"+e:e},t.fromSetString=l?c:function(e){return u(e)?e.slice(1):e},t.compareByOriginalPositions=function(e,t,n){var r=h(e.source,t.source);return 0!==r||0!=(r=e.originalLine-t.originalLine)||0!=(r=e.originalColumn-t.originalColumn)||n||0!=(r=e.generatedColumn-t.generatedColumn)||0!=(r=e.generatedLine-t.generatedLine)?r:h(e.name,t.name)},t.compareByGeneratedPositionsDeflated=function(e,t,n){var r=e.generatedLine-t.generatedLine;return 0!==r||0!=(r=e.generatedColumn-t.generatedColumn)||n||0!==(r=h(e.source,t.source))||0!=(r=e.originalLine-t.originalLine)||0!=(r=e.originalColumn-t.originalColumn)?r:h(e.name,t.name)},t.compareByGeneratedPositionsInflated=function(e,t){var n=e.generatedLine-t.generatedLine;return 0!==n||0!=(n=e.generatedColumn-t.generatedColumn)||0!==(n=h(e.source,t.source))||0!=(n=e.originalLine-t.originalLine)||0!=(n=e.originalColumn-t.originalColumn)?n:h(e.name,t.name)},t.parseSourceMapInput=function(e){return JSON.parse(e.replace(/^\)]}'[^\n]*\n/,""))},t.computeSourceURL=function(e,t,n){if(t=t||"",e&&("/"!==e[e.length-1]&&"/"!==t[0]&&(e+="/"),t=e+t),n){var r=a(n);if(!r)throw new Error("sourceMapURL could not be parsed");if(r.path){var l=r.path.lastIndexOf("/");l>=0&&(r.path=r.path.substring(0,l+1))}t=s(i(r),t)}return o(t)}}(t={exports:{}},t.exports),t.exports}(),Vn=(Hn.getArg,Hn.urlParse,Hn.urlGenerate,Hn.normalize,Hn.join,Hn.isAbsolute,Hn.relative,Hn.toSetString,Hn.fromSetString,Hn.compareByOriginalPositions,Hn.compareByGeneratedPositionsDeflated,Hn.compareByGeneratedPositionsInflated,Hn.parseSourceMapInput,Hn.computeSourceURL,Object.prototype.hasOwnProperty),Kn="undefined"!=typeof Map;function Gn(){this._array=[],this._set=Kn?new Map:Object.create(null)}Gn.fromArray=function(e,t){for(var n=new Gn,r=0,a=e.length;r<a;r++)n.add(e[r],t);return n},Gn.prototype.size=function(){return Kn?this._set.size:Object.getOwnPropertyNames(this._set).length},Gn.prototype.add=function(e,t){var n=Kn?e:Hn.toSetString(e),r=Kn?this.has(e):Vn.call(this._set,n),a=this._array.length;r&&!t||this._array.push(e),r||(Kn?this._set.set(e,a):this._set[n]=a)},Gn.prototype.has=function(e){if(Kn)return this._set.has(e);var t=Hn.toSetString(e);return Vn.call(this._set,t)},Gn.prototype.indexOf=function(e){if(Kn){var t=this._set.get(e);if(t>=0)return t}else{var n=Hn.toSetString(e);if(Vn.call(this._set,n))return this._set[n]}throw new Error('"'+e+'" is not in the set.')},Gn.prototype.at=function(e){if(e>=0&&e<this._array.length)return this._array[e];throw new Error("No element indexed by "+e)},Gn.prototype.toArray=function(){return this._array.slice()};var $n=Gn;function Qn(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}Qn.prototype.unsortedForEach=function(e,t){this._array.forEach(e,t)},Qn.prototype.add=function(e){var t,n,r,a,i,o;n=e,r=(t=this._last).generatedLine,a=n.generatedLine,i=t.generatedColumn,o=n.generatedColumn,a>r||a==r&&o>=i||Hn.compareByGeneratedPositionsInflated(t,n)<=0?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e))},Qn.prototype.toArray=function(){return this._sorted||(this._array.sort(Hn.compareByGeneratedPositionsInflated),this._sorted=!0),this._array};var Xn=$n,Zn={MappingList:Qn}.MappingList;function Jn(e){e||(e={}),this._file=Hn.getArg(e,"file",null),this._sourceRoot=Hn.getArg(e,"sourceRoot",null),this._skipValidation=Hn.getArg(e,"skipValidation",!1),this._sources=new Xn,this._names=new Xn,this._mappings=new Zn,this._sourcesContents=null}Jn.prototype._version=3,Jn.fromSourceMap=function(e){var t=e.sourceRoot,n=new Jn({file:e.file,sourceRoot:t});return e.eachMapping((function(e){var r={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(r.source=e.source,null!=t&&(r.source=Hn.relative(t,r.source)),r.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(r.name=e.name)),n.addMapping(r)})),e.sources.forEach((function(r){var a=r;null!==t&&(a=Hn.relative(t,r)),n._sources.has(a)||n._sources.add(a);var i=e.sourceContentFor(r);null!=i&&n.setSourceContent(r,i)})),n},Jn.prototype.addMapping=function(e){var t=Hn.getArg(e,"generated"),n=Hn.getArg(e,"original",null),r=Hn.getArg(e,"source",null),a=Hn.getArg(e,"name",null);this._skipValidation||this._validateMapping(t,n,r,a),null!=r&&(r=String(r),this._sources.has(r)||this._sources.add(r)),null!=a&&(a=String(a),this._names.has(a)||this._names.add(a)),this._mappings.add({generatedLine:t.line,generatedColumn:t.column,originalLine:null!=n&&n.line,originalColumn:null!=n&&n.column,source:r,name:a})},Jn.prototype.setSourceContent=function(e,t){var n=e;null!=this._sourceRoot&&(n=Hn.relative(this._sourceRoot,n)),null!=t?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[Hn.toSetString(n)]=t):this._sourcesContents&&(delete this._sourcesContents[Hn.toSetString(n)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},Jn.prototype.applySourceMap=function(e,t,n){var r=t;if(null==t){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');r=e.file}var a=this._sourceRoot;null!=a&&(r=Hn.relative(a,r));var i=new Xn,o=new Xn;this._mappings.unsortedForEach((function(t){if(t.source===r&&null!=t.originalLine){var s=e.originalPositionFor({line:t.originalLine,column:t.originalColumn});null!=s.source&&(t.source=s.source,null!=n&&(t.source=Hn.join(n,t.source)),null!=a&&(t.source=Hn.relative(a,t.source)),t.originalLine=s.line,t.originalColumn=s.column,null!=s.name&&(t.name=s.name))}var l=t.source;null==l||i.has(l)||i.add(l);var c=t.name;null==c||o.has(c)||o.add(c)}),this),this._sources=i,this._names=o,e.sources.forEach((function(t){var r=e.sourceContentFor(t);null!=r&&(null!=n&&(t=Hn.join(n,t)),null!=a&&(t=Hn.relative(a,t)),this.setSourceContent(t,r))}),this)},Jn.prototype._validateMapping=function(e,t,n,r){if(t&&"number"!=typeof t.line&&"number"!=typeof t.column)throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if((!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0)||t||n||r)&&!(e&&"line"in e&&"column"in e&&t&&"line"in t&&"column"in t&&e.line>0&&e.column>=0&&t.line>0&&t.column>=0&&n))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:n,original:t,name:r}))},Jn.prototype._serializeMappings=function(){for(var e,t,n,r,a=0,i=1,o=0,s=0,l=0,c=0,u="",h=this._mappings.toArray(),d=0,p=h.length;d<p;d++){if(e="",(t=h[d]).generatedLine!==i)for(a=0;t.generatedLine!==i;)e+=";",i++;else if(d>0){if(!Hn.compareByGeneratedPositionsInflated(t,h[d-1]))continue;e+=","}e+=Yn(t.generatedColumn-a),a=t.generatedColumn,null!=t.source&&(r=this._sources.indexOf(t.source),e+=Yn(r-c),c=r,e+=Yn(t.originalLine-1-s),s=t.originalLine-1,e+=Yn(t.originalColumn-o),o=t.originalColumn,null!=t.name&&(n=this._names.indexOf(t.name),e+=Yn(n-l),l=n)),u+=e}return u},Jn.prototype._generateSourcesContent=function(e,t){return e.map((function(e){if(!this._sourcesContents)return null;null!=t&&(e=Hn.relative(t,e));var n=Hn.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,n)?this._sourcesContents[n]:null}),this)},Jn.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},Jn.prototype.toString=function(){return JSON.stringify(this.toJSON())};var er={SourceMapGenerator:Jn}.SourceMapGenerator,tr={Atrule:!0,Selector:!0,Declaration:!0},nr=Object.prototype.hasOwnProperty;function rr(e,t){var n=e.children,r=null;"function"!=typeof t?n.forEach(this.node,this):n.forEach((function(e){null!==r&&t.call(this,r),this.node(e),r=e}),this)}var ar=Object.prototype.hasOwnProperty,ir=function(){};function or(e){return"function"==typeof e?e:ir}function sr(e,t){return function(n,r,a){n.type===t&&e.call(this,n,r,a)}}function lr(e,t){var n=t.structure,r=[];for(var a in n)if(!1!==ar.call(n,a)){var i=n[a],o={name:a,type:!1,nullable:!1};Array.isArray(n[a])||(i=[n[a]]);for(var s=0;s<i.length;s++){var l=i[s];null===l?o.nullable=!0:"string"==typeof l?o.type="node":Array.isArray(l)&&(o.type="list")}o.type&&r.push(o)}return r.length?{context:t.walkContext,fields:r}:null}function cr(e,t){var n=e.fields.slice(),r=e.context,a="string"==typeof r;return t&&n.reverse(),function(e,i,o,s){var l;a&&(l=i[r],i[r]=e);for(var c=0;c<n.length;c++){var u=n[c],h=e[u.name];if(!u.nullable||h)if("list"===u.type){if(t?h.reduceRight(s,!1):h.reduce(s,!1))return!0}else if(o(h))return!0}a&&(i[r]=l)}}function ur(e){return{Atrule:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block},Rule:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block},Declaration:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block,DeclarationList:e.DeclarationList}}}var hr=function e(t){var n={};for(var r in t){var a=t[r];a&&(Array.isArray(a)||a instanceof i?a=a.map(e):a.constructor===Object&&(a=e(a))),n[r]=a}return n};const dr=Object.prototype.hasOwnProperty,pr={generic:!0,types:br,atrules:{prelude:yr,descriptors:yr},properties:br,parseContext:function(e,t){return Object.assign(e,t)},scope:function e(t,n){for(const r in n)dr.call(n,r)&&(mr(t[r])?e(t[r],fr(n[r])):t[r]=fr(n[r]));return t},atrule:["parse"],pseudo:["parse"],node:["name","structure","parse","generate","walkContext"]};function mr(e){return e&&e.constructor===Object}function fr(e){return mr(e)?Object.assign({},e):e}function gr(e,t){return"string"==typeof t&&/^\s*\|/.test(t)?"string"==typeof e?e+t:t.replace(/^\s*\|\s*/,""):t||null}function br(e,t){if("string"==typeof t)return gr(e,t);const n=Object.assign({},e);for(let r in t)dr.call(t,r)&&(n[r]=gr(dr.call(e,r)?e[r]:void 0,t[r]));return n}function yr(e,t){const n=br(e,t);return!mr(n)||Object.keys(n).length?n:null}var vr=(e,t)=>function e(t,n,r){for(const a in r)if(!1!==dr.call(r,a))if(!0===r[a])a in n&&dr.call(n,a)&&(t[a]=fr(n[a]));else if(r[a])if("function"==typeof r[a]){const e=r[a];t[a]=e({},t[a]),t[a]=e(t[a]||{},n[a])}else if(mr(r[a])){const i={};for(let n in t[a])i[n]=e({},t[a][n],r[a]);for(let t in n[a])i[t]=e(i[t]||{},n[a][t],r[a]);t[a]=i}else if(Array.isArray(r[a])){const i={},o=r[a].reduce((function(e,t){return e[t]=!0,e}),{});for(const[n,r]of Object.entries(t[a]||{}))i[n]={},r&&e(i[n],r,o);for(const t in n[a])dr.call(n[a],t)&&(i[t]||(i[t]={}),n[a]&&n[a][t]&&e(i[t],n[a][t],o));t[a]=i}return t}(e,t,pr);function kr(e){var t=function(e){var t={scanner:new H,locationMap:new Sn,filename:"<unknown>",needPositions:!1,onParseError:En,onParseErrorThrow:!1,parseAtrulePrelude:!0,parseRulePrelude:!0,parseValue:!0,parseCustomProperty:!1,readSequence:Pn,createList:function(){return new i},createSingleNodeList:function(e){return(new i).appendData(e)},getFirstListNode:function(e){return e&&e.first()},getLastListNode:function(e){return e.last()},parseWithFallback:function(e,t){var n=this.scanner.tokenIndex;try{return e.call(this)}catch(e){if(this.onParseErrorThrow)throw e;var r=t.call(this,n);return this.onParseErrorThrow=!0,this.onParseError(e,r),this.onParseErrorThrow=!1,r}},lookupNonWSType:function(e){do{var t=this.scanner.lookupType(e++);if(t!==In)return t}while(0!==t);return 0},eat:function(e){if(this.scanner.tokenType!==e){var t=this.scanner.tokenStart,n=Dn[e]+" is expected";switch(e){case Nn:this.scanner.tokenType===Bn||this.scanner.tokenType===Mn?(t=this.scanner.tokenEnd-1,n="Identifier is expected but function found"):n="Identifier is expected";break;case jn:this.scanner.isDelim(35)&&(this.scanner.next(),t++,n="Name is expected");break;case _n:this.scanner.tokenType===qn&&(t=this.scanner.tokenEnd,n="Percent sign is expected");break;default:this.scanner.source.charCodeAt(this.scanner.tokenStart)===e&&(t+=1)}this.error(n,t)}this.scanner.next()},consume:function(e){var t=this.scanner.getTokenValue();return this.eat(e),t},consumeFunctionName:function(){var e=this.scanner.source.substring(this.scanner.tokenStart,this.scanner.tokenEnd-1);return this.eat(Bn),e},getLocation:function(e,t){return this.needPositions?this.locationMap.getLocationRange(e,t,this.filename):null},getLocationFromList:function(e){if(this.needPositions){var t=this.getFirstListNode(e),n=this.getLastListNode(e);return this.locationMap.getLocationRange(null!==t?t.loc.start.offset-this.locationMap.startOffset:this.scanner.tokenStart,null!==n?n.loc.end.offset-this.locationMap.startOffset:this.scanner.tokenStart,this.filename)}return null},error:function(e,t){var n=void 0!==t&&t<this.scanner.source.length?this.locationMap.getLocation(t):this.scanner.eof?this.locationMap.getLocation(Ln(this.scanner.source,this.scanner.source.length-1)):this.locationMap.getLocation(this.scanner.tokenStart);throw new l(e||"Unexpected input",this.scanner.source,n.offset,n.line,n.column)}};for(var n in e=function(e){var t={context:{},scope:{},atrule:{},pseudo:{}};if(e.parseContext)for(var n in e.parseContext)switch(typeof e.parseContext[n]){case"function":t.context[n]=e.parseContext[n];break;case"string":t.context[n]=Wn(e.parseContext[n])}if(e.scope)for(var n in e.scope)t.scope[n]=e.scope[n];if(e.atrule)for(var n in e.atrule){var r=e.atrule[n];r.parse&&(t.atrule[n]=r.parse)}if(e.pseudo)for(var n in e.pseudo){var a=e.pseudo[n];a.parse&&(t.pseudo[n]=a.parse)}if(e.node)for(var n in e.node)t[n]=e.node[n].parse;return t}(e||{}))t[n]=e[n];return function(e,n){var r,a=(n=n||{}).context||"default",i=n.onComment;if(we(e,t.scanner),t.locationMap.setSource(e,n.offset,n.line,n.column),t.filename=n.filename||"<unknown>",t.needPositions=Boolean(n.positions),t.onParseError="function"==typeof n.onParseError?n.onParseError:En,t.onParseErrorThrow=!1,t.parseAtrulePrelude=!("parseAtrulePrelude"in n)||Boolean(n.parseAtrulePrelude),t.parseRulePrelude=!("parseRulePrelude"in n)||Boolean(n.parseRulePrelude),t.parseValue=!("parseValue"in n)||Boolean(n.parseValue),t.parseCustomProperty="parseCustomProperty"in n&&Boolean(n.parseCustomProperty),!t.context.hasOwnProperty(a))throw new Error("Unknown context `"+a+"`");return"function"==typeof i&&t.scanner.forEachToken((n,r,a)=>{if(n===Rn){const n=t.getLocation(r,a),o=Tn(e,a-2,a,"*/")?e.slice(r+2,a-2):e.slice(r+2,a);i(o,n)}}),r=t.context[a].call(t,n),t.scanner.eof||t.error(),r}}(e),n=function(e){var t=function(e){var t={};for(var n in e.node)if(ar.call(e.node,n)){var r=e.node[n];if(!r.structure)throw new Error("Missed `structure` field in `"+n+"` node type definition");t[n]=lr(0,r)}return t}(e),n={},r={},a=Symbol("break-walk"),i=Symbol("skip-node");for(var o in t)ar.call(t,o)&&null!==t[o]&&(n[o]=cr(t[o],!1),r[o]=cr(t[o],!0));var s=ur(n),l=ur(r),c=function(e,o){function c(e,t,n){var r=h.call(m,e,t,n);return r===a||r!==i&&(!(!p.hasOwnProperty(e.type)||!p[e.type](e,m,c,u))||d.call(m,e,t,n)===a)}var u=(e,t,n,r)=>e||c(t,n,r),h=ir,d=ir,p=n,m={break:a,skip:i,root:e,stylesheet:null,atrule:null,atrulePrelude:null,rule:null,selector:null,block:null,declaration:null,function:null};if("function"==typeof o)h=o;else if(o&&(h=or(o.enter),d=or(o.leave),o.reverse&&(p=r),o.visit)){if(s.hasOwnProperty(o.visit))p=o.reverse?l[o.visit]:s[o.visit];else if(!t.hasOwnProperty(o.visit))throw new Error("Bad value `"+o.visit+"` for `visit` option (should be: "+Object.keys(t).join(", ")+")");h=sr(h,o.visit),d=sr(d,o.visit)}if(h===ir&&d===ir)throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function");c(e)};return c.break=a,c.skip=i,c.find=function(e,t){var n=null;return c(e,(function(e,r,i){if(t.call(this,e,r,i))return n=e,a})),n},c.findLast=function(e,t){var n=null;return c(e,{reverse:!0,enter:function(e,r,i){if(t.call(this,e,r,i))return n=e,a}}),n},c.findAll=function(e,t){var n=[];return c(e,(function(e,r,a){t.call(this,e,r,a)&&n.push(e)})),n},c}(e),r=function(e){function t(e){if(!nr.call(n,e.type))throw new Error("Unknown node type: "+e.type);n[e.type].call(this,e)}var n={};if(e.node)for(var r in e.node)n[r]=e.node[r].generate;return function(e,n){var r="",a={children:rr,node:t,chunk:function(e){r+=e},result:function(){return r}};return n&&("function"==typeof n.decorator&&(a=n.decorator(a)),n.sourceMap&&(a=function(e){var t=new er,n=1,r=0,a={line:1,column:0},i={line:0,column:0},o=!1,s={line:1,column:0},l={generated:s},c=e.node;e.node=function(e){if(e.loc&&e.loc.start&&tr.hasOwnProperty(e.type)){var u=e.loc.start.line,h=e.loc.start.column-1;i.line===u&&i.column===h||(i.line=u,i.column=h,a.line=n,a.column=r,o&&(o=!1,a.line===s.line&&a.column===s.column||t.addMapping(l)),o=!0,t.addMapping({source:e.loc.source,original:i,generated:a}))}c.call(this,e),o&&tr.hasOwnProperty(e.type)&&(s.line=n,s.column=r)};var u=e.chunk;e.chunk=function(e){for(var t=0;t<e.length;t++)10===e.charCodeAt(t)?(n++,r=0):r++;u(e)};var h=e.result;return e.result=function(){return o&&t.addMapping(l),{css:h(),map:t}},e}(a))),a.node(e),a.result()}}(e),a=function(e){return{fromPlainObject:function(t){return e(t,{enter:function(e){e.children&&e.children instanceof i==0&&(e.children=(new i).fromArray(e.children))}}),t},toPlainObject:function(t){return e(t,{leave:function(e){e.children&&e.children instanceof i&&(e.children=e.children.toArray())}}),t}}}(n),o={List:i,SyntaxError:l,TokenStream:H,Lexer:vn,vendorPrefix:ne.vendorPrefix,keyword:ne.keyword,property:ne.property,isCustomProperty:ne.isCustomProperty,definitionSyntax:kn,lexer:null,createLexer:function(e){return new vn(e,o,o.lexer.structure)},tokenize:we,parse:t,walk:n,generate:r,find:n.find,findLast:n.findLast,findAll:n.findAll,clone:hr,fromPlainObject:a.fromPlainObject,toPlainObject:a.toPlainObject,createSyntax:function(e){return kr(vr({},e))},fork:function(t){var n=vr({},e);return kr("function"==typeof t?t(n,Object.assign):vr(n,t))}};return o.lexer=new vn({generic:!0,types:e.types,atrules:e.atrules,properties:e.properties,node:e.node},o),o}var wr={generic:!0,types:{"absolute-size":"xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large","alpha-value":"<number>|<percentage>","angle-percentage":"<angle>|<percentage>","angular-color-hint":"<angle-percentage>","angular-color-stop":"<color>&&<color-stop-angle>?","angular-color-stop-list":"[<angular-color-stop> [, <angular-color-hint>]?]# , <angular-color-stop>","animateable-feature":"scroll-position|contents|<custom-ident>",attachment:"scroll|fixed|local","attr()":"attr( <attr-name> <type-or-unit>? [, <attr-fallback>]? )","attr-matcher":"['~'|'|'|'^'|'$'|'*']? '='","attr-modifier":"i|s","attribute-selector":"'[' <wq-name> ']'|'[' <wq-name> <attr-matcher> [<string-token>|<ident-token>] <attr-modifier>? ']'","auto-repeat":"repeat( [auto-fill|auto-fit] , [<line-names>? <fixed-size>]+ <line-names>? )","auto-track-list":"[<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>? <auto-repeat> [<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>?","baseline-position":"[first|last]? baseline","basic-shape":"<inset()>|<circle()>|<ellipse()>|<polygon()>|<path()>","bg-image":"none|<image>","bg-layer":"<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>","bg-position":"[[left|center|right|top|bottom|<length-percentage>]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]|[center|[left|right] <length-percentage>?]&&[center|[top|bottom] <length-percentage>?]]","bg-size":"[<length-percentage>|auto]{1,2}|cover|contain","blur()":"blur( <length> )","blend-mode":"normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|hard-light|soft-light|difference|exclusion|hue|saturation|color|luminosity",box:"border-box|padding-box|content-box","brightness()":"brightness( <number-percentage> )","calc()":"calc( <calc-sum> )","calc-sum":"<calc-product> [['+'|'-'] <calc-product>]*","calc-product":"<calc-value> ['*' <calc-value>|'/' <number>]*","calc-value":"<number>|<dimension>|<percentage>|( <calc-sum> )","cf-final-image":"<image>|<color>","cf-mixing-image":"<percentage>?&&<image>","circle()":"circle( [<shape-radius>]? [at <position>]? )","clamp()":"clamp( <calc-sum>#{3} )","class-selector":"'.' <ident-token>","clip-source":"<url>",color:"<rgb()>|<rgba()>|<hsl()>|<hsla()>|<hex-color>|<named-color>|currentcolor|<deprecated-system-color>","color-stop":"<color-stop-length>|<color-stop-angle>","color-stop-angle":"<angle-percentage>{1,2}","color-stop-length":"<length-percentage>{1,2}","color-stop-list":"[<linear-color-stop> [, <linear-color-hint>]?]# , <linear-color-stop>",combinator:"'>'|'+'|'~'|['||']","common-lig-values":"[common-ligatures|no-common-ligatures]","compat-auto":"searchfield|textarea|push-button|slider-horizontal|checkbox|radio|square-button|menulist|listbox|meter|progress-bar|button","composite-style":"clear|copy|source-over|source-in|source-out|source-atop|destination-over|destination-in|destination-out|destination-atop|xor","compositing-operator":"add|subtract|intersect|exclude","compound-selector":"[<type-selector>? <subclass-selector>* [<pseudo-element-selector> <pseudo-class-selector>*]*]!","compound-selector-list":"<compound-selector>#","complex-selector":"<compound-selector> [<combinator>? <compound-selector>]*","complex-selector-list":"<complex-selector>#","conic-gradient()":"conic-gradient( [from <angle>]? [at <position>]? , <angular-color-stop-list> )","contextual-alt-values":"[contextual|no-contextual]","content-distribution":"space-between|space-around|space-evenly|stretch","content-list":"[<string>|contents|<image>|<quote>|<target>|<leader()>|<attr()>|counter( <ident> , <'list-style-type'>? )]+","content-position":"center|start|end|flex-start|flex-end","content-replacement":"<image>","contrast()":"contrast( [<number-percentage>] )","counter()":"counter( <custom-ident> , <counter-style>? )","counter-style":"<counter-style-name>|symbols( )","counter-style-name":"<custom-ident>","counters()":"counters( <custom-ident> , <string> , <counter-style>? )","cross-fade()":"cross-fade( <cf-mixing-image> , <cf-final-image>? )","cubic-bezier-timing-function":"ease|ease-in|ease-out|ease-in-out|cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )","deprecated-system-color":"ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText","discretionary-lig-values":"[discretionary-ligatures|no-discretionary-ligatures]","display-box":"contents|none","display-inside":"flow|flow-root|table|flex|grid|ruby","display-internal":"table-row-group|table-header-group|table-footer-group|table-row|table-cell|table-column-group|table-column|table-caption|ruby-base|ruby-text|ruby-base-container|ruby-text-container","display-legacy":"inline-block|inline-list-item|inline-table|inline-flex|inline-grid","display-listitem":"<display-outside>?&&[flow|flow-root]?&&list-item","display-outside":"block|inline|run-in","drop-shadow()":"drop-shadow( <length>{2,3} <color>? )","east-asian-variant-values":"[jis78|jis83|jis90|jis04|simplified|traditional]","east-asian-width-values":"[full-width|proportional-width]","element()":"element( <custom-ident> , [first|start|last|first-except]? )|element( <id-selector> )","ellipse()":"ellipse( [<shape-radius>{2}]? [at <position>]? )","ending-shape":"circle|ellipse","env()":"env( <custom-ident> , <declaration-value>? )","explicit-track-list":"[<line-names>? <track-size>]+ <line-names>?","family-name":"<string>|<custom-ident>+","feature-tag-value":"<string> [<integer>|on|off]?","feature-type":"@stylistic|@historical-forms|@styleset|@character-variant|@swash|@ornaments|@annotation","feature-value-block":"<feature-type> '{' <feature-value-declaration-list> '}'","feature-value-block-list":"<feature-value-block>+","feature-value-declaration":"<custom-ident> : <integer>+ ;","feature-value-declaration-list":"<feature-value-declaration>","feature-value-name":"<custom-ident>","fill-rule":"nonzero|evenodd","filter-function":"<blur()>|<brightness()>|<contrast()>|<drop-shadow()>|<grayscale()>|<hue-rotate()>|<invert()>|<opacity()>|<saturate()>|<sepia()>","filter-function-list":"[<filter-function>|<url>]+","final-bg-layer":"<'background-color'>||<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>","fit-content()":"fit-content( [<length>|<percentage>] )","fixed-breadth":"<length-percentage>","fixed-repeat":"repeat( [<positive-integer>] , [<line-names>? <fixed-size>]+ <line-names>? )","fixed-size":"<fixed-breadth>|minmax( <fixed-breadth> , <track-breadth> )|minmax( <inflexible-breadth> , <fixed-breadth> )","font-stretch-absolute":"normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded|<percentage>","font-variant-css21":"[normal|small-caps]","font-weight-absolute":"normal|bold|<number [1,1000]>","frequency-percentage":"<frequency>|<percentage>","general-enclosed":"[<function-token> <any-value> )]|( <ident> <any-value> )","generic-family":"serif|sans-serif|cursive|fantasy|monospace|-apple-system","generic-name":"serif|sans-serif|cursive|fantasy|monospace","geometry-box":"<shape-box>|fill-box|stroke-box|view-box",gradient:"<linear-gradient()>|<repeating-linear-gradient()>|<radial-gradient()>|<repeating-radial-gradient()>|<conic-gradient()>|<-legacy-gradient>","grayscale()":"grayscale( <number-percentage> )","grid-line":"auto|<custom-ident>|[<integer>&&<custom-ident>?]|[span&&[<integer>||<custom-ident>]]","historical-lig-values":"[historical-ligatures|no-historical-ligatures]","hsl()":"hsl( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )","hsla()":"hsla( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )",hue:"<number>|<angle>","hue-rotate()":"hue-rotate( <angle> )",image:"<url>|<image()>|<image-set()>|<element()>|<paint()>|<cross-fade()>|<gradient>","image()":"image( <image-tags>? [<image-src>? , <color>?]! )","image-set()":"image-set( <image-set-option># )","image-set-option":"[<image>|<string>] <resolution>","image-src":"<url>|<string>","image-tags":"ltr|rtl","inflexible-breadth":"<length>|<percentage>|min-content|max-content|auto","inset()":"inset( <length-percentage>{1,4} [round <'border-radius'>]? )","invert()":"invert( <number-percentage> )","keyframes-name":"<custom-ident>|<string>","keyframe-block":"<keyframe-selector># { <declaration-list> }","keyframe-block-list":"<keyframe-block>+","keyframe-selector":"from|to|<percentage>","leader()":"leader( <leader-type> )","leader-type":"dotted|solid|space|<string>","length-percentage":"<length>|<percentage>","line-names":"'[' <custom-ident>* ']'","line-name-list":"[<line-names>|<name-repeat>]+","line-style":"none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset","line-width":"<length>|thin|medium|thick","linear-color-hint":"<length-percentage>","linear-color-stop":"<color> <color-stop-length>?","linear-gradient()":"linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )","mask-layer":"<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||<geometry-box>||[<geometry-box>|no-clip]||<compositing-operator>||<masking-mode>","mask-position":"[<length-percentage>|left|center|right] [<length-percentage>|top|center|bottom]?","mask-reference":"none|<image>|<mask-source>","mask-source":"<url>","masking-mode":"alpha|luminance|match-source","matrix()":"matrix( <number>#{6} )","matrix3d()":"matrix3d( <number>#{16} )","max()":"max( <calc-sum># )","media-and":"<media-in-parens> [and <media-in-parens>]+","media-condition":"<media-not>|<media-and>|<media-or>|<media-in-parens>","media-condition-without-or":"<media-not>|<media-and>|<media-in-parens>","media-feature":"( [<mf-plain>|<mf-boolean>|<mf-range>] )","media-in-parens":"( <media-condition> )|<media-feature>|<general-enclosed>","media-not":"not <media-in-parens>","media-or":"<media-in-parens> [or <media-in-parens>]+","media-query":"<media-condition>|[not|only]? <media-type> [and <media-condition-without-or>]?","media-query-list":"<media-query>#","media-type":"<ident>","mf-boolean":"<mf-name>","mf-name":"<ident>","mf-plain":"<mf-name> : <mf-value>","mf-range":"<mf-name> ['<'|'>']? '='? <mf-value>|<mf-value> ['<'|'>']? '='? <mf-name>|<mf-value> '<' '='? <mf-name> '<' '='? <mf-value>|<mf-value> '>' '='? <mf-name> '>' '='? <mf-value>","mf-value":"<number>|<dimension>|<ident>|<ratio>","min()":"min( <calc-sum># )","minmax()":"minmax( [<length>|<percentage>|min-content|max-content|auto] , [<length>|<percentage>|<flex>|min-content|max-content|auto] )","named-color":"transparent|aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen|<-non-standard-color>","namespace-prefix":"<ident>","ns-prefix":"[<ident-token>|'*']? '|'","number-percentage":"<number>|<percentage>","numeric-figure-values":"[lining-nums|oldstyle-nums]","numeric-fraction-values":"[diagonal-fractions|stacked-fractions]","numeric-spacing-values":"[proportional-nums|tabular-nums]",nth:"<an-plus-b>|even|odd","opacity()":"opacity( [<number-percentage>] )","overflow-position":"unsafe|safe","outline-radius":"<length>|<percentage>","page-body":"<declaration>? [; <page-body>]?|<page-margin-box> <page-body>","page-margin-box":"<page-margin-box-type> '{' <declaration-list> '}'","page-margin-box-type":"@top-left-corner|@top-left|@top-center|@top-right|@top-right-corner|@bottom-left-corner|@bottom-left|@bottom-center|@bottom-right|@bottom-right-corner|@left-top|@left-middle|@left-bottom|@right-top|@right-middle|@right-bottom","page-selector-list":"[<page-selector>#]?","page-selector":"<pseudo-page>+|<ident> <pseudo-page>*","path()":"path( [<fill-rule> ,]? <string> )","paint()":"paint( <ident> , <declaration-value>? )","perspective()":"perspective( <length> )","polygon()":"polygon( <fill-rule>? , [<length-percentage> <length-percentage>]# )",position:"[[left|center|right]||[top|center|bottom]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]?|[[left|right] <length-percentage>]&&[[top|bottom] <length-percentage>]]","pseudo-class-selector":"':' <ident-token>|':' <function-token> <any-value> ')'","pseudo-element-selector":"':' <pseudo-class-selector>","pseudo-page":": [left|right|first|blank]",quote:"open-quote|close-quote|no-open-quote|no-close-quote","radial-gradient()":"radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )","relative-selector":"<combinator>? <complex-selector>","relative-selector-list":"<relative-selector>#","relative-size":"larger|smaller","repeat-style":"repeat-x|repeat-y|[repeat|space|round|no-repeat]{1,2}","repeating-linear-gradient()":"repeating-linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )","repeating-radial-gradient()":"repeating-radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )","rgb()":"rgb( <percentage>{3} [/ <alpha-value>]? )|rgb( <number>{3} [/ <alpha-value>]? )|rgb( <percentage>#{3} , <alpha-value>? )|rgb( <number>#{3} , <alpha-value>? )","rgba()":"rgba( <percentage>{3} [/ <alpha-value>]? )|rgba( <number>{3} [/ <alpha-value>]? )|rgba( <percentage>#{3} , <alpha-value>? )|rgba( <number>#{3} , <alpha-value>? )","rotate()":"rotate( [<angle>|<zero>] )","rotate3d()":"rotate3d( <number> , <number> , <number> , [<angle>|<zero>] )","rotateX()":"rotateX( [<angle>|<zero>] )","rotateY()":"rotateY( [<angle>|<zero>] )","rotateZ()":"rotateZ( [<angle>|<zero>] )","saturate()":"saturate( <number-percentage> )","scale()":"scale( <number> , <number>? )","scale3d()":"scale3d( <number> , <number> , <number> )","scaleX()":"scaleX( <number> )","scaleY()":"scaleY( <number> )","scaleZ()":"scaleZ( <number> )","self-position":"center|start|end|self-start|self-end|flex-start|flex-end","shape-radius":"<length-percentage>|closest-side|farthest-side","skew()":"skew( [<angle>|<zero>] , [<angle>|<zero>]? )","skewX()":"skewX( [<angle>|<zero>] )","skewY()":"skewY( [<angle>|<zero>] )","sepia()":"sepia( <number-percentage> )",shadow:"inset?&&<length>{2,4}&&<color>?","shadow-t":"[<length>{2,3}&&<color>?]",shape:"rect( <top> , <right> , <bottom> , <left> )|rect( <top> <right> <bottom> <left> )","shape-box":"<box>|margin-box","side-or-corner":"[left|right]||[top|bottom]","single-animation":"<time>||<timing-function>||<time>||<single-animation-iteration-count>||<single-animation-direction>||<single-animation-fill-mode>||<single-animation-play-state>||[none|<keyframes-name>]","single-animation-direction":"normal|reverse|alternate|alternate-reverse","single-animation-fill-mode":"none|forwards|backwards|both","single-animation-iteration-count":"infinite|<number>","single-animation-play-state":"running|paused","single-transition":"[none|<single-transition-property>]||<time>||<timing-function>||<time>","single-transition-property":"all|<custom-ident>",size:"closest-side|farthest-side|closest-corner|farthest-corner|<length>|<length-percentage>{2}","step-position":"jump-start|jump-end|jump-none|jump-both|start|end","step-timing-function":"step-start|step-end|steps( <integer> [, <step-position>]? )","subclass-selector":"<id-selector>|<class-selector>|<attribute-selector>|<pseudo-class-selector>","supports-condition":"not <supports-in-parens>|<supports-in-parens> [and <supports-in-parens>]*|<supports-in-parens> [or <supports-in-parens>]*","supports-in-parens":"( <supports-condition> )|<supports-feature>|<general-enclosed>","supports-feature":"<supports-decl>|<supports-selector-fn>","supports-decl":"( <declaration> )","supports-selector-fn":"selector( <complex-selector> )",symbol:"<string>|<image>|<custom-ident>",target:"<target-counter()>|<target-counters()>|<target-text()>","target-counter()":"target-counter( [<string>|<url>] , <custom-ident> , <counter-style>? )","target-counters()":"target-counters( [<string>|<url>] , <custom-ident> , <string> , <counter-style>? )","target-text()":"target-text( [<string>|<url>] , [content|before|after|first-letter]? )","time-percentage":"<time>|<percentage>","timing-function":"linear|<cubic-bezier-timing-function>|<step-timing-function>","track-breadth":"<length-percentage>|<flex>|min-content|max-content|auto","track-list":"[<line-names>? [<track-size>|<track-repeat>]]+ <line-names>?","track-repeat":"repeat( [<positive-integer>] , [<line-names>? <track-size>]+ <line-names>? )","track-size":"<track-breadth>|minmax( <inflexible-breadth> , <track-breadth> )|fit-content( [<length>|<percentage>] )","transform-function":"<matrix()>|<translate()>|<translateX()>|<translateY()>|<scale()>|<scaleX()>|<scaleY()>|<rotate()>|<skew()>|<skewX()>|<skewY()>|<matrix3d()>|<translate3d()>|<translateZ()>|<scale3d()>|<scaleZ()>|<rotate3d()>|<rotateX()>|<rotateY()>|<rotateZ()>|<perspective()>","transform-list":"<transform-function>+","translate()":"translate( <length-percentage> , <length-percentage>? )","translate3d()":"translate3d( <length-percentage> , <length-percentage> , <length> )","translateX()":"translateX( <length-percentage> )","translateY()":"translateY( <length-percentage> )","translateZ()":"translateZ( <length> )","type-or-unit":"string|color|url|integer|number|length|angle|time|frequency|cap|ch|em|ex|ic|lh|rlh|rem|vb|vi|vw|vh|vmin|vmax|mm|Q|cm|in|pt|pc|px|deg|grad|rad|turn|ms|s|Hz|kHz|%","type-selector":"<wq-name>|<ns-prefix>? '*'","var()":"var( <custom-property-name> , <declaration-value>? )","viewport-length":"auto|<length-percentage>","wq-name":"<ns-prefix>? <ident-token>","-legacy-gradient":"<-webkit-gradient()>|<-legacy-linear-gradient>|<-legacy-repeating-linear-gradient>|<-legacy-radial-gradient>|<-legacy-repeating-radial-gradient>","-legacy-linear-gradient":"-moz-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-repeating-linear-gradient":"-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-linear-gradient-arguments":"[<angle>|<side-or-corner>]? , <color-stop-list>","-legacy-radial-gradient":"-moz-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-repeating-radial-gradient":"-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-radial-gradient-arguments":"[<position> ,]? [[[<-legacy-radial-gradient-shape>||<-legacy-radial-gradient-size>]|[<length>|<percentage>]{2}] ,]? <color-stop-list>","-legacy-radial-gradient-size":"closest-side|closest-corner|farthest-side|farthest-corner|contain|cover","-legacy-radial-gradient-shape":"circle|ellipse","-non-standard-font":"-apple-system-body|-apple-system-headline|-apple-system-subheadline|-apple-system-caption1|-apple-system-caption2|-apple-system-footnote|-apple-system-short-body|-apple-system-short-headline|-apple-system-short-subheadline|-apple-system-short-caption1|-apple-system-short-footnote|-apple-system-tall-body","-non-standard-color":"-moz-ButtonDefault|-moz-ButtonHoverFace|-moz-ButtonHoverText|-moz-CellHighlight|-moz-CellHighlightText|-moz-Combobox|-moz-ComboboxText|-moz-Dialog|-moz-DialogText|-moz-dragtargetzone|-moz-EvenTreeRow|-moz-Field|-moz-FieldText|-moz-html-CellHighlight|-moz-html-CellHighlightText|-moz-mac-accentdarkestshadow|-moz-mac-accentdarkshadow|-moz-mac-accentface|-moz-mac-accentlightesthighlight|-moz-mac-accentlightshadow|-moz-mac-accentregularhighlight|-moz-mac-accentregularshadow|-moz-mac-chrome-active|-moz-mac-chrome-inactive|-moz-mac-focusring|-moz-mac-menuselect|-moz-mac-menushadow|-moz-mac-menutextselect|-moz-MenuHover|-moz-MenuHoverText|-moz-MenuBarText|-moz-MenuBarHoverText|-moz-nativehyperlinktext|-moz-OddTreeRow|-moz-win-communicationstext|-moz-win-mediatext|-moz-activehyperlinktext|-moz-default-background-color|-moz-default-color|-moz-hyperlinktext|-moz-visitedhyperlinktext|-webkit-activelink|-webkit-focus-ring-color|-webkit-link|-webkit-text","-non-standard-image-rendering":"optimize-contrast|-moz-crisp-edges|-o-crisp-edges|-webkit-optimize-contrast","-non-standard-overflow":"-moz-scrollbars-none|-moz-scrollbars-horizontal|-moz-scrollbars-vertical|-moz-hidden-unscrollable","-non-standard-width":"fill-available|min-intrinsic|intrinsic|-moz-available|-moz-fit-content|-moz-min-content|-moz-max-content|-webkit-min-content|-webkit-max-content","-webkit-gradient()":"-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point>|, <-webkit-gradient-radius> , <-webkit-gradient-point>] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )","-webkit-gradient-color-stop":"from( <color> )|color-stop( [<number-zero-one>|<percentage>] , <color> )|to( <color> )","-webkit-gradient-point":"[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]","-webkit-gradient-radius":"<length>|<percentage>","-webkit-gradient-type":"linear|radial","-webkit-mask-box-repeat":"repeat|stretch|round","-webkit-mask-clip-style":"border|border-box|padding|padding-box|content|content-box|text","-ms-filter-function-list":"<-ms-filter-function>+","-ms-filter-function":"<-ms-filter-function-progid>|<-ms-filter-function-legacy>","-ms-filter-function-progid":"'progid:' [<ident-token> '.']* [<ident-token>|<function-token> <any-value>? )]","-ms-filter-function-legacy":"<ident-token>|<function-token> <any-value>? )","-ms-filter":"<string>",age:"child|young|old","attr-name":"<wq-name>","attr-fallback":"<any-value>","border-radius":"<length-percentage>{1,2}",bottom:"<length>|auto","generic-voice":"[<age>? <gender> <integer>?]",gender:"male|female|neutral",left:"<length>|auto","mask-image":"<mask-reference>#","name-repeat":"repeat( [<positive-integer>|auto-fill] , <line-names>+ )",paint:"none|<color>|<url> [none|<color>]?|context-fill|context-stroke","page-size":"A5|A4|A3|B5|B4|JIS-B5|JIS-B4|letter|legal|ledger",ratio:"<integer> / <integer>",right:"<length>|auto","svg-length":"<percentage>|<length>|<number>","svg-writing-mode":"lr-tb|rl-tb|tb-rl|lr|rl|tb",top:"<length>|auto","track-group":"'(' [<string>* <track-minmax> <string>*]+ ')' ['[' <positive-integer> ']']?|<track-minmax>","track-list-v0":"[<string>* <track-group> <string>*]+|none","track-minmax":"minmax( <track-breadth> , <track-breadth> )|auto|<track-breadth>|fit-content",x:"<number>",y:"<number>",declaration:"<ident-token> : <declaration-value>? ['!' important]?","declaration-list":"[<declaration>? ';']* <declaration>?",url:"url( <string> <url-modifier>* )|<url-token>","url-modifier":"<ident>|<function-token> <any-value> )","number-zero-one":"<number [0,1]>","number-one-or-greater":"<number [1,∞]>","positive-integer":"<integer [0,∞]>","-non-standard-display":"-ms-inline-flexbox|-ms-grid|-ms-inline-grid|-webkit-flex|-webkit-inline-flex|-webkit-box|-webkit-inline-box|-moz-inline-stack|-moz-box|-moz-inline-box"},properties:{"--*":"<declaration-value>","-ms-accelerator":"false|true","-ms-block-progression":"tb|rl|bt|lr","-ms-content-zoom-chaining":"none|chained","-ms-content-zooming":"none|zoom","-ms-content-zoom-limit":"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>","-ms-content-zoom-limit-max":"<percentage>","-ms-content-zoom-limit-min":"<percentage>","-ms-content-zoom-snap":"<'-ms-content-zoom-snap-type'>||<'-ms-content-zoom-snap-points'>","-ms-content-zoom-snap-points":"snapInterval( <percentage> , <percentage> )|snapList( <percentage># )","-ms-content-zoom-snap-type":"none|proximity|mandatory","-ms-filter":"<string>","-ms-flow-from":"[none|<custom-ident>]#","-ms-flow-into":"[none|<custom-ident>]#","-ms-grid-columns":"none|<track-list>|<auto-track-list>","-ms-grid-rows":"none|<track-list>|<auto-track-list>","-ms-high-contrast-adjust":"auto|none","-ms-hyphenate-limit-chars":"auto|<integer>{1,3}","-ms-hyphenate-limit-lines":"no-limit|<integer>","-ms-hyphenate-limit-zone":"<percentage>|<length>","-ms-ime-align":"auto|after","-ms-overflow-style":"auto|none|scrollbar|-ms-autohiding-scrollbar","-ms-scrollbar-3dlight-color":"<color>","-ms-scrollbar-arrow-color":"<color>","-ms-scrollbar-base-color":"<color>","-ms-scrollbar-darkshadow-color":"<color>","-ms-scrollbar-face-color":"<color>","-ms-scrollbar-highlight-color":"<color>","-ms-scrollbar-shadow-color":"<color>","-ms-scrollbar-track-color":"<color>","-ms-scroll-chaining":"chained|none","-ms-scroll-limit":"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>","-ms-scroll-limit-x-max":"auto|<length>","-ms-scroll-limit-x-min":"<length>","-ms-scroll-limit-y-max":"auto|<length>","-ms-scroll-limit-y-min":"<length>","-ms-scroll-rails":"none|railed","-ms-scroll-snap-points-x":"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )","-ms-scroll-snap-points-y":"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )","-ms-scroll-snap-type":"none|proximity|mandatory","-ms-scroll-snap-x":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>","-ms-scroll-snap-y":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>","-ms-scroll-translation":"none|vertical-to-horizontal","-ms-text-autospace":"none|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space","-ms-touch-select":"grippers|none","-ms-user-select":"none|element|text","-ms-wrap-flow":"auto|both|start|end|maximum|clear","-ms-wrap-margin":"<length>","-ms-wrap-through":"wrap|none","-moz-appearance":"none|button|button-arrow-down|button-arrow-next|button-arrow-previous|button-arrow-up|button-bevel|button-focus|caret|checkbox|checkbox-container|checkbox-label|checkmenuitem|dualbutton|groupbox|listbox|listitem|menuarrow|menubar|menucheckbox|menuimage|menuitem|menuitemtext|menulist|menulist-button|menulist-text|menulist-textfield|menupopup|menuradio|menuseparator|meterbar|meterchunk|progressbar|progressbar-vertical|progresschunk|progresschunk-vertical|radio|radio-container|radio-label|radiomenuitem|range|range-thumb|resizer|resizerpanel|scale-horizontal|scalethumbend|scalethumb-horizontal|scalethumbstart|scalethumbtick|scalethumb-vertical|scale-vertical|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|separator|sheet|spinner|spinner-downbutton|spinner-textfield|spinner-upbutton|splitter|statusbar|statusbarpanel|tab|tabpanel|tabpanels|tab-scroll-arrow-back|tab-scroll-arrow-forward|textfield|textfield-multiline|toolbar|toolbarbutton|toolbarbutton-dropdown|toolbargripper|toolbox|tooltip|treeheader|treeheadercell|treeheadersortarrow|treeitem|treeline|treetwisty|treetwistyopen|treeview|-moz-mac-unified-toolbar|-moz-win-borderless-glass|-moz-win-browsertabbar-toolbox|-moz-win-communicationstext|-moz-win-communications-toolbox|-moz-win-exclude-glass|-moz-win-glass|-moz-win-mediatext|-moz-win-media-toolbox|-moz-window-button-box|-moz-window-button-box-maximized|-moz-window-button-close|-moz-window-button-maximize|-moz-window-button-minimize|-moz-window-button-restore|-moz-window-frame-bottom|-moz-window-frame-left|-moz-window-frame-right|-moz-window-titlebar|-moz-window-titlebar-maximized","-moz-binding":"<url>|none","-moz-border-bottom-colors":"<color>+|none","-moz-border-left-colors":"<color>+|none","-moz-border-right-colors":"<color>+|none","-moz-border-top-colors":"<color>+|none","-moz-context-properties":"none|[fill|fill-opacity|stroke|stroke-opacity]#","-moz-float-edge":"border-box|content-box|margin-box|padding-box","-moz-force-broken-image-icon":"<integer [0,1]>","-moz-image-region":"<shape>|auto","-moz-orient":"inline|block|horizontal|vertical","-moz-outline-radius":"<outline-radius>{1,4} [/ <outline-radius>{1,4}]?","-moz-outline-radius-bottomleft":"<outline-radius>","-moz-outline-radius-bottomright":"<outline-radius>","-moz-outline-radius-topleft":"<outline-radius>","-moz-outline-radius-topright":"<outline-radius>","-moz-stack-sizing":"ignore|stretch-to-fit","-moz-text-blink":"none|blink","-moz-user-focus":"ignore|normal|select-after|select-before|select-menu|select-same|select-all|none","-moz-user-input":"auto|none|enabled|disabled","-moz-user-modify":"read-only|read-write|write-only","-moz-window-dragging":"drag|no-drag","-moz-window-shadow":"default|menu|tooltip|sheet|none","-webkit-appearance":"none|button|button-bevel|caps-lock-indicator|caret|checkbox|default-button|inner-spin-button|listbox|listitem|media-controls-background|media-controls-fullscreen-background|media-current-time-display|media-enter-fullscreen-button|media-exit-fullscreen-button|media-fullscreen-button|media-mute-button|media-overlay-play-button|media-play-button|media-seek-back-button|media-seek-forward-button|media-slider|media-sliderthumb|media-time-remaining-display|media-toggle-closed-captions-button|media-volume-slider|media-volume-slider-container|media-volume-sliderthumb|menulist|menulist-button|menulist-text|menulist-textfield|meter|progress-bar|progress-bar-value|push-button|radio|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbargripper-horizontal|scrollbargripper-vertical|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|searchfield-cancel-button|searchfield-decoration|searchfield-results-button|searchfield-results-decoration|slider-horizontal|slider-vertical|sliderthumb-horizontal|sliderthumb-vertical|square-button|textarea|textfield|-apple-pay-button","-webkit-border-before":"<'border-width'>||<'border-style'>||<'color'>","-webkit-border-before-color":"<'color'>","-webkit-border-before-style":"<'border-style'>","-webkit-border-before-width":"<'border-width'>","-webkit-box-reflect":"[above|below|right|left]? <length>? <image>?","-webkit-line-clamp":"none|<integer>","-webkit-mask":"[<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||[<box>|border|padding|content|text]||[<box>|border|padding|content]]#","-webkit-mask-attachment":"<attachment>#","-webkit-mask-clip":"[<box>|border|padding|content|text]#","-webkit-mask-composite":"<composite-style>#","-webkit-mask-image":"<mask-reference>#","-webkit-mask-origin":"[<box>|border|padding|content]#","-webkit-mask-position":"<position>#","-webkit-mask-position-x":"[<length-percentage>|left|center|right]#","-webkit-mask-position-y":"[<length-percentage>|top|center|bottom]#","-webkit-mask-repeat":"<repeat-style>#","-webkit-mask-repeat-x":"repeat|no-repeat|space|round","-webkit-mask-repeat-y":"repeat|no-repeat|space|round","-webkit-mask-size":"<bg-size>#","-webkit-overflow-scrolling":"auto|touch","-webkit-tap-highlight-color":"<color>","-webkit-text-fill-color":"<color>","-webkit-text-stroke":"<length>||<color>","-webkit-text-stroke-color":"<color>","-webkit-text-stroke-width":"<length>","-webkit-touch-callout":"default|none","-webkit-user-modify":"read-only|read-write|read-write-plaintext-only","align-content":"normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>","align-items":"normal|stretch|<baseline-position>|[<overflow-position>? <self-position>]","align-self":"auto|normal|stretch|<baseline-position>|<overflow-position>? <self-position>","align-tracks":"[normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>]#",all:"initial|inherit|unset|revert",animation:"<single-animation>#","animation-delay":"<time>#","animation-direction":"<single-animation-direction>#","animation-duration":"<time>#","animation-fill-mode":"<single-animation-fill-mode>#","animation-iteration-count":"<single-animation-iteration-count>#","animation-name":"[none|<keyframes-name>]#","animation-play-state":"<single-animation-play-state>#","animation-timing-function":"<timing-function>#",appearance:"none|auto|textfield|menulist-button|<compat-auto>","aspect-ratio":"auto|<ratio>",azimuth:"<angle>|[[left-side|far-left|left|center-left|center|center-right|right|far-right|right-side]||behind]|leftwards|rightwards","backdrop-filter":"none|<filter-function-list>","backface-visibility":"visible|hidden",background:"[<bg-layer> ,]* <final-bg-layer>","background-attachment":"<attachment>#","background-blend-mode":"<blend-mode>#","background-clip":"<box>#","background-color":"<color>","background-image":"<bg-image>#","background-origin":"<box>#","background-position":"<bg-position>#","background-position-x":"[center|[[left|right|x-start|x-end]? <length-percentage>?]!]#","background-position-y":"[center|[[top|bottom|y-start|y-end]? <length-percentage>?]!]#","background-repeat":"<repeat-style>#","background-size":"<bg-size>#","block-overflow":"clip|ellipsis|<string>","block-size":"<'width'>",border:"<line-width>||<line-style>||<color>","border-block":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-color":"<'border-top-color'>{1,2}","border-block-style":"<'border-top-style'>","border-block-width":"<'border-top-width'>","border-block-end":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-end-color":"<'border-top-color'>","border-block-end-style":"<'border-top-style'>","border-block-end-width":"<'border-top-width'>","border-block-start":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-start-color":"<'border-top-color'>","border-block-start-style":"<'border-top-style'>","border-block-start-width":"<'border-top-width'>","border-bottom":"<line-width>||<line-style>||<color>","border-bottom-color":"<'border-top-color'>","border-bottom-left-radius":"<length-percentage>{1,2}","border-bottom-right-radius":"<length-percentage>{1,2}","border-bottom-style":"<line-style>","border-bottom-width":"<line-width>","border-collapse":"collapse|separate","border-color":"<color>{1,4}","border-end-end-radius":"<length-percentage>{1,2}","border-end-start-radius":"<length-percentage>{1,2}","border-image":"<'border-image-source'>||<'border-image-slice'> [/ <'border-image-width'>|/ <'border-image-width'>? / <'border-image-outset'>]?||<'border-image-repeat'>","border-image-outset":"[<length>|<number>]{1,4}","border-image-repeat":"[stretch|repeat|round|space]{1,2}","border-image-slice":"<number-percentage>{1,4}&&fill?","border-image-source":"none|<image>","border-image-width":"[<length-percentage>|<number>|auto]{1,4}","border-inline":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-end":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-color":"<'border-top-color'>{1,2}","border-inline-style":"<'border-top-style'>","border-inline-width":"<'border-top-width'>","border-inline-end-color":"<'border-top-color'>","border-inline-end-style":"<'border-top-style'>","border-inline-end-width":"<'border-top-width'>","border-inline-start":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-start-color":"<'border-top-color'>","border-inline-start-style":"<'border-top-style'>","border-inline-start-width":"<'border-top-width'>","border-left":"<line-width>||<line-style>||<color>","border-left-color":"<color>","border-left-style":"<line-style>","border-left-width":"<line-width>","border-radius":"<length-percentage>{1,4} [/ <length-percentage>{1,4}]?","border-right":"<line-width>||<line-style>||<color>","border-right-color":"<color>","border-right-style":"<line-style>","border-right-width":"<line-width>","border-spacing":"<length> <length>?","border-start-end-radius":"<length-percentage>{1,2}","border-start-start-radius":"<length-percentage>{1,2}","border-style":"<line-style>{1,4}","border-top":"<line-width>||<line-style>||<color>","border-top-color":"<color>","border-top-left-radius":"<length-percentage>{1,2}","border-top-right-radius":"<length-percentage>{1,2}","border-top-style":"<line-style>","border-top-width":"<line-width>","border-width":"<line-width>{1,4}",bottom:"<length>|<percentage>|auto","box-align":"start|center|end|baseline|stretch","box-decoration-break":"slice|clone","box-direction":"normal|reverse|inherit","box-flex":"<number>","box-flex-group":"<integer>","box-lines":"single|multiple","box-ordinal-group":"<integer>","box-orient":"horizontal|vertical|inline-axis|block-axis|inherit","box-pack":"start|center|end|justify","box-shadow":"none|<shadow>#","box-sizing":"content-box|border-box","break-after":"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region","break-before":"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region","break-inside":"auto|avoid|avoid-page|avoid-column|avoid-region","caption-side":"top|bottom|block-start|block-end|inline-start|inline-end","caret-color":"auto|<color>",clear:"none|left|right|both|inline-start|inline-end",clip:"<shape>|auto","clip-path":"<clip-source>|[<basic-shape>||<geometry-box>]|none",color:"<color>","color-adjust":"economy|exact","column-count":"<integer>|auto","column-fill":"auto|balance|balance-all","column-gap":"normal|<length-percentage>","column-rule":"<'column-rule-width'>||<'column-rule-style'>||<'column-rule-color'>","column-rule-color":"<color>","column-rule-style":"<'border-style'>","column-rule-width":"<'border-width'>","column-span":"none|all","column-width":"<length>|auto",columns:"<'column-width'>||<'column-count'>",contain:"none|strict|content|[size||layout||style||paint]",content:"normal|none|[<content-replacement>|<content-list>] [/ <string>]?","counter-increment":"[<custom-ident> <integer>?]+|none","counter-reset":"[<custom-ident> <integer>?]+|none","counter-set":"[<custom-ident> <integer>?]+|none",cursor:"[[<url> [<x> <y>]? ,]* [auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|e-resize|n-resize|ne-resize|nw-resize|s-resize|se-resize|sw-resize|w-resize|ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize|row-resize|all-scroll|zoom-in|zoom-out|grab|grabbing|hand|-webkit-grab|-webkit-grabbing|-webkit-zoom-in|-webkit-zoom-out|-moz-grab|-moz-grabbing|-moz-zoom-in|-moz-zoom-out]]",direction:"ltr|rtl",display:"[<display-outside>||<display-inside>]|<display-listitem>|<display-internal>|<display-box>|<display-legacy>|<-non-standard-display>","empty-cells":"show|hide",filter:"none|<filter-function-list>|<-ms-filter-function-list>",flex:"none|[<'flex-grow'> <'flex-shrink'>?||<'flex-basis'>]","flex-basis":"content|<'width'>","flex-direction":"row|row-reverse|column|column-reverse","flex-flow":"<'flex-direction'>||<'flex-wrap'>","flex-grow":"<number>","flex-shrink":"<number>","flex-wrap":"nowrap|wrap|wrap-reverse",float:"left|right|none|inline-start|inline-end",font:"[[<'font-style'>||<font-variant-css21>||<'font-weight'>||<'font-stretch'>]? <'font-size'> [/ <'line-height'>]? <'font-family'>]|caption|icon|menu|message-box|small-caption|status-bar","font-family":"[<family-name>|<generic-family>]#","font-feature-settings":"normal|<feature-tag-value>#","font-kerning":"auto|normal|none","font-language-override":"normal|<string>","font-optical-sizing":"auto|none","font-variation-settings":"normal|[<string> <number>]#","font-size":"<absolute-size>|<relative-size>|<length-percentage>","font-size-adjust":"none|<number>","font-smooth":"auto|never|always|<absolute-size>|<length>","font-stretch":"<font-stretch-absolute>","font-style":"normal|italic|oblique <angle>?","font-synthesis":"none|[weight||style]","font-variant":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]","font-variant-alternates":"normal|[stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )]","font-variant-caps":"normal|small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps","font-variant-east-asian":"normal|[<east-asian-variant-values>||<east-asian-width-values>||ruby]","font-variant-ligatures":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>]","font-variant-numeric":"normal|[<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero]","font-variant-position":"normal|sub|super","font-weight":"<font-weight-absolute>|bolder|lighter",gap:"<'row-gap'> <'column-gap'>?",grid:"<'grid-template'>|<'grid-template-rows'> / [auto-flow&&dense?] <'grid-auto-columns'>?|[auto-flow&&dense?] <'grid-auto-rows'>? / <'grid-template-columns'>","grid-area":"<grid-line> [/ <grid-line>]{0,3}","grid-auto-columns":"<track-size>+","grid-auto-flow":"[row|column]||dense","grid-auto-rows":"<track-size>+","grid-column":"<grid-line> [/ <grid-line>]?","grid-column-end":"<grid-line>","grid-column-gap":"<length-percentage>","grid-column-start":"<grid-line>","grid-gap":"<'grid-row-gap'> <'grid-column-gap'>?","grid-row":"<grid-line> [/ <grid-line>]?","grid-row-end":"<grid-line>","grid-row-gap":"<length-percentage>","grid-row-start":"<grid-line>","grid-template":"none|[<'grid-template-rows'> / <'grid-template-columns'>]|[<line-names>? <string> <track-size>? <line-names>?]+ [/ <explicit-track-list>]?","grid-template-areas":"none|<string>+","grid-template-columns":"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?","grid-template-rows":"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?","hanging-punctuation":"none|[first||[force-end|allow-end]||last]",height:"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )",hyphens:"none|manual|auto","image-orientation":"from-image|<angle>|[<angle>? flip]","image-rendering":"auto|crisp-edges|pixelated|optimizeSpeed|optimizeQuality|<-non-standard-image-rendering>","image-resolution":"[from-image||<resolution>]&&snap?","ime-mode":"auto|normal|active|inactive|disabled","initial-letter":"normal|[<number> <integer>?]","initial-letter-align":"[auto|alphabetic|hanging|ideographic]","inline-size":"<'width'>",inset:"<'top'>{1,4}","inset-block":"<'top'>{1,2}","inset-block-end":"<'top'>","inset-block-start":"<'top'>","inset-inline":"<'top'>{1,2}","inset-inline-end":"<'top'>","inset-inline-start":"<'top'>",isolation:"auto|isolate","justify-content":"normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]","justify-items":"normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]|legacy|legacy&&[left|right|center]","justify-self":"auto|normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]","justify-tracks":"[normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]]#",left:"<length>|<percentage>|auto","letter-spacing":"normal|<length-percentage>","line-break":"auto|loose|normal|strict|anywhere","line-clamp":"none|<integer>","line-height":"normal|<number>|<length>|<percentage>","line-height-step":"<length>","list-style":"<'list-style-type'>||<'list-style-position'>||<'list-style-image'>","list-style-image":"<url>|none","list-style-position":"inside|outside","list-style-type":"<counter-style>|<string>|none",margin:"[<length>|<percentage>|auto]{1,4}","margin-block":"<'margin-left'>{1,2}","margin-block-end":"<'margin-left'>","margin-block-start":"<'margin-left'>","margin-bottom":"<length>|<percentage>|auto","margin-inline":"<'margin-left'>{1,2}","margin-inline-end":"<'margin-left'>","margin-inline-start":"<'margin-left'>","margin-left":"<length>|<percentage>|auto","margin-right":"<length>|<percentage>|auto","margin-top":"<length>|<percentage>|auto","margin-trim":"none|in-flow|all",mask:"<mask-layer>#","mask-border":"<'mask-border-source'>||<'mask-border-slice'> [/ <'mask-border-width'>? [/ <'mask-border-outset'>]?]?||<'mask-border-repeat'>||<'mask-border-mode'>","mask-border-mode":"luminance|alpha","mask-border-outset":"[<length>|<number>]{1,4}","mask-border-repeat":"[stretch|repeat|round|space]{1,2}","mask-border-slice":"<number-percentage>{1,4} fill?","mask-border-source":"none|<image>","mask-border-width":"[<length-percentage>|<number>|auto]{1,4}","mask-clip":"[<geometry-box>|no-clip]#","mask-composite":"<compositing-operator>#","mask-image":"<mask-reference>#","mask-mode":"<masking-mode>#","mask-origin":"<geometry-box>#","mask-position":"<position>#","mask-repeat":"<repeat-style>#","mask-size":"<bg-size>#","mask-type":"luminance|alpha","masonry-auto-flow":"[pack|next]||[definite-first|ordered]","math-style":"normal|compact","max-block-size":"<'max-width'>","max-height":"none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )","max-inline-size":"<'max-width'>","max-lines":"none|<integer>","max-width":"none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>","min-block-size":"<'min-width'>","min-height":"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )","min-inline-size":"<'min-width'>","min-width":"auto|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>","mix-blend-mode":"<blend-mode>","object-fit":"fill|contain|cover|none|scale-down","object-position":"<position>",offset:"[<'offset-position'>? [<'offset-path'> [<'offset-distance'>||<'offset-rotate'>]?]?]! [/ <'offset-anchor'>]?","offset-anchor":"auto|<position>","offset-distance":"<length-percentage>","offset-path":"none|ray( [<angle>&&<size>&&contain?] )|<path()>|<url>|[<basic-shape>||<geometry-box>]","offset-position":"auto|<position>","offset-rotate":"[auto|reverse]||<angle>",opacity:"<alpha-value>",order:"<integer>",orphans:"<integer>",outline:"[<'outline-color'>||<'outline-style'>||<'outline-width'>]","outline-color":"<color>|invert","outline-offset":"<length>","outline-style":"auto|<'border-style'>","outline-width":"<line-width>",overflow:"[visible|hidden|clip|scroll|auto]{1,2}|<-non-standard-overflow>","overflow-anchor":"auto|none","overflow-block":"visible|hidden|clip|scroll|auto","overflow-clip-box":"padding-box|content-box","overflow-inline":"visible|hidden|clip|scroll|auto","overflow-wrap":"normal|break-word|anywhere","overflow-x":"visible|hidden|clip|scroll|auto","overflow-y":"visible|hidden|clip|scroll|auto","overscroll-behavior":"[contain|none|auto]{1,2}","overscroll-behavior-block":"contain|none|auto","overscroll-behavior-inline":"contain|none|auto","overscroll-behavior-x":"contain|none|auto","overscroll-behavior-y":"contain|none|auto",padding:"[<length>|<percentage>]{1,4}","padding-block":"<'padding-left'>{1,2}","padding-block-end":"<'padding-left'>","padding-block-start":"<'padding-left'>","padding-bottom":"<length>|<percentage>","padding-inline":"<'padding-left'>{1,2}","padding-inline-end":"<'padding-left'>","padding-inline-start":"<'padding-left'>","padding-left":"<length>|<percentage>","padding-right":"<length>|<percentage>","padding-top":"<length>|<percentage>","page-break-after":"auto|always|avoid|left|right|recto|verso","page-break-before":"auto|always|avoid|left|right|recto|verso","page-break-inside":"auto|avoid","paint-order":"normal|[fill||stroke||markers]",perspective:"none|<length>","perspective-origin":"<position>","place-content":"<'align-content'> <'justify-content'>?","place-items":"<'align-items'> <'justify-items'>?","place-self":"<'align-self'> <'justify-self'>?","pointer-events":"auto|none|visiblePainted|visibleFill|visibleStroke|visible|painted|fill|stroke|all|inherit",position:"static|relative|absolute|sticky|fixed|-webkit-sticky",quotes:"none|auto|[<string> <string>]+",resize:"none|both|horizontal|vertical|block|inline",right:"<length>|<percentage>|auto",rotate:"none|<angle>|[x|y|z|<number>{3}]&&<angle>","row-gap":"normal|<length-percentage>","ruby-align":"start|center|space-between|space-around","ruby-merge":"separate|collapse|auto","ruby-position":"over|under|inter-character",scale:"none|<number>{1,3}","scrollbar-color":"auto|dark|light|<color>{2}","scrollbar-gutter":"auto|[stable|always]&&both?&&force?","scrollbar-width":"auto|thin|none","scroll-behavior":"auto|smooth","scroll-margin":"<length>{1,4}","scroll-margin-block":"<length>{1,2}","scroll-margin-block-start":"<length>","scroll-margin-block-end":"<length>","scroll-margin-bottom":"<length>","scroll-margin-inline":"<length>{1,2}","scroll-margin-inline-start":"<length>","scroll-margin-inline-end":"<length>","scroll-margin-left":"<length>","scroll-margin-right":"<length>","scroll-margin-top":"<length>","scroll-padding":"[auto|<length-percentage>]{1,4}","scroll-padding-block":"[auto|<length-percentage>]{1,2}","scroll-padding-block-start":"auto|<length-percentage>","scroll-padding-block-end":"auto|<length-percentage>","scroll-padding-bottom":"auto|<length-percentage>","scroll-padding-inline":"[auto|<length-percentage>]{1,2}","scroll-padding-inline-start":"auto|<length-percentage>","scroll-padding-inline-end":"auto|<length-percentage>","scroll-padding-left":"auto|<length-percentage>","scroll-padding-right":"auto|<length-percentage>","scroll-padding-top":"auto|<length-percentage>","scroll-snap-align":"[none|start|end|center]{1,2}","scroll-snap-coordinate":"none|<position>#","scroll-snap-destination":"<position>","scroll-snap-points-x":"none|repeat( <length-percentage> )","scroll-snap-points-y":"none|repeat( <length-percentage> )","scroll-snap-stop":"normal|always","scroll-snap-type":"none|[x|y|block|inline|both] [mandatory|proximity]?","scroll-snap-type-x":"none|mandatory|proximity","scroll-snap-type-y":"none|mandatory|proximity","shape-image-threshold":"<alpha-value>","shape-margin":"<length-percentage>","shape-outside":"none|<shape-box>||<basic-shape>|<image>","tab-size":"<integer>|<length>","table-layout":"auto|fixed","text-align":"start|end|left|right|center|justify|match-parent","text-align-last":"auto|start|end|left|right|center|justify","text-combine-upright":"none|all|[digits <integer>?]","text-decoration":"<'text-decoration-line'>||<'text-decoration-style'>||<'text-decoration-color'>||<'text-decoration-thickness'>","text-decoration-color":"<color>","text-decoration-line":"none|[underline||overline||line-through||blink]|spelling-error|grammar-error","text-decoration-skip":"none|[objects||[spaces|[leading-spaces||trailing-spaces]]||edges||box-decoration]","text-decoration-skip-ink":"auto|all|none","text-decoration-style":"solid|double|dotted|dashed|wavy","text-decoration-thickness":"auto|from-font|<length>|<percentage>","text-emphasis":"<'text-emphasis-style'>||<'text-emphasis-color'>","text-emphasis-color":"<color>","text-emphasis-position":"[over|under]&&[right|left]","text-emphasis-style":"none|[[filled|open]||[dot|circle|double-circle|triangle|sesame]]|<string>","text-indent":"<length-percentage>&&hanging?&&each-line?","text-justify":"auto|inter-character|inter-word|none","text-orientation":"mixed|upright|sideways","text-overflow":"[clip|ellipsis|<string>]{1,2}","text-rendering":"auto|optimizeSpeed|optimizeLegibility|geometricPrecision","text-shadow":"none|<shadow-t>#","text-size-adjust":"none|auto|<percentage>","text-transform":"none|capitalize|uppercase|lowercase|full-width|full-size-kana","text-underline-offset":"auto|<length>|<percentage>","text-underline-position":"auto|from-font|[under||[left|right]]",top:"<length>|<percentage>|auto","touch-action":"auto|none|[[pan-x|pan-left|pan-right]||[pan-y|pan-up|pan-down]||pinch-zoom]|manipulation",transform:"none|<transform-list>","transform-box":"content-box|border-box|fill-box|stroke-box|view-box","transform-origin":"[<length-percentage>|left|center|right|top|bottom]|[[<length-percentage>|left|center|right]&&[<length-percentage>|top|center|bottom]] <length>?","transform-style":"flat|preserve-3d",transition:"<single-transition>#","transition-delay":"<time>#","transition-duration":"<time>#","transition-property":"none|<single-transition-property>#","transition-timing-function":"<timing-function>#",translate:"none|<length-percentage> [<length-percentage> <length>?]?","unicode-bidi":"normal|embed|isolate|bidi-override|isolate-override|plaintext|-moz-isolate|-moz-isolate-override|-moz-plaintext|-webkit-isolate|-webkit-isolate-override|-webkit-plaintext","user-select":"auto|text|none|contain|all","vertical-align":"baseline|sub|super|text-top|text-bottom|middle|top|bottom|<percentage>|<length>",visibility:"visible|hidden|collapse","white-space":"normal|pre|nowrap|pre-wrap|pre-line|break-spaces",widows:"<integer>",width:"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )","will-change":"auto|<animateable-feature>#","word-break":"normal|break-all|keep-all|break-word","word-spacing":"normal|<length-percentage>","word-wrap":"normal|break-word","writing-mode":"horizontal-tb|vertical-rl|vertical-lr|sideways-rl|sideways-lr|<svg-writing-mode>","z-index":"auto|<integer>",zoom:"normal|reset|<number>|<percentage>","-moz-background-clip":"padding|border","-moz-border-radius-bottomleft":"<'border-bottom-left-radius'>","-moz-border-radius-bottomright":"<'border-bottom-right-radius'>","-moz-border-radius-topleft":"<'border-top-left-radius'>","-moz-border-radius-topright":"<'border-bottom-right-radius'>","-moz-control-character-visibility":"visible|hidden","-moz-osx-font-smoothing":"auto|grayscale","-moz-user-select":"none|text|all|-moz-none","-ms-flex-align":"start|end|center|baseline|stretch","-ms-flex-item-align":"auto|start|end|center|baseline|stretch","-ms-flex-line-pack":"start|end|center|justify|distribute|stretch","-ms-flex-negative":"<'flex-shrink'>","-ms-flex-pack":"start|end|center|justify|distribute","-ms-flex-order":"<integer>","-ms-flex-positive":"<'flex-grow'>","-ms-flex-preferred-size":"<'flex-basis'>","-ms-interpolation-mode":"nearest-neighbor|bicubic","-ms-grid-column-align":"start|end|center|stretch","-ms-grid-row-align":"start|end|center|stretch","-ms-hyphenate-limit-last":"none|always|column|page|spread","-webkit-background-clip":"[<box>|border|padding|content|text]#","-webkit-column-break-after":"always|auto|avoid","-webkit-column-break-before":"always|auto|avoid","-webkit-column-break-inside":"always|auto|avoid","-webkit-font-smoothing":"auto|none|antialiased|subpixel-antialiased","-webkit-mask-box-image":"[<url>|<gradient>|none] [<length-percentage>{4} <-webkit-mask-box-repeat>{2}]?","-webkit-print-color-adjust":"economy|exact","-webkit-text-security":"none|circle|disc|square","-webkit-user-drag":"none|element|auto","-webkit-user-select":"auto|none|text|all","alignment-baseline":"auto|baseline|before-edge|text-before-edge|middle|central|after-edge|text-after-edge|ideographic|alphabetic|hanging|mathematical","baseline-shift":"baseline|sub|super|<svg-length>",behavior:"<url>+","clip-rule":"nonzero|evenodd",cue:"<'cue-before'> <'cue-after'>?","cue-after":"<url> <decibel>?|none","cue-before":"<url> <decibel>?|none","dominant-baseline":"auto|use-script|no-change|reset-size|ideographic|alphabetic|hanging|mathematical|central|middle|text-after-edge|text-before-edge",fill:"<paint>","fill-opacity":"<number-zero-one>","fill-rule":"nonzero|evenodd","glyph-orientation-horizontal":"<angle>","glyph-orientation-vertical":"<angle>",kerning:"auto|<svg-length>",marker:"none|<url>","marker-end":"none|<url>","marker-mid":"none|<url>","marker-start":"none|<url>",pause:"<'pause-before'> <'pause-after'>?","pause-after":"<time>|none|x-weak|weak|medium|strong|x-strong","pause-before":"<time>|none|x-weak|weak|medium|strong|x-strong",rest:"<'rest-before'> <'rest-after'>?","rest-after":"<time>|none|x-weak|weak|medium|strong|x-strong","rest-before":"<time>|none|x-weak|weak|medium|strong|x-strong","shape-rendering":"auto|optimizeSpeed|crispEdges|geometricPrecision",src:"[<url> [format( <string># )]?|local( <family-name> )]#",speak:"auto|none|normal","speak-as":"normal|spell-out||digits||[literal-punctuation|no-punctuation]",stroke:"<paint>","stroke-dasharray":"none|[<svg-length>+]#","stroke-dashoffset":"<svg-length>","stroke-linecap":"butt|round|square","stroke-linejoin":"miter|round|bevel","stroke-miterlimit":"<number-one-or-greater>","stroke-opacity":"<number-zero-one>","stroke-width":"<svg-length>","text-anchor":"start|middle|end","unicode-range":"<urange>#","voice-balance":"<number>|left|center|right|leftwards|rightwards","voice-duration":"auto|<time>","voice-family":"[[<family-name>|<generic-voice>] ,]* [<family-name>|<generic-voice>]|preserve","voice-pitch":"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]","voice-range":"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]","voice-rate":"[normal|x-slow|slow|medium|fast|x-fast]||<percentage>","voice-stress":"normal|strong|moderate|none|reduced","voice-volume":"silent|[[x-soft|soft|medium|loud|x-loud]||<decibel>]"},atrules:{charset:{prelude:"<string>",descriptors:null},"counter-style":{prelude:"<counter-style-name>",descriptors:{"additive-symbols":"[<integer>&&<symbol>]#",fallback:"<counter-style-name>",negative:"<symbol> <symbol>?",pad:"<integer>&&<symbol>",prefix:"<symbol>",range:"[[<integer>|infinite]{2}]#|auto","speak-as":"auto|bullets|numbers|words|spell-out|<counter-style-name>",suffix:"<symbol>",symbols:"<symbol>+",system:"cyclic|numeric|alphabetic|symbolic|additive|[fixed <integer>?]|[extends <counter-style-name>]"}},document:{prelude:"[<url>|url-prefix( <string> )|domain( <string> )|media-document( <string> )|regexp( <string> )]#",descriptors:null},"font-face":{prelude:null,descriptors:{"font-display":"[auto|block|swap|fallback|optional]","font-family":"<family-name>","font-feature-settings":"normal|<feature-tag-value>#","font-variation-settings":"normal|[<string> <number>]#","font-stretch":"<font-stretch-absolute>{1,2}","font-style":"normal|italic|oblique <angle>{0,2}","font-weight":"<font-weight-absolute>{1,2}","font-variant":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]",src:"[<url> [format( <string># )]?|local( <family-name> )]#","unicode-range":"<urange>#"}},"font-feature-values":{prelude:"<family-name>#",descriptors:null},import:{prelude:"[<string>|<url>] [<media-query-list>]?",descriptors:null},keyframes:{prelude:"<keyframes-name>",descriptors:null},media:{prelude:"<media-query-list>",descriptors:null},namespace:{prelude:"<namespace-prefix>? [<string>|<url>]",descriptors:null},page:{prelude:"<page-selector-list>",descriptors:{bleed:"auto|<length>",marks:"none|[crop||cross]",size:"<length>{1,2}|auto|[<page-size>||[portrait|landscape]]"}},property:{prelude:"<custom-property-name>",descriptors:{syntax:"<string>",inherits:"true|false","initial-value":"<string>"}},supports:{prelude:"<supports-condition>",descriptors:null},viewport:{prelude:null,descriptors:{height:"<viewport-length>{1,2}","max-height":"<viewport-length>","max-width":"<viewport-length>","max-zoom":"auto|<number>|<percentage>","min-height":"<viewport-length>","min-width":"<viewport-length>","min-zoom":"auto|<number>|<percentage>",orientation:"auto|portrait|landscape","user-zoom":"zoom|fixed","viewport-fit":"auto|contain|cover",width:"<viewport-length>{1,2}",zoom:"auto|<number>|<percentage>"}}}},xr=we.cmpChar,Sr=we.isDigit,Cr=we.TYPE,Ar=Cr.WhiteSpace,zr=Cr.Comment,Pr=Cr.Ident,Lr=Cr.Number,Tr=Cr.Dimension;function Er(e,t){var n=this.scanner.tokenStart+e,r=this.scanner.source.charCodeAt(n);for(43!==r&&45!==r||(t&&this.error("Number sign is not allowed"),n++);n<this.scanner.tokenEnd;n++)Sr(this.scanner.source.charCodeAt(n))||this.error("Integer is expected",n)}function Or(e){return Er.call(this,0,e)}function Dr(e,t){if(!xr(this.scanner.source,this.scanner.tokenStart+e,t)){var n="";switch(t){case 110:n="N is expected";break;case 45:n="HyphenMinus is expected"}this.error(n,this.scanner.tokenStart+e)}}function Ir(){for(var e=0,t=0,n=this.scanner.tokenType;n===Ar||n===zr;)n=this.scanner.lookupType(++e);if(n!==Lr){if(!this.scanner.isDelim(43,e)&&!this.scanner.isDelim(45,e))return null;t=this.scanner.isDelim(43,e)?43:45;do{n=this.scanner.lookupType(++e)}while(n===Ar||n===zr);n!==Lr&&(this.scanner.skip(e),Or.call(this,!0))}return e>0&&this.scanner.skip(e),0===t&&43!==(n=this.scanner.source.charCodeAt(this.scanner.tokenStart))&&45!==n&&this.error("Number sign is expected"),Or.call(this,0!==t),45===t?"-"+this.consume(Lr):this.consume(Lr)}var Rr={name:"AnPlusB",structure:{a:[String,null],b:[String,null]},parse:function(){var e=this.scanner.tokenStart,t=null,n=null;if(this.scanner.tokenType===Lr)Or.call(this,!1),n=this.consume(Lr);else if(this.scanner.tokenType===Pr&&xr(this.scanner.source,this.scanner.tokenStart,45))switch(t="-1",Dr.call(this,1,110),this.scanner.getTokenLength()){case 2:this.scanner.next(),n=Ir.call(this);break;case 3:Dr.call(this,2,45),this.scanner.next(),this.scanner.skipSC(),Or.call(this,!0),n="-"+this.consume(Lr);break;default:Dr.call(this,2,45),Er.call(this,3,!0),this.scanner.next(),n=this.scanner.substrToCursor(e+2)}else if(this.scanner.tokenType===Pr||this.scanner.isDelim(43)&&this.scanner.lookupType(1)===Pr){var r=0;switch(t="1",this.scanner.isDelim(43)&&(r=1,this.scanner.next()),Dr.call(this,0,110),this.scanner.getTokenLength()){case 1:this.scanner.next(),n=Ir.call(this);break;case 2:Dr.call(this,1,45),this.scanner.next(),this.scanner.skipSC(),Or.call(this,!0),n="-"+this.consume(Lr);break;default:Dr.call(this,1,45),Er.call(this,2,!0),this.scanner.next(),n=this.scanner.substrToCursor(e+r+1)}}else if(this.scanner.tokenType===Tr){for(var a=this.scanner.source.charCodeAt(this.scanner.tokenStart),i=(r=43===a||45===a,this.scanner.tokenStart+r);i<this.scanner.tokenEnd&&Sr(this.scanner.source.charCodeAt(i));i++);i===this.scanner.tokenStart+r&&this.error("Integer is expected",this.scanner.tokenStart+r),Dr.call(this,i-this.scanner.tokenStart,110),t=this.scanner.source.substring(e,i),i+1===this.scanner.tokenEnd?(this.scanner.next(),n=Ir.call(this)):(Dr.call(this,i-this.scanner.tokenStart+1,45),i+2===this.scanner.tokenEnd?(this.scanner.next(),this.scanner.skipSC(),Or.call(this,!0),n="-"+this.consume(Lr)):(Er.call(this,i-this.scanner.tokenStart+2,!0),this.scanner.next(),n=this.scanner.substrToCursor(i+1)))}else this.error();return null!==t&&43===t.charCodeAt(0)&&(t=t.substr(1)),null!==n&&43===n.charCodeAt(0)&&(n=n.substr(1)),{type:"AnPlusB",loc:this.getLocation(e,this.scanner.tokenStart),a:t,b:n}},generate:function(e){var t=null!==e.a&&void 0!==e.a,n=null!==e.b&&void 0!==e.b;t?(this.chunk("+1"===e.a?"+n":"1"===e.a?"n":"-1"===e.a?"-n":e.a+"n"),n&&("-"===(n=String(e.b)).charAt(0)||"+"===n.charAt(0)?(this.chunk(n.charAt(0)),this.chunk(n.substr(1))):(this.chunk("+"),this.chunk(n)))):this.chunk(String(e.b))}},Nr=we.TYPE,Br=Nr.WhiteSpace,Mr=Nr.Semicolon,jr=Nr.LeftCurlyBracket,_r=Nr.Delim;function qr(){return this.scanner.tokenIndex>0&&this.scanner.lookupType(-1)===Br?this.scanner.tokenIndex>1?this.scanner.getTokenStart(this.scanner.tokenIndex-1):this.scanner.firstCharOffset:this.scanner.tokenStart}function Wr(){return 0}var Fr={name:"Raw",structure:{value:String},parse:function(e,t,n){var r,a=this.scanner.getTokenStart(e);return this.scanner.skip(this.scanner.getRawLength(e,t||Wr)),r=n&&this.scanner.tokenStart>a?qr.call(this):this.scanner.tokenStart,{type:"Raw",loc:this.getLocation(a,r),value:this.scanner.source.substring(a,r)}},generate:function(e){this.chunk(e.value)},mode:{default:Wr,leftCurlyBracket:function(e){return e===jr?1:0},leftCurlyBracketOrSemicolon:function(e){return e===jr||e===Mr?1:0},exclamationMarkOrSemicolon:function(e,t,n){return e===_r&&33===t.charCodeAt(n)||e===Mr?1:0},semicolonIncluded:function(e){return e===Mr?2:0}}},Ur=we.TYPE,Yr=Fr.mode,Hr=Ur.AtKeyword,Vr=Ur.Semicolon,Kr=Ur.LeftCurlyBracket,Gr=Ur.RightCurlyBracket;function $r(e){return this.Raw(e,Yr.leftCurlyBracketOrSemicolon,!0)}function Qr(){for(var e,t=1;e=this.scanner.lookupType(t);t++){if(e===Gr)return!0;if(e===Kr||e===Hr)return!1}return!1}var Xr={name:"Atrule",structure:{name:String,prelude:["AtrulePrelude","Raw",null],block:["Block",null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null,a=null;switch(this.eat(Hr),t=(e=this.scanner.substrToCursor(n+1)).toLowerCase(),this.scanner.skipSC(),!1===this.scanner.eof&&this.scanner.tokenType!==Kr&&this.scanner.tokenType!==Vr&&(this.parseAtrulePrelude?"AtrulePrelude"===(r=this.parseWithFallback(this.AtrulePrelude.bind(this,e),$r)).type&&null===r.children.head&&(r=null):r=$r.call(this,this.scanner.tokenIndex),this.scanner.skipSC()),this.scanner.tokenType){case Vr:this.scanner.next();break;case Kr:a=this.atrule.hasOwnProperty(t)&&"function"==typeof this.atrule[t].block?this.atrule[t].block.call(this):this.Block(Qr.call(this))}return{type:"Atrule",loc:this.getLocation(n,this.scanner.tokenStart),name:e,prelude:r,block:a}},generate:function(e){this.chunk("@"),this.chunk(e.name),null!==e.prelude&&(this.chunk(" "),this.node(e.prelude)),e.block?this.node(e.block):this.chunk(";")},walkContext:"atrule"},Zr=we.TYPE,Jr=Zr.Semicolon,ea=Zr.LeftCurlyBracket,ta={name:"AtrulePrelude",structure:{children:[[]]},parse:function(e){var t=null;return null!==e&&(e=e.toLowerCase()),this.scanner.skipSC(),t=this.atrule.hasOwnProperty(e)&&"function"==typeof this.atrule[e].prelude?this.atrule[e].prelude.call(this):this.readSequence(this.scope.AtrulePrelude),this.scanner.skipSC(),!0!==this.scanner.eof&&this.scanner.tokenType!==ea&&this.scanner.tokenType!==Jr&&this.error("Semicolon or block is expected"),null===t&&(t=this.createList()),{type:"AtrulePrelude",loc:this.getLocationFromList(t),children:t}},generate:function(e){this.children(e)},walkContext:"atrulePrelude"},na=we.TYPE,ra=na.Ident,aa=na.String,ia=na.Colon,oa=na.LeftSquareBracket,sa=na.RightSquareBracket;function la(){this.scanner.eof&&this.error("Unexpected end of input");var e=this.scanner.tokenStart,t=!1,n=!0;return this.scanner.isDelim(42)?(t=!0,n=!1,this.scanner.next()):this.scanner.isDelim(124)||this.eat(ra),this.scanner.isDelim(124)?61!==this.scanner.source.charCodeAt(this.scanner.tokenStart+1)?(this.scanner.next(),this.eat(ra)):t&&this.error("Identifier is expected",this.scanner.tokenEnd):t&&this.error("Vertical line is expected"),n&&this.scanner.tokenType===ia&&(this.scanner.next(),this.eat(ra)),{type:"Identifier",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}}function ca(){var e=this.scanner.tokenStart,t=this.scanner.source.charCodeAt(e);return 61!==t&&126!==t&&94!==t&&36!==t&&42!==t&&124!==t&&this.error("Attribute selector (=, ~=, ^=, $=, *=, |=) is expected"),this.scanner.next(),61!==t&&(this.scanner.isDelim(61)||this.error("Equal sign is expected"),this.scanner.next()),this.scanner.substrToCursor(e)}var ua={name:"AttributeSelector",structure:{name:"Identifier",matcher:[String,null],value:["String","Identifier",null],flags:[String,null]},parse:function(){var e,t=this.scanner.tokenStart,n=null,r=null,a=null;return this.eat(oa),this.scanner.skipSC(),e=la.call(this),this.scanner.skipSC(),this.scanner.tokenType!==sa&&(this.scanner.tokenType!==ra&&(n=ca.call(this),this.scanner.skipSC(),r=this.scanner.tokenType===aa?this.String():this.Identifier(),this.scanner.skipSC()),this.scanner.tokenType===ra&&(a=this.scanner.getTokenValue(),this.scanner.next(),this.scanner.skipSC())),this.eat(sa),{type:"AttributeSelector",loc:this.getLocation(t,this.scanner.tokenStart),name:e,matcher:n,value:r,flags:a}},generate:function(e){var t=" ";this.chunk("["),this.node(e.name),null!==e.matcher&&(this.chunk(e.matcher),null!==e.value&&(this.node(e.value),"String"===e.value.type&&(t=""))),null!==e.flags&&(this.chunk(t),this.chunk(e.flags)),this.chunk("]")}},ha=we.TYPE,da=Fr.mode,pa=ha.WhiteSpace,ma=ha.Comment,fa=ha.Semicolon,ga=ha.AtKeyword,ba=ha.LeftCurlyBracket,ya=ha.RightCurlyBracket;function va(e){return this.Raw(e,null,!0)}function ka(){return this.parseWithFallback(this.Rule,va)}function wa(e){return this.Raw(e,da.semicolonIncluded,!0)}function xa(){if(this.scanner.tokenType===fa)return wa.call(this,this.scanner.tokenIndex);var e=this.parseWithFallback(this.Declaration,wa);return this.scanner.tokenType===fa&&this.scanner.next(),e}var Sa={name:"Block",structure:{children:[["Atrule","Rule","Declaration"]]},parse:function(e){var t=e?xa:ka,n=this.scanner.tokenStart,r=this.createList();this.eat(ba);e:for(;!this.scanner.eof;)switch(this.scanner.tokenType){case ya:break e;case pa:case ma:this.scanner.next();break;case ga:r.push(this.parseWithFallback(this.Atrule,va));break;default:r.push(t.call(this))}return this.scanner.eof||this.eat(ya),{type:"Block",loc:this.getLocation(n,this.scanner.tokenStart),children:r}},generate:function(e){this.chunk("{"),this.children(e,(function(e){"Declaration"===e.type&&this.chunk(";")})),this.chunk("}")},walkContext:"block"},Ca=we.TYPE,Aa=Ca.LeftSquareBracket,za=Ca.RightSquareBracket,Pa={name:"Brackets",structure:{children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart;return this.eat(Aa),n=e.call(this,t),this.scanner.eof||this.eat(za),{type:"Brackets",loc:this.getLocation(r,this.scanner.tokenStart),children:n}},generate:function(e){this.chunk("["),this.children(e),this.chunk("]")}},La=we.TYPE.CDC,Ta={name:"CDC",structure:[],parse:function(){var e=this.scanner.tokenStart;return this.eat(La),{type:"CDC",loc:this.getLocation(e,this.scanner.tokenStart)}},generate:function(){this.chunk("--\x3e")}},Ea=we.TYPE.CDO,Oa={name:"CDO",structure:[],parse:function(){var e=this.scanner.tokenStart;return this.eat(Ea),{type:"CDO",loc:this.getLocation(e,this.scanner.tokenStart)}},generate:function(){this.chunk("\x3c!--")}},Da=we.TYPE.Ident,Ia={name:"ClassSelector",structure:{name:String},parse:function(){return this.scanner.isDelim(46)||this.error("Full stop is expected"),this.scanner.next(),{type:"ClassSelector",loc:this.getLocation(this.scanner.tokenStart-1,this.scanner.tokenEnd),name:this.consume(Da)}},generate:function(e){this.chunk("."),this.chunk(e.name)}},Ra=we.TYPE.Ident,Na={name:"Combinator",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 62:case 43:case 126:this.scanner.next();break;case 47:this.scanner.next(),this.scanner.tokenType===Ra&&!1!==this.scanner.lookupValue(0,"deep")||this.error("Identifier `deep` is expected"),this.scanner.next(),this.scanner.isDelim(47)||this.error("Solidus is expected"),this.scanner.next();break;default:this.error("Combinator is expected")}return{type:"Combinator",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.name)}},Ba=we.TYPE.Comment,Ma={name:"Comment",structure:{value:String},parse:function(){var e=this.scanner.tokenStart,t=this.scanner.tokenEnd;return this.eat(Ba),t-e+2>=2&&42===this.scanner.source.charCodeAt(t-2)&&47===this.scanner.source.charCodeAt(t-1)&&(t-=2),{type:"Comment",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e+2,t)}},generate:function(e){this.chunk("/*"),this.chunk(e.value),this.chunk("*/")}},ja=ne.isCustomProperty,_a=we.TYPE,qa=Fr.mode,Wa=_a.Ident,Fa=_a.Hash,Ua=_a.Colon,Ya=_a.Semicolon,Ha=_a.Delim,Va=_a.WhiteSpace;function Ka(e){return this.Raw(e,qa.exclamationMarkOrSemicolon,!0)}function Ga(e){return this.Raw(e,qa.exclamationMarkOrSemicolon,!1)}function $a(){var e=this.scanner.tokenIndex,t=this.Value();return"Raw"!==t.type&&!1===this.scanner.eof&&this.scanner.tokenType!==Ya&&!1===this.scanner.isDelim(33)&&!1===this.scanner.isBalanceEdge(e)&&this.error(),t}var Qa={name:"Declaration",structure:{important:[Boolean,String],property:String,value:["Value","Raw"]},parse:function(){var e,t=this.scanner.tokenStart,n=this.scanner.tokenIndex,r=Xa.call(this),a=ja(r),i=a?this.parseCustomProperty:this.parseValue,o=a?Ga:Ka,s=!1;this.scanner.skipSC(),this.eat(Ua);const l=this.scanner.tokenIndex;if(a||this.scanner.skipSC(),e=i?this.parseWithFallback($a,o):o.call(this,this.scanner.tokenIndex),a&&"Value"===e.type&&e.children.isEmpty())for(let t=l-this.scanner.tokenIndex;t<=0;t++)if(this.scanner.lookupType(t)===Va){e.children.appendData({type:"WhiteSpace",loc:null,value:" "});break}return this.scanner.isDelim(33)&&(s=Za.call(this),this.scanner.skipSC()),!1===this.scanner.eof&&this.scanner.tokenType!==Ya&&!1===this.scanner.isBalanceEdge(n)&&this.error(),{type:"Declaration",loc:this.getLocation(t,this.scanner.tokenStart),important:s,property:r,value:e}},generate:function(e){this.chunk(e.property),this.chunk(":"),this.node(e.value),e.important&&this.chunk(!0===e.important?"!important":"!"+e.important)},walkContext:"declaration"};function Xa(){var e=this.scanner.tokenStart;if(this.scanner.tokenType===Ha)switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 42:case 36:case 43:case 35:case 38:this.scanner.next();break;case 47:this.scanner.next(),this.scanner.isDelim(47)&&this.scanner.next()}return this.scanner.tokenType===Fa?this.eat(Fa):this.eat(Wa),this.scanner.substrToCursor(e)}function Za(){this.eat(Ha),this.scanner.skipSC();var e=this.consume(Wa);return"important"===e||e}var Ja=we.TYPE,ei=Fr.mode,ti=Ja.WhiteSpace,ni=Ja.Comment,ri=Ja.Semicolon;function ai(e){return this.Raw(e,ei.semicolonIncluded,!0)}var ii={name:"DeclarationList",structure:{children:[["Declaration"]]},parse:function(){for(var e=this.createList();!this.scanner.eof;)switch(this.scanner.tokenType){case ti:case ni:case ri:this.scanner.next();break;default:e.push(this.parseWithFallback(this.Declaration,ai))}return{type:"DeclarationList",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e,(function(e){"Declaration"===e.type&&this.chunk(";")}))}},oi=M.consumeNumber,si=we.TYPE.Dimension,li={name:"Dimension",structure:{value:String,unit:String},parse:function(){var e=this.scanner.tokenStart,t=oi(this.scanner.source,e);return this.eat(si),{type:"Dimension",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e,t),unit:this.scanner.source.substring(t,this.scanner.tokenStart)}},generate:function(e){this.chunk(e.value),this.chunk(e.unit)}},ci=we.TYPE.RightParenthesis,ui={name:"Function",structure:{name:String,children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart,a=this.consumeFunctionName(),i=a.toLowerCase();return n=t.hasOwnProperty(i)?t[i].call(this,t):e.call(this,t),this.scanner.eof||this.eat(ci),{type:"Function",loc:this.getLocation(r,this.scanner.tokenStart),name:a,children:n}},generate:function(e){this.chunk(e.name),this.chunk("("),this.children(e),this.chunk(")")},walkContext:"function"},hi=we.TYPE.Hash,di={name:"Hash",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return this.eat(hi),{type:"Hash",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e+1)}},generate:function(e){this.chunk("#"),this.chunk(e.value)}},pi=we.TYPE.Ident,mi={name:"Identifier",structure:{name:String},parse:function(){return{type:"Identifier",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),name:this.consume(pi)}},generate:function(e){this.chunk(e.name)}},fi=we.TYPE.Hash,gi={name:"IdSelector",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;return this.eat(fi),{type:"IdSelector",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e+1)}},generate:function(e){this.chunk("#"),this.chunk(e.name)}},bi=we.TYPE,yi=bi.Ident,vi=bi.Number,ki=bi.Dimension,wi=bi.LeftParenthesis,xi=bi.RightParenthesis,Si=bi.Colon,Ci=bi.Delim,Ai={name:"MediaFeature",structure:{name:String,value:["Identifier","Number","Dimension","Ratio",null]},parse:function(){var e,t=this.scanner.tokenStart,n=null;if(this.eat(wi),this.scanner.skipSC(),e=this.consume(yi),this.scanner.skipSC(),this.scanner.tokenType!==xi){switch(this.eat(Si),this.scanner.skipSC(),this.scanner.tokenType){case vi:n=this.lookupNonWSType(1)===Ci?this.Ratio():this.Number();break;case ki:n=this.Dimension();break;case yi:n=this.Identifier();break;default:this.error("Number, dimension, ratio or identifier is expected")}this.scanner.skipSC()}return this.eat(xi),{type:"MediaFeature",loc:this.getLocation(t,this.scanner.tokenStart),name:e,value:n}},generate:function(e){this.chunk("("),this.chunk(e.name),null!==e.value&&(this.chunk(":"),this.node(e.value)),this.chunk(")")}},zi=we.TYPE,Pi=zi.WhiteSpace,Li=zi.Comment,Ti=zi.Ident,Ei=zi.LeftParenthesis,Oi={name:"MediaQuery",structure:{children:[["Identifier","MediaFeature","WhiteSpace"]]},parse:function(){this.scanner.skipSC();var e=this.createList(),t=null,n=null;e:for(;!this.scanner.eof;){switch(this.scanner.tokenType){case Li:this.scanner.next();continue;case Pi:n=this.WhiteSpace();continue;case Ti:t=this.Identifier();break;case Ei:t=this.MediaFeature();break;default:break e}null!==n&&(e.push(n),n=null),e.push(t)}return null===t&&this.error("Identifier or parenthesis is expected"),{type:"MediaQuery",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e)}},Di=we.TYPE.Comma,Ii={name:"MediaQueryList",structure:{children:[["MediaQuery"]]},parse:function(e){var t=this.createList();for(this.scanner.skipSC();!this.scanner.eof&&(t.push(this.MediaQuery(e)),this.scanner.tokenType===Di);)this.scanner.next();return{type:"MediaQueryList",loc:this.getLocationFromList(t),children:t}},generate:function(e){this.children(e,(function(){this.chunk(",")}))}},Ri=we.TYPE.Number,Ni={name:"Number",structure:{value:String},parse:function(){return{type:"Number",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),value:this.consume(Ri)}},generate:function(e){this.chunk(e.value)}},Bi={name:"Operator",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return this.scanner.next(),{type:"Operator",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.value)}},Mi=we.TYPE,ji=Mi.LeftParenthesis,_i=Mi.RightParenthesis,qi={name:"Parentheses",structure:{children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart;return this.eat(ji),n=e.call(this,t),this.scanner.eof||this.eat(_i),{type:"Parentheses",loc:this.getLocation(r,this.scanner.tokenStart),children:n}},generate:function(e){this.chunk("("),this.children(e),this.chunk(")")}},Wi=M.consumeNumber,Fi=we.TYPE.Percentage,Ui={name:"Percentage",structure:{value:String},parse:function(){var e=this.scanner.tokenStart,t=Wi(this.scanner.source,e);return this.eat(Fi),{type:"Percentage",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e,t)}},generate:function(e){this.chunk(e.value),this.chunk("%")}},Yi=we.TYPE,Hi=Yi.Ident,Vi=Yi.Function,Ki=Yi.Colon,Gi=Yi.RightParenthesis,$i={name:"PseudoClassSelector",structure:{name:String,children:[["Raw"],null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null;return this.eat(Ki),this.scanner.tokenType===Vi?(t=(e=this.consumeFunctionName()).toLowerCase(),this.pseudo.hasOwnProperty(t)?(this.scanner.skipSC(),r=this.pseudo[t].call(this),this.scanner.skipSC()):(r=this.createList()).push(this.Raw(this.scanner.tokenIndex,null,!1)),this.eat(Gi)):e=this.consume(Hi),{type:"PseudoClassSelector",loc:this.getLocation(n,this.scanner.tokenStart),name:e,children:r}},generate:function(e){this.chunk(":"),this.chunk(e.name),null!==e.children&&(this.chunk("("),this.children(e),this.chunk(")"))},walkContext:"function"},Qi=we.TYPE,Xi=Qi.Ident,Zi=Qi.Function,Ji=Qi.Colon,eo=Qi.RightParenthesis,to={name:"PseudoElementSelector",structure:{name:String,children:[["Raw"],null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null;return this.eat(Ji),this.eat(Ji),this.scanner.tokenType===Zi?(t=(e=this.consumeFunctionName()).toLowerCase(),this.pseudo.hasOwnProperty(t)?(this.scanner.skipSC(),r=this.pseudo[t].call(this),this.scanner.skipSC()):(r=this.createList()).push(this.Raw(this.scanner.tokenIndex,null,!1)),this.eat(eo)):e=this.consume(Xi),{type:"PseudoElementSelector",loc:this.getLocation(n,this.scanner.tokenStart),name:e,children:r}},generate:function(e){this.chunk("::"),this.chunk(e.name),null!==e.children&&(this.chunk("("),this.children(e),this.chunk(")"))},walkContext:"function"},no=we.isDigit,ro=we.TYPE,ao=ro.Number,io=ro.Delim;function oo(){this.scanner.skipWS();for(var e=this.consume(ao),t=0;t<e.length;t++){var n=e.charCodeAt(t);no(n)||46===n||this.error("Unsigned number is expected",this.scanner.tokenStart-e.length+t)}return 0===Number(e)&&this.error("Zero number is not allowed",this.scanner.tokenStart-e.length),e}var so={name:"Ratio",structure:{left:String,right:String},parse:function(){var e,t=this.scanner.tokenStart,n=oo.call(this);return this.scanner.skipWS(),this.scanner.isDelim(47)||this.error("Solidus is expected"),this.eat(io),e=oo.call(this),{type:"Ratio",loc:this.getLocation(t,this.scanner.tokenStart),left:n,right:e}},generate:function(e){this.chunk(e.left),this.chunk("/"),this.chunk(e.right)}},lo=we.TYPE,co=Fr.mode,uo=lo.LeftCurlyBracket;function ho(e){return this.Raw(e,co.leftCurlyBracket,!0)}function po(){var e=this.SelectorList();return"Raw"!==e.type&&!1===this.scanner.eof&&this.scanner.tokenType!==uo&&this.error(),e}var mo={name:"Rule",structure:{prelude:["SelectorList","Raw"],block:["Block"]},parse:function(){var e,t,n=this.scanner.tokenIndex,r=this.scanner.tokenStart;return e=this.parseRulePrelude?this.parseWithFallback(po,ho):ho.call(this,n),t=this.Block(!0),{type:"Rule",loc:this.getLocation(r,this.scanner.tokenStart),prelude:e,block:t}},generate:function(e){this.node(e.prelude),this.node(e.block)},walkContext:"rule"},fo=we.TYPE.Comma,go={name:"SelectorList",structure:{children:[["Selector","Raw"]]},parse:function(){for(var e=this.createList();!this.scanner.eof&&(e.push(this.Selector()),this.scanner.tokenType===fo);)this.scanner.next();return{type:"SelectorList",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e,(function(){this.chunk(",")}))},walkContext:"selector"},bo=we.TYPE.String,yo={name:"String",structure:{value:String},parse:function(){return{type:"String",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),value:this.consume(bo)}},generate:function(e){this.chunk(e.value)}},vo=we.TYPE,ko=vo.WhiteSpace,wo=vo.Comment,xo=vo.AtKeyword,So=vo.CDO,Co=vo.CDC;function Ao(e){return this.Raw(e,null,!1)}var zo={name:"StyleSheet",structure:{children:[["Comment","CDO","CDC","Atrule","Rule","Raw"]]},parse:function(){for(var e,t=this.scanner.tokenStart,n=this.createList();!this.scanner.eof;){switch(this.scanner.tokenType){case ko:this.scanner.next();continue;case wo:if(33!==this.scanner.source.charCodeAt(this.scanner.tokenStart+2)){this.scanner.next();continue}e=this.Comment();break;case So:e=this.CDO();break;case Co:e=this.CDC();break;case xo:e=this.parseWithFallback(this.Atrule,Ao);break;default:e=this.parseWithFallback(this.Rule,Ao)}n.push(e)}return{type:"StyleSheet",loc:this.getLocation(t,this.scanner.tokenStart),children:n}},generate:function(e){this.children(e)},walkContext:"stylesheet"},Po=we.TYPE.Ident;function Lo(){this.scanner.tokenType!==Po&&!1===this.scanner.isDelim(42)&&this.error("Identifier or asterisk is expected"),this.scanner.next()}var To={name:"TypeSelector",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;return this.scanner.isDelim(124)?(this.scanner.next(),Lo.call(this)):(Lo.call(this),this.scanner.isDelim(124)&&(this.scanner.next(),Lo.call(this))),{type:"TypeSelector",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.name)}},Eo=we.isHexDigit,Oo=we.cmpChar,Do=we.TYPE,Io=we.NAME,Ro=Do.Ident,No=Do.Number,Bo=Do.Dimension;function Mo(e,t){for(var n=this.scanner.tokenStart+e,r=0;n<this.scanner.tokenEnd;n++){var a=this.scanner.source.charCodeAt(n);if(45===a&&t&&0!==r)return 0===Mo.call(this,e+r+1,!1)&&this.error(),-1;Eo(a)||this.error(t&&0!==r?"HyphenMinus"+(r<6?" or hex digit":"")+" is expected":r<6?"Hex digit is expected":"Unexpected input",n),++r>6&&this.error("Too many hex digits",n)}return this.scanner.next(),r}function jo(e){for(var t=0;this.scanner.isDelim(63);)++t>e&&this.error("Too many question marks"),this.scanner.next()}function _o(e){this.scanner.source.charCodeAt(this.scanner.tokenStart)!==e&&this.error(Io[e]+" is expected")}function qo(){var e=0;return this.scanner.isDelim(43)?(this.scanner.next(),this.scanner.tokenType===Ro?void((e=Mo.call(this,0,!0))>0&&jo.call(this,6-e)):this.scanner.isDelim(63)?(this.scanner.next(),void jo.call(this,5)):void this.error("Hex digit or question mark is expected")):this.scanner.tokenType===No?(_o.call(this,43),e=Mo.call(this,1,!0),this.scanner.isDelim(63)?void jo.call(this,6-e):this.scanner.tokenType===Bo||this.scanner.tokenType===No?(_o.call(this,45),void Mo.call(this,1,!1)):void 0):this.scanner.tokenType===Bo?(_o.call(this,43),void((e=Mo.call(this,1,!0))>0&&jo.call(this,6-e))):void this.error()}var Wo={name:"UnicodeRange",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return Oo(this.scanner.source,e,117)||this.error("U is expected"),Oo(this.scanner.source,e+1,43)||this.error("Plus sign is expected"),this.scanner.next(),qo.call(this),{type:"UnicodeRange",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.value)}},Fo=we.isWhiteSpace,Uo=we.cmpStr,Yo=we.TYPE,Ho=Yo.Function,Vo=Yo.Url,Ko=Yo.RightParenthesis,Go={name:"Url",structure:{value:["String","Raw"]},parse:function(){var e,t=this.scanner.tokenStart;switch(this.scanner.tokenType){case Vo:for(var n=t+4,r=this.scanner.tokenEnd-1;n<r&&Fo(this.scanner.source.charCodeAt(n));)n++;for(;n<r&&Fo(this.scanner.source.charCodeAt(r-1));)r--;e={type:"Raw",loc:this.getLocation(n,r),value:this.scanner.source.substring(n,r)},this.eat(Vo);break;case Ho:Uo(this.scanner.source,this.scanner.tokenStart,this.scanner.tokenEnd,"url(")||this.error("Function name must be `url`"),this.eat(Ho),this.scanner.skipSC(),e=this.String(),this.scanner.skipSC(),this.eat(Ko);break;default:this.error("Url or Function is expected")}return{type:"Url",loc:this.getLocation(t,this.scanner.tokenStart),value:e}},generate:function(e){this.chunk("url"),this.chunk("("),this.node(e.value),this.chunk(")")}},$o=we.TYPE.WhiteSpace,Qo=Object.freeze({type:"WhiteSpace",loc:null,value:" "}),Xo={AnPlusB:Rr,Atrule:Xr,AtrulePrelude:ta,AttributeSelector:ua,Block:Sa,Brackets:Pa,CDC:Ta,CDO:Oa,ClassSelector:Ia,Combinator:Na,Comment:Ma,Declaration:Qa,DeclarationList:ii,Dimension:li,Function:ui,Hash:di,Identifier:mi,IdSelector:gi,MediaFeature:Ai,MediaQuery:Oi,MediaQueryList:Ii,Nth:{name:"Nth",structure:{nth:["AnPlusB","Identifier"],selector:["SelectorList",null]},parse:function(e){this.scanner.skipSC();var t,n=this.scanner.tokenStart,r=n,a=null;return t=this.scanner.lookupValue(0,"odd")||this.scanner.lookupValue(0,"even")?this.Identifier():this.AnPlusB(),this.scanner.skipSC(),e&&this.scanner.lookupValue(0,"of")?(this.scanner.next(),a=this.SelectorList(),this.needPositions&&(r=this.getLastListNode(a.children).loc.end.offset)):this.needPositions&&(r=t.loc.end.offset),{type:"Nth",loc:this.getLocation(n,r),nth:t,selector:a}},generate:function(e){this.node(e.nth),null!==e.selector&&(this.chunk(" of "),this.node(e.selector))}},Number:Ni,Operator:Bi,Parentheses:qi,Percentage:Ui,PseudoClassSelector:$i,PseudoElementSelector:to,Ratio:so,Raw:Fr,Rule:mo,Selector:{name:"Selector",structure:{children:[["TypeSelector","IdSelector","ClassSelector","AttributeSelector","PseudoClassSelector","PseudoElementSelector","Combinator","WhiteSpace"]]},parse:function(){var e=this.readSequence(this.scope.Selector);return null===this.getFirstListNode(e)&&this.error("Selector is expected"),{type:"Selector",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e)}},SelectorList:go,String:yo,StyleSheet:zo,TypeSelector:To,UnicodeRange:Wo,Url:Go,Value:{name:"Value",structure:{children:[[]]},parse:function(){var e=this.scanner.tokenStart,t=this.readSequence(this.scope.Value);return{type:"Value",loc:this.getLocation(e,this.scanner.tokenStart),children:t}},generate:function(e){this.children(e)}},WhiteSpace:{name:"WhiteSpace",structure:{value:String},parse:function(){return this.eat($o),Qo},generate:function(e){this.chunk(e.value)}}},Zo={generic:!0,types:wr.types,atrules:wr.atrules,properties:wr.properties,node:Xo},Jo=we.cmpChar,es=we.cmpStr,ts=we.TYPE,ns=ts.Ident,rs=ts.String,as=ts.Number,is=ts.Function,os=ts.Url,ss=ts.Hash,ls=ts.Dimension,cs=ts.Percentage,us=ts.LeftParenthesis,hs=ts.LeftSquareBracket,ds=ts.Comma,ps=ts.Delim,ms=function(e){switch(this.scanner.tokenType){case ss:return this.Hash();case ds:return e.space=null,e.ignoreWSAfter=!0,this.Operator();case us:return this.Parentheses(this.readSequence,e.recognizer);case hs:return this.Brackets(this.readSequence,e.recognizer);case rs:return this.String();case ls:return this.Dimension();case cs:return this.Percentage();case as:return this.Number();case is:return es(this.scanner.source,this.scanner.tokenStart,this.scanner.tokenEnd,"url(")?this.Url():this.Function(this.readSequence,e.recognizer);case os:return this.Url();case ns:return Jo(this.scanner.source,this.scanner.tokenStart,117)&&Jo(this.scanner.source,this.scanner.tokenStart+1,43)?this.UnicodeRange():this.Identifier();case ps:var t=this.scanner.source.charCodeAt(this.scanner.tokenStart);if(47===t||42===t||43===t||45===t)return this.Operator();35===t&&this.error("Hex or identifier is expected",this.scanner.tokenStart+1)}},fs={getNode:ms},gs=we.TYPE,bs=gs.Delim,ys=gs.Ident,vs=gs.Dimension,ks=gs.Percentage,ws=gs.Number,xs=gs.Hash,Ss=gs.Colon,Cs=gs.LeftSquareBracket,As={getNode:function(e){switch(this.scanner.tokenType){case Cs:return this.AttributeSelector();case xs:return this.IdSelector();case Ss:return this.scanner.lookupType(1)===Ss?this.PseudoElementSelector():this.PseudoClassSelector();case ys:return this.TypeSelector();case ws:case ks:return this.Percentage();case vs:46===this.scanner.source.charCodeAt(this.scanner.tokenStart)&&this.error("Identifier is expected",this.scanner.tokenStart+1);break;case bs:switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 43:case 62:case 126:return e.space=null,e.ignoreWSAfter=!0,this.Combinator();case 47:return this.Combinator();case 46:return this.ClassSelector();case 42:case 124:return this.TypeSelector();case 35:return this.IdSelector()}}}},zs=we.TYPE,Ps=Fr.mode,Ls=zs.Comma,Ts=zs.WhiteSpace,Es={AtrulePrelude:fs,Selector:As,Value:{getNode:ms,expression:function(){return this.createSingleNodeList(this.Raw(this.scanner.tokenIndex,null,!1))},var:function(){var e=this.createList();if(this.scanner.skipSC(),e.push(this.Identifier()),this.scanner.skipSC(),this.scanner.tokenType===Ls){e.push(this.Operator());const t=this.scanner.tokenIndex,n=this.parseCustomProperty?this.Value(null):this.Raw(this.scanner.tokenIndex,Ps.exclamationMarkOrSemicolon,!1);if("Value"===n.type&&n.children.isEmpty())for(let e=t-this.scanner.tokenIndex;e<=0;e++)if(this.scanner.lookupType(e)===Ts){n.children.appendData({type:"WhiteSpace",loc:null,value:" "});break}e.push(n)}return e}}},Os=we.TYPE,Ds=Os.String,Is=Os.Ident,Rs=Os.Url,Ns=Os.Function,Bs=Os.LeftParenthesis,Ms={parse:{prelude:function(){var e=this.createList();switch(this.scanner.skipSC(),this.scanner.tokenType){case Ds:e.push(this.String());break;case Rs:case Ns:e.push(this.Url());break;default:this.error("String or url() is expected")}return this.lookupNonWSType(0)!==Is&&this.lookupNonWSType(0)!==Bs||(e.push(this.WhiteSpace()),e.push(this.MediaQueryList())),e},block:null}},js=we.TYPE,_s=js.WhiteSpace,qs=js.Comment,Ws=js.Ident,Fs=js.Function,Us=js.Colon,Ys=js.LeftParenthesis;function Hs(){return this.createSingleNodeList(this.Raw(this.scanner.tokenIndex,null,!1))}function Vs(){return this.scanner.skipSC(),this.scanner.tokenType===Ws&&this.lookupNonWSType(1)===Us?this.createSingleNodeList(this.Declaration()):Ks.call(this)}function Ks(){var e,t=this.createList(),n=null;this.scanner.skipSC();e:for(;!this.scanner.eof;){switch(this.scanner.tokenType){case _s:n=this.WhiteSpace();continue;case qs:this.scanner.next();continue;case Fs:e=this.Function(Hs,this.scope.AtrulePrelude);break;case Ws:e=this.Identifier();break;case Ys:e=this.Parentheses(Vs,this.scope.AtrulePrelude);break;default:break e}null!==n&&(t.push(n),n=null),t.push(e)}return t}var Gs,$s={parse:function(){return this.createSingleNodeList(this.SelectorList())}},Qs={parse:function(){return this.createSingleNodeList(this.Nth(!0))}},Xs={parse:function(){return this.createSingleNodeList(this.Nth(!1))}},Zs={parseContext:{default:"StyleSheet",stylesheet:"StyleSheet",atrule:"Atrule",atrulePrelude:function(e){return this.AtrulePrelude(e.atrule?String(e.atrule):null)},mediaQueryList:"MediaQueryList",mediaQuery:"MediaQuery",rule:"Rule",selectorList:"SelectorList",selector:"Selector",block:function(){return this.Block(!0)},declarationList:"DeclarationList",declaration:"Declaration",value:"Value"},scope:Es,atrule:{"font-face":{parse:{prelude:null,block:function(){return this.Block(!0)}}},import:Ms,media:{parse:{prelude:function(){return this.createSingleNodeList(this.MediaQueryList())},block:function(){return this.Block(!1)}}},page:{parse:{prelude:function(){return this.createSingleNodeList(this.SelectorList())},block:function(){return this.Block(!0)}}},supports:{parse:{prelude:function(){var e=Ks.call(this);return null===this.getFirstListNode(e)&&this.error("Condition is expected"),e},block:function(){return this.Block(!1)}}}},pseudo:{dir:{parse:function(){return this.createSingleNodeList(this.Identifier())}},has:{parse:function(){return this.createSingleNodeList(this.SelectorList())}},lang:{parse:function(){return this.createSingleNodeList(this.Identifier())}},matches:$s,not:$s,"nth-child":Qs,"nth-last-child":Qs,"nth-last-of-type":Xs,"nth-of-type":Xs,slotted:{parse:function(){return this.createSingleNodeList(this.Selector())}}},node:Xo},Js={node:Xo},el=(Gs=Object.freeze({__proto__:null,version:"1.1.2",default:{version:"1.1.2"}}))&&Gs.default||Gs,tl=function(e){return kr(vr({},e))}(function(){for(var e={},t=0;t<arguments.length;t++){var n=arguments[t];for(var r in n)e[r]=n[r]}return e}(Zo,Zs,Js)),nl=el.version;return tl.version=nl,tl}()})),n=Object.prototype.hasOwnProperty;function r(e,t){var n=Object.create(null);if(!Array.isArray(e))return null;for(var r=0;r<e.length;r++){var a=e[r];t&&(a=a.toLowerCase()),n[a]=!0}return n}function a(e){if(!e)return null;var t=r(e.tags,!0),n=r(e.ids),a=r(e.classes);return null===t&&null===n&&null===a?null:{tags:t,ids:n,classes:a}}var i={buildIndex:function(e){var t=!1;if(e.scopes&&Array.isArray(e.scopes)){t=Object.create(null);for(var r=0;r<e.scopes.length;r++){var i=e.scopes[r];if(!i||!Array.isArray(i))throw new Error("Wrong usage format");for(var o=0;o<i.length;o++){var s=i[o];if(n.call(t,s))throw new Error("Class can't be used for several scopes: "+s);t[s]=r+1}}}return{whitelist:a(e),blacklist:a(e.blacklist),scopes:t}}},o={hasNoChildren:function(e){return!e||!e.children||e.children.isEmpty()},isNodeChildrenList:function(e,t){return null!==e&&e.children===t}},s=t.keyword,{hasNoChildren:l}=o,c=t.property,{isNodeChildrenList:u}=o,h=Object.prototype.hasOwnProperty,d=t.walk,{hasNoChildren:p}=o;var{isNodeChildrenList:m}=o;function f(e){return"Operator"===e.type&&"+"!==e.value&&"-"!==e.value}var g=t.walk,b={Atrule:function(e,t,n){if(e.block&&(null!==this.stylesheet&&(this.stylesheet.firstAtrulesAllowed=!1),l(e.block)))n.remove(t);else switch(e.name){case"charset":if(l(e.prelude))return void n.remove(t);if(t.prev)return void n.remove(t);break;case"import":if(null===this.stylesheet||!this.stylesheet.firstAtrulesAllowed)return void n.remove(t);n.prevUntil(t.prev,(function(e){if("Atrule"!==e.type||"import"!==e.name&&"charset"!==e.name)return this.root.firstAtrulesAllowed=!1,n.remove(t),!0}),this);break;default:var r=s(e.name).basename;"keyframes"!==r&&"media"!==r&&"supports"!==r||(l(e.prelude)||l(e.block))&&n.remove(t)}},Comment:function(e,t,n){n.remove(t)},Declaration:function(e,t,n){e.value.children&&e.value.children.isEmpty()?n.remove(t):c(e.property).custom&&/\S/.test(e.value.value)&&(e.value.value=e.value.value.trim())},Raw:function(e,t,n){(u(this.stylesheet,n)||u(this.block,n))&&n.remove(t)},Rule:function(e,t,n,r){if(p(e.prelude)||p(e.block))n.remove(t);else{var a=r.usage;!a||null===a.whitelist&&null===a.blacklist||(function e(t,n){return t.children.each((function(r,a,i){var o=!1;d(r,(function(r){if(null===this.selector||this.selector===t)switch(r.type){case"SelectorList":null!==this.function&&"not"===this.function.name.toLowerCase()||e(r,n)&&(o=!0);break;case"ClassSelector":null===n.whitelist||null===n.whitelist.classes||h.call(n.whitelist.classes,r.name)||(o=!0),null!==n.blacklist&&null!==n.blacklist.classes&&h.call(n.blacklist.classes,r.name)&&(o=!0);break;case"IdSelector":null===n.whitelist||null===n.whitelist.ids||h.call(n.whitelist.ids,r.name)||(o=!0),null!==n.blacklist&&null!==n.blacklist.ids&&h.call(n.blacklist.ids,r.name)&&(o=!0);break;case"TypeSelector":"*"!==r.name.charAt(r.name.length-1)&&(null===n.whitelist||null===n.whitelist.tags||h.call(n.whitelist.tags,r.name.toLowerCase())||(o=!0),null!==n.blacklist&&null!==n.blacklist.tags&&h.call(n.blacklist.tags,r.name.toLowerCase())&&(o=!0))}})),o&&i.remove(a)})),t.children.isEmpty()}(e.prelude,a),!p(e.prelude))||n.remove(t)}},TypeSelector:function(e,t,n){if("*"===t.data.name){var r=t.next&&t.next.data.type;"IdSelector"!==r&&"ClassSelector"!==r&&"AttributeSelector"!==r&&"PseudoClassSelector"!==r&&"PseudoElementSelector"!==r||n.remove(t)}},WhiteSpace:function(e,t,n){null!==t.next&&null!==t.prev?m(this.stylesheet,n)||m(this.block,n)?n.remove(t):"WhiteSpace"!==t.next.data.type?(f(t.prev.data)||f(t.next.data))&&n.remove(t):n.remove(t):n.remove(t)}},y=t.keyword,v=/\\([0-9A-Fa-f]{1,6})(\r\n|[ \t\n\f\r])?|\\./g,k=/^(-?\d|--)|[\u0000-\u002c\u002e\u002f\u003A-\u0040\u005B-\u005E\u0060\u007B-\u009f]/;var w=t.List;var x=function(e){e.children.each((function(e,t,n){"Identifier"===e.type&&"none"===e.name.toLowerCase()&&(n.head===n.tail?t.data={type:"Number",loc:e.loc,value:"0"}:function(e,t){var n=t.prev,r=t.next;null!==r?"WhiteSpace"!==r.data.type||null!==n&&"WhiteSpace"!==n.data.type||e.remove(r):null!==n&&"WhiteSpace"===n.data.type&&e.remove(n),e.remove(t)}(n,t))}))},S=t.property,C={font:function(e){var t=e.children;t.eachRight((function(e,t){if("Identifier"===e.type)if("bold"===e.name)t.data={type:"Number",loc:e.loc,value:"700"};else if("normal"===e.name){var n=t.prev;n&&"Operator"===n.data.type&&"/"===n.data.value&&this.remove(n),this.remove(t)}else if("medium"===e.name){var r=t.next;r&&"Operator"===r.data.type||this.remove(t)}})),t.each((function(e,t){"WhiteSpace"===e.type&&(t.prev&&t.next&&"WhiteSpace"!==t.next.data.type||this.remove(t))})),t.isEmpty()&&t.insert(t.createItem({type:"Identifier",name:"normal"}))},"font-weight":function(e){var t=e.children.head.data;if("Identifier"===t.type)switch(t.name){case"normal":e.children.head.data={type:"Number",loc:t.loc,value:"400"};break;case"bold":e.children.head.data={type:"Number",loc:t.loc,value:"700"}}},background:function(e){function t(){if(a.length)return a[a.length-1].type}function n(){"WhiteSpace"===t()&&a.pop(),a.length||a.unshift({type:"Number",loc:null,value:"0"},{type:"WhiteSpace",value:" "},{type:"Number",loc:null,value:"0"}),r.push.apply(r,a),a=[]}var r=[],a=[];e.children.each((function(e){if("Operator"===e.type&&","===e.value)return n(),void r.push(e);("Identifier"!==e.type||"transparent"!==e.name&&"none"!==e.name&&"repeat"!==e.name&&"scroll"!==e.name)&&("WhiteSpace"!==e.type||a.length&&"WhiteSpace"!==t())&&a.push(e)})),n(),e.children=(new w).fromArray(r)},border:x,outline:x},A=/^(?:\+|(-))?0*(\d*)(?:\.0*|(\.\d*?)0*)?$/,z=/^([\+\-])?0*(\d*)(?:\.0*|(\.\d*?)0*)?$/,P={Dimension:!0,Hash:!0,Identifier:!0,Number:!0,Raw:!0,UnicodeRange:!0};function L(e,t){var n=t&&null!==t.prev&&P.hasOwnProperty(t.prev.data.type)?z:A;return""!==(e=String(e).replace(n,"$1$2$3"))&&"-"!==e||(e="0"),e}var T=function(e,t){e.value=L(e.value,t)},E=T.pack=L,O={calc:!0,min:!0,max:!0,clamp:!0},D={px:!0,mm:!0,cm:!0,in:!0,pt:!0,pc:!0,em:!0,ex:!0,ch:!0,rem:!0,vh:!0,vw:!0,vmin:!0,vmax:!0,vm:!0},I=t.lexer,R=T.pack,N=new Set(["width","min-width","max-width","height","min-height","max-height","flex","-ms-flex"]),B=new RegExp("^((\\\\[0-9a-f]{1,6}(\\r\\n|[ \\n\\r\\t\\f])?|\\\\[^\\n\\r\\f0-9a-fA-F])|[^\"'\\(\\)\\\\\\s\0\b\v-])*$","i"),M=t.lexer,j=T.pack,_={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgrey:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",grey:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"639",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},q={8e5:"maroon",800080:"purple",808e3:"olive",808080:"gray","00ffff":"cyan",f0ffff:"azure",f5f5dc:"beige",ffe4c4:"bisque","000000":"black","0000ff":"blue",a52a2a:"brown",ff7f50:"coral",ffd700:"gold","008000":"green","4b0082":"indigo",fffff0:"ivory",f0e68c:"khaki","00ff00":"lime",faf0e6:"linen","000080":"navy",ffa500:"orange",da70d6:"orchid",cd853f:"peru",ffc0cb:"pink",dda0dd:"plum",f00:"red",ff0000:"red",fa8072:"salmon",a0522d:"sienna",c0c0c0:"silver",fffafa:"snow",d2b48c:"tan","008080":"teal",ff6347:"tomato",ee82ee:"violet",f5deb3:"wheat",ffffff:"white",ffff00:"yellow"};function W(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function F(e,t,n,r){var a,i,o;if(0===t)a=i=o=n;else{var s=n<.5?n*(1+t):n+t-n*t,l=2*n-s;a=W(l,s,e+1/3),i=W(l,s,e),o=W(l,s,e-1/3)}return[Math.round(255*a),Math.round(255*i),Math.round(255*o),r]}function U(e){return 1===(e=e.toString(16)).length?"0"+e:e}function Y(e,t,n){for(var r=e.head,a=[],i=!1;null!==r;){var o=r.data,s=o.type;switch(s){case"Number":case"Percentage":if(i)return;i=!0,a.push({type:s,value:Number(o.value)});break;case"Operator":if(","===o.value){if(!i)return;i=!1}else if(i||"+"!==o.value)return;break;default:return}r=r.next}if(a.length===t){if(4===a.length){if("Number"!==a[3].type)return;a[3].type="Alpha"}if(n){if(a[0].type!==a[1].type||a[0].type!==a[2].type)return}else{if("Number"!==a[0].type||"Percentage"!==a[1].type||"Percentage"!==a[2].type)return;a[0].type="Angle"}return a.map((function(e){var t=Math.max(0,e.value);switch(e.type){case"Number":t=Math.min(t,255);break;case"Percentage":if(t=Math.min(t,100)/100,!n)return t;t*=255;break;case"Angle":return(t%360+360)%360/360;case"Alpha":return Math.min(t,1)}return Math.round(t)}))}}function H(e,t){var n=e.value.toLowerCase();6===n.length&&n[0]===n[1]&&n[2]===n[3]&&n[4]===n[5]&&(n=n[0]+n[2]+n[4]),q[n]?t.data={type:"Identifier",loc:e.loc,name:q[n]}:e.value=n}var V={compressFunction:function(e,t,n){var r,a=e.name;if("rgba"===a||"hsla"===a){if(!(r=Y(e.children,4,"rgba"===a)))return;if("hsla"===a&&(r=F.apply(null,r),e.name="rgba"),0===r[3]){var i=this.function&&this.function.name;if(0===r[0]&&0===r[1]&&0===r[2]||!/^(?:to|from|color-stop)$|gradient$/i.test(i))return void(t.data={type:"Identifier",loc:e.loc,name:"transparent"})}if(1!==r[3])return void e.children.each((function(e,t,n){"Operator"!==e.type?t.data={type:"Number",loc:e.loc,value:j(r.shift(),null)}:","!==e.value&&n.remove(t)}));a="rgb"}if("hsl"===a){if(!(r=r||Y(e.children,3,!1)))return;r=F.apply(null,r),a="rgb"}if("rgb"===a){if(!(r=r||Y(e.children,3,!0)))return;var o=t.next;o&&"WhiteSpace"!==o.data.type&&n.insert(n.createItem({type:"WhiteSpace",value:" "}),o),t.data={type:"Hash",loc:e.loc,value:U(r[0])+U(r[1])+U(r[2])},H(t.data,t)}},compressIdent:function(e,t){if(null!==this.declaration){var n=e.name.toLowerCase();if(_.hasOwnProperty(n)&&M.matchDeclaration(this.declaration).isType(e,"color")){var r=_[n];r.length+1<=n.length?t.data={type:"Hash",loc:e.loc,value:r}:("grey"===n&&(n="gray"),e.name=n)}}},compressHex:H},K=t.walk,G={Atrule:function(e){"keyframes"===y(e.name).basename&&function(e){e.block.children.each((function(e){e.prelude.children.each((function(e){e.children.each((function(e,t){"Percentage"===e.type&&"100"===e.value?t.data={type:"TypeSelector",loc:e.loc,name:"to"}:"TypeSelector"===e.type&&"from"===e.name&&(t.data={type:"Percentage",loc:e.loc,value:"0"})}))}))}))}(e)},AttributeSelector:function(e){var t=e.value;if(t&&"String"===t.type){var n=t.value.replace(/^(.)(.*)\1$/,"$2");(function(e){if(""!==e&&"-"!==e)return e=e.replace(v,"a"),!k.test(e)})(n)&&(e.value={type:"Identifier",loc:t.loc,name:n})}},Value:function(e){if(this.declaration){var t=S(this.declaration.property);C.hasOwnProperty(t.basename)&&C[t.basename](e)}},Dimension:function(e,t){var n=E(e.value,t);if(e.value=n,"0"===n&&null!==this.declaration&&null===this.atrulePrelude){var r=e.unit.toLowerCase();if(!D.hasOwnProperty(r))return;if("-ms-flex"===this.declaration.property||"flex"===this.declaration.property)return;if(this.function&&O.hasOwnProperty(this.function.name))return;t.data={type:"Number",loc:e.loc,value:n}}},Percentage:function(e,t){e.value=R(e.value,t),"0"===e.value&&this.declaration&&!N.has(this.declaration.property)&&(t.data={type:"Number",loc:e.loc,value:e.value},I.matchDeclaration(this.declaration).isType(t.data,"length")||(t.data=e))},Number:T,String:function(e){var t=e.value;t=t.replace(/\\(\r\n|\r|\n|\f)/g,""),e.value=t},Url:function(e){var t=e.value;if("String"===t.type){var n=t.value[0],r=t.value.substr(1,t.value.length-2);r=r.replace(/\\\\/g,"/"),B.test(r)?e.value={type:"Raw",loc:e.value.loc,value:r}:e.value.value=-1===r.indexOf('"')?'"'+r+'"':n+r+n}},Hash:V.compressHex,Identifier:V.compressIdent,Function:V.compressFunction},$=t.generate;function Q(){this.seed=0,this.map=Object.create(null)}Q.prototype.resolve=function(e){var t=this.map[e];return t||(t=++this.seed,this.map[e]=t),t};var X=t.generate,Z={"first-letter":!0,"first-line":!0,after:!0,before:!0},J={link:!0,visited:!0,hover:!0,active:!0,"first-letter":!0,"first-line":!0,after:!0,before:!0},ee=t.keyword,te=t.walk,ne=t.generate,re=function(e,t){var n,r=(n=new Q,function(e){var t=$(e);return e.id=n.resolve(t),e.length=t.length,e.fingerprint=null,e});return te(e,{visit:"Rule",enter:function(e){e.block.children.each(r),function(e,t){var n=Object.create(null),r=!1;e.prelude.children.each((function(e){var a="*",i=0;e.children.each((function(o){switch(o.type){case"ClassSelector":if(t&&t.scopes){var s=t.scopes[o.name]||0;if(0!==i&&s!==i)throw new Error("Selector can't has classes from different scopes: "+X(e));i=s}break;case"PseudoClassSelector":var l=o.name.toLowerCase();J.hasOwnProperty(l)||(n[":"+l]=!0,r=!0);break;case"PseudoElementSelector":l=o.name.toLowerCase();Z.hasOwnProperty(l)||(n["::"+l]=!0,r=!0);break;case"TypeSelector":a=o.name.toLowerCase();break;case"AttributeSelector":o.flags&&(n["["+o.flags.toLowerCase()+"]"]=!0,r=!0);break;case"WhiteSpace":case"Combinator":a="*"}})),e.compareMarker=function(e){var t=0,n=0,r=0;return e.children.each((function e(a){switch(a.type){case"SelectorList":case"Selector":a.children.each(e);break;case"IdSelector":t++;break;case"ClassSelector":case"AttributeSelector":n++;break;case"PseudoClassSelector":switch(a.name.toLowerCase()){case"not":a.children.each(e);break;case"before":case"after":case"first-line":case"first-letter":r++;break;default:n++}break;case"PseudoElementSelector":r++;break;case"TypeSelector":"*"!==a.name.charAt(a.name.length-1)&&r++}})),[t,n,r]}(e).toString(),e.id=null,e.id=X(e),i&&(e.compareMarker+=":"+i),"*"!==a&&(e.compareMarker+=","+a)})),e.pseudoSignature=r&&Object.keys(n).sort().join(",")}(e,t.usage)}}),te(e,{visit:"Atrule",enter:function(e){e.prelude&&(e.prelude.id=null,e.prelude.id=ne(e.prelude)),"keyframes"===ee(e.name).basename&&(e.block.avoidRulesMerge=!0,e.block.children.each((function(e){e.prelude.children.each((function(e){e.compareMarker=e.id}))})))}}),{declaration:r}},ae=t.List,ie=t.keyword,oe=Object.prototype.hasOwnProperty,se=t.walk;function le(e,t,n,r){var a=t.data,i=ie(a.name).basename,o=a.name.toLowerCase()+"/"+(a.prelude?a.prelude.id:null);oe.call(e,i)||(e[i]=Object.create(null)),r&&delete e[i][o],oe.call(e[i],o)||(e[i][o]=new ae),e[i][o].append(n.remove(t))}function ce(e){return"Atrule"===e.type&&"media"===e.name}function ue(e,t,n){if(ce(e)){var r=t.prev&&t.prev.data;r&&ce(r)&&e.prelude&&r.prelude&&e.prelude.id===r.prelude.id&&(r.block.children.appendList(e.block.children),n.remove(t))}}var he=function(e,t){!function(e,t){var n=Object.create(null),r=null;for(var a in e.children.each((function(e,a,i){if("Atrule"===e.type){var o=ie(e.name).basename;switch(o){case"keyframes":return void le(n,a,i,!0);case"media":if(t.forceMediaMerge)return void le(n,a,i,!1)}null===r&&"charset"!==o&&"import"!==o&&(r=a)}else null===r&&(r=a)})),n)for(var i in n[a])e.children.insertList(n[a][i],"media"===a?null:r)}(e,t),se(e,{visit:"Atrule",reverse:!0,enter:ue})},de=Object.prototype.hasOwnProperty;function pe(e,t){for(var n=e.head;null!==n;){for(var r=t.head;null!==r;){if(n.data.compareMarker===r.data.compareMarker)return!0;r=r.next}n=n.next}return!1}var me={isEqualSelectors:function(e,t){for(var n=e.head,r=t.head;null!==n&&null!==r&&n.data.id===r.data.id;)n=n.next,r=r.next;return null===n&&null===r},isEqualDeclarations:function(e,t){for(var n=e.head,r=t.head;null!==n&&null!==r&&n.data.id===r.data.id;)n=n.next,r=r.next;return null===n&&null===r},compareDeclarations:function(e,t){for(var n={eq:[],ne1:[],ne2:[],ne2overrided:[]},r=Object.create(null),a=Object.create(null),i=t.head;i;i=i.next)a[i.data.id]=!0;for(i=e.head;i;i=i.next){(o=i.data).fingerprint&&(r[o.fingerprint]=o.important),a[o.id]?(a[o.id]=!1,n.eq.push(o)):n.ne1.push(o)}for(i=t.head;i;i=i.next){var o;a[(o=i.data).id]&&((!de.call(r,o.fingerprint)||!r[o.fingerprint]&&o.important)&&n.ne2.push(o),n.ne2overrided.push(o))}return n},addSelectors:function(e,t){return t.each((function(t){for(var n=t.id,r=e.head;r;){var a=r.data.id;if(a===n)return;if(a>n)break;r=r.next}e.insert(e.createItem(t),r)})),e},hasSimilarSelectors:pe,unsafeToSkipNode:function e(t){switch(t.type){case"Rule":return pe(t.prelude.children,this);case"Atrule":if(t.block)return t.block.children.some(e,this);break;case"Declaration":return!1}return!0}},fe=t.walk;function ge(e,t,n){var r=e.prelude.children,a=e.block.children;n.prevUntil(t.prev,(function(i){if("Rule"!==i.type)return me.unsafeToSkipNode.call(r,i);var o=i.prelude.children,s=i.block.children;if(e.pseudoSignature===i.pseudoSignature){if(me.isEqualSelectors(o,r))return s.appendList(a),n.remove(t),!0;if(me.isEqualDeclarations(a,s))return me.addSelectors(o,r),n.remove(t),!0}return me.hasSimilarSelectors(r,o)}))}var be=t.List,ye=t.walk;function ve(e,t,n){for(var r=e.prelude.children;r.head!==r.tail;){var a=new be;a.insert(r.remove(r.head)),n.insert(n.createItem({type:"Rule",loc:e.loc,prelude:{type:"SelectorList",loc:e.prelude.loc,children:a},block:{type:"Block",loc:e.block.loc,children:e.block.children.copy()},pseudoSignature:e.pseudoSignature}),t)}}var ke=t.List,we=t.generate,xe=t.walk,Se=["top","right","bottom","left"],Ce={"margin-top":"top","margin-right":"right","margin-bottom":"bottom","margin-left":"left","padding-top":"top","padding-right":"right","padding-bottom":"bottom","padding-left":"left","border-top-color":"top","border-right-color":"right","border-bottom-color":"bottom","border-left-color":"left","border-top-width":"top","border-right-width":"right","border-bottom-width":"bottom","border-left-width":"left","border-top-style":"top","border-right-style":"right","border-bottom-style":"bottom","border-left-style":"left"},Ae={margin:"margin","margin-top":"margin","margin-right":"margin","margin-bottom":"margin","margin-left":"margin",padding:"padding","padding-top":"padding","padding-right":"padding","padding-bottom":"padding","padding-left":"padding","border-color":"border-color","border-top-color":"border-color","border-right-color":"border-color","border-bottom-color":"border-color","border-left-color":"border-color","border-width":"border-width","border-top-width":"border-width","border-right-width":"border-width","border-bottom-width":"border-width","border-left-width":"border-width","border-style":"border-style","border-top-style":"border-style","border-right-style":"border-style","border-bottom-style":"border-style","border-left-style":"border-style"};function ze(e){this.name=e,this.loc=null,this.iehack=void 0,this.sides={top:null,right:null,bottom:null,left:null}}function Pe(e,t,n,r){var a=e.block.children,i=e.prelude.children.first().id;return e.block.children.eachRight((function(e,o){var s=e.property;if(Ae.hasOwnProperty(s)){var l,c,u=Ae[s];r&&i!==r||u in t&&(c=2,l=t[u]),l&&l.add(s,e)||(c=1,(l=new ze(u)).add(s,e))?(t[u]=l,n.push({operation:c,block:a,item:o,shorthand:l}),r=i):r=null}})),r}ze.prototype.getValueSequence=function(e,t){var n=[],r="";return!("Value"!==e.value.type||e.value.children.some((function(t){var a=!1;switch(t.type){case"Identifier":switch(t.name){case"\\0":case"\\9":return void(r=t.name);case"inherit":case"initial":case"unset":case"revert":a=t.name}break;case"Dimension":switch(t.unit){case"rem":case"vw":case"vh":case"vmin":case"vmax":case"vm":a=t.unit}break;case"Hash":case"Number":case"Percentage":break;case"Function":if("var"===t.name)return!0;a=t.name;break;case"WhiteSpace":return!1;default:return!0}n.push({node:t,special:a,important:e.important})}))||n.length>t)&&(("string"!=typeof this.iehack||this.iehack===r)&&(this.iehack=r,n))},ze.prototype.canOverride=function(e,t){var n=this.sides[e];return!n||t.important&&!n.important},ze.prototype.add=function(e,t){return!!function(){var n=this.sides,r=Ce[e];if(r){if(r in n==!1)return!1;if(!(i=this.getValueSequence(t,1))||!i.length)return!1;for(var a in n)if(null!==n[a]&&n[a].special!==i[0].special)return!1;return!this.canOverride(r,i[0])||(n[r]=i[0],!0)}if(e===this.name){var i;if(!(i=this.getValueSequence(t,4))||!i.length)return!1;switch(i.length){case 1:i[1]=i[0],i[2]=i[0],i[3]=i[0];break;case 2:i[2]=i[0],i[3]=i[1];break;case 3:i[3]=i[1]}for(var o=0;o<4;o++)for(var a in n)if(null!==n[a]&&n[a].special!==i[o].special)return!1;for(o=0;o<4;o++)this.canOverride(Se[o],i[o])&&(n[Se[o]]=i[o]);return!0}}.call(this)&&(this.loc||(this.loc=t.loc),!0)},ze.prototype.isOkToMinimize=function(){var e=this.sides.top,t=this.sides.right,n=this.sides.bottom,r=this.sides.left;if(e&&t&&n&&r){var a=e.important+t.important+n.important+r.important;return 0===a||4===a}return!1},ze.prototype.getValue=function(){var e=new ke,t=this.sides,n=[t.top,t.right,t.bottom,t.left],r=[we(t.top.node),we(t.right.node),we(t.bottom.node),we(t.left.node)];r[3]===r[1]&&(n.pop(),r[2]===r[0]&&(n.pop(),r[1]===r[0]&&n.pop()));for(var a=0;a<n.length;a++)a&&e.appendData({type:"WhiteSpace",value:" "}),e.appendData(n[a].node);return this.iehack&&(e.appendData({type:"WhiteSpace",value:" "}),e.appendData({type:"Identifier",loc:null,name:this.iehack})),{type:"Value",loc:null,children:e}},ze.prototype.getDeclaration=function(){return{type:"Declaration",loc:this.loc,important:this.sides.top.important,property:this.name,value:this.getValue()}};var Le=function(e,t){var n={},r=[];xe(e,{visit:"Rule",reverse:!0,enter:function(e){var t,a,i=this.block||this.stylesheet,o=(e.pseudoSignature||"")+"|"+e.prelude.children.first().id;n.hasOwnProperty(i.id)?t=n[i.id]:(t={lastShortSelector:null},n[i.id]=t),t.hasOwnProperty(o)?a=t[o]:(a={},t[o]=a),t.lastShortSelector=Pe.call(this,e,a,r,t.lastShortSelector)}}),function(e,t){e.forEach((function(e){var n=e.shorthand;n.isOkToMinimize()&&(1===e.operation?e.item.data=t(n.getDeclaration()):e.block.remove(e.item))}))}(r,t.declaration)},Te=t.property,Ee=t.keyword,Oe=t.walk,De=t.generate,Ie=1,Re={src:1},Ne={display:/table|ruby|flex|-(flex)?box$|grid|contents|run-in/i,"text-align":/^(start|end|match-parent|justify-all)$/i},Be={cursor:["auto","crosshair","default","move","text","wait","help","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","pointer","progress","not-allowed","no-drop","vertical-text","all-scroll","col-resize","row-resize"],overflow:["hidden","visible","scroll","auto"],position:["static","relative","absolute","fixed"]},Me={"border-width":["border"],"border-style":["border"],"border-color":["border"],"border-top":["border"],"border-right":["border"],"border-bottom":["border"],"border-left":["border"],"border-top-width":["border-top","border-width","border"],"border-right-width":["border-right","border-width","border"],"border-bottom-width":["border-bottom","border-width","border"],"border-left-width":["border-left","border-width","border"],"border-top-style":["border-top","border-style","border"],"border-right-style":["border-right","border-style","border"],"border-bottom-style":["border-bottom","border-style","border"],"border-left-style":["border-left","border-style","border"],"border-top-color":["border-top","border-color","border"],"border-right-color":["border-right","border-color","border"],"border-bottom-color":["border-bottom","border-color","border"],"border-left-color":["border-left","border-color","border"],"margin-top":["margin"],"margin-right":["margin"],"margin-bottom":["margin"],"margin-left":["margin"],"padding-top":["padding"],"padding-right":["padding"],"padding-bottom":["padding"],"padding-left":["padding"],"font-style":["font"],"font-variant":["font"],"font-weight":["font"],"font-size":["font"],"font-family":["font"],"list-style-type":["list-style"],"list-style-position":["list-style"],"list-style-image":["list-style"]};function je(e,t,n){var r=Te(e).basename;if("background"===r)return e+":"+De(t.value);var a=t.id,i=n[a];if(!i){switch(t.value.type){case"Value":var o="",s="",l={},c=!1;t.value.children.each((function e(t){switch(t.type){case"Value":case"Brackets":case"Parentheses":t.children.each(e);break;case"Raw":c=!0;break;case"Identifier":var n=t.name;o||(o=Ee(n).vendor),/\\[09]/.test(n)&&(s=RegExp.lastMatch),Be.hasOwnProperty(r)?-1===Be[r].indexOf(n)&&(l[n]=!0):Ne.hasOwnProperty(r)&&Ne[r].test(n)&&(l[n]=!0);break;case"Function":n=t.name;if(o||(o=Ee(n).vendor),"rect"===n)t.children.some((function(e){return"Operator"===e.type&&","===e.value}))||(n="rect-backward");l[n+"()"]=!0,t.children.each(e);break;case"Dimension":var a=t.unit;switch(/\\[09]/.test(a)&&(s=RegExp.lastMatch),a){case"rem":case"vw":case"vh":case"vmin":case"vmax":case"vm":l[a]=!0}}})),i=c?"!"+Ie++:"!"+Object.keys(l).sort()+"|"+s+o;break;case"Raw":i="!"+t.value.value;break;default:i=De(t.value)}n[a]=i}return e+i}function _e(e,t,n,r,a){var i=e.block.children;i.eachRight((function(e,t){var n,o=e.property,s=je(o,e,a);(n=r[s])&&!Re.hasOwnProperty(o)?e.important&&!n.item.data.important?(r[s]={block:i,item:t},n.block.remove(n.item)):i.remove(t):(n=function(e,t,n){var r=Te(t.property);if(Me.hasOwnProperty(r.basename))for(var a=Me[r.basename],i=0;i<a.length;i++){var o=je(r.prefix+a[i],t,n),s=e.hasOwnProperty(o)?e[o]:null;if(s&&(!t.important||s.item.data.important))return s}}(r,e,a))?i.remove(t):(e.fingerprint=s,r[s]={block:i,item:t})})),i.isEmpty()&&n.remove(t)}var qe=t.walk;function We(e,t,n){var r=e.prelude.children,a=e.block.children,i=r.first().compareMarker,o={};n.nextUntil(t.next,(function(t,s){if("Rule"!==t.type)return me.unsafeToSkipNode.call(r,t);if(e.pseudoSignature!==t.pseudoSignature)return!0;var l=t.prelude.children.head,c=t.block.children,u=l.data.compareMarker;if(u in o)return!0;if(r.head===r.tail&&r.first().id===l.data.id)return a.appendList(c),void n.remove(s);if(me.isEqualDeclarations(a,c)){var h=l.data.id;return r.some((function(e,t){var n=e.id;return h<n?(r.insert(l,t),!0):t.next?void 0:(r.insert(l),!0)})),void n.remove(s)}if(u===i)return!0;o[u]=!0}))}var Fe=t.List,Ue=t.walk;function Ye(e){var t=0;return e.each((function(e){t+=e.id.length+1})),t-1}function He(e){for(var t=0,n=0;n<e.length;n++)t+=e[n].length;return t+e.length-1}function Ve(e,t,n){var r=null!==this.block&&this.block.avoidRulesMerge,a=e.prelude.children,i=e.block,o=Object.create(null),s=!0,l=!0;n.prevUntil(t.prev,(function(c,u){var h=c.block,d=c.type;if("Rule"!==d){var p=me.unsafeToSkipNode.call(a,c);return!p&&"Atrule"===d&&h&&Ue(h,{visit:"Rule",enter:function(e){e.prelude.children.each((function(e){o[e.compareMarker]=!0}))}}),p}var m=c.prelude.children;if(e.pseudoSignature!==c.pseudoSignature)return!0;if(!(l=!m.some((function(e){return e.compareMarker in o})))&&!s)return!0;if(s&&me.isEqualSelectors(m,a))return h.children.appendList(i.children),n.remove(t),!0;var f=me.compareDeclarations(i.children,h.children);if(f.eq.length){if(!f.ne1.length&&!f.ne2.length)return l&&(me.addSelectors(a,m),n.remove(u)),!0;if(!r)if(f.ne1.length&&!f.ne2.length){var g=Ye(a),b=He(f.eq);s&&g<b&&(me.addSelectors(m,a),i.children=(new Fe).fromArray(f.ne1))}else if(!f.ne1.length&&f.ne2.length){g=Ye(m),b=He(f.eq);l&&g<b&&(me.addSelectors(a,m),h.children=(new Fe).fromArray(f.ne2))}else{var y={type:"SelectorList",loc:null,children:me.addSelectors(m.copy(),a)},v=Ye(y.children)+2;if((b=He(f.eq))>=v){var k=n.createItem({type:"Rule",loc:null,prelude:y,block:{type:"Block",loc:null,children:(new Fe).fromArray(f.eq)},pseudoSignature:e.pseudoSignature});return i.children=(new Fe).fromArray(f.ne1),h.children=(new Fe).fromArray(f.ne2overrided),s?n.insert(k,u):n.insert(k,t),!0}}}s&&(s=!m.some((function(e){return a.some((function(t){return t.compareMarker===e.compareMarker}))}))),m.each((function(e){o[e.compareMarker]=!0}))}))}var Ke=function(e,t){var n=re(e,t);t.logger("prepare",e),he(e,t),t.logger("mergeAtrule",e),function(e){fe(e,{visit:"Rule",enter:ge})}(e),t.logger("initialMergeRuleset",e),function(e){ye(e,{visit:"Rule",reverse:!0,enter:ve})}(e),t.logger("disjoinRuleset",e),Le(e,n),t.logger("restructShorthand",e),function(e){var t={},n=Object.create(null);Oe(e,{visit:"Rule",reverse:!0,enter:function(e,r,a){var i,o,s=this.block||this.stylesheet,l=(e.pseudoSignature||"")+"|"+e.prelude.children.first().id;t.hasOwnProperty(s.id)?i=t[s.id]:(i={},t[s.id]=i),i.hasOwnProperty(l)?o=i[l]:(o={},i[l]=o),_e.call(this,e,r,a,o,n)}})}(e),t.logger("restructBlock",e),function(e){qe(e,{visit:"Rule",enter:We})}(e),t.logger("mergeRuleset",e),function(e){Ue(e,{visit:"Rule",reverse:!0,enter:Ve})}(e),t.logger("restructRuleset",e)},Ge=t.List,$e=t.clone,Qe=t.walk;function Xe(e,t){var n,r=new Ge,a=!1;return e.nextUntil(e.head,(function(e,i,o){if("Comment"===e.type)return t&&"!"===e.value.charAt(0)?!(!a&&!n)||(o.remove(i),void(n=e)):void o.remove(i);"WhiteSpace"!==e.type&&(a=!0),r.insert(o.remove(i))})),{comment:n,stylesheet:{type:"StyleSheet",loc:null,children:r}}}function Ze(e,t,n,r){r.logger("Compress block #"+n,null,!0);var a=1;return"StyleSheet"===e.type&&(e.firstAtrulesAllowed=t,e.id=a++),Qe(e,{visit:"Atrule",enter:function(e){null!==e.block&&(e.block.id=a++)}}),r.logger("init",e),function(e,t){g(e,{leave:function(e,n,r){b.hasOwnProperty(e.type)&&b[e.type].call(this,e,n,r,t)}})}(e,r),r.logger("clean",e),function(e){K(e,{leave:function(e,t,n){G.hasOwnProperty(e.type)&&G[e.type].call(this,e,t,n)}})}(e),r.logger("replace",e),r.restructuring&&Ke(e,r),e}function Je(e){return"restructure"in e?e.restructure:!("restructuring"in e)||e.restructuring}var et,tt=function(e,t){e=e||{type:"StyleSheet",loc:null,children:new Ge};var n,r,a,o,s={logger:"function"==typeof(t=t||{}).logger?t.logger:function(){},restructuring:Je(t),forceMediaMerge:Boolean(t.forceMediaMerge),usage:!!t.usage&&i.buildIndex(t.usage)},l=function(e){var t="comments"in e?e.comments:"exclamation";return"boolean"==typeof t?t=!!t&&"exclamation":"exclamation"!==t&&"first-exclamation"!==t&&(t=!1),t}(t),c=!0,u=new Ge,h=1;t.clone&&(e=$e(e)),"StyleSheet"===e.type?(n=e.children,e.children=u):(o=e,n=(new Ge).appendData({type:"Rule",loc:null,prelude:{type:"SelectorList",loc:null,children:(new Ge).appendData({type:"Selector",loc:null,children:(new Ge).appendData({type:"TypeSelector",loc:null,name:"x"})})},block:o}));do{if(Ze((r=Xe(n,Boolean(l))).stylesheet,c,h++,s),a=r.stylesheet.children,r.comment&&(u.isEmpty()||u.insert(Ge.createItem({type:"Raw",value:"\n"})),u.insert(Ge.createItem(r.comment)),a.isEmpty()||u.insert(Ge.createItem({type:"Raw",value:"\n"}))),c&&!a.isEmpty()){var d=a.last();("Atrule"!==d.type||"import"!==d.name&&"charset"!==d.name)&&(c=!1)}"exclamation"!==l&&(l=!1),u.appendList(a)}while(!n.isEmpty());return{ast:e}},nt={version:"4.2.0"},rt=(et=Object.freeze({__proto__:null,version:"4.2.0",default:nt}))&&et.default||et,at=t.parse,it=t.generate;function ot(e,t,n,r){return t.debug&&console.error("## "+e+" done in %d ms\n",Date.now()-n),r}function st(e){var t,n;return"function"!=typeof(e=function(e){var t={};for(var n in e)t[n]=e[n];return t}(e)).logger&&e.debug&&(e.logger=(t=e.debug,function(e,r){var a=e;if(r&&(a="["+((Date.now()-n)/1e3).toFixed(3)+"s] "+a),t>1&&r){var i=it(r);2===t&&i.length>256&&(i=i.substr(0,256)+"..."),a+="\n  "+i+"\n"}console.error(a),n=Date.now()})),e}function lt(e,t,n){Array.isArray(n)||(n=[n]),n.forEach((function(n){n(e,t)}))}function ct(e,t,n){var r=(n=n||{}).filename||"<unknown>",a=ot("parsing",n,Date.now(),at(t,{context:e,filename:r,positions:Boolean(n.sourceMap)}));n.beforeCompress&&ot("beforeCompress",n,Date.now(),lt(a,n,n.beforeCompress));var i,o=ot("compress",n,Date.now(),tt(a,st(n)));return n.afterCompress&&ot("afterCompress",n,Date.now(),lt(o,n,n.afterCompress)),n.sourceMap?ot("generate(sourceMap: true)",n,Date.now(),((i=it(o.ast,{sourceMap:!0})).map._file=r,i.map.setSourceContent(r,t),i)):ot("generate",n,Date.now(),{css:it(o.ast),map:null})}var ut={version:rt.version,minify:function(e,t){return ct("stylesheet",e,t)},minifyBlock:function(e,t){return ct("declarationList",e,t)},syntax:Object.assign({compress:tt},t)},ht=ut.version,dt=ut.minify,pt=ut.minifyBlock,mt=ut.syntax;e.default=ut,e.minify=dt,e.minifyBlock=pt,e.syntax=mt,e.version=ht,Object.defineProperty(e,"__esModule",{value:!0})}));
\ No newline at end of file
diff --git a/node_modules/csso/lib/clean/Atrule.js b/node_modules/csso/lib/clean/Atrule.js
new file mode 100644
index 0000000..9d2ba92
--- /dev/null
+++ b/node_modules/csso/lib/clean/Atrule.js
@@ -0,0 +1,66 @@
+var resolveKeyword = require('css-tree').keyword;
+var { hasNoChildren } = require('./utils');
+
+module.exports = function cleanAtrule(node, item, list) {
+    if (node.block) {
+        // otherwise removed at-rule don't prevent @import for removal
+        if (this.stylesheet !== null) {
+            this.stylesheet.firstAtrulesAllowed = false;
+        }
+
+        if (hasNoChildren(node.block)) {
+            list.remove(item);
+            return;
+        }
+    }
+
+    switch (node.name) {
+        case 'charset':
+            if (hasNoChildren(node.prelude)) {
+                list.remove(item);
+                return;
+            }
+
+            // if there is any rule before @charset -> remove it
+            if (item.prev) {
+                list.remove(item);
+                return;
+            }
+
+            break;
+
+        case 'import':
+            if (this.stylesheet === null || !this.stylesheet.firstAtrulesAllowed) {
+                list.remove(item);
+                return;
+            }
+
+            // if there are some rules that not an @import or @charset before @import
+            // remove it
+            list.prevUntil(item.prev, function(rule) {
+                if (rule.type === 'Atrule') {
+                    if (rule.name === 'import' || rule.name === 'charset') {
+                        return;
+                    }
+                }
+
+                this.root.firstAtrulesAllowed = false;
+                list.remove(item);
+                return true;
+            }, this);
+
+            break;
+
+        default:
+            var name = resolveKeyword(node.name).basename;
+            if (name === 'keyframes' ||
+                name === 'media' ||
+                name === 'supports') {
+
+                // drop at-rule with no prelude
+                if (hasNoChildren(node.prelude) || hasNoChildren(node.block)) {
+                    list.remove(item);
+                }
+            }
+    }
+};
diff --git a/node_modules/csso/lib/clean/Comment.js b/node_modules/csso/lib/clean/Comment.js
new file mode 100644
index 0000000..aa80108
--- /dev/null
+++ b/node_modules/csso/lib/clean/Comment.js
@@ -0,0 +1,3 @@
+module.exports = function cleanComment(data, item, list) {
+    list.remove(item);
+};
diff --git a/node_modules/csso/lib/clean/Declaration.js b/node_modules/csso/lib/clean/Declaration.js
new file mode 100644
index 0000000..f3cac37
--- /dev/null
+++ b/node_modules/csso/lib/clean/Declaration.js
@@ -0,0 +1,14 @@
+var property = require('css-tree').property;
+
+module.exports = function cleanDeclartion(node, item, list) {
+    if (node.value.children && node.value.children.isEmpty()) {
+        list.remove(item);
+        return;
+    }
+
+    if (property(node.property).custom) {
+        if (/\S/.test(node.value.value)) {
+            node.value.value = node.value.value.trim();
+        }
+    }
+};
diff --git a/node_modules/csso/lib/clean/Raw.js b/node_modules/csso/lib/clean/Raw.js
new file mode 100644
index 0000000..490f23d
--- /dev/null
+++ b/node_modules/csso/lib/clean/Raw.js
@@ -0,0 +1,9 @@
+var { isNodeChildrenList } = require('./utils');
+
+module.exports = function cleanRaw(node, item, list) {
+    // raw in stylesheet or block children
+    if (isNodeChildrenList(this.stylesheet, list) ||
+        isNodeChildrenList(this.block, list)) {
+        list.remove(item);
+    }
+};
diff --git a/node_modules/csso/lib/clean/Rule.js b/node_modules/csso/lib/clean/Rule.js
new file mode 100644
index 0000000..ec14257
--- /dev/null
+++ b/node_modules/csso/lib/clean/Rule.js
@@ -0,0 +1,93 @@
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+var walk = require('css-tree').walk;
+var { hasNoChildren } = require('./utils');
+
+function cleanUnused(selectorList, usageData) {
+    selectorList.children.each(function(selector, item, list) {
+        var shouldRemove = false;
+
+        walk(selector, function(node) {
+            // ignore nodes in nested selectors
+            if (this.selector === null || this.selector === selectorList) {
+                switch (node.type) {
+                    case 'SelectorList':
+                        // TODO: remove toLowerCase when pseudo selectors will be normalized
+                        // ignore selectors inside :not()
+                        if (this.function === null || this.function.name.toLowerCase() !== 'not') {
+                            if (cleanUnused(node, usageData)) {
+                                shouldRemove = true;
+                            }
+                        }
+                        break;
+
+                    case 'ClassSelector':
+                        if (usageData.whitelist !== null &&
+                            usageData.whitelist.classes !== null &&
+                            !hasOwnProperty.call(usageData.whitelist.classes, node.name)) {
+                            shouldRemove = true;
+                        }
+                        if (usageData.blacklist !== null &&
+                            usageData.blacklist.classes !== null &&
+                            hasOwnProperty.call(usageData.blacklist.classes, node.name)) {
+                            shouldRemove = true;
+                        }
+                        break;
+
+                    case 'IdSelector':
+                        if (usageData.whitelist !== null &&
+                            usageData.whitelist.ids !== null &&
+                            !hasOwnProperty.call(usageData.whitelist.ids, node.name)) {
+                            shouldRemove = true;
+                        }
+                        if (usageData.blacklist !== null &&
+                            usageData.blacklist.ids !== null &&
+                            hasOwnProperty.call(usageData.blacklist.ids, node.name)) {
+                            shouldRemove = true;
+                        }
+                        break;
+
+                    case 'TypeSelector':
+                        // TODO: remove toLowerCase when type selectors will be normalized
+                        // ignore universal selectors
+                        if (node.name.charAt(node.name.length - 1) !== '*') {
+                            if (usageData.whitelist !== null &&
+                                usageData.whitelist.tags !== null &&
+                                !hasOwnProperty.call(usageData.whitelist.tags, node.name.toLowerCase())) {
+                                shouldRemove = true;
+                            }
+                            if (usageData.blacklist !== null &&
+                                usageData.blacklist.tags !== null &&
+                                hasOwnProperty.call(usageData.blacklist.tags, node.name.toLowerCase())) {
+                                shouldRemove = true;
+                            }
+                        }
+                        break;
+                }
+            }
+        });
+
+        if (shouldRemove) {
+            list.remove(item);
+        }
+    });
+
+    return selectorList.children.isEmpty();
+}
+
+module.exports = function cleanRule(node, item, list, options) {
+    if (hasNoChildren(node.prelude) || hasNoChildren(node.block)) {
+        list.remove(item);
+        return;
+    }
+
+    var usageData = options.usage;
+
+    if (usageData && (usageData.whitelist !== null || usageData.blacklist !== null)) {
+        cleanUnused(node.prelude, usageData);
+
+        if (hasNoChildren(node.prelude)) {
+            list.remove(item);
+            return;
+        }
+    }
+};
diff --git a/node_modules/csso/lib/clean/TypeSelector.js b/node_modules/csso/lib/clean/TypeSelector.js
new file mode 100644
index 0000000..5d40090
--- /dev/null
+++ b/node_modules/csso/lib/clean/TypeSelector.js
@@ -0,0 +1,19 @@
+// remove useless universal selector
+module.exports = function cleanTypeSelector(node, item, list) {
+    var name = item.data.name;
+
+    // check it's a non-namespaced universal selector
+    if (name !== '*') {
+        return;
+    }
+
+    // remove when universal selector before other selectors
+    var nextType = item.next && item.next.data.type;
+    if (nextType === 'IdSelector' ||
+        nextType === 'ClassSelector' ||
+        nextType === 'AttributeSelector' ||
+        nextType === 'PseudoClassSelector' ||
+        nextType === 'PseudoElementSelector') {
+        list.remove(item);
+    }
+};
diff --git a/node_modules/csso/lib/clean/WhiteSpace.js b/node_modules/csso/lib/clean/WhiteSpace.js
new file mode 100644
index 0000000..f3df6e5
--- /dev/null
+++ b/node_modules/csso/lib/clean/WhiteSpace.js
@@ -0,0 +1,30 @@
+var { isNodeChildrenList } = require('./utils');
+
+function isSafeOperator(node) {
+    return node.type === 'Operator' && node.value !== '+' && node.value !== '-';
+}
+
+module.exports = function cleanWhitespace(node, item, list) {
+    // remove when first or last item in sequence
+    if (item.next === null || item.prev === null) {
+        list.remove(item);
+        return;
+    }
+
+    // white space in stylesheet or block children
+    if (isNodeChildrenList(this.stylesheet, list) ||
+        isNodeChildrenList(this.block, list)) {
+        list.remove(item);
+        return;
+    }
+
+    if (item.next.data.type === 'WhiteSpace') {
+        list.remove(item);
+        return;
+    }
+
+    if (isSafeOperator(item.prev.data) || isSafeOperator(item.next.data)) {
+        list.remove(item);
+        return;
+    }
+};
diff --git a/node_modules/csso/lib/clean/index.js b/node_modules/csso/lib/clean/index.js
new file mode 100644
index 0000000..9f6e21a
--- /dev/null
+++ b/node_modules/csso/lib/clean/index.js
@@ -0,0 +1,20 @@
+var walk = require('css-tree').walk;
+var handlers = {
+    Atrule: require('./Atrule'),
+    Comment: require('./Comment'),
+    Declaration: require('./Declaration'),
+    Raw: require('./Raw'),
+    Rule: require('./Rule'),
+    TypeSelector: require('./TypeSelector'),
+    WhiteSpace: require('./WhiteSpace')
+};
+
+module.exports = function(ast, options) {
+    walk(ast, {
+        leave: function(node, item, list) {
+            if (handlers.hasOwnProperty(node.type)) {
+                handlers[node.type].call(this, node, item, list, options);
+            }
+        }
+    });
+};
diff --git a/node_modules/csso/lib/clean/utils.js b/node_modules/csso/lib/clean/utils.js
new file mode 100644
index 0000000..976fb0e
--- /dev/null
+++ b/node_modules/csso/lib/clean/utils.js
@@ -0,0 +1,8 @@
+module.exports = {
+    hasNoChildren: function(node) {
+        return !node || !node.children || node.children.isEmpty();
+    },
+    isNodeChildrenList: function(node, list) {
+        return node !== null && node.children === list;
+    }
+};
diff --git a/node_modules/csso/lib/compress.js b/node_modules/csso/lib/compress.js
new file mode 100644
index 0000000..17be39b
--- /dev/null
+++ b/node_modules/csso/lib/compress.js
@@ -0,0 +1,197 @@
+var List = require('css-tree').List;
+var clone = require('css-tree').clone;
+var usageUtils = require('./usage');
+var clean = require('./clean');
+var replace = require('./replace');
+var restructure = require('./restructure');
+var walk = require('css-tree').walk;
+
+function readChunk(children, specialComments) {
+    var buffer = new List();
+    var nonSpaceTokenInBuffer = false;
+    var protectedComment;
+
+    children.nextUntil(children.head, function(node, item, list) {
+        if (node.type === 'Comment') {
+            if (!specialComments || node.value.charAt(0) !== '!') {
+                list.remove(item);
+                return;
+            }
+
+            if (nonSpaceTokenInBuffer || protectedComment) {
+                return true;
+            }
+
+            list.remove(item);
+            protectedComment = node;
+            return;
+        }
+
+        if (node.type !== 'WhiteSpace') {
+            nonSpaceTokenInBuffer = true;
+        }
+
+        buffer.insert(list.remove(item));
+    });
+
+    return {
+        comment: protectedComment,
+        stylesheet: {
+            type: 'StyleSheet',
+            loc: null,
+            children: buffer
+        }
+    };
+}
+
+function compressChunk(ast, firstAtrulesAllowed, num, options) {
+    options.logger('Compress block #' + num, null, true);
+
+    var seed = 1;
+
+    if (ast.type === 'StyleSheet') {
+        ast.firstAtrulesAllowed = firstAtrulesAllowed;
+        ast.id = seed++;
+    }
+
+    walk(ast, {
+        visit: 'Atrule',
+        enter: function markScopes(node) {
+            if (node.block !== null) {
+                node.block.id = seed++;
+            }
+        }
+    });
+    options.logger('init', ast);
+
+    // remove redundant
+    clean(ast, options);
+    options.logger('clean', ast);
+
+    // replace nodes for shortened forms
+    replace(ast, options);
+    options.logger('replace', ast);
+
+    // structure optimisations
+    if (options.restructuring) {
+        restructure(ast, options);
+    }
+
+    return ast;
+}
+
+function getCommentsOption(options) {
+    var comments = 'comments' in options ? options.comments : 'exclamation';
+
+    if (typeof comments === 'boolean') {
+        comments = comments ? 'exclamation' : false;
+    } else if (comments !== 'exclamation' && comments !== 'first-exclamation') {
+        comments = false;
+    }
+
+    return comments;
+}
+
+function getRestructureOption(options) {
+    if ('restructure' in options) {
+        return options.restructure;
+    }
+
+    return 'restructuring' in options ? options.restructuring : true;
+}
+
+function wrapBlock(block) {
+    return new List().appendData({
+        type: 'Rule',
+        loc: null,
+        prelude: {
+            type: 'SelectorList',
+            loc: null,
+            children: new List().appendData({
+                type: 'Selector',
+                loc: null,
+                children: new List().appendData({
+                    type: 'TypeSelector',
+                    loc: null,
+                    name: 'x'
+                })
+            })
+        },
+        block: block
+    });
+}
+
+module.exports = function compress(ast, options) {
+    ast = ast || { type: 'StyleSheet', loc: null, children: new List() };
+    options = options || {};
+
+    var compressOptions = {
+        logger: typeof options.logger === 'function' ? options.logger : function() {},
+        restructuring: getRestructureOption(options),
+        forceMediaMerge: Boolean(options.forceMediaMerge),
+        usage: options.usage ? usageUtils.buildIndex(options.usage) : false
+    };
+    var specialComments = getCommentsOption(options);
+    var firstAtrulesAllowed = true;
+    var input;
+    var output = new List();
+    var chunk;
+    var chunkNum = 1;
+    var chunkChildren;
+
+    if (options.clone) {
+        ast = clone(ast);
+    }
+
+    if (ast.type === 'StyleSheet') {
+        input = ast.children;
+        ast.children = output;
+    } else {
+        input = wrapBlock(ast);
+    }
+
+    do {
+        chunk = readChunk(input, Boolean(specialComments));
+        compressChunk(chunk.stylesheet, firstAtrulesAllowed, chunkNum++, compressOptions);
+        chunkChildren = chunk.stylesheet.children;
+
+        if (chunk.comment) {
+            // add \n before comment if there is another content in output
+            if (!output.isEmpty()) {
+                output.insert(List.createItem({
+                    type: 'Raw',
+                    value: '\n'
+                }));
+            }
+
+            output.insert(List.createItem(chunk.comment));
+
+            // add \n after comment if chunk is not empty
+            if (!chunkChildren.isEmpty()) {
+                output.insert(List.createItem({
+                    type: 'Raw',
+                    value: '\n'
+                }));
+            }
+        }
+
+        if (firstAtrulesAllowed && !chunkChildren.isEmpty()) {
+            var lastRule = chunkChildren.last();
+
+            if (lastRule.type !== 'Atrule' ||
+               (lastRule.name !== 'import' && lastRule.name !== 'charset')) {
+                firstAtrulesAllowed = false;
+            }
+        }
+
+        if (specialComments !== 'exclamation') {
+            specialComments = false;
+        }
+
+        output.appendList(chunkChildren);
+    } while (!input.isEmpty());
+
+    return {
+        ast: ast
+    };
+};
diff --git a/node_modules/csso/lib/index.js b/node_modules/csso/lib/index.js
new file mode 100644
index 0000000..2322e5e
--- /dev/null
+++ b/node_modules/csso/lib/index.js
@@ -0,0 +1,141 @@
+var csstree = require('css-tree');
+var parse = csstree.parse;
+var compress = require('./compress');
+var generate = csstree.generate;
+
+function debugOutput(name, options, startTime, data) {
+    if (options.debug) {
+        console.error('## ' + name + ' done in %d ms\n', Date.now() - startTime);
+    }
+
+    return data;
+}
+
+function createDefaultLogger(level) {
+    var lastDebug;
+
+    return function logger(title, ast) {
+        var line = title;
+
+        if (ast) {
+            line = '[' + ((Date.now() - lastDebug) / 1000).toFixed(3) + 's] ' + line;
+        }
+
+        if (level > 1 && ast) {
+            var css = generate(ast);
+
+            // when level 2, limit css to 256 symbols
+            if (level === 2 && css.length > 256) {
+                css = css.substr(0, 256) + '...';
+            }
+
+            line += '\n  ' + css + '\n';
+        }
+
+        console.error(line);
+        lastDebug = Date.now();
+    };
+}
+
+function copy(obj) {
+    var result = {};
+
+    for (var key in obj) {
+        result[key] = obj[key];
+    }
+
+    return result;
+}
+
+function buildCompressOptions(options) {
+    options = copy(options);
+
+    if (typeof options.logger !== 'function' && options.debug) {
+        options.logger = createDefaultLogger(options.debug);
+    }
+
+    return options;
+}
+
+function runHandler(ast, options, handlers) {
+    if (!Array.isArray(handlers)) {
+        handlers = [handlers];
+    }
+
+    handlers.forEach(function(fn) {
+        fn(ast, options);
+    });
+}
+
+function minify(context, source, options) {
+    options = options || {};
+
+    var filename = options.filename || '<unknown>';
+    var result;
+
+    // parse
+    var ast = debugOutput('parsing', options, Date.now(),
+        parse(source, {
+            context: context,
+            filename: filename,
+            positions: Boolean(options.sourceMap)
+        })
+    );
+
+    // before compress handlers
+    if (options.beforeCompress) {
+        debugOutput('beforeCompress', options, Date.now(),
+            runHandler(ast, options, options.beforeCompress)
+        );
+    }
+
+    // compress
+    var compressResult = debugOutput('compress', options, Date.now(),
+        compress(ast, buildCompressOptions(options))
+    );
+
+    // after compress handlers
+    if (options.afterCompress) {
+        debugOutput('afterCompress', options, Date.now(),
+            runHandler(compressResult, options, options.afterCompress)
+        );
+    }
+
+    // generate
+    if (options.sourceMap) {
+        result = debugOutput('generate(sourceMap: true)', options, Date.now(), (function() {
+            var tmp = generate(compressResult.ast, { sourceMap: true });
+            tmp.map._file = filename; // since other tools can relay on file in source map transform chain
+            tmp.map.setSourceContent(filename, source);
+            return tmp;
+        }()));
+    } else {
+        result = debugOutput('generate', options, Date.now(), {
+            css: generate(compressResult.ast),
+            map: null
+        });
+    }
+
+    return result;
+}
+
+function minifyStylesheet(source, options) {
+    return minify('stylesheet', source, options);
+}
+
+function minifyBlock(source, options) {
+    return minify('declarationList', source, options);
+}
+
+module.exports = {
+    version: require('../package.json').version,
+
+    // main methods
+    minify: minifyStylesheet,
+    minifyBlock: minifyBlock,
+
+    // css syntax parser/walkers/generator/etc
+    syntax: Object.assign({
+        compress: compress
+    }, csstree)
+};
diff --git a/node_modules/csso/lib/replace/Atrule.js b/node_modules/csso/lib/replace/Atrule.js
new file mode 100644
index 0000000..b64245c
--- /dev/null
+++ b/node_modules/csso/lib/replace/Atrule.js
@@ -0,0 +1,9 @@
+var resolveKeyword = require('css-tree').keyword;
+var compressKeyframes = require('./atrule/keyframes');
+
+module.exports = function(node) {
+    // compress @keyframe selectors
+    if (resolveKeyword(node.name).basename === 'keyframes') {
+        compressKeyframes(node);
+    }
+};
diff --git a/node_modules/csso/lib/replace/AttributeSelector.js b/node_modules/csso/lib/replace/AttributeSelector.js
new file mode 100644
index 0000000..72ad9e0
--- /dev/null
+++ b/node_modules/csso/lib/replace/AttributeSelector.js
@@ -0,0 +1,33 @@
+// Can unquote attribute detection
+// Adopted implementation of Mathias Bynens
+// https://github.com/mathiasbynens/mothereff.in/blob/master/unquoted-attributes/eff.js
+var escapesRx = /\\([0-9A-Fa-f]{1,6})(\r\n|[ \t\n\f\r])?|\\./g;
+var blockUnquoteRx = /^(-?\d|--)|[\u0000-\u002c\u002e\u002f\u003A-\u0040\u005B-\u005E\u0060\u007B-\u009f]/;
+
+function canUnquote(value) {
+    if (value === '' || value === '-') {
+        return;
+    }
+
+    // Escapes are valid, so replace them with a valid non-empty string
+    value = value.replace(escapesRx, 'a');
+
+    return !blockUnquoteRx.test(value);
+}
+
+module.exports = function(node) {
+    var attrValue = node.value;
+
+    if (!attrValue || attrValue.type !== 'String') {
+        return;
+    }
+
+    var unquotedValue = attrValue.value.replace(/^(.)(.*)\1$/, '$2');
+    if (canUnquote(unquotedValue)) {
+        node.value = {
+            type: 'Identifier',
+            loc: attrValue.loc,
+            name: unquotedValue
+        };
+    }
+};
diff --git a/node_modules/csso/lib/replace/Dimension.js b/node_modules/csso/lib/replace/Dimension.js
new file mode 100644
index 0000000..036a94c
--- /dev/null
+++ b/node_modules/csso/lib/replace/Dimension.js
@@ -0,0 +1,62 @@
+var packNumber = require('./Number').pack;
+var MATH_FUNCTIONS = {
+    'calc': true,
+    'min': true,
+    'max': true,
+    'clamp': true
+};
+var LENGTH_UNIT = {
+    // absolute length units
+    'px': true,
+    'mm': true,
+    'cm': true,
+    'in': true,
+    'pt': true,
+    'pc': true,
+
+    // relative length units
+    'em': true,
+    'ex': true,
+    'ch': true,
+    'rem': true,
+
+    // viewport-percentage lengths
+    'vh': true,
+    'vw': true,
+    'vmin': true,
+    'vmax': true,
+    'vm': true
+};
+
+module.exports = function compressDimension(node, item) {
+    var value = packNumber(node.value, item);
+
+    node.value = value;
+
+    if (value === '0' && this.declaration !== null && this.atrulePrelude === null) {
+        var unit = node.unit.toLowerCase();
+
+        // only length values can be compressed
+        if (!LENGTH_UNIT.hasOwnProperty(unit)) {
+            return;
+        }
+
+        // issue #362: shouldn't remove unit in -ms-flex since it breaks flex in IE10/11
+        // issue #200: shouldn't remove unit in flex since it breaks flex in IE10/11
+        if (this.declaration.property === '-ms-flex' ||
+            this.declaration.property === 'flex') {
+            return;
+        }
+
+        // issue #222: don't remove units inside calc
+        if (this.function && MATH_FUNCTIONS.hasOwnProperty(this.function.name)) {
+            return;
+        }
+
+        item.data = {
+            type: 'Number',
+            loc: node.loc,
+            value: value
+        };
+    }
+};
diff --git a/node_modules/csso/lib/replace/Number.js b/node_modules/csso/lib/replace/Number.js
new file mode 100644
index 0000000..f3bd526
--- /dev/null
+++ b/node_modules/csso/lib/replace/Number.js
@@ -0,0 +1,39 @@
+var OMIT_PLUSSIGN = /^(?:\+|(-))?0*(\d*)(?:\.0*|(\.\d*?)0*)?$/;
+var KEEP_PLUSSIGN = /^([\+\-])?0*(\d*)(?:\.0*|(\.\d*?)0*)?$/;
+var unsafeToRemovePlusSignAfter = {
+    Dimension: true,
+    Hash: true,
+    Identifier: true,
+    Number: true,
+    Raw: true,
+    UnicodeRange: true
+};
+
+function packNumber(value, item) {
+    // omit plus sign only if no prev or prev is safe type
+    var regexp = item && item.prev !== null && unsafeToRemovePlusSignAfter.hasOwnProperty(item.prev.data.type)
+        ? KEEP_PLUSSIGN
+        : OMIT_PLUSSIGN;
+
+    // 100 -> '100'
+    // 00100 -> '100'
+    // +100 -> '100' (only when safe, e.g. omitting plus sign for 1px+1px leads to single dimension instead of two)
+    // -100 -> '-100'
+    // 0.123 -> '.123'
+    // 0.12300 -> '.123'
+    // 0.0 -> ''
+    // 0 -> ''
+    // -0 -> '-'
+    value = String(value).replace(regexp, '$1$2$3');
+
+    if (value === '' || value === '-') {
+        value = '0';
+    }
+
+    return value;
+}
+
+module.exports = function(node, item) {
+    node.value = packNumber(node.value, item);
+};
+module.exports.pack = packNumber;
diff --git a/node_modules/csso/lib/replace/Percentage.js b/node_modules/csso/lib/replace/Percentage.js
new file mode 100644
index 0000000..2382b15
--- /dev/null
+++ b/node_modules/csso/lib/replace/Percentage.js
@@ -0,0 +1,36 @@
+var lexer = require('css-tree').lexer;
+var packNumber = require('./Number').pack;
+var blacklist = new Set([
+    // see https://github.com/jakubpawlowicz/clean-css/issues/957
+    'width',
+    'min-width',
+    'max-width',
+    'height',
+    'min-height',
+    'max-height',
+
+    // issue #410: Don’t remove units in flex-basis value for (-ms-)flex shorthand
+    // issue #362: shouldn't remove unit in -ms-flex since it breaks flex in IE10/11
+    // issue #200: shouldn't remove unit in flex since it breaks flex in IE10/11
+    'flex',
+    '-ms-flex'
+]);
+
+module.exports = function compressPercentage(node, item) {
+    node.value = packNumber(node.value, item);
+
+    if (node.value === '0' && this.declaration && !blacklist.has(this.declaration.property)) {
+        // try to convert a number
+        item.data = {
+            type: 'Number',
+            loc: node.loc,
+            value: node.value
+        };
+
+        // that's ok only when new value matches on length
+        if (!lexer.matchDeclaration(this.declaration).isType(item.data, 'length')) {
+            // otherwise rollback changes
+            item.data = node;
+        }
+    }
+};
diff --git a/node_modules/csso/lib/replace/String.js b/node_modules/csso/lib/replace/String.js
new file mode 100644
index 0000000..ca9e60d
--- /dev/null
+++ b/node_modules/csso/lib/replace/String.js
@@ -0,0 +1,12 @@
+module.exports = function(node) {
+    var value = node.value;
+
+    // remove escaped newlines, i.e.
+    // .a { content: "foo\
+    // bar"}
+    // ->
+    // .a { content: "foobar" }
+    value = value.replace(/\\(\r\n|\r|\n|\f)/g, '');
+
+    node.value = value;
+};
diff --git a/node_modules/csso/lib/replace/Url.js b/node_modules/csso/lib/replace/Url.js
new file mode 100644
index 0000000..af7f937
--- /dev/null
+++ b/node_modules/csso/lib/replace/Url.js
@@ -0,0 +1,33 @@
+var UNICODE = '\\\\[0-9a-f]{1,6}(\\r\\n|[ \\n\\r\\t\\f])?';
+var ESCAPE = '(' + UNICODE + '|\\\\[^\\n\\r\\f0-9a-fA-F])';
+var NONPRINTABLE = '\u0000\u0008\u000b\u000e-\u001f\u007f';
+var SAFE_URL = new RegExp('^(' + ESCAPE + '|[^\"\'\\(\\)\\\\\\s' + NONPRINTABLE + '])*$', 'i');
+
+module.exports = function(node) {
+    var value = node.value;
+
+    if (value.type !== 'String') {
+        return;
+    }
+
+    var quote = value.value[0];
+    var url = value.value.substr(1, value.value.length - 2);
+
+    // convert `\\` to `/`
+    url = url.replace(/\\\\/g, '/');
+
+    // remove quotes when safe
+    // https://www.w3.org/TR/css-syntax-3/#url-unquoted-diagram
+    if (SAFE_URL.test(url)) {
+        node.value = {
+            type: 'Raw',
+            loc: node.value.loc,
+            value: url
+        };
+    } else {
+        // use double quotes if string has no double quotes
+        // otherwise use original quotes
+        // TODO: make better quote type selection
+        node.value.value = url.indexOf('"') === -1 ? '"' + url + '"' : quote + url + quote;
+    }
+};
diff --git a/node_modules/csso/lib/replace/Value.js b/node_modules/csso/lib/replace/Value.js
new file mode 100644
index 0000000..52e3b65
--- /dev/null
+++ b/node_modules/csso/lib/replace/Value.js
@@ -0,0 +1,20 @@
+var resolveName = require('css-tree').property;
+var handlers = {
+    'font': require('./property/font'),
+    'font-weight': require('./property/font-weight'),
+    'background': require('./property/background'),
+    'border': require('./property/border'),
+    'outline': require('./property/border')
+};
+
+module.exports = function compressValue(node) {
+    if (!this.declaration) {
+        return;
+    }
+
+    var property = resolveName(this.declaration.property);
+
+    if (handlers.hasOwnProperty(property.basename)) {
+        handlers[property.basename](node);
+    }
+};
diff --git a/node_modules/csso/lib/replace/atrule/keyframes.js b/node_modules/csso/lib/replace/atrule/keyframes.js
new file mode 100644
index 0000000..229d6d1
--- /dev/null
+++ b/node_modules/csso/lib/replace/atrule/keyframes.js
@@ -0,0 +1,21 @@
+module.exports = function(node) {
+    node.block.children.each(function(rule) {
+        rule.prelude.children.each(function(simpleselector) {
+            simpleselector.children.each(function(data, item) {
+                if (data.type === 'Percentage' && data.value === '100') {
+                    item.data = {
+                        type: 'TypeSelector',
+                        loc: data.loc,
+                        name: 'to'
+                    };
+                } else if (data.type === 'TypeSelector' && data.name === 'from') {
+                    item.data = {
+                        type: 'Percentage',
+                        loc: data.loc,
+                        value: '0'
+                    };
+                }
+            });
+        });
+    });
+};
diff --git a/node_modules/csso/lib/replace/color.js b/node_modules/csso/lib/replace/color.js
new file mode 100644
index 0000000..da3ae01
--- /dev/null
+++ b/node_modules/csso/lib/replace/color.js
@@ -0,0 +1,510 @@
+var lexer = require('css-tree').lexer;
+var packNumber = require('./Number').pack;
+
+// http://www.w3.org/TR/css3-color/#svg-color
+var NAME_TO_HEX = {
+    'aliceblue': 'f0f8ff',
+    'antiquewhite': 'faebd7',
+    'aqua': '0ff',
+    'aquamarine': '7fffd4',
+    'azure': 'f0ffff',
+    'beige': 'f5f5dc',
+    'bisque': 'ffe4c4',
+    'black': '000',
+    'blanchedalmond': 'ffebcd',
+    'blue': '00f',
+    'blueviolet': '8a2be2',
+    'brown': 'a52a2a',
+    'burlywood': 'deb887',
+    'cadetblue': '5f9ea0',
+    'chartreuse': '7fff00',
+    'chocolate': 'd2691e',
+    'coral': 'ff7f50',
+    'cornflowerblue': '6495ed',
+    'cornsilk': 'fff8dc',
+    'crimson': 'dc143c',
+    'cyan': '0ff',
+    'darkblue': '00008b',
+    'darkcyan': '008b8b',
+    'darkgoldenrod': 'b8860b',
+    'darkgray': 'a9a9a9',
+    'darkgrey': 'a9a9a9',
+    'darkgreen': '006400',
+    'darkkhaki': 'bdb76b',
+    'darkmagenta': '8b008b',
+    'darkolivegreen': '556b2f',
+    'darkorange': 'ff8c00',
+    'darkorchid': '9932cc',
+    'darkred': '8b0000',
+    'darksalmon': 'e9967a',
+    'darkseagreen': '8fbc8f',
+    'darkslateblue': '483d8b',
+    'darkslategray': '2f4f4f',
+    'darkslategrey': '2f4f4f',
+    'darkturquoise': '00ced1',
+    'darkviolet': '9400d3',
+    'deeppink': 'ff1493',
+    'deepskyblue': '00bfff',
+    'dimgray': '696969',
+    'dimgrey': '696969',
+    'dodgerblue': '1e90ff',
+    'firebrick': 'b22222',
+    'floralwhite': 'fffaf0',
+    'forestgreen': '228b22',
+    'fuchsia': 'f0f',
+    'gainsboro': 'dcdcdc',
+    'ghostwhite': 'f8f8ff',
+    'gold': 'ffd700',
+    'goldenrod': 'daa520',
+    'gray': '808080',
+    'grey': '808080',
+    'green': '008000',
+    'greenyellow': 'adff2f',
+    'honeydew': 'f0fff0',
+    'hotpink': 'ff69b4',
+    'indianred': 'cd5c5c',
+    'indigo': '4b0082',
+    'ivory': 'fffff0',
+    'khaki': 'f0e68c',
+    'lavender': 'e6e6fa',
+    'lavenderblush': 'fff0f5',
+    'lawngreen': '7cfc00',
+    'lemonchiffon': 'fffacd',
+    'lightblue': 'add8e6',
+    'lightcoral': 'f08080',
+    'lightcyan': 'e0ffff',
+    'lightgoldenrodyellow': 'fafad2',
+    'lightgray': 'd3d3d3',
+    'lightgrey': 'd3d3d3',
+    'lightgreen': '90ee90',
+    'lightpink': 'ffb6c1',
+    'lightsalmon': 'ffa07a',
+    'lightseagreen': '20b2aa',
+    'lightskyblue': '87cefa',
+    'lightslategray': '789',
+    'lightslategrey': '789',
+    'lightsteelblue': 'b0c4de',
+    'lightyellow': 'ffffe0',
+    'lime': '0f0',
+    'limegreen': '32cd32',
+    'linen': 'faf0e6',
+    'magenta': 'f0f',
+    'maroon': '800000',
+    'mediumaquamarine': '66cdaa',
+    'mediumblue': '0000cd',
+    'mediumorchid': 'ba55d3',
+    'mediumpurple': '9370db',
+    'mediumseagreen': '3cb371',
+    'mediumslateblue': '7b68ee',
+    'mediumspringgreen': '00fa9a',
+    'mediumturquoise': '48d1cc',
+    'mediumvioletred': 'c71585',
+    'midnightblue': '191970',
+    'mintcream': 'f5fffa',
+    'mistyrose': 'ffe4e1',
+    'moccasin': 'ffe4b5',
+    'navajowhite': 'ffdead',
+    'navy': '000080',
+    'oldlace': 'fdf5e6',
+    'olive': '808000',
+    'olivedrab': '6b8e23',
+    'orange': 'ffa500',
+    'orangered': 'ff4500',
+    'orchid': 'da70d6',
+    'palegoldenrod': 'eee8aa',
+    'palegreen': '98fb98',
+    'paleturquoise': 'afeeee',
+    'palevioletred': 'db7093',
+    'papayawhip': 'ffefd5',
+    'peachpuff': 'ffdab9',
+    'peru': 'cd853f',
+    'pink': 'ffc0cb',
+    'plum': 'dda0dd',
+    'powderblue': 'b0e0e6',
+    'purple': '800080',
+    'rebeccapurple': '639',
+    'red': 'f00',
+    'rosybrown': 'bc8f8f',
+    'royalblue': '4169e1',
+    'saddlebrown': '8b4513',
+    'salmon': 'fa8072',
+    'sandybrown': 'f4a460',
+    'seagreen': '2e8b57',
+    'seashell': 'fff5ee',
+    'sienna': 'a0522d',
+    'silver': 'c0c0c0',
+    'skyblue': '87ceeb',
+    'slateblue': '6a5acd',
+    'slategray': '708090',
+    'slategrey': '708090',
+    'snow': 'fffafa',
+    'springgreen': '00ff7f',
+    'steelblue': '4682b4',
+    'tan': 'd2b48c',
+    'teal': '008080',
+    'thistle': 'd8bfd8',
+    'tomato': 'ff6347',
+    'turquoise': '40e0d0',
+    'violet': 'ee82ee',
+    'wheat': 'f5deb3',
+    'white': 'fff',
+    'whitesmoke': 'f5f5f5',
+    'yellow': 'ff0',
+    'yellowgreen': '9acd32'
+};
+
+var HEX_TO_NAME = {
+    '800000': 'maroon',
+    '800080': 'purple',
+    '808000': 'olive',
+    '808080': 'gray',
+    '00ffff': 'cyan',
+    'f0ffff': 'azure',
+    'f5f5dc': 'beige',
+    'ffe4c4': 'bisque',
+    '000000': 'black',
+    '0000ff': 'blue',
+    'a52a2a': 'brown',
+    'ff7f50': 'coral',
+    'ffd700': 'gold',
+    '008000': 'green',
+    '4b0082': 'indigo',
+    'fffff0': 'ivory',
+    'f0e68c': 'khaki',
+    '00ff00': 'lime',
+    'faf0e6': 'linen',
+    '000080': 'navy',
+    'ffa500': 'orange',
+    'da70d6': 'orchid',
+    'cd853f': 'peru',
+    'ffc0cb': 'pink',
+    'dda0dd': 'plum',
+    'f00': 'red',
+    'ff0000': 'red',
+    'fa8072': 'salmon',
+    'a0522d': 'sienna',
+    'c0c0c0': 'silver',
+    'fffafa': 'snow',
+    'd2b48c': 'tan',
+    '008080': 'teal',
+    'ff6347': 'tomato',
+    'ee82ee': 'violet',
+    'f5deb3': 'wheat',
+    'ffffff': 'white',
+    'ffff00': 'yellow'
+};
+
+function hueToRgb(p, q, t) {
+    if (t < 0) {
+        t += 1;
+    }
+    if (t > 1) {
+        t -= 1;
+    }
+    if (t < 1 / 6) {
+        return p + (q - p) * 6 * t;
+    }
+    if (t < 1 / 2) {
+        return q;
+    }
+    if (t < 2 / 3) {
+        return p + (q - p) * (2 / 3 - t) * 6;
+    }
+    return p;
+}
+
+function hslToRgb(h, s, l, a) {
+    var r;
+    var g;
+    var b;
+
+    if (s === 0) {
+        r = g = b = l; // achromatic
+    } else {
+        var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
+        var p = 2 * l - q;
+
+        r = hueToRgb(p, q, h + 1 / 3);
+        g = hueToRgb(p, q, h);
+        b = hueToRgb(p, q, h - 1 / 3);
+    }
+
+    return [
+        Math.round(r * 255),
+        Math.round(g * 255),
+        Math.round(b * 255),
+        a
+    ];
+}
+
+function toHex(value) {
+    value = value.toString(16);
+    return value.length === 1 ? '0' + value : value;
+}
+
+function parseFunctionArgs(functionArgs, count, rgb) {
+    var cursor = functionArgs.head;
+    var args = [];
+    var wasValue = false;
+
+    while (cursor !== null) {
+        var node = cursor.data;
+        var type = node.type;
+
+        switch (type) {
+            case 'Number':
+            case 'Percentage':
+                if (wasValue) {
+                    return;
+                }
+
+                wasValue = true;
+                args.push({
+                    type: type,
+                    value: Number(node.value)
+                });
+                break;
+
+            case 'Operator':
+                if (node.value === ',') {
+                    if (!wasValue) {
+                        return;
+                    }
+                    wasValue = false;
+                } else if (wasValue || node.value !== '+') {
+                    return;
+                }
+                break;
+
+            default:
+                // something we couldn't understand
+                return;
+        }
+
+        cursor = cursor.next;
+    }
+
+    if (args.length !== count) {
+        // invalid arguments count
+        // TODO: remove those tokens
+        return;
+    }
+
+    if (args.length === 4) {
+        if (args[3].type !== 'Number') {
+            // 4th argument should be a number
+            // TODO: remove those tokens
+            return;
+        }
+
+        args[3].type = 'Alpha';
+    }
+
+    if (rgb) {
+        if (args[0].type !== args[1].type || args[0].type !== args[2].type) {
+            // invalid color, numbers and percentage shouldn't be mixed
+            // TODO: remove those tokens
+            return;
+        }
+    } else {
+        if (args[0].type !== 'Number' ||
+            args[1].type !== 'Percentage' ||
+            args[2].type !== 'Percentage') {
+            // invalid color, for hsl values should be: number, percentage, percentage
+            // TODO: remove those tokens
+            return;
+        }
+
+        args[0].type = 'Angle';
+    }
+
+    return args.map(function(arg) {
+        var value = Math.max(0, arg.value);
+
+        switch (arg.type) {
+            case 'Number':
+                // fit value to [0..255] range
+                value = Math.min(value, 255);
+                break;
+
+            case 'Percentage':
+                // convert 0..100% to value in [0..255] range
+                value = Math.min(value, 100) / 100;
+
+                if (!rgb) {
+                    return value;
+                }
+
+                value = 255 * value;
+                break;
+
+            case 'Angle':
+                // fit value to (-360..360) range
+                return (((value % 360) + 360) % 360) / 360;
+
+            case 'Alpha':
+                // fit value to [0..1] range
+                return Math.min(value, 1);
+        }
+
+        return Math.round(value);
+    });
+}
+
+function compressFunction(node, item, list) {
+    var functionName = node.name;
+    var args;
+
+    if (functionName === 'rgba' || functionName === 'hsla') {
+        args = parseFunctionArgs(node.children, 4, functionName === 'rgba');
+
+        if (!args) {
+            // something went wrong
+            return;
+        }
+
+        if (functionName === 'hsla') {
+            args = hslToRgb.apply(null, args);
+            node.name = 'rgba';
+        }
+
+        if (args[3] === 0) {
+            // try to replace `rgba(x, x, x, 0)` to `transparent`
+            // always replace `rgba(0, 0, 0, 0)` to `transparent`
+            // otherwise avoid replacement in gradients since it may break color transition
+            // http://stackoverflow.com/questions/11829410/css3-gradient-rendering-issues-from-transparent-to-white
+            var scopeFunctionName = this.function && this.function.name;
+            if ((args[0] === 0 && args[1] === 0 && args[2] === 0) ||
+                !/^(?:to|from|color-stop)$|gradient$/i.test(scopeFunctionName)) {
+
+                item.data = {
+                    type: 'Identifier',
+                    loc: node.loc,
+                    name: 'transparent'
+                };
+
+                return;
+            }
+        }
+
+        if (args[3] !== 1) {
+            // replace argument values for normalized/interpolated
+            node.children.each(function(node, item, list) {
+                if (node.type === 'Operator') {
+                    if (node.value !== ',') {
+                        list.remove(item);
+                    }
+                    return;
+                }
+
+                item.data = {
+                    type: 'Number',
+                    loc: node.loc,
+                    value: packNumber(args.shift(), null)
+                };
+            });
+
+            return;
+        }
+
+        // otherwise convert to rgb, i.e. rgba(255, 0, 0, 1) -> rgb(255, 0, 0)
+        functionName = 'rgb';
+    }
+
+    if (functionName === 'hsl') {
+        args = args || parseFunctionArgs(node.children, 3, false);
+
+        if (!args) {
+            // something went wrong
+            return;
+        }
+
+        // convert to rgb
+        args = hslToRgb.apply(null, args);
+        functionName = 'rgb';
+    }
+
+    if (functionName === 'rgb') {
+        args = args || parseFunctionArgs(node.children, 3, true);
+
+        if (!args) {
+            // something went wrong
+            return;
+        }
+
+        // check if color is not at the end and not followed by space
+        var next = item.next;
+        if (next && next.data.type !== 'WhiteSpace') {
+            list.insert(list.createItem({
+                type: 'WhiteSpace',
+                value: ' '
+            }), next);
+        }
+
+        item.data = {
+            type: 'Hash',
+            loc: node.loc,
+            value: toHex(args[0]) + toHex(args[1]) + toHex(args[2])
+        };
+
+        compressHex(item.data, item);
+    }
+}
+
+function compressIdent(node, item) {
+    if (this.declaration === null) {
+        return;
+    }
+
+    var color = node.name.toLowerCase();
+
+    if (NAME_TO_HEX.hasOwnProperty(color) &&
+        lexer.matchDeclaration(this.declaration).isType(node, 'color')) {
+        var hex = NAME_TO_HEX[color];
+
+        if (hex.length + 1 <= color.length) {
+            // replace for shorter hex value
+            item.data = {
+                type: 'Hash',
+                loc: node.loc,
+                value: hex
+            };
+        } else {
+            // special case for consistent colors
+            if (color === 'grey') {
+                color = 'gray';
+            }
+
+            // just replace value for lower cased name
+            node.name = color;
+        }
+    }
+}
+
+function compressHex(node, item) {
+    var color = node.value.toLowerCase();
+
+    // #112233 -> #123
+    if (color.length === 6 &&
+        color[0] === color[1] &&
+        color[2] === color[3] &&
+        color[4] === color[5]) {
+        color = color[0] + color[2] + color[4];
+    }
+
+    if (HEX_TO_NAME[color]) {
+        item.data = {
+            type: 'Identifier',
+            loc: node.loc,
+            name: HEX_TO_NAME[color]
+        };
+    } else {
+        node.value = color;
+    }
+}
+
+module.exports = {
+    compressFunction: compressFunction,
+    compressIdent: compressIdent,
+    compressHex: compressHex
+};
diff --git a/node_modules/csso/lib/replace/index.js b/node_modules/csso/lib/replace/index.js
new file mode 100644
index 0000000..2e2c5f6
--- /dev/null
+++ b/node_modules/csso/lib/replace/index.js
@@ -0,0 +1,24 @@
+var walk = require('css-tree').walk;
+var handlers = {
+    Atrule: require('./Atrule'),
+    AttributeSelector: require('./AttributeSelector'),
+    Value: require('./Value'),
+    Dimension: require('./Dimension'),
+    Percentage: require('./Percentage'),
+    Number: require('./Number'),
+    String: require('./String'),
+    Url: require('./Url'),
+    Hash: require('./color').compressHex,
+    Identifier: require('./color').compressIdent,
+    Function: require('./color').compressFunction
+};
+
+module.exports = function(ast) {
+    walk(ast, {
+        leave: function(node, item, list) {
+            if (handlers.hasOwnProperty(node.type)) {
+                handlers[node.type].call(this, node, item, list);
+            }
+        }
+    });
+};
diff --git a/node_modules/csso/lib/replace/property/background.js b/node_modules/csso/lib/replace/property/background.js
new file mode 100644
index 0000000..a17ed4f
--- /dev/null
+++ b/node_modules/csso/lib/replace/property/background.js
@@ -0,0 +1,69 @@
+var List = require('css-tree').List;
+
+module.exports = function compressBackground(node) {
+    function lastType() {
+        if (buffer.length) {
+            return buffer[buffer.length - 1].type;
+        }
+    }
+
+    function flush() {
+        if (lastType() === 'WhiteSpace') {
+            buffer.pop();
+        }
+
+        if (!buffer.length) {
+            buffer.unshift(
+                {
+                    type: 'Number',
+                    loc: null,
+                    value: '0'
+                },
+                {
+                    type: 'WhiteSpace',
+                    value: ' '
+                },
+                {
+                    type: 'Number',
+                    loc: null,
+                    value: '0'
+                }
+            );
+        }
+
+        newValue.push.apply(newValue, buffer);
+
+        buffer = [];
+    }
+
+    var newValue = [];
+    var buffer = [];
+
+    node.children.each(function(node) {
+        if (node.type === 'Operator' && node.value === ',') {
+            flush();
+            newValue.push(node);
+            return;
+        }
+
+        // remove defaults
+        if (node.type === 'Identifier') {
+            if (node.name === 'transparent' ||
+                node.name === 'none' ||
+                node.name === 'repeat' ||
+                node.name === 'scroll') {
+                return;
+            }
+        }
+
+        // don't add redundant spaces
+        if (node.type === 'WhiteSpace' && (!buffer.length || lastType() === 'WhiteSpace')) {
+            return;
+        }
+
+        buffer.push(node);
+    });
+
+    flush();
+    node.children = new List().fromArray(newValue);
+};
diff --git a/node_modules/csso/lib/replace/property/border.js b/node_modules/csso/lib/replace/property/border.js
new file mode 100644
index 0000000..09a32c3
--- /dev/null
+++ b/node_modules/csso/lib/replace/property/border.js
@@ -0,0 +1,31 @@
+function removeItemAndRedundantWhiteSpace(list, item) {
+    var prev = item.prev;
+    var next = item.next;
+
+    if (next !== null) {
+        if (next.data.type === 'WhiteSpace' && (prev === null || prev.data.type === 'WhiteSpace')) {
+            list.remove(next);
+        }
+    } else if (prev !== null && prev.data.type === 'WhiteSpace') {
+        list.remove(prev);
+    }
+
+    list.remove(item);
+}
+
+module.exports = function compressBorder(node) {
+    node.children.each(function(node, item, list) {
+        if (node.type === 'Identifier' && node.name.toLowerCase() === 'none') {
+            if (list.head === list.tail) {
+                // replace `none` for zero when `none` is a single term
+                item.data = {
+                    type: 'Number',
+                    loc: node.loc,
+                    value: '0'
+                };
+            } else {
+                removeItemAndRedundantWhiteSpace(list, item);
+            }
+        }
+    });
+};
diff --git a/node_modules/csso/lib/replace/property/font-weight.js b/node_modules/csso/lib/replace/property/font-weight.js
new file mode 100644
index 0000000..6f2d34c
--- /dev/null
+++ b/node_modules/csso/lib/replace/property/font-weight.js
@@ -0,0 +1,22 @@
+module.exports = function compressFontWeight(node) {
+    var value = node.children.head.data;
+
+    if (value.type === 'Identifier') {
+        switch (value.name) {
+            case 'normal':
+                node.children.head.data = {
+                    type: 'Number',
+                    loc: value.loc,
+                    value: '400'
+                };
+                break;
+            case 'bold':
+                node.children.head.data = {
+                    type: 'Number',
+                    loc: value.loc,
+                    value: '700'
+                };
+                break;
+        }
+    }
+};
diff --git a/node_modules/csso/lib/replace/property/font.js b/node_modules/csso/lib/replace/property/font.js
new file mode 100644
index 0000000..043ca5c
--- /dev/null
+++ b/node_modules/csso/lib/replace/property/font.js
@@ -0,0 +1,45 @@
+module.exports = function compressFont(node) {
+    var list = node.children;
+
+    list.eachRight(function(node, item) {
+        if (node.type === 'Identifier') {
+            if (node.name === 'bold') {
+                item.data = {
+                    type: 'Number',
+                    loc: node.loc,
+                    value: '700'
+                };
+            } else if (node.name === 'normal') {
+                var prev = item.prev;
+
+                if (prev && prev.data.type === 'Operator' && prev.data.value === '/') {
+                    this.remove(prev);
+                }
+
+                this.remove(item);
+            } else if (node.name === 'medium') {
+                var next = item.next;
+
+                if (!next || next.data.type !== 'Operator') {
+                    this.remove(item);
+                }
+            }
+        }
+    });
+
+    // remove redundant spaces
+    list.each(function(node, item) {
+        if (node.type === 'WhiteSpace') {
+            if (!item.prev || !item.next || item.next.data.type === 'WhiteSpace') {
+                this.remove(item);
+            }
+        }
+    });
+
+    if (list.isEmpty()) {
+        list.insert(list.createItem({
+            type: 'Identifier',
+            name: 'normal'
+        }));
+    }
+};
diff --git a/node_modules/csso/lib/restructure/1-mergeAtrule.js b/node_modules/csso/lib/restructure/1-mergeAtrule.js
new file mode 100644
index 0000000..2239f69
--- /dev/null
+++ b/node_modules/csso/lib/restructure/1-mergeAtrule.js
@@ -0,0 +1,107 @@
+var List = require('css-tree').List;
+var resolveKeyword = require('css-tree').keyword;
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+var walk = require('css-tree').walk;
+
+function addRuleToMap(map, item, list, single) {
+    var node = item.data;
+    var name = resolveKeyword(node.name).basename;
+    var id = node.name.toLowerCase() + '/' + (node.prelude ? node.prelude.id : null);
+
+    if (!hasOwnProperty.call(map, name)) {
+        map[name] = Object.create(null);
+    }
+
+    if (single) {
+        delete map[name][id];
+    }
+
+    if (!hasOwnProperty.call(map[name], id)) {
+        map[name][id] = new List();
+    }
+
+    map[name][id].append(list.remove(item));
+}
+
+function relocateAtrules(ast, options) {
+    var collected = Object.create(null);
+    var topInjectPoint = null;
+
+    ast.children.each(function(node, item, list) {
+        if (node.type === 'Atrule') {
+            var name = resolveKeyword(node.name).basename;
+
+            switch (name) {
+                case 'keyframes':
+                    addRuleToMap(collected, item, list, true);
+                    return;
+
+                case 'media':
+                    if (options.forceMediaMerge) {
+                        addRuleToMap(collected, item, list, false);
+                        return;
+                    }
+                    break;
+            }
+
+            if (topInjectPoint === null &&
+                name !== 'charset' &&
+                name !== 'import') {
+                topInjectPoint = item;
+            }
+        } else {
+            if (topInjectPoint === null) {
+                topInjectPoint = item;
+            }
+        }
+    });
+
+    for (var atrule in collected) {
+        for (var id in collected[atrule]) {
+            ast.children.insertList(
+                collected[atrule][id],
+                atrule === 'media' ? null : topInjectPoint
+            );
+        }
+    }
+};
+
+function isMediaRule(node) {
+    return node.type === 'Atrule' && node.name === 'media';
+}
+
+function processAtrule(node, item, list) {
+    if (!isMediaRule(node)) {
+        return;
+    }
+
+    var prev = item.prev && item.prev.data;
+
+    if (!prev || !isMediaRule(prev)) {
+        return;
+    }
+
+    // merge @media with same query
+    if (node.prelude &&
+        prev.prelude &&
+        node.prelude.id === prev.prelude.id) {
+        prev.block.children.appendList(node.block.children);
+        list.remove(item);
+
+        // TODO: use it when we can refer to several points in source
+        // prev.loc = {
+        //     primary: prev.loc,
+        //     merged: node.loc
+        // };
+    }
+}
+
+module.exports = function rejoinAtrule(ast, options) {
+    relocateAtrules(ast, options);
+
+    walk(ast, {
+        visit: 'Atrule',
+        reverse: true,
+        enter: processAtrule
+    });
+};
diff --git a/node_modules/csso/lib/restructure/2-initialMergeRuleset.js b/node_modules/csso/lib/restructure/2-initialMergeRuleset.js
new file mode 100644
index 0000000..9ed0718
--- /dev/null
+++ b/node_modules/csso/lib/restructure/2-initialMergeRuleset.js
@@ -0,0 +1,47 @@
+var walk = require('css-tree').walk;
+var utils = require('./utils');
+
+function processRule(node, item, list) {
+    var selectors = node.prelude.children;
+    var declarations = node.block.children;
+
+    list.prevUntil(item.prev, function(prev) {
+        // skip non-ruleset node if safe
+        if (prev.type !== 'Rule') {
+            return utils.unsafeToSkipNode.call(selectors, prev);
+        }
+
+        var prevSelectors = prev.prelude.children;
+        var prevDeclarations = prev.block.children;
+
+        // try to join rulesets with equal pseudo signature
+        if (node.pseudoSignature === prev.pseudoSignature) {
+            // try to join by selectors
+            if (utils.isEqualSelectors(prevSelectors, selectors)) {
+                prevDeclarations.appendList(declarations);
+                list.remove(item);
+                return true;
+            }
+
+            // try to join by declarations
+            if (utils.isEqualDeclarations(declarations, prevDeclarations)) {
+                utils.addSelectors(prevSelectors, selectors);
+                list.remove(item);
+                return true;
+            }
+        }
+
+        // go to prev ruleset if has no selector similarities
+        return utils.hasSimilarSelectors(selectors, prevSelectors);
+    });
+}
+
+// NOTE: direction should be left to right, since rulesets merge to left
+// ruleset. When direction right to left unmerged rulesets may prevent lookup
+// TODO: remove initial merge
+module.exports = function initialMergeRule(ast) {
+    walk(ast, {
+        visit: 'Rule',
+        enter: processRule
+    });
+};
diff --git a/node_modules/csso/lib/restructure/3-disjoinRuleset.js b/node_modules/csso/lib/restructure/3-disjoinRuleset.js
new file mode 100644
index 0000000..0c56964
--- /dev/null
+++ b/node_modules/csso/lib/restructure/3-disjoinRuleset.js
@@ -0,0 +1,42 @@
+var List = require('css-tree').List;
+var walk = require('css-tree').walk;
+
+function processRule(node, item, list) {
+    var selectors = node.prelude.children;
+
+    // generate new rule sets:
+    // .a, .b { color: red; }
+    // ->
+    // .a { color: red; }
+    // .b { color: red; }
+
+    // while there are more than 1 simple selector split for rulesets
+    while (selectors.head !== selectors.tail) {
+        var newSelectors = new List();
+        newSelectors.insert(selectors.remove(selectors.head));
+
+        list.insert(list.createItem({
+            type: 'Rule',
+            loc: node.loc,
+            prelude: {
+                type: 'SelectorList',
+                loc: node.prelude.loc,
+                children: newSelectors
+            },
+            block: {
+                type: 'Block',
+                loc: node.block.loc,
+                children: node.block.children.copy()
+            },
+            pseudoSignature: node.pseudoSignature
+        }), item);
+    }
+}
+
+module.exports = function disjoinRule(ast) {
+    walk(ast, {
+        visit: 'Rule',
+        reverse: true,
+        enter: processRule
+    });
+};
diff --git a/node_modules/csso/lib/restructure/4-restructShorthand.js b/node_modules/csso/lib/restructure/4-restructShorthand.js
new file mode 100644
index 0000000..f95889e
--- /dev/null
+++ b/node_modules/csso/lib/restructure/4-restructShorthand.js
@@ -0,0 +1,432 @@
+var List = require('css-tree').List;
+var generate = require('css-tree').generate;
+var walk = require('css-tree').walk;
+
+var REPLACE = 1;
+var REMOVE = 2;
+var TOP = 0;
+var RIGHT = 1;
+var BOTTOM = 2;
+var LEFT = 3;
+var SIDES = ['top', 'right', 'bottom', 'left'];
+var SIDE = {
+    'margin-top': 'top',
+    'margin-right': 'right',
+    'margin-bottom': 'bottom',
+    'margin-left': 'left',
+
+    'padding-top': 'top',
+    'padding-right': 'right',
+    'padding-bottom': 'bottom',
+    'padding-left': 'left',
+
+    'border-top-color': 'top',
+    'border-right-color': 'right',
+    'border-bottom-color': 'bottom',
+    'border-left-color': 'left',
+    'border-top-width': 'top',
+    'border-right-width': 'right',
+    'border-bottom-width': 'bottom',
+    'border-left-width': 'left',
+    'border-top-style': 'top',
+    'border-right-style': 'right',
+    'border-bottom-style': 'bottom',
+    'border-left-style': 'left'
+};
+var MAIN_PROPERTY = {
+    'margin': 'margin',
+    'margin-top': 'margin',
+    'margin-right': 'margin',
+    'margin-bottom': 'margin',
+    'margin-left': 'margin',
+
+    'padding': 'padding',
+    'padding-top': 'padding',
+    'padding-right': 'padding',
+    'padding-bottom': 'padding',
+    'padding-left': 'padding',
+
+    'border-color': 'border-color',
+    'border-top-color': 'border-color',
+    'border-right-color': 'border-color',
+    'border-bottom-color': 'border-color',
+    'border-left-color': 'border-color',
+    'border-width': 'border-width',
+    'border-top-width': 'border-width',
+    'border-right-width': 'border-width',
+    'border-bottom-width': 'border-width',
+    'border-left-width': 'border-width',
+    'border-style': 'border-style',
+    'border-top-style': 'border-style',
+    'border-right-style': 'border-style',
+    'border-bottom-style': 'border-style',
+    'border-left-style': 'border-style'
+};
+
+function TRBL(name) {
+    this.name = name;
+    this.loc = null;
+    this.iehack = undefined;
+    this.sides = {
+        'top': null,
+        'right': null,
+        'bottom': null,
+        'left': null
+    };
+}
+
+TRBL.prototype.getValueSequence = function(declaration, count) {
+    var values = [];
+    var iehack = '';
+    var hasBadValues = declaration.value.type !== 'Value' || declaration.value.children.some(function(child) {
+        var special = false;
+
+        switch (child.type) {
+            case 'Identifier':
+                switch (child.name) {
+                    case '\\0':
+                    case '\\9':
+                        iehack = child.name;
+                        return;
+
+                    case 'inherit':
+                    case 'initial':
+                    case 'unset':
+                    case 'revert':
+                        special = child.name;
+                        break;
+                }
+                break;
+
+            case 'Dimension':
+                switch (child.unit) {
+                    // is not supported until IE11
+                    case 'rem':
+
+                    // v* units is too buggy across browsers and better
+                    // don't merge values with those units
+                    case 'vw':
+                    case 'vh':
+                    case 'vmin':
+                    case 'vmax':
+                    case 'vm': // IE9 supporting "vm" instead of "vmin".
+                        special = child.unit;
+                        break;
+                }
+                break;
+
+            case 'Hash': // color
+            case 'Number':
+            case 'Percentage':
+                break;
+
+            case 'Function':
+                if (child.name === 'var') {
+                    return true;
+                }
+
+                special = child.name;
+                break;
+
+            case 'WhiteSpace':
+                return false; // ignore space
+
+            default:
+                return true;  // bad value
+        }
+
+        values.push({
+            node: child,
+            special: special,
+            important: declaration.important
+        });
+    });
+
+    if (hasBadValues || values.length > count) {
+        return false;
+    }
+
+    if (typeof this.iehack === 'string' && this.iehack !== iehack) {
+        return false;
+    }
+
+    this.iehack = iehack; // move outside
+
+    return values;
+};
+
+TRBL.prototype.canOverride = function(side, value) {
+    var currentValue = this.sides[side];
+
+    return !currentValue || (value.important && !currentValue.important);
+};
+
+TRBL.prototype.add = function(name, declaration) {
+    function attemptToAdd() {
+        var sides = this.sides;
+        var side = SIDE[name];
+
+        if (side) {
+            if (side in sides === false) {
+                return false;
+            }
+
+            var values = this.getValueSequence(declaration, 1);
+
+            if (!values || !values.length) {
+                return false;
+            }
+
+            // can mix only if specials are equal
+            for (var key in sides) {
+                if (sides[key] !== null && sides[key].special !== values[0].special) {
+                    return false;
+                }
+            }
+
+            if (!this.canOverride(side, values[0])) {
+                return true;
+            }
+
+            sides[side] = values[0];
+            return true;
+        } else if (name === this.name) {
+            var values = this.getValueSequence(declaration, 4);
+
+            if (!values || !values.length) {
+                return false;
+            }
+
+            switch (values.length) {
+                case 1:
+                    values[RIGHT] = values[TOP];
+                    values[BOTTOM] = values[TOP];
+                    values[LEFT] = values[TOP];
+                    break;
+
+                case 2:
+                    values[BOTTOM] = values[TOP];
+                    values[LEFT] = values[RIGHT];
+                    break;
+
+                case 3:
+                    values[LEFT] = values[RIGHT];
+                    break;
+            }
+
+            // can mix only if specials are equal
+            for (var i = 0; i < 4; i++) {
+                for (var key in sides) {
+                    if (sides[key] !== null && sides[key].special !== values[i].special) {
+                        return false;
+                    }
+                }
+            }
+
+            for (var i = 0; i < 4; i++) {
+                if (this.canOverride(SIDES[i], values[i])) {
+                    sides[SIDES[i]] = values[i];
+                }
+            }
+
+            return true;
+        }
+    }
+
+    if (!attemptToAdd.call(this)) {
+        return false;
+    }
+
+    // TODO: use it when we can refer to several points in source
+    // if (this.loc) {
+    //     this.loc = {
+    //         primary: this.loc,
+    //         merged: declaration.loc
+    //     };
+    // } else {
+    //     this.loc = declaration.loc;
+    // }
+    if (!this.loc) {
+        this.loc = declaration.loc;
+    }
+
+    return true;
+};
+
+TRBL.prototype.isOkToMinimize = function() {
+    var top = this.sides.top;
+    var right = this.sides.right;
+    var bottom = this.sides.bottom;
+    var left = this.sides.left;
+
+    if (top && right && bottom && left) {
+        var important =
+            top.important +
+            right.important +
+            bottom.important +
+            left.important;
+
+        return important === 0 || important === 4;
+    }
+
+    return false;
+};
+
+TRBL.prototype.getValue = function() {
+    var result = new List();
+    var sides = this.sides;
+    var values = [
+        sides.top,
+        sides.right,
+        sides.bottom,
+        sides.left
+    ];
+    var stringValues = [
+        generate(sides.top.node),
+        generate(sides.right.node),
+        generate(sides.bottom.node),
+        generate(sides.left.node)
+    ];
+
+    if (stringValues[LEFT] === stringValues[RIGHT]) {
+        values.pop();
+        if (stringValues[BOTTOM] === stringValues[TOP]) {
+            values.pop();
+            if (stringValues[RIGHT] === stringValues[TOP]) {
+                values.pop();
+            }
+        }
+    }
+
+    for (var i = 0; i < values.length; i++) {
+        if (i) {
+            result.appendData({ type: 'WhiteSpace', value: ' ' });
+        }
+
+        result.appendData(values[i].node);
+    }
+
+    if (this.iehack) {
+        result.appendData({ type: 'WhiteSpace', value: ' ' });
+        result.appendData({
+            type: 'Identifier',
+            loc: null,
+            name: this.iehack
+        });
+    }
+
+    return {
+        type: 'Value',
+        loc: null,
+        children: result
+    };
+};
+
+TRBL.prototype.getDeclaration = function() {
+    return {
+        type: 'Declaration',
+        loc: this.loc,
+        important: this.sides.top.important,
+        property: this.name,
+        value: this.getValue()
+    };
+};
+
+function processRule(rule, shorts, shortDeclarations, lastShortSelector) {
+    var declarations = rule.block.children;
+    var selector = rule.prelude.children.first().id;
+
+    rule.block.children.eachRight(function(declaration, item) {
+        var property = declaration.property;
+
+        if (!MAIN_PROPERTY.hasOwnProperty(property)) {
+            return;
+        }
+
+        var key = MAIN_PROPERTY[property];
+        var shorthand;
+        var operation;
+
+        if (!lastShortSelector || selector === lastShortSelector) {
+            if (key in shorts) {
+                operation = REMOVE;
+                shorthand = shorts[key];
+            }
+        }
+
+        if (!shorthand || !shorthand.add(property, declaration)) {
+            operation = REPLACE;
+            shorthand = new TRBL(key);
+
+            // if can't parse value ignore it and break shorthand children
+            if (!shorthand.add(property, declaration)) {
+                lastShortSelector = null;
+                return;
+            }
+        }
+
+        shorts[key] = shorthand;
+        shortDeclarations.push({
+            operation: operation,
+            block: declarations,
+            item: item,
+            shorthand: shorthand
+        });
+
+        lastShortSelector = selector;
+    });
+
+    return lastShortSelector;
+}
+
+function processShorthands(shortDeclarations, markDeclaration) {
+    shortDeclarations.forEach(function(item) {
+        var shorthand = item.shorthand;
+
+        if (!shorthand.isOkToMinimize()) {
+            return;
+        }
+
+        if (item.operation === REPLACE) {
+            item.item.data = markDeclaration(shorthand.getDeclaration());
+        } else {
+            item.block.remove(item.item);
+        }
+    });
+}
+
+module.exports = function restructBlock(ast, indexer) {
+    var stylesheetMap = {};
+    var shortDeclarations = [];
+
+    walk(ast, {
+        visit: 'Rule',
+        reverse: true,
+        enter: function(node) {
+            var stylesheet = this.block || this.stylesheet;
+            var ruleId = (node.pseudoSignature || '') + '|' + node.prelude.children.first().id;
+            var ruleMap;
+            var shorts;
+
+            if (!stylesheetMap.hasOwnProperty(stylesheet.id)) {
+                ruleMap = {
+                    lastShortSelector: null
+                };
+                stylesheetMap[stylesheet.id] = ruleMap;
+            } else {
+                ruleMap = stylesheetMap[stylesheet.id];
+            }
+
+            if (ruleMap.hasOwnProperty(ruleId)) {
+                shorts = ruleMap[ruleId];
+            } else {
+                shorts = {};
+                ruleMap[ruleId] = shorts;
+            }
+
+            ruleMap.lastShortSelector = processRule.call(this, node, shorts, shortDeclarations, ruleMap.lastShortSelector);
+        }
+    });
+
+    processShorthands(shortDeclarations, indexer.declaration);
+};
diff --git a/node_modules/csso/lib/restructure/6-restructBlock.js b/node_modules/csso/lib/restructure/6-restructBlock.js
new file mode 100644
index 0000000..3864516
--- /dev/null
+++ b/node_modules/csso/lib/restructure/6-restructBlock.js
@@ -0,0 +1,300 @@
+var resolveProperty = require('css-tree').property;
+var resolveKeyword = require('css-tree').keyword;
+var walk = require('css-tree').walk;
+var generate = require('css-tree').generate;
+var fingerprintId = 1;
+var dontRestructure = {
+    'src': 1 // https://github.com/afelix/csso/issues/50
+};
+
+var DONT_MIX_VALUE = {
+    // https://developer.mozilla.org/en-US/docs/Web/CSS/display#Browser_compatibility
+    'display': /table|ruby|flex|-(flex)?box$|grid|contents|run-in/i,
+    // https://developer.mozilla.org/en/docs/Web/CSS/text-align
+    'text-align': /^(start|end|match-parent|justify-all)$/i
+};
+
+var SAFE_VALUES = {
+    cursor: [
+        'auto', 'crosshair', 'default', 'move', 'text', 'wait', 'help',
+        'n-resize', 'e-resize', 's-resize', 'w-resize',
+        'ne-resize', 'nw-resize', 'se-resize', 'sw-resize',
+        'pointer', 'progress', 'not-allowed', 'no-drop', 'vertical-text', 'all-scroll',
+        'col-resize', 'row-resize'
+    ],
+    overflow: [
+        'hidden', 'visible', 'scroll', 'auto'
+    ],
+    position: [
+        'static', 'relative', 'absolute', 'fixed'
+    ]
+};
+
+var NEEDLESS_TABLE = {
+    'border-width': ['border'],
+    'border-style': ['border'],
+    'border-color': ['border'],
+    'border-top': ['border'],
+    'border-right': ['border'],
+    'border-bottom': ['border'],
+    'border-left': ['border'],
+    'border-top-width': ['border-top', 'border-width', 'border'],
+    'border-right-width': ['border-right', 'border-width', 'border'],
+    'border-bottom-width': ['border-bottom', 'border-width', 'border'],
+    'border-left-width': ['border-left', 'border-width', 'border'],
+    'border-top-style': ['border-top', 'border-style', 'border'],
+    'border-right-style': ['border-right', 'border-style', 'border'],
+    'border-bottom-style': ['border-bottom', 'border-style', 'border'],
+    'border-left-style': ['border-left', 'border-style', 'border'],
+    'border-top-color': ['border-top', 'border-color', 'border'],
+    'border-right-color': ['border-right', 'border-color', 'border'],
+    'border-bottom-color': ['border-bottom', 'border-color', 'border'],
+    'border-left-color': ['border-left', 'border-color', 'border'],
+    'margin-top': ['margin'],
+    'margin-right': ['margin'],
+    'margin-bottom': ['margin'],
+    'margin-left': ['margin'],
+    'padding-top': ['padding'],
+    'padding-right': ['padding'],
+    'padding-bottom': ['padding'],
+    'padding-left': ['padding'],
+    'font-style': ['font'],
+    'font-variant': ['font'],
+    'font-weight': ['font'],
+    'font-size': ['font'],
+    'font-family': ['font'],
+    'list-style-type': ['list-style'],
+    'list-style-position': ['list-style'],
+    'list-style-image': ['list-style']
+};
+
+function getPropertyFingerprint(propertyName, declaration, fingerprints) {
+    var realName = resolveProperty(propertyName).basename;
+
+    if (realName === 'background') {
+        return propertyName + ':' + generate(declaration.value);
+    }
+
+    var declarationId = declaration.id;
+    var fingerprint = fingerprints[declarationId];
+
+    if (!fingerprint) {
+        switch (declaration.value.type) {
+            case 'Value':
+                var vendorId = '';
+                var iehack = '';
+                var special = {};
+                var raw = false;
+
+                declaration.value.children.each(function walk(node) {
+                    switch (node.type) {
+                        case 'Value':
+                        case 'Brackets':
+                        case 'Parentheses':
+                            node.children.each(walk);
+                            break;
+
+                        case 'Raw':
+                            raw = true;
+                            break;
+
+                        case 'Identifier':
+                            var name = node.name;
+
+                            if (!vendorId) {
+                                vendorId = resolveKeyword(name).vendor;
+                            }
+
+                            if (/\\[09]/.test(name)) {
+                                iehack = RegExp.lastMatch;
+                            }
+
+                            if (SAFE_VALUES.hasOwnProperty(realName)) {
+                                if (SAFE_VALUES[realName].indexOf(name) === -1) {
+                                    special[name] = true;
+                                }
+                            } else if (DONT_MIX_VALUE.hasOwnProperty(realName)) {
+                                if (DONT_MIX_VALUE[realName].test(name)) {
+                                    special[name] = true;
+                                }
+                            }
+
+                            break;
+
+                        case 'Function':
+                            var name = node.name;
+
+                            if (!vendorId) {
+                                vendorId = resolveKeyword(name).vendor;
+                            }
+
+                            if (name === 'rect') {
+                                // there are 2 forms of rect:
+                                //   rect(<top>, <right>, <bottom>, <left>) - standart
+                                //   rect(<top> <right> <bottom> <left>) – backwards compatible syntax
+                                // only the same form values can be merged
+                                var hasComma = node.children.some(function(node) {
+                                    return node.type === 'Operator' && node.value === ',';
+                                });
+                                if (!hasComma) {
+                                    name = 'rect-backward';
+                                }
+                            }
+
+                            special[name + '()'] = true;
+
+                            // check nested tokens too
+                            node.children.each(walk);
+
+                            break;
+
+                        case 'Dimension':
+                            var unit = node.unit;
+
+                            if (/\\[09]/.test(unit)) {
+                                iehack = RegExp.lastMatch;
+                            }
+
+                            switch (unit) {
+                                // is not supported until IE11
+                                case 'rem':
+
+                                // v* units is too buggy across browsers and better
+                                // don't merge values with those units
+                                case 'vw':
+                                case 'vh':
+                                case 'vmin':
+                                case 'vmax':
+                                case 'vm': // IE9 supporting "vm" instead of "vmin".
+                                    special[unit] = true;
+                                    break;
+                            }
+                            break;
+                    }
+                });
+
+                fingerprint = raw
+                    ? '!' + fingerprintId++
+                    : '!' + Object.keys(special).sort() + '|' + iehack + vendorId;
+                break;
+
+            case 'Raw':
+                fingerprint = '!' + declaration.value.value;
+                break;
+
+            default:
+                fingerprint = generate(declaration.value);
+        }
+
+        fingerprints[declarationId] = fingerprint;
+    }
+
+    return propertyName + fingerprint;
+}
+
+function needless(props, declaration, fingerprints) {
+    var property = resolveProperty(declaration.property);
+
+    if (NEEDLESS_TABLE.hasOwnProperty(property.basename)) {
+        var table = NEEDLESS_TABLE[property.basename];
+
+        for (var i = 0; i < table.length; i++) {
+            var ppre = getPropertyFingerprint(property.prefix + table[i], declaration, fingerprints);
+            var prev = props.hasOwnProperty(ppre) ? props[ppre] : null;
+
+            if (prev && (!declaration.important || prev.item.data.important)) {
+                return prev;
+            }
+        }
+    }
+}
+
+function processRule(rule, item, list, props, fingerprints) {
+    var declarations = rule.block.children;
+
+    declarations.eachRight(function(declaration, declarationItem) {
+        var property = declaration.property;
+        var fingerprint = getPropertyFingerprint(property, declaration, fingerprints);
+        var prev = props[fingerprint];
+
+        if (prev && !dontRestructure.hasOwnProperty(property)) {
+            if (declaration.important && !prev.item.data.important) {
+                props[fingerprint] = {
+                    block: declarations,
+                    item: declarationItem
+                };
+
+                prev.block.remove(prev.item);
+
+                // TODO: use it when we can refer to several points in source
+                // declaration.loc = {
+                //     primary: declaration.loc,
+                //     merged: prev.item.data.loc
+                // };
+            } else {
+                declarations.remove(declarationItem);
+
+                // TODO: use it when we can refer to several points in source
+                // prev.item.data.loc = {
+                //     primary: prev.item.data.loc,
+                //     merged: declaration.loc
+                // };
+            }
+        } else {
+            var prev = needless(props, declaration, fingerprints);
+
+            if (prev) {
+                declarations.remove(declarationItem);
+
+                // TODO: use it when we can refer to several points in source
+                // prev.item.data.loc = {
+                //     primary: prev.item.data.loc,
+                //     merged: declaration.loc
+                // };
+            } else {
+                declaration.fingerprint = fingerprint;
+
+                props[fingerprint] = {
+                    block: declarations,
+                    item: declarationItem
+                };
+            }
+        }
+    });
+
+    if (declarations.isEmpty()) {
+        list.remove(item);
+    }
+}
+
+module.exports = function restructBlock(ast) {
+    var stylesheetMap = {};
+    var fingerprints = Object.create(null);
+
+    walk(ast, {
+        visit: 'Rule',
+        reverse: true,
+        enter: function(node, item, list) {
+            var stylesheet = this.block || this.stylesheet;
+            var ruleId = (node.pseudoSignature || '') + '|' + node.prelude.children.first().id;
+            var ruleMap;
+            var props;
+
+            if (!stylesheetMap.hasOwnProperty(stylesheet.id)) {
+                ruleMap = {};
+                stylesheetMap[stylesheet.id] = ruleMap;
+            } else {
+                ruleMap = stylesheetMap[stylesheet.id];
+            }
+
+            if (ruleMap.hasOwnProperty(ruleId)) {
+                props = ruleMap[ruleId];
+            } else {
+                props = {};
+                ruleMap[ruleId] = props;
+            }
+
+            processRule.call(this, node, item, list, props, fingerprints);
+        }
+    });
+};
diff --git a/node_modules/csso/lib/restructure/7-mergeRuleset.js b/node_modules/csso/lib/restructure/7-mergeRuleset.js
new file mode 100644
index 0000000..575e959
--- /dev/null
+++ b/node_modules/csso/lib/restructure/7-mergeRuleset.js
@@ -0,0 +1,86 @@
+var walk = require('css-tree').walk;
+var utils = require('./utils');
+
+/*
+    At this step all rules has single simple selector. We try to join by equal
+    declaration blocks to first rule, e.g.
+
+    .a { color: red }
+    b { ... }
+    .b { color: red }
+    ->
+    .a, .b { color: red }
+    b { ... }
+*/
+
+function processRule(node, item, list) {
+    var selectors = node.prelude.children;
+    var declarations = node.block.children;
+    var nodeCompareMarker = selectors.first().compareMarker;
+    var skippedCompareMarkers = {};
+
+    list.nextUntil(item.next, function(next, nextItem) {
+        // skip non-ruleset node if safe
+        if (next.type !== 'Rule') {
+            return utils.unsafeToSkipNode.call(selectors, next);
+        }
+
+        if (node.pseudoSignature !== next.pseudoSignature) {
+            return true;
+        }
+
+        var nextFirstSelector = next.prelude.children.head;
+        var nextDeclarations = next.block.children;
+        var nextCompareMarker = nextFirstSelector.data.compareMarker;
+
+        // if next ruleset has same marked as one of skipped then stop joining
+        if (nextCompareMarker in skippedCompareMarkers) {
+            return true;
+        }
+
+        // try to join by selectors
+        if (selectors.head === selectors.tail) {
+            if (selectors.first().id === nextFirstSelector.data.id) {
+                declarations.appendList(nextDeclarations);
+                list.remove(nextItem);
+                return;
+            }
+        }
+
+        // try to join by properties
+        if (utils.isEqualDeclarations(declarations, nextDeclarations)) {
+            var nextStr = nextFirstSelector.data.id;
+
+            selectors.some(function(data, item) {
+                var curStr = data.id;
+
+                if (nextStr < curStr) {
+                    selectors.insert(nextFirstSelector, item);
+                    return true;
+                }
+
+                if (!item.next) {
+                    selectors.insert(nextFirstSelector);
+                    return true;
+                }
+            });
+
+            list.remove(nextItem);
+            return;
+        }
+
+        // go to next ruleset if current one can be skipped (has no equal specificity nor element selector)
+        if (nextCompareMarker === nodeCompareMarker) {
+            return true;
+        }
+
+        skippedCompareMarkers[nextCompareMarker] = true;
+    });
+}
+
+module.exports = function mergeRule(ast) {
+    walk(ast, {
+        visit: 'Rule',
+        enter: processRule
+    });
+};
diff --git a/node_modules/csso/lib/restructure/8-restructRuleset.js b/node_modules/csso/lib/restructure/8-restructRuleset.js
new file mode 100644
index 0000000..111ae98
--- /dev/null
+++ b/node_modules/csso/lib/restructure/8-restructRuleset.js
@@ -0,0 +1,177 @@
+var List = require('css-tree').List;
+var walk = require('css-tree').walk;
+var utils = require('./utils');
+
+function calcSelectorLength(list) {
+    var length = 0;
+
+    list.each(function(data) {
+        length += data.id.length + 1;
+    });
+
+    return length - 1;
+}
+
+function calcDeclarationsLength(tokens) {
+    var length = 0;
+
+    for (var i = 0; i < tokens.length; i++) {
+        length += tokens[i].length;
+    }
+
+    return (
+        length +          // declarations
+        tokens.length - 1 // delimeters
+    );
+}
+
+function processRule(node, item, list) {
+    var avoidRulesMerge = this.block !== null ? this.block.avoidRulesMerge : false;
+    var selectors = node.prelude.children;
+    var block = node.block;
+    var disallowDownMarkers = Object.create(null);
+    var allowMergeUp = true;
+    var allowMergeDown = true;
+
+    list.prevUntil(item.prev, function(prev, prevItem) {
+        var prevBlock = prev.block;
+        var prevType = prev.type;
+
+        if (prevType !== 'Rule') {
+            var unsafe = utils.unsafeToSkipNode.call(selectors, prev);
+
+            if (!unsafe && prevType === 'Atrule' && prevBlock) {
+                walk(prevBlock, {
+                    visit: 'Rule',
+                    enter: function(node) {
+                        node.prelude.children.each(function(data) {
+                            disallowDownMarkers[data.compareMarker] = true;
+                        });
+                    }
+                });
+            }
+
+            return unsafe;
+        }
+
+        var prevSelectors = prev.prelude.children;
+
+        if (node.pseudoSignature !== prev.pseudoSignature) {
+            return true;
+        }
+
+        allowMergeDown = !prevSelectors.some(function(selector) {
+            return selector.compareMarker in disallowDownMarkers;
+        });
+
+        // try prev ruleset if simpleselectors has no equal specifity and element selector
+        if (!allowMergeDown && !allowMergeUp) {
+            return true;
+        }
+
+        // try to join by selectors
+        if (allowMergeUp && utils.isEqualSelectors(prevSelectors, selectors)) {
+            prevBlock.children.appendList(block.children);
+            list.remove(item);
+            return true;
+        }
+
+        // try to join by properties
+        var diff = utils.compareDeclarations(block.children, prevBlock.children);
+
+        // console.log(diff.eq, diff.ne1, diff.ne2);
+
+        if (diff.eq.length) {
+            if (!diff.ne1.length && !diff.ne2.length) {
+                // equal blocks
+                if (allowMergeDown) {
+                    utils.addSelectors(selectors, prevSelectors);
+                    list.remove(prevItem);
+                }
+
+                return true;
+            } else if (!avoidRulesMerge) { /* probably we don't need to prevent those merges for @keyframes
+                                              TODO: need to be checked */
+
+                if (diff.ne1.length && !diff.ne2.length) {
+                    // prevBlock is subset block
+                    var selectorLength = calcSelectorLength(selectors);
+                    var blockLength = calcDeclarationsLength(diff.eq); // declarations length
+
+                    if (allowMergeUp && selectorLength < blockLength) {
+                        utils.addSelectors(prevSelectors, selectors);
+                        block.children = new List().fromArray(diff.ne1);
+                    }
+                } else if (!diff.ne1.length && diff.ne2.length) {
+                    // node is subset of prevBlock
+                    var selectorLength = calcSelectorLength(prevSelectors);
+                    var blockLength = calcDeclarationsLength(diff.eq); // declarations length
+
+                    if (allowMergeDown && selectorLength < blockLength) {
+                        utils.addSelectors(selectors, prevSelectors);
+                        prevBlock.children = new List().fromArray(diff.ne2);
+                    }
+                } else {
+                    // diff.ne1.length && diff.ne2.length
+                    // extract equal block
+                    var newSelector = {
+                        type: 'SelectorList',
+                        loc: null,
+                        children: utils.addSelectors(prevSelectors.copy(), selectors)
+                    };
+                    var newBlockLength = calcSelectorLength(newSelector.children) + 2; // selectors length + curly braces length
+                    var blockLength = calcDeclarationsLength(diff.eq); // declarations length
+
+                    // create new ruleset if declarations length greater than
+                    // ruleset description overhead
+                    if (blockLength >= newBlockLength) {
+                        var newItem = list.createItem({
+                            type: 'Rule',
+                            loc: null,
+                            prelude: newSelector,
+                            block: {
+                                type: 'Block',
+                                loc: null,
+                                children: new List().fromArray(diff.eq)
+                            },
+                            pseudoSignature: node.pseudoSignature
+                        });
+
+                        block.children = new List().fromArray(diff.ne1);
+                        prevBlock.children = new List().fromArray(diff.ne2overrided);
+
+                        if (allowMergeUp) {
+                            list.insert(newItem, prevItem);
+                        } else {
+                            list.insert(newItem, item);
+                        }
+
+                        return true;
+                    }
+                }
+            }
+        }
+
+        if (allowMergeUp) {
+            // TODO: disallow up merge only if any property interception only (i.e. diff.ne2overrided.length > 0);
+            // await property families to find property interception correctly
+            allowMergeUp = !prevSelectors.some(function(prevSelector) {
+                return selectors.some(function(selector) {
+                    return selector.compareMarker === prevSelector.compareMarker;
+                });
+            });
+        }
+
+        prevSelectors.each(function(data) {
+            disallowDownMarkers[data.compareMarker] = true;
+        });
+    });
+}
+
+module.exports = function restructRule(ast) {
+    walk(ast, {
+        visit: 'Rule',
+        reverse: true,
+        enter: processRule
+    });
+};
diff --git a/node_modules/csso/lib/restructure/index.js b/node_modules/csso/lib/restructure/index.js
new file mode 100644
index 0000000..e00f6cb
--- /dev/null
+++ b/node_modules/csso/lib/restructure/index.js
@@ -0,0 +1,35 @@
+var prepare = require('./prepare/index');
+var mergeAtrule = require('./1-mergeAtrule');
+var initialMergeRuleset = require('./2-initialMergeRuleset');
+var disjoinRuleset = require('./3-disjoinRuleset');
+var restructShorthand = require('./4-restructShorthand');
+var restructBlock = require('./6-restructBlock');
+var mergeRuleset = require('./7-mergeRuleset');
+var restructRuleset = require('./8-restructRuleset');
+
+module.exports = function(ast, options) {
+    // prepare ast for restructing
+    var indexer = prepare(ast, options);
+    options.logger('prepare', ast);
+
+    mergeAtrule(ast, options);
+    options.logger('mergeAtrule', ast);
+
+    initialMergeRuleset(ast);
+    options.logger('initialMergeRuleset', ast);
+
+    disjoinRuleset(ast);
+    options.logger('disjoinRuleset', ast);
+
+    restructShorthand(ast, indexer);
+    options.logger('restructShorthand', ast);
+
+    restructBlock(ast);
+    options.logger('restructBlock', ast);
+
+    mergeRuleset(ast);
+    options.logger('mergeRuleset', ast);
+
+    restructRuleset(ast);
+    options.logger('restructRuleset', ast);
+};
diff --git a/node_modules/csso/lib/restructure/prepare/createDeclarationIndexer.js b/node_modules/csso/lib/restructure/prepare/createDeclarationIndexer.js
new file mode 100644
index 0000000..80c551d
--- /dev/null
+++ b/node_modules/csso/lib/restructure/prepare/createDeclarationIndexer.js
@@ -0,0 +1,31 @@
+var generate = require('css-tree').generate;
+
+function Index() {
+    this.seed = 0;
+    this.map = Object.create(null);
+}
+
+Index.prototype.resolve = function(str) {
+    var index = this.map[str];
+
+    if (!index) {
+        index = ++this.seed;
+        this.map[str] = index;
+    }
+
+    return index;
+};
+
+module.exports = function createDeclarationIndexer() {
+    var ids = new Index();
+
+    return function markDeclaration(node) {
+        var id = generate(node);
+
+        node.id = ids.resolve(id);
+        node.length = id.length;
+        node.fingerprint = null;
+
+        return node;
+    };
+};
diff --git a/node_modules/csso/lib/restructure/prepare/index.js b/node_modules/csso/lib/restructure/prepare/index.js
new file mode 100644
index 0000000..a1fd335
--- /dev/null
+++ b/node_modules/csso/lib/restructure/prepare/index.js
@@ -0,0 +1,43 @@
+var resolveKeyword = require('css-tree').keyword;
+var walk = require('css-tree').walk;
+var generate = require('css-tree').generate;
+var createDeclarationIndexer = require('./createDeclarationIndexer');
+var processSelector = require('./processSelector');
+
+module.exports = function prepare(ast, options) {
+    var markDeclaration = createDeclarationIndexer();
+
+    walk(ast, {
+        visit: 'Rule',
+        enter: function processRule(node) {
+            node.block.children.each(markDeclaration);
+            processSelector(node, options.usage);
+        }
+    });
+
+    walk(ast, {
+        visit: 'Atrule',
+        enter: function(node) {
+            if (node.prelude) {
+                node.prelude.id = null; // pre-init property to avoid multiple hidden class for generate
+                node.prelude.id = generate(node.prelude);
+            }
+
+            // compare keyframe selectors by its values
+            // NOTE: still no clarification about problems with keyframes selector grouping (issue #197)
+            if (resolveKeyword(node.name).basename === 'keyframes') {
+                node.block.avoidRulesMerge = true;  /* probably we don't need to prevent those merges for @keyframes
+                                                       TODO: need to be checked */
+                node.block.children.each(function(rule) {
+                    rule.prelude.children.each(function(simpleselector) {
+                        simpleselector.compareMarker = simpleselector.id;
+                    });
+                });
+            }
+        }
+    });
+
+    return {
+        declaration: markDeclaration
+    };
+};
diff --git a/node_modules/csso/lib/restructure/prepare/processSelector.js b/node_modules/csso/lib/restructure/prepare/processSelector.js
new file mode 100644
index 0000000..3db19ab
--- /dev/null
+++ b/node_modules/csso/lib/restructure/prepare/processSelector.js
@@ -0,0 +1,94 @@
+var generate = require('css-tree').generate;
+var specificity = require('./specificity');
+
+var nonFreezePseudoElements = {
+    'first-letter': true,
+    'first-line': true,
+    'after': true,
+    'before': true
+};
+var nonFreezePseudoClasses = {
+    'link': true,
+    'visited': true,
+    'hover': true,
+    'active': true,
+    'first-letter': true,
+    'first-line': true,
+    'after': true,
+    'before': true
+};
+
+module.exports = function freeze(node, usageData) {
+    var pseudos = Object.create(null);
+    var hasPseudo = false;
+
+    node.prelude.children.each(function(simpleSelector) {
+        var tagName = '*';
+        var scope = 0;
+
+        simpleSelector.children.each(function(node) {
+            switch (node.type) {
+                case 'ClassSelector':
+                    if (usageData && usageData.scopes) {
+                        var classScope = usageData.scopes[node.name] || 0;
+
+                        if (scope !== 0 && classScope !== scope) {
+                            throw new Error('Selector can\'t has classes from different scopes: ' + generate(simpleSelector));
+                        }
+
+                        scope = classScope;
+                    }
+                    break;
+
+                case 'PseudoClassSelector':
+                    var name = node.name.toLowerCase();
+
+                    if (!nonFreezePseudoClasses.hasOwnProperty(name)) {
+                        pseudos[':' + name] = true;
+                        hasPseudo = true;
+                    }
+                    break;
+
+                case 'PseudoElementSelector':
+                    var name = node.name.toLowerCase();
+
+                    if (!nonFreezePseudoElements.hasOwnProperty(name)) {
+                        pseudos['::' + name] = true;
+                        hasPseudo = true;
+                    }
+                    break;
+
+                case 'TypeSelector':
+                    tagName = node.name.toLowerCase();
+                    break;
+
+                case 'AttributeSelector':
+                    if (node.flags) {
+                        pseudos['[' + node.flags.toLowerCase() + ']'] = true;
+                        hasPseudo = true;
+                    }
+                    break;
+
+                case 'WhiteSpace':
+                case 'Combinator':
+                    tagName = '*';
+                    break;
+            }
+        });
+
+        simpleSelector.compareMarker = specificity(simpleSelector).toString();
+        simpleSelector.id = null; // pre-init property to avoid multiple hidden class
+        simpleSelector.id = generate(simpleSelector);
+
+        if (scope) {
+            simpleSelector.compareMarker += ':' + scope;
+        }
+
+        if (tagName !== '*') {
+            simpleSelector.compareMarker += ',' + tagName;
+        }
+    });
+
+    // add property to all rule nodes to avoid multiple hidden class
+    node.pseudoSignature = hasPseudo && Object.keys(pseudos).sort().join(',');
+};
diff --git a/node_modules/csso/lib/restructure/prepare/specificity.js b/node_modules/csso/lib/restructure/prepare/specificity.js
new file mode 100644
index 0000000..104a18a
--- /dev/null
+++ b/node_modules/csso/lib/restructure/prepare/specificity.js
@@ -0,0 +1,56 @@
+module.exports = function specificity(simpleSelector) {
+    var A = 0;
+    var B = 0;
+    var C = 0;
+
+    simpleSelector.children.each(function walk(node) {
+        switch (node.type) {
+            case 'SelectorList':
+            case 'Selector':
+                node.children.each(walk);
+                break;
+
+            case 'IdSelector':
+                A++;
+                break;
+
+            case 'ClassSelector':
+            case 'AttributeSelector':
+                B++;
+                break;
+
+            case 'PseudoClassSelector':
+                switch (node.name.toLowerCase()) {
+                    case 'not':
+                        node.children.each(walk);
+                        break;
+
+                    case 'before':
+                    case 'after':
+                    case 'first-line':
+                    case 'first-letter':
+                        C++;
+                        break;
+
+                    // TODO: support for :nth-*(.. of <SelectorList>), :matches(), :has()
+                    default:
+                        B++;
+                }
+                break;
+
+            case 'PseudoElementSelector':
+                C++;
+                break;
+
+            case 'TypeSelector':
+                // ignore universal selector
+                if (node.name.charAt(node.name.length - 1) !== '*') {
+                    C++;
+                }
+                break;
+
+        }
+    });
+
+    return [A, B, C];
+};
diff --git a/node_modules/csso/lib/restructure/utils.js b/node_modules/csso/lib/restructure/utils.js
new file mode 100644
index 0000000..bdc3471
--- /dev/null
+++ b/node_modules/csso/lib/restructure/utils.js
@@ -0,0 +1,151 @@
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+function isEqualSelectors(a, b) {
+    var cursor1 = a.head;
+    var cursor2 = b.head;
+
+    while (cursor1 !== null && cursor2 !== null && cursor1.data.id === cursor2.data.id) {
+        cursor1 = cursor1.next;
+        cursor2 = cursor2.next;
+    }
+
+    return cursor1 === null && cursor2 === null;
+}
+
+function isEqualDeclarations(a, b) {
+    var cursor1 = a.head;
+    var cursor2 = b.head;
+
+    while (cursor1 !== null && cursor2 !== null && cursor1.data.id === cursor2.data.id) {
+        cursor1 = cursor1.next;
+        cursor2 = cursor2.next;
+    }
+
+    return cursor1 === null && cursor2 === null;
+}
+
+function compareDeclarations(declarations1, declarations2) {
+    var result = {
+        eq: [],
+        ne1: [],
+        ne2: [],
+        ne2overrided: []
+    };
+
+    var fingerprints = Object.create(null);
+    var declarations2hash = Object.create(null);
+
+    for (var cursor = declarations2.head; cursor; cursor = cursor.next)  {
+        declarations2hash[cursor.data.id] = true;
+    }
+
+    for (var cursor = declarations1.head; cursor; cursor = cursor.next)  {
+        var data = cursor.data;
+
+        if (data.fingerprint) {
+            fingerprints[data.fingerprint] = data.important;
+        }
+
+        if (declarations2hash[data.id]) {
+            declarations2hash[data.id] = false;
+            result.eq.push(data);
+        } else {
+            result.ne1.push(data);
+        }
+    }
+
+    for (var cursor = declarations2.head; cursor; cursor = cursor.next)  {
+        var data = cursor.data;
+
+        if (declarations2hash[data.id]) {
+            // when declarations1 has an overriding declaration, this is not a difference
+            // unless no !important is used on prev and !important is used on the following
+            if (!hasOwnProperty.call(fingerprints, data.fingerprint) ||
+                (!fingerprints[data.fingerprint] && data.important)) {
+                result.ne2.push(data);
+            }
+
+            result.ne2overrided.push(data);
+        }
+    }
+
+    return result;
+}
+
+function addSelectors(dest, source) {
+    source.each(function(sourceData) {
+        var newStr = sourceData.id;
+        var cursor = dest.head;
+
+        while (cursor) {
+            var nextStr = cursor.data.id;
+
+            if (nextStr === newStr) {
+                return;
+            }
+
+            if (nextStr > newStr) {
+                break;
+            }
+
+            cursor = cursor.next;
+        }
+
+        dest.insert(dest.createItem(sourceData), cursor);
+    });
+
+    return dest;
+}
+
+// check if simpleselectors has no equal specificity and element selector
+function hasSimilarSelectors(selectors1, selectors2) {
+    var cursor1 = selectors1.head;
+
+    while (cursor1 !== null) {
+        var cursor2 = selectors2.head;
+
+        while (cursor2 !== null) {
+            if (cursor1.data.compareMarker === cursor2.data.compareMarker) {
+                return true;
+            }
+
+            cursor2 = cursor2.next;
+        }
+
+        cursor1 = cursor1.next;
+    }
+
+    return false;
+}
+
+// test node can't to be skipped
+function unsafeToSkipNode(node) {
+    switch (node.type) {
+        case 'Rule':
+            // unsafe skip ruleset with selector similarities
+            return hasSimilarSelectors(node.prelude.children, this);
+
+        case 'Atrule':
+            // can skip at-rules with blocks
+            if (node.block) {
+                // unsafe skip at-rule if block contains something unsafe to skip
+                return node.block.children.some(unsafeToSkipNode, this);
+            }
+            break;
+
+        case 'Declaration':
+            return false;
+    }
+
+    // unsafe by default
+    return true;
+}
+
+module.exports = {
+    isEqualSelectors: isEqualSelectors,
+    isEqualDeclarations: isEqualDeclarations,
+    compareDeclarations: compareDeclarations,
+    addSelectors: addSelectors,
+    hasSimilarSelectors: hasSimilarSelectors,
+    unsafeToSkipNode: unsafeToSkipNode
+};
diff --git a/node_modules/csso/lib/usage.js b/node_modules/csso/lib/usage.js
new file mode 100644
index 0000000..40b3ddb
--- /dev/null
+++ b/node_modules/csso/lib/usage.js
@@ -0,0 +1,79 @@
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+function buildMap(list, caseInsensitive) {
+    var map = Object.create(null);
+
+    if (!Array.isArray(list)) {
+        return null;
+    }
+
+    for (var i = 0; i < list.length; i++) {
+        var name = list[i];
+
+        if (caseInsensitive) {
+            name = name.toLowerCase();
+        }
+
+        map[name] = true;
+    }
+
+    return map;
+}
+
+function buildList(data) {
+    if (!data) {
+        return null;
+    }
+
+    var tags = buildMap(data.tags, true);
+    var ids = buildMap(data.ids);
+    var classes = buildMap(data.classes);
+
+    if (tags === null &&
+        ids === null &&
+        classes === null) {
+        return null;
+    }
+
+    return {
+        tags: tags,
+        ids: ids,
+        classes: classes
+    };
+}
+
+function buildIndex(data) {
+    var scopes = false;
+
+    if (data.scopes && Array.isArray(data.scopes)) {
+        scopes = Object.create(null);
+
+        for (var i = 0; i < data.scopes.length; i++) {
+            var list = data.scopes[i];
+
+            if (!list || !Array.isArray(list)) {
+                throw new Error('Wrong usage format');
+            }
+
+            for (var j = 0; j < list.length; j++) {
+                var name = list[j];
+
+                if (hasOwnProperty.call(scopes, name)) {
+                    throw new Error('Class can\'t be used for several scopes: ' + name);
+                }
+
+                scopes[name] = i + 1;
+            }
+        }
+    }
+
+    return {
+        whitelist: buildList(data),
+        blacklist: buildList(data.blacklist),
+        scopes: scopes
+    };
+}
+
+module.exports = {
+    buildIndex: buildIndex
+};
diff --git a/node_modules/csso/package.json b/node_modules/csso/package.json
new file mode 100644
index 0000000..e4485e6
--- /dev/null
+++ b/node_modules/csso/package.json
@@ -0,0 +1,65 @@
+{
+  "name": "csso",
+  "version": "4.2.0",
+  "description": "CSS minifier with structural optimisations",
+  "homepage": "https://github.com/css/csso",
+  "author": "Sergey Kryzhanovsky <skryzhanovsky@ya.ru> (https://github.com/afelix)",
+  "maintainers": [
+    {
+      "name": "Roman Dvornov",
+      "email": "rdvornov@gmail.com",
+      "github-username": "lahmatiy"
+    }
+  ],
+  "license": "MIT",
+  "repository": "css/csso",
+  "bugs": {
+    "url": "https://github.com/css/csso/issues"
+  },
+  "keywords": [
+    "css",
+    "compress",
+    "minifier",
+    "minify",
+    "optimise",
+    "optimisation",
+    "csstree"
+  ],
+  "main": "./lib/index",
+  "scripts": {
+    "test": "mocha --reporter dot",
+    "lint": "eslint lib test",
+    "lint-and-test": "npm run lint && npm test",
+    "build": "rollup --config && terser dist/csso.js --compress --mangle -o dist/csso.min.js",
+    "coverage": "nyc npm test",
+    "coveralls": "nyc report --reporter=text-lcov | coveralls",
+    "travis": "nyc npm run lint-and-test && npm run coveralls",
+    "hydrogen": "node --trace-hydrogen --trace-phase=Z --trace-deopt --code-comments --hydrogen-track-positions --redirect-code-traces --redirect-code-traces-to=code.asm --trace_hydrogen_file=code.cfg --print-opt-code bin/csso --stat -o /dev/null",
+    "prepublishOnly": "npm run build"
+  },
+  "dependencies": {
+    "css-tree": "^1.1.2"
+  },
+  "browser": {
+    "css-tree": "css-tree/dist/csstree.min.js"
+  },
+  "devDependencies": {
+    "@rollup/plugin-commonjs": "^11.0.1",
+    "@rollup/plugin-json": "^4.0.1",
+    "@rollup/plugin-node-resolve": "^7.0.0",
+    "coveralls": "^3.0.11",
+    "eslint": "^6.8.0",
+    "mocha": "^7.1.1",
+    "nyc": "^15.0.0",
+    "rollup": "^1.29.0",
+    "source-map": "^0.6.1",
+    "terser": "^4.6.3"
+  },
+  "engines": {
+    "node": ">=8.0.0"
+  },
+  "files": [
+    "dist",
+    "lib"
+  ]
+}
diff --git a/node_modules/mdn-data/LICENSE b/node_modules/mdn-data/LICENSE
new file mode 100644
index 0000000..670154e
--- /dev/null
+++ b/node_modules/mdn-data/LICENSE
@@ -0,0 +1,116 @@
+CC0 1.0 Universal
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator and
+subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for the
+purpose of contributing to a commons of creative, cultural and scientific
+works ("Commons") that the public can reliably and without fear of later
+claims of infringement build upon, modify, incorporate in other works, reuse
+and redistribute as freely as possible in any form whatsoever and for any
+purposes, including without limitation commercial purposes. These owners may
+contribute to the Commons to promote the ideal of a free culture and the
+further production of creative, cultural and scientific works, or to gain
+reputation or greater distribution for their Work in part through the use and
+efforts of others.
+
+For these and/or other purposes and motivations, and without any expectation
+of additional consideration or compensation, the person associating CC0 with a
+Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
+and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
+and publicly distribute the Work under its terms, with knowledge of his or her
+Copyright and Related Rights in the Work and the meaning and intended legal
+effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not limited
+to, the following:
+
+  i. the right to reproduce, adapt, distribute, perform, display, communicate,
+  and translate a Work;
+
+  ii. moral rights retained by the original author(s) and/or performer(s);
+
+  iii. publicity and privacy rights pertaining to a person's image or likeness
+  depicted in a Work;
+
+  iv. rights protecting against unfair competition in regards to a Work,
+  subject to the limitations in paragraph 4(a), below;
+
+  v. rights protecting the extraction, dissemination, use and reuse of data in
+  a Work;
+
+  vi. database rights (such as those arising under Directive 96/9/EC of the
+  European Parliament and of the Council of 11 March 1996 on the legal
+  protection of databases, and under any national implementation thereof,
+  including any amended or successor version of such directive); and
+
+  vii. other similar, equivalent or corresponding rights throughout the world
+  based on applicable law or treaty, and any national implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention of,
+applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
+unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
+and Related Rights and associated claims and causes of action, whether now
+known or unknown (including existing as well as future claims and causes of
+action), in the Work (i) in all territories worldwide, (ii) for the maximum
+duration provided by applicable law or treaty (including future time
+extensions), (iii) in any current or future medium and for any number of
+copies, and (iv) for any purpose whatsoever, including without limitation
+commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
+the Waiver for the benefit of each member of the public at large and to the
+detriment of Affirmer's heirs and successors, fully intending that such Waiver
+shall not be subject to revocation, rescission, cancellation, termination, or
+any other legal or equitable action to disrupt the quiet enjoyment of the Work
+by the public as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason be
+judged legally invalid or ineffective under applicable law, then the Waiver
+shall be preserved to the maximum extent permitted taking into account
+Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
+is so judged Affirmer hereby grants to each affected person a royalty-free,
+non transferable, non sublicensable, non exclusive, irrevocable and
+unconditional license to exercise Affirmer's Copyright and Related Rights in
+the Work (i) in all territories worldwide, (ii) for the maximum duration
+provided by applicable law or treaty (including future time extensions), (iii)
+in any current or future medium and for any number of copies, and (iv) for any
+purpose whatsoever, including without limitation commercial, advertising or
+promotional purposes (the "License"). The License shall be deemed effective as
+of the date CC0 was applied by Affirmer to the Work. Should any part of the
+License for any reason be judged legally invalid or ineffective under
+applicable law, such partial invalidity or ineffectiveness shall not
+invalidate the remainder of the License, and in such case Affirmer hereby
+affirms that he or she will not (i) exercise any of his or her remaining
+Copyright and Related Rights in the Work or (ii) assert any associated claims
+and causes of action with respect to the Work, in either case contrary to
+Affirmer's express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+  a. No trademark or patent rights held by Affirmer are waived, abandoned,
+  surrendered, licensed or otherwise affected by this document.
+
+  b. Affirmer offers the Work as-is and makes no representations or warranties
+  of any kind concerning the Work, express, implied, statutory or otherwise,
+  including without limitation warranties of title, merchantability, fitness
+  for a particular purpose, non infringement, or the absence of latent or
+  other defects, accuracy, or the present or absence of errors, whether or not
+  discoverable, all to the greatest extent permissible under applicable law.
+
+  c. Affirmer disclaims responsibility for clearing rights of other persons
+  that may apply to the Work or any use thereof, including without limitation
+  any person's Copyright and Related Rights in the Work. Further, Affirmer
+  disclaims responsibility for obtaining any necessary consents, permissions
+  or other rights required for any use of the Work.
+
+  d. Affirmer understands and acknowledges that Creative Commons is not a
+  party to this document and has no duty or obligation with respect to this
+  CC0 or use of the Work.
+
+For more information, please see
+<http://creativecommons.org/publicdomain/zero/1.0/>
diff --git a/node_modules/mdn-data/README.md b/node_modules/mdn-data/README.md
new file mode 100644
index 0000000..3a5a1e9
--- /dev/null
+++ b/node_modules/mdn-data/README.md
@@ -0,0 +1,56 @@
+# MDN data
+
+[https://github.com/mdn/data](https://github.com/mdn/data)
+
+Maintained by the [MDN team at Mozilla](https://wiki.mozilla.org/MDN).
+
+This repository contains general data for Web technologies.
+
+This data is used in MDN documentation, to build
+[information boxes](https://developer.mozilla.org/en-US/docs/Web/CSS/background)
+or [sidebar navigation](https://developer.mozilla.org/en-US/docs/Web/API/Window).
+External tools have started to make use of this data as well.
+For example, the [CSSTree](https://github.com/csstree/csstree/) CSS parser.
+
+
+[![NPM version](https://img.shields.io/npm/v/mdn-data.svg)](https://www.npmjs.com/package/mdn-data)
+[![Build Status](https://travis-ci.org/mdn/data.svg?branch=master)](https://travis-ci.org/mdn/data)
+
+## Repository contents
+
+There's a top-level directory for each broad area covered: for example, "api",
+"css", "svg". Inside each of these directories is one or more
+JSON files containing the data.
+
+### api
+Contains data about Web APIs:
+* API inheritance (interface inheritance and mixin implementations)
+
+### css
+ Contains data about:
+* CSS at-rules
+* CSS properties
+* CSS selectors
+* CSS syntaxes
+* CSS types
+* CSS units
+
+Read more about [CSS data](https://github.com/mdn/data/blob/master/css/readme.md) and the format of the files.
+
+
+### l10n
+The l10n folder contains localization strings that are used in the various
+json files throughout this repository.
+
+## Problems?
+
+If you find a problem, please [file an issue](https://github.com/mdn/data/issues/new).
+
+## Contributing
+
+We're very happy to accept contributions to this data. Please familiarize yourself
+with the schema for the data you're editing, and send us a pull request. See also the [Contributing file](https://github.com/mdn/data/blob/master/CONTRIBUTING.md) for more information.
+
+## See also
+* [https://github.com/mdn/browser-compat-data](https://github.com/mdn/browser-compat-data)
+for compatibility data for Web technologies.
diff --git a/node_modules/mdn-data/api/index.js b/node_modules/mdn-data/api/index.js
new file mode 100644
index 0000000..4c1ec9b
--- /dev/null
+++ b/node_modules/mdn-data/api/index.js
@@ -0,0 +1,3 @@
+module.exports = {
+  inheritance: require('./inheritance'),
+}
diff --git a/node_modules/mdn-data/api/inheritance.json b/node_modules/mdn-data/api/inheritance.json
new file mode 100644
index 0000000..c209790
--- /dev/null
+++ b/node_modules/mdn-data/api/inheritance.json
@@ -0,0 +1,2681 @@
+{
+  "AbsoluteOrientationSensor": {
+    "inherits": "OrientationSensor",
+    "implements": []
+  },
+  "AbstractRange": {
+    "inherits": null,
+    "implements": []
+  },
+  "Accelerometer": {
+    "inherits": "Sensor",
+    "implements": []
+  },
+  "AmbientLightSensor": {
+    "inherits": "Sensor",
+    "implements": []
+  },
+  "AnalyserNode": {
+    "inherits": "AudioNode",
+    "implements": [
+      "AudioNodePassThrough"
+    ]
+  },
+  "AnimationEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "ArchiveRequest": {
+    "inherits": "DOMRequest",
+    "implements": []
+  },
+  "Attr": {
+    "inherits": "Node",
+    "implements": []
+  },
+  "AudioBufferSourceNode": {
+    "inherits": "AudioScheduledSourceNode",
+    "implements": [
+      "AudioNodePassThrough"
+    ]
+  },
+  "AudioChannelManager": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "AudioContext": {
+    "inherits": "BaseAudioContext",
+    "implements": []
+  },
+  "AudioDestinationNode": {
+    "inherits": "AudioNode",
+    "implements": []
+  },
+  "AudioNode": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "AudioProcessingEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "AudioScheduledSourceNode": {
+    "inherits": "AudioNode",
+    "implements": []
+  },
+  "AudioStreamTrack": {
+    "inherits": "MediaStreamTrack",
+    "implements": []
+  },
+  "AudioTrackList": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "AutocompleteErrorEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "BarProp": {
+    "inherits": null,
+    "implements": []
+  },
+  "BaseAudioContext": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "BatteryManager": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "BeforeAfterKeyboardEvent": {
+    "inherits": "KeyboardEvent",
+    "implements": []
+  },
+  "BeforeInstallPromptEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "BeforeUnloadEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "BiquadFilterNode": {
+    "inherits": "AudioNode",
+    "implements": [
+      "AudioNodePassThrough"
+    ]
+  },
+  "BlobEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "BluetoothAdapter": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "BluetoothAdapterEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "BluetoothAttributeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "BluetoothDevice": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "BluetoothDeviceEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "BluetoothDiscoveryHandle": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "BluetoothDiscoveryStateChangedEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "BluetoothGatt": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "BluetoothManager": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "BluetoothPairingEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "BluetoothStatusChangedEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "BoxObject": {
+    "inherits": null,
+    "implements": []
+  },
+  "BroadcastChannel": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "BrowserElement": {
+    "inherits": null,
+    "implements": [
+      "BrowserElementCommon",
+      "BrowserElementPrivileged"
+    ]
+  },
+  "CDATASection": {
+    "inherits": "Text",
+    "implements": []
+  },
+  "CFStateChangeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "CSSCounterStyleRule": {
+    "inherits": "CSSRule",
+    "implements": []
+  },
+  "CSSFontFaceLoadEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "CSSImageValue": {
+    "inherits": "CSSStyleValue",
+    "implements": []
+  },
+  "CSSKeywordValue": {
+    "inherits": "CSSStyleValue",
+    "implements": []
+  },
+  "CSSMathInvert": {
+    "inherits": "CSSMathValue",
+    "implements": []
+  },
+  "CSSMathMax": {
+    "inherits": "CSSMathValue",
+    "implements": []
+  },
+  "CSSMathMin": {
+    "inherits": "CSSMathValue",
+    "implements": []
+  },
+  "CSSMathNegate": {
+    "inherits": "CSSMathValue",
+    "implements": []
+  },
+  "CSSMathProduct": {
+    "inherits": "CSSMathValue",
+    "implements": []
+  },
+  "CSSMathSum": {
+    "inherits": "CSSMathValue",
+    "implements": []
+  },
+  "CSSMathValue": {
+    "inherits": "CSSNumericValue",
+    "implements": [
+      "CSSMathInvert",
+      "CSSMathMax",
+      "CSSMathMin",
+      "CSSMathNegate",
+      "CSSMathProduct",
+      "CSSMathSum"
+    ]
+  },
+  "CSSMatrixComponent": {
+    "inherits": "CSSTransformComponent",
+    "implements": []
+  },
+  "CSSNumericValue": {
+    "inherits": "CSSStyleValue",
+    "implements": [
+      "CSSMathValue",
+      "CSSUnitValue"
+    ]
+  },
+  "CSSPerspective": {
+    "inherits": "CSSTransformComponent",
+    "implements": []
+  },
+  "CSSPositionValue": {
+    "inherits": "CSSStyleValue",
+    "implements": []
+  },
+  "CSSPrimitiveValue": {
+    "inherits": "CSSValue",
+    "implements": []
+  },
+  "CSSPseudoElement": {
+    "inherits": "EventTarget",
+    "implements": [
+      "Animatable"
+    ]
+  },
+  "CSSRotate": {
+    "inherits": "CSSTransformComponent",
+    "implements": []
+  },
+  "CSSScale": {
+    "inherits": "CSSTransformComponent",
+    "implements": []
+  },
+  "CSSSkew": {
+    "inherits": "CSSTransformComponent",
+    "implements": []
+  },
+  "CSSSkewX": {
+    "inherits": "CSSTransformComponent",
+    "implements": []
+  },
+  "CSSSkewY": {
+    "inherits": "CSSTransformComponent",
+    "implements": []
+  },
+  "CSSStyleDeclaration": {
+    "inherits": null,
+    "implements": []
+  },
+  "CSSStyleSheet": {
+    "inherits": "StyleSheet",
+    "implements": []
+  },
+  "CSSStyleValue": {
+    "inherits": null,
+    "implements": [
+      "CSSImageValue",
+      "CSSKeywordValue",
+      "CSSNumericValue",
+      "CSSPositionValue",
+      "CSSTransformValue",
+      "CSSUnitValue",
+      "CSSUnparsedValue"
+    ]
+  },
+  "CSSTransformComponent": {
+    "inherits": null,
+    "implements": [
+      "CSSMatrixComponent",
+      "CSSPerspective",
+      "CSSRotate",
+      "CSSScale",
+      "CSSSkew",
+      "CSSSkewX",
+      "CSSSkewY",
+      "CSSTranslate"
+    ]
+  },
+  "CSSTransformValue": {
+    "inherits": "CSSStyleValue",
+    "implements": []
+  },
+  "CSSTranslate": {
+    "inherits": "CSSTransformComponent",
+    "implements": []
+  },
+  "CSSUnitValue": {
+    "inherits": "CSSNumericValue",
+    "implements": []
+  },
+  "CSSUnparsedValue": {
+    "inherits": "CSSStyleValue",
+    "implements": []
+  },
+  "CSSValueList": {
+    "inherits": "CSSValue",
+    "implements": []
+  },
+  "CallEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "CallGroupErrorEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "CameraClosedEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "CameraConfigurationEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "CameraControl": {
+    "inherits": "MediaStream",
+    "implements": []
+  },
+  "CameraFacesDetectedEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "CameraStateChangeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "CanvasCaptureMediaStream": {
+    "inherits": "MediaStream",
+    "implements": []
+  },
+  "CaretPosition": {
+    "inherits": null,
+    "implements": []
+  },
+  "ChannelMergerNode": {
+    "inherits": "AudioNode",
+    "implements": []
+  },
+  "ChannelSplitterNode": {
+    "inherits": "AudioNode",
+    "implements": []
+  },
+  "CharacterData": {
+    "inherits": "Node",
+    "implements": [
+      "ChildNode",
+      "NonDocumentTypeChildNode"
+    ]
+  },
+  "ChromeWorker": {
+    "inherits": "Worker",
+    "implements": []
+  },
+  "Clipboard": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "ClipboardEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "CloseEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "CommandEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "Comment": {
+    "inherits": "CharacterData",
+    "implements": []
+  },
+  "CompositionEvent": {
+    "inherits": "UIEvent",
+    "implements": []
+  },
+  "ConstantSourceNode": {
+    "inherits": "AudioScheduledSourceNode",
+    "implements": []
+  },
+  "ContactManager": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "ContainerBoxObject": {
+    "inherits": "BoxObject",
+    "implements": []
+  },
+  "ConvolverNode": {
+    "inherits": "AudioNode",
+    "implements": [
+      "AudioNodePassThrough"
+    ]
+  },
+  "Crypto": {
+    "inherits": null,
+    "implements": []
+  },
+  "CustomEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "DOMApplication": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "DOMApplicationsManager": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "DOMCursor": {
+    "inherits": "EventTarget",
+    "implements": [
+      "DOMRequestShared"
+    ]
+  },
+  "DOMDownload": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "DOMDownloadManager": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "DOMException": {
+    "inherits": null,
+    "implements": [
+      "ExceptionMembers"
+    ]
+  },
+  "DOMImplementation": {
+    "inherits": null,
+    "implements": []
+  },
+  "DOMMatrix": {
+    "inherits": "DOMMatrixReadOnly",
+    "implements": []
+  },
+  "DOMMobileMessageError": {
+    "inherits": "DOMError",
+    "implements": []
+  },
+  "DOMParser": {
+    "inherits": null,
+    "implements": []
+  },
+  "DOMPoint": {
+    "inherits": "DOMPointReadOnly",
+    "implements": []
+  },
+  "DOMRect": {
+    "inherits": "DOMRectReadOnly",
+    "implements": []
+  },
+  "DOMRequest": {
+    "inherits": "EventTarget",
+    "implements": [
+      "DOMRequestShared"
+    ]
+  },
+  "DOMSettableTokenList": {
+    "inherits": "DOMTokenList",
+    "implements": []
+  },
+  "DOMStringMap": {
+    "inherits": null,
+    "implements": []
+  },
+  "DOMTokenList": {
+    "inherits": null,
+    "implements": []
+  },
+  "DOMTransactionEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "DataContainerEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "DataErrorEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "DataStore": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "DataStoreChangeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "DedicatedWorkerGlobalScope": {
+    "inherits": "WorkerGlobalScope",
+    "implements": []
+  },
+  "DelayNode": {
+    "inherits": "AudioNode",
+    "implements": [
+      "AudioNodePassThrough"
+    ]
+  },
+  "DesktopNotification": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "DeviceLightEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "DeviceMotionEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "DeviceOrientationEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "DeviceProximityEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "DeviceStorage": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "DeviceStorageChangeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "Document": {
+    "inherits": "Node",
+    "implements": [
+      "FontFaceSource",
+      "GeometryUtils",
+      "GlobalEventHandlers",
+      "OnErrorEventHandlerForNodes",
+      "ParentNode",
+      "TouchEventHandlers",
+      "XPathEvaluator"
+    ]
+  },
+  "DocumentFragment": {
+    "inherits": "Node",
+    "implements": [
+      "ParentNode"
+    ]
+  },
+  "DocumentType": {
+    "inherits": "Node",
+    "implements": [
+      "ChildNode"
+    ]
+  },
+  "DownloadEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "DragEvent": {
+    "inherits": "MouseEvent",
+    "implements": []
+  },
+  "DynamicsCompressorNode": {
+    "inherits": "AudioNode",
+    "implements": [
+      "AudioNodePassThrough"
+    ]
+  },
+  "Element": {
+    "inherits": "Node",
+    "implements": [
+      "Animatable",
+      "ChildNode",
+      "GeometryUtils",
+      "NonDocumentTypeChildNode",
+      "ParentNode"
+    ]
+  },
+  "EngineeringMode": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "ErrorEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "Event": {
+    "inherits": null,
+    "implements": []
+  },
+  "EventSource": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "Exception": {
+    "inherits": null,
+    "implements": [
+      "ExceptionMembers"
+    ]
+  },
+  "ExtendableEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "FMRadio": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "FetchEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "File": {
+    "inherits": "Blob",
+    "implements": []
+  },
+  "FileList": {
+    "inherits": null,
+    "implements": []
+  },
+  "FileReader": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "FocusEvent": {
+    "inherits": "UIEvent",
+    "implements": []
+  },
+  "FontFaceSet": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "FormData": {
+    "inherits": null,
+    "implements": []
+  },
+  "GainNode": {
+    "inherits": "AudioNode",
+    "implements": [
+      "AudioNodePassThrough"
+    ]
+  },
+  "GamepadAxisMoveEvent": {
+    "inherits": "GamepadEvent",
+    "implements": []
+  },
+  "GamepadButtonEvent": {
+    "inherits": "GamepadEvent",
+    "implements": []
+  },
+  "GamepadEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "Gyroscope": {
+    "inherits": "Sensor",
+    "implements": []
+  },
+  "HMDVRDevice": {
+    "inherits": "VRDevice",
+    "implements": []
+  },
+  "HTMLAnchorElement": {
+    "inherits": "HTMLElement",
+    "implements": [
+      "HTMLHyperlinkElementUtils",
+      "URLUtilsSearchParams"
+    ]
+  },
+  "HTMLAppletElement": {
+    "inherits": "HTMLElement",
+    "implements": [
+      "MozFrameLoaderOwner",
+      "MozImageLoadingContent",
+      "MozObjectLoadingContent"
+    ]
+  },
+  "HTMLAreaElement": {
+    "inherits": "HTMLElement",
+    "implements": [
+      "HTMLHyperlinkElementUtils",
+      "URLUtilsSearchParams"
+    ]
+  },
+  "HTMLAudioElement": {
+    "inherits": "HTMLMediaElement",
+    "implements": []
+  },
+  "HTMLBRElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLBaseElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLBodyElement": {
+    "inherits": "HTMLElement",
+    "implements": [
+      "WindowEventHandlers"
+    ]
+  },
+  "HTMLButtonElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLCanvasElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLCollection": {
+    "inherits": null,
+    "implements": []
+  },
+  "HTMLContentElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLDListElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLDataElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLDataListElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLDirectoryElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLDivElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLDocument": {
+    "inherits": "Document",
+    "implements": []
+  },
+  "HTMLElement": {
+    "inherits": "Element",
+    "implements": [
+      "GlobalEventHandlers",
+      "OnErrorEventHandlerForNodes",
+      "TouchEventHandlers"
+    ]
+  },
+  "HTMLEmbedElement": {
+    "inherits": "HTMLElement",
+    "implements": [
+      "MozFrameLoaderOwner",
+      "MozImageLoadingContent",
+      "MozObjectLoadingContent"
+    ]
+  },
+  "HTMLFieldSetElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLFontElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLFormControlsCollection": {
+    "inherits": "HTMLCollection",
+    "implements": []
+  },
+  "HTMLFormElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLFrameElement": {
+    "inherits": "HTMLElement",
+    "implements": [
+      "MozFrameLoaderOwner"
+    ]
+  },
+  "HTMLFrameSetElement": {
+    "inherits": "HTMLElement",
+    "implements": [
+      "WindowEventHandlers"
+    ]
+  },
+  "HTMLHRElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLHeadElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLHeadingElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLHtmlElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLIFrameElement": {
+    "inherits": "HTMLElement",
+    "implements": [
+      "BrowserElement",
+      "MozFrameLoaderOwner"
+    ]
+  },
+  "HTMLImageElement": {
+    "inherits": "HTMLElement",
+    "implements": [
+      "MozImageLoadingContent"
+    ]
+  },
+  "HTMLInputElement": {
+    "inherits": "HTMLElement",
+    "implements": [
+      "MozImageLoadingContent",
+      "MozPhonetic"
+    ]
+  },
+  "HTMLLIElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLLabelElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLLegendElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLLinkElement": {
+    "inherits": "HTMLElement",
+    "implements": [
+      "LinkStyle"
+    ]
+  },
+  "HTMLMapElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLMarqueeElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLMediaElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLMenuElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLMenuItemElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLMetaElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLMeterElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLModElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLOListElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLObjectElement": {
+    "inherits": "HTMLElement",
+    "implements": [
+      "MozFrameLoaderOwner",
+      "MozImageLoadingContent",
+      "MozObjectLoadingContent"
+    ]
+  },
+  "HTMLOptGroupElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLOptionElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLOptionsCollection": {
+    "inherits": "HTMLCollection",
+    "implements": []
+  },
+  "HTMLOutputElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLParagraphElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLParamElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLPictureElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLPreElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLProgressElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLPropertiesCollection": {
+    "inherits": "HTMLCollection",
+    "implements": []
+  },
+  "HTMLQuoteElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLScriptElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLSelectElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLShadowElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLSourceElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLSpanElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLStyleElement": {
+    "inherits": "HTMLElement",
+    "implements": [
+      "LinkStyle"
+    ]
+  },
+  "HTMLTableCaptionElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLTableCellElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLTableColElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLTableElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLTableRowElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLTableSectionElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLTemplateElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLTextAreaElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLTimeElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLTitleElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLTrackElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLUListElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLUnknownElement": {
+    "inherits": "HTMLElement",
+    "implements": []
+  },
+  "HTMLVideoElement": {
+    "inherits": "HTMLMediaElement",
+    "implements": []
+  },
+  "HashChangeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "History": {
+    "inherits": null,
+    "implements": []
+  },
+  "IDBCursorWithValue": {
+    "inherits": "IDBCursor",
+    "implements": []
+  },
+  "IDBDatabase": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "IDBFileHandle": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "IDBFileRequest": {
+    "inherits": "DOMRequest",
+    "implements": []
+  },
+  "IDBMutableFile": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "IDBOpenDBRequest": {
+    "inherits": "IDBRequest",
+    "implements": []
+  },
+  "IDBRequest": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "IDBTransaction": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "IDBVersionChangeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "IccCardLockError": {
+    "inherits": "DOMError",
+    "implements": []
+  },
+  "IccChangeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "ImageCapture": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "ImageCaptureErrorEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "ImageDocument": {
+    "inherits": "HTMLDocument",
+    "implements": []
+  },
+  "InputEvent": {
+    "inherits": "UIEvent",
+    "implements": []
+  },
+  "InstallEvent": {
+    "inherits": "ExtendableEvent",
+    "implements": []
+  },
+  "InstallTrigger": {
+    "inherits": null,
+    "implements": []
+  },
+  "KeyboardEvent": {
+    "inherits": "UIEvent",
+    "implements": [
+      "KeyEvent"
+    ]
+  },
+  "LinearAccelerationSensor": {
+    "inherits": "Accelerometer",
+    "implements": []
+  },
+  "ListBoxObject": {
+    "inherits": "BoxObject",
+    "implements": []
+  },
+  "LocalMediaStream": {
+    "inherits": "MediaStream",
+    "implements": []
+  },
+  "Location": {
+    "inherits": null,
+    "implements": []
+  },
+  "Magnetometer": {
+    "inherits": "Sensor",
+    "implements": []
+  },
+  "MediaDevices": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "MediaElementAudioSourceNode": {
+    "inherits": "AudioNode",
+    "implements": [
+      "AudioNodePassThrough"
+    ]
+  },
+  "MediaEncryptedEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MediaKeyError": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MediaKeyMessageEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MediaKeySession": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "MediaRecorder": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "MediaSource": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "MediaStream": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "MediaStreamAudioDestinationNode": {
+    "inherits": "AudioNode",
+    "implements": []
+  },
+  "MediaStreamAudioSourceNode": {
+    "inherits": "AudioNode",
+    "implements": [
+      "AudioNodePassThrough"
+    ]
+  },
+  "MediaStreamEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MediaStreamTrackEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MenuBoxObject": {
+    "inherits": "BoxObject",
+    "implements": []
+  },
+  "MerchantValidationEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MessageEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MessagePort": {
+    "inherits": "EventTarget",
+    "implements": [
+      "Transferable"
+    ]
+  },
+  "MimeTypeArray": {
+    "inherits": null,
+    "implements": []
+  },
+  "MouseEvent": {
+    "inherits": "UIEvent",
+    "implements": []
+  },
+  "MouseScrollEvent": {
+    "inherits": "MouseEvent",
+    "implements": []
+  },
+  "MozAbortablePromise": {
+    "inherits": "_Promise",
+    "implements": []
+  },
+  "MozActivity": {
+    "inherits": "DOMRequest",
+    "implements": []
+  },
+  "MozApplicationEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozCdmaIccInfo": {
+    "inherits": "MozIccInfo",
+    "implements": []
+  },
+  "MozCellBroadcast": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "MozCellBroadcastEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozClirModeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozContactChangeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozEmergencyCbModeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozGsmIccInfo": {
+    "inherits": "MozIccInfo",
+    "implements": []
+  },
+  "MozIcc": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "MozIccManager": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "MozInputMethod": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "MozInterAppMessageEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozInterAppMessagePort": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "MozMessageDeletedEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozMmsEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozMobileConnection": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "MozMobileMessageManager": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "MozNFC": {
+    "inherits": "EventTarget",
+    "implements": [
+      "MozNFCManager"
+    ]
+  },
+  "MozNFCPeerEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozNFCTagEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozOtaStatusEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozSettingsEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozSettingsTransactionEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozSmsEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozSpeakerManager": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "MozStkCommandEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozVoicemail": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "MozVoicemailEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozWifiConnectionInfoEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozWifiManager": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "MozWifiStationInfoEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MozWifiStatusChangeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MutationEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "MutationObserver": {
+    "inherits": null,
+    "implements": []
+  },
+  "MutationRecord": {
+    "inherits": null,
+    "implements": []
+  },
+  "NamedNodeMap": {
+    "inherits": null,
+    "implements": []
+  },
+  "Navigator": {
+    "inherits": null,
+    "implements": [
+      "NavigatorBattery",
+      "NavigatorContentUtils",
+      "NavigatorDataStore",
+      "NavigatorFeatures",
+      "NavigatorGeolocation",
+      "NavigatorID",
+      "NavigatorLanguage",
+      "NavigatorMobileId",
+      "NavigatorOnLine",
+      "NavigatorStorageUtils"
+    ]
+  },
+  "NetworkInformation": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "Node": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "NodeIterator": {
+    "inherits": null,
+    "implements": []
+  },
+  "NodeList": {
+    "inherits": null,
+    "implements": []
+  },
+  "Notification": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "NotifyPaintEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "OfflineAudioCompletionEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "OfflineAudioContext": {
+    "inherits": "BaseAudioContext",
+    "implements": []
+  },
+  "OfflineResourceList": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "OffscreenCanvas": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "OrientationSensor": {
+    "inherits": "Sensor",
+    "implements": []
+  },
+  "OscillatorNode": {
+    "inherits": "AudioNode",
+    "implements": [
+      "AudioNodePassThrough"
+    ]
+  },
+  "PageTransitionEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "PaintRequest": {
+    "inherits": null,
+    "implements": []
+  },
+  "PaintRequestList": {
+    "inherits": null,
+    "implements": []
+  },
+  "PannerNode": {
+    "inherits": "AudioNode",
+    "implements": [
+      "AudioNodePassThrough"
+    ]
+  },
+  "PaymentAddress": {
+    "inherits": null,
+    "implements": []
+  },
+  "PaymentMethodChangeEvent": {
+    "inherits": "PaymentRequestUpdateEvent",
+    "implements": []
+  },
+  "PaymentRequest": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "PaymentRequestUpdateEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "PaymentResponse": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "Performance": {
+    "inherits": null,
+    "implements": []
+  },
+  "PerformanceLongTaskTiming": {
+    "inherits": "PerformanceEntry",
+    "implements": []
+  },
+  "PerformanceMark": {
+    "inherits": "PerformanceEntry",
+    "implements": []
+  },
+  "PerformanceMeasure": {
+    "inherits": "PerformanceEntry",
+    "implements": []
+  },
+  "PerformanceNavigationTiming": {
+    "inherits": "PerformanceEntry",
+    "implements": []
+  },
+  "PerformancePaintTiming": {
+    "inherits": "PerformanceEntry",
+    "implements": []
+  },
+  "PerformanceResourceTiming": {
+    "inherits": "PerformanceEntry",
+    "implements": []
+  },
+  "Plugin": {
+    "inherits": null,
+    "implements": []
+  },
+  "PluginArray": {
+    "inherits": null,
+    "implements": []
+  },
+  "PluginCrashedEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "PointerEvent": {
+    "inherits": "MouseEvent",
+    "implements": []
+  },
+  "PopStateEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "PopupBlockedEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "PopupBoxObject": {
+    "inherits": "BoxObject",
+    "implements": []
+  },
+  "PositionSensorVRDevice": {
+    "inherits": "VRDevice",
+    "implements": []
+  },
+  "PresentationDeviceInfoManager": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "ProcessingInstruction": {
+    "inherits": "CharacterData",
+    "implements": []
+  },
+  "ProgressEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "PromiseRejectionEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "PropertyNodeList": {
+    "inherits": "NodeList",
+    "implements": []
+  },
+  "PseudoElement": {
+    "inherits": null,
+    "implements": [
+      "GeometryUtils"
+    ]
+  },
+  "RTCDTMFSender": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "RTCDTMFToneChangeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "RTCDataChannel": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "RTCDataChannelEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "RTCDtlsTransport": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "RTCIceTransport": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "RTCPeerConnection": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "RTCPeerConnectionIceEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "RTCPeerConnectionIdentityErrorEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "RTCPeerConnectionIdentityEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "RTCSctpTransport": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "RTCTrackEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "RadioNodeList": {
+    "inherits": "NodeList",
+    "implements": []
+  },
+  "Range": {
+    "inherits": "AbstractRange",
+    "implements": []
+  },
+  "RecordErrorEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "Rect": {
+    "inherits": null,
+    "implements": []
+  },
+  "RelativeOrientationSensor": {
+    "inherits": "OrientationSensor",
+    "implements": []
+  },
+  "Request": {
+    "inherits": null,
+    "implements": [
+      "Body"
+    ]
+  },
+  "Response": {
+    "inherits": null,
+    "implements": [
+      "Body"
+    ]
+  },
+  "StaticRange": {
+    "inherits": "AbstractRange",
+    "implements": []
+  },
+  "SVGAElement": {
+    "inherits": "SVGGraphicsElement",
+    "implements": [
+      "SVGURIReference"
+    ]
+  },
+  "SVGAltGlyphElement": {
+    "inherits": "SVGTextPositioningElement",
+    "implements": [
+      "SVGURIReference"
+    ]
+  },
+  "SVGAnimateElement": {
+    "inherits": "SVGAnimationElement",
+    "implements": []
+  },
+  "SVGAnimateMotionElement": {
+    "inherits": "SVGAnimationElement",
+    "implements": []
+  },
+  "SVGAnimateTransformElement": {
+    "inherits": "SVGAnimationElement",
+    "implements": []
+  },
+  "SVGAnimatedEnumeration": {
+    "inherits": null,
+    "implements": []
+  },
+  "SVGAnimatedInteger": {
+    "inherits": null,
+    "implements": []
+  },
+  "SVGAnimatedNumber": {
+    "inherits": null,
+    "implements": []
+  },
+  "SVGAnimatedNumberList": {
+    "inherits": null,
+    "implements": []
+  },
+  "SVGAnimatedPreserveAspectRatio": {
+    "inherits": null,
+    "implements": []
+  },
+  "SVGAnimatedString": {
+    "inherits": null,
+    "implements": []
+  },
+  "SVGAnimationElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGTests"
+    ]
+  },
+  "SVGCircleElement": {
+    "inherits": "SVGGeometryElement",
+    "implements": []
+  },
+  "SVGClipPathElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGUnitTypes"
+    ]
+  },
+  "SVGComponentTransferFunctionElement": {
+    "inherits": "SVGElement",
+    "implements": []
+  },
+  "SVGCursorElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGURIReference"
+    ]
+  },
+  "SVGDefsElement": {
+    "inherits": "SVGGraphicsElement",
+    "implements": []
+  },
+  "SVGDescElement": {
+    "inherits": "SVGElement",
+    "implements": []
+  },
+  "SVGDocument": {
+    "inherits": "Document",
+    "implements": []
+  },
+  "SVGElement": {
+    "inherits": "Element",
+    "implements": [
+      "GlobalEventHandlers",
+      "OnErrorEventHandlerForNodes",
+      "TouchEventHandlers"
+    ]
+  },
+  "SVGEllipseElement": {
+    "inherits": "SVGGeometryElement",
+    "implements": []
+  },
+  "SVGFEBlendElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes"
+    ]
+  },
+  "SVGFEColorMatrixElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes"
+    ]
+  },
+  "SVGFEComponentTransferElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes"
+    ]
+  },
+  "SVGFECompositeElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes"
+    ]
+  },
+  "SVGFEConvolveMatrixElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes"
+    ]
+  },
+  "SVGFEDiffuseLightingElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes"
+    ]
+  },
+  "SVGFEDisplacementMapElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes"
+    ]
+  },
+  "SVGFEDistantLightElement": {
+    "inherits": "SVGElement",
+    "implements": []
+  },
+  "SVGFEDropShadowElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes"
+    ]
+  },
+  "SVGFEFloodElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes"
+    ]
+  },
+  "SVGFEFuncAElement": {
+    "inherits": "SVGComponentTransferFunctionElement",
+    "implements": []
+  },
+  "SVGFEFuncBElement": {
+    "inherits": "SVGComponentTransferFunctionElement",
+    "implements": []
+  },
+  "SVGFEFuncGElement": {
+    "inherits": "SVGComponentTransferFunctionElement",
+    "implements": []
+  },
+  "SVGFEFuncRElement": {
+    "inherits": "SVGComponentTransferFunctionElement",
+    "implements": []
+  },
+  "SVGFEGaussianBlurElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes"
+    ]
+  },
+  "SVGFEImageElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes",
+      "SVGURIReference"
+    ]
+  },
+  "SVGFEMergeElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes"
+    ]
+  },
+  "SVGFEMergeNodeElement": {
+    "inherits": "SVGElement",
+    "implements": []
+  },
+  "SVGFEMorphologyElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes"
+    ]
+  },
+  "SVGFEOffsetElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes"
+    ]
+  },
+  "SVGFEPointLightElement": {
+    "inherits": "SVGElement",
+    "implements": []
+  },
+  "SVGFESpecularLightingElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes"
+    ]
+  },
+  "SVGFESpotLightElement": {
+    "inherits": "SVGElement",
+    "implements": []
+  },
+  "SVGFETileElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes"
+    ]
+  },
+  "SVGFETurbulenceElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFilterPrimitiveStandardAttributes"
+    ]
+  },
+  "SVGFilterElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGURIReference",
+      "SVGUnitTypes"
+    ]
+  },
+  "SVGForeignObjectElement": {
+    "inherits": "SVGGraphicsElement",
+    "implements": []
+  },
+  "SVGGElement": {
+    "inherits": "SVGGraphicsElement",
+    "implements": []
+  },
+  "SVGGeometryElement": {
+    "inherits": "SVGGraphicsElement",
+    "implements": []
+  },
+  "SVGGradientElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGURIReference",
+      "SVGUnitTypes"
+    ]
+  },
+  "SVGGraphicsElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGTests"
+    ]
+  },
+  "SVGImageElement": {
+    "inherits": "SVGGraphicsElement",
+    "implements": [
+      "MozImageLoadingContent",
+      "SVGURIReference"
+    ]
+  },
+  "SVGLengthList": {
+    "inherits": null,
+    "implements": []
+  },
+  "SVGLineElement": {
+    "inherits": "SVGGeometryElement",
+    "implements": []
+  },
+  "SVGLinearGradientElement": {
+    "inherits": "SVGGradientElement",
+    "implements": []
+  },
+  "SVGMPathElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGURIReference"
+    ]
+  },
+  "SVGMarkerElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFitToViewBox"
+    ]
+  },
+  "SVGMaskElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGUnitTypes"
+    ]
+  },
+  "SVGMetadataElement": {
+    "inherits": "SVGElement",
+    "implements": []
+  },
+  "SVGNumberList": {
+    "inherits": null,
+    "implements": []
+  },
+  "SVGPathElement": {
+    "inherits": "SVGGeometryElement",
+    "implements": [
+      "SVGAnimatedPathData"
+    ]
+  },
+  "SVGPathSegArcAbs": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegArcRel": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegClosePath": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegCurvetoCubicAbs": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegCurvetoCubicRel": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegCurvetoCubicSmoothAbs": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegCurvetoCubicSmoothRel": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegCurvetoQuadraticAbs": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegCurvetoQuadraticRel": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegCurvetoQuadraticSmoothAbs": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegCurvetoQuadraticSmoothRel": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegLinetoAbs": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegLinetoHorizontalAbs": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegLinetoHorizontalRel": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegLinetoRel": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegLinetoVerticalAbs": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegLinetoVerticalRel": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegList": {
+    "inherits": null,
+    "implements": []
+  },
+  "SVGPathSegMovetoAbs": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPathSegMovetoRel": {
+    "inherits": "SVGPathSeg",
+    "implements": []
+  },
+  "SVGPatternElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFitToViewBox",
+      "SVGURIReference",
+      "SVGUnitTypes"
+    ]
+  },
+  "SVGPoint": {
+    "inherits": null,
+    "implements": []
+  },
+  "SVGPointList": {
+    "inherits": null,
+    "implements": []
+  },
+  "SVGPolygonElement": {
+    "inherits": "SVGGeometryElement",
+    "implements": [
+      "SVGAnimatedPoints"
+    ]
+  },
+  "SVGPolylineElement": {
+    "inherits": "SVGGeometryElement",
+    "implements": [
+      "SVGAnimatedPoints"
+    ]
+  },
+  "SVGPreserveAspectRatio": {
+    "inherits": null,
+    "implements": []
+  },
+  "SVGRadialGradientElement": {
+    "inherits": "SVGGradientElement",
+    "implements": []
+  },
+  "SVGRect": {
+    "inherits": null,
+    "implements": []
+  },
+  "SVGRectElement": {
+    "inherits": "SVGGeometryElement",
+    "implements": []
+  },
+  "SVGSVGElement": {
+    "inherits": "SVGGraphicsElement",
+    "implements": [
+      "SVGFitToViewBox",
+      "SVGZoomAndPan"
+    ]
+  },
+  "SVGScriptElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGURIReference"
+    ]
+  },
+  "SVGSetElement": {
+    "inherits": "SVGAnimationElement",
+    "implements": []
+  },
+  "SVGStopElement": {
+    "inherits": "SVGElement",
+    "implements": []
+  },
+  "SVGStringList": {
+    "inherits": null,
+    "implements": []
+  },
+  "SVGStyleElement": {
+    "inherits": "SVGElement",
+    "implements": []
+  },
+  "SVGSwitchElement": {
+    "inherits": "SVGGraphicsElement",
+    "implements": []
+  },
+  "SVGSymbolElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFitToViewBox",
+      "SVGTests"
+    ]
+  },
+  "SVGTSpanElement": {
+    "inherits": "SVGTextPositioningElement",
+    "implements": []
+  },
+  "SVGTextContentElement": {
+    "inherits": "SVGGraphicsElement",
+    "implements": []
+  },
+  "SVGTextElement": {
+    "inherits": "SVGTextPositioningElement",
+    "implements": []
+  },
+  "SVGTextPathElement": {
+    "inherits": "SVGTextContentElement",
+    "implements": [
+      "SVGURIReference"
+    ]
+  },
+  "SVGTextPositioningElement": {
+    "inherits": "SVGTextContentElement",
+    "implements": []
+  },
+  "SVGTitleElement": {
+    "inherits": "SVGElement",
+    "implements": []
+  },
+  "SVGTransformList": {
+    "inherits": null,
+    "implements": []
+  },
+  "SVGUseElement": {
+    "inherits": "SVGGraphicsElement",
+    "implements": [
+      "SVGURIReference"
+    ]
+  },
+  "SVGViewElement": {
+    "inherits": "SVGElement",
+    "implements": [
+      "SVGFitToViewBox",
+      "SVGZoomAndPan"
+    ]
+  },
+  "SVGZoomEvent": {
+    "inherits": "UIEvent",
+    "implements": []
+  },
+  "Screen": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "ScriptProcessorNode": {
+    "inherits": "AudioNode",
+    "implements": [
+      "AudioNodePassThrough"
+    ]
+  },
+  "ScrollAreaEvent": {
+    "inherits": "UIEvent",
+    "implements": []
+  },
+  "ScrollBoxObject": {
+    "inherits": "BoxObject",
+    "implements": []
+  },
+  "ScrollViewChangeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "Selection": {
+    "inherits": null,
+    "implements": []
+  },
+  "SelectionStateChangedEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "Sensor": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "SensorErrorEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "ServiceWorker": {
+    "inherits": "EventTarget",
+    "implements": [
+      "AbstractWorker"
+    ]
+  },
+  "ServiceWorkerContainer": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "ServiceWorkerGlobalScope": {
+    "inherits": "WorkerGlobalScope",
+    "implements": [
+      "GlobalFetch"
+    ]
+  },
+  "ServiceWorkerRegistration": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "SettingsLock": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "SettingsManager": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "ShadowRoot": {
+    "inherits": "DocumentFragment",
+    "implements": []
+  },
+  "SharedWorker": {
+    "inherits": "EventTarget",
+    "implements": [
+      "AbstractWorker"
+    ]
+  },
+  "SharedWorkerGlobalScope": {
+    "inherits": "WorkerGlobalScope",
+    "implements": []
+  },
+  "SimpleGestureEvent": {
+    "inherits": "MouseEvent",
+    "implements": []
+  },
+  "SourceBuffer": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "SourceBufferList": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "SpeechRecognition": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "SpeechRecognitionError": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "SpeechRecognitionEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "SpeechSynthesisEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "SpeechSynthesisUtterance": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "StereoPannerNode": {
+    "inherits": "AudioNode",
+    "implements": [
+      "AudioNodePassThrough"
+    ]
+  },
+  "StorageEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "StylePropertyMap": {
+    "inherits": "StylePropertyMapReadOnly",
+    "implements": []
+  },
+  "StylePropertyMapReadOnly": {
+    "inherits": null,
+    "implements": [
+      "StylePropertyMap"
+    ]
+  },
+  "StyleRuleChangeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "StyleSheet": {
+    "inherits": null,
+    "implements": []
+  },
+  "StyleSheetApplicableStateChangeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "StyleSheetChangeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "SyncEvent": {
+    "inherits": "ExtendableEvent",
+    "implements": []
+  },
+  "TVChannel": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "TVCurrentChannelChangedEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "TVCurrentSourceChangedEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "TVEITBroadcastedEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "TVManager": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "TVScanningStateChangedEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "TVSource": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "TVTuner": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "TaskAttributionTiming": {
+    "inherits": "PerformanceEntry",
+    "implements": []
+  },
+  "Telephony": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "TelephonyCall": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "TelephonyCallGroup": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "Text": {
+    "inherits": "CharacterData",
+    "implements": [
+      "GeometryUtils"
+    ]
+  },
+  "TextTrack": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "TextTrackList": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "TimeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "Touch": {
+    "inherits": null,
+    "implements": []
+  },
+  "TouchEvent": {
+    "inherits": "UIEvent",
+    "implements": []
+  },
+  "TouchList": {
+    "inherits": null,
+    "implements": []
+  },
+  "TrackEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "TransitionEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "TreeBoxObject": {
+    "inherits": "BoxObject",
+    "implements": []
+  },
+  "TreeColumns": {
+    "inherits": null,
+    "implements": []
+  },
+  "TreeWalker": {
+    "inherits": null,
+    "implements": []
+  },
+  "UDPMessageEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "UDPSocket": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "UIEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "URL": {
+    "inherits": null,
+    "implements": [
+      "URLUtils",
+      "URLUtilsSearchParams"
+    ]
+  },
+  "USSDReceivedEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "UndoManager": {
+    "inherits": null,
+    "implements": []
+  },
+  "UserProximityEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "VRFieldOfView": {
+    "inherits": "VRFieldOfViewReadOnly",
+    "implements": []
+  },
+  "VTTCue": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "ValidityState": {
+    "inherits": null,
+    "implements": []
+  },
+  "VideoStreamTrack": {
+    "inherits": "MediaStreamTrack",
+    "implements": []
+  },
+  "VideoTrackList": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "WaveShaperNode": {
+    "inherits": "AudioNode",
+    "implements": [
+      "AudioNodePassThrough"
+    ]
+  },
+  "WebGL2RenderingContext": {
+    "inherits": "WebGLRenderingContext",
+    "implements": []
+  },
+  "WebGLContextEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "WebSocket": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "WheelEvent": {
+    "inherits": "MouseEvent",
+    "implements": []
+  },
+  "Window": {
+    "inherits": null,
+    "implements": [
+      "ChromeWindow",
+      "GlobalCrypto",
+      "GlobalEventHandlers",
+      "OnErrorEventHandlerForWindow",
+      "SpeechSynthesisGetter",
+      "TouchEventHandlers",
+      "WindowEventHandlers",
+      "WindowModal",
+      "WindowOrWorkerGlobalScope"
+    ]
+  },
+  "WindowClient": {
+    "inherits": "Client",
+    "implements": []
+  },
+  "WindowRoot": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "Worker": {
+    "inherits": "EventTarget",
+    "implements": [
+      "AbstractWorker"
+    ]
+  },
+  "WorkerGlobalScope": {
+    "inherits": "EventTarget",
+    "implements": [
+      "GlobalCrypto",
+      "WindowOrWorkerGlobalScope"
+    ]
+  },
+  "WorkerLocation": {
+    "inherits": null,
+    "implements": [
+      "URLUtilsReadOnly"
+    ]
+  },
+  "WorkerNavigator": {
+    "inherits": null,
+    "implements": [
+      "NavigatorDataStore",
+      "NavigatorID",
+      "NavigatorLanguage",
+      "NavigatorOnLine"
+    ]
+  },
+  "XMLDocument": {
+    "inherits": "Document",
+    "implements": []
+  },
+  "XMLHttpRequest": {
+    "inherits": "XMLHttpRequestEventTarget",
+    "implements": []
+  },
+  "XMLHttpRequestEventTarget": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "XMLHttpRequestUpload": {
+    "inherits": "XMLHttpRequestEventTarget",
+    "implements": []
+  },
+  "XMLSerializer": {
+    "inherits": null,
+    "implements": []
+  },
+  "XMLStylesheetProcessingInstruction": {
+    "inherits": "ProcessingInstruction",
+    "implements": []
+  },
+  "XPathEvaluator": {
+    "inherits": null,
+    "implements": []
+  },
+  "XR": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "XRBoundedReferenceSpace": {
+    "inherits": "XRReferenceSpace",
+    "implements": []
+  },
+  "XRFrame": {
+    "inherits": null,
+    "implements": []
+  },
+  "XRInputSource": {
+    "inherits": null,
+    "implements": []
+  },
+  "XRInputSourceArray": {
+    "inherits": null,
+    "implements": []
+  },
+  "XRInputSourceEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "XRInputSourcesChangeEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "XRPose": {
+    "inherits": null,
+    "implements": []
+  },
+  "XRReferenceSpace": {
+    "inherits": "XRSpace",
+    "implements": []
+  },
+  "XRReferenceSpaceEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "XRRenderState": {
+    "inherits": null,
+    "implements": []
+  },
+  "XRRigidTransform": {
+    "inherits": null,
+    "implements": []
+  },
+  "XRSession": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "XRSessionEvent": {
+    "inherits": "Event",
+    "implements": []
+  },
+  "XRSpace": {
+    "inherits": "EventTarget",
+    "implements": []
+  },
+  "XRView": {
+    "inherits": null,
+    "implements": []
+  },
+  "XRViewerPose": {
+    "inherits": "XRPose",
+    "implements": []
+  },
+  "XRViewport": {
+    "inherits": null,
+    "implements": []
+  },
+  "XRWebGLLayer": {
+    "inherits": null,
+    "implements": []
+  },
+  "XULCommandEvent": {
+    "inherits": "UIEvent",
+    "implements": []
+  },
+  "XULDocument": {
+    "inherits": "Document",
+    "implements": []
+  },
+  "XULElement": {
+    "inherits": "Element",
+    "implements": [
+      "GlobalEventHandlers",
+      "MozFrameLoaderOwner",
+      "OnErrorEventHandlerForNodes",
+      "TouchEventHandlers"
+    ]
+  }
+}
diff --git a/node_modules/mdn-data/api/inheritance.schema.json b/node_modules/mdn-data/api/inheritance.schema.json
new file mode 100644
index 0000000..706abbc
--- /dev/null
+++ b/node_modules/mdn-data/api/inheritance.schema.json
@@ -0,0 +1,31 @@
+{
+  "type": "object",
+  "additionalProperties": {
+    "type": "object",
+    "additionalProperties": false,
+    "properties": {
+      "inherits": {
+        "oneOf": [
+          {
+            "type": "null"
+          },
+          {
+            "type": "string",
+            "minLength": 1
+          }
+        ]
+      },
+      "implements": {
+        "minItems": 0,
+        "uniqueItems": true,
+        "items": {
+          "type": "string"
+        }
+      }
+    },
+    "required": [
+      "inherits",
+      "implements"
+    ]
+  }
+}
diff --git a/node_modules/mdn-data/css/at-rules.json b/node_modules/mdn-data/css/at-rules.json
new file mode 100644
index 0000000..4003461
--- /dev/null
+++ b/node_modules/mdn-data/css/at-rules.json
@@ -0,0 +1,560 @@
+{
+  "@charset": {
+    "syntax": "@charset \"<charset>\";",
+    "groups": [
+      "CSS Charsets"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@charset"
+  },
+  "@counter-style": {
+    "syntax": "@counter-style <counter-style-name> {\n  [ system: <counter-system>; ] ||\n  [ symbols: <counter-symbols>; ] ||\n  [ additive-symbols: <additive-symbols>; ] ||\n  [ negative: <negative-symbol>; ] ||\n  [ prefix: <prefix>; ] ||\n  [ suffix: <suffix>; ] ||\n  [ range: <range>; ] ||\n  [ pad: <padding>; ] ||\n  [ speak-as: <speak-as>; ] ||\n  [ fallback: <counter-style-name>; ]\n}",
+    "interfaces": [
+      "CSSCounterStyleRule"
+    ],
+    "groups": [
+      "CSS Counter Styles"
+    ],
+    "descriptors": {
+      "additive-symbols": {
+        "syntax": "[ <integer> && <symbol> ]#",
+        "media": "all",
+        "initial": "n/a (required)",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "orderOfAppearance",
+        "status": "standard"
+      },
+      "fallback": {
+        "syntax": "<counter-style-name>",
+        "media": "all",
+        "initial": "decimal",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "negative": {
+        "syntax": "<symbol> <symbol>?",
+        "media": "all",
+        "initial": "\"-\" hyphen-minus",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "orderOfAppearance",
+        "status": "standard"
+      },
+      "pad": {
+        "syntax": "<integer> && <symbol>",
+        "media": "all",
+        "initial": "0 \"\"",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "prefix": {
+        "syntax": "<symbol>",
+        "media": "all",
+        "initial": "\"\"",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "range": {
+        "syntax": "[ [ <integer> | infinite ]{2} ]# | auto",
+        "media": "all",
+        "initial": "auto",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "orderOfAppearance",
+        "status": "standard"
+      },
+      "speak-as": {
+        "syntax": "auto | bullets | numbers | words | spell-out | <counter-style-name>",
+        "media": "all",
+        "initial": "auto",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "suffix": {
+        "syntax": "<symbol>",
+        "media": "all",
+        "initial": "\". \"",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "symbols": {
+        "syntax": "<symbol>+",
+        "media": "all",
+        "initial": "n/a (required)",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "orderOfAppearance",
+        "status": "standard"
+      },
+      "system": {
+        "syntax": "cyclic | numeric | alphabetic | symbolic | additive | [ fixed <integer>? ] | [ extends <counter-style-name> ]",
+        "media": "all",
+        "initial": "symbolic",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "standard"
+      }
+    },
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@counter-style"
+  },
+  "@document": {
+    "syntax": "@document [ <url> | url-prefix(<string>) | domain(<string>) | media-document(<string>) | regexp(<string>) ]# {\n  <group-rule-body>\n}",
+    "interfaces": [
+      "CSSGroupingRule",
+      "CSSConditionRule"
+    ],
+    "groups": [
+      "CSS Conditional Rules"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@document"
+  },
+  "@font-face": {
+    "syntax": "@font-face {\n  [ font-family: <family-name>; ] ||\n  [ src: <src>; ] ||\n  [ unicode-range: <unicode-range>; ] ||\n  [ font-variant: <font-variant>; ] ||\n  [ font-feature-settings: <font-feature-settings>; ] ||\n  [ font-variation-settings: <font-variation-settings>; ] ||\n  [ font-stretch: <font-stretch>; ] ||\n  [ font-weight: <font-weight>; ] ||\n  [ font-style: <font-style>; ]\n}",
+    "interfaces": [
+      "CSSFontFaceRule"
+    ],
+    "groups": [
+      "CSS Fonts"
+    ],
+    "descriptors": {
+      "font-display": {
+        "syntax": "[ auto | block | swap | fallback | optional ]",
+        "media": "visual",
+        "percentages": "no",
+        "initial": "auto",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "experimental"
+      },
+      "font-family": {
+        "syntax": "<family-name>",
+        "media": "all",
+        "initial": "n/a (required)",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "font-feature-settings": {
+        "syntax": "normal | <feature-tag-value>#",
+        "media": "all",
+        "initial": "normal",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "orderOfAppearance",
+        "status": "standard"
+      },
+      "font-variation-settings": {
+        "syntax": "normal | [ <string> <number> ]#",
+        "media": "all",
+        "initial": "normal",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "orderOfAppearance",
+        "status": "standard"
+      },
+      "font-stretch": {
+        "syntax": "<font-stretch-absolute>{1,2}",
+        "media": "all",
+        "initial": "normal",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "font-style": {
+        "syntax": "normal | italic | oblique <angle>{0,2}",
+        "media": "all",
+        "initial": "normal",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "font-weight": {
+        "syntax": "<font-weight-absolute>{1,2}",
+        "media": "all",
+        "initial": "normal",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "font-variant": {
+        "syntax": "normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> || stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero || <east-asian-variant-values> || <east-asian-width-values> || ruby ]",
+        "media": "all",
+        "initial": "normal",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "orderOfAppearance",
+        "status": "standard"
+      },
+      "src": {
+        "syntax": "[ <url> [ format( <string># ) ]? | local( <family-name> ) ]#",
+        "media": "all",
+        "initial": "n/a (required)",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "orderOfAppearance",
+        "status": "standard"
+      },
+      "unicode-range": {
+        "syntax": "<unicode-range>#",
+        "media": "all",
+        "initial": "U+0-10FFFF",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "orderOfAppearance",
+        "status": "standard"
+      }
+    },
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@font-face"
+  },
+  "@font-feature-values": {
+    "syntax": "@font-feature-values <family-name># {\n  <feature-value-block-list>\n}",
+    "interfaces": [
+      "CSSFontFeatureValuesRule"
+    ],
+    "groups": [
+      "CSS Fonts"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@font-feature-values"
+  },
+  "@import": {
+    "syntax": "@import [ <string> | <url> ] [ <media-query-list> ]?;",
+    "groups": [
+      "Media Queries"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@import"
+  },
+  "@keyframes": {
+    "syntax": "@keyframes <keyframes-name> {\n  <keyframe-block-list>\n}",
+    "interfaces": [
+      "CSSKeyframeRule",
+      "CSSKeyframesRule"
+    ],
+    "groups": [
+      "CSS Animations"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@keyframes"
+  },
+  "@media": {
+    "syntax": "@media <media-query-list> {\n  <group-rule-body>\n}",
+    "interfaces": [
+      "CSSGroupingRule",
+      "CSSConditionRule",
+      "CSSMediaRule",
+      "CSSCustomMediaRule"
+    ],
+    "groups": [
+      "CSS Conditional Rules",
+      "Media Queries"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@media"
+  },
+  "@namespace": {
+    "syntax": "@namespace <namespace-prefix>? [ <string> | <url> ];",
+    "groups": [
+      "CSS Namespaces"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@namespace"
+  },
+  "@page": {
+    "syntax": "@page <page-selector-list> {\n  <page-body>\n}",
+    "interfaces": [
+      "CSSPageRule"
+    ],
+    "groups": [
+      "CSS Pages"
+    ],
+    "descriptors": {
+      "bleed": {
+        "syntax": "auto | <length>",
+        "media": [
+          "visual",
+          "paged"
+        ],
+        "initial": "auto",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "marks": {
+        "syntax": "none | [ crop || cross ]",
+        "media": [
+          "visual",
+          "paged"
+        ],
+        "initial": "none",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "orderOfAppearance",
+        "status": "standard"
+      },
+      "size": {
+        "syntax": "<length>{1,2} | auto | [ <page-size> || [ portrait | landscape ] ]",
+        "media": [
+          "visual",
+          "paged"
+        ],
+        "initial": "auto",
+        "percentages": "no",
+        "computed": "asSpecifiedRelativeToAbsoluteLengths",
+        "order": "orderOfAppearance",
+        "status": "standard"
+      }
+    },
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@page"
+  },
+  "@property": {
+    "syntax": "@property <custom-property-name> {\n  <declaration-list>\n}",
+    "interfaces": [
+      "CSS",
+      "CSSPropertyRule"
+    ],
+    "groups": [
+      "CSS Houdini"
+    ],
+    "descriptors": {
+      "syntax": {
+        "syntax": "<string>",
+        "media": "all",
+        "percentages": "no",
+        "initial": "n/a (required)",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "experimental"
+      },
+      "inherits": {
+        "syntax": "true | false",
+        "media": "all",
+        "percentages": "no",
+        "initial": "auto",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "experimental"
+      },
+      "initial-value": {
+        "syntax": "<string>",
+        "media": "all",
+        "initial": "n/a (required)",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "experimental"
+      }
+    },
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@property"
+  },
+  "@supports": {
+    "syntax": "@supports <supports-condition> {\n  <group-rule-body>\n}",
+    "interfaces": [
+      "CSSGroupingRule",
+      "CSSConditionRule",
+      "CSSSupportsRule"
+    ],
+    "groups": [
+      "CSS Conditional Rules"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@supports"
+  },
+  "@viewport": {
+    "syntax": "@viewport {\n  <group-rule-body>\n}",
+    "interfaces": [
+      "CSSViewportRule"
+    ],
+    "groups": [
+      "CSS Device Adaptation"
+    ],
+    "descriptors": {
+      "height": {
+        "syntax": "<viewport-length>{1,2}",
+        "media": [
+          "visual",
+          "continuous"
+        ],
+        "initial": [
+          "min-height",
+          "max-height"
+        ],
+        "percentages": [
+          "min-height",
+          "max-height"
+        ],
+        "computed": [
+          "min-height",
+          "max-height"
+        ],
+        "order": "orderOfAppearance",
+        "status": "standard"
+      },
+      "max-height": {
+        "syntax": "<viewport-length>",
+        "media": [
+          "visual",
+          "continuous"
+        ],
+        "initial": "auto",
+        "percentages": "referToHeightOfInitialViewport",
+        "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "max-width": {
+        "syntax": "<viewport-length>",
+        "media": [
+          "visual",
+          "continuous"
+        ],
+        "initial": "auto",
+        "percentages": "referToWidthOfInitialViewport",
+        "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "max-zoom": {
+        "syntax": "auto | <number> | <percentage>",
+        "media": [
+          "visual",
+          "continuous"
+        ],
+        "initial": "auto",
+        "percentages": "the zoom factor itself",
+        "computed": "autoNonNegativeOrPercentage",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "min-height": {
+        "syntax": "<viewport-length>",
+        "media": [
+          "visual",
+          "continuous"
+        ],
+        "initial": "auto",
+        "percentages": "referToHeightOfInitialViewport",
+        "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "min-width": {
+        "syntax": "<viewport-length>",
+        "media": [
+          "visual",
+          "continuous"
+        ],
+        "initial": "auto",
+        "percentages": "referToWidthOfInitialViewport",
+        "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "min-zoom": {
+        "syntax": "auto | <number> | <percentage>",
+        "media": [
+          "visual",
+          "continuous"
+        ],
+        "initial": "auto",
+        "percentages": "the zoom factor itself",
+        "computed": "autoNonNegativeOrPercentage",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "orientation": {
+        "syntax": "auto | portrait | landscape",
+        "media": [
+          "visual",
+          "continuous"
+        ],
+        "initial": "auto",
+        "percentages": "referToSizeOfBoundingBox",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "user-zoom": {
+        "syntax": "zoom | fixed",
+        "media": [
+          "visual",
+          "continuous"
+        ],
+        "initial": "zoom",
+        "percentages": "referToSizeOfBoundingBox",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "viewport-fit": {
+        "syntax": "auto | contain | cover",
+        "media": [
+          "visual",
+          "continuous"
+        ],
+        "initial": "auto",
+        "percentages": "no",
+        "computed": "asSpecified",
+        "order": "uniqueOrder",
+        "status": "standard"
+      },
+      "width": {
+        "syntax": "<viewport-length>{1,2}",
+        "media": [
+          "visual",
+          "continuous"
+        ],
+        "initial": [
+          "min-width",
+          "max-width"
+        ],
+        "percentages": [
+          "min-width",
+          "max-width"
+        ],
+        "computed": [
+          "min-width",
+          "max-width"
+        ],
+        "order": "orderOfAppearance",
+        "status": "standard"
+      },
+      "zoom": {
+        "syntax": "auto | <number> | <percentage>",
+        "media": [
+          "visual",
+          "continuous"
+        ],
+        "initial": "auto",
+        "percentages": "the zoom factor itself",
+        "computed": "autoNonNegativeOrPercentage",
+        "order": "uniqueOrder",
+        "status": "standard"
+      }
+    },
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@viewport"
+  }
+}
diff --git a/node_modules/mdn-data/css/at-rules.schema.json b/node_modules/mdn-data/css/at-rules.schema.json
new file mode 100644
index 0000000..b69505c
--- /dev/null
+++ b/node_modules/mdn-data/css/at-rules.schema.json
@@ -0,0 +1,132 @@
+{
+  "definitions": {
+    "stringOrPropertyList": {
+      "oneOf": [
+        {
+          "type": "string"
+        },
+        {
+          "type": "array",
+          "minItems": 1,
+          "uniqueItems": true,
+          "items": {
+            "type": "string",
+            "property-reference": {
+              "comment": "property-reference is an extension to the JSON schema validator. Here it jumps 3 levels up in the hierarchy and tests if a value is an existing key in descriptors. See test/validate-schema.js for implementation details.",
+              "$data": "3"
+            }
+          }
+        }
+      ]
+    }
+  },
+  "type": "object",
+  "additionalProperties": {
+    "type": "object",
+    "additionalProperties": false,
+    "properties": {
+      "syntax": {
+        "type": "string"
+      },
+      "interfaces": {
+        "type": "array",
+        "items": {
+          "type": "string"
+        }
+      },
+      "groups": {
+        "type": "array",
+        "minitems": 1,
+        "uniqueItems": true,
+        "items": {
+          "$ref": "definitions.json#/groupList"
+        }
+      },
+      "descriptors": {
+        "type": "object",
+        "additionalProperties": {
+          "type": "object",
+          "additionalProperties": false,
+          "properties": {
+            "syntax": {
+              "type": "string"
+            },
+            "media": {
+              "oneOf": [
+                {
+                  "type": "string",
+                  "enum": [
+                    "all",
+                    "continuous",
+                    "paged",
+                    "visual"
+                  ]
+                },
+                {
+                  "type": "array",
+                  "minItems": 2,
+                  "uniqueItems": true,
+                  "items": {
+                    "type": "string",
+                    "enum": [
+                      "continuous",
+                      "paged",
+                      "visual"
+                    ]
+                  }
+                }
+              ]
+            },
+            "initial": {
+              "$ref": "#/definitions/stringOrPropertyList"
+            },
+            "percentages": {
+              "$ref": "#/definitions/stringOrPropertyList"
+            },
+            "computed": {
+              "$ref": "#/definitions/stringOrPropertyList"
+            },
+            "order": {
+              "enum": [
+                "orderOfAppearance",
+                "uniqueOrder"
+              ]
+            },
+            "status": {
+              "enum": [
+                "standard",
+                "nonstandard",
+                "experimental"
+              ]
+            }
+          },
+          "required": [
+            "syntax",
+            "media",
+            "initial",
+            "percentages",
+            "computed",
+            "order",
+            "status"
+          ]
+        }
+      },
+      "status": {
+        "enum": [
+          "standard",
+          "nonstandard",
+          "experimental"
+        ]
+      },
+      "mdn_url": {
+        "type": "string",
+        "pattern": "^https://developer.mozilla.org/docs/Web/CSS/"
+      }
+    },
+    "required": [
+      "syntax",
+      "groups",
+      "status"
+    ]
+  }
+}
diff --git a/node_modules/mdn-data/css/definitions.json b/node_modules/mdn-data/css/definitions.json
new file mode 100644
index 0000000..5d5b200
--- /dev/null
+++ b/node_modules/mdn-data/css/definitions.json
@@ -0,0 +1,77 @@
+{
+  "groupList": {
+    "enum": [
+      "Basic Selectors",
+      "Combinators",
+      "Compositing and Blending",
+      "CSS Angles",
+      "CSS Animations",
+      "CSS Backgrounds and Borders",
+      "CSS Box Model",
+      "CSS Box Alignment",
+      "CSS Break",
+      "CSS Charsets",
+      "CSS Color",
+      "CSS Columns",
+      "CSS Conditional Rules",
+      "CSS Containment",
+      "CSS Counter Styles",
+      "CSS Device Adaptation",
+      "CSS Display",
+      "CSS Flexible Box Layout",
+      "CSS Flexible Lengths",
+      "CSS Fonts",
+      "CSS Fragmentation",
+      "CSS Frequencies",
+      "CSS Generated Content",
+      "CSS Grid Layout",
+      "CSS Houdini",
+      "CSS Images",
+      "CSS Inline",
+      "CSS Lengths",
+      "CSS Lists and Counters",
+      "CSS Logical Properties",
+      "CSS Masking",
+      "CSS Miscellaneous",
+      "CSS Motion Path",
+      "CSS Namespaces",
+      "CSS Overflow",
+      "CSS Pages",
+      "CSS Positioning",
+      "CSS Regions",
+      "CSS Resolutions",
+      "CSS Ruby",
+      "CSS Scroll Anchoring",
+      "CSS Scrollbars",
+      "CSS Scroll Snap",
+      "CSS Shadow Parts",
+      "CSS Shapes",
+      "CSS Speech",
+      "CSS Table",
+      "CSS Text",
+      "CSS Text Decoration",
+      "CSS Times",
+      "CSS Transforms",
+      "CSS Transitions",
+      "CSS Types",
+      "CSS Units",
+      "CSS Basic User Interface",
+      "CSS Variables",
+      "CSS Will Change",
+      "CSS Writing Modes",
+      "CSSOM View",
+      "Filter Effects",
+      "Grouping Selectors",
+      "MathML",
+      "Media Queries",
+      "Microsoft Extensions",
+      "Mozilla Extensions",
+      "Pointer Events",
+      "Pseudo",
+      "Pseudo-classes",
+      "Pseudo-elements",
+      "Selectors",
+      "WebKit Extensions"
+    ]
+  }
+}
diff --git a/node_modules/mdn-data/css/index.js b/node_modules/mdn-data/css/index.js
new file mode 100644
index 0000000..c258137
--- /dev/null
+++ b/node_modules/mdn-data/css/index.js
@@ -0,0 +1,8 @@
+module.exports = {
+  atRules:    require('./at-rules'),
+  selectors:  require('./selectors'),
+  types:      require('./types'),
+  properties: require('./properties'),
+  syntaxes:   require('./syntaxes'),
+  units:      require('./units'),
+}
diff --git a/node_modules/mdn-data/css/properties.json b/node_modules/mdn-data/css/properties.json
new file mode 100644
index 0000000..d06a918
--- /dev/null
+++ b/node_modules/mdn-data/css/properties.json
@@ -0,0 +1,9163 @@
+{
+  "--*": {
+    "syntax": "<declaration-value>",
+    "media": "all",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Variables"
+    ],
+    "initial": "seeProse",
+    "appliesto": "allElements",
+    "computed": "asSpecifiedWithVarsSubstituted",
+    "order": "perGrammar",
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/--*"
+  },
+  "-ms-accelerator": {
+    "syntax": "false | true",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "false",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-accelerator"
+  },
+  "-ms-block-progression": {
+    "syntax": "tb | rl | bt | lr",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "tb",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-block-progression"
+  },
+  "-ms-content-zoom-chaining": {
+    "syntax": "none | chained",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-content-zoom-chaining"
+  },
+  "-ms-content-zooming": {
+    "syntax": "none | zoom",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "zoomForTheTopLevelNoneForTheRest",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-content-zooming"
+  },
+  "-ms-content-zoom-limit": {
+    "syntax": "<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": [
+      "-ms-content-zoom-limit-max",
+      "-ms-content-zoom-limit-min"
+    ],
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": [
+      "-ms-content-zoom-limit-max",
+      "-ms-content-zoom-limit-min"
+    ],
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": [
+      "-ms-content-zoom-limit-max",
+      "-ms-content-zoom-limit-min"
+    ],
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-content-zoom-limit"
+  },
+  "-ms-content-zoom-limit-max": {
+    "syntax": "<percentage>",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "maxZoomFactor",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "400%",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-content-zoom-limit-max"
+  },
+  "-ms-content-zoom-limit-min": {
+    "syntax": "<percentage>",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "minZoomFactor",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "100%",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-content-zoom-limit-min"
+  },
+  "-ms-content-zoom-snap": {
+    "syntax": "<'-ms-content-zoom-snap-type'> || <'-ms-content-zoom-snap-points'>",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": [
+      "-ms-content-zoom-snap-type",
+      "-ms-content-zoom-snap-points"
+    ],
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": [
+      "-ms-content-zoom-snap-type",
+      "-ms-content-zoom-snap-points"
+    ],
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-content-zoom-snap"
+  },
+  "-ms-content-zoom-snap-points": {
+    "syntax": "snapInterval( <percentage>, <percentage> ) | snapList( <percentage># )",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "snapInterval(0%, 100%)",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-content-zoom-snap-points"
+  },
+  "-ms-content-zoom-snap-type": {
+    "syntax": "none | proximity | mandatory",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-content-zoom-snap-type"
+  },
+  "-ms-filter": {
+    "syntax": "<string>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "\"\"",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-filter"
+  },
+  "-ms-flow-from": {
+    "syntax": "[ none | <custom-ident> ]#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "nonReplacedElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-flow-from"
+  },
+  "-ms-flow-into": {
+    "syntax": "[ none | <custom-ident> ]#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "iframeElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-flow-into"
+  },
+  "-ms-grid-columns": {
+    "syntax": "none | <track-list> | <auto-track-list>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "simpleListOfLpcDifferenceLpc",
+    "percentages": "referToDimensionOfContentArea",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "none",
+    "appliesto": "gridContainers",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-grid-columns"
+  },
+  "-ms-grid-rows": {
+    "syntax": "none | <track-list> | <auto-track-list>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "simpleListOfLpcDifferenceLpc",
+    "percentages": "referToDimensionOfContentArea",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "none",
+    "appliesto": "gridContainers",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-grid-rows"
+  },
+  "-ms-high-contrast-adjust": {
+    "syntax": "auto | none",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-high-contrast-adjust"
+  },
+  "-ms-hyphenate-limit-chars": {
+    "syntax": "auto | <integer>{1,3}",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-hyphenate-limit-chars"
+  },
+  "-ms-hyphenate-limit-lines": {
+    "syntax": "no-limit | <integer>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "no-limit",
+    "appliesto": "blockContainerElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-hyphenate-limit-lines"
+  },
+  "-ms-hyphenate-limit-zone": {
+    "syntax": "<percentage> | <length>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "referToLineBoxWidth",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "0",
+    "appliesto": "blockContainerElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-hyphenate-limit-zone"
+  },
+  "-ms-ime-align": {
+    "syntax": "auto | after",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-ime-align"
+  },
+  "-ms-overflow-style": {
+    "syntax": "auto | none | scrollbar | -ms-autohiding-scrollbar",
+    "media": "interactive",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "auto",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-overflow-style"
+  },
+  "-ms-scrollbar-3dlight-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "dependsOnUserAgent",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-3dlight-color"
+  },
+  "-ms-scrollbar-arrow-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "ButtonText",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-arrow-color"
+  },
+  "-ms-scrollbar-base-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "dependsOnUserAgent",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-base-color"
+  },
+  "-ms-scrollbar-darkshadow-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "ThreeDDarkShadow",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-darkshadow-color"
+  },
+  "-ms-scrollbar-face-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "ThreeDFace",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-face-color"
+  },
+  "-ms-scrollbar-highlight-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "ThreeDHighlight",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-highlight-color"
+  },
+  "-ms-scrollbar-shadow-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "ThreeDDarkShadow",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-shadow-color"
+  },
+  "-ms-scrollbar-track-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "Scrollbar",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-track-color"
+  },
+  "-ms-scroll-chaining": {
+    "syntax": "chained | none",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "chained",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-chaining"
+  },
+  "-ms-scroll-limit": {
+    "syntax": "<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": [
+      "-ms-scroll-limit-x-min",
+      "-ms-scroll-limit-y-min",
+      "-ms-scroll-limit-x-max",
+      "-ms-scroll-limit-y-max"
+    ],
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": [
+      "-ms-scroll-limit-x-min",
+      "-ms-scroll-limit-y-min",
+      "-ms-scroll-limit-x-max",
+      "-ms-scroll-limit-y-max"
+    ],
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-limit"
+  },
+  "-ms-scroll-limit-x-max": {
+    "syntax": "auto | <length>",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "auto",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-limit-x-max"
+  },
+  "-ms-scroll-limit-x-min": {
+    "syntax": "<length>",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "0",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-limit-x-min"
+  },
+  "-ms-scroll-limit-y-max": {
+    "syntax": "auto | <length>",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "auto",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-limit-y-max"
+  },
+  "-ms-scroll-limit-y-min": {
+    "syntax": "<length>",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "0",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-limit-y-min"
+  },
+  "-ms-scroll-rails": {
+    "syntax": "none | railed",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "railed",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-rails"
+  },
+  "-ms-scroll-snap-points-x": {
+    "syntax": "snapInterval( <length-percentage>, <length-percentage> ) | snapList( <length-percentage># )",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "snapInterval(0px, 100%)",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-snap-points-x"
+  },
+  "-ms-scroll-snap-points-y": {
+    "syntax": "snapInterval( <length-percentage>, <length-percentage> ) | snapList( <length-percentage># )",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "snapInterval(0px, 100%)",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-snap-points-y"
+  },
+  "-ms-scroll-snap-type": {
+    "syntax": "none | proximity | mandatory",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-snap-type"
+  },
+  "-ms-scroll-snap-x": {
+    "syntax": "<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": [
+      "-ms-scroll-snap-type",
+      "-ms-scroll-snap-points-x"
+    ],
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": [
+      "-ms-scroll-snap-type",
+      "-ms-scroll-snap-points-x"
+    ],
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-snap-x"
+  },
+  "-ms-scroll-snap-y": {
+    "syntax": "<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": [
+      "-ms-scroll-snap-type",
+      "-ms-scroll-snap-points-y"
+    ],
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": [
+      "-ms-scroll-snap-type",
+      "-ms-scroll-snap-points-y"
+    ],
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-snap-y"
+  },
+  "-ms-scroll-translation": {
+    "syntax": "none | vertical-to-horizontal",
+    "media": "interactive",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-translation"
+  },
+  "-ms-text-autospace": {
+    "syntax": "none | ideograph-alpha | ideograph-numeric | ideograph-parenthesis | ideograph-space",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-text-autospace"
+  },
+  "-ms-touch-select": {
+    "syntax": "grippers | none",
+    "media": "interactive",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "grippers",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-touch-select"
+  },
+  "-ms-user-select": {
+    "syntax": "none | element | text",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "text",
+    "appliesto": "nonReplacedElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-user-select"
+  },
+  "-ms-wrap-flow": {
+    "syntax": "auto | both | start | end | maximum | clear",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "auto",
+    "appliesto": "blockLevelElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-wrap-flow"
+  },
+  "-ms-wrap-margin": {
+    "syntax": "<length>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "0",
+    "appliesto": "exclusionElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-wrap-margin"
+  },
+  "-ms-wrap-through": {
+    "syntax": "wrap | none",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "wrap",
+    "appliesto": "blockLevelElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-wrap-through"
+  },
+  "-moz-appearance": {
+    "syntax": "none | button | button-arrow-down | button-arrow-next | button-arrow-previous | button-arrow-up | button-bevel | button-focus | caret | checkbox | checkbox-container | checkbox-label | checkmenuitem | dualbutton | groupbox | listbox | listitem | menuarrow | menubar | menucheckbox | menuimage | menuitem | menuitemtext | menulist | menulist-button | menulist-text | menulist-textfield | menupopup | menuradio | menuseparator | meterbar | meterchunk | progressbar | progressbar-vertical | progresschunk | progresschunk-vertical | radio | radio-container | radio-label | radiomenuitem | range | range-thumb | resizer | resizerpanel | scale-horizontal | scalethumbend | scalethumb-horizontal | scalethumbstart | scalethumbtick | scalethumb-vertical | scale-vertical | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical | searchfield | separator | sheet | spinner | spinner-downbutton | spinner-textfield | spinner-upbutton | splitter | statusbar | statusbarpanel | tab | tabpanel | tabpanels | tab-scroll-arrow-back | tab-scroll-arrow-forward | textfield | textfield-multiline | toolbar | toolbarbutton | toolbarbutton-dropdown | toolbargripper | toolbox | tooltip | treeheader | treeheadercell | treeheadersortarrow | treeitem | treeline | treetwisty | treetwistyopen | treeview | -moz-mac-unified-toolbar | -moz-win-borderless-glass | -moz-win-browsertabbar-toolbox | -moz-win-communicationstext | -moz-win-communications-toolbox | -moz-win-exclude-glass | -moz-win-glass | -moz-win-mediatext | -moz-win-media-toolbox | -moz-window-button-box | -moz-window-button-box-maximized | -moz-window-button-close | -moz-window-button-maximize | -moz-window-button-minimize | -moz-window-button-restore | -moz-window-frame-bottom | -moz-window-frame-left | -moz-window-frame-right | -moz-window-titlebar | -moz-window-titlebar-maximized",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions",
+      "WebKit Extensions"
+    ],
+    "initial": "noneButOverriddenInUserAgentCSS",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/appearance"
+  },
+  "-moz-binding": {
+    "syntax": "<url> | none",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "allElementsExceptGeneratedContentOrPseudoElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-binding"
+  },
+  "-moz-border-bottom-colors": {
+    "syntax": "<color>+ | none",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-border-bottom-colors"
+  },
+  "-moz-border-left-colors": {
+    "syntax": "<color>+ | none",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-border-left-colors"
+  },
+  "-moz-border-right-colors": {
+    "syntax": "<color>+ | none",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-border-right-colors"
+  },
+  "-moz-border-top-colors": {
+    "syntax": "<color>+ | none",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-border-top-colors"
+  },
+  "-moz-context-properties": {
+    "syntax": "none | [ fill | fill-opacity | stroke | stroke-opacity ]#",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "allElementsThatCanReferenceImages",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-context-properties"
+  },
+  "-moz-float-edge": {
+    "syntax": "border-box | content-box | margin-box | padding-box",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "content-box",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-float-edge"
+  },
+  "-moz-force-broken-image-icon": {
+    "syntax": "<integer [0,1]>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "0",
+    "appliesto": "images",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-force-broken-image-icon"
+  },
+  "-moz-image-region": {
+    "syntax": "<shape> | auto",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "auto",
+    "appliesto": "xulImageElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-image-region"
+  },
+  "-moz-orient": {
+    "syntax": "inline | block | horizontal | vertical",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "inline",
+    "appliesto": "anyElementEffectOnProgressAndMeter",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-orient"
+  },
+  "-moz-outline-radius": {
+    "syntax": "<outline-radius>{1,4} [ / <outline-radius>{1,4} ]?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "-moz-outline-radius-topleft",
+      "-moz-outline-radius-topright",
+      "-moz-outline-radius-bottomright",
+      "-moz-outline-radius-bottomleft"
+    ],
+    "percentages": [
+      "-moz-outline-radius-topleft",
+      "-moz-outline-radius-topright",
+      "-moz-outline-radius-bottomright",
+      "-moz-outline-radius-bottomleft"
+    ],
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": [
+      "-moz-outline-radius-topleft",
+      "-moz-outline-radius-topright",
+      "-moz-outline-radius-bottomright",
+      "-moz-outline-radius-bottomleft"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "-moz-outline-radius-topleft",
+      "-moz-outline-radius-topright",
+      "-moz-outline-radius-bottomright",
+      "-moz-outline-radius-bottomleft"
+    ],
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius"
+  },
+  "-moz-outline-radius-bottomleft": {
+    "syntax": "<outline-radius>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToDimensionOfBorderBox",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-bottomleft"
+  },
+  "-moz-outline-radius-bottomright": {
+    "syntax": "<outline-radius>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToDimensionOfBorderBox",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-bottomright"
+  },
+  "-moz-outline-radius-topleft": {
+    "syntax": "<outline-radius>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToDimensionOfBorderBox",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-topleft"
+  },
+  "-moz-outline-radius-topright": {
+    "syntax": "<outline-radius>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToDimensionOfBorderBox",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-topright"
+  },
+  "-moz-stack-sizing": {
+    "syntax": "ignore | stretch-to-fit",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "stretch-to-fit",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-stack-sizing"
+  },
+  "-moz-text-blink": {
+    "syntax": "none | blink",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-text-blink"
+  },
+  "-moz-user-focus": {
+    "syntax": "ignore | normal | select-after | select-before | select-menu | select-same | select-all | none",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-user-focus"
+  },
+  "-moz-user-input": {
+    "syntax": "auto | none | enabled | disabled",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-user-input"
+  },
+  "-moz-user-modify": {
+    "syntax": "read-only | read-write | write-only",
+    "media": "interactive",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "read-only",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-user-modify"
+  },
+  "-moz-window-dragging": {
+    "syntax": "drag | no-drag",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "drag",
+    "appliesto": "allElementsCreatingNativeWindows",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-window-dragging"
+  },
+  "-moz-window-shadow": {
+    "syntax": "default | menu | tooltip | sheet | none",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "default",
+    "appliesto": "allElementsCreatingNativeWindows",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-window-shadow"
+  },
+  "-webkit-appearance": {
+    "syntax": "none | button | button-bevel | caret | checkbox | default-button | inner-spin-button | listbox | listitem | media-controls-background | media-controls-fullscreen-background | media-current-time-display | media-enter-fullscreen-button | media-exit-fullscreen-button | media-fullscreen-button | media-mute-button | media-overlay-play-button | media-play-button | media-seek-back-button | media-seek-forward-button | media-slider | media-sliderthumb | media-time-remaining-display | media-toggle-closed-captions-button | media-volume-slider | media-volume-slider-container | media-volume-sliderthumb | menulist | menulist-button | menulist-text | menulist-textfield | meter | progress-bar | progress-bar-value | push-button | radio | searchfield | searchfield-cancel-button | searchfield-decoration | searchfield-results-button | searchfield-results-decoration | slider-horizontal | slider-vertical | sliderthumb-horizontal | sliderthumb-vertical | square-button | textarea | textfield | -apple-pay-button",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "noneButOverriddenInUserAgentCSS",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/appearance"
+  },
+  "-webkit-border-before": {
+    "syntax": "<'border-width'> || <'border-style'> || <'color'>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": [
+      "-webkit-border-before-width"
+    ],
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": [
+      "border-width",
+      "border-style",
+      "color"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "border-width",
+      "border-style",
+      "color"
+    ],
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-border-before"
+  },
+  "-webkit-border-before-color": {
+    "syntax": "<'color'>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "currentcolor",
+    "appliesto": "allElements",
+    "computed": "computedColor",
+    "order": "uniqueOrder",
+    "status": "nonstandard"
+  },
+  "-webkit-border-before-style": {
+    "syntax": "<'border-style'>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard"
+  },
+  "-webkit-border-before-width": {
+    "syntax": "<'border-width'>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "logicalWidthOfContainingBlock",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "medium",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthZeroIfBorderStyleNoneOrHidden",
+    "order": "uniqueOrder",
+    "status": "nonstandard"
+  },
+  "-webkit-box-reflect": {
+    "syntax": "[ above | below | right | left ]? <length>? <image>?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-box-reflect"
+  },
+  "-webkit-line-clamp": {
+    "syntax": "none | <integer>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions",
+      "CSS Overflow"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-line-clamp"
+  },
+  "-webkit-mask": {
+    "syntax": "[ <mask-reference> || <position> [ / <bg-size> ]? || <repeat-style> || [ <box> | border | padding | content | text ] || [ <box> | border | padding | content ] ]#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": [
+      "-webkit-mask-image",
+      "-webkit-mask-repeat",
+      "-webkit-mask-attachment",
+      "-webkit-mask-position",
+      "-webkit-mask-origin",
+      "-webkit-mask-clip"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "-webkit-mask-image",
+      "-webkit-mask-repeat",
+      "-webkit-mask-attachment",
+      "-webkit-mask-position",
+      "-webkit-mask-origin",
+      "-webkit-mask-clip"
+    ],
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask"
+  },
+  "-webkit-mask-attachment": {
+    "syntax": "<attachment>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "scroll",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-attachment"
+  },
+  "-webkit-mask-clip": {
+    "syntax": "[ <box> | border | padding | content | text ]#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "border",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-clip"
+  },
+  "-webkit-mask-composite": {
+    "syntax": "<composite-style>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "source-over",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-composite"
+  },
+  "-webkit-mask-image": {
+    "syntax": "<mask-reference>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "absoluteURIOrNone",
+    "order": "orderOfAppearance",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-image"
+  },
+  "-webkit-mask-origin": {
+    "syntax": "[ <box> | border | padding | content ]#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "padding",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-origin"
+  },
+  "-webkit-mask-position": {
+    "syntax": "<position>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "referToSizeOfElement",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "0% 0%",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthOrPercentage",
+    "order": "orderOfAppearance",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-position"
+  },
+  "-webkit-mask-position-x": {
+    "syntax": "[ <length-percentage> | left | center | right ]#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "referToSizeOfElement",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "0%",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthOrPercentage",
+    "order": "orderOfAppearance",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-x"
+  },
+  "-webkit-mask-position-y": {
+    "syntax": "[ <length-percentage> | top | center | bottom ]#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "referToSizeOfElement",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "0%",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthOrPercentage",
+    "order": "orderOfAppearance",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-y"
+  },
+  "-webkit-mask-repeat": {
+    "syntax": "<repeat-style>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "repeat",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-repeat"
+  },
+  "-webkit-mask-repeat-x": {
+    "syntax": "repeat | no-repeat | space | round",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "repeat",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-x"
+  },
+  "-webkit-mask-repeat-y": {
+    "syntax": "repeat | no-repeat | space | round",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "repeat",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthOrPercentage",
+    "order": "orderOfAppearance",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-y"
+  },
+  "-webkit-mask-size": {
+    "syntax": "<bg-size>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "relativeToBackgroundPositioningArea",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "auto auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-size"
+  },
+  "-webkit-overflow-scrolling": {
+    "syntax": "auto | touch",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "auto",
+    "appliesto": "scrollingBoxes",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-overflow-scrolling"
+  },
+  "-webkit-tap-highlight-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "black",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-tap-highlight-color"
+  },
+  "-webkit-text-fill-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "currentcolor",
+    "appliesto": "allElements",
+    "computed": "computedColor",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-text-fill-color"
+  },
+  "-webkit-text-stroke": {
+    "syntax": "<length> || <color>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": [
+      "-webkit-text-stroke-width",
+      "-webkit-text-stroke-color"
+    ],
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": [
+      "-webkit-text-stroke-width",
+      "-webkit-text-stroke-color"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "-webkit-text-stroke-width",
+      "-webkit-text-stroke-color"
+    ],
+    "order": "canonicalOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke"
+  },
+  "-webkit-text-stroke-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "currentcolor",
+    "appliesto": "allElements",
+    "computed": "computedColor",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-color"
+  },
+  "-webkit-text-stroke-width": {
+    "syntax": "<length>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "absoluteLength",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-width"
+  },
+  "-webkit-touch-callout": {
+    "syntax": "default | none",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "default",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-touch-callout"
+  },
+  "-webkit-user-modify": {
+    "syntax": "read-only | read-write | read-write-plaintext-only",
+    "media": "interactive",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "WebKit Extensions"
+    ],
+    "initial": "read-only",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard"
+  },
+  "align-content": {
+    "syntax": "normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Box Alignment"
+    ],
+    "initial": "normal",
+    "appliesto": "multilineFlexContainers",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/align-content"
+  },
+  "align-items": {
+    "syntax": "normal | stretch | <baseline-position> | [ <overflow-position>? <self-position> ]",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Box Alignment"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/align-items"
+  },
+  "align-self": {
+    "syntax": "auto | normal | stretch | <baseline-position> | <overflow-position>? <self-position>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Box Alignment"
+    ],
+    "initial": "auto",
+    "appliesto": "flexItemsGridItemsAndAbsolutelyPositionedBoxes",
+    "computed": "autoOnAbsolutelyPositionedElementsValueOfAlignItemsOnParent",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/align-self"
+  },
+  "align-tracks": {
+    "syntax": "[ normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position> ]#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "normal",
+    "appliesto": "gridContainersWithMasonryLayoutInTheirBlockAxis",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/align-tracks"
+  },
+  "all": {
+    "syntax": "initial | inherit | unset | revert",
+    "media": "noPracticalMedia",
+    "inherited": false,
+    "animationType": "eachOfShorthandPropertiesExceptUnicodeBiDiAndDirection",
+    "percentages": "no",
+    "groups": [
+      "CSS Miscellaneous"
+    ],
+    "initial": "noPracticalInitialValue",
+    "appliesto": "allElements",
+    "computed": "asSpecifiedAppliesToEachProperty",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/all"
+  },
+  "animation": {
+    "syntax": "<single-animation>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Animations"
+    ],
+    "initial": [
+      "animation-name",
+      "animation-duration",
+      "animation-timing-function",
+      "animation-delay",
+      "animation-iteration-count",
+      "animation-direction",
+      "animation-fill-mode",
+      "animation-play-state"
+    ],
+    "appliesto": "allElementsAndPseudos",
+    "computed": [
+      "animation-name",
+      "animation-duration",
+      "animation-timing-function",
+      "animation-delay",
+      "animation-direction",
+      "animation-iteration-count",
+      "animation-fill-mode",
+      "animation-play-state"
+    ],
+    "order": "orderOfAppearance",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation"
+  },
+  "animation-delay": {
+    "syntax": "<time>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Animations"
+    ],
+    "initial": "0s",
+    "appliesto": "allElementsAndPseudos",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation-delay"
+  },
+  "animation-direction": {
+    "syntax": "<single-animation-direction>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Animations"
+    ],
+    "initial": "normal",
+    "appliesto": "allElementsAndPseudos",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation-direction"
+  },
+  "animation-duration": {
+    "syntax": "<time>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Animations"
+    ],
+    "initial": "0s",
+    "appliesto": "allElementsAndPseudos",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation-duration"
+  },
+  "animation-fill-mode": {
+    "syntax": "<single-animation-fill-mode>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Animations"
+    ],
+    "initial": "none",
+    "appliesto": "allElementsAndPseudos",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation-fill-mode"
+  },
+  "animation-iteration-count": {
+    "syntax": "<single-animation-iteration-count>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Animations"
+    ],
+    "initial": "1",
+    "appliesto": "allElementsAndPseudos",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation-iteration-count"
+  },
+  "animation-name": {
+    "syntax": "[ none | <keyframes-name> ]#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Animations"
+    ],
+    "initial": "none",
+    "appliesto": "allElementsAndPseudos",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation-name"
+  },
+  "animation-play-state": {
+    "syntax": "<single-animation-play-state>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Animations"
+    ],
+    "initial": "running",
+    "appliesto": "allElementsAndPseudos",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation-play-state"
+  },
+  "animation-timing-function": {
+    "syntax": "<timing-function>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Animations"
+    ],
+    "initial": "ease",
+    "appliesto": "allElementsAndPseudos",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation-timing-function"
+  },
+  "appearance": {
+    "syntax": "none | auto | textfield | menulist-button | <compat-auto>",
+    "media": "all",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Basic User Interface"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/appearance"
+  },
+  "aspect-ratio": {
+    "syntax": "auto | <ratio>",
+    "media": "all",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Basic User Interface"
+    ],
+    "initial": "auto",
+    "appliesto": "allElementsExceptInlineBoxesAndInternalRubyOrTableBoxes",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/aspect-ratio"
+  },
+  "azimuth": {
+    "syntax": "<angle> | [ [ left-side | far-left | left | center-left | center | center-right | right | far-right | right-side ] || behind ] | leftwards | rightwards",
+    "media": "aural",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Speech"
+    ],
+    "initial": "center",
+    "appliesto": "allElements",
+    "computed": "normalizedAngle",
+    "order": "orderOfAppearance",
+    "status": "obsolete",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/azimuth"
+  },
+  "backdrop-filter": {
+    "syntax": "none | <filter-function-list>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "filterList",
+    "percentages": "no",
+    "groups": [
+      "Filter Effects"
+    ],
+    "initial": "none",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/backdrop-filter"
+  },
+  "backface-visibility": {
+    "syntax": "visible | hidden",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Transforms"
+    ],
+    "initial": "visible",
+    "appliesto": "transformableElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/backface-visibility"
+  },
+  "background": {
+    "syntax": "[ <bg-layer> , ]* <final-bg-layer>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "background-color",
+      "background-image",
+      "background-clip",
+      "background-position",
+      "background-size",
+      "background-repeat",
+      "background-attachment"
+    ],
+    "percentages": [
+      "background-position",
+      "background-size"
+    ],
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": [
+      "background-image",
+      "background-position",
+      "background-size",
+      "background-repeat",
+      "background-origin",
+      "background-clip",
+      "background-attachment",
+      "background-color"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "background-image",
+      "background-position",
+      "background-size",
+      "background-repeat",
+      "background-origin",
+      "background-clip",
+      "background-attachment",
+      "background-color"
+    ],
+    "order": "orderOfAppearance",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background"
+  },
+  "background-attachment": {
+    "syntax": "<attachment>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "scroll",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-attachment"
+  },
+  "background-blend-mode": {
+    "syntax": "<blend-mode>#",
+    "media": "none",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Compositing and Blending"
+    ],
+    "initial": "normal",
+    "appliesto": "allElementsSVGContainerGraphicsAndGraphicsReferencingElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-blend-mode"
+  },
+  "background-clip": {
+    "syntax": "<box>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "border-box",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-clip"
+  },
+  "background-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "transparent",
+    "appliesto": "allElements",
+    "computed": "computedColor",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-color"
+  },
+  "background-image": {
+    "syntax": "<bg-image>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecifiedURLsAbsolute",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-image"
+  },
+  "background-origin": {
+    "syntax": "<box>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "padding-box",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-origin"
+  },
+  "background-position": {
+    "syntax": "<bg-position>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "repeatableListOfSimpleListOfLpc",
+    "percentages": "referToSizeOfBackgroundPositioningAreaMinusBackgroundImageSize",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "0% 0%",
+    "appliesto": "allElements",
+    "computed": "listEachItemTwoKeywordsOriginOffsets",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-position"
+  },
+  "background-position-x": {
+    "syntax": "[ center | [ [ left | right | x-start | x-end ]? <length-percentage>? ]! ]#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "referToWidthOfBackgroundPositioningAreaMinusBackgroundImageHeight",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "left",
+    "appliesto": "allElements",
+    "computed": "listEachItemConsistingOfAbsoluteLengthPercentageAndOrigin",
+    "order": "uniqueOrder",
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-position-x"
+  },
+  "background-position-y": {
+    "syntax": "[ center | [ [ top | bottom | y-start | y-end ]? <length-percentage>? ]! ]#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "referToHeightOfBackgroundPositioningAreaMinusBackgroundImageHeight",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "top",
+    "appliesto": "allElements",
+    "computed": "listEachItemConsistingOfAbsoluteLengthPercentageAndOrigin",
+    "order": "uniqueOrder",
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-position-y"
+  },
+  "background-repeat": {
+    "syntax": "<repeat-style>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "repeat",
+    "appliesto": "allElements",
+    "computed": "listEachItemHasTwoKeywordsOnePerDimension",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-repeat"
+  },
+  "background-size": {
+    "syntax": "<bg-size>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "repeatableListOfSimpleListOfLpc",
+    "percentages": "relativeToBackgroundPositioningArea",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "auto auto",
+    "appliesto": "allElements",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-size"
+  },
+  "block-overflow": {
+    "syntax": "clip | ellipsis | <string>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Overflow"
+    ],
+    "initial": "clip",
+    "appliesto": "blockContainers",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "experimental"
+  },
+  "block-size": {
+    "syntax": "<'width'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "blockSizeOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "auto",
+    "appliesto": "sameAsWidthAndHeight",
+    "computed": "sameAsWidthAndHeight",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/block-size"
+  },
+  "border": {
+    "syntax": "<line-width> || <line-style> || <color>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "border-color",
+      "border-style",
+      "border-width"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": [
+      "border-width",
+      "border-style",
+      "border-color"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "border-width",
+      "border-style",
+      "border-color"
+    ],
+    "order": "orderOfAppearance",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border"
+  },
+  "border-block": {
+    "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": [
+      "border-top-width",
+      "border-top-style",
+      "border-top-color"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "border-top-width",
+      "border-top-style",
+      "border-top-color"
+    ],
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block"
+  },
+  "border-block-color": {
+    "syntax": "<'border-top-color'>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "currentcolor",
+    "appliesto": "allElements",
+    "computed": "computedColor",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-color"
+  },
+  "border-block-style": {
+    "syntax": "<'border-top-style'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-style"
+  },
+  "border-block-width": {
+    "syntax": "<'border-top-width'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "logicalWidthOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "medium",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthZeroIfBorderStyleNoneOrHidden",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-width"
+  },
+  "border-block-end": {
+    "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "border-block-end-color",
+      "border-block-end-style",
+      "border-block-end-width"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": [
+      "border-top-width",
+      "border-top-style",
+      "border-top-color"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "border-top-width",
+      "border-top-style",
+      "border-top-color"
+    ],
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-end"
+  },
+  "border-block-end-color": {
+    "syntax": "<'border-top-color'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "currentcolor",
+    "appliesto": "allElements",
+    "computed": "computedColor",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-end-color"
+  },
+  "border-block-end-style": {
+    "syntax": "<'border-top-style'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-end-style"
+  },
+  "border-block-end-width": {
+    "syntax": "<'border-top-width'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "logicalWidthOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "medium",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthZeroIfBorderStyleNoneOrHidden",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-end-width"
+  },
+  "border-block-start": {
+    "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "border-block-start-color",
+      "border-block-start-style",
+      "border-block-start-width"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": [
+      "border-width",
+      "border-style",
+      "color"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "border-width",
+      "border-style",
+      "border-block-start-color"
+    ],
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-start"
+  },
+  "border-block-start-color": {
+    "syntax": "<'border-top-color'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "currentcolor",
+    "appliesto": "allElements",
+    "computed": "computedColor",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-start-color"
+  },
+  "border-block-start-style": {
+    "syntax": "<'border-top-style'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-start-style"
+  },
+  "border-block-start-width": {
+    "syntax": "<'border-top-width'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "logicalWidthOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "medium",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthZeroIfBorderStyleNoneOrHidden",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-start-width"
+  },
+  "border-bottom": {
+    "syntax": "<line-width> || <line-style> || <color>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "border-bottom-color",
+      "border-bottom-style",
+      "border-bottom-width"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": [
+      "border-bottom-width",
+      "border-bottom-style",
+      "border-bottom-color"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "border-bottom-width",
+      "border-bottom-style",
+      "border-bottom-color"
+    ],
+    "order": "orderOfAppearance",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom"
+  },
+  "border-bottom-color": {
+    "syntax": "<'border-top-color'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "currentcolor",
+    "appliesto": "allElements",
+    "computed": "computedColor",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom-color"
+  },
+  "border-bottom-left-radius": {
+    "syntax": "<length-percentage>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToDimensionOfBorderBox",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+    "computed": "twoAbsoluteLengthOrPercentages",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom-left-radius"
+  },
+  "border-bottom-right-radius": {
+    "syntax": "<length-percentage>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToDimensionOfBorderBox",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+    "computed": "twoAbsoluteLengthOrPercentages",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom-right-radius"
+  },
+  "border-bottom-style": {
+    "syntax": "<line-style>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom-style"
+  },
+  "border-bottom-width": {
+    "syntax": "<line-width>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "medium",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthOr0IfBorderBottomStyleNoneOrHidden",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom-width"
+  },
+  "border-collapse": {
+    "syntax": "collapse | separate",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Table"
+    ],
+    "initial": "separate",
+    "appliesto": "tableElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-collapse"
+  },
+  "border-color": {
+    "syntax": "<color>{1,4}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "border-bottom-color",
+      "border-left-color",
+      "border-right-color",
+      "border-top-color"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": [
+      "border-top-color",
+      "border-right-color",
+      "border-bottom-color",
+      "border-left-color"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "border-bottom-color",
+      "border-left-color",
+      "border-right-color",
+      "border-top-color"
+    ],
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-color"
+  },
+  "border-end-end-radius": {
+    "syntax": "<length-percentage>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToDimensionOfBorderBox",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+    "computed": "twoAbsoluteLengthOrPercentages",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-end-end-radius"
+  },
+  "border-end-start-radius": {
+    "syntax": "<length-percentage>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToDimensionOfBorderBox",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+    "computed": "twoAbsoluteLengthOrPercentages",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-end-start-radius"
+  },
+  "border-image": {
+    "syntax": "<'border-image-source'> || <'border-image-slice'> [ / <'border-image-width'> | / <'border-image-width'>? / <'border-image-outset'> ]? || <'border-image-repeat'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": [
+      "border-image-slice",
+      "border-image-width"
+    ],
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": [
+      "border-image-source",
+      "border-image-slice",
+      "border-image-width",
+      "border-image-outset",
+      "border-image-repeat"
+    ],
+    "appliesto": "allElementsExceptTableElementsWhenCollapse",
+    "computed": [
+      "border-image-outset",
+      "border-image-repeat",
+      "border-image-slice",
+      "border-image-source",
+      "border-image-width"
+    ],
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-image"
+  },
+  "border-image-outset": {
+    "syntax": "[ <length> | <number> ]{1,4}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsExceptTableElementsWhenCollapse",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-image-outset"
+  },
+  "border-image-repeat": {
+    "syntax": "[ stretch | repeat | round | space ]{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "stretch",
+    "appliesto": "allElementsExceptTableElementsWhenCollapse",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-image-repeat"
+  },
+  "border-image-slice": {
+    "syntax": "<number-percentage>{1,4} && fill?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "referToSizeOfBorderImage",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "100%",
+    "appliesto": "allElementsExceptTableElementsWhenCollapse",
+    "computed": "oneToFourPercentagesOrAbsoluteLengthsPlusFill",
+    "order": "percentagesOrLengthsFollowedByFill",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-image-slice"
+  },
+  "border-image-source": {
+    "syntax": "none | <image>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "none",
+    "appliesto": "allElementsExceptTableElementsWhenCollapse",
+    "computed": "noneOrImageWithAbsoluteURI",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-image-source"
+  },
+  "border-image-width": {
+    "syntax": "[ <length-percentage> | <number> | auto ]{1,4}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "referToWidthOrHeightOfBorderImageArea",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "1",
+    "appliesto": "allElementsExceptTableElementsWhenCollapse",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-image-width"
+  },
+  "border-inline": {
+    "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": [
+      "border-top-width",
+      "border-top-style",
+      "border-top-color"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "border-top-width",
+      "border-top-style",
+      "border-top-color"
+    ],
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline"
+  },
+  "border-inline-end": {
+    "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "border-inline-end-color",
+      "border-inline-end-style",
+      "border-inline-end-width"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": [
+      "border-width",
+      "border-style",
+      "color"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "border-width",
+      "border-style",
+      "border-inline-end-color"
+    ],
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-end"
+  },
+  "border-inline-color": {
+    "syntax": "<'border-top-color'>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "currentcolor",
+    "appliesto": "allElements",
+    "computed": "computedColor",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-color"
+  },
+  "border-inline-style": {
+    "syntax": "<'border-top-style'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-style"
+  },
+  "border-inline-width": {
+    "syntax": "<'border-top-width'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "logicalWidthOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "medium",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthZeroIfBorderStyleNoneOrHidden",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-width"
+  },
+  "border-inline-end-color": {
+    "syntax": "<'border-top-color'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "currentcolor",
+    "appliesto": "allElements",
+    "computed": "computedColor",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-end-color"
+  },
+  "border-inline-end-style": {
+    "syntax": "<'border-top-style'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-end-style"
+  },
+  "border-inline-end-width": {
+    "syntax": "<'border-top-width'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "logicalWidthOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "medium",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthZeroIfBorderStyleNoneOrHidden",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-end-width"
+  },
+  "border-inline-start": {
+    "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "border-inline-start-color",
+      "border-inline-start-style",
+      "border-inline-start-width"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": [
+      "border-width",
+      "border-style",
+      "color"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "border-width",
+      "border-style",
+      "border-inline-start-color"
+    ],
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-start"
+  },
+  "border-inline-start-color": {
+    "syntax": "<'border-top-color'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "currentcolor",
+    "appliesto": "allElements",
+    "computed": "computedColor",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-start-color"
+  },
+  "border-inline-start-style": {
+    "syntax": "<'border-top-style'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-start-style"
+  },
+  "border-inline-start-width": {
+    "syntax": "<'border-top-width'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "logicalWidthOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "medium",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthZeroIfBorderStyleNoneOrHidden",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-start-width"
+  },
+  "border-left": {
+    "syntax": "<line-width> || <line-style> || <color>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "border-left-color",
+      "border-left-style",
+      "border-left-width"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": [
+      "border-left-width",
+      "border-left-style",
+      "border-left-color"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "border-left-width",
+      "border-left-style",
+      "border-left-color"
+    ],
+    "order": "orderOfAppearance",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-left"
+  },
+  "border-left-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "currentcolor",
+    "appliesto": "allElements",
+    "computed": "computedColor",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-left-color"
+  },
+  "border-left-style": {
+    "syntax": "<line-style>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-left-style"
+  },
+  "border-left-width": {
+    "syntax": "<line-width>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "medium",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthOr0IfBorderLeftStyleNoneOrHidden",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-left-width"
+  },
+  "border-radius": {
+    "syntax": "<length-percentage>{1,4} [ / <length-percentage>{1,4} ]?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "border-top-left-radius",
+      "border-top-right-radius",
+      "border-bottom-right-radius",
+      "border-bottom-left-radius"
+    ],
+    "percentages": "referToDimensionOfBorderBox",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": [
+      "border-top-left-radius",
+      "border-top-right-radius",
+      "border-bottom-right-radius",
+      "border-bottom-left-radius"
+    ],
+    "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+    "computed": [
+      "border-bottom-left-radius",
+      "border-bottom-right-radius",
+      "border-top-left-radius",
+      "border-top-right-radius"
+    ],
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-radius"
+  },
+  "border-right": {
+    "syntax": "<line-width> || <line-style> || <color>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "border-right-color",
+      "border-right-style",
+      "border-right-width"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": [
+      "border-right-width",
+      "border-right-style",
+      "border-right-color"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "border-right-width",
+      "border-right-style",
+      "border-right-color"
+    ],
+    "order": "orderOfAppearance",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-right"
+  },
+  "border-right-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "currentcolor",
+    "appliesto": "allElements",
+    "computed": "computedColor",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-right-color"
+  },
+  "border-right-style": {
+    "syntax": "<line-style>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-right-style"
+  },
+  "border-right-width": {
+    "syntax": "<line-width>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "medium",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthOr0IfBorderRightStyleNoneOrHidden",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-right-width"
+  },
+  "border-spacing": {
+    "syntax": "<length> <length>?",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Table"
+    ],
+    "initial": "0",
+    "appliesto": "tableElements",
+    "computed": "twoAbsoluteLengths",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-spacing"
+  },
+  "border-start-end-radius": {
+    "syntax": "<length-percentage>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToDimensionOfBorderBox",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+    "computed": "twoAbsoluteLengthOrPercentages",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-start-end-radius"
+  },
+  "border-start-start-radius": {
+    "syntax": "<length-percentage>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToDimensionOfBorderBox",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+    "computed": "twoAbsoluteLengthOrPercentages",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-start-start-radius"
+  },
+  "border-style": {
+    "syntax": "<line-style>{1,4}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": [
+      "border-top-style",
+      "border-right-style",
+      "border-bottom-style",
+      "border-left-style"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "border-bottom-style",
+      "border-left-style",
+      "border-right-style",
+      "border-top-style"
+    ],
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-style"
+  },
+  "border-top": {
+    "syntax": "<line-width> || <line-style> || <color>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "border-top-color",
+      "border-top-style",
+      "border-top-width"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": [
+      "border-top-width",
+      "border-top-style",
+      "border-top-color"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "border-top-width",
+      "border-top-style",
+      "border-top-color"
+    ],
+    "order": "orderOfAppearance",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-top"
+  },
+  "border-top-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "currentcolor",
+    "appliesto": "allElements",
+    "computed": "computedColor",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-top-color"
+  },
+  "border-top-left-radius": {
+    "syntax": "<length-percentage>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToDimensionOfBorderBox",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+    "computed": "twoAbsoluteLengthOrPercentages",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-top-left-radius"
+  },
+  "border-top-right-radius": {
+    "syntax": "<length-percentage>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToDimensionOfBorderBox",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+    "computed": "twoAbsoluteLengthOrPercentages",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-top-right-radius"
+  },
+  "border-top-style": {
+    "syntax": "<line-style>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-top-style"
+  },
+  "border-top-width": {
+    "syntax": "<line-width>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "medium",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthOr0IfBorderTopStyleNoneOrHidden",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-top-width"
+  },
+  "border-width": {
+    "syntax": "<line-width>{1,4}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "border-bottom-width",
+      "border-left-width",
+      "border-right-width",
+      "border-top-width"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": [
+      "border-top-width",
+      "border-right-width",
+      "border-bottom-width",
+      "border-left-width"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "border-bottom-width",
+      "border-left-width",
+      "border-right-width",
+      "border-top-width"
+    ],
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-width"
+  },
+  "bottom": {
+    "syntax": "<length> | <percentage> | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToContainingBlockHeight",
+    "groups": [
+      "CSS Positioning"
+    ],
+    "initial": "auto",
+    "appliesto": "positionedElements",
+    "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/bottom"
+  },
+  "box-align": {
+    "syntax": "start | center | end | baseline | stretch",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions",
+      "WebKit Extensions"
+    ],
+    "initial": "stretch",
+    "appliesto": "elementsWithDisplayBoxOrInlineBox",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-align"
+  },
+  "box-decoration-break": {
+    "syntax": "slice | clone",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fragmentation"
+    ],
+    "initial": "slice",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-decoration-break"
+  },
+  "box-direction": {
+    "syntax": "normal | reverse | inherit",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions",
+      "WebKit Extensions"
+    ],
+    "initial": "normal",
+    "appliesto": "elementsWithDisplayBoxOrInlineBox",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-direction"
+  },
+  "box-flex": {
+    "syntax": "<number>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions",
+      "WebKit Extensions"
+    ],
+    "initial": "0",
+    "appliesto": "directChildrenOfElementsWithDisplayMozBoxMozInlineBox",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-flex"
+  },
+  "box-flex-group": {
+    "syntax": "<integer>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions",
+      "WebKit Extensions"
+    ],
+    "initial": "1",
+    "appliesto": "inFlowChildrenOfBoxElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-flex-group"
+  },
+  "box-lines": {
+    "syntax": "single | multiple",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions",
+      "WebKit Extensions"
+    ],
+    "initial": "single",
+    "appliesto": "boxElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-lines"
+  },
+  "box-ordinal-group": {
+    "syntax": "<integer>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions",
+      "WebKit Extensions"
+    ],
+    "initial": "1",
+    "appliesto": "childrenOfBoxElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-ordinal-group"
+  },
+  "box-orient": {
+    "syntax": "horizontal | vertical | inline-axis | block-axis | inherit",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions",
+      "WebKit Extensions"
+    ],
+    "initial": "inlineAxisHorizontalInXUL",
+    "appliesto": "elementsWithDisplayBoxOrInlineBox",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-orient"
+  },
+  "box-pack": {
+    "syntax": "start | center | end | justify",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions",
+      "WebKit Extensions"
+    ],
+    "initial": "start",
+    "appliesto": "elementsWithDisplayMozBoxMozInlineBox",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-pack"
+  },
+  "box-shadow": {
+    "syntax": "none | <shadow>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "shadowList",
+    "percentages": "no",
+    "groups": [
+      "CSS Backgrounds and Borders"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthsSpecifiedColorAsSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-shadow"
+  },
+  "box-sizing": {
+    "syntax": "content-box | border-box",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Basic User Interface"
+    ],
+    "initial": "content-box",
+    "appliesto": "allElementsAcceptingWidthOrHeight",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-sizing"
+  },
+  "break-after": {
+    "syntax": "auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fragmentation"
+    ],
+    "initial": "auto",
+    "appliesto": "blockLevelElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/break-after"
+  },
+  "break-before": {
+    "syntax": "auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fragmentation"
+    ],
+    "initial": "auto",
+    "appliesto": "blockLevelElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/break-before"
+  },
+  "break-inside": {
+    "syntax": "auto | avoid | avoid-page | avoid-column | avoid-region",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fragmentation"
+    ],
+    "initial": "auto",
+    "appliesto": "blockLevelElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/break-inside"
+  },
+  "caption-side": {
+    "syntax": "top | bottom | block-start | block-end | inline-start | inline-end",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Table"
+    ],
+    "initial": "top",
+    "appliesto": "tableCaptionElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/caption-side"
+  },
+  "caret-color": {
+    "syntax": "auto | <color>",
+    "media": "interactive",
+    "inherited": true,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "CSS Basic User Interface"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asAutoOrColor",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/caret-color"
+  },
+  "clear": {
+    "syntax": "none | left | right | both | inline-start | inline-end",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Positioning"
+    ],
+    "initial": "none",
+    "appliesto": "blockLevelElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/clear"
+  },
+  "clip": {
+    "syntax": "<shape> | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "rectangle",
+    "percentages": "no",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "auto",
+    "appliesto": "absolutelyPositionedElements",
+    "computed": "autoOrRectangle",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/clip"
+  },
+  "clip-path": {
+    "syntax": "<clip-source> | [ <basic-shape> || <geometry-box> ] | none",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "basicShapeOtherwiseNo",
+    "percentages": "referToReferenceBoxWhenSpecifiedOtherwiseBorderBox",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "none",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "asSpecifiedURLsAbsolute",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/clip-path"
+  },
+  "color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "CSS Color"
+    ],
+    "initial": "variesFromBrowserToBrowser",
+    "appliesto": "allElements",
+    "computed": "translucentValuesRGBAOtherwiseRGB",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/color"
+  },
+  "color-adjust": {
+    "syntax": "economy | exact",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Color"
+    ],
+    "initial": "economy",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/color-adjust"
+  },
+  "column-count": {
+    "syntax": "<integer> | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "integer",
+    "percentages": "no",
+    "groups": [
+      "CSS Columns"
+    ],
+    "initial": "auto",
+    "appliesto": "blockContainersExceptTableWrappers",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-count"
+  },
+  "column-fill": {
+    "syntax": "auto | balance | balance-all",
+    "media": "visualInContinuousMediaNoEffectInOverflowColumns",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Columns"
+    ],
+    "initial": "balance",
+    "appliesto": "multicolElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-fill"
+  },
+  "column-gap": {
+    "syntax": "normal | <length-percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToDimensionOfContentArea",
+    "groups": [
+      "CSS Box Alignment"
+    ],
+    "initial": "normal",
+    "appliesto": "multiColumnElementsFlexContainersGridContainers",
+    "computed": "asSpecifiedWithLengthsAbsoluteAndNormalComputingToZeroExceptMultiColumn",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-gap"
+  },
+  "column-rule": {
+    "syntax": "<'column-rule-width'> || <'column-rule-style'> || <'column-rule-color'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "column-rule-color",
+      "column-rule-style",
+      "column-rule-width"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Columns"
+    ],
+    "initial": [
+      "column-rule-width",
+      "column-rule-style",
+      "column-rule-color"
+    ],
+    "appliesto": "multicolElements",
+    "computed": [
+      "column-rule-color",
+      "column-rule-style",
+      "column-rule-width"
+    ],
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-rule"
+  },
+  "column-rule-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "CSS Columns"
+    ],
+    "initial": "currentcolor",
+    "appliesto": "multicolElements",
+    "computed": "computedColor",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-rule-color"
+  },
+  "column-rule-style": {
+    "syntax": "<'border-style'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Columns"
+    ],
+    "initial": "none",
+    "appliesto": "multicolElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-rule-style"
+  },
+  "column-rule-width": {
+    "syntax": "<'border-width'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "no",
+    "groups": [
+      "CSS Columns"
+    ],
+    "initial": "medium",
+    "appliesto": "multicolElements",
+    "computed": "absoluteLength0IfColumnRuleStyleNoneOrHidden",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-rule-width"
+  },
+  "column-span": {
+    "syntax": "none | all",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Columns"
+    ],
+    "initial": "none",
+    "appliesto": "inFlowBlockLevelElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-span"
+  },
+  "column-width": {
+    "syntax": "<length> | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "no",
+    "groups": [
+      "CSS Columns"
+    ],
+    "initial": "auto",
+    "appliesto": "blockContainersExceptTableWrappers",
+    "computed": "absoluteLengthZeroOrLarger",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-width"
+  },
+  "columns": {
+    "syntax": "<'column-width'> || <'column-count'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "column-width",
+      "column-count"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Columns"
+    ],
+    "initial": [
+      "column-width",
+      "column-count"
+    ],
+    "appliesto": "blockContainersExceptTableWrappers",
+    "computed": [
+      "column-width",
+      "column-count"
+    ],
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/columns"
+  },
+  "contain": {
+    "syntax": "none | strict | content | [ size || layout || style || paint ]",
+    "media": "all",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Containment"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/contain"
+  },
+  "content": {
+    "syntax": "normal | none | [ <content-replacement> | <content-list> ] [/ <string> ]?",
+    "media": "all",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Generated Content"
+    ],
+    "initial": "normal",
+    "appliesto": "beforeAndAfterPseudos",
+    "computed": "normalOnElementsForPseudosNoneAbsoluteURIStringOrAsSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/content"
+  },
+  "counter-increment": {
+    "syntax": "[ <custom-ident> <integer>? ]+ | none",
+    "media": "all",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Counter Styles"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/counter-increment"
+  },
+  "counter-reset": {
+    "syntax": "[ <custom-ident> <integer>? ]+ | none",
+    "media": "all",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Counter Styles"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/counter-reset"
+  },
+  "counter-set": {
+    "syntax": "[ <custom-ident> <integer>? ]+ | none",
+    "media": "all",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Counter Styles"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/counter-set"
+  },
+  "cursor": {
+    "syntax": "[ [ <url> [ <x> <y> ]? , ]* [ auto | default | none | context-menu | help | pointer | progress | wait | cell | crosshair | text | vertical-text | alias | copy | move | no-drop | not-allowed | e-resize | n-resize | ne-resize | nw-resize | s-resize | se-resize | sw-resize | w-resize | ew-resize | ns-resize | nesw-resize | nwse-resize | col-resize | row-resize | all-scroll | zoom-in | zoom-out | grab | grabbing ] ]",
+    "media": [
+      "visual",
+      "interactive"
+    ],
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Basic User Interface"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecifiedURLsAbsolute",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/cursor"
+  },
+  "direction": {
+    "syntax": "ltr | rtl",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Writing Modes"
+    ],
+    "initial": "ltr",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/direction"
+  },
+  "display": {
+    "syntax": "[ <display-outside> || <display-inside> ] | <display-listitem> | <display-internal> | <display-box> | <display-legacy>",
+    "media": "all",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Display"
+    ],
+    "initial": "inline",
+    "appliesto": "allElements",
+    "computed": "asSpecifiedExceptPositionedFloatingAndRootElementsKeywordMaybeDifferent",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/display"
+  },
+  "empty-cells": {
+    "syntax": "show | hide",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Table"
+    ],
+    "initial": "show",
+    "appliesto": "tableCellElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/empty-cells"
+  },
+  "filter": {
+    "syntax": "none | <filter-function-list>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "filterList",
+    "percentages": "no",
+    "groups": [
+      "Filter Effects"
+    ],
+    "initial": "none",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/filter"
+  },
+  "flex": {
+    "syntax": "none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "flex-grow",
+      "flex-shrink",
+      "flex-basis"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Flexible Box Layout"
+    ],
+    "initial": [
+      "flex-grow",
+      "flex-shrink",
+      "flex-basis"
+    ],
+    "appliesto": "flexItemsAndInFlowPseudos",
+    "computed": [
+      "flex-grow",
+      "flex-shrink",
+      "flex-basis"
+    ],
+    "order": "orderOfAppearance",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/flex"
+  },
+  "flex-basis": {
+    "syntax": "content | <'width'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToFlexContainersInnerMainSize",
+    "groups": [
+      "CSS Flexible Box Layout"
+    ],
+    "initial": "auto",
+    "appliesto": "flexItemsAndInFlowPseudos",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "lengthOrPercentageBeforeKeywordIfBothPresent",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/flex-basis"
+  },
+  "flex-direction": {
+    "syntax": "row | row-reverse | column | column-reverse",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Flexible Box Layout"
+    ],
+    "initial": "row",
+    "appliesto": "flexContainers",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/flex-direction"
+  },
+  "flex-flow": {
+    "syntax": "<'flex-direction'> || <'flex-wrap'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Flexible Box Layout"
+    ],
+    "initial": [
+      "flex-direction",
+      "flex-wrap"
+    ],
+    "appliesto": "flexContainers",
+    "computed": [
+      "flex-direction",
+      "flex-wrap"
+    ],
+    "order": "orderOfAppearance",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/flex-flow"
+  },
+  "flex-grow": {
+    "syntax": "<number>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "number",
+    "percentages": "no",
+    "groups": [
+      "CSS Flexible Box Layout"
+    ],
+    "initial": "0",
+    "appliesto": "flexItemsAndInFlowPseudos",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/flex-grow"
+  },
+  "flex-shrink": {
+    "syntax": "<number>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "number",
+    "percentages": "no",
+    "groups": [
+      "CSS Flexible Box Layout"
+    ],
+    "initial": "1",
+    "appliesto": "flexItemsAndInFlowPseudos",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/flex-shrink"
+  },
+  "flex-wrap": {
+    "syntax": "nowrap | wrap | wrap-reverse",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Flexible Box Layout"
+    ],
+    "initial": "nowrap",
+    "appliesto": "flexContainers",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/flex-wrap"
+  },
+  "float": {
+    "syntax": "left | right | none | inline-start | inline-end",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Positioning"
+    ],
+    "initial": "none",
+    "appliesto": "allElementsNoEffectIfDisplayNone",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/float"
+  },
+  "font": {
+    "syntax": "[ [ <'font-style'> || <font-variant-css21> || <'font-weight'> || <'font-stretch'> ]? <'font-size'> [ / <'line-height'> ]? <'font-family'> ] | caption | icon | menu | message-box | small-caption | status-bar",
+    "media": "visual",
+    "inherited": true,
+    "animationType": [
+      "font-style",
+      "font-variant",
+      "font-weight",
+      "font-stretch",
+      "font-size",
+      "line-height",
+      "font-family"
+    ],
+    "percentages": [
+      "font-size",
+      "line-height"
+    ],
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": [
+      "font-style",
+      "font-variant",
+      "font-weight",
+      "font-stretch",
+      "font-size",
+      "line-height",
+      "font-family"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "font-style",
+      "font-variant",
+      "font-weight",
+      "font-stretch",
+      "font-size",
+      "line-height",
+      "font-family"
+    ],
+    "order": "orderOfAppearance",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font"
+  },
+  "font-family": {
+    "syntax": "[ <family-name> | <generic-family> ]#",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "dependsOnUserAgent",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-family"
+  },
+  "font-feature-settings": {
+    "syntax": "normal | <feature-tag-value>#",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-feature-settings"
+  },
+  "font-kerning": {
+    "syntax": "auto | normal | none",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-kerning"
+  },
+  "font-language-override": {
+    "syntax": "normal | <string>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-language-override"
+  },
+  "font-optical-sizing": {
+    "syntax": "auto | none",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-optical-sizing"
+  },
+  "font-variation-settings": {
+    "syntax": "normal | [ <string> <number> ]#",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "transform",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-variation-settings"
+  },
+  "font-size": {
+    "syntax": "<absolute-size> | <relative-size> | <length-percentage>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "length",
+    "percentages": "referToParentElementsFontSize",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "medium",
+    "appliesto": "allElements",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-size"
+  },
+  "font-size-adjust": {
+    "syntax": "none | <number>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "number",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-size-adjust"
+  },
+  "font-smooth": {
+    "syntax": "auto | never | always | <absolute-size> | <length>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-smooth"
+  },
+  "font-stretch": {
+    "syntax": "<font-stretch-absolute>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "fontStretch",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-stretch"
+  },
+  "font-style": {
+    "syntax": "normal | italic | oblique <angle>?",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-style"
+  },
+  "font-synthesis": {
+    "syntax": "none | [ weight || style ]",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "weight style",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-synthesis"
+  },
+  "font-variant": {
+    "syntax": "normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> || stylistic( <feature-value-name> ) || historical-forms || styleset( <feature-value-name># ) || character-variant( <feature-value-name># ) || swash( <feature-value-name> ) || ornaments( <feature-value-name> ) || annotation( <feature-value-name> ) || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero || <east-asian-variant-values> || <east-asian-width-values> || ruby ]",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-variant"
+  },
+  "font-variant-alternates": {
+    "syntax": "normal | [ stylistic( <feature-value-name> ) || historical-forms || styleset( <feature-value-name># ) || character-variant( <feature-value-name># ) || swash( <feature-value-name> ) || ornaments( <feature-value-name> ) || annotation( <feature-value-name> ) ]",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates"
+  },
+  "font-variant-caps": {
+    "syntax": "normal | small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-caps"
+  },
+  "font-variant-east-asian": {
+    "syntax": "normal | [ <east-asian-variant-values> || <east-asian-width-values> || ruby ]",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-east-asian"
+  },
+  "font-variant-ligatures": {
+    "syntax": "normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> ]",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-ligatures"
+  },
+  "font-variant-numeric": {
+    "syntax": "normal | [ <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero ]",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-numeric"
+  },
+  "font-variant-position": {
+    "syntax": "normal | sub | super",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-position"
+  },
+  "font-weight": {
+    "syntax": "<font-weight-absolute> | bolder | lighter",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "fontWeight",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "keywordOrNumericalValueBolderLighterTransformedToRealValue",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-weight"
+  },
+  "gap": {
+    "syntax": "<'row-gap'> <'column-gap'>?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "row-gap",
+      "column-gap"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Box Alignment"
+    ],
+    "initial": [
+      "row-gap",
+      "column-gap"
+    ],
+    "appliesto": "multiColumnElementsFlexContainersGridContainers",
+    "computed": [
+      "row-gap",
+      "column-gap"
+    ],
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/gap"
+  },
+  "grid": {
+    "syntax": "<'grid-template'> | <'grid-template-rows'> / [ auto-flow && dense? ] <'grid-auto-columns'>? | [ auto-flow && dense? ] <'grid-auto-rows'>? / <'grid-template-columns'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": [
+      "grid-template-rows",
+      "grid-template-columns",
+      "grid-auto-rows",
+      "grid-auto-columns"
+    ],
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": [
+      "grid-template-rows",
+      "grid-template-columns",
+      "grid-template-areas",
+      "grid-auto-rows",
+      "grid-auto-columns",
+      "grid-auto-flow",
+      "grid-column-gap",
+      "grid-row-gap",
+      "column-gap",
+      "row-gap"
+    ],
+    "appliesto": "gridContainers",
+    "computed": [
+      "grid-template-rows",
+      "grid-template-columns",
+      "grid-template-areas",
+      "grid-auto-rows",
+      "grid-auto-columns",
+      "grid-auto-flow",
+      "grid-column-gap",
+      "grid-row-gap",
+      "column-gap",
+      "row-gap"
+    ],
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid"
+  },
+  "grid-area": {
+    "syntax": "<grid-line> [ / <grid-line> ]{0,3}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": [
+      "grid-row-start",
+      "grid-column-start",
+      "grid-row-end",
+      "grid-column-end"
+    ],
+    "appliesto": "gridItemsAndBoxesWithinGridContainer",
+    "computed": [
+      "grid-row-start",
+      "grid-column-start",
+      "grid-row-end",
+      "grid-column-end"
+    ],
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-area"
+  },
+  "grid-auto-columns": {
+    "syntax": "<track-size>+",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "referToDimensionOfContentArea",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "auto",
+    "appliesto": "gridContainers",
+    "computed": "percentageAsSpecifiedOrAbsoluteLength",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-auto-columns"
+  },
+  "grid-auto-flow": {
+    "syntax": "[ row | column ] || dense",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "row",
+    "appliesto": "gridContainers",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-auto-flow"
+  },
+  "grid-auto-rows": {
+    "syntax": "<track-size>+",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "referToDimensionOfContentArea",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "auto",
+    "appliesto": "gridContainers",
+    "computed": "percentageAsSpecifiedOrAbsoluteLength",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-auto-rows"
+  },
+  "grid-column": {
+    "syntax": "<grid-line> [ / <grid-line> ]?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": [
+      "grid-column-start",
+      "grid-column-end"
+    ],
+    "appliesto": "gridItemsAndBoxesWithinGridContainer",
+    "computed": [
+      "grid-column-start",
+      "grid-column-end"
+    ],
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-column"
+  },
+  "grid-column-end": {
+    "syntax": "<grid-line>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "auto",
+    "appliesto": "gridItemsAndBoxesWithinGridContainer",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-column-end"
+  },
+  "grid-column-gap": {
+    "syntax": "<length-percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "referToDimensionOfContentArea",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "0",
+    "appliesto": "gridContainers",
+    "computed": "percentageAsSpecifiedOrAbsoluteLength",
+    "order": "uniqueOrder",
+    "status": "obsolete",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-gap"
+  },
+  "grid-column-start": {
+    "syntax": "<grid-line>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "auto",
+    "appliesto": "gridItemsAndBoxesWithinGridContainer",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-column-start"
+  },
+  "grid-gap": {
+    "syntax": "<'grid-row-gap'> <'grid-column-gap'>?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "grid-row-gap",
+      "grid-column-gap"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": [
+      "grid-row-gap",
+      "grid-column-gap"
+    ],
+    "appliesto": "gridContainers",
+    "computed": [
+      "grid-row-gap",
+      "grid-column-gap"
+    ],
+    "order": "uniqueOrder",
+    "status": "obsolete",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/gap"
+  },
+  "grid-row": {
+    "syntax": "<grid-line> [ / <grid-line> ]?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": [
+      "grid-row-start",
+      "grid-row-end"
+    ],
+    "appliesto": "gridItemsAndBoxesWithinGridContainer",
+    "computed": [
+      "grid-row-start",
+      "grid-row-end"
+    ],
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-row"
+  },
+  "grid-row-end": {
+    "syntax": "<grid-line>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "auto",
+    "appliesto": "gridItemsAndBoxesWithinGridContainer",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-row-end"
+  },
+  "grid-row-gap": {
+    "syntax": "<length-percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "referToDimensionOfContentArea",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "0",
+    "appliesto": "gridContainers",
+    "computed": "percentageAsSpecifiedOrAbsoluteLength",
+    "order": "uniqueOrder",
+    "status": "obsolete",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/row-gap"
+  },
+  "grid-row-start": {
+    "syntax": "<grid-line>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "auto",
+    "appliesto": "gridItemsAndBoxesWithinGridContainer",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-row-start"
+  },
+  "grid-template": {
+    "syntax": "none | [ <'grid-template-rows'> / <'grid-template-columns'> ] | [ <line-names>? <string> <track-size>? <line-names>? ]+ [ / <explicit-track-list> ]?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": [
+      "grid-template-columns",
+      "grid-template-rows"
+    ],
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": [
+      "grid-template-columns",
+      "grid-template-rows",
+      "grid-template-areas"
+    ],
+    "appliesto": "gridContainers",
+    "computed": [
+      "grid-template-columns",
+      "grid-template-rows",
+      "grid-template-areas"
+    ],
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-template"
+  },
+  "grid-template-areas": {
+    "syntax": "none | <string>+",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "none",
+    "appliesto": "gridContainers",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-template-areas"
+  },
+  "grid-template-columns": {
+    "syntax": "none | <track-list> | <auto-track-list> | subgrid <line-name-list>?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "simpleListOfLpcDifferenceLpc",
+    "percentages": "referToDimensionOfContentArea",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "none",
+    "appliesto": "gridContainers",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-template-columns"
+  },
+  "grid-template-rows": {
+    "syntax": "none | <track-list> | <auto-track-list> | subgrid <line-name-list>?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "simpleListOfLpcDifferenceLpc",
+    "percentages": "referToDimensionOfContentArea",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "none",
+    "appliesto": "gridContainers",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-template-rows"
+  },
+  "hanging-punctuation": {
+    "syntax": "none | [ first || [ force-end | allow-end ] || last ]",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/hanging-punctuation"
+  },
+  "height": {
+    "syntax": "auto | <length> | <percentage> | min-content | max-content | fit-content(<length-percentage>)",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "regardingHeightOfGeneratedBoxContainingBlockPercentagesRelativeToContainingBlock",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "auto",
+    "appliesto": "allElementsButNonReplacedAndTableColumns",
+    "computed": "percentageAutoOrAbsoluteLength",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/height"
+  },
+  "hyphens": {
+    "syntax": "none | manual | auto",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "manual",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/hyphens"
+  },
+  "image-orientation": {
+    "syntax": "from-image | <angle> | [ <angle>? flip ]",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Images"
+    ],
+    "initial": "from-image",
+    "appliesto": "allElements",
+    "computed": "angleRoundedToNextQuarter",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/image-orientation"
+  },
+  "image-rendering": {
+    "syntax": "auto | crisp-edges | pixelated",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Images"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/image-rendering"
+  },
+  "image-resolution": {
+    "syntax": "[ from-image || <resolution> ] && snap?",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Images"
+    ],
+    "initial": "1dppx",
+    "appliesto": "allElements",
+    "computed": "asSpecifiedWithExceptionOfResolution",
+    "order": "uniqueOrder",
+    "status": "experimental"
+  },
+  "ime-mode": {
+    "syntax": "auto | normal | active | inactive | disabled",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Basic User Interface"
+    ],
+    "initial": "auto",
+    "appliesto": "textFields",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "obsolete",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/ime-mode"
+  },
+  "initial-letter": {
+    "syntax": "normal | [ <number> <integer>? ]",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Inline"
+    ],
+    "initial": "normal",
+    "appliesto": "firstLetterPseudoElementsAndInlineLevelFirstChildren",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/initial-letter"
+  },
+  "initial-letter-align": {
+    "syntax": "[ auto | alphabetic | hanging | ideographic ]",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Inline"
+    ],
+    "initial": "auto",
+    "appliesto": "firstLetterPseudoElementsAndInlineLevelFirstChildren",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/initial-letter-align"
+  },
+  "inline-size": {
+    "syntax": "<'width'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "inlineSizeOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "auto",
+    "appliesto": "sameAsWidthAndHeight",
+    "computed": "sameAsWidthAndHeight",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/inline-size"
+  },
+  "inset": {
+    "syntax": "<'top'>{1,4}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "logicalHeightOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "auto",
+    "appliesto": "positionedElements",
+    "computed": "sameAsBoxOffsets",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/inset"
+  },
+  "inset-block": {
+    "syntax": "<'top'>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "logicalHeightOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "auto",
+    "appliesto": "positionedElements",
+    "computed": "sameAsBoxOffsets",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/inset-block"
+  },
+  "inset-block-end": {
+    "syntax": "<'top'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "logicalHeightOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "auto",
+    "appliesto": "positionedElements",
+    "computed": "sameAsBoxOffsets",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/inset-block-end"
+  },
+  "inset-block-start": {
+    "syntax": "<'top'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "logicalHeightOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "auto",
+    "appliesto": "positionedElements",
+    "computed": "sameAsBoxOffsets",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/inset-block-start"
+  },
+  "inset-inline": {
+    "syntax": "<'top'>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "logicalWidthOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "auto",
+    "appliesto": "positionedElements",
+    "computed": "sameAsBoxOffsets",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/inset-inline"
+  },
+  "inset-inline-end": {
+    "syntax": "<'top'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "logicalWidthOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "auto",
+    "appliesto": "positionedElements",
+    "computed": "sameAsBoxOffsets",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/inset-inline-end"
+  },
+  "inset-inline-start": {
+    "syntax": "<'top'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "logicalWidthOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "auto",
+    "appliesto": "positionedElements",
+    "computed": "sameAsBoxOffsets",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/inset-inline-start"
+  },
+  "isolation": {
+    "syntax": "auto | isolate",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Compositing and Blending"
+    ],
+    "initial": "auto",
+    "appliesto": "allElementsSVGContainerGraphicsAndGraphicsReferencingElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/isolation"
+  },
+  "justify-content": {
+    "syntax": "normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ]",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Box Alignment"
+    ],
+    "initial": "normal",
+    "appliesto": "flexContainers",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/justify-content"
+  },
+  "justify-items": {
+    "syntax": "normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ] | legacy | legacy && [ left | right | center ]",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Box Alignment"
+    ],
+    "initial": "legacy",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/justify-items"
+  },
+  "justify-self": {
+    "syntax": "auto | normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ]",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Box Alignment"
+    ],
+    "initial": "auto",
+    "appliesto": "blockLevelBoxesAndAbsolutelyPositionedBoxesAndGridItems",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/justify-self"
+  },
+  "justify-tracks": {
+    "syntax": "[ normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ] ]#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "normal",
+    "appliesto": "gridContainersWithMasonryLayoutInTheirInlineAxis",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/justify-tracks"
+  },
+  "left": {
+    "syntax": "<length> | <percentage> | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Positioning"
+    ],
+    "initial": "auto",
+    "appliesto": "positionedElements",
+    "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/left"
+  },
+  "letter-spacing": {
+    "syntax": "normal | <length>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "length",
+    "percentages": "no",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "optimumValueOfAbsoluteLengthOrNormal",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/letter-spacing"
+  },
+  "line-break": {
+    "syntax": "auto | loose | normal | strict | anywhere",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/line-break"
+  },
+  "line-clamp": {
+    "syntax": "none | <integer>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "integer",
+    "percentages": "no",
+    "groups": [
+      "CSS Overflow"
+    ],
+    "initial": "none",
+    "appliesto": "blockContainersExceptMultiColumnContainers",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "experimental"
+  },
+  "line-height": {
+    "syntax": "normal | <number> | <length> | <percentage>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "numberOrLength",
+    "percentages": "referToElementFontSize",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "absoluteLengthOrAsSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/line-height"
+  },
+  "line-height-step": {
+    "syntax": "<length>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fonts"
+    ],
+    "initial": "0",
+    "appliesto": "blockContainers",
+    "computed": "absoluteLength",
+    "order": "perGrammar",
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/line-height-step"
+  },
+  "list-style": {
+    "syntax": "<'list-style-type'> || <'list-style-position'> || <'list-style-image'>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Lists and Counters"
+    ],
+    "initial": [
+      "list-style-type",
+      "list-style-position",
+      "list-style-image"
+    ],
+    "appliesto": "listItems",
+    "computed": [
+      "list-style-image",
+      "list-style-position",
+      "list-style-type"
+    ],
+    "order": "orderOfAppearance",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/list-style"
+  },
+  "list-style-image": {
+    "syntax": "<url> | none",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Lists and Counters"
+    ],
+    "initial": "none",
+    "appliesto": "listItems",
+    "computed": "noneOrImageWithAbsoluteURI",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/list-style-image"
+  },
+  "list-style-position": {
+    "syntax": "inside | outside",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Lists and Counters"
+    ],
+    "initial": "outside",
+    "appliesto": "listItems",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/list-style-position"
+  },
+  "list-style-type": {
+    "syntax": "<counter-style> | <string> | none",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Lists and Counters"
+    ],
+    "initial": "disc",
+    "appliesto": "listItems",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/list-style-type"
+  },
+  "margin": {
+    "syntax": "[ <length> | <percentage> | auto ]{1,4}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": [
+      "margin-bottom",
+      "margin-left",
+      "margin-right",
+      "margin-top"
+    ],
+    "appliesto": "allElementsExceptTableDisplayTypes",
+    "computed": [
+      "margin-bottom",
+      "margin-left",
+      "margin-right",
+      "margin-top"
+    ],
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin"
+  },
+  "margin-block": {
+    "syntax": "<'margin-left'>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "dependsOnLayoutModel",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "sameAsMargin",
+    "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-block"
+  },
+  "margin-block-end": {
+    "syntax": "<'margin-left'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "dependsOnLayoutModel",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "sameAsMargin",
+    "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-block-end"
+  },
+  "margin-block-start": {
+    "syntax": "<'margin-left'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "dependsOnLayoutModel",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "sameAsMargin",
+    "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-block-start"
+  },
+  "margin-bottom": {
+    "syntax": "<length> | <percentage> | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsExceptTableDisplayTypes",
+    "computed": "percentageAsSpecifiedOrAbsoluteLength",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-bottom"
+  },
+  "margin-inline": {
+    "syntax": "<'margin-left'>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "dependsOnLayoutModel",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "sameAsMargin",
+    "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-inline"
+  },
+  "margin-inline-end": {
+    "syntax": "<'margin-left'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "dependsOnLayoutModel",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "sameAsMargin",
+    "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-inline-end"
+  },
+  "margin-inline-start": {
+    "syntax": "<'margin-left'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "dependsOnLayoutModel",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "sameAsMargin",
+    "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-inline-start"
+  },
+  "margin-left": {
+    "syntax": "<length> | <percentage> | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsExceptTableDisplayTypes",
+    "computed": "percentageAsSpecifiedOrAbsoluteLength",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-left"
+  },
+  "margin-right": {
+    "syntax": "<length> | <percentage> | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsExceptTableDisplayTypes",
+    "computed": "percentageAsSpecifiedOrAbsoluteLength",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-right"
+  },
+  "margin-top": {
+    "syntax": "<length> | <percentage> | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsExceptTableDisplayTypes",
+    "computed": "percentageAsSpecifiedOrAbsoluteLength",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-top"
+  },
+  "margin-trim": {
+    "syntax": "none | in-flow | all",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "none",
+    "appliesto": "blockContainersAndMultiColumnContainers",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line"
+    ],
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-trim"
+  },
+  "mask": {
+    "syntax": "<mask-layer>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "mask-image",
+      "mask-mode",
+      "mask-repeat",
+      "mask-position",
+      "mask-clip",
+      "mask-origin",
+      "mask-size",
+      "mask-composite"
+    ],
+    "percentages": [
+      "mask-position"
+    ],
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": [
+      "mask-image",
+      "mask-mode",
+      "mask-repeat",
+      "mask-position",
+      "mask-clip",
+      "mask-origin",
+      "mask-size",
+      "mask-composite"
+    ],
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": [
+      "mask-image",
+      "mask-mode",
+      "mask-repeat",
+      "mask-position",
+      "mask-clip",
+      "mask-origin",
+      "mask-size",
+      "mask-composite"
+    ],
+    "order": "perGrammar",
+    "stacking": true,
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask"
+  },
+  "mask-border": {
+    "syntax": "<'mask-border-source'> || <'mask-border-slice'> [ / <'mask-border-width'>? [ / <'mask-border-outset'> ]? ]? || <'mask-border-repeat'> || <'mask-border-mode'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "mask-border-mode",
+      "mask-border-outset",
+      "mask-border-repeat",
+      "mask-border-slice",
+      "mask-border-source",
+      "mask-border-width"
+    ],
+    "percentages": [
+      "mask-border-slice",
+      "mask-border-width"
+    ],
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": [
+      "mask-border-mode",
+      "mask-border-outset",
+      "mask-border-repeat",
+      "mask-border-slice",
+      "mask-border-source",
+      "mask-border-width"
+    ],
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": [
+      "mask-border-mode",
+      "mask-border-outset",
+      "mask-border-repeat",
+      "mask-border-slice",
+      "mask-border-source",
+      "mask-border-width"
+    ],
+    "order": "perGrammar",
+    "stacking": true,
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-border"
+  },
+  "mask-border-mode": {
+    "syntax": "luminance | alpha",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "alpha",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-border-mode"
+  },
+  "mask-border-outset": {
+    "syntax": "[ <length> | <number> ]{1,4}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-border-outset"
+  },
+  "mask-border-repeat": {
+    "syntax": "[ stretch | repeat | round | space ]{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "stretch",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-border-repeat"
+  },
+  "mask-border-slice": {
+    "syntax": "<number-percentage>{1,4} fill?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "referToSizeOfMaskBorderImage",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-border-slice"
+  },
+  "mask-border-source": {
+    "syntax": "none | <image>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "none",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "asSpecifiedURLsAbsolute",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-border-source"
+  },
+  "mask-border-width": {
+    "syntax": "[ <length-percentage> | <number> | auto ]{1,4}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "relativeToMaskBorderImageArea",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "auto",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-border-width"
+  },
+  "mask-clip": {
+    "syntax": "[ <geometry-box> | no-clip ]#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "border-box",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-clip"
+  },
+  "mask-composite": {
+    "syntax": "<compositing-operator>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "add",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-composite"
+  },
+  "mask-image": {
+    "syntax": "<mask-reference>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "none",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "asSpecifiedURLsAbsolute",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-image"
+  },
+  "mask-mode": {
+    "syntax": "<masking-mode>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "match-source",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-mode"
+  },
+  "mask-origin": {
+    "syntax": "<geometry-box>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "border-box",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-origin"
+  },
+  "mask-position": {
+    "syntax": "<position>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "repeatableListOfSimpleListOfLpc",
+    "percentages": "referToSizeOfMaskPaintingArea",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "center",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "consistsOfTwoKeywordsForOriginAndOffsets",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-position"
+  },
+  "mask-repeat": {
+    "syntax": "<repeat-style>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "no-repeat",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "consistsOfTwoDimensionKeywords",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-repeat"
+  },
+  "mask-size": {
+    "syntax": "<bg-size>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "repeatableListOfSimpleListOfLpc",
+    "percentages": "no",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "auto",
+    "appliesto": "allElementsSVGContainerElements",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-size"
+  },
+  "mask-type": {
+    "syntax": "luminance | alpha",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Masking"
+    ],
+    "initial": "luminance",
+    "appliesto": "maskElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-type"
+  },
+  "masonry-auto-flow": {
+    "syntax": "[ pack | next ] || [ definite-first | ordered ]",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Grid Layout"
+    ],
+    "initial": "pack",
+    "appliesto": "gridContainersWithMasonryLayout",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/masonry-auto-flow"
+  },
+  "math-style": {
+    "syntax": "normal | compact",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "notAnimatable",
+    "percentages": "no",
+    "groups": [
+      "MathML"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/math-style"
+  },
+  "max-block-size": {
+    "syntax": "<'max-width'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "blockSizeOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "sameAsWidthAndHeight",
+    "computed": "sameAsMaxWidthAndMaxHeight",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/max-block-size"
+  },
+  "max-height": {
+    "syntax": "none | <length-percentage> | min-content | max-content | fit-content(<length-percentage>)",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "regardingHeightOfGeneratedBoxContainingBlockPercentagesNone",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "none",
+    "appliesto": "allElementsButNonReplacedAndTableColumns",
+    "computed": "percentageAsSpecifiedAbsoluteLengthOrNone",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/max-height"
+  },
+  "max-inline-size": {
+    "syntax": "<'max-width'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "inlineSizeOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "sameAsWidthAndHeight",
+    "computed": "sameAsMaxWidthAndMaxHeight",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/max-inline-size"
+  },
+  "max-lines": {
+    "syntax": "none | <integer>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "integer",
+    "percentages": "no",
+    "groups": [
+      "CSS Overflow"
+    ],
+    "initial": "none",
+    "appliesto": "blockContainersExceptMultiColumnContainers",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "experimental"
+  },
+  "max-width": {
+    "syntax": "none | <length-percentage> | min-content | max-content | fit-content(<length-percentage>)",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "none",
+    "appliesto": "allElementsButNonReplacedAndTableRows",
+    "computed": "percentageAsSpecifiedAbsoluteLengthOrNone",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/max-width"
+  },
+  "min-block-size": {
+    "syntax": "<'min-width'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "blockSizeOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "sameAsWidthAndHeight",
+    "computed": "sameAsMinWidthAndMinHeight",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/min-block-size"
+  },
+  "min-height": {
+    "syntax": "auto | <length> | <percentage> | min-content | max-content | fit-content(<length-percentage>)",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "regardingHeightOfGeneratedBoxContainingBlockPercentages0",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "auto",
+    "appliesto": "allElementsButNonReplacedAndTableColumns",
+    "computed": "percentageAsSpecifiedOrAbsoluteLength",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/min-height"
+  },
+  "min-inline-size": {
+    "syntax": "<'min-width'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "inlineSizeOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "sameAsWidthAndHeight",
+    "computed": "sameAsMinWidthAndMinHeight",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/min-inline-size"
+  },
+  "min-width": {
+    "syntax": "auto | <length> | <percentage> | min-content | max-content | fit-content(<length-percentage>)",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "auto",
+    "appliesto": "allElementsButNonReplacedAndTableRows",
+    "computed": "percentageAsSpecifiedOrAbsoluteLength",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/min-width"
+  },
+  "mix-blend-mode": {
+    "syntax": "<blend-mode>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Compositing and Blending"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "stacking": true,
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mix-blend-mode"
+  },
+  "object-fit": {
+    "syntax": "fill | contain | cover | none | scale-down",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Images"
+    ],
+    "initial": "fill",
+    "appliesto": "replacedElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/object-fit"
+  },
+  "object-position": {
+    "syntax": "<position>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "repeatableListOfSimpleListOfLpc",
+    "percentages": "referToWidthAndHeightOfElement",
+    "groups": [
+      "CSS Images"
+    ],
+    "initial": "50% 50%",
+    "appliesto": "replacedElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/object-position"
+  },
+  "offset": {
+    "syntax": "[ <'offset-position'>? [ <'offset-path'> [ <'offset-distance'> || <'offset-rotate'> ]? ]? ]! [ / <'offset-anchor'> ]?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "offset-position",
+      "offset-path",
+      "offset-distance",
+      "offset-anchor",
+      "offset-rotate"
+    ],
+    "percentages": [
+      "offset-position",
+      "offset-distance",
+      "offset-anchor"
+    ],
+    "groups": [
+      "CSS Motion Path"
+    ],
+    "initial": [
+      "offset-position",
+      "offset-path",
+      "offset-distance",
+      "offset-anchor",
+      "offset-rotate"
+    ],
+    "appliesto": "transformableElements",
+    "computed": [
+      "offset-position",
+      "offset-path",
+      "offset-distance",
+      "offset-anchor",
+      "offset-rotate"
+    ],
+    "order": "perGrammar",
+    "stacking": true,
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/offset"
+  },
+  "offset-anchor": {
+    "syntax": "auto | <position>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "position",
+    "percentages": "relativeToWidthAndHeight",
+    "groups": [
+      "CSS Motion Path"
+    ],
+    "initial": "auto",
+    "appliesto": "transformableElements",
+    "computed": "forLengthAbsoluteValueOtherwisePercentage",
+    "order": "perGrammar",
+    "status": "standard"
+  },
+  "offset-distance": {
+    "syntax": "<length-percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToTotalPathLength",
+    "groups": [
+      "CSS Motion Path"
+    ],
+    "initial": "0",
+    "appliesto": "transformableElements",
+    "computed": "forLengthAbsoluteValueOtherwisePercentage",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/offset-distance"
+  },
+  "offset-path": {
+    "syntax": "none | ray( [ <angle> && <size> && contain? ] ) | <path()> | <url> | [ <basic-shape> || <geometry-box> ]",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "angleOrBasicShapeOrPath",
+    "percentages": "no",
+    "groups": [
+      "CSS Motion Path"
+    ],
+    "initial": "none",
+    "appliesto": "transformableElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "stacking": true,
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/offset-path"
+  },
+  "offset-position": {
+    "syntax": "auto | <position>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "position",
+    "percentages": "referToSizeOfContainingBlock",
+    "groups": [
+      "CSS Motion Path"
+    ],
+    "initial": "auto",
+    "appliesto": "transformableElements",
+    "computed": "forLengthAbsoluteValueOtherwisePercentage",
+    "order": "perGrammar",
+    "status": "experimental"
+  },
+  "offset-rotate": {
+    "syntax": "[ auto | reverse ] || <angle>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "angleOrBasicShapeOrPath",
+    "percentages": "no",
+    "groups": [
+      "CSS Motion Path"
+    ],
+    "initial": "auto",
+    "appliesto": "transformableElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/offset-rotate"
+  },
+  "opacity": {
+    "syntax": "<alpha-value>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "number",
+    "percentages": "no",
+    "groups": [
+      "CSS Color"
+    ],
+    "initial": "1.0",
+    "appliesto": "allElements",
+    "computed": "specifiedValueClipped0To1",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/opacity"
+  },
+  "order": {
+    "syntax": "<integer>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "integer",
+    "percentages": "no",
+    "groups": [
+      "CSS Flexible Box Layout"
+    ],
+    "initial": "0",
+    "appliesto": "flexItemsGridItemsAbsolutelyPositionedContainerChildren",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/order"
+  },
+  "orphans": {
+    "syntax": "<integer>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fragmentation"
+    ],
+    "initial": "2",
+    "appliesto": "blockContainerElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/orphans"
+  },
+  "outline": {
+    "syntax": "[ <'outline-color'> || <'outline-style'> || <'outline-width'> ]",
+    "media": [
+      "visual",
+      "interactive"
+    ],
+    "inherited": false,
+    "animationType": [
+      "outline-color",
+      "outline-width",
+      "outline-style"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Basic User Interface"
+    ],
+    "initial": [
+      "outline-color",
+      "outline-style",
+      "outline-width"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "outline-color",
+      "outline-width",
+      "outline-style"
+    ],
+    "order": "orderOfAppearance",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/outline"
+  },
+  "outline-color": {
+    "syntax": "<color> | invert",
+    "media": [
+      "visual",
+      "interactive"
+    ],
+    "inherited": false,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "CSS Basic User Interface"
+    ],
+    "initial": "invertOrCurrentColor",
+    "appliesto": "allElements",
+    "computed": "invertForTranslucentColorRGBAOtherwiseRGB",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/outline-color"
+  },
+  "outline-offset": {
+    "syntax": "<length>",
+    "media": [
+      "visual",
+      "interactive"
+    ],
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "no",
+    "groups": [
+      "CSS Basic User Interface"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/outline-offset"
+  },
+  "outline-style": {
+    "syntax": "auto | <'border-style'>",
+    "media": [
+      "visual",
+      "interactive"
+    ],
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Basic User Interface"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/outline-style"
+  },
+  "outline-width": {
+    "syntax": "<line-width>",
+    "media": [
+      "visual",
+      "interactive"
+    ],
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "no",
+    "groups": [
+      "CSS Basic User Interface"
+    ],
+    "initial": "medium",
+    "appliesto": "allElements",
+    "computed": "absoluteLength0ForNone",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/outline-width"
+  },
+  "overflow": {
+    "syntax": "[ visible | hidden | clip | scroll | auto ]{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Overflow"
+    ],
+    "initial": "visible",
+    "appliesto": "blockContainersFlexContainersGridContainers",
+    "computed": [
+      "overflow-x",
+      "overflow-y"
+    ],
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overflow"
+  },
+  "overflow-anchor": {
+    "syntax": "auto | none",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Anchoring"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard"
+  },
+  "overflow-block": {
+    "syntax": "visible | hidden | clip | scroll | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Overflow"
+    ],
+    "initial": "auto",
+    "appliesto": "blockContainersFlexContainersGridContainers",
+    "computed": "asSpecifiedButVisibleOrClipReplacedToAutoOrHiddenIfOtherValueDifferent",
+    "order": "perGrammar",
+    "status": "standard"
+  },
+  "overflow-clip-box": {
+    "syntax": "padding-box | content-box",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Mozilla Extensions"
+    ],
+    "initial": "padding-box",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Mozilla/CSS/overflow-clip-box"
+  },
+  "overflow-inline": {
+    "syntax": "visible | hidden | clip | scroll | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Overflow"
+    ],
+    "initial": "auto",
+    "appliesto": "blockContainersFlexContainersGridContainers",
+    "computed": "asSpecifiedButVisibleOrClipReplacedToAutoOrHiddenIfOtherValueDifferent",
+    "order": "perGrammar",
+    "status": "standard"
+  },
+  "overflow-wrap": {
+    "syntax": "normal | break-word | anywhere",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "normal",
+    "appliesto": "nonReplacedInlineElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overflow-wrap"
+  },
+  "overflow-x": {
+    "syntax": "visible | hidden | clip | scroll | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Overflow"
+    ],
+    "initial": "visible",
+    "appliesto": "blockContainersFlexContainersGridContainers",
+    "computed": "asSpecifiedButVisibleOrClipReplacedToAutoOrHiddenIfOtherValueDifferent",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overflow-x"
+  },
+  "overflow-y": {
+    "syntax": "visible | hidden | clip | scroll | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Overflow"
+    ],
+    "initial": "visible",
+    "appliesto": "blockContainersFlexContainersGridContainers",
+    "computed": "asSpecifiedButVisibleOrClipReplacedToAutoOrHiddenIfOtherValueDifferent",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overflow-y"
+  },
+  "overscroll-behavior": {
+    "syntax": "[ contain | none | auto ]{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "auto",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior"
+  },
+  "overscroll-behavior-block": {
+    "syntax": "contain | none | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "auto",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-block"
+  },
+  "overscroll-behavior-inline": {
+    "syntax": "contain | none | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "auto",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-inline"
+  },
+  "overscroll-behavior-x": {
+    "syntax": "contain | none | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "auto",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-x"
+  },
+  "overscroll-behavior-y": {
+    "syntax": "contain | none | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "auto",
+    "appliesto": "nonReplacedBlockAndInlineBlockElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-y"
+  },
+  "padding": {
+    "syntax": "[ <length> | <percentage> ]{1,4}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": [
+      "padding-bottom",
+      "padding-left",
+      "padding-right",
+      "padding-top"
+    ],
+    "appliesto": "allElementsExceptInternalTableDisplayTypes",
+    "computed": [
+      "padding-bottom",
+      "padding-left",
+      "padding-right",
+      "padding-top"
+    ],
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding"
+  },
+  "padding-block": {
+    "syntax": "<'padding-left'>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "logicalWidthOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asLength",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-block"
+  },
+  "padding-block-end": {
+    "syntax": "<'padding-left'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "logicalWidthOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asLength",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-block-end"
+  },
+  "padding-block-start": {
+    "syntax": "<'padding-left'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "logicalWidthOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asLength",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-block-start"
+  },
+  "padding-bottom": {
+    "syntax": "<length> | <percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsExceptInternalTableDisplayTypes",
+    "computed": "percentageAsSpecifiedOrAbsoluteLength",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-bottom"
+  },
+  "padding-inline": {
+    "syntax": "<'padding-left'>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "logicalWidthOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asLength",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-inline"
+  },
+  "padding-inline-end": {
+    "syntax": "<'padding-left'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "logicalWidthOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asLength",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-inline-end"
+  },
+  "padding-inline-start": {
+    "syntax": "<'padding-left'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "logicalWidthOfContainingBlock",
+    "groups": [
+      "CSS Logical Properties"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asLength",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-inline-start"
+  },
+  "padding-left": {
+    "syntax": "<length> | <percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsExceptInternalTableDisplayTypes",
+    "computed": "percentageAsSpecifiedOrAbsoluteLength",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-left"
+  },
+  "padding-right": {
+    "syntax": "<length> | <percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsExceptInternalTableDisplayTypes",
+    "computed": "percentageAsSpecifiedOrAbsoluteLength",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-right"
+  },
+  "padding-top": {
+    "syntax": "<length> | <percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "0",
+    "appliesto": "allElementsExceptInternalTableDisplayTypes",
+    "computed": "percentageAsSpecifiedOrAbsoluteLength",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-top"
+  },
+  "page-break-after": {
+    "syntax": "auto | always | avoid | left | right | recto | verso",
+    "media": [
+      "visual",
+      "paged"
+    ],
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Pages"
+    ],
+    "initial": "auto",
+    "appliesto": "blockElementsInNormalFlow",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/page-break-after"
+  },
+  "page-break-before": {
+    "syntax": "auto | always | avoid | left | right | recto | verso",
+    "media": [
+      "visual",
+      "paged"
+    ],
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Pages"
+    ],
+    "initial": "auto",
+    "appliesto": "blockElementsInNormalFlow",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/page-break-before"
+  },
+  "page-break-inside": {
+    "syntax": "auto | avoid",
+    "media": [
+      "visual",
+      "paged"
+    ],
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Pages"
+    ],
+    "initial": "auto",
+    "appliesto": "blockElementsInNormalFlow",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/page-break-inside"
+  },
+  "paint-order": {
+    "syntax": "normal | [ fill || stroke || markers ]",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "normal",
+    "appliesto": "textElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/paint-order"
+  },
+  "perspective": {
+    "syntax": "none | <length>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "no",
+    "groups": [
+      "CSS Transforms"
+    ],
+    "initial": "none",
+    "appliesto": "transformableElements",
+    "computed": "absoluteLengthOrNone",
+    "order": "uniqueOrder",
+    "stacking": true,
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/perspective"
+  },
+  "perspective-origin": {
+    "syntax": "<position>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "simpleListOfLpc",
+    "percentages": "referToSizeOfBoundingBox",
+    "groups": [
+      "CSS Transforms"
+    ],
+    "initial": "50% 50%",
+    "appliesto": "transformableElements",
+    "computed": "forLengthAbsoluteValueOtherwisePercentage",
+    "order": "oneOrTwoValuesLengthAbsoluteKeywordsPercentages",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/perspective-origin"
+  },
+  "place-content": {
+    "syntax": "<'align-content'> <'justify-content'>?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Box Alignment"
+    ],
+    "initial": "normal",
+    "appliesto": "multilineFlexContainers",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/place-content"
+  },
+  "place-items": {
+    "syntax": "<'align-items'> <'justify-items'>?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Box Alignment"
+    ],
+    "initial": [
+      "align-items",
+      "justify-items"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "align-items",
+      "justify-items"
+    ],
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/place-items"
+  },
+  "place-self": {
+    "syntax": "<'align-self'> <'justify-self'>?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Box Alignment"
+    ],
+    "initial": [
+      "align-self",
+      "justify-self"
+    ],
+    "appliesto": "blockLevelBoxesAndAbsolutelyPositionedBoxesAndGridItems",
+    "computed": [
+      "align-self",
+      "justify-self"
+    ],
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/place-self"
+  },
+  "pointer-events": {
+    "syntax": "auto | none | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | inherit",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Pointer Events"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/pointer-events"
+  },
+  "position": {
+    "syntax": "static | relative | absolute | sticky | fixed",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Positioning"
+    ],
+    "initial": "static",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "stacking": true,
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/position"
+  },
+  "quotes": {
+    "syntax": "none | auto | [ <string> <string> ]+",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Generated Content"
+    ],
+    "initial": "dependsOnUserAgent",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/quotes"
+  },
+  "resize": {
+    "syntax": "none | both | horizontal | vertical | block | inline",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Basic User Interface"
+    ],
+    "initial": "none",
+    "appliesto": "elementsWithOverflowNotVisibleAndReplacedElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/resize"
+  },
+  "right": {
+    "syntax": "<length> | <percentage> | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Positioning"
+    ],
+    "initial": "auto",
+    "appliesto": "positionedElements",
+    "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/right"
+  },
+  "rotate": {
+    "syntax": "none | <angle> | [ x | y | z | <number>{3} ] && <angle>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "transform",
+    "percentages": "no",
+    "groups": [
+      "CSS Transforms"
+    ],
+    "initial": "none",
+    "appliesto": "transformableElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "stacking": true,
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/rotate"
+  },
+  "row-gap": {
+    "syntax": "normal | <length-percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToDimensionOfContentArea",
+    "groups": [
+      "CSS Box Alignment"
+    ],
+    "initial": "normal",
+    "appliesto": "multiColumnElementsFlexContainersGridContainers",
+    "computed": "asSpecifiedWithLengthsAbsoluteAndNormalComputingToZeroExceptMultiColumn",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/row-gap"
+  },
+  "ruby-align": {
+    "syntax": "start | center | space-between | space-around",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Ruby"
+    ],
+    "initial": "space-around",
+    "appliesto": "rubyBasesAnnotationsBaseAnnotationContainers",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/ruby-align"
+  },
+  "ruby-merge": {
+    "syntax": "separate | collapse | auto",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Ruby"
+    ],
+    "initial": "separate",
+    "appliesto": "rubyAnnotationsContainers",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "experimental"
+  },
+  "ruby-position": {
+    "syntax": "over | under | inter-character",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Ruby"
+    ],
+    "initial": "over",
+    "appliesto": "rubyAnnotationsContainers",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/ruby-position"
+  },
+  "scale": {
+    "syntax": "none | <number>{1,3}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "transform",
+    "percentages": "no",
+    "groups": [
+      "CSS Transforms"
+    ],
+    "initial": "none",
+    "appliesto": "transformableElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "stacking": true,
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scale"
+  },
+  "scrollbar-color": {
+    "syntax": "auto | dark | light | <color>{2}",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "CSS Scrollbars"
+    ],
+    "initial": "auto",
+    "appliesto": "scrollingBoxes",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scrollbar-color"
+  },
+  "scrollbar-gutter": {
+    "syntax": "auto | [ stable | always ] && both? && force?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Overflow"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scrollbar-gutter"
+  },
+  "scrollbar-width": {
+    "syntax": "auto | thin | none",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Scrollbars"
+    ],
+    "initial": "auto",
+    "appliesto": "scrollingBoxes",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scrollbar-width"
+  },
+  "scroll-behavior": {
+    "syntax": "auto | smooth",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSSOM View"
+    ],
+    "initial": "auto",
+    "appliesto": "scrollingBoxes",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-behavior"
+  },
+  "scroll-margin": {
+    "syntax": "<length>{1,4}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin"
+  },
+  "scroll-margin-block": {
+    "syntax": "<length>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block"
+  },
+  "scroll-margin-block-start": {
+    "syntax": "<length>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-start"
+  },
+  "scroll-margin-block-end": {
+    "syntax": "<length>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-end"
+  },
+  "scroll-margin-bottom": {
+    "syntax": "<length>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-bottom"
+  },
+  "scroll-margin-inline": {
+    "syntax": "<length>{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline"
+  },
+  "scroll-margin-inline-start": {
+    "syntax": "<length>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-start"
+  },
+  "scroll-margin-inline-end": {
+    "syntax": "<length>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-end"
+  },
+  "scroll-margin-left": {
+    "syntax": "<length>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-left"
+  },
+  "scroll-margin-right": {
+    "syntax": "<length>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-right"
+  },
+  "scroll-margin-top": {
+    "syntax": "<length>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "0",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-top"
+  },
+  "scroll-padding": {
+    "syntax": "[ auto | <length-percentage> ]{1,4}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "relativeToTheScrollContainersScrollport",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "auto",
+    "appliesto": "scrollContainers",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding"
+  },
+  "scroll-padding-block": {
+    "syntax": "[ auto | <length-percentage> ]{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "relativeToTheScrollContainersScrollport",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "auto",
+    "appliesto": "scrollContainers",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block"
+  },
+  "scroll-padding-block-start": {
+    "syntax": "auto | <length-percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "relativeToTheScrollContainersScrollport",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "auto",
+    "appliesto": "scrollContainers",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-start"
+  },
+  "scroll-padding-block-end": {
+    "syntax": "auto | <length-percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "relativeToTheScrollContainersScrollport",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "auto",
+    "appliesto": "scrollContainers",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-end"
+  },
+  "scroll-padding-bottom": {
+    "syntax": "auto | <length-percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "relativeToTheScrollContainersScrollport",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "auto",
+    "appliesto": "scrollContainers",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-bottom"
+  },
+  "scroll-padding-inline": {
+    "syntax": "[ auto | <length-percentage> ]{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "relativeToTheScrollContainersScrollport",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "auto",
+    "appliesto": "scrollContainers",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline"
+  },
+  "scroll-padding-inline-start": {
+    "syntax": "auto | <length-percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "relativeToTheScrollContainersScrollport",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "auto",
+    "appliesto": "scrollContainers",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-start"
+  },
+  "scroll-padding-inline-end": {
+    "syntax": "auto | <length-percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "relativeToTheScrollContainersScrollport",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "auto",
+    "appliesto": "scrollContainers",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-end"
+  },
+  "scroll-padding-left": {
+    "syntax": "auto | <length-percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "relativeToTheScrollContainersScrollport",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "auto",
+    "appliesto": "scrollContainers",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-left"
+  },
+  "scroll-padding-right": {
+    "syntax": "auto | <length-percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "relativeToTheScrollContainersScrollport",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "auto",
+    "appliesto": "scrollContainers",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-right"
+  },
+  "scroll-padding-top": {
+    "syntax": "auto | <length-percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "relativeToTheScrollContainersScrollport",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "auto",
+    "appliesto": "scrollContainers",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-top"
+  },
+  "scroll-snap-align": {
+    "syntax": "[ none | start | end | center ]{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-align"
+  },
+  "scroll-snap-coordinate": {
+    "syntax": "none | <position>#",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "position",
+    "percentages": "referToBorderBox",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "uniqueOrder",
+    "status": "obsolete",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-coordinate"
+  },
+  "scroll-snap-destination": {
+    "syntax": "<position>",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "position",
+    "percentages": "relativeToScrollContainerPaddingBoxAxis",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "0px 0px",
+    "appliesto": "scrollContainers",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "uniqueOrder",
+    "status": "obsolete",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-destination"
+  },
+  "scroll-snap-points-x": {
+    "syntax": "none | repeat( <length-percentage> )",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "relativeToScrollContainerPaddingBoxAxis",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "none",
+    "appliesto": "scrollContainers",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "uniqueOrder",
+    "status": "obsolete",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-points-x"
+  },
+  "scroll-snap-points-y": {
+    "syntax": "none | repeat( <length-percentage> )",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "relativeToScrollContainerPaddingBoxAxis",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "none",
+    "appliesto": "scrollContainers",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "uniqueOrder",
+    "status": "obsolete",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-points-y"
+  },
+  "scroll-snap-stop": {
+    "syntax": "normal | always",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-stop"
+  },
+  "scroll-snap-type": {
+    "syntax": "none | [ x | y | block | inline | both ] [ mandatory | proximity ]?",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type"
+  },
+  "scroll-snap-type-x": {
+    "syntax": "none | mandatory | proximity",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "none",
+    "appliesto": "scrollContainers",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "obsolete",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type-x"
+  },
+  "scroll-snap-type-y": {
+    "syntax": "none | mandatory | proximity",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Scroll Snap"
+    ],
+    "initial": "none",
+    "appliesto": "scrollContainers",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "obsolete",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type-y"
+  },
+  "shape-image-threshold": {
+    "syntax": "<alpha-value>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "number",
+    "percentages": "no",
+    "groups": [
+      "CSS Shapes"
+    ],
+    "initial": "0.0",
+    "appliesto": "floats",
+    "computed": "specifiedValueNumberClipped0To1",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/shape-image-threshold"
+  },
+  "shape-margin": {
+    "syntax": "<length-percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Shapes"
+    ],
+    "initial": "0",
+    "appliesto": "floats",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/shape-margin"
+  },
+  "shape-outside": {
+    "syntax": "none | <shape-box> || <basic-shape> | <image>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "basicShapeOtherwiseNo",
+    "percentages": "no",
+    "groups": [
+      "CSS Shapes"
+    ],
+    "initial": "none",
+    "appliesto": "floats",
+    "computed": "asDefinedForBasicShapeWithAbsoluteURIOtherwiseAsSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/shape-outside"
+  },
+  "tab-size": {
+    "syntax": "<integer> | <length>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "length",
+    "percentages": "no",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "8",
+    "appliesto": "blockContainers",
+    "computed": "specifiedIntegerOrAbsoluteLength",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/tab-size"
+  },
+  "table-layout": {
+    "syntax": "auto | fixed",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Table"
+    ],
+    "initial": "auto",
+    "appliesto": "tableElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/table-layout"
+  },
+  "text-align": {
+    "syntax": "start | end | left | right | center | justify | match-parent",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "startOrNamelessValueIfLTRRightIfRTL",
+    "appliesto": "blockContainers",
+    "computed": "asSpecifiedExceptMatchParent",
+    "order": "orderOfAppearance",
+    "alsoAppliesTo": [
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-align"
+  },
+  "text-align-last": {
+    "syntax": "auto | start | end | left | right | center | justify",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "auto",
+    "appliesto": "blockContainers",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-align-last"
+  },
+  "text-combine-upright": {
+    "syntax": "none | all | [ digits <integer>? ]",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "notAnimatable",
+    "percentages": "no",
+    "groups": [
+      "CSS Writing Modes"
+    ],
+    "initial": "none",
+    "appliesto": "nonReplacedInlineElements",
+    "computed": "keywordPlusIntegerIfDigits",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-combine-upright"
+  },
+  "text-decoration": {
+    "syntax": "<'text-decoration-line'> || <'text-decoration-style'> || <'text-decoration-color'> || <'text-decoration-thickness'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "text-decoration-color",
+      "text-decoration-style",
+      "text-decoration-line",
+      "text-decoration-thickness"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Text Decoration"
+    ],
+    "initial": [
+      "text-decoration-color",
+      "text-decoration-style",
+      "text-decoration-line"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "text-decoration-line",
+      "text-decoration-style",
+      "text-decoration-color",
+      "text-decoration-thickness"
+    ],
+    "order": "orderOfAppearance",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration"
+  },
+  "text-decoration-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "CSS Text Decoration"
+    ],
+    "initial": "currentcolor",
+    "appliesto": "allElements",
+    "computed": "computedColor",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-color"
+  },
+  "text-decoration-line": {
+    "syntax": "none | [ underline || overline || line-through || blink ] | spelling-error | grammar-error",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text Decoration"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-line"
+  },
+  "text-decoration-skip": {
+    "syntax": "none | [ objects || [ spaces | [ leading-spaces || trailing-spaces ] ] || edges || box-decoration ]",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text Decoration"
+    ],
+    "initial": "objects",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip"
+  },
+  "text-decoration-skip-ink": {
+    "syntax": "auto | all | none",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text Decoration"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip-ink"
+  },
+  "text-decoration-style": {
+    "syntax": "solid | double | dotted | dashed | wavy",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text Decoration"
+    ],
+    "initial": "solid",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-style"
+  },
+  "text-decoration-thickness": {
+    "syntax": "auto | from-font | <length> | <percentage> ",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "byComputedValueType",
+    "percentages": "referToElementFontSize",
+    "groups": [
+      "CSS Text Decoration"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-thickness"
+  },
+  "text-emphasis": {
+    "syntax": "<'text-emphasis-style'> || <'text-emphasis-color'>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": [
+      "text-emphasis-color",
+      "text-emphasis-style"
+    ],
+    "percentages": "no",
+    "groups": [
+      "CSS Text Decoration"
+    ],
+    "initial": [
+      "text-emphasis-style",
+      "text-emphasis-color"
+    ],
+    "appliesto": "allElements",
+    "computed": [
+      "text-emphasis-style",
+      "text-emphasis-color"
+    ],
+    "order": "orderOfAppearance",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-emphasis"
+  },
+  "text-emphasis-color": {
+    "syntax": "<color>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "color",
+    "percentages": "no",
+    "groups": [
+      "CSS Text Decoration"
+    ],
+    "initial": "currentcolor",
+    "appliesto": "allElements",
+    "computed": "computedColor",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-emphasis-color"
+  },
+  "text-emphasis-position": {
+    "syntax": "[ over | under ] && [ right | left ]",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text Decoration"
+    ],
+    "initial": "over right",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-emphasis-position"
+  },
+  "text-emphasis-style": {
+    "syntax": "none | [ [ filled | open ] || [ dot | circle | double-circle | triangle | sesame ] ] | <string>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text Decoration"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-emphasis-style"
+  },
+  "text-indent": {
+    "syntax": "<length-percentage> && hanging? && each-line?",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "lpc",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "0",
+    "appliesto": "blockContainers",
+    "computed": "percentageOrAbsoluteLengthPlusKeywords",
+    "order": "lengthOrPercentageBeforeKeywords",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-indent"
+  },
+  "text-justify": {
+    "syntax": "auto | inter-character | inter-word | none",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "auto",
+    "appliesto": "inlineLevelAndTableCellElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-justify"
+  },
+  "text-orientation": {
+    "syntax": "mixed | upright | sideways",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Writing Modes"
+    ],
+    "initial": "mixed",
+    "appliesto": "allElementsExceptTableRowGroupsRowsColumnGroupsAndColumns",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-orientation"
+  },
+  "text-overflow": {
+    "syntax": "[ clip | ellipsis | <string> ]{1,2}",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Basic User Interface"
+    ],
+    "initial": "clip",
+    "appliesto": "blockContainerElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-overflow"
+  },
+  "text-rendering": {
+    "syntax": "auto | optimizeSpeed | optimizeLegibility | geometricPrecision",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Miscellaneous"
+    ],
+    "initial": "auto",
+    "appliesto": "textElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-rendering"
+  },
+  "text-shadow": {
+    "syntax": "none | <shadow-t>#",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "shadowList",
+    "percentages": "no",
+    "groups": [
+      "CSS Text Decoration"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "colorPlusThreeAbsoluteLengths",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-shadow"
+  },
+  "text-size-adjust": {
+    "syntax": "none | auto | <percentage>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "referToSizeOfFont",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "autoForSmartphoneBrowsersSupportingInflation",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-size-adjust"
+  },
+  "text-transform": {
+    "syntax": "none | capitalize | uppercase | lowercase | full-width | full-size-kana",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "none",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-transform"
+  },
+  "text-underline-offset": {
+    "syntax": "auto | <length> | <percentage> ",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "byComputedValueType",
+    "percentages": "referToElementFontSize",
+    "groups": [
+      "CSS Text Decoration"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-underline-offset"
+  },
+  "text-underline-position": {
+    "syntax": "auto | from-font | [ under || [ left | right ] ]",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text Decoration"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "orderOfAppearance",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-underline-position"
+  },
+  "top": {
+    "syntax": "<length> | <percentage> | auto",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToContainingBlockHeight",
+    "groups": [
+      "CSS Positioning"
+    ],
+    "initial": "auto",
+    "appliesto": "positionedElements",
+    "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/top"
+  },
+  "touch-action": {
+    "syntax": "auto | none | [ [ pan-x | pan-left | pan-right ] || [ pan-y | pan-up | pan-down ] || pinch-zoom ] | manipulation",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "Pointer Events"
+    ],
+    "initial": "auto",
+    "appliesto": "allElementsExceptNonReplacedInlineElementsTableRowsColumnsRowColumnGroups",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/touch-action"
+  },
+  "transform": {
+    "syntax": "none | <transform-list>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "transform",
+    "percentages": "referToSizeOfBoundingBox",
+    "groups": [
+      "CSS Transforms"
+    ],
+    "initial": "none",
+    "appliesto": "transformableElements",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "uniqueOrder",
+    "stacking": true,
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transform"
+  },
+  "transform-box": {
+    "syntax": "content-box | border-box | fill-box | stroke-box | view-box",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Transforms"
+    ],
+    "initial": "view-box",
+    "appliesto": "transformableElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transform-box"
+  },
+  "transform-origin": {
+    "syntax": "[ <length-percentage> | left | center | right | top | bottom ] | [ [ <length-percentage> | left | center | right ] && [ <length-percentage> | top | center | bottom ] ] <length>?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "simpleListOfLpc",
+    "percentages": "referToSizeOfBoundingBox",
+    "groups": [
+      "CSS Transforms"
+    ],
+    "initial": "50% 50% 0",
+    "appliesto": "transformableElements",
+    "computed": "forLengthAbsoluteValueOtherwisePercentage",
+    "order": "oneOrTwoValuesLengthAbsoluteKeywordsPercentages",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transform-origin"
+  },
+  "transform-style": {
+    "syntax": "flat | preserve-3d",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Transforms"
+    ],
+    "initial": "flat",
+    "appliesto": "transformableElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "stacking": true,
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transform-style"
+  },
+  "transition": {
+    "syntax": "<single-transition>#",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Transitions"
+    ],
+    "initial": [
+      "transition-delay",
+      "transition-duration",
+      "transition-property",
+      "transition-timing-function"
+    ],
+    "appliesto": "allElementsAndPseudos",
+    "computed": [
+      "transition-delay",
+      "transition-duration",
+      "transition-property",
+      "transition-timing-function"
+    ],
+    "order": "orderOfAppearance",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transition"
+  },
+  "transition-delay": {
+    "syntax": "<time>#",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Transitions"
+    ],
+    "initial": "0s",
+    "appliesto": "allElementsAndPseudos",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transition-delay"
+  },
+  "transition-duration": {
+    "syntax": "<time>#",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Transitions"
+    ],
+    "initial": "0s",
+    "appliesto": "allElementsAndPseudos",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transition-duration"
+  },
+  "transition-property": {
+    "syntax": "none | <single-transition-property>#",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Transitions"
+    ],
+    "initial": "all",
+    "appliesto": "allElementsAndPseudos",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transition-property"
+  },
+  "transition-timing-function": {
+    "syntax": "<timing-function>#",
+    "media": "interactive",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Transitions"
+    ],
+    "initial": "ease",
+    "appliesto": "allElementsAndPseudos",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transition-timing-function"
+  },
+  "translate": {
+    "syntax": "none | <length-percentage> [ <length-percentage> <length>? ]?",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "transform",
+    "percentages": "referToSizeOfBoundingBox",
+    "groups": [
+      "CSS Transforms"
+    ],
+    "initial": "none",
+    "appliesto": "transformableElements",
+    "computed": "asSpecifiedRelativeToAbsoluteLengths",
+    "order": "perGrammar",
+    "stacking": true,
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/translate"
+  },
+  "unicode-bidi": {
+    "syntax": "normal | embed | isolate | bidi-override | isolate-override | plaintext",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Writing Modes"
+    ],
+    "initial": "normal",
+    "appliesto": "allElementsSomeValuesNoEffectOnNonInlineElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/unicode-bidi"
+  },
+  "user-select": {
+    "syntax": "auto | text | none | contain | all",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Basic User Interface"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/user-select"
+  },
+  "vertical-align": {
+    "syntax": "baseline | sub | super | text-top | text-bottom | middle | top | bottom | <percentage> | <length>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "length",
+    "percentages": "referToLineHeight",
+    "groups": [
+      "CSS Table"
+    ],
+    "initial": "baseline",
+    "appliesto": "inlineLevelAndTableCellElements",
+    "computed": "absoluteLengthOrKeyword",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/vertical-align"
+  },
+  "visibility": {
+    "syntax": "visible | hidden | collapse",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "visibility",
+    "percentages": "no",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "visible",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/visibility"
+  },
+  "white-space": {
+    "syntax": "normal | pre | nowrap | pre-wrap | pre-line | break-spaces",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/white-space"
+  },
+  "widows": {
+    "syntax": "<integer>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Fragmentation"
+    ],
+    "initial": "2",
+    "appliesto": "blockContainerElements",
+    "computed": "asSpecified",
+    "order": "perGrammar",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/widows"
+  },
+  "width": {
+    "syntax": "auto | <length> | <percentage> | min-content | max-content | fit-content(<length-percentage>)",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "lpc",
+    "percentages": "referToWidthOfContainingBlock",
+    "groups": [
+      "CSS Box Model"
+    ],
+    "initial": "auto",
+    "appliesto": "allElementsButNonReplacedAndTableRows",
+    "computed": "percentageAutoOrAbsoluteLength",
+    "order": "lengthOrPercentageBeforeKeywordIfBothPresent",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/width"
+  },
+  "will-change": {
+    "syntax": "auto | <animateable-feature>#",
+    "media": "all",
+    "inherited": false,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Will Change"
+    ],
+    "initial": "auto",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/will-change"
+  },
+  "word-break": {
+    "syntax": "normal | break-all | keep-all | break-word",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/word-break"
+  },
+  "word-spacing": {
+    "syntax": "normal | <length-percentage>",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "length",
+    "percentages": "referToWidthOfAffectedGlyph",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "optimumMinAndMaxValueOfAbsoluteLengthPercentageOrNormal",
+    "order": "uniqueOrder",
+    "alsoAppliesTo": [
+      "::first-letter",
+      "::first-line",
+      "::placeholder"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/word-spacing"
+  },
+  "word-wrap": {
+    "syntax": "normal | break-word",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Text"
+    ],
+    "initial": "normal",
+    "appliesto": "nonReplacedInlineElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overflow-wrap"
+  },
+  "writing-mode": {
+    "syntax": "horizontal-tb | vertical-rl | vertical-lr | sideways-rl | sideways-lr",
+    "media": "visual",
+    "inherited": true,
+    "animationType": "discrete",
+    "percentages": "no",
+    "groups": [
+      "CSS Writing Modes"
+    ],
+    "initial": "horizontal-tb",
+    "appliesto": "allElementsExceptTableRowColumnGroupsTableRowsColumns",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/writing-mode"
+  },
+  "z-index": {
+    "syntax": "auto | <integer>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "integer",
+    "percentages": "no",
+    "groups": [
+      "CSS Positioning"
+    ],
+    "initial": "auto",
+    "appliesto": "positionedElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "stacking": true,
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/z-index"
+  },
+  "zoom": {
+    "syntax": "normal | reset | <number> | <percentage>",
+    "media": "visual",
+    "inherited": false,
+    "animationType": "integer",
+    "percentages": "no",
+    "groups": [
+      "Microsoft Extensions"
+    ],
+    "initial": "normal",
+    "appliesto": "allElements",
+    "computed": "asSpecified",
+    "order": "uniqueOrder",
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/zoom"
+  }
+}
diff --git a/node_modules/mdn-data/css/properties.schema.json b/node_modules/mdn-data/css/properties.schema.json
new file mode 100644
index 0000000..d4883e2
--- /dev/null
+++ b/node_modules/mdn-data/css/properties.schema.json
@@ -0,0 +1,402 @@
+{
+  "definitions": {
+    "propertyList": {
+      "type": "array",
+      "minItems": 1,
+      "uniqueItems": true,
+      "items": {
+        "type": "string",
+        "property-reference": {
+          "comment": "property-reference is an extension to the JSON schema validator. Here it jumps to the root level of the hierarchy and tests if a value is an existing key there (i.e a defined property). See test/validate-schema.js for implementation details.",
+          "$data": "/"
+        }
+      }
+    },
+    "animationType": {
+      "enum": [
+        "angleBasicShapeOrPath",
+        "angleOrBasicShapeOrPath",
+        "basicShapeOtherwiseNo",
+        "byComputedValueType",
+        "color",
+        "discrete",
+        "eachOfShorthandPropertiesExceptUnicodeBiDiAndDirection",
+        "filterList",
+        "fontStretch",
+        "fontWeight",
+        "integer",
+        "length",
+        "lpc",
+        "notAnimatable",
+        "numberOrLength",
+        "number",
+        "position",
+        "rectangle",
+        "repeatableListOfSimpleListOfLpc",
+        "shadowList",
+        "simpleListOfLpc",
+        "simpleListOfLpcDifferenceLpc",
+        "transform",
+        "visibility"
+      ]
+    },
+    "percentages": {
+      "enum": [
+        "blockSizeOfContainingBlock",
+        "dependsOnLayoutModel",
+        "inlineSizeOfContainingBlock",
+        "lengthsAsPercentages",
+        "logicalHeightOfContainingBlock",
+        "logicalWidthOfContainingBlock",
+        "maxZoomFactor",
+        "minZoomFactor",
+        "no",
+        "referToBorderBox",
+        "referToContainingBlockHeight",
+        "referToDimensionOfBorderBox",
+        "referToDimensionOfContentArea",
+        "referToElementFontSize",
+        "referToFlexContainersInnerMainSize",
+        "referToHeightOfBackgroundPositioningAreaMinusBackgroundImageHeight",
+        "referToLineBoxWidth",
+        "referToLineHeight",
+        "referToParentElementsFontSize",
+        "referToSizeOfBackgroundPositioningAreaMinusBackgroundImageSize",
+        "referToSizeOfBorderImage",
+        "referToSizeOfBoundingBox",
+        "referToSizeOfContainingBlock",
+        "referToSizeOfElement",
+        "referToSizeOfFont",
+        "referToSizeOfMaskBorderImage",
+        "referToSizeOfMaskPaintingArea",
+        "referToTotalPathLength",
+        "referToWidthAndHeightOfElement",
+        "referToWidthOfAffectedGlyph",
+        "referToWidthOfBackgroundPositioningAreaMinusBackgroundImageHeight",
+        "referToWidthOfContainingBlock",
+        "referToWidthOrHeightOfBorderImageArea",
+        "referToReferenceBoxWhenSpecifiedOtherwiseBorderBox",
+        "regardingHeightOfGeneratedBoxContainingBlockPercentages0",
+        "regardingHeightOfGeneratedBoxContainingBlockPercentagesNone",
+        "regardingHeightOfGeneratedBoxContainingBlockPercentagesRelativeToContainingBlock",
+        "relativeToBackgroundPositioningArea",
+        "relativeToMaskBorderImageArea",
+        "relativeToScrollContainerPaddingBoxAxis",
+        "relativeToTheScrollContainersScrollport",
+        "relativeToWidthAndHeight"
+      ]
+    },
+    "computed": {
+      "enum": [
+        "absoluteLength",
+        "absoluteLength0ForNone",
+        "absoluteLength0IfColumnRuleStyleNoneOrHidden",
+        "absoluteLengthOr0IfBorderBottomStyleNoneOrHidden",
+        "absoluteLengthOr0IfBorderLeftStyleNoneOrHidden",
+        "absoluteLengthOr0IfBorderRightStyleNoneOrHidden",
+        "absoluteLengthOr0IfBorderTopStyleNoneOrHidden",
+        "absoluteLengthOrAsSpecified",
+        "absoluteLengthOrKeyword",
+        "absoluteLengthOrNone",
+        "absoluteLengthOrNormal",
+        "absoluteLengthOrPercentage",
+        "absoluteLengthsSpecifiedColorAsSpecified",
+        "absoluteLengthZeroIfBorderStyleNoneOrHidden",
+        "absoluteLengthZeroOrLarger",
+        "absoluteURIOrNone",
+        "angleRoundedToNextQuarter",
+        "asAutoOrColor",
+        "asDefinedForBasicShapeWithAbsoluteURIOtherwiseAsSpecified",
+        "asLength",
+        "asSpecified",
+        "asSpecifiedAppliesToEachProperty",
+        "asSpecifiedButVisibleOrClipReplacedToAutoOrHiddenIfOtherValueDifferent",
+        "asSpecifiedExceptMatchParent",
+        "asSpecifiedExceptPositionedFloatingAndRootElementsKeywordMaybeDifferent",
+        "asSpecifiedRelativeToAbsoluteLengths",
+        "asSpecifiedURLsAbsolute",
+        "asSpecifiedWithExceptionOfResolution",
+        "asSpecifiedWithLengthsAbsoluteAndNormalComputingToZeroExceptMultiColumn",
+        "asSpecifiedWithVarsSubstituted",
+        "autoOnAbsolutelyPositionedElementsValueOfAlignItemsOnParent",
+        "autoOrRectangle",
+        "colorPlusThreeAbsoluteLengths",
+        "computedColor",
+        "consistsOfTwoDimensionKeywords",
+        "consistsOfTwoKeywordsForOriginAndOffsets",
+        "forLengthAbsoluteValueOtherwisePercentage",
+        "invertForTranslucentColorRGBAOtherwiseRGB",
+        "keywordOrNumericalValueBolderLighterTransformedToRealValue",
+        "keywordPlusIntegerIfDigits",
+        "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+        "listEachItemConsistingOfAbsoluteLengthPercentageAndOrigin",
+        "listEachItemHasTwoKeywordsOnePerDimension",
+        "listEachItemTwoKeywordsOriginOffsets",
+        "noneOrImageWithAbsoluteURI",
+        "normalizedAngle",
+        "normalOnElementsForPseudosNoneAbsoluteURIStringOrAsSpecified",
+        "oneToFourPercentagesOrAbsoluteLengthsPlusFill",
+        "optimumMinAndMaxValueOfAbsoluteLengthPercentageOrNormal",
+        "optimumValueOfAbsoluteLengthOrNormal",
+        "percentageAsSpecifiedAbsoluteLengthOrNone",
+        "percentageAsSpecifiedOrAbsoluteLength",
+        "percentageAutoOrAbsoluteLength",
+        "percentageOrAbsoluteLengthPlusKeywords",
+        "sameAsBoxOffsets",
+        "sameAsMaxWidthAndMaxHeight",
+        "sameAsMinWidthAndMinHeight",
+        "sameAsWidthAndHeight",
+        "specifiedIntegerOrAbsoluteLength",
+        "specifiedValueClipped0To1",
+        "specifiedValueNumberClipped0To1",
+        "translucentValuesRGBAOtherwiseRGB",
+        "twoAbsoluteLengthOrPercentages",
+        "twoAbsoluteLengths"
+      ]
+    },
+    "appliesto": {
+      "enum": [
+        "absolutelyPositionedElements",
+        "allElements",
+        "allElementsAcceptingWidthOrHeight",
+        "allElementsAndPseudos",
+        "allElementsButNonReplacedAndTableColumns",
+        "allElementsButNonReplacedAndTableRows",
+        "allElementsCreatingNativeWindows",
+        "allElementsExceptGeneratedContentOrPseudoElements",
+        "allElementsExceptInlineBoxesAndInternalRubyOrTableBoxes",
+        "allElementsExceptInternalTableDisplayTypes",
+        "allElementsExceptNonReplacedInlineElementsTableRowsColumnsRowColumnGroups",
+        "allElementsExceptTableDisplayTypes",
+        "allElementsExceptTableElementsWhenCollapse",
+        "allElementsExceptTableRowColumnGroupsTableRowsColumns",
+        "allElementsExceptTableRowGroupsRowsColumnGroupsAndColumns",
+        "allElementsNoEffectIfDisplayNone",
+        "allElementsSomeValuesNoEffectOnNonInlineElements",
+        "allElementsSVGContainerElements",
+        "allElementsSVGContainerGraphicsAndGraphicsReferencingElements",
+        "allElementsThatCanReferenceImages",
+        "allElementsUAsNotRequiredWhenCollapse",
+        "anyElementEffectOnProgressAndMeter",
+        "beforeAndAfterPseudos",
+        "blockContainerElements",
+        "blockContainers",
+        "blockContainersAndMultiColumnContainers",
+        "blockContainersExceptMultiColumnContainers",
+        "blockContainersExceptTableWrappers",
+        "blockContainersFlexContainersGridContainers",
+        "blockElementsInNormalFlow",
+        "blockLevelElements",
+        "blockLevelBoxesAndAbsolutelyPositionedBoxesAndGridItems",
+        "boxElements",
+        "childrenOfBoxElements",
+        "directChildrenOfElementsWithDisplayMozBoxMozInlineBox",
+        "elementsWithDisplayBoxOrInlineBox",
+        "elementsWithDisplayMarker",
+        "elementsWithDisplayMozBoxMozInlineBox",
+        "elementsWithOverflowNotVisibleAndReplacedElements",
+        "exclusionElements",
+        "firstLetterPseudoElementsAndInlineLevelFirstChildren",
+        "flexContainers",
+        "flexItemsAndAbsolutelyPositionedFlexContainerChildren",
+        "flexItemsAndInFlowPseudos",
+        "flexItemsGridItemsAbsolutelyPositionedContainerChildren",
+        "flexItemsGridItemsAndAbsolutelyPositionedBoxes",
+        "floats",
+        "gridContainers",
+        "gridContainersWithMasonryLayout",
+        "gridContainersWithMasonryLayoutInTheirBlockAxis",
+        "gridContainersWithMasonryLayoutInTheirInlineAxis",
+        "gridItemsAndBoxesWithinGridContainer",
+        "iframeElements",
+        "images",
+        "inFlowBlockLevelElements",
+        "inFlowChildrenOfBoxElements",
+        "inlineLevelAndTableCellElements",
+        "listItems",
+        "maskElements",
+        "multicolElements",
+        "multiColumnElementsFlexContainersGridContainers",
+        "multilineFlexContainers",
+        "nonReplacedBlockAndInlineBlockElements",
+        "nonReplacedBlockElements",
+        "nonReplacedElements",
+        "nonReplacedInlineElements",
+        "positionedElements",
+        "replacedElements",
+        "rubyAnnotationsContainers",
+        "rubyBasesAnnotationsBaseAnnotationContainers",
+        "sameAsMargin",
+        "sameAsWidthAndHeight",
+        "scrollContainers",
+        "scrollingBoxes",
+        "tableCaptionElements",
+        "tableCellElements",
+        "tableElements",
+        "textElements",
+        "textFields",
+        "transformableElements",
+        "xulImageElements"
+      ]
+    },
+    "alsoApplyTo": {
+      "type": "array",
+      "minItems": 1,
+      "uniqueItems": true,
+      "items": {
+        "enum": [
+          "::first-letter",
+          "::first-line",
+          "::placeholder"
+        ]
+      }
+    },
+    "order": {
+      "enum": [
+        "canonicalOrder",
+        "lengthOrPercentageBeforeKeywordIfBothPresent",
+        "lengthOrPercentageBeforeKeywords",
+        "oneOrTwoValuesLengthAbsoluteKeywordsPercentages",
+        "orderOfAppearance",
+        "percentagesOrLengthsFollowedByFill",
+        "perGrammar",
+        "uniqueOrder"
+      ]
+    },
+    "status": {
+      "enum": [
+        "standard",
+        "nonstandard",
+        "experimental",
+        "obsolete"
+      ]
+    },
+    "mdn_url": {
+      "type": "string",
+      "pattern": "^https://developer.mozilla.org/docs/"
+    }
+  },
+  "type": "object",
+  "additionalProperties": {
+    "type": "object",
+    "additionalProperties": false,
+    "required": [
+      "syntax",
+      "media",
+      "inherited",
+      "animationType",
+      "percentages",
+      "groups",
+      "initial",
+      "appliesto",
+      "computed",
+      "order",
+      "status"
+    ],
+    "properties": {
+      "syntax": {
+        "type": "string"
+      },
+      "media": {
+        "oneOf": [
+          {
+            "type": "string",
+            "enum": [
+              "all",
+              "aural",
+              "continuous",
+              "interactive",
+              "none",
+              "noPracticalMedia",
+              "paged",
+              "visual",
+              "visualInContinuousMediaNoEffectInOverflowColumns"
+            ]
+          },
+          {
+            "type": "array",
+            "minItems": 2,
+            "uniqueItems": true,
+            "items": {
+              "type": "string",
+              "enum": [
+                "interactive",
+                "paged",
+                "visual"
+              ]
+            }
+          }
+        ]
+      },
+      "inherited": {
+        "type": "boolean"
+      },
+      "animationType": {
+        "oneOf": [
+          {
+            "$ref": "#/definitions/animationType"
+          },
+          {
+            "$ref": "#/definitions/propertyList"
+          }
+        ]
+      },
+      "percentages": {
+        "oneOf": [
+          {
+            "$ref": "#/definitions/percentages"
+          },
+          {
+            "$ref": "#/definitions/propertyList"
+          }
+        ]
+      },
+      "groups": {
+        "type": "array",
+        "minitems": 1,
+        "uniqueItems": true,
+        "items": {
+          "$ref": "definitions.json#/groupList"
+        }
+      },
+      "initial": {
+        "oneOf": [
+          {
+            "type": "string"
+          },
+          {
+            "$ref": "#/definitions/propertyList"
+          }
+        ]
+      },
+      "appliesto": {
+        "$ref": "#/definitions/appliesto"
+      },
+      "alsoAppliesTo": {
+        "$ref": "#/definitions/alsoApplyTo"
+      },
+      "computed": {
+        "oneOf": [
+          {
+            "$ref": "#/definitions/computed"
+          },
+          {
+            "$ref": "#/definitions/propertyList"
+          }
+        ]
+      },
+      "order": {
+        "$ref": "#/definitions/order"
+      },
+      "stacking": {
+        "type": "boolean"
+      },
+      "status": {
+        "$ref": "#/definitions/status"
+      },
+      "mdn_url": {
+        "$ref": "#/definitions/mdn_url"
+      }
+    }
+  }
+}
diff --git a/node_modules/mdn-data/css/selectors.json b/node_modules/mdn-data/css/selectors.json
new file mode 100644
index 0000000..84a63c1
--- /dev/null
+++ b/node_modules/mdn-data/css/selectors.json
@@ -0,0 +1,927 @@
+{
+  "Type selectors": {
+    "syntax": "element",
+    "groups": [
+      "Basic Selectors",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Type_selectors"
+  },
+  "Class selectors": {
+    "syntax": ".class",
+    "groups": [
+      "Basic Selectors",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Class_selectors"
+  },
+  "ID selectors": {
+    "syntax": "#id",
+    "groups": [
+      "Basic Selectors",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/ID_selectors"
+  },
+  "Universal selectors": {
+    "syntax": "*",
+    "groups": [
+      "Basic Selectors",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Universal_selectors"
+  },
+  "Attribute selectors": {
+    "syntax": "[attr=value]",
+    "groups": [
+      "Basic Selectors",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Attribute_selectors"
+  },
+  "Selector list": {
+    "syntax": ",",
+    "groups": [
+      "Grouping Selectors",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Selector_list"
+  },
+  "Adjacent sibling combinator": {
+    "syntax": "A + B",
+    "groups": [
+      "Combinators",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Adjacent_sibling_combinator"
+  },
+  "General sibling combinator": {
+    "syntax": "A ~ B",
+    "groups": [
+      "Combinators",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/General_sibling_combinator"
+  },
+  "Child combinator": {
+    "syntax": "A > B",
+    "groups": [
+      "Combinators",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Child_combinator"
+  },
+  "Descendant combinator": {
+    "syntax": "A B",
+    "groups": [
+      "Combinators",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Descendant_combinator"
+  },
+  "Column combinator": {
+    "syntax": "A || B",
+    "groups": [
+      "Combinators",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Column_combinator"
+  },
+  "Pseudo-classes": {
+    "syntax": ":",
+    "groups": [
+      "Pseudo",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Pseudo-classes"
+  },
+  "Pseudo-elements": {
+    "syntax": "::",
+    "groups": [
+      "Pseudo",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Pseudo-elements"
+  },
+  ":active": {
+    "syntax": ":active",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:active"
+  },
+  ":any-link": {
+    "syntax": ":any-link",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:any-link"
+  },
+  ":checked": {
+    "syntax": ":checked",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:checked"
+  },
+  ":blank": {
+    "syntax": ":blank",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:blank"
+  },
+  ":default": {
+    "syntax": ":default",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:default"
+  },
+  ":defined": {
+    "syntax": ":defined",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:defined"
+  },
+  ":dir": {
+    "syntax": ":dir( ltr | rtl )",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:dir"
+  },
+  ":disabled": {
+    "syntax": ":disabled",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:disabled"
+  },
+  ":empty": {
+    "syntax": ":empty",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:empty"
+  },
+  ":enabled": {
+    "syntax": ":enabled",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:enabled"
+  },
+  ":first": {
+    "syntax": ":first",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:first"
+  },
+  ":first-child": {
+    "syntax": ":first-child",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:first-child"
+  },
+  ":first-of-type": {
+    "syntax": ":first-of-type",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:first-of-type"
+  },
+  ":fullscreen": {
+    "syntax": ":fullscreen",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:fullscreen"
+  },
+  ":focus": {
+    "syntax": ":focus",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:focus"
+  },
+  ":focus-visible": {
+    "syntax": ":focus-visible",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:focus-visible"
+  },
+  ":focus-within": {
+    "syntax": ":focus-within",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:focus-within"
+  },
+  ":has": {
+    "syntax": ":has( <relative-selector-list> )",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:has"
+  },
+  ":host()": {
+    "syntax": ":host( <compound-selector-list> )",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:host()"
+  },
+  ":host-context()": {
+    "syntax": ":host-context( <compound-selector-list> )",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:host-context()"
+  },
+  ":hover": {
+    "syntax": ":hover",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:hover"
+  },
+  ":indeterminate": {
+    "syntax": ":indeterminate",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:indeterminate"
+  },
+  ":in-range": {
+    "syntax": ":in-range",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:in-range"
+  },
+  ":invalid": {
+    "syntax": ":invalid",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:invalid"
+  },
+  ":is": {
+    "syntax": ":is( <complex-selector-list> )",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:is"
+  },
+  ":lang": {
+    "syntax": ":lang( <language-code> )",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:lang"
+  },
+  ":last-child": {
+    "syntax": ":last-child",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:last-child"
+  },
+  ":last-of-type": {
+    "syntax": ":last-of-type",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:last-of-type"
+  },
+  ":left": {
+    "syntax": ":left",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors",
+      "CSS Pages"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:left"
+  },
+  ":link": {
+    "syntax": ":link",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:link"
+  },
+  ":not": {
+    "syntax": ":not( <complex-selector-list> )",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:not"
+  },
+  ":nth-child": {
+    "syntax": ":nth-child( <nth> [ of <complex-selector-list> ]? )",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:nth-child"
+  },
+  ":nth-last-child": {
+    "syntax": ":nth-last-child( <nth> [ of <complex-selector-list> ]? )",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:nth-last-child"
+  },
+  ":nth-last-of-type": {
+    "syntax": ":nth-last-of-type( <nth> )",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:nth-last-of-type"
+  },
+  ":nth-of-type": {
+    "syntax": ":nth-of-type( <nth> )",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:nth-of-type"
+  },
+  ":only-child": {
+    "syntax": ":only-child",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:only-child"
+  },
+  ":only-of-type": {
+    "syntax": ":only-of-type",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:only-of-type"
+  },
+  ":optional": {
+    "syntax": ":optional",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:optional"
+  },
+  ":out-of-range": {
+    "syntax": ":out-of-range",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:out-of-range"
+  },
+  ":placeholder-shown": {
+    "syntax": ":placeholder-shown",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:placeholder-shown"
+  },
+  ":read-only": {
+    "syntax": ":read-only",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:read-only"
+  },
+  ":read-write": {
+    "syntax": ":read-write",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:read-write"
+  },
+  ":required": {
+    "syntax": ":required",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:required"
+  },
+  ":right": {
+    "syntax": ":right",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors",
+      "CSS Pages"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:right"
+  },
+  ":root": {
+    "syntax": ":root",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors",
+      "CSS Pages"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:root"
+  },
+  ":scope": {
+    "syntax": ":scope",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:scope"
+  },
+  ":target": {
+    "syntax": ":target",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:target"
+  },
+  ":valid": {
+    "syntax": ":valid",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:valid"
+  },
+  ":visited": {
+    "syntax": ":visited",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:visited"
+  },
+  ":where": {
+    "syntax": ":where( <complex-selector-list> )",
+    "groups": [
+      "Pseudo-classes",
+      "Selectors"
+    ],
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:where"
+  },
+  "::-moz-progress-bar": {
+    "syntax": "::-moz-progress-bar",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Mozilla Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-moz-progress-bar"
+  },
+  "::-moz-range-progress": {
+    "syntax": "::-moz-range-progress",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Mozilla Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-moz-range-progress"
+  },
+  "::-moz-range-thumb": {
+    "syntax": "::-moz-range-thumb",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Mozilla Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-moz-range-thumb"
+  },
+  "::-moz-range-track": {
+    "syntax": "::-moz-range-track",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Mozilla Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-moz-range-track"
+  },
+  "::-ms-browse": {
+    "syntax": "::-ms-browse",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Microsoft Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-browse"
+  },
+  "::-ms-check": {
+    "syntax": "::-ms-check",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Microsoft Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-check"
+  },
+  "::-ms-clear": {
+    "syntax": "::-ms-clear",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Microsoft Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-clear"
+  },
+  "::-ms-expand": {
+    "syntax": "::-ms-clear",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Microsoft Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-expand"
+  },
+  "::-ms-fill": {
+    "syntax": "::-ms-fill",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Microsoft Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-fill"
+  },
+  "::-ms-fill-lower": {
+    "syntax": "::-ms-fill-lower",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Microsoft Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-fill-lower"
+  },
+  "::-ms-fill-upper": {
+    "syntax": "::-ms-fill-upper",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Microsoft Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-fill-upper"
+  },
+  "::-ms-reveal": {
+    "syntax": "::-ms-reveal",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Microsoft Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-reveal"
+  },
+  "::-ms-thumb": {
+    "syntax": "::-ms-thumb",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Microsoft Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-thumb"
+  },
+  "::-ms-ticks-after": {
+    "syntax": "::-ms-ticks-after",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Microsoft Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-ticks-after"
+  },
+  "::-ms-ticks-before": {
+    "syntax": "::-ms-ticks-before",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Microsoft Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-ticks-before"
+  },
+  "::-ms-tooltip": {
+    "syntax": "::-ms-tooltip",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Microsoft Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-tooltip"
+  },
+  "::-ms-track": {
+    "syntax": "::-ms-track",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Microsoft Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-track"
+  },
+  "::-ms-value": {
+    "syntax": "::-ms-value",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "Microsoft Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-value"
+  },
+  "::-webkit-progress-bar": {
+    "syntax": "::-webkit-progress-bar",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "WebKit Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-progress-bar"
+  },
+  "::-webkit-progress-inner-value": {
+    "syntax": "::-webkit-progress-inner-value",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "WebKit Extensions"
+    ],
+    "status": "nonstandard"
+  },
+  "::-webkit-progress-value": {
+    "syntax": "::-webkit-progress-value",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "WebKit Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-progress-value"
+  },
+  "::-webkit-slider-runnable-track": {
+    "syntax": "::-webkit-slider-runnable-track",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "WebKit Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-slider-runnable-track"
+  },
+  "::-webkit-slider-thumb": {
+    "syntax": "::-webkit-slider-thumb",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors",
+      "WebKit Extensions"
+    ],
+    "status": "nonstandard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-slider-thumb"
+  },
+  "::after": {
+    "syntax": "/* CSS3 syntax */\n::after\n\n/* CSS2 syntax */\n:after",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::after"
+  },
+  "::backdrop": {
+    "syntax": "::backdrop",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::backdrop"
+  },
+  "::before": {
+    "syntax": "/* CSS3 syntax */\n::before\n\n/* CSS2 syntax */\n:before",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::before"
+  },
+  "::cue": {
+    "syntax": "::cue | ::cue( <selector> )",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::cue"
+  },
+  "::cue-region": {
+    "syntax": "::cue-region | ::cue-region( <selector> )",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::cue-region"
+  },
+  "::first-letter": {
+    "syntax": "/* CSS3 syntax */\n::first-letter\n\n/* CSS2 syntax */\n:first-letter",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::first-letter"
+  },
+  "::first-line": {
+    "syntax": "/* CSS3 syntax */\n::first-line\n\n/* CSS2 syntax */\n:first-line",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::first-line"
+  },
+  "::grammar-error": {
+    "syntax": "::grammar-error",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors"
+    ],
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::grammar-error"
+  },
+  "::marker": {
+    "syntax": "::marker",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::marker"
+  },
+  "::part": {
+    "syntax": "::part( <ident>+ )",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors"
+    ],
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::part"
+  },
+  "::placeholder": {
+    "syntax": "::placeholder",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::placeholder"
+  },
+  "::selection": {
+    "syntax": "::selection",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::selection"
+  },
+  "::slotted": {
+    "syntax": "::slotted( <compound-selector-list> )",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::slotted"
+  },
+  "::spelling-error": {
+    "syntax": "::spelling-error",
+    "groups": [
+      "Pseudo-elements",
+      "Selectors"
+    ],
+    "status": "experimental",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::spelling-error"
+  }
+}
diff --git a/node_modules/mdn-data/css/selectors.schema.json b/node_modules/mdn-data/css/selectors.schema.json
new file mode 100644
index 0000000..67978ce
--- /dev/null
+++ b/node_modules/mdn-data/css/selectors.schema.json
@@ -0,0 +1,36 @@
+{
+  "type": "object",
+  "additionalProperties": {
+    "type": "object",
+    "additionalProperties": false,
+    "properties": {
+      "syntax": {
+        "type": "string"
+      },
+      "groups": {
+        "type": "array",
+        "minitems": 1,
+        "uniqueItems": true,
+        "items": {
+          "$ref": "definitions.json#/groupList"
+        }
+      },
+      "status": {
+        "enum": [
+          "standard",
+          "nonstandard",
+          "experimental"
+        ]
+      },
+      "mdn_url": {
+        "type": "string",
+        "pattern": "^https://developer.mozilla.org/docs/Web/CSS/"
+      }
+    },
+    "required": [
+      "syntax",
+      "groups",
+      "status"
+    ]
+  }
+}
diff --git a/node_modules/mdn-data/css/syntaxes.json b/node_modules/mdn-data/css/syntaxes.json
new file mode 100644
index 0000000..3d13036
--- /dev/null
+++ b/node_modules/mdn-data/css/syntaxes.json
@@ -0,0 +1,761 @@
+{
+  "absolute-size": {
+    "syntax": "xx-small | x-small | small | medium | large | x-large | xx-large | xxx-large"
+  },
+  "alpha-value": {
+    "syntax": "<number> | <percentage>"
+  },
+  "angle-percentage": {
+    "syntax": "<angle> | <percentage>"
+  },
+  "angular-color-hint": {
+    "syntax": "<angle-percentage>"
+  },
+  "angular-color-stop": {
+    "syntax": "<color> && <color-stop-angle>?"
+  },
+  "angular-color-stop-list": {
+    "syntax": "[ <angular-color-stop> [, <angular-color-hint>]? ]# , <angular-color-stop>"
+  },
+  "animateable-feature": {
+    "syntax": "scroll-position | contents | <custom-ident>"
+  },
+  "attachment": {
+    "syntax": "scroll | fixed | local"
+  },
+  "attr()": {
+    "syntax": "attr( <attr-name> <type-or-unit>? [, <attr-fallback> ]? )"
+  },
+  "attr-matcher": {
+    "syntax": "[ '~' | '|' | '^' | '$' | '*' ]? '='"
+  },
+  "attr-modifier": {
+    "syntax": "i | s"
+  },
+  "attribute-selector": {
+    "syntax": "'[' <wq-name> ']' | '[' <wq-name> <attr-matcher> [ <string-token> | <ident-token> ] <attr-modifier>? ']'"
+  },
+  "auto-repeat": {
+    "syntax": "repeat( [ auto-fill | auto-fit ] , [ <line-names>? <fixed-size> ]+ <line-names>? )"
+  },
+  "auto-track-list": {
+    "syntax": "[ <line-names>? [ <fixed-size> | <fixed-repeat> ] ]* <line-names>? <auto-repeat>\n[ <line-names>? [ <fixed-size> | <fixed-repeat> ] ]* <line-names>?"
+  },
+  "baseline-position": {
+    "syntax": "[ first | last ]? baseline"
+  },
+  "basic-shape": {
+    "syntax": "<inset()> | <circle()> | <ellipse()> | <polygon()> | <path()>"
+  },
+  "bg-image": {
+    "syntax": "none | <image>"
+  },
+  "bg-layer": {
+    "syntax": "<bg-image> || <bg-position> [ / <bg-size> ]? || <repeat-style> || <attachment> || <box> || <box>"
+  },
+  "bg-position": {
+    "syntax": "[ [ left | center | right | top | bottom | <length-percentage> ] | [ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ] | [ center | [ left | right ] <length-percentage>? ] && [ center | [ top | bottom ] <length-percentage>? ] ]"
+  },
+  "bg-size": {
+    "syntax": "[ <length-percentage> | auto ]{1,2} | cover | contain"
+  },
+  "blur()": {
+    "syntax": "blur( <length> )"
+  },
+  "blend-mode": {
+    "syntax": "normal | multiply | screen | overlay | darken | lighten | color-dodge | color-burn | hard-light | soft-light | difference | exclusion | hue | saturation | color | luminosity"
+  },
+  "box": {
+    "syntax": "border-box | padding-box | content-box"
+  },
+  "brightness()": {
+    "syntax": "brightness( <number-percentage> )"
+  },
+  "calc()": {
+    "syntax": "calc( <calc-sum> )"
+  },
+  "calc-sum": {
+    "syntax": "<calc-product> [ [ '+' | '-' ] <calc-product> ]*"
+  },
+  "calc-product": {
+    "syntax": "<calc-value> [ '*' <calc-value> | '/' <number> ]*"
+  },
+  "calc-value": {
+    "syntax": "<number> | <dimension> | <percentage> | ( <calc-sum> )"
+  },
+  "cf-final-image": {
+    "syntax": "<image> | <color>"
+  },
+  "cf-mixing-image": {
+    "syntax": "<percentage>? && <image>"
+  },
+  "circle()": {
+    "syntax": "circle( [ <shape-radius> ]? [ at <position> ]? )"
+  },
+  "clamp()": {
+    "syntax": "clamp( <calc-sum>#{3} )"
+  },
+  "class-selector": {
+    "syntax": "'.' <ident-token>"
+  },
+  "clip-source": {
+    "syntax": "<url>"
+  },
+  "color": {
+    "syntax": "<rgb()> | <rgba()> | <hsl()> | <hsla()> | <hex-color> | <named-color> | currentcolor | <deprecated-system-color>"
+  },
+  "color-stop": {
+    "syntax": "<color-stop-length> | <color-stop-angle>"
+  },
+  "color-stop-angle": {
+    "syntax": "<angle-percentage>{1,2}"
+  },
+  "color-stop-length": {
+    "syntax": "<length-percentage>{1,2}"
+  },
+  "color-stop-list": {
+    "syntax": "[ <linear-color-stop> [, <linear-color-hint>]? ]# , <linear-color-stop>"
+  },
+  "combinator": {
+    "syntax": "'>' | '+' | '~' | [ '||' ]"
+  },
+  "common-lig-values": {
+    "syntax": "[ common-ligatures | no-common-ligatures ]"
+  },
+  "compat-auto": {
+    "syntax": "searchfield | textarea | push-button | slider-horizontal | checkbox | radio | square-button | menulist | listbox | meter | progress-bar | button"
+  },
+  "composite-style": {
+    "syntax": "clear | copy | source-over | source-in | source-out | source-atop | destination-over | destination-in | destination-out | destination-atop | xor"
+  },
+  "compositing-operator": {
+    "syntax": "add | subtract | intersect | exclude"
+  },
+  "compound-selector": {
+    "syntax": "[ <type-selector>? <subclass-selector>* [ <pseudo-element-selector> <pseudo-class-selector>* ]* ]!"
+  },
+  "compound-selector-list": {
+    "syntax": "<compound-selector>#"
+  },
+  "complex-selector": {
+    "syntax": "<compound-selector> [ <combinator>? <compound-selector> ]*"
+  },
+  "complex-selector-list": {
+    "syntax": "<complex-selector>#"
+  },
+  "conic-gradient()": {
+    "syntax": "conic-gradient( [ from <angle> ]? [ at <position> ]?, <angular-color-stop-list> )"
+  },
+  "contextual-alt-values": {
+    "syntax": "[ contextual | no-contextual ]"
+  },
+  "content-distribution": {
+    "syntax": "space-between | space-around | space-evenly | stretch"
+  },
+  "content-list": {
+    "syntax": "[ <string> | contents | <image> | <quote> | <target> | <leader()> ]+"
+  },
+  "content-position": {
+    "syntax": "center | start | end | flex-start | flex-end"
+  },
+  "content-replacement": {
+    "syntax": "<image>"
+  },
+  "contrast()": {
+    "syntax": "contrast( [ <number-percentage> ] )"
+  },
+  "counter()": {
+    "syntax": "counter( <custom-ident>, <counter-style>? )"
+  },
+  "counter-style": {
+    "syntax": "<counter-style-name> | symbols()"
+  },
+  "counter-style-name": {
+    "syntax": "<custom-ident>"
+  },
+  "counters()": {
+    "syntax": "counters( <custom-ident>, <string>, <counter-style>? )"
+  },
+  "cross-fade()": {
+    "syntax": "cross-fade( <cf-mixing-image> , <cf-final-image>? )"
+  },
+  "cubic-bezier-timing-function": {
+    "syntax": "ease | ease-in | ease-out | ease-in-out | cubic-bezier(<number [0,1]>, <number>, <number [0,1]>, <number>)"
+  },
+  "deprecated-system-color": {
+    "syntax": "ActiveBorder | ActiveCaption | AppWorkspace | Background | ButtonFace | ButtonHighlight | ButtonShadow | ButtonText | CaptionText | GrayText | Highlight | HighlightText | InactiveBorder | InactiveCaption | InactiveCaptionText | InfoBackground | InfoText | Menu | MenuText | Scrollbar | ThreeDDarkShadow | ThreeDFace | ThreeDHighlight | ThreeDLightShadow | ThreeDShadow | Window | WindowFrame | WindowText"
+  },
+  "discretionary-lig-values": {
+    "syntax": "[ discretionary-ligatures | no-discretionary-ligatures ]"
+  },
+  "display-box": {
+    "syntax": "contents | none"
+  },
+  "display-inside": {
+    "syntax": "flow | flow-root | table | flex | grid | ruby"
+  },
+  "display-internal": {
+    "syntax": "table-row-group | table-header-group | table-footer-group | table-row | table-cell | table-column-group | table-column | table-caption | ruby-base | ruby-text | ruby-base-container | ruby-text-container"
+  },
+  "display-legacy": {
+    "syntax": "inline-block | inline-list-item | inline-table | inline-flex | inline-grid"
+  },
+  "display-listitem": {
+    "syntax": "<display-outside>? && [ flow | flow-root ]? && list-item"
+  },
+  "display-outside": {
+    "syntax": "block | inline | run-in"
+  },
+  "drop-shadow()": {
+    "syntax": "drop-shadow( <length>{2,3} <color>? )"
+  },
+  "east-asian-variant-values": {
+    "syntax": "[ jis78 | jis83 | jis90 | jis04 | simplified | traditional ]"
+  },
+  "east-asian-width-values": {
+    "syntax": "[ full-width | proportional-width ]"
+  },
+  "element()": {
+    "syntax": "element( <id-selector> )"
+  },
+  "ellipse()": {
+    "syntax": "ellipse( [ <shape-radius>{2} ]? [ at <position> ]? )"
+  },
+  "ending-shape": {
+    "syntax": "circle | ellipse"
+  },
+  "env()": {
+    "syntax": "env( <custom-ident> , <declaration-value>? )"
+  },
+  "explicit-track-list": {
+    "syntax": "[ <line-names>? <track-size> ]+ <line-names>?"
+  },
+  "family-name": {
+    "syntax": "<string> | <custom-ident>+"
+  },
+  "feature-tag-value": {
+    "syntax": "<string> [ <integer> | on | off ]?"
+  },
+  "feature-type": {
+    "syntax": "@stylistic | @historical-forms | @styleset | @character-variant | @swash | @ornaments | @annotation"
+  },
+  "feature-value-block": {
+    "syntax": "<feature-type> '{' <feature-value-declaration-list> '}'"
+  },
+  "feature-value-block-list": {
+    "syntax": "<feature-value-block>+"
+  },
+  "feature-value-declaration": {
+    "syntax": "<custom-ident>: <integer>+;"
+  },
+  "feature-value-declaration-list": {
+    "syntax": "<feature-value-declaration>"
+  },
+  "feature-value-name": {
+    "syntax": "<custom-ident>"
+  },
+  "fill-rule": {
+    "syntax": "nonzero | evenodd"
+  },
+  "filter-function": {
+    "syntax": "<blur()> | <brightness()> | <contrast()> | <drop-shadow()> | <grayscale()> | <hue-rotate()> | <invert()> | <opacity()> | <saturate()> | <sepia()>"
+  },
+  "filter-function-list": {
+    "syntax": "[ <filter-function> | <url> ]+"
+  },
+  "final-bg-layer": {
+    "syntax": "<'background-color'> || <bg-image> || <bg-position> [ / <bg-size> ]? || <repeat-style> || <attachment> || <box> || <box>"
+  },
+  "fit-content()": {
+    "syntax": "fit-content( [ <length> | <percentage> ] )"
+  },
+  "fixed-breadth": {
+    "syntax": "<length-percentage>"
+  },
+  "fixed-repeat": {
+    "syntax": "repeat( [ <positive-integer> ] , [ <line-names>? <fixed-size> ]+ <line-names>? )"
+  },
+  "fixed-size": {
+    "syntax": "<fixed-breadth> | minmax( <fixed-breadth> , <track-breadth> ) | minmax( <inflexible-breadth> , <fixed-breadth> )"
+  },
+  "font-stretch-absolute": {
+    "syntax": "normal | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded | <percentage>"
+  },
+  "font-variant-css21": {
+    "syntax": "[ normal | small-caps ]"
+  },
+  "font-weight-absolute": {
+    "syntax": "normal | bold | <number [1,1000]>"
+  },
+  "frequency-percentage": {
+    "syntax": "<frequency> | <percentage>"
+  },
+  "general-enclosed": {
+    "syntax": "[ <function-token> <any-value> ) ] | ( <ident> <any-value> )"
+  },
+  "generic-family": {
+    "syntax": "serif | sans-serif | cursive | fantasy | monospace"
+  },
+  "generic-name": {
+    "syntax": "serif | sans-serif | cursive | fantasy | monospace"
+  },
+  "geometry-box": {
+    "syntax": "<shape-box> | fill-box | stroke-box | view-box"
+  },
+  "gradient": {
+    "syntax": "<linear-gradient()> | <repeating-linear-gradient()> | <radial-gradient()> | <repeating-radial-gradient()> | <conic-gradient()>"
+  },
+  "grayscale()": {
+    "syntax": "grayscale( <number-percentage> )"
+  },
+  "grid-line": {
+    "syntax": "auto | <custom-ident> | [ <integer> && <custom-ident>? ] | [ span && [ <integer> || <custom-ident> ] ]"
+  },
+  "historical-lig-values": {
+    "syntax": "[ historical-ligatures | no-historical-ligatures ]"
+  },
+  "hsl()": {
+    "syntax": "hsl( <hue> <percentage> <percentage> [ / <alpha-value> ]? ) | hsl( <hue>, <percentage>, <percentage>, <alpha-value>? )"
+  },
+  "hsla()": {
+    "syntax": "hsla( <hue> <percentage> <percentage> [ / <alpha-value> ]? ) | hsla( <hue>, <percentage>, <percentage>, <alpha-value>? )"
+  },
+  "hue": {
+    "syntax": "<number> | <angle>"
+  },
+  "hue-rotate()": {
+    "syntax": "hue-rotate( <angle> )"
+  },
+  "id-selector": {
+    "syntax": "<hash-token>"
+  },
+  "image": {
+    "syntax": "<url> | <image()> | <image-set()> | <element()> | <paint()> | <cross-fade()> | <gradient>"
+  },
+  "image()": {
+    "syntax": "image( <image-tags>? [ <image-src>? , <color>? ]! )"
+  },
+  "image-set()": {
+    "syntax": "image-set( <image-set-option># )"
+  },
+  "image-set-option": {
+    "syntax": "[ <image> | <string> ] <resolution>"
+  },
+  "image-src": {
+    "syntax": "<url> | <string>"
+  },
+  "image-tags": {
+    "syntax": "ltr | rtl"
+  },
+  "inflexible-breadth": {
+    "syntax": "<length> | <percentage> | min-content | max-content | auto"
+  },
+  "inset()": {
+    "syntax": "inset( <length-percentage>{1,4} [ round <'border-radius'> ]? )"
+  },
+  "invert()": {
+    "syntax": "invert( <number-percentage> )"
+  },
+  "keyframes-name": {
+    "syntax": "<custom-ident> | <string>"
+  },
+  "keyframe-block": {
+    "syntax": "<keyframe-selector># {\n  <declaration-list>\n}"
+  },
+  "keyframe-block-list": {
+    "syntax": "<keyframe-block>+"
+  },
+  "keyframe-selector": {
+    "syntax": "from | to | <percentage>"
+  },
+  "leader()": {
+    "syntax": "leader( <leader-type> )"
+  },
+  "leader-type": {
+    "syntax": "dotted | solid | space | <string>"
+  },
+  "length-percentage": {
+    "syntax": "<length> | <percentage>"
+  },
+  "line-names": {
+    "syntax": "'[' <custom-ident>* ']'"
+  },
+  "line-name-list": {
+    "syntax": "[ <line-names> | <name-repeat> ]+"
+  },
+  "line-style": {
+    "syntax": "none | hidden | dotted | dashed | solid | double | groove | ridge | inset | outset"
+  },
+  "line-width": {
+    "syntax": "<length> | thin | medium | thick"
+  },
+  "linear-color-hint": {
+    "syntax": "<length-percentage>"
+  },
+  "linear-color-stop": {
+    "syntax": "<color> <color-stop-length>?"
+  },
+  "linear-gradient()": {
+    "syntax": "linear-gradient( [ <angle> | to <side-or-corner> ]? , <color-stop-list> )"
+  },
+  "mask-layer": {
+    "syntax": "<mask-reference> || <position> [ / <bg-size> ]? || <repeat-style> || <geometry-box> || [ <geometry-box> | no-clip ] || <compositing-operator> || <masking-mode>"
+  },
+  "mask-position": {
+    "syntax": "[ <length-percentage> | left | center | right ] [ <length-percentage> | top | center | bottom ]?"
+  },
+  "mask-reference": {
+    "syntax": "none | <image> | <mask-source>"
+  },
+  "mask-source": {
+    "syntax": "<url>"
+  },
+  "masking-mode": {
+    "syntax": "alpha | luminance | match-source"
+  },
+  "matrix()": {
+    "syntax": "matrix( <number>#{6} )"
+  },
+  "matrix3d()": {
+    "syntax": "matrix3d( <number>#{16} )"
+  },
+  "max()": {
+    "syntax": "max( <calc-sum># )"
+  },
+  "media-and": {
+    "syntax": "<media-in-parens> [ and <media-in-parens> ]+"
+  },
+  "media-condition": {
+    "syntax": "<media-not> | <media-and> | <media-or> | <media-in-parens>"
+  },
+  "media-condition-without-or": {
+    "syntax": "<media-not> | <media-and> | <media-in-parens>"
+  },
+  "media-feature": {
+    "syntax": "( [ <mf-plain> | <mf-boolean> | <mf-range> ] )"
+  },
+  "media-in-parens": {
+    "syntax": "( <media-condition> ) | <media-feature> | <general-enclosed>"
+  },
+  "media-not": {
+    "syntax": "not <media-in-parens>"
+  },
+  "media-or": {
+    "syntax": "<media-in-parens> [ or <media-in-parens> ]+"
+  },
+  "media-query": {
+    "syntax": "<media-condition> | [ not | only ]? <media-type> [ and <media-condition-without-or> ]?"
+  },
+  "media-query-list": {
+    "syntax": "<media-query>#"
+  },
+  "media-type": {
+    "syntax": "<ident>"
+  },
+  "mf-boolean": {
+    "syntax": "<mf-name>"
+  },
+  "mf-name": {
+    "syntax": "<ident>"
+  },
+  "mf-plain": {
+    "syntax": "<mf-name> : <mf-value>"
+  },
+  "mf-range": {
+    "syntax": "<mf-name> [ '<' | '>' ]? '='? <mf-value>\n| <mf-value> [ '<' | '>' ]? '='? <mf-name>\n| <mf-value> '<' '='? <mf-name> '<' '='? <mf-value>\n| <mf-value> '>' '='? <mf-name> '>' '='? <mf-value>"
+  },
+  "mf-value": {
+    "syntax": "<number> | <dimension> | <ident> | <ratio>"
+  },
+  "min()": {
+    "syntax": "min( <calc-sum># )"
+  },
+  "minmax()": {
+    "syntax": "minmax( [ <length> | <percentage> | min-content | max-content | auto ] , [ <length> | <percentage> | <flex> | min-content | max-content | auto ] )"
+  },
+  "named-color": {
+    "syntax": "transparent | aliceblue | antiquewhite | aqua | aquamarine | azure | beige | bisque | black | blanchedalmond | blue | blueviolet | brown | burlywood | cadetblue | chartreuse | chocolate | coral | cornflowerblue | cornsilk | crimson | cyan | darkblue | darkcyan | darkgoldenrod | darkgray | darkgreen | darkgrey | darkkhaki | darkmagenta | darkolivegreen | darkorange | darkorchid | darkred | darksalmon | darkseagreen | darkslateblue | darkslategray | darkslategrey | darkturquoise | darkviolet | deeppink | deepskyblue | dimgray | dimgrey | dodgerblue | firebrick | floralwhite | forestgreen | fuchsia | gainsboro | ghostwhite | gold | goldenrod | gray | green | greenyellow | grey | honeydew | hotpink | indianred | indigo | ivory | khaki | lavender | lavenderblush | lawngreen | lemonchiffon | lightblue | lightcoral | lightcyan | lightgoldenrodyellow | lightgray | lightgreen | lightgrey | lightpink | lightsalmon | lightseagreen | lightskyblue | lightslategray | lightslategrey | lightsteelblue | lightyellow | lime | limegreen | linen | magenta | maroon | mediumaquamarine | mediumblue | mediumorchid | mediumpurple | mediumseagreen | mediumslateblue | mediumspringgreen | mediumturquoise | mediumvioletred | midnightblue | mintcream | mistyrose | moccasin | navajowhite | navy | oldlace | olive | olivedrab | orange | orangered | orchid | palegoldenrod | palegreen | paleturquoise | palevioletred | papayawhip | peachpuff | peru | pink | plum | powderblue | purple | rebeccapurple | red | rosybrown | royalblue | saddlebrown | salmon | sandybrown | seagreen | seashell | sienna | silver | skyblue | slateblue | slategray | slategrey | snow | springgreen | steelblue | tan | teal | thistle | tomato | turquoise | violet | wheat | white | whitesmoke | yellow | yellowgreen"
+  },
+  "namespace-prefix": {
+    "syntax": "<ident>"
+  },
+  "ns-prefix": {
+    "syntax": "[ <ident-token> | '*' ]? '|'"
+  },
+  "number-percentage": {
+    "syntax": "<number> | <percentage>"
+  },
+  "numeric-figure-values": {
+    "syntax": "[ lining-nums | oldstyle-nums ]"
+  },
+  "numeric-fraction-values": {
+    "syntax": "[ diagonal-fractions | stacked-fractions ]"
+  },
+  "numeric-spacing-values": {
+    "syntax": "[ proportional-nums | tabular-nums ]"
+  },
+  "nth": {
+    "syntax": "<an-plus-b> | even | odd"
+  },
+  "opacity()": {
+    "syntax": "opacity( [ <number-percentage> ] )"
+  },
+  "overflow-position": {
+    "syntax": "unsafe | safe"
+  },
+  "outline-radius": {
+    "syntax": "<length> | <percentage>"
+  },
+  "page-body": {
+    "syntax": "<declaration>? [ ; <page-body> ]? | <page-margin-box> <page-body>"
+  },
+  "page-margin-box": {
+    "syntax": "<page-margin-box-type> '{' <declaration-list> '}'"
+  },
+  "page-margin-box-type": {
+    "syntax": "@top-left-corner | @top-left | @top-center | @top-right | @top-right-corner | @bottom-left-corner | @bottom-left | @bottom-center | @bottom-right | @bottom-right-corner | @left-top | @left-middle | @left-bottom | @right-top | @right-middle | @right-bottom"
+  },
+  "page-selector-list": {
+    "syntax": "[ <page-selector># ]?"
+  },
+  "page-selector": {
+    "syntax": "<pseudo-page>+ | <ident> <pseudo-page>*"
+  },
+  "path()": {
+    "syntax": "path( [ <fill-rule>, ]? <string> )"
+  },
+  "paint()": {
+    "syntax": "paint( <ident>, <declaration-value>? )"
+  },
+  "perspective()": {
+    "syntax": "perspective( <length> )"
+  },
+  "polygon()": {
+    "syntax": "polygon( <fill-rule>? , [ <length-percentage> <length-percentage> ]# )"
+  },
+  "position": {
+    "syntax": "[ [ left | center | right ] || [ top | center | bottom ] | [ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ]? | [ [ left | right ] <length-percentage> ] && [ [ top | bottom ] <length-percentage> ] ]"
+  },
+  "pseudo-class-selector": {
+    "syntax": "':' <ident-token> | ':' <function-token> <any-value> ')'"
+  },
+  "pseudo-element-selector": {
+    "syntax": "':' <pseudo-class-selector>"
+  },
+  "pseudo-page": {
+    "syntax": ": [ left | right | first | blank ]"
+  },
+  "quote": {
+    "syntax": "open-quote | close-quote | no-open-quote | no-close-quote"
+  },
+  "radial-gradient()": {
+    "syntax": "radial-gradient( [ <ending-shape> || <size> ]? [ at <position> ]? , <color-stop-list> )"
+  },
+  "relative-selector": {
+    "syntax": "<combinator>? <complex-selector>"
+  },
+  "relative-selector-list": {
+    "syntax": "<relative-selector>#"
+  },
+  "relative-size": {
+    "syntax": "larger | smaller"
+  },
+  "repeat-style": {
+    "syntax": "repeat-x | repeat-y | [ repeat | space | round | no-repeat ]{1,2}"
+  },
+  "repeating-linear-gradient()": {
+    "syntax": "repeating-linear-gradient( [ <angle> | to <side-or-corner> ]? , <color-stop-list> )"
+  },
+  "repeating-radial-gradient()": {
+    "syntax": "repeating-radial-gradient( [ <ending-shape> || <size> ]? [ at <position> ]? , <color-stop-list> )"
+  },
+  "rgb()": {
+    "syntax": "rgb( <percentage>{3} [ / <alpha-value> ]? ) | rgb( <number>{3} [ / <alpha-value> ]? ) | rgb( <percentage>#{3} , <alpha-value>? ) | rgb( <number>#{3} , <alpha-value>? )"
+  },
+  "rgba()": {
+    "syntax": "rgba( <percentage>{3} [ / <alpha-value> ]? ) | rgba( <number>{3} [ / <alpha-value> ]? ) | rgba( <percentage>#{3} , <alpha-value>? ) | rgba( <number>#{3} , <alpha-value>? )"
+  },
+  "rotate()": {
+    "syntax": "rotate( [ <angle> | <zero> ] )"
+  },
+  "rotate3d()": {
+    "syntax": "rotate3d( <number> , <number> , <number> , [ <angle> | <zero> ] )"
+  },
+  "rotateX()": {
+    "syntax": "rotateX( [ <angle> | <zero> ] )"
+  },
+  "rotateY()": {
+    "syntax": "rotateY( [ <angle> | <zero> ] )"
+  },
+  "rotateZ()": {
+    "syntax": "rotateZ( [ <angle> | <zero> ] )"
+  },
+  "saturate()": {
+    "syntax": "saturate( <number-percentage> )"
+  },
+  "scale()": {
+    "syntax": "scale( <number> , <number>? )"
+  },
+  "scale3d()": {
+    "syntax": "scale3d( <number> , <number> , <number> )"
+  },
+  "scaleX()": {
+    "syntax": "scaleX( <number> )"
+  },
+  "scaleY()": {
+    "syntax": "scaleY( <number> )"
+  },
+  "scaleZ()": {
+    "syntax": "scaleZ( <number> )"
+  },
+  "self-position": {
+    "syntax": "center | start | end | self-start | self-end | flex-start | flex-end"
+  },
+  "shape-radius": {
+    "syntax": "<length-percentage> | closest-side | farthest-side"
+  },
+  "skew()": {
+    "syntax": "skew( [ <angle> | <zero> ] , [ <angle> | <zero> ]? )"
+  },
+  "skewX()": {
+    "syntax": "skewX( [ <angle> | <zero> ] )"
+  },
+  "skewY()": {
+    "syntax": "skewY( [ <angle> | <zero> ] )"
+  },
+  "sepia()": {
+    "syntax": "sepia( <number-percentage> )"
+  },
+  "shadow": {
+    "syntax": "inset? && <length>{2,4} && <color>?"
+  },
+  "shadow-t": {
+    "syntax": "[ <length>{2,3} && <color>? ]"
+  },
+  "shape": {
+    "syntax": "rect(<top>, <right>, <bottom>, <left>)"
+  },
+  "shape-box": {
+    "syntax": "<box> | margin-box"
+  },
+  "side-or-corner": {
+    "syntax": "[ left | right ] || [ top | bottom ]"
+  },
+  "single-animation": {
+    "syntax": "<time> || <timing-function> || <time> || <single-animation-iteration-count> || <single-animation-direction> || <single-animation-fill-mode> || <single-animation-play-state> || [ none | <keyframes-name> ]"
+  },
+  "single-animation-direction": {
+    "syntax": "normal | reverse | alternate | alternate-reverse"
+  },
+  "single-animation-fill-mode": {
+    "syntax": "none | forwards | backwards | both"
+  },
+  "single-animation-iteration-count": {
+    "syntax": "infinite | <number>"
+  },
+  "single-animation-play-state": {
+    "syntax": "running | paused"
+  },
+  "single-transition": {
+    "syntax": "[ none | <single-transition-property> ] || <time> || <timing-function> || <time>"
+  },
+  "single-transition-property": {
+    "syntax": "all | <custom-ident>"
+  },
+  "size": {
+    "syntax": "closest-side | farthest-side | closest-corner | farthest-corner | <length> | <length-percentage>{2}"
+  },
+  "step-position": {
+    "syntax": "jump-start | jump-end | jump-none | jump-both | start | end"
+  },
+  "step-timing-function": {
+    "syntax": "step-start | step-end | steps(<integer>[, <step-position>]?)"
+  },
+  "subclass-selector": {
+    "syntax": "<id-selector> | <class-selector> | <attribute-selector> | <pseudo-class-selector>"
+  },
+  "supports-condition": {
+    "syntax": "not <supports-in-parens> | <supports-in-parens> [ and <supports-in-parens> ]* | <supports-in-parens> [ or <supports-in-parens> ]*"
+  },
+  "supports-in-parens": {
+    "syntax": "( <supports-condition> ) | <supports-feature> | <general-enclosed>"
+  },
+  "supports-feature": {
+    "syntax": "<supports-decl> | <supports-selector-fn>"
+  },
+  "supports-decl": {
+    "syntax": "( <declaration> )"
+  },
+  "supports-selector-fn": {
+    "syntax": "selector( <complex-selector> )"
+  },
+  "symbol": {
+    "syntax": "<string> | <image> | <custom-ident>"
+  },
+  "target": {
+    "syntax": "<target-counter()> | <target-counters()> | <target-text()>"
+  },
+  "target-counter()": {
+    "syntax": "target-counter( [ <string> | <url> ] , <custom-ident> , <counter-style>? )"
+  },
+  "target-counters()": {
+    "syntax": "target-counters( [ <string> | <url> ] , <custom-ident> , <string> , <counter-style>? )"
+  },
+  "target-text()": {
+    "syntax": "target-text( [ <string> | <url> ] , [ content | before | after | first-letter ]? )"
+  },
+  "time-percentage": {
+    "syntax": "<time> | <percentage>"
+  },
+  "timing-function": {
+    "syntax": "linear | <cubic-bezier-timing-function> | <step-timing-function>"
+  },
+  "track-breadth": {
+    "syntax": "<length-percentage> | <flex> | min-content | max-content | auto"
+  },
+  "track-list": {
+    "syntax": "[ <line-names>? [ <track-size> | <track-repeat> ] ]+ <line-names>?"
+  },
+  "track-repeat": {
+    "syntax": "repeat( [ <positive-integer> ] , [ <line-names>? <track-size> ]+ <line-names>? )"
+  },
+  "track-size": {
+    "syntax": "<track-breadth> | minmax( <inflexible-breadth> , <track-breadth> ) | fit-content( [ <length> | <percentage> ] )"
+  },
+  "transform-function": {
+    "syntax": "<matrix()> | <translate()> | <translateX()> | <translateY()> | <scale()> | <scaleX()> | <scaleY()> | <rotate()> | <skew()> | <skewX()> | <skewY()> | <matrix3d()> | <translate3d()> | <translateZ()> | <scale3d()> | <scaleZ()> | <rotate3d()> | <rotateX()> | <rotateY()> | <rotateZ()> | <perspective()>"
+  },
+  "transform-list": {
+    "syntax": "<transform-function>+"
+  },
+  "translate()": {
+    "syntax": "translate( <length-percentage> , <length-percentage>? )"
+  },
+  "translate3d()": {
+    "syntax": "translate3d( <length-percentage> , <length-percentage> , <length> )"
+  },
+  "translateX()": {
+    "syntax": "translateX( <length-percentage> )"
+  },
+  "translateY()": {
+    "syntax": "translateY( <length-percentage> )"
+  },
+  "translateZ()": {
+    "syntax": "translateZ( <length> )"
+  },
+  "type-or-unit": {
+    "syntax": "string | color | url | integer | number | length | angle | time | frequency | cap | ch | em | ex | ic | lh | rlh | rem | vb | vi | vw | vh | vmin | vmax | mm | Q | cm | in | pt | pc | px | deg | grad | rad | turn | ms | s | Hz | kHz | %"
+  },
+  "type-selector": {
+    "syntax": "<wq-name> | <ns-prefix>? '*'"
+  },
+  "var()": {
+    "syntax": "var( <custom-property-name> , <declaration-value>? )"
+  },
+  "viewport-length": {
+    "syntax": "auto | <length-percentage>"
+  },
+  "wq-name": {
+    "syntax": "<ns-prefix>? <ident-token>"
+  }
+}
diff --git a/node_modules/mdn-data/css/syntaxes.schema.json b/node_modules/mdn-data/css/syntaxes.schema.json
new file mode 100644
index 0000000..45632c4
--- /dev/null
+++ b/node_modules/mdn-data/css/syntaxes.schema.json
@@ -0,0 +1,15 @@
+{
+  "type": "object",
+  "additionalProperties": {
+    "type": "object",
+    "additionalProperties": false,
+    "required": [
+      "syntax"
+    ],
+    "properties": {
+      "syntax": {
+        "type": "string"
+      }
+    }
+  }
+}
diff --git a/node_modules/mdn-data/css/types.json b/node_modules/mdn-data/css/types.json
new file mode 100644
index 0000000..944e371
--- /dev/null
+++ b/node_modules/mdn-data/css/types.json
@@ -0,0 +1,265 @@
+{
+  "an-plus-b": {
+    "groups": [
+      "Selectors"
+    ],
+    "status": "standard"
+  },
+  "angle": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/angle"
+  },
+  "angle-percentage": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/angle-percentage"
+  },
+  "basic-shape": {
+    "groups": [
+      "CSS Shapes",
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/basic-shape"
+  },
+  "blend-mode": {
+    "groups": [
+      "Compositing and Blending",
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/blend-mode"
+  },
+  "color": {
+    "groups": [
+      "CSS Color",
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/color_value"
+  },
+  "custom-ident": {
+    "groups": [
+      "CSS Will Change",
+      "CSS Counter Styles",
+      "CSS Lists and Counters",
+      "CSS Animations",
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/custom-ident"
+  },
+  "dimension": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/dimension"
+  },
+  "display-outside": {
+    "groups": [
+      "CSS Display"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/display-outside"
+  },
+  "display-inside": {
+    "groups": [
+      "CSS Display"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/display-inside"
+  },
+  "display-listitem": {
+    "groups": [
+      "CSS Display"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/display-listitem"
+  },
+  "display-internal": {
+    "groups": [
+      "CSS Display"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/display-internal"
+  },
+  "display-box": {
+    "groups": [
+      "CSS Display"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/display-box"
+  },
+  "display-legacy": {
+    "groups": [
+      "CSS Display"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/display-legacy"
+  },
+  "filter-function": {
+    "groups": [
+      "Filter Effects"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/filter-function"
+  },
+  "flex": {
+    "groups": [
+      "CSS Grid Layout",
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/flex_value"
+  },
+  "frequency": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/frequency"
+  },
+  "frequency-percentage": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/frequency-percentage"
+  },
+  "gradient": {
+    "groups": [
+      "CSS Images",
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/gradient"
+  },
+  "ident": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard"
+  },
+  "image": {
+    "groups": [
+      "CSS Images",
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/image"
+  },
+  "integer": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/integer"
+  },
+  "length": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/length"
+  },
+  "length-percentage": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/length-percentage"
+  },
+  "number": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/number"
+  },
+  "percentage": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/percentage"
+  },
+  "position": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/position_value"
+  },
+  "ratio": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/ratio"
+  },
+  "resolution": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/resolution"
+  },
+  "shape": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/shape"
+  },
+  "string": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/string"
+  },
+  "time": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/time"
+  },
+  "time-percentage": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/time-percentage"
+  },
+  "timing-function": {
+    "groups": [
+      "CSS Animations",
+      "CSS Transitions",
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/timing-function"
+  },
+  "transform-function": {
+    "groups": [
+      "CSS Transforms",
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transform-function"
+  },
+  "url": {
+    "groups": [
+      "CSS Types"
+    ],
+    "status": "standard",
+    "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/url"
+  }
+}
diff --git a/node_modules/mdn-data/css/types.schema.json b/node_modules/mdn-data/css/types.schema.json
new file mode 100644
index 0000000..2200773
--- /dev/null
+++ b/node_modules/mdn-data/css/types.schema.json
@@ -0,0 +1,32 @@
+{
+  "type": "object",
+  "additionalProperties": {
+    "type": "object",
+    "additionalProperties": false,
+    "properties": {
+      "groups": {
+        "type": "array",
+        "minitems": 1,
+        "uniqueItems": true,
+        "items": {
+          "$ref": "definitions.json#/groupList"
+        }
+      },
+      "status": {
+        "enum": [
+          "standard",
+          "nonstandard",
+          "experimental"
+        ]
+      },
+      "mdn_url": {
+        "type": "string",
+        "pattern": "^https://developer.mozilla.org/docs/Web/CSS/"
+      }
+    },
+    "required": [
+      "groups",
+      "status"
+    ]
+  }
+}
diff --git a/node_modules/mdn-data/css/units.json b/node_modules/mdn-data/css/units.json
new file mode 100644
index 0000000..3cf8062
--- /dev/null
+++ b/node_modules/mdn-data/css/units.json
@@ -0,0 +1,199 @@
+{
+  "ch": {
+    "groups": [
+      "CSS Units",
+      "CSS Lengths"
+    ],
+    "status": "standard"
+  },
+  "cm": {
+    "groups": [
+      "CSS Units",
+      "CSS Lengths"
+    ],
+    "status": "standard"
+  },
+  "deg": {
+    "groups": [
+      "CSS Units",
+      "CSS Angles"
+    ],
+    "status": "standard"
+  },
+  "dpcm": {
+    "groups": [
+      "CSS Units",
+      "CSS Resolutions"
+    ],
+    "status": "standard"
+  },
+  "dpi": {
+    "groups": [
+      "CSS Units",
+      "CSS Resolutions"
+    ],
+    "status": "standard"
+  },
+  "dppx": {
+    "groups": [
+      "CSS Units",
+      "CSS Resolutions"
+    ],
+    "status": "standard"
+  },
+  "em": {
+    "groups": [
+      "CSS Units",
+      "CSS Lengths"
+    ],
+    "status": "standard"
+  },
+  "ex": {
+    "groups": [
+      "CSS Units",
+      "CSS Lengths"
+    ],
+    "status": "standard"
+  },
+  "fr": {
+    "groups": [
+      "CSS Units",
+      "CSS Flexible Lengths",
+      "CSS Grid Layout"
+    ],
+    "status": "standard"
+  },
+  "grad": {
+    "groups": [
+      "CSS Units",
+      "CSS Angles"
+    ],
+    "status": "standard"
+  },
+  "Hz": {
+    "groups": [
+      "CSS Units",
+      "CSS Frequencies"
+    ],
+    "status": "standard"
+  },
+  "in": {
+    "groups": [
+      "CSS Units",
+      "CSS Lengths"
+    ],
+    "status": "standard"
+  },
+  "kHz": {
+    "groups": [
+      "CSS Units",
+      "CSS Frequencies"
+    ],
+    "status": "standard"
+  },
+  "mm": {
+    "groups": [
+      "CSS Units",
+      "CSS Lengths"
+    ],
+    "status": "standard"
+  },
+  "ms": {
+    "groups": [
+      "CSS Units",
+      "CSS Times"
+    ],
+    "status": "standard"
+  },
+  "pc": {
+    "groups": [
+      "CSS Units",
+      "CSS Lengths"
+    ],
+    "status": "standard"
+  },
+  "pt": {
+    "groups": [
+      "CSS Units",
+      "CSS Lengths"
+    ],
+    "status": "standard"
+  },
+  "px": {
+    "groups": [
+      "CSS Units",
+      "CSS Lengths"
+    ],
+    "status": "standard"
+  },
+  "Q": {
+    "groups": [
+      "CSS Units",
+      "CSS Lengths"
+    ],
+    "status": "standard"
+  },
+  "rad": {
+    "groups": [
+      "CSS Units",
+      "CSS Angles"
+    ],
+    "status": "standard"
+  },
+  "rem": {
+    "groups": [
+      "CSS Units",
+      "CSS Lengths"
+    ],
+    "status": "standard"
+  },
+  "s": {
+    "groups": [
+      "CSS Units",
+      "CSS Times"
+    ],
+    "status": "standard"
+  },
+  "turn": {
+    "groups": [
+      "CSS Units",
+      "CSS Angles"
+    ],
+    "status": "standard"
+  },
+  "vh": {
+    "groups": [
+      "CSS Units",
+      "CSS Lengths"
+    ],
+    "status": "standard"
+  },
+  "vmax": {
+    "groups": [
+      "CSS Units",
+      "CSS Lengths"
+    ],
+    "status": "standard"
+  },
+  "vmin": {
+    "groups": [
+      "CSS Units",
+      "CSS Lengths"
+    ],
+    "status": "standard"
+  },
+  "vw": {
+    "groups": [
+      "CSS Units",
+      "CSS Lengths"
+    ],
+    "status": "standard"
+  },
+  "x": {
+    "groups": [
+      "CSS Units",
+      "CSS Resolutions"
+    ],
+    "status": "standard"
+  }
+}
diff --git a/node_modules/mdn-data/css/units.schema.json b/node_modules/mdn-data/css/units.schema.json
new file mode 100644
index 0000000..b60b461
--- /dev/null
+++ b/node_modules/mdn-data/css/units.schema.json
@@ -0,0 +1,28 @@
+{
+  "type": "object",
+  "additionalProperties": {
+    "type": "object",
+    "additionalProperties": false,
+    "properties": {
+      "groups": {
+        "type": "array",
+        "minitems": 1,
+        "uniqueItems": true,
+        "items": {
+          "$ref": "definitions.json#/groupList"
+        }
+      },
+      "status": {
+        "enum": [
+          "standard",
+          "nonstandard",
+          "experimental"
+        ]
+      }
+    },
+    "required": [
+      "groups",
+      "status"
+    ]
+  }
+}
diff --git a/node_modules/mdn-data/index.js b/node_modules/mdn-data/index.js
new file mode 100644
index 0000000..3b0f09f
--- /dev/null
+++ b/node_modules/mdn-data/index.js
@@ -0,0 +1,5 @@
+module.exports = {
+  api: require('./api'),
+  css: require('./css'),
+  l10n: require('./l10n'),
+}
diff --git a/node_modules/mdn-data/l10n/css.json b/node_modules/mdn-data/l10n/css.json
new file mode 100644
index 0000000..7518dd0
--- /dev/null
+++ b/node_modules/mdn-data/l10n/css.json
@@ -0,0 +1,1567 @@
+{
+  "absoluteLength": {
+    "de": "absolute {{cssxref(\"length\")}}",
+    "en-US": "absolute {{cssxref(\"length\")}}",
+    "fr": "une longueur (type {{cssxref(\"length\")}}) absolue",
+    "ja": "絶対的な{{cssxref(\"length\", \"長さ\")}}",
+    "ru": "абсолютная {{cssxref(\"length\")}}"
+  },
+  "absoluteLength0ForNone": {
+    "de": "eine absolute Länge; falls das Schlüsselwort <code>none</code> angegeben wurde, ist der berechnete Wert <code>0</code>",
+    "en-US": "an absolute length; if the keyword <code>none</code> is specified, the computed value is <code>0</code>",
+    "fr": "une longueur absolue ; si le mot-clé <code>none</code> est spécifié, la valeur calculée sera <code>0</code>",
+    "ja": "絶対的な長さ、キーワード <code>none</code> が指定されると計算値は <code>0</code> になる",
+    "ru": "абсолютная длина; если указано ключевое слово <code>none</code>, вычисленное значение - <code>0</code>"
+  },
+  "absoluteLength0IfColumnRuleStyleNoneOrHidden": {
+    "de": "die absolute Länge; <code>0</code> falls {{cssxref(\"column-rule-style\")}} <code>none</code> oder <code>hidden</code> ist",
+    "en-US": "the absolute length; <code>0</code> if the {{cssxref(\"column-rule-style\")}} is <code>none</code> or <code>hidden</code>",
+    "fr": "une longueur absolue ou <code>0</code> si {{cssxref(\"column-rule-style\")}} vaut <code>none</code> ou <code>hidden</code>",
+    "ja": "絶対的な長さ、列の罫線のスタイルが <code>none</code> か <code>hidden</code> なら <code>0</code>",
+    "ru": "абсолютная длина; <code>0</code>, если {{cssxref(\"column-rule-style\")}} - <code>none</code> или <code>hidden</code>"
+  },
+  "absoluteLengthOr0IfBorderBottomStyleNoneOrHidden": {
+    "de": "die absolute Länge; <code>0</code> falls {{cssxref(\"border-bottom-style\")}} <code>none</code> oder <code>hidden</code> ist",
+    "en-US": "the absolute length or <code>0</code> if {{cssxref(\"border-bottom-style\")}} is <code>none</code> or <code>hidden</code>",
+    "fr": "la longueur absolue ou <code>0</code> si {{cssxref(\"border-bottom-style\")}} vaut <code>none</code> ou <code>hidden</code>",
+    "ja": "絶対的な長さ、または {{cssxref(\"border-bottom-style\")}} が <code>none</code> または <code>hidden</code> の場合は <code>0</code>",
+    "ru": "абсолютная длина или <code>0</code>, если {{cssxref(\"border-bottom-style\")}} - <code>none</code> или <code>hidden</code>"
+  },
+  "absoluteLengthOr0IfBorderLeftStyleNoneOrHidden": {
+    "de": "die absolute Länge; <code>0</code> falls {{cssxref(\"border-left-style\")}} <code>none</code> oder <code>hidden</code> ist",
+    "en-US": "the absolute length or <code>0</code> if {{cssxref(\"border-left-style\")}} is <code>none</code> or <code>hidden</code>",
+    "fr": "la longueur absolue ou <code>0</code> si {{cssxref(\"border-left-style\")}} vaut <code>none</code> ou <code>hidden</code>",
+    "ja": "絶対的な長さ、または {{cssxref(\"border-left-style\")}} が <code>none</code> または <code>hidden</code> の場合は <code>0</code>",
+    "ru": "абсолютная длина или <code>0</code>, если {{cssxref(\"border-left-style\")}} - <code>none</code> или <code>hidden</code>"
+  },
+  "absoluteLengthOr0IfBorderRightStyleNoneOrHidden": {
+    "de": "die absolute Länge; <code>0</code> falls {{cssxref(\"border-right-style\")}} <code>none</code> oder <code>hidden</code> ist",
+    "en-US": "the absolute length or <code>0</code> if {{cssxref(\"border-right-style\")}} is <code>none</code> or <code>hidden</code>",
+    "fr": "la longueur absolue ou <code>0</code> si {{cssxref(\"border-right-style\")}} vaut <code>none</code> ou <code>hidden</code>",
+    "ja": "絶対的な長さ、または {{cssxref(\"border-right-style\")}} が <code>none</code> または <code>hidden</code> の場合は <code>0</code>",
+    "ru": "абсолютная длина или <code>0</code>, если {{cssxref(\"border-right-style\")}} - <code>none</code> или <code>hidden</code>"
+  },
+  "absoluteLengthOr0IfBorderTopStyleNoneOrHidden": {
+    "de": "die absolute Länge; <code>0</code> falls {{cssxref(\"border-top-style\")}} <code>none</code> oder <code>hidden</code> ist",
+    "en-US": "the absolute length or <code>0</code> if {{cssxref(\"border-top-style\")}} is <code>none</code> or <code>hidden</code>",
+    "fr": "la longueur absolue ou <code>0</code> si {{cssxref(\"border-top-style\")}} vaut <code>none</code> ou <code>hidden</code>",
+    "ja": "絶対的な長さ、または {{cssxref(\"border-top-style\")}} が <code>none</code> または <code>hidden</code> の場合は <code>0</code>",
+    "ru": "абсолютная длина или <code>0</code>, если {{cssxref(\"border-top-style\")}} - <code>none</code> или <code>hidden</code>"
+  },
+  "absoluteLengthOrAsSpecified": {
+    "de": "für Prozent- und Längenwerte die absolute Länge, ansonsten wie angegeben",
+    "en-US": "for percentage and length values, the absolute length, otherwise as specified",
+    "fr": "pour les valeurs en pourcentages ou en longueur, la longueur absolue, sinon, comme spécifié",
+    "ja": "パーセンテージか length を指定すると絶対的な値、それ以外は指定通り",
+    "ru": "для процентов и значений длин, абсолютной длины, если другое не указано"
+  },
+  "absoluteLengthOrKeyword": {
+    "de": "für Prozentwerte und Längenwerte die absolute Länge, ansonsten das Schlüsselwort wie angegeben",
+    "en-US": "for percentage and length values, the absolute length, otherwise the keyword as specified",
+    "fr": "pour les valeurs exprimées en pourcentages ou en longueur, la longueur absolue, sinon, le mot-clé comme spécifié",
+    "ja": "パーセンテージか長さを指定すると絶対的な値、それ以外は指定されたキーワード",
+    "ru": "для процентов и значений длин, абсолютных длин или ключевых слов, если указаны"
+  },
+  "absoluteLengthOrNone": {
+    "de": "die absolute Länge oder <code>none</code>",
+    "en-US": "the absolute length or <code>none</code>",
+    "fr": "la longueur absolue ou le mot-clé <code>none</code>",
+    "ja": "絶対的な長さまたは <code>none</code>",
+    "ru": "абсолютная длина или <code>none</code>"
+  },
+  "absoluteLengthOrNormal": {
+    "de": "die absolute Länge oder das Schlüsselwort <code>normal</code>",
+    "en-US": "the absolute length or the keyword <code>normal</code>",
+    "fr": "la longueur absolue ou le mot-clé <code>normal</code>",
+    "ja": "絶対的な長さまたはキーワード <code>normal</code>",
+    "ru": "абсолютная длина или ключевое слово <code>normal</code>"
+  },
+  "absoluteLengthOrPercentage": {
+    "de": "für {{cssxref(\"length\")}} der absolute Wert, ansonsten ein Prozentwert",
+    "en-US": "for {{cssxref(\"length\")}} the absolute value, otherwise a percentage",
+    "fr": "pour {{cssxref(\"length\")}}, la valeur absolue, sinon un pourcentage",
+    "ja": "{{cssxref(\"length\")}} の場合は絶対的な値、それ以外はパーセント値",
+    "ru": "для {{cssxref(\"length\")}} абсолютного значения, иначе процент"
+  },
+  "absoluteLengthsSpecifiedColorAsSpecified": {
+    "de": "Längen absolut gemacht; angegebene Farben berechnet; ansonsten wie angegeben",
+    "en-US": "any length made absolute; any specified color computed; otherwise as specified",
+    "fr": "toute longueur sous forme absolue; toute couleur sous forme calculée; sinon comme spécifié",
+    "ja": "指定値(length は全て絶対値となり、color については計算値となる)",
+    "ru": "любая абсолютная длина; работает любой указанный цвет; если другое не указано"
+  },
+  "absoluteLengthZeroIfBorderStyleNoneOrHidden": {
+    "de": "absolute Länge; <code>0</code>, falls der Rahmenstil <code>none</code> oder <code>hidden</code> ist",
+    "en-US": "absolute length; <code>0</code> if the border style is <code>none</code> or <code>hidden</code>",
+    "fr": "une longueur absolue ; <code>0</code> si le style de la bordure vaut <code>none</code> ou <code>hidden</code>",
+    "ru": "абсолютная длина; <code>0</code>, если стиль рамки <code>none</code> или <code>hidden</code>"
+  },
+  "absoluteLengthZeroOrLarger": {
+    "de": "the absolute length, zero oder larger",
+    "en-US": "the absolute length, zero or larger",
+    "fr": "la valeur absolue valant zéro ou plus",
+    "ja": "ゼロ以上の絶対的な長さ",
+    "ru": "абсолютная длина, ноль или больше"
+  },
+  "absolutelyPositionedElements": {
+    "de": "absolut positionierte Elemente",
+    "en-US": "absolutely positioned elements",
+    "fr": "éléments positionnés de manière absolue",
+    "ja": "絶対位置指定された要素",
+    "ru": "абсолютно позиционированные элементы"
+  },
+  "absoluteURIOrNone": {
+    "de": "absolute URI oder <code>none</code>",
+    "en-US": "absolute URI or <code>none</code>",
+    "fr": "une URI absolue ou <code>none</code>",
+    "ru": "абсолютный URI или <code>none</code>"
+  },
+  "all": {
+    "de": "alle",
+    "en-US": "all",
+    "fr": "tous",
+    "ja": "すべて",
+    "ru": "всё"
+  },
+  "allElements": {
+    "de": "alle Elemente",
+    "en-US": "all elements",
+    "fr": "tous les éléments",
+    "ja": "すべての要素",
+    "pl": "wszystkich elementów",
+    "ru": "все элементы"
+  },
+  "allElementsAcceptingWidthOrHeight": {
+    "de": "alle Elemente, die Breite oder Höhe akzeptieren",
+    "en-US": "all elements that accept width or height",
+    "fr": "tous les éléments acceptant une largeur ou une hauteur",
+    "ja": "width および height を受け付ける全ての要素",
+    "ru": "все элементы, которые могут иметь ширину и высоту"
+  },
+  "allElementsAndPseudos": {
+    "de": "alle Elemente, {{cssxref(\"::before\")}} und {{cssxref(\"::after\")}} <a href=\"/de/docs/Web/CSS/Pseudo-elements\">Pseudoelemente</a>",
+    "en-US": "all elements, {{cssxref(\"::before\")}} and {{cssxref(\"::after\")}} <a href=\"/en-US/docs/Web/CSS/Pseudo-elements\">pseudo-elements</a>",
+    "es": "todos los elementos y los <a href=\"/es/docs/Web/CSS/Pseudoelementos\">pseudoelementos</a> {{cssxref(\"::before\")}} y {{cssxref(\"::after\")}}",
+    "fr": "tous les éléments, ainsi que les <a href=\"/fr/docs/Web/CSS/Pseudo-elements\">pseudo-elements</a> {{cssxref(\"::before\")}} et {{cssxref(\"::after\")}}",
+    "ja": "すべての要素、{{cssxref(\"::before\")}} / {{cssxref(\"::after\")}} <a href=\"/ja/docs/Web/CSS/Pseudo-elements\">疑似要素</a>",
+    "ru": "все элементы, {{cssxref(\"::before\")}} и {{cssxref(\"::after\")}} <a href=\"/ru/docs/Web/CSS/Pseudo-elements\">псевдоэлементы</a>"
+  },
+  "allElementsButNonReplacedAndTableColumns": {
+    "de": "alle Elemente außer nicht ersetzte Inlineelemente, Tabellenspalten und Spaltengruppen",
+    "en-US": "all elements but non-replaced inline elements, table columns, and column groups",
+    "es": "elementos de bloque o remplazados",
+    "fr": "tous les éléments sauf les éléments en ligne non remplacés, les colonnes de tableaux et les groupes de colonnes",
+    "ja": "非置換インライン要素、テーブルの列、列グループを除くすべての要素",
+    "ru": "все элементы, кроме незаменяемых строчных элементов, табличных колонок и групп колонок"
+  },
+  "allElementsButNonReplacedAndTableRows": {
+    "de": "alle Elemente außer nicht ersetzte Inlineelemente, Tabellenzeilen und Zeilengruppen",
+    "en-US": "all elements but non-replaced inline elements, table rows, and row groups",
+    "fr": "tous les éléments sauf les éléments en ligne non remplacés, les lignes de tableaux et les groupes de lignes",
+    "ru": "все элементы, кроме незаменяемых строчных элементов, табличных строк и групп строк"
+  },
+  "allElementsCreatingNativeWindows": {
+    "de": "alle Elemente, die native Fenster erstellen, z. B. &lt;window&gt;, &lt;panel&gt;",
+    "en-US": "all elements that create native windows, e.g. &lt;window&gt;, &lt;panel&gt;",
+    "fr": "tous les éléments qui créent des fenêtres natives, par exemple &lt;window&gt;, &lt;panel&gt;",
+    "ru": "все элементы, создающие нативные окна, например, &lt;window&gt;, &lt;panel&gt;"
+  },
+  "allElementsExceptGeneratedContentOrPseudoElements": {
+    "de": "alle Elemente außer generierte Inhalte oder Pseudoelemente",
+    "en-US": "all elements except generated content or pseudo-elements",
+    "fr": "tous les éléments sauf le contenu généré ou les pseudo-éléments",
+    "ja": "生成コンテンツ及び疑似要素を除くすべての要素",
+    "ru": "все элементы, кроме сгенерированного контента и псевдоэлементов"
+  },
+  "allElementsExceptInlineBoxesAndInternalRubyOrTableBoxes": {
+    "de": "all elements except inline boxes and internal ruby or table boxes",
+    "en-US": "all elements except inline boxes and internal ruby or table boxes",
+    "fr": "all elements except inline boxes and internal ruby or table boxes",
+    "ja": "all elements except inline boxes and internal ruby or table boxes",
+    "ru": "all elements except inline boxes and internal ruby or table boxes"
+  },
+  "allElementsExceptInternalTableDisplayTypes": {
+    "de": "alle Elemente außer <code>table-row-group</code>, <code>table-header-group</code>, <code>table-footer-group</code>, <code>table-row</code>, <code>table-column-group</code> und <code>table-column</code>",
+    "en-US": "all elements, except <code>table-row-group</code>, <code>table-header-group</code>, <code>table-footer-group</code>, <code>table-row</code>, <code>table-column-group</code> and <code>table-column</code>",
+    "fr": "tous les éléments exceptés <code>table-row-group</code>, <code>table-header-group</code>, <code>table-footer-group</code>, <code>table-row</code>, <code>table-column-group</code> et <code>table-column</code>",
+    "ru": "все элементы, кроме <code>table-row-group</code>, <code>table-header-group</code>, <code>table-footer-group</code>, <code>table-row</code>, <code>table-column-group</code> и <code>table-column</code>"
+  },
+  "allElementsExceptNonReplacedInlineElementsTableRowsColumnsRowColumnGroups": {
+    "de": "alle Elemente außer: nicht ersetzte Inlineelemente, Tabellenzeilen, Zeilengruppen, Tabellenspalten und Spaltengruppen",
+    "en-US": "all elements except: non-replaced inline elements, table rows, row groups, table columns, and column groups",
+    "fr": "tous les éléments sauf : les éléments en ligne non remplacés, les lignes, les groupes de lignes, les colonnes et les groupes de colonnes pour les tableaux",
+    "ja": "非置換インライン要素、表の行、行グループ、表の列、列グループを除くすべての要素",
+    "ru": "все элементы, кроме: незаменяемых строчных элементов, строк и колонок таблиц"
+  },
+  "allElementsExceptTableDisplayTypes": {
+    "de": "alle Elemente außer Elemente mit Tabellen-{{cssxref(\"display\")}}-Typen, die nicht <code>table-caption</code>, <code>table</code> und <code>inline-table</code> entsprechen",
+    "en-US": "all elements, except elements with table {{cssxref(\"display\")}} types other than <code>table-caption</code>, <code>table</code> and <code>inline-table</code>",
+    "fr": "tous les éléments exceptés ceux dont les types {{cssxref(\"display\")}} pour les tableaux ne sont pas <code>table-caption</code>, <code>table</code> et <code>inline-table</code>",
+    "ja": "<code>table-caption</code>, <code>table</code>, <code>inline-table</code> 以外の表の {{cssxref(\"display\")}} 種別を除くすべての要素。",
+    "ru": "все элементы, кроме элементов с табличным типом {{cssxref(\"display\")}}, отличным от <code>table-caption</code>, <code>table</code> и <code>inline-table</code>"
+  },
+  "allElementsExceptTableElementsWhenCollapse": {
+    "de": "Alle Elemente, außer interne Tabellenelemente, falls {{cssxref(\"border-collapse\")}} <code>collapse</code> ist",
+    "en-US": "all elements, except internal table elements when {{cssxref(\"border-collapse\")}} is <code>collapse</code>",
+    "fr": "tous les éléments sauf les éléments de table internes lorsque {{cssxref(\"border-collapse\")}} vaut <code>collapse</code>",
+    "ja": "すべての要素。ただし {{cssxref(\"border-collapse\")}} が <code>collapse</code> のときはテーブル要素内部にあるものを除く",
+    "ru": "все элементы, кроме внутренних табличных элементов, когда {{cssxref(\"border-collapse\")}}:<code>collapse</code>"
+  },
+  "allElementsExceptTableRowColumnGroupsTableRowsColumns": {
+    "de": "alle Elemente außer Tabellenzeilengruppen, Tabellenspaltengruppen, Tabellenzeilen und Tabellenspalten",
+    "en-US": "all elements except table row groups, table column groups, table rows, and table columns",
+    "fr": "tous les éléments exceptés les groupes de lignes, les groupes de colonnes des tableaux et les colonnes de tableaux",
+    "ja": "表の行グループ、表の列グループ、表の行、表の列を除くすべての要素",
+    "ru": "все элементы, кроме групп табличных строк, групп табличных столбцов, табличных строк и табличных колонок"
+  },
+  "allElementsExceptTableRowGroupsRowsColumnGroupsAndColumns": {
+    "de": "alle Elemente außer Tabellenzeilengruppen, Zeilen, Spaltengruppen und Spalten",
+    "en-US": "all elements, except table row groups, rows, column groups, and columns",
+    "fr": "tous les éléments exceptés les groupes de lignes, les lignes, les groupes de colonnes et les colonnes de tableaux",
+    "ja": "表の行グループ、列グループ、行、列を除くすべての要素",
+    "ru": "все элементы, кроме групп табличных строк, столбцов, групп столбцов и столбцов"
+  },
+  "allElementsNoEffectIfDisplayNone": {
+    "de": "alle Elemente, hat jedoch keinen Effekt, falls der Wert von {{cssxref(\"display\")}} <code>none</code> ist",
+    "en-US": "all elements, but has no effect if the value of {{cssxref(\"display\")}} is <code>none</code>.",
+    "fr": "tous les éléments mais n'a aucun effet si la valeur de <code>display</code> est <code>none</code>.",
+    "ja": "すべての要素。ただし {{cssxref(\"display\")}} が <code>none</code> なら効果を持ちません。",
+    "ru": "все элементы, но не будет эффекта, если <code>display: none</code>"
+  },
+  "allElementsSomeValuesNoEffectOnNonInlineElements": {
+    "de": "Alle Elemente, einige Werte haben keine Wirkung bei non-inline Elementen",
+    "en-US": "all elements, though some values have no effect on non-inline elements",
+    "fr": "tous les éléments bien que certaines valeurs n'aient pas d'effet sur les éléments qui ne sont pas en ligne",
+    "ja": "すべての要素。ただし一部の値はインラインでない要素には効果がありません",
+    "ru": "все элементы, хотя некоторые значения не работают на не строчных элементах"
+  },
+  "allElementsSVGContainerElements": {
+    "de": "alle Elemente; In SVG gilt betrifft dies Containerelemente mit Ausnahme des {{SVGElement(\"defs\")}} Elements und allen Grafikelementen",
+    "en-US": "all elements; In SVG, it applies to container elements excluding the {{SVGElement(\"defs\")}} element and all graphics elements",
+    "fr": "tous les éléments ; en SVG, cela s'applique aux éléments conteneurs à l'exception des éléments {{SVGElement(\"defs\")}} et des éléments graphiques",
+    "ja": "すべての要素。 SVG では、 {{SVGElement(\"defs\")}} 要素及びすべてのグラフィック要素を除いたコンテナー要素に適用されます。",
+    "ru": "все элементы; в SVG, это применяется к контейнерам, исключая элемент {{SVGElement(\"defs\")}} и все графические элементы"
+  },
+  "allElementsSVGContainerGraphicsAndGraphicsReferencingElements": {
+    "de": "Alle Elemente. In SVG wird er auf Containerelemente, Grafikelemente und Grafiken referenzierende Elemente angewandt.",
+    "en-US": "All elements. In SVG, it applies to container elements, graphics elements, and graphics referencing elements.",
+    "fr": "Tous les éléments. En SVG, cela s'applique aux éléments de conteneurs, aux éléments graphiques et aux éléments faisant référence à des éléments graphiques.",
+    "ja": "すべての要素。 SVG では、コンテナー要素、グラフィック要素、グラフィック参照要素に適用されます。",
+    "ru": "Все элементы. В SVG это применяется к контейнерам, графическим элементам и элементам графической отсылки."
+  },
+  "allElementsThatCanReferenceImages": {
+    "en-US": "Any element that can have an image applied to it, for example as a {{cssxref(\"background-image\")}}, {{cssxref(\"border-image\")}}, or {{cssxref(\"list-style-image\")}}.",
+    "ja": "{{cssxref(\"background-image\")}}, {{cssxref(\"border-image\")}}, {{cssxref(\"list-style-image\")}} などで適用される画像を持つすべての要素。"
+  },
+  "allElementsUAsNotRequiredWhenCollapse": {
+    "de": "alle Elemente; aber User Agents sind nicht gezwungen dies auf <code>table</code> und <code>inline-table</code> Elemente anzuwenden, falls {{cssxref(\"border-collapse\")}} <code>collapse</code> ist. Das Verhalten bei internen Tabellenelementen ist momentan undefiniert.",
+    "en-US": "all elements; but User Agents are not required to apply to <code>table</code> and <code>inline-table</code> elements when {{cssxref(\"border-collapse\")}} is <code>collapse</code>. The behavior on internal table elements is undefined for the moment.",
+    "fr": "tous les éléments, mais les agents utilisateurs ne sont pas tenus de l'appliquer aux éléments de type <code>table</code> ou <code>inline-table</code> lorsque {{cssxref(\"border-collapse\")}} vaut <code>collapse</code>. Le comportement sur les éléments de type table interne est pour l'instant indéfini.",
+    "ru": "все элементы, но браузеры не применяют к элементам <code>table</code> и <code>inline-table</code>, когда {{cssxref(\"border-collapse\")}}:<code>collapse</code>. Поведение на внутритабличных элементах не определено."
+  },
+  "allHTMLElements": {
+    "de": "alle HTML-Elemente",
+    "en-US": "all HTML elements",
+    "fr": "tous les éléments HTML",
+    "ru": "все HTML элементы"
+  },
+  "andInEnumeration": {
+    "de": " und ",
+    "en-US": " and ",
+    "fr": " et ",
+    "ru": " и "
+  },
+  "angleBasicShapeOrPath": {
+    "de": "{{cssxref(\"<angle>\"}}, {{cssxref(\"<basic-shape>\"}} oder {{cssxref(\"<path()>\"}}",
+    "en-US": "{{cssxref(\"<angle>\"}}, {{cssxref(\"<basic-shape>\"}} or {{cssxref(\"<path()>\"}}",
+    "fr": "{{cssxref(\"<angle>\"}}, {{cssxref(\"<basic-shape>\"}} ou {{cssxref(\"<path()>\"}}"
+  },
+  "angleOrBasicShapeOrPath": {
+    "de": "als &lt;angle&gt;, &lt;basic-shape&gt; oder &lt;path()&gt;",
+    "en-US": "as &lt;angle&gt;, &lt;basic-shape&gt; or &lt;path()&gt;",
+    "fr": "comme &lt;angle&gt;, &lt;basic-shape&gt; ou &lt;path()&gt;",
+    "ru": "как &lt;angle&gt;, &lt;basic-shape&gt; или &lt;path()&gt;"
+  },
+  "angleRoundedToNextQuarter": {
+    "de": "ein {{xref_cssangle}}, auf den nächsten Viertel von <code>0deg</code> gerundet (üblicherweise  <code>1turn)</code>",
+    "en-US": "an {{xref_cssangle}}, rounded to the next quarter turn from <code>0deg</code> and normalized, that is moduloing the value by <code>1turn</code>",
+    "fr": "un {{xref_cssangle}}, arrondi au quart de tour supérieur (à partir de <code>0deg</code>) puis normalisé (modulo) pour obtenir l'angle relatif à un tour",
+    "ru": "{{xref_cssangle}}, с округлением до следующей четверти оборота от <code>0deg</code> и нормализованный так, что значение - <code>1 поворот</code>"
+  },
+  "animationType": {
+    "de": "Animationstyp",
+    "en-US": "Animation type",
+    "fr": "Type d'animation",
+    "ja": "アニメーションの種類"
+  },
+  "anyElementEffectOnProgressAndMeter": {
+    "de": "beliebige Elemente; es hat eine Auswirkung auf {{HTMLElement(\"progress\")}} und {{HTMLElement(\"meter\")}}, aber nicht auf &lt;input type=\"range\"&gt; oder andere Elemente",
+    "en-US": "any element; it has an effect on {{HTMLElement(\"progress\")}} and {{HTMLElement(\"meter\")}}, but not on &lt;input type=\"range\"&gt; or other elements",
+    "fr": "n'importe quel élément, aura un effet sur {{HTMLElement(\"progress\")}} et {{HTMLElement(\"meter\")}}, mais pas sur &lt;input type=\"range\"&gt; ou les autres éléments",
+    "ru": "любой элемент; имеет эффект на {{HTMLElement(\"progress\")}} и {{HTMLElement(\"meter\")}}, но не на &lt;input type=\"range\"&gt; или других элементах"
+  },
+  "appliesTo": {
+    "de": "Anwendbar auf",
+    "en-US": "Applies to",
+    "fr": "Applicabilité",
+    "ja": "適用対象",
+    "ko": "적용대상",
+    "pl": "Stosowana do",
+    "pt-BR": "Aplica-se a",
+    "ru": "Применяется к",
+    "zh-CN": "适用元素"
+  },
+  "applyingToMultiple": {
+    "de": "$1$. Auch anwendbar auf $2$.",
+    "en-US": "$1$. It also applies to $2$.",
+    "fr": "$1$. S'applique aussi à $2$.",
+    "ja": "$1$。 $2$ にも適用されます。",
+    "ru": "$1$. Это также применяется к $2$."
+  },
+  "asAutoOrColor": {
+    "en-US": "<code>auto</code> is computed as specified and <code>&lt;color&gt;</code> values are computed as defined for the {{cssxref(\"color\")}} property.",
+    "de": "<code>auto</code> wird wie angegeben berechnet und <code>&lt;color&gt;</code> Werte werden wie für die {{cssxref(\"color\")}} Eigenschaft berechnet.",
+    "ja": "<code>auto</code> は仕様通りに計算され、 <code>&lt;color&gt;</code> 値は {{cssxref(\"color\")}} プロパティで定義されたように計算される。"
+  },
+  "asDefinedForBasicShapeWithAbsoluteURIOtherwiseAsSpecified": {
+    "de": "wie definiert für {{cssxref(\"basic-shape\")}} (gefolgt von {{cssxref(\"shape-box\")}}, falls angegeben), dem {{cssxref(\"image\")}}, dessen URI absolut gemacht wurde, ansonsten wie angegeben.",
+    "en-US": "as defined for {{cssxref(\"basic-shape\")}} (with {{cssxref(\"shape-box\")}} following, if supplied), the {{cssxref(\"image\")}} with its URI made absolute, otherwise as specified.",
+    "fr": "comme défini pour {{cssxref(\"basic-shape\")}} (avec {{cssxref(\"shape-box\")}} qui suit s'il est utilisé), l'{{cssxref(\"image\")}} avec son URI rendue absolue, sinon, comme spécifié.",
+    "ru": "как определено для {{cssxref(\"basic-shape\")}} (c {{cssxref(\"shape-box\")}} последующим, если передается),  {{cssxref(\"image\")}} с его абсолютным URI, если другое не указано"
+  },
+  "asLength": {
+    "de": "als {{cssxref(\"length\")}}",
+    "en-US": "as {{cssxref(\"length\")}}",
+    "fr": "comme {{cssxref(\"length\")}}",
+    "ru": "как {{cssxref(\"length\")}}"
+  },
+  "asLonghands": {
+    "de": "wie die jeweiligen Kurzschreibweisen:",
+    "en-US": "as each of the properties of the shorthand:",
+    "fr": "pour chaque propriété individuelle de la propriété raccourcie&nbsp;:",
+    "ja": "一括指定の各プロパティとして",
+    "ru": "как и у каждого из подсвойств этого свойства:"
+  },
+  "asSpecified": {
+    "de": "wie angegeben",
+    "en-US": "as specified",
+    "es": "como se especifica",
+    "ca": "com s'especifica",
+    "fr": "comme spécifié",
+    "ja": "指定値",
+    "pl": "jako określone",
+    "ru": "как указано"
+  },
+  "asSpecifiedAppliesToEachProperty": {
+    "de": "wie der angegebene Wert wird er auf alle Eigenschaften angewandt, für die dies eine Kurzschreibweise ist.",
+    "en-US": "as the specified value applies to each property this is a shorthand for.",
+    "fr": "comme la valeur spécifiée s'applique sur chaque propriété englobée par le raccourci",
+    "ru": "как указанное значение, применяется к каждому свойству этой короткой записи."
+  },
+  "asSpecifiedButVisibleOrClipReplacedToAutoOrHiddenIfOtherValueDifferent": {
+    "en-US": "as specified, except with <code>visible</code>/<code>clip</code> computing to <code>auto</code>/<code>hidden</code> respectively if one of {{cssxref(\"overflow-x\")}} or {{cssxref(\"overflow-y\")}} is neither <code>visible</code> nor </code>clip</code>",
+    "es": "como se especifica, excepto que si {{cssxref(\"overflow-x\")}} o bien {{cssxref(\"overflow-y\")}} es distinto de <code>visible</code> o <code>clip</code>, estos dos valores computan a <code>auto</code> o <code>hidden</code> respectivamente",
+    "ca": "com s'especifica, excepte que si {{cssxref(\"overflow-x\")}} o bé {{cssxref(\"overflow-y\")}} són diferents de <code>visible</code> o <code>clip</code>, aquests dos valors computen a <code>auto</code> o <code>hidden</code> respectivament"
+  },
+  "asSpecifiedExceptMatchParent": {
+    "de": "wie angegeben, außer für den <code>match-parent</code> Wert, welcher in Bezug auf den <code>direction</code> Wert des Elternelements berechnet wird und einen berechneten Wert von <code>left</code> oder <code>right</code> ergibt",
+    "en-US": "as specified, except for the <code>match-parent</code> value which is calculated against its parent's <code>direction</code> value and results in a computed value of either <code>left</code> or <code>right</code>",
+    "fr": "comme spécifié, sauf pour la valeur <code>match-parent</code> qui est calculée en fonction de la <code>direction</code> du parent et qui vaut soit <code>left</code>, soit <code>right</code>",
+    "ja": "指定値。ただし <code>match-parent</code> 値を除く。この値は親要素の方向にもとづいて計算され、計算値が左右どちらにもなります",
+    "ru": "как указано, кроме значения <code>match-parent</code>, которое вычисляется вместо значения его родителя <code>direction</code>, а результаты в вычисленном значении <code>left</code> или <code>right</code>"
+  },
+  "asSpecifiedExceptPositionedFloatingAndRootElementsKeywordMaybeDifferent": {
+    "de": "wie der angegebene Wert, außer für positionierte und umfließende Elemente und das Wurzelelement. In beiden Fällen kann der berechnete Wert ein Schlüsselwort sein, das nicht dem angegebenen entspricht.",
+    "en-US": "as the specified value, except for positioned and floating elements and the root element. In both cases the computed value may be a keyword other than the one specified.",
+    "fr": "comme la valeur spécifiée, excepté pour les éléments positionnés et flottants, ainsi que pour l'élément racine. Dans les deux cas, la valeur calculée peut être un mot clé différent de celui spécifié.",
+    "ja": "指定通り。ただし位置指定された要素とフロート、ルート要素を除く。これらは計算値が指定したものと違うキーワードになる可能性があります",
+    "ru": "как указанное значение, кроме как для позиционированных и плавающих элементов и корневого элемента. В обоих случаях вычисляемое значение может быть ключевым словом, отличным от указанного."
+  },
+  "asSpecifiedRelativeToAbsoluteLengths": {
+    "de": "relativ zur gleichen Achse der Innenabstandsbox des Scrollcontainers",
+    "en-US": "as specified, but with relative lengths converted into absolute lengths",
+    "fr": "comme spécifié, mais avec les longueurs relatives converties en longueurs absolues",
+    "ja": "指定通り。ただし相対的 length は絶対的 length に変換",
+    "ru": "как указано, но с относительной длиной, конвертируемой в абсолютные длины"
+  },
+  "asSpecifiedURLsAbsolute": {
+    "de": "wie angegeben, aber mit absoluten {{cssxref(\"url\")}} Werten",
+    "en-US": "as specified, but with {{cssxref(\"url\")}} values made absolute",
+    "fr": "comme spécifié mais avec les valeurs {{cssxref(\"url\")}} rendues absolues",
+    "ru": "как указано, но с абсолютными значениями {{cssxref(\"url\")}}"
+  },
+  "asSpecifiedWithExceptionOfResolution": {
+    "de": "wie angegeben mit Ausnahme von &lt;resolution&gt;, das möglicherweise durch den berechneten Wert für 'snap' geändert wird",
+    "en-US": "as specified, except with &lt;resolution&gt; possibly altered by computed for 'snap' value",
+    "fr": "telle que spécifiée, sauf avec &lt;resolution&gt; éventuellement modifiée lors du calcul par la valeur 'snap'",
+    "ru": "как указано, за исключением &lt;resolution&gt; может изменить значением 'snap'"
+  },
+  "asSpecifiedWithLengthsAbsoluteAndNormalComputingToZeroExceptMultiColumn": {
+    "en-US": "as specified, with &lt;length&gt;s made absolute, and normal computing to zero except on multi-column elements",
+    "ja": "指定通りで、 &lt;length&gt; は絶対長になり、 normal の計算値は段組み要素を除き 0 になる"
+  },
+  "asSpecifiedWithVarsSubstituted": {
+    "de": "wie angegeben, wobei Variablen ersetzt werden",
+    "en-US": "as specified with variables substituted",
+    "fr": "tel que spécifié avec les variables échangées"
+  },
+  "autoForSmartphoneBrowsersSupportingInflation": {
+    "de": "<code>auto</code> für Smartphone Browser, die Befüllung unterstützen, <code>none</code> andererseits (und dann unveränderbar).",
+    "en-US": "<code>auto</code> for smartphone browsers supporting inflation, <code>none</code> in other cases (and then not modifiable).",
+    "fr": "<code>auto</code> pour les navigateurs de smartphones qui supportent l'expansion, <code>none</code> in dans les autres cas (non modifiable alors).",
+    "ru": "<code>auto</code> для браузеров в смартфонах поддерживается увеличение, <code>none</code> в других случаях (и позже не изменяется)."
+  },
+  "autoNonNegativeOrPercentage": {
+    "de": "<code>auto</code>, eine nicht negative Zahl oder ein Prozentwert wie angegeben",
+    "en-US": "<code>auto</code>, or a non-negative number or percentage as specified",
+    "fr": "<code>auto</code> ou un nombre positif ou nul ou un pourcentage, comme spécifié",
+    "ru": "<code>auto</code>, или задаётся неотрицательное число или процент, как указан"
+  },
+  "autoOnAbsolutelyPositionedElementsValueOfAlignItemsOnParent": {
+    "de": "<code>auto</code> berechnet sich zu sich selbst bei absolut positionierten Elementen und zum berechneten Wert von {{cssxref(\"align-items\")}} des Elternelements (abzüglich veralteter Schlüsselwörter) bei allen anderen Boxen oder <code>start</code>, falls die Box kein Elternelement hat. Sein Verhalten hängt vom Layoutmodell ab, wie für {{cssxref(\"justify-self\")}} beschrieben. Ansonsten der angegebene Wert.",
+    "en-US": "<code>auto</code> computes to itself on absolutely-positioned elements, and to the computed value of {{cssxref(\"align-items\")}} on the parent (minus any legacy keywords) on all other boxes, or <code>start</code> if the box has no parent. Its behavior depends on the layout model, as described for {{cssxref(\"justify-self\")}}. Otherwise the specified value.",
+    "fr": "<code>auto</code> sera calculé comme <code>auto</code> pour les éléments positionnés de façon absolue, sera calculé comme {{cssxref(\"align-items\")}} sur le parent (excepté les mots-clés historiques utilisés) de toutes les autres boîtes ou comme <code>start</code> si la boîte n'a pas de parent. Son comportement dépend du modèle de disposition, décrit dans {{cssxref(\"justify-self\")}}, sinon ce sera la valeur spécifiée.",
+    "ru": "при <code>auto</code> абсолютно позиционированные элементы вычисляют сами и вычисленное значение {{cssxref(\"align-items\")}} для родителя (кроме ключевых слов) на остальных блоках, или <code>start</code>, если у блока нет родителя. Его поведение зависит от модели макета, описываемой {{cssxref(\"justify-self\")}}. Иначе указанное значение."
+  },
+  "autoOrRectangle": {
+    "de": "<code>auto</code>, falls als <code>auto</code> angegeben, ansonsten ein Rechteck mit vier Werten, von denen jeder <code>auto</code> ist, falls als <code>auto</code> angegeben, ansonsten die berechnete Länge",
+    "en-US": "<code>auto</code> if specified as <code>auto</code>, otherwise a rectangle with four values, each of which is <code>auto</code> if specified as <code>auto</code> or the computed length otherwise",
+    "fr": "<code>auto</code> si spécifié comme <code>auto</code>, sinon un rectangle avec quatre valeurs dont chacune vaut <code>auto</code> si elles sont spécifiées comme <code>auto</code> sinon, la longueur calculée",
+    "ja": "auto 指定されていれば auto、それ以外は 4 つの値をともなう矩形。矩形の場合、各値は auto 指定されていれば auto、それ以外では計算値",
+    "ru": "<code>auto</code>, если указано как <code>auto</code>, иначе прямоугольник с четырьмя значениями, каждое из которых <code>auto</code>, если указаны как <code>auto</code> или вычисленная длина в противном случае"
+  },
+  "basicShape": {
+    "de": "eine <a href=\"/de/docs/Web/CSS/shape-outside#Interpolation\" title=\"Werte des <basic-shape> CSS Datentyps interpolieren als einfache Liste. Die Listenwerte interpolieren als Länge, Prozentwert oder calc, wo möglich. Falls Listenwerte nicht einem dieser Typen entsprechen, aber identisch sind, werden diese Werte interpoliert.\">einfache Form</a>",
+    "en-US": "a <a href=\"/en-US/docs/Web/CSS/shape-outside#Interpolation\" title=\"Values of the <basic-shape> CSS data type interpolate as a simple list. The list values interpolate as length, percentage, or calc where possible. If list values are not one of those types but are identical, those values do interpolate.\">basic shape</a>",
+    "fr": "une <a href=\"/fr/docs/Web/CSS/shape-outside#Interpolation\" title=\"Les valeurs de type CSS <forme-basique> sont interpolées comme une liste simple. La liste de valeurs interpole la longueur, le pourcentage ou la valeur calculée. Si les valeurs de la liste ne sont pas de ces types mais sont identiques, les valeurs seront interpolées.\">forme basique (<code>basic-shape</code>)</a>",
+    "ru": "<a href=\"/ru/docs/Web/CSS/shape-outside#Interpolation\" title=\"Значения типа <базовая фигура> интерполируются как простой список. Список значений интерполируется как длина, проценты, или расчёт, где возможен. Если список значений не одинакового типа, эти значения интерполируются.\">базовая фигура</a>"
+  },
+  "basicShapeOtherwiseNo": {
+    "de": "ja, wie angegeben für {{cssxref(\"basic-shape\")}}, ansonsten nein",
+    "en-US": "yes, as specified for {{cssxref(\"basic-shape\")}}, otherwise no",
+    "fr": "oui, comme spécifié pour {{cssxref(\"basic-shape\")}}, sinon, non",
+    "ru": "да, как указано для {{cssxref(\"basic-shape\")}}, иначе нет"
+  },
+  "beforeAndAfterPseudos": {
+    "de": "{{cssxref(\"::before\")}} und{{cssxref(\"::after\")}} <a href=\"/de/docs/Web/CSS/Pseudo-elements\">Pseudoelemente</a>",
+    "en-US": "{{cssxref(\"::before\")}} and {{cssxref(\"::after\")}} <a href=\"/en-US/docs/Web/CSS/Pseudo-elements\">pseudo-elements</a>",
+    "es": "los <a href=\"/es/docs/Web/CSS/Pseudoelementos\">pseudoelementos</a> {{cssxref(\"::before\")}} y {{cssxref(\"::after\")}}",
+    "fr": "<a href=\"/fr/docs/Web/CSS/Pseudo-éléments\">pseudo-éléments</a> {{cssxref(\"::before\")}} et {{cssxref(\"::after\")}} ",
+    "ja": "{{cssxref(\"::before\")}} / {{cssxref(\"::after\")}} <a href=\"/ja/docs/Web/CSS/Pseudo-elements\">疑似要素</a>",
+    "ru": "{{cssxref(\"::before\")}} и {{cssxref(\"::after\")}} <a href=\"/ru/docs/Web/CSS/Pseudo-elements\">псевдоэлементы</a>"
+  },
+  "blockContainerElements": {
+    "de": "Blockcontainerelemente",
+    "en-US": "block container elements",
+    "fr": "les éléments conteneurs de blocs",
+    "ja": "ブロックコンテナー要素",
+    "ru": "блочные контейнеры"
+  },
+  "blockContainers": {
+    "de": "Blockcontainer",
+    "en-US": "block containers",
+    "fr": "conteneurs de type bloc",
+    "ja": "ブロックコンテナー",
+    "ru": "блочные контейнеры"
+  },
+  "blockContainersAndMultiColumnContainers": {
+    "de": "Blockcontainer und mehrspaltige Container",
+    "en-US": "Block containers and multi-column containers",
+    "ja": "ブロックコンテナー, 段組みクコンテナー"
+  },
+  "blockContainersExceptMultiColumnContainers": {
+    "de": "Blockcontainer außer mehrspaltige Container",
+    "en-US": "Block containers except multi-column containers"
+  },
+  "blockContainersExceptTableWrappers": {
+    "de": "Blockcontainer außer Tabellen umgebende Boxen",
+    "en-US": "Block containers except table wrapper boxes"
+  },
+  "blockContainersFlexContainersGridContainers": {
+    "en-US": "Block-containers, flex containers, and grid containers",
+    "ja": "ブロックコンテナー, フレックスコンテナー, グリッドコンテナー"
+  },
+  "blockElementsInNormalFlow": {
+    "de": "Blocklevelelemente in normalem Fluss des Wurzelelements. User Agents können es auch auf andere Elemente wie <code>table-row</code>-Elemente anwenden.",
+    "en-US": "block-level elements in the normal flow of the root element. User agents may also apply it to other elements like <code>table-row</code> elements.",
+    "fr": "les éléments de bloc dans le flux normal de l'élément racine. Les agents utilisateurs peuvent également l'appliquer sur d'autres éléments comme <code>table-row</code>.",
+    "ru": "блочные элементы в нормальном потоке родительского элемента. Браузеры могут также применять это к другим элементам типа <code>table-row</code>."
+  },
+  "blockLevelBoxesAndAbsolutelyPositionedBoxesAndGridItems": {
+    "en-US": "block-level boxes, absolutely-positioned boxes, and grid items"
+  },
+  "blockLevelElements": {
+    "de": "Blocklevel Elemente",
+    "en-US": "block-level elements",
+    "fr": "éléments de type bloc",
+    "ja": "ブロックレベル要素",
+    "ru": "блочные элементы"
+  },
+  "blockSizeOfContainingBlock": {
+    "de": "Blockgröße des beinhaltenden Blocks",
+    "en-US": "block-size of containing block",
+    "fr": "la taille de bloc du bloc englobant",
+    "ru": "размер блока, содержащего элемент"
+  },
+  "boxElements": {
+    "de": "Boxelemente",
+    "en-US": "box elements",
+    "fr": "éléments de boîte",
+    "ru": "блочные элементы"
+  },
+  "byComputedValueType": {
+    "en-US": "by computed value type"
+  },
+  "canonicalOrder": {
+    "de": "Kanonische Reihenfolge",
+    "en-US": "Canonical order",
+    "fr": "Ordre canonique",
+    "ja": "正規順序",
+    "ru": "Канонический порядок",
+    "zh-CN": "正规顺序"
+  },
+  "childrenOfBoxElements": {
+    "de": "Kindelemente von Boxelementen",
+    "en-US": "children of box elements",
+    "fr": "les éléments fils des éléments de boîte",
+    "ru": "потомки блочных элементов"
+  },
+  "color": {
+    "de": "<a href=\"/de/docs/Web/CSS/color_value#Interpolation\">Farbe</a>",
+    "en-US": "a <a href=\"/en-US/docs/Web/CSS/color_value#Interpolation\" title=\"Values of the <color> CSS data type are interpolated on each of their red, green, blue components, each handled as a real, floating-point number. Note that interpolation of colors happens in the alpha-premultiplied sRGBA color space to prevent unexpected grey colors to appear.\">color</a>",
+    "fr": "une <a href=\"/fr/docs/Web/CSS/color_value#Interpolation\" title=\"Les valeurs de type <couleur> sont interpolées sur chacune des composantes rouge, bleue et verte, considérées chacunes comme un nombre réel à virgule flottante. Notez que l'interpolation des couleurs a lieu dans l'espace couleur sRGBA pré-multiplié pour éviter l'apparition de teintes grises non désirées.\">couleur</a>",
+    "ja": "<a href=\"/ja/docs/Web/CSS/color_value#Interpolation\" title=\"CSS の <color> データ型の値は、赤、緑、青のそれぞれの値ごとに、浮動小数点の実数として扱われて補間されます。なお、アルファ事前混合 sRGBA 色空間で色の補間を行うと、予期せずに灰色が現れることがあります。\">色</a>",
+    "ru": "<a href=\"/ru/docs/Web/CSS/color_value#Interpolation\" title=\"Значения типа данных CSS <цвет> интерполируются по каждой компоненте - красной, зелёной и голубой - как вещественные числа с плавающей запятой. Обратите внимание, что интерполяция цветов происходит в цветовом пространстве sRGBA, учитывающем прозрачность, для предотвращения появления неожиданных серых цветов.\">цвет</a>"
+  },
+  "colorPlusThreeAbsoluteLengths": {
+    "de": "eine Farbe plus drei absolute Längen",
+    "en-US": "a color plus three absolute lengths",
+    "fr": "une couleur et trois longueurs absolues",
+    "ja": "色、続けて絶対的な長さ 3 つ",
+    "ru": "цвет плюс три абсолютных длины"
+  },
+  "computedColor": {
+    "de": "berechnete Farbe",
+    "en-US": "computed color",
+    "fr": "couleur calculée",
+    "ja": "色の計算値",
+    "ru": "вычисленный цвет"
+  },
+  "consistsOfTwoDimensionKeywords": {
+    "de": "Besteht aus zwei Schlüsselwörtern, einem pro Richtung",
+    "en-US": "Consists of two keywords, one per dimension",
+    "fr": "Deux mots-clés, chacun décrivant une dimension",
+    "ru": "Состоит из двух ключевых слов, по одному на размер"
+  },
+  "consistsOfTwoKeywordsForOriginAndOffsets": {
+    "de": "Besteht aus zwei Schlüsselwörtern, die den Ursprung und die beiden Versätze vom Ursprung repräsentieren, wobei beide als absolute Länge angegeben werden (falls eine &lt;length&gt; angegeben wurde), ansonsten einen Prozentwert.",
+    "en-US": "Consists of two keywords representing the origin and two offsets from that origin, each given as an absolute length (if given a &lt;length&gt;), otherwise as a percentage.",
+    "fr": "Deux mots-clés décrivant l'origine et deux représentant les décalages par rapport à cette origine. Chaque valeur est fournie comme une longueur absolue ou comme un pourcentage.",
+    "ru": "Состоит из двух ключевых слов, представляющих начало координат и два смещения от этого начала, каждое из которых задаётся как абсолютная длина (если задана &lt;length&gt;), иначе как процент"
+  },
+  "continuous": {
+    "de": "fortlaufend",
+    "en-US": "continuous",
+    "fr": "continu",
+    "ru": "продолжительный"
+  },
+  "createsStackingContext": {
+    "de": "Erstellt <a href=\"/de/docs/Web/CSS/CSS_Positioning/z_index_verstehen/Der_Stackingkontext\">Stapelkontext</a>",
+    "en-US": "Creates <a href=\"/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context\">stacking context</a>",
+    "fr": "Crée un <a href=\"/fr/docs/Web/CSS/Comprendre_z-index/L'empilement_de_couches\">contexte d'empilement</a>",
+    "ja": "<a href=\"/ja/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context\">重ね合わせコンテキスト</a>の生成",
+    "ru": "Создаёт <a href=\"/ru/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context\">контекст наложения</a>"
+  },
+  "dependsOnLayoutModel": {
+    "de": "hängt vom Layoutmodell ab",
+    "en-US": "depends on layout model",
+    "fr": "dépend du modèle en couches",
+    "ru": "зависит от модели макета"
+  },
+  "dependsOnUserAgent": {
+    "de": "hängt vom User Agent ab",
+    "en-US": "depends on user agent",
+    "fr": "dépend de l'agent utilisateur",
+    "ja": "ユーザエージェントに依存",
+    "ru": "зависит от браузера"
+  },
+  "directChildrenOfElementsWithDisplayMozBoxMozInlineBox": {
+    "de": "Elemente, die direkte Kinder eines Elements mit einem CSS {{cssxref(\"display\")}} Wert von {{cssxref(\"-moz-box\")}} oder {{cssxref(\"-moz-inline-box\")}} oder {{cssxref(\"-webkit-box\")}} oder {{cssxref(\"-webkit-inline-box\")}} sind",
+    "en-US": "elements that are direct children of an element with a CSS {{cssxref(\"display\")}} value of {{cssxref(\"-moz-box\")}} or {{cssxref(\"-moz-inline-box\")}} or {{cssxref(\"-webkit-box\")}} or {{cssxref(\"-webkit-inline-box\")}}",
+    "fr": "éléments qui sont des fils direct d'un élément avec {{cssxref(\"display\")}} qui vaut {{cssxref(\"-moz-box\")}} ou {{cssxref(\"-moz-inline-box\")}} ou {{cssxref(\"-webkit-box\")}} ou {{cssxref(\"-webkit-inline-box\")}}",
+    "ru": "элементы, являющиеся прямыми потомками элемента со свойством {cssxref(\"display\")}} равным {{cssxref(\"-moz-box\")}}, {{cssxref(\"-moz-inline-box\")}}, {{cssxref(\"-webkit-box\")}} или {{cssxref(\"-webkit-inline-box\")}}"
+  },
+  "discrete": {
+    "de": "diskret",
+    "en-US": "discrete",
+    "fr": "discrète",
+    "ja": "個別"
+  },
+  "eachOfShorthandPropertiesExceptUnicodeBiDiAndDirection": {
+    "de": "wie jede der Kurzschreibweisen Eigenschaften (alle Eigenschaften außer {{cssxref(\"unicode-bidi\")}} und {{cssxref(\"direction\")}})",
+    "en-US": "as each of the properties of the shorthand (all properties but {{cssxref(\"unicode-bidi\")}} and {{cssxref(\"direction\")}})",
+    "fr": "comme pour chaque propriété de la propriété raccourcie (toutes les propriétés sauf {{cssxref(\"unicode-bidi\")}} et {{cssxref(\"direction\")}})",
+    "ru": "как у каждого из подсвойств этого свойства (все свойства, кроме {{cssxref(\"unicode-bidi\")}} и {{cssxref(\"direction\")}})"
+  },
+  "elementsWithDisplayBoxOrInlineBox": {
+    "de": "Elemente mit einem CSS {{cssxref(\"display\")}} Wert von <code>box</code> oder <code>inline-box</code>",
+    "en-US": "elements with a CSS {{cssxref(\"display\")}} value of <code>box</code> or <code>inline-box</code>",
+    "fr": "éléments avec {{cssxref(\"display\")}} qui vaut <code>box</code> ou <code>inline-box</code>",
+    "ja": "CSS の {{cssxref(\"display\")}} の値が <code>box</code> または <code>inline-box</code> である要素",
+    "ru": "элементы с значением свойства {{cssxref(\"display\")}} <code>box</code> или <code>inline-box</code>"
+  },
+  "elementsWithDisplayMarker": {
+    "de": "Elemente mit <code>{{cssxref(\"display\")}}: marker;</code>",
+    "en-US": "elements with <code>{{cssxref(\"display\")}}: marker;</code>",
+    "fr": "éléments avec <code>{{cssxref(\"display\")}}: marker;</code>",
+    "ru": "элементы с <code>{{cssxref(\"display\")}}: marker;</code>"
+  },
+  "elementsWithDisplayMozBoxMozInlineBox": {
+    "de": "Elemente mit einem CSS {{cssxref(\"display\")}} Wert von <code>-moz-box</code>, <code>-moz-inline-box</code>, <code>-webkit-box</code> oder <code>-webkit-inline-box</code>",
+    "en-US": "elements with a CSS {{cssxref(\"display\")}} value of <code>-moz-box</code>, <code>-moz-inline-box</code>, <code>-webkit-box</code> or <code>-webkit-inline-box</code>",
+    "fr": "éléments dont CSS {{cssxref(\"display\")}} vaut <code>-moz-box</code>, <code>-moz-inline-box</code>, <code>-webkit-box</code> ou <code>-webkit-inline-box</code>",
+    "ru": "элементы со значением {{cssxref(\"display\")}}: <code>-moz-box</code>, <code>-moz-inline-box</code>, <code>-webkit-box</code> или <code>-webkit-inline-box</code>"
+  },
+  "elementsWithOverflowNotVisibleAndReplacedElements": {
+    "de": "Elemente, deren {{cssxref(\"overflow\")}} nicht <code>visible</code> ist, und optional ersetzte Elemente, die Bilder oder Videos repräsentieren, und iframes",
+    "en-US": "elements with {{cssxref(\"overflow\")}} other than <code>visible</code>, and optionally replaced elements representing images or videos, and iframes",
+    "fr": "éléments dont {{cssxref(\"overflow\")}} ne vaut pas <code>visible</code> et éventuellement les éléments remplacés qui représentent des images, des vidéos ou des iframes",
+    "ru": "элементы с {{cssxref(\"overflow\")}} отличным от <code>visible</code>, и опционально заменяемые элементы представляющие собой картинки, видео и iframe"
+  },
+  "exclusionElements": {
+    "en-US": "exclusion elements"
+  },
+  "filterList": {
+    "de": "eine <a href=\"/de/docs/Web/CSS/filter#Interpolation\" title=\"Falls beide Filter Funktionslisten gleicher Länge ohne URLs haben, wird jede der Filterfunktionen nach ihren spezifischen Regeln interpoliert. Falls sie unterschiedliche Längen haben, werden die fehlenden äquivalenten Filterfunktionen der längeren Liste unter Verwendung der Standardwerte an das Ende der kürzeren Liste angehängt, anschließend werden alle Filterfunktionen entsprechend ihrer spezifischen Regeln interpoliert. Falls ein Filter 'none' ist, wird er durch die Filterfunktionsliste der anderen unter Verwendung der Standardwerte ersetzt, anschließend werden alle Filterfunktionen entsprechend ihrer spezifischen Regeln interpoliert. Ansonsten wird diskrete Interpolation verwendet.\">Filterfunktionsliste</a>",
+    "en-US": "a <a href=\"/en-US/docs/Web/CSS/filter#Interpolation\" title=\"If both filters have a function list of same length without URL, each of their filters functions is interpolated according to its specific rules. If they have different lengths, the missing equivalent filter functions from the longer list are added to the end of the shorter list using their default values, then all filter functions are interpolated according to their specific rules. If one filter is 'none', it is replaced with the filter functions list of the other one using the filter function default values, then all filter functions are interpolated according to their specific rules. Otherwise discrete interpolation is used.\">filter function list</a>",
+    "fr": "une <a href=\"/fr/docs/Web/CSS/filter#Interpolation\" title=\"Si les deux filtres ont une liste de fonctions de même longueur sans URL, chaque fonction de filtre est interpolée selon les règles qui lui sont propres. Si elles sont de longueur différente, les dernières fonctions de filtre de la liste la plus longue sont ajoutées à la liste la plus courte avec leurs valeurs par défaut et ensuite, toutes les fonctions de filtre sont interpolées entre elles selon leurs règles spécifiques. Dans les autres cas, c'est une interpolation discrète qui est utilisée.\">liste de fonctions de filtre</a>"
+  },
+  "firstLetterPseudoElementsAndInlineLevelFirstChildren": {
+    "de": "{{cssxref(\"::first-letter\")}} Pseudoelemente und Inline-Level-Elemente, die die ersten Kinder eines Blockcontainers sind",
+    "en-US": "{{cssxref(\"::first-letter\")}} pseudo-elements and inline-level first child of a block container",
+    "fr": "pseudo-éléments {{cssxref(\"::first-letter\")}} et le premier fils, en ligne (<i>inline</i>) d'un conteneur de bloc",
+    "ru": "{{cssxref(\"::first-letter\")}} псевдоэлементы и первые строчные потомки блока"
+  },
+  "flexContainers": {
+    "de": "flexible Container",
+    "en-US": "flex containers",
+    "fr": "conteneurs flexibles",
+    "ru": "flex-контейнеры"
+  },
+  "flexItemsAndAbsolutelyPositionedFlexContainerChildren": {
+    "de": "flexible Elemente und absolut positionierte Flexcontainerkinder",
+    "en-US": "flex items and absolutely-positioned flex container children",
+    "fr": "éléments flexibles, ainsi que les enfants absolument positionnés de conteneurs flexibles",
+    "ru": "flex-элементы и абсолютно-позицированые потомки flex-контейнера"
+  },
+  "flexItemsAndInFlowPseudos": {
+    "de": "flexible Elemente einschließlich In-Flow-Pseudo-Elemente",
+    "en-US": "flex items, including in-flow pseudo-elements",
+    "fr": "éléments flexibles, y compris les pseudo-éléments intégrés dans le flux",
+    "ja": "フロー内の疑似要素を含むフレックスアイテム",
+    "ru": "flex-элементы, в том числе в потоке псевдоэлементов"
+  },
+  "flexItemsGridItemsAbsolutelyPositionedContainerChildren": {
+    "en-US": "Flex items, grid items, and absolutely-positioned flex and grid container children",
+    "ru": "flex-элементы, grid-элементы и абсолютно спозиционированные потомки flex- и grid-контейнеров"
+  },
+  "flexItemsGridItemsAndAbsolutelyPositionedBoxes": {
+    "en-US": "flex items, grid items, and absolutely-positioned boxes"
+  },
+  "floats": {
+    "de": "Flusselemente",
+    "en-US": "floats",
+    "fr": "flottants",
+    "ru": "плавает"
+  },
+  "fontStretch": {
+    "de": "<a href=\"/de/docs/Web/CSS/font-stretch#Interpolation\">Schriftbreite</a>",
+    "en-US": "a <a href=\"/en-US/docs/Web/CSS/font-stretch#Interpolation\" title=\"Font stretch values are interpolated in discrete steps. The interpolation happens as though the ordered values are equally spaced real numbers; the result is rounded to the nearest value, with values exactly halfway between two values rounded towards the later value, that is the most expanded one.\">font stretch</a>",
+    "fr": "une <a href=\"/fr/docs/Web/CSS/font-stretch#Interpolation\" title=\"Les valeurs de font stretch sont interpolées de façon discrète. L'interpolation s'effectue comme si les valeurs, dans l'ordre, étaient des nombres également distribués : le résultat est arrondi à la valeur la plus proche, les valeurs situées exactement entre deux valeurs sont arrondies à la valeur supérieure.\"><code>font stretch</code></a>",
+    "ja": "<a href=\"/ja/docs/Web/CSS/font-stretch#Interpolation\" title=\"Font stretch values are interpolated in discrete steps. The interpolation happens as though the ordered values are equally spaced real numbers; the result is rounded to the nearest value, with values exactly halfway between two values rounded towards the later value, that is the most expanded one.\">font stretch</a>",
+    "ru": "<a href=\"/ru/docs/Web/CSS/font-stretch#Interpolation\" title=\"Значения ширины начертания шрифта интерполируются по дискретным шагам. Интерполяция происходит по упорядоченно расположенным значениям в пространстве действительных чисел; результат округляется к ближайшему значению, точно между двумя соседними значениями, округляется в сторону большего значения, которое является наиболее широким.\">ширина начертания шрифта</a>"
+  },
+  "fontWeight": {
+    "de": "<a href=\"/de/docs/Web/CSS/font-weight#Interpolation\">Schriftgewichtung</a>",
+    "en-US": "a <a href=\"/en-US/docs/Web/CSS/font-weight#Interpolation\" title=\"Font weight values are interpolated via discrete steps (multiples of 100). The interpolation happens in real number space and is converted to an integer by rounding to the nearest multiple of 100, with values halfway between multiples of 100 rounded towards positive infinity.\">font weight</a>",
+    "fr": "une <a href=\"/fr/docs/Web/CSS/font-weight#Interpolation\" title=\"Les valeurs de graisse de police sont interpolées via des étapes discrètes (multiple de 100). L'interpolation a lieu dans un espace de nombres réels et est convertis en un entier arroundi au plus proche multiple de 100, avec les valeurs à mis chemin entre les multiples de 100, arrondies vers l'infini positif.\">graisse de police</a>",
+    "ja": "<a href=\"/ja/docs/Web/CSS/font-weight#Interpolation\" title=\"Font weight values are interpolated via discrete steps (multiples of 100). The interpolation happens in real number space and is converted to an integer by rounding to the nearest multiple of 100, with values halfway between multiples of 100 rounded towards positive infinity.\">font weight</a>",
+    "ru": "<a href=\"/ru/docs/Web/CSS/font-weight#Interpolation\" title=\"Значения жирности шрифта интерполируются через целое число дискретных шагов (умноженных на 100). Интерполяция происходит в пространстве действительных чисел, а получившееся значение преобразуется в целое путём округления до ближайшей сотни, со значениями точно между соседними множителями, округляемыми в сторону положительной бесконечности.\">жирность шрифта</a>"
+  },
+  "forLengthAbsoluteValueOtherwisePercentage": {
+    "de": "for {{xref_csslength}} the absolute value, otherwise a percentage",
+    "en-US": "for {{xref_csslength}} the absolute value, otherwise a percentage",
+    "fr": "pour une valeur de type {{xref_csslength}} sa valeur absolue, sinon un pourcentage",
+    "ja": "{{xref_csslength}} の場合は絶対的な値、さもなくばパーセンテージ",
+    "ru": "для {{xref_csslength}} абсолютное значение, иначе процент"
+  },
+  "gridContainers": {
+    "de": "Gridcontainer",
+    "en-US": "grid containers",
+    "fr": "conteneurs de grille",
+    "ru": "сеточные контейнеры"
+  },
+  "gridContainersWithMasonryLayout": {
+    "en-US": "Grid containers with masonry layout"
+  },
+  "gridContainersWithMasonryLayoutInTheirBlockAxis": {
+    "en-US": "Grid containers with masonry layout in their block axis"
+  },
+  "gridContainersWithMasonryLayoutInTheirInlineAxis": {
+    "en-US": "Grid containers with masonry layout in their inline axis"
+  },
+  "gridItemsAndBoxesWithinGridContainer": {
+    "de": "Gridelemente und absolut positionierte Boxen, deren beinhaltender Block ein Gridcontainer ist",
+    "en-US": "grid items and absolutely-positioned boxes whose containing block is a grid container",
+    "fr": "élements de grilles et boîtes positionnées de façon absolue dont le bloc englobant est un conteneur de grille",
+    "ru": "элементы сетки и абсолютно-позиционированные блоки, находящиеся в сеточном контейнере"
+  },
+  "iframeElements": {
+    "en-US": "iframe elements"
+  },
+  "images": {
+    "de": "Bilder",
+    "en-US": "images",
+    "fr": "images",
+    "ru": "изображения"
+  },
+  "inFlowBlockLevelElements": {
+    "de": "in-flow block-level Elemente",
+    "en-US": "in-flow block-level elements",
+    "fr": "éléments de type bloc participant au flux",
+    "ja": "フロート内に配置された、フローティングや絶対配置がなされていない全てのブロックレベル要素",
+    "ru": "блочные элементы в потоке"
+  },
+  "inFlowChildrenOfBoxElements": {
+    "de": "Flusskindelemente von Boxelementen",
+    "en-US": "in-flow children of box elements",
+    "fr": "les éléments fils dans le flux des éléments de boîte",
+    "ru": "потомки блочных элементов в потоке"
+  },
+  "inlineAxisHorizontalInXUL": {
+    "de": "<code>inline-axis</code> (<code>horizontal</code> in <a href=\"/de/docs/Mozilla/Tech/XUL\">XUL</a>)",
+    "en-US": "<code>inline-axis</code> (<code>horizontal</code> in <a href=\"/en-US/docs/Mozilla/Tech/XUL\">XUL</a>)",
+    "fr": "<code>inline-axis</code> (<code>horizontal</code> en <a href=\"/fr/docs/Mozilla/Tech/XUL\">XUL</a>)",
+    "ru": "<code>inline-axis</code> (<code>horizontal</code> в <a href=\"/ru/docs/Mozilla/Tech/XUL\">XUL</a>)"
+  },
+  "inlineLevelAndTableCellElements": {
+    "de": "Inline- und table-cell Elemente",
+    "en-US": "inline-level and table-cell elements",
+    "fr": "éléments en ligne et à ceux qui sont des cellules de tableau",
+    "ja": "インラインレベルとテーブルセル要素",
+    "ru": "строчным элементам и ячейкам таблиц"
+  },
+  "inlineSizeOfContainingBlock": {
+    "de": "Inlinegröße des beinhaltenden Blocks",
+    "en-US": "inline-size of containing block",
+    "fr": "la taille en ligne du bloc englobant",
+    "ru": "встроенный размер содержащего блока"
+  },
+  "integer": {
+    "de": "<a href=\"/de/docs/Web/CSS/integer#Interpolation\">Integer</a>",
+    "en-US": "an <a href=\"/en-US/docs/Web/CSS/integer#Interpolation\" title=\"Values of the <integer> CSS data type are interpolated via integer discrete steps. The calculation is done as if they were real, floating-point numbers and the discrete value is obtained using the floor function.\">integer</a>",
+    "fr": "un <a href=\"/fr/docs/Web/CSS/integer#Interpolation\" title=\"Les valeurs du type <entier> sont interpolées par incrémentation discrète. Le calcul est réalisé comme si les valeurs étaient des nombres réels, en virgule flottante et la valeur discrète est obtenue en utilisant la fonction partie entière.\">entier</a>",
+    "ja": "<a href=\"/ja/docs/Web/CSS/integer#Interpolation\" title=\"Values of the <integer> CSS data type are interpolated via integer discrete steps. The calculation is done as if they were real, floating-point numbers and the discrete value is obtained using the floor function.\">integer</a>",
+    "ru": "<a href=\"/ru/docs/Web/CSS/integer#Interpolation\" title=\"Значения типа данных CSS <целое число> интерполируются через целое число дискретных шагов. Вычисления производятся словно над вещественными числами с плавающей запятой, а дискретные значения получаются с использованием функции floor.\">целое число</a>"
+  },
+  "interactive": {
+    "de": "interaktiv",
+    "en-US": "interactive",
+    "fr": "interactif",
+    "ru": "интерактивный"
+  },
+  "invertForTranslucentColorRGBAOtherwiseRGB": {
+    "de": "Für das Schlüsselwort <code>invert</code> ist der berechnete Wert <code>invert</code>. Für den Farbwert, falls der Wert durchscheinend ist, ist der berechnete Wert der entsprechende <code>rgba()</code> Wert. Falls nicht, ist er der entsprechende <code>rgb()</code> Wert. Das Schlüsselwort <code>transparent</code> wird zu <code>rgba(0,0,0,0)</code>.",
+    "en-US": "For the keyword <code>invert</code>, the computed value is <code>invert</code>. For the color value, if the value is translucent, the computed value will be the <code>rgba()</code> corresponding one. If it isn't, it will be the <code>rgb()</code> corresponding one. The <code>transparent</code> keyword maps to <code>rgba(0,0,0,0)</code>.",
+    "fr": "Pour le mot-clé <code>invert</code>, la valeur calculée est <code>invert</code>. Pour la valeur de la couleur, si la valeur est transparente, la valeur calculée sera la valeur <code>rgba()</code> correspondante. S'il n'y en a pas, ce sera la valeur <code>rgb()</code> correspondante. Le mot-clé <code>transparent</code> correspondra à <code>rgba(0,0,0,0)</code>.",
+    "ja": "キーワード <code>invert</code> が指定されると計算値も <code>invert</code>。色が指定されると、半透明なら、計算値はそれに一致する<code>rbga()</code> で、不透明なら、それに一致する <code>rgb()</code>。キーワード <code>transparent</code> は <code>rgba(0,0,0,0)</code> にマップされます",
+    "ru": "Для ключевого слова <code>invert</code>, значение - <code>invert</code>. Для значения цвета, если значение имеет прозрачность, соответственно, значение будет через <code>rgba()</code>. Если это не так, это будет <code>rgb()</code>. Ключевое слово <code>transparent</code> отображается, как <code>rgba(0,0,0,0)</code>."
+  },
+  "invertOrCurrentColor": {
+    "de": "<code>invert</code> für Browser, die es unterstützen, <code>currentColor</code> für die anderen",
+    "en-US": "<code>invert</code>, for browsers supporting it, <code>currentColor</code> for the other",
+    "fr": "<code>invert</code>, pour les navigateurs le supportant, <code>currentColor</code> pour les autres",
+    "ja": "ブラウザーが対応していれば <code>invert</code>、そうでなければ <code>currentColor</code>",
+    "ru": "<code>invert</code> для браузеров поддерживающих это, <code>currentColor</code> для остальных"
+  },
+  "keywordOrNumericalValueBolderLighterTransformedToRealValue": {
+    "de": "das Schlüsselwort oder der numerische Wert wie angegeben, wobei <code>bolder</code> und <code>lighter</code> in einen realen Wert umgewandelt werden",
+    "en-US": "the keyword or the numerical value as specified, with <code>bolder</code> and <code>lighter</code> transformed to the real value",
+    "fr": "le mot-clé ou la valeur numérique, comme spécifié, transformé en la valeur réelle avec <code>bolder</code> et <code>lighter</code>",
+    "ru": "ключевое слово или числовое значение, с <code>bolder</code> и <code>lighter</code>, трансформируемися в действительное значение"
+  },
+  "keywordPlusIntegerIfDigits": {
+    "de": "angegebenes Schlüsselwort plus Ganzzahl, falls 'digits'",
+    "en-US": "specified keyword, plus integer if 'digits'",
+    "fr": "le mot-clé spécifié suivi d'un entier si 'digits'",
+    "ja": "指定されたキーワード、'digits' の場合は続けて整数",
+    "ru": "указанное ключевое слово, плюс целые числа, если цифры"
+  },
+  "length": {
+    "de": "<a href=\"/de/docs/Web/CSS/length#Interpolation\">Längenangabe</a>",
+    "en-US": "a <a href=\"/en-US/docs/Web/CSS/length#Interpolation\" title=\"Values of the <length> CSS data type are interpolated as real, floating-point numbers.\">length</a>",
+    "fr": "une <a href=\"/fr/docs/Web/CSS/longueur#Interpolation\" title=\"Les valeurs du type <longueur> sont interpolées comme des nombres réels à virgule flottante.\">longueur</a>",
+    "ja": "<a href=\"/ja/docs/Web/CSS/length#Interpolation\" title=\"Values of the <length> CSS data type are interpolated as real, floating-point numbers.\">length</a>",
+    "ru": "<a href=\"/ru/docs/Web/CSS/length#Interpolation\" title=\"Значения типа данных CSS <длина> интерполируются как вещественные числа с плавающей запятой.\">длина</a>"
+  },
+  "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto": {
+    "de": "falls als Länge angegeben, die zugehörige absolute Länge; falls als Prozentwert angegeben, der angegebene Wert; ansonsten <code>auto</code>",
+    "en-US": "if specified as a length, the corresponding absolute length; if specified as a percentage, the specified value; otherwise, <code>auto</code>",
+    "fr": "si spécifié par une longueur, la valeur absolue correspondante; si spécifié par un pourcentage, la valeur telle que spécifiée; sinon, <code>auto</code>",
+    "ja": "長さで指定されると相当する絶対的な長さ、パーセンテージとして指定されると指定値、それ以外では auto",
+    "ru": "если указано как длина - абсолютная длина; если указано как проценты - заданное значение; в противном случае <code>auto</code>"
+  },
+  "lengthOrPercentageBeforeKeywordIfBothPresent": {
+    "de": "die Länge oder der Prozentwert vor dem Schlüsselwort, falls beide vorhanden sind",
+    "en-US": "the length or percentage before the keyword, if both are present",
+    "fr": "la longueur ou le pourcentage avant le mot-clé si les deux sont présents",
+    "ru": "длина или проценты перед ключевым словом, если присутствуют оба"
+  },
+  "lengthOrPercentageBeforeKeywords": {
+    "de": "Die Länge oder der Prozentwert vor den Schlüsselwörtern, falls beide angegeben wurden. Falls mehrere Schlüsselwörter angegeben wurden, erscheinen sie in derselben Reihenfolge, wie in der formellen Grammatik angegeben.",
+    "en-US": "The length or percentage before the keywords, if both are present. If several keywords are present, they appear in the same order as their appearance in the formal grammar.",
+    "fr": "La longueur ou le pourcentage avant les mots-clés, si les deux sont présents. Si plusieurs mots-clés sont présents, ils apparaissent dans le même ordre que dans la grammaire formelle.",
+    "ru": "Длина или процент до ключевых слов, если присутствуют оба. Если присутствуют несколько ключевых слов, они появляются в том же порядке, как и в формальной грамматике."
+  },
+  "lengthsAsPercentages": {
+    "en-US": "The lengths may be specified as percentages"
+  },
+  "listEachItemConsistingOfAbsoluteLengthPercentageAndOrigin": {
+    "de": "Eine Liste, bei der jeder Eintrag aus einem Versatz besteht, der durch eine Kombination aus absoluter Länge und einem Prozentsatz plus einem Ursprungsschlüsselwort definiert wird",
+    "en-US": "A list, each item consisting of: an offset given as a combination of an absolute length and a percentage, plus an origin keyword",
+    "fr": "Une liste dont chaque élément se comompose d'un décalage (exprimé comme la combinaison d'une longueur absolue et d'un pourcentage) et d'un mot-clé pour l'origine",
+    "ru": "Список, каждый элемент которого состоит из: смещения, данного комбинацией абсолютной длины и процентов плюс ключевое слово"
+  },
+  "listEachItemHasTwoKeywordsOnePerDimension": {
+    "de": "eine Liste, wobei jedes Element aus zwei Schlüsselwörtern besteht, eins pro Dimension",
+    "en-US": "a list, each item consisting of two keywords, one per dimension",
+    "fr": "une liste dont chaque élément consiste en deux mots-clé, un par dimension",
+    "ru": "список, каждый элемент которого содержит 2 ключевых слова, по одному на размер"
+  },
+  "listEachItemTwoKeywordsOriginOffsets": {
+    "de": "a list, each item consisting of two keywords representing the origin undtwo offsets from that origin, each given as an absolute length (if given a {{xref_csslength}}), otherwise as a percentage",
+    "en-US": "a list, each item consisting of two keywords representing the origin and two offsets from that origin, each given as an absolute length (if given a {{xref_csslength}}), otherwise as a percentage",
+    "fr": "une liste dont chaque élément consiste en deux mots-clé représentant l'origine et deux offsets depuis cette origine, chacun étant une longueur absolue (si spécifié comme une {{xref_csslength}}), ou un pourcentage",
+    "ru": "список, каждый элемент которого состоит из двух ключевых слов, представляющих начало координат и два смещения от этого начала, каждое из которых задаётся абсолютной длиной (если дано {{xref_csslength}}), иначе как проценты"
+  },
+  "listItems": {
+    "de": "Listenelemente",
+    "en-US": "list items",
+    "fr": "éléments de liste",
+    "ja": " リスト項目",
+    "ru": "список элементов"
+  },
+  "listSeparator": {
+    "de": ", ",
+    "en-US": ", ",
+    "fr": ", ",
+    "ja": "、",
+    "ru": ", "
+  },
+  "logicalHeightOfContainingBlock": {
+    "de": "logische Höhe des beinhaltenden Blocks",
+    "en-US": "logical-height of containing block",
+    "fr": "hauteur logique du bloc englobant",
+    "ru": "логическая высота контейнера"
+  },
+  "logicalWidthOfContainingBlock": {
+    "de": "logische Breite des beinhaltenden Blocks",
+    "en-US": "logical-width of containing block",
+    "fr": "largeur logique du bloc englobant",
+    "ru": "логическая высота содержащего блока"
+  },
+  "lpc": {
+    "de": "$1$, <a href=\"/de/docs/Web/CSS/percentage#Interpolation\">Prozentsatz</a> oder <a href=\"/de/docs/Web/CSS/calc\"><code>calc()</code></a>;",
+    "en-US": "$1$, <a href=\"/en-US/docs/Web/CSS/percentage#Interpolation\" title=\"Values of the <percentage> CSS data type are interpolated as real, floating-point numbers.\">percentage</a> or calc();",
+    "fr": "$1$, <a href=\"/fr/docs/Web/CSS/percentage#Interpolation\" title=\"Les valeurs du type <pourcentage> sont interpolées comme des nombres réels à virgule flottante.\">pourcentage</a> ou calc()&nbsp;;",
+    "ja": "$1$ または <a href=\"/ja/docs/Web/CSS/percentage#Interpolation\" title=\"Values of the <percentage> CSS data type are interpolated as real, floating-point numbers.\">percentage</a>, calc();",
+    "ru": "$1$, <a href=\"/ru/docs/Web/CSS/percentage#Interpolation\" title=\"Значения типа данных CSS <проценты> интерполируются как вещественные числа с плавающей запятой.\">проценты</a> или calc();"
+  },
+  "lpcNote": {
+    "de": " wenn beides Längenwerte sind, werden sie als Längenwerte gehandhabt. Wenn beides Prozentsätze sind, werden sie als Prozentsätze gehandhabt. Ansonsten werden beide Werte wie in einer <code>calc()</code> Funktion addiert (Wird ggf. zu Null). Und bei diesen <code>calc()</code> Funktionen wird jede Hälfte als Realzahl interpoliert. ",
+    "en-US": " when both values are lengths, they are interpolated as lengths; when both values are percentages, they are interpolated as percentages; otherwise, both values are converted into a <code>calc()</code> function that is the sum of a length and a percentage (each possibly zero), and these <code>calc()</code> functions have each half interpolated as real numbers. ",
+    "fr": " quand les deux valeurs sont des longueurs, elles sont interpolées comme des longueurs&nbsp;; quand les deux valeurs sont des pourcentages, elles sont interpolées comme des pourcentages ; sinon, les deux valeurs sont converties dans une fonction <code>calc()</code> qui est la somme d'une longueur et d'un pourcentage (chaque valeur pouvant être à zéro), et cette fonction <code>calc()</code> interpole chaque moitié comme un nombre réel. ",
+    "ja": "。両方の値が length の場合は、length 値として補完されます。両方の値が percentage の場合は、percentage 値として補完されます。それ以外の場合は、両方の値が calc() 関数にコンバートされ、length と percentage の合計になります (または各値が 0)。そして、これらの <code>calc()</code> 関数は、それぞれ半分ずつ補完された実数を持ちます",
+    "ru": " когда оба значения являются длинами, они интерполируются как длины; когда оба значения являются процентами, они интерполируются как проценты; в остальных случаях, оба значения преобразуются функцией <code>calc()</code> в сумму длины и процента (каждый из них может быть равен нулю), а затем эта функция интерполирует каждую половину как вещественные числа."
+  },
+  "maskElements": {
+    "de": "{{SVGElement(\"mask\")}} Elemente",
+    "en-US": "{{SVGElement(\"mask\")}} elements",
+    "fr": "les éléments {{SVGElement(\"mask\")}}",
+    "ru": "{{SVGElement(\"mask\")}} элементы"
+  },
+  "maxZoomFactor": {
+    "en-US": "The largest allowed zoom factor. A zoom factor of 100% corresponds to no zooming. Larger values zoom in. Smaller values zoom out."
+  },
+  "media": {
+    "de": "Medien",
+    "en-US": "Media",
+    "fr": "Média",
+    "ja": "メディア",
+    "pt-BR": "Midia",
+    "ru": "Отображение",
+    "zh-CN": "适用媒体"
+  },
+  "minZoomFactor": {
+    "en-US": "The smallest allowed zoom factor. A zoom factor of 100% corresponds to no zooming. Larger values zoom in. Smaller values zoom out."
+  },
+  "multicolElements": {
+    "de": "mehrspaltige Elemente",
+    "en-US": "multicol elements",
+    "fr": "éléments sur plusieurs colonnes",
+    "ja": "段組み要素",
+    "ru": "мультиколоночные элементы"
+  },
+  "multiColumnElementsFlexContainersGridContainers": {
+    "en-US": "multi-column elements, flex containers, grid containers",
+    "ja": "段組み要素, フレックスコンテナー, グリッドコンテナー"
+  },
+  "multilineFlexContainers": {
+    "de": "mehrzeilige flexible Container",
+    "en-US": "multi-line flex containers",
+    "fr": "conteneurs flexibles multi-lignes",
+    "ru": "мультистрочные flex-контейнеры"
+  },
+  "no": {
+    "de": "Nein",
+    "en-US": "no",
+    "fr": "non",
+    "ja": "なし",
+    "pt-BR": "não",
+    "ru": "нет",
+    "zh-CN": "否"
+  },
+  "noneButOverriddenInUserAgentCSS": {
+    "de": "<code>none</code> (aber dieser Wert wird im User Agent CSS überschrieben)",
+    "en-US": "<code>none</code> (but this value is overridden in the user agent CSS)",
+    "fr": "<code>none</code> (cette valeur est surchargée par le CSS de l'agent utilisateur)",
+    "ru": "<code>none</code> (но это значение перезаписано в дефолтном CSS браузера)"
+  },
+  "noneOrImageWithAbsoluteURI": {
+    "de": "<code>none</code> oder das Bild mit absoluter URI",
+    "en-US": "<code>none</code> or the image with its URI made absolute",
+    "fr": "<code>none</code> ou l'image avec son URI rendue absolue",
+    "ja": "<code>none</code> または画像の絶対的 URI",
+    "ru": "<code>none</code> или изображение с абсолютным URI"
+  },
+  "nonReplacedBlockAndInlineBlockElements": {
+    "de": "nicht ersetzte Blocklevel Elemente und nicht ersetzte Inlineblock Elemente",
+    "en-US": "non-replaced block-level elements and non-replaced inline-block elements",
+    "fr": "les éléments de bloc non remplacés et les éléments en bloc en ligne et en bloc (inline-block)",
+    "ja": "非置換ブロックレベル要素と非置換インラインブロック要素",
+    "ru": "не заменяемые блочные и inline-block элементы"
+  },
+  "nonReplacedBlockElements": {
+    "de": "Nicht ersetzte <code>block</code>-Elemente (außer <code>table</code>-Elemente), <code>table-cell</code>- oder <code>inline-block</code>-Elemente",
+    "en-US": "non-replaced <code>block</code> elements (except <code>table</code> elements), <code>table-cell</code> or <code>inline-block</code> elements",
+    "fr": "éléments non-remplacés de type <code>block</code> ou <code>table</code>, ou éléments de type <code>table-cell</code> ou <code>inline-block</code>",
+    "ja": "非置換ブロック要素(テーブル要素を除く)、テーブルセル、インラインブロック要素",
+    "ru": "не заменяемые блочные элементы (кроме элементов <code>table</code>), <code>table-cell</code> или <code>inline-block</code> элементы"
+  },
+  "nonReplacedElements": {
+    "en-US": "non-replaced elements"
+  },
+  "nonReplacedInlineElements": {
+    "de": "nicht ersetzte Inlineelemente",
+    "en-US": "non-replaced inline elements",
+    "fr": "les éléments en ligne non remplacés",
+    "ja": "非置換インライン要素",
+    "ru": "не заменяемые строчные элементы"
+  },
+  "noPracticalInitialValue": {
+    "de": "Es gibt keinen praktischen Initialwert dafür.",
+    "en-US": "There is no practical initial value for it.",
+    "fr": "Il n'y a pas de valeur initiale pour cela.",
+    "ru": "На практике начального значения нет"
+  },
+  "noPracticalMedia": {
+    "de": "Es gibt kein praktisches Medium dafür.",
+    "en-US": "There is no practical media for it.",
+    "fr": "Il n'y a pas de média pour cela.",
+    "ru": "Для этого нет практического применения."
+  },
+  "normalizedAngle": {
+    "de": "normalisierter Winkel",
+    "en-US": "normalized angle",
+    "fr": "angle normalisé",
+    "ru": "нормализованный угол"
+  },
+  "normalOnElementsForPseudosNoneAbsoluteURIStringOrAsSpecified": {
+    "de": "Bei Elementen ist der berechnete Wert immer <code>normal</code>. Falls bei {{cssxref(\"::before\")}} und {{cssxref(\"::after\")}} <code>normal</code> angegeben ist, ist der berechnete Wert <code>none</code>. Ansonsten, für URI Werte die absolute URI; für <code>attr()</code> Werte der resultierende String; für andere Schlüsselwörter wie angegeben.",
+    "en-US": "On elements, always computes to <code>normal</code>. On {{cssxref(\"::before\")}} and {{cssxref(\"::after\")}}, if <code>normal</code> is specified, computes to <code>none</code>. Otherwise, for URI values, the absolute URI; for <code>attr()</code> values, the resulting string; for other keywords, as specified.",
+    "fr": "Sur les éléments, le résultat du calcul est toujours <code>normal</code>. Sur {{cssxref(\"::before\")}} et {{cssxref(\"::after\")}}, si <code>normal</code> est spécifié, cela donnera <code>none</code>. Sinon, pour les valeurs d'URI, on aura l'URI absolue ; pour les valeurs <code>attr()</code>, on aura la chaine résultante ; pour les autres mots-clé, ce sera comme spécifié.",
+    "ja": "通常要素で使われると常に <code>normal</code>。{{cssxref(\"::before\")}} 及び {{cssxref(\"::after\")}} では: <code>normal</code> の指定があれば計算値は <code>none</code>。指定がなければ、<ul><li>URI 値は、絶対的 URI となる</li><li><code>attr()</code> 値は、計算値の文字列となる</li><li>その他のキーワードについては指定どおり</li></ul>",
+    "ru": "На элементах всегда вычисляется как <code>normal</code>. На {{cssxref(\"::before\")}} и {{cssxref(\"::after\")}}, если <code>normal</code> указано, интерпретируется как <code>none</code>. Иначе, для значений URI, абсолютного URI; для значений <code>attr()</code> - результирующая строка; для других ключевых слов, как указано."
+  },
+  "notAnimatable": {
+    "en-US": "Not animatable"
+  },
+  "number": {
+    "de": "<a href=\"/de/docs/Web/CSS/number#Interpolation\">Nummer</a>",
+    "en-US": "a <a href=\"/en-US/docs/Web/CSS/number#Interpolation\" title=\"Values of the <number> CSS data type are interpolated as real, floating-point, numbers.\">number</a>",
+    "fr": "un <a href=\"/fr/docs/Web/CSS/nombre#Interpolation\" title=\"Les valeurs du type <nombre> sont interpolées comme des nombres réels, en virgule flottante.\">nombre</a>",
+    "ja": "<a href=\"/ja/docs/Web/CSS/number#Interpolation\" title=\"Values of the <number> CSS data type are interpolated as real, floating-point, numbers.\">number</a>",
+    "ru": "<a href=\"/ru/docs/Web/CSS/number#Interpolation\" title=\"Значения типа данных CSS <число> интерполируются как вещественные числа с плавающей запятой.\">число</a>"
+  },
+  "numberOrLength": {
+    "en-US": "either number or length",
+    "ru": "число или длина"
+  },
+  "oneOrTwoValuesLengthAbsoluteKeywordsPercentages": {
+    "de": "Einer oder mehrere Werte, mit absolut gemachten Längen und Schlüsselwörtern zu Prozentwerten umgewandelt",
+    "en-US": "One or two values, with length made absolute and keywords translated to percentages",
+    "fr": "Une ou deux valeurs, avec la longueur en absolue et les mots-clés traduits en pourcentage",
+    "ru": "Одно или два значения, с абсолютной длинной и ключевыми словами, переведёнными в проценты"
+  },
+  "oneToFourPercentagesOrAbsoluteLengthsPlusFill": {
+    "de": "ein bis vier Prozentwert(e) (wie angegeben) oder absolute Länge(n) plus das Schlüsselwort <code>fill</code>, falls angegeben",
+    "en-US": "one to four percentage(s) (as specified) or absolute length(s), plus the keyword <code>fill</code> if specified",
+    "fr": "un à quatre pourcentages, comme spécifiés, ou des longueurs absolues, suivis par le mot-clé <code>fill</code> si spécifié",
+    "ja": "1 つから 4 つのパーセンテージ値(指定値)または絶対的な長さ。指定されていれば続けてキーワード <code>fill</code>",
+    "ru": "одно к четырём процентам (как указано) или абсолютной длине(ам), плюс ключевое слово <code>fill</code>, если указано"
+  },
+  "optimumMinAndMaxValueOfAbsoluteLengthPercentageOrNormal": {
+    "de": "ein optimaler, minimaler und maximaler Wert, jeder bestehend aus entweder einer absoluten Länge, einem Prozentwert oder dem Schlüsselwort <code>normal</code>",
+    "en-US": "an optimum, minimum, and maximum value, each consisting of either an absolute length, a percentage, or the keyword <code>normal</code>",
+    "fr": "trois valeurs, optimale, minimale et maximale, chacune consitant en une longueur absolue, un pourcentage ou le mot-clé <code>normal</code>",
+    "ja": "それぞれ絶対指定の length、percentage、キーワード <code>normal</code>のいずれかである、最適値、最小値、最大値",
+    "ru": "оптимальное, минимальное и максимальное значения, каждое из которых абсолютная длина, проценты или ключевое слово <code>normal</code>"
+  },
+  "optimumValueOfAbsoluteLengthOrNormal": {
+    "de": "ein optimaler Wert, der entweder aus einer absoluten Länge oder dem Schlüsselwort <code>normal</code> besteht",
+    "en-US": "an optimum value consisting of either an absolute length or the keyword <code>normal</code>",
+    "fr": "une valeur optimale consistant en une longueur absolue ou <code>normal</code>",
+    "ru": "оптимальное значение состоит из абсолютной длины или ключевого слова <code>normal</code>"
+  },
+  "orderOfAppearance": {
+    "de": "Reihenfolge des Auftretens in der formalen Grammatik der Werte",
+    "en-US": "order of appearance in the formal grammar of the values",
+    "fr": "l'ordre d'apparition dans la grammaire formelle des valeurs",
+    "ja": "形式文法における値の出現順",
+    "ru": "порядок появления в формальной грамматике значений"
+  },
+  "percentageAsSpecifiedAbsoluteLengthOrNone": {
+    "de": "der Prozentwert wie angegeben oder die absolute Länge oder <code>none</code>",
+    "en-US": "the percentage as specified or the absolute length or <code>none</code>",
+    "fr": "le pourcentage comme spécifié ou la longueur absolue ou le mot-clé <code>none</code>",
+    "ja": "指定されたパーセンテージ値または絶対的な長さ、または <code>none</code>",
+    "ru": "проценты, как указаны, абсолютная длина или <code>none</code>"
+  },
+  "percentageAsSpecifiedOrAbsoluteLength": {
+    "de": "der Prozentwert wie angegeben oder die absolute Länge",
+    "en-US": "the percentage as specified or the absolute length",
+    "fr": "le pourcentage tel que spécifé ou une longeur absolue",
+    "ja": "指定されたパーセンテージ値または絶対的な長さ",
+    "ru": "процент, как указан, или аблосютная длина"
+  },
+  "percentageAutoOrAbsoluteLength": {
+    "de": "ein Prozentwert oder <code>auto</code> oder die absolute Länge",
+    "en-US": "a percentage or <code>auto</code> or the absolute length",
+    "fr": "un pourcentage ou <code>auto</code> ou une longueur absolue",
+    "ja": "パーセンテージ、auto、絶対的な長さのいずれか",
+    "ru": "процент, <code>auto</code> или абсолютная длина"
+  },
+  "percentageOrAbsoluteLengthPlusKeywords": {
+    "de": "der Prozentwert wie angegeben oder die absolute Länge plus Schlüsselwörter, falls angegeben",
+    "en-US": "the percentage as specified or the absolute length, plus any keywords as specified",
+    "fr": "le pourcentage tel que spécifié ou la longueur absolue, ainsi que les mots-clé comme spécifiés",
+    "ja": "指定されたパーセンテージ値または絶対的な長さ、続けて指定された任意の数のキーワード",
+    "ru": "процент, как указан или абсолютная длина, а также любые ключевые слова"
+  },
+  "percentages": {
+    "de": "Prozentwerte",
+    "en-US": "Percentages",
+    "fr": "Pourcentages",
+    "ja": "パーセンテージ",
+    "ru": "Проценты"
+  },
+  "percentagesOrLengthsFollowedByFill": {
+    "de": "die Prozentwerte oder Längen gefolgt vom Schlüsselwort <code>fill</code>",
+    "en-US": "the percentages or lengths, eventually followed by the keyword <code>fill</code>",
+    "fr": "les pourcentages ou les longueurs, éventuellement suivis par le mot-clé <code>fill</code>",
+    "ru": "проценты или длины, в конечном счете, следует ключевое слово <code>fill</code>"
+  },
+  "perGrammar": {
+    "de": "nach Grammatik",
+    "en-US": "per grammar",
+    "fr": "selon la grammaire",
+    "ja": "構文通り"
+  },
+  "position": {
+    "de": "<a href=\"/de/docs/Web/CSS/number#Interpolation\" title=\"Werte des <position> Datentyps werden unabhängig für Abszisse und Ordinate interpoliert. Da die Geschwindigkeit für beide durch dieselbe <timing-function> bestimmt wird, wird der Punkt einer Linie folgen.\">Position</a>",
+    "en-US": "a <a href=\"/en-US/docs/Web/CSS/position_value#Interpolation\" title=\"Values of the <position> data type are interpolated independently for the abscissa and ordinate. As the speed is defined by the same <timing-function> for both, the point will move following a line.\">position</a>",
+    "fr": "une <a href=\"/fr/docs/Web/CSS/position_value#Interpolation\" title=\"Les valeurs de type <position> sont interpolées indépendamment pour les abscisses et pour les ordonnées. La vitesse est définie par la même <timing-function>, le point se déplacera donc suivant une ligne.\">position</a>",
+    "ru": "<a href=\"/ru/docs/Web/CSS/position_value#Interpolation\" title=\"Значении типа данных <позиция> интерполизуются независимо как абсцисса или ордината. Скорость определяется по одной <временной функции> для обоих координат, точка будет двигаться следуя линии.\">позиция</a>"
+  },
+  "positionedElements": {
+    "de": "positionierte Elemente",
+    "en-US": "positioned elements",
+    "fr": "éléments positionnés",
+    "ja": "配置された要素",
+    "ru": "позиционированные элементы"
+  },
+  "rectangle": {
+    "de": "<a href=\"/de/docs/Web/CSS/shape#Interpolation\">Rechteck</a>",
+    "en-US": "a <a href=\"/en-US/docs/Web/CSS/shape#Interpolation\" title=\"Values of the <shape> CSS data type which are rectangles are interpolated over their top, right, bottom and left component, each treated as a real, floating-point number.\">rectangle</a>",
+    "fr": "un <a href=\"/fr/docs/Web/CSS/forme#Interpolation\" title=\"Valeurs de type CSS <forme> qui ont des rectangles interpolés sur leurs composantes haute, droite, basse et gauche dont chacune est traitée comme un nombre flottant réel.\">rectangle</a>",
+    "ja": "<a href=\"/ja/docs/Web/CSS/shape#Interpolation\" title=\"Values of the <shape> CSS data type which are rectangles are interpolated over their top, right, bottom and left component, each treated as a real, floating-point number.\">rectangle</a>",
+    "ru": "<a href=\"/ru/docs/Web/CSS/shape#Interpolation\" title=\"Значения типа данных CSS <фигура>, которые являются прямоугольниками, интерполируются по их верхней, правой, нижней и левой компоненте, каждая из которых трактуется как вещественное число или с плавающей запятой.\">прямоугольник</a>"
+  },
+  "referToBorderBox": {
+    "de": "beziehen sich auf die Rahmenbox des Elements",
+    "en-US": "refer to the element’s border box",
+    "fr": "fait référence à l'élément <code>border box</code>",
+    "ru": "относятся к границе элемента"
+  },
+  "referToContainingBlockHeight": {
+    "de": "bezieht sich auf die Höhe des äußeren Elements",
+    "en-US": "refer to the height of the containing block",
+    "fr": "se rapporte à la hauteur du bloc contenant",
+    "ja": "包含ブロックの高さ",
+    "ru": "относятся к высоте содержащего блока"
+  },
+  "referToDimensionOfBorderBox": {
+    "de": "bezieht sich auf die Größe der Border-Box",
+    "en-US": "refer to the corresponding dimension of the border box",
+    "fr": "se rapporte à la dimension correspondance de la boîte de bordure",
+    "ru": "относятся к соответствующему размеру границы элемента"
+  },
+  "referToDimensionOfContentArea": {
+    "de": "beziehen sich auf die entsprechende Dimension des Inhaltsbereichs",
+    "en-US": "refer to corresponding dimension of the content area",
+    "fr": "fait référence à la dimension correspondante de la zone de contenu",
+    "ja": "該当するコンテンツ領域の寸法を参照",
+    "ru": "относятся к соответвующему размеру области содержимого"
+  },
+  "referToElementFontSize": {
+    "de": "bezieht sich auf die Schriftgröße des Elternelements",
+    "en-US": "refer to the font size of the element itself",
+    "fr": "se rapporte à la taille de la police de l'élément lui-même",
+    "ja": "要素自身のフォントサイズ",
+    "ru": "относятся к размеру шрифта самого элемента"
+  },
+  "referToFlexContainersInnerMainSize": {
+    "de": "bezieht sich auf die Hauptgröße des Flexcontainers",
+    "en-US": "refer to the flex container's inner main size",
+    "fr": "se rapporte à la principale taille interne du conteneur flexible",
+    "ru": "относятся к внутреннему размеру главного flex-контейнера"
+  },
+  "referToHeightOfBackgroundPositioningAreaMinusBackgroundImageHeight": {
+    "de": "bezieht sich auf die Höhe des Hintergrundpositionsbereichs abzüglich der Höhe des Hintergrundbilds",
+    "en-US": "refer to height of background positioning area minus height of background image",
+    "fr": "fait référence à la hauteur de la zone de positionement de l'arrière-plan moins la hauteur de l'image d'arrière-plan",
+    "ru": "относятся к высоте области позиционирования фона минус высота фонового изображения"
+  },
+  "referToHeightOfInitialViewport": {
+    "de": "beziehen sich auf die Höhe des ursprünglichen Viewports",
+    "en-US": "refer to the height of the initial viewport",
+    "fr": "fait référence à la hauteur de la zone d'affichage (<i>viewport</i>) initiale",
+    "ru": "относятся к высоте изначальной области просмотра"
+  },
+  "referToLineBoxWidth": {
+    "en-US": "calculated with respect to the width of the line box"
+  },
+  "referToLineHeight": {
+    "de": "bezieht sich auf die {{cssxref(\"line-height\")}} des Elements selbst",
+    "en-US": "refer to the {{cssxref(\"line-height\")}} of the element itself",
+    "fr": "se rapporte à la hauteur de ligne de l'élément lui-même",
+    "ja": "要素自身の行の高さ",
+    "ru": "относятся к {{cssxref(\"line-height\")}} самого элемента"
+  },
+  "referToParentElementsFontSize": {
+    "de": "bezieht sich auf die Schriftgröße des Elternelements",
+    "en-US": "refer to the parent element's font size",
+    "fr": "se rapporte à la taille de la police de l'élément parent",
+    "ja": " 親要素の font-size",
+    "ru": "относятся к размеру шрифта родителя"
+  },
+  "referToReferenceBoxWhenSpecifiedOtherwiseBorderBox": {
+    "en-US": "refer to reference box when specified, otherwise border-box"
+  },
+  "referToSizeOfBackgroundPositioningAreaMinusBackgroundImageSize": {
+    "de": "bezieht sich auf die Größe des Hintergrundpositionsbereichs abzüglich der Größe des Hintergrundbilds; die Größe bezieht sich auf die vertikalen und horizontalen Verschiebungen",
+    "en-US": "refer to the size of the background positioning area minus size of background image; size refers to the width for horizontal offsets and to the height for vertical offsets",
+    "fr": "se rapporte à la taille de la zone de positionnement de l'arrière-plan, moins la taille de l'image; la taille se rapporte à la largeur pour les décalages horizontaux et à la hauteur pour les décalages verticaux",
+    "ru": "относятся к размеру области позиционирования фона минус размер фонового изображения; размер - ширина горизонтальных смещений и высота вертикальных"
+  },
+  "referToSizeOfBorderImage": {
+    "de": "bezieht sich auf die Größe des Bildes",
+    "en-US": "refer to the size of the border image",
+    "fr": "se rapporte à la taille de l'image de bordure",
+    "ja": "ボーダー画像のサイズ",
+    "ru": "относятся к размеру рамки изображения"
+  },
+  "referToSizeOfBoundingBox": {
+    "de": "bezieht sich auf die Größe der äußeren Box",
+    "en-US": "refer to the size of bounding box",
+    "fr": "se rapporte à la taille de la boîte de l'élément",
+    "ja": "bounding box のサイズ",
+    "ru": "ссылается на размер ограничительной рамки"
+  },
+  "referToSizeOfElement": {
+    "de": "beziehen sich auf die Größe der Box selbst",
+    "en-US": "refer to the size of the box itself",
+    "fr": "fait référence à la taille de la boîte elle-même",
+    "ru": "ссылается на размер самого блока"
+  },
+  "referToSizeOfFont": {
+    "de": "ja, beziehen sich auf die entsprechende Größe der Schriftart",
+    "en-US": "yes, refer to the corresponding size of the text font",
+    "fr": "oui, indique la taille correspondante de la police de texte",
+    "ru": "да, относятся к соответствующему размеру шрифта текста"
+  },
+  "referToSizeOfMaskBorderImage": {
+    "en-US": "refer to size of the mask border image"
+  },
+  "referToSizeOfMaskPaintingArea": {
+    "de": "beziehen sich auf die Größe des Maskenzeichenbereichs minus der Größe des Maskenebenenbildes (siehe den Text zu {{cssxref(\"background-position\")}})",
+    "en-US": "refer to size of mask painting area minus size of mask layer image (see the text for {{cssxref(\"background-position\")}})",
+    "fr": "fait référence à la taille du masque pour la zone de pointure moins la taille du masque pour la taille de l'image (voir {{cssxref(\"background-position\")}})",
+    "ru": "относятся к размеру маски области рисования минус размер маски слоя изображения (смотрите статью о {{cssxref(\"background-position\")}})"
+  },
+  "referToTotalPathLength": {
+    "de": "beziehen sich auf die Gesamtlänge des Pfads",
+    "en-US": "refer to the total path length",
+    "fr": "se rapporte à la longueur totale du chemin",
+    "ru": "относятся к общей длине пути"
+  },
+  "referToWidthAndHeightOfElement": {
+    "de": "beziehen sich auf Breite und Höhe des Elements",
+    "en-US": "refer to width and height of element itself",
+    "fr": "se rapporte à la largeur et à la hauteur de l'élément lui-même",
+    "ru": "относятся к ширине и высоте самого элемента"
+  },
+  "referToWidthOfAffectedGlyph": {
+    "de": "bezieht sich auf die Breite des jeweiligen Zeichens",
+    "en-US": "refer to the width of the affected glyph",
+    "fr": "se rapporte à la largeur du glyphe concerné",
+    "ja": "作用する glyph の width",
+    "ru": "зависит от ширины символа"
+  },
+  "referToWidthOfBackgroundPositioningAreaMinusBackgroundImageHeight": {
+    "de": "bezieht sich auf die Breite des Hintergrundpositionsbereichs abzüglich der Höhe des Hintergrundbilds",
+    "en-US": "refer to width of background positioning area minus height of background image",
+    "fr": "fait référence à la largeur de la zone de positionement de l'arrière-plan moins la hauteur de l'image d'arrière-plan",
+    "ru": "относятся к ширине области позиционирования фона минус высота фонового изображения"
+  },
+  "referToWidthOfContainingBlock": {
+    "de": "bezieht sich auf die Breite des äußeren Elements",
+    "en-US": "refer to the width of the containing block",
+    "fr": "se rapporte à la largeur du bloc contenant",
+    "ja": "包含ブロックの幅",
+    "ru": "ссылается на ширину содержащего блока"
+  },
+  "referToWidthOfInitialViewport": {
+    "de": "beziehen sich auf die Breite des ursprünglichen Viewports",
+    "en-US": "refer to the width of the initial viewport",
+    "fr": "fait référence à la largeur de la zone d'affichage (<i>viewport</i>) initiale",
+    "ru": "относятся к ширине изначальной области просмотра"
+  },
+  "referToWidthOrHeightOfBorderImageArea": {
+    "de": "bezieht sich auf die Größe des Rahmenbildbereichs",
+    "en-US": "refer to the width or height of the border image area",
+    "fr": "se rapporte à la largeur ou la hauteur de la zone de l'image de bordure",
+    "ru": "относятся к высоте или ширине области рамки картинки"
+  },
+  "regardingHeightOfGeneratedBoxContainingBlockPercentages0": {
+    "de": "Der Prozentwert wird unter Berücksichtigung der Höhe des die generierte Box beinhaltenden Blocks berechnet. Falls die Höhe des beinhaltenden Blocks nicht explizit angegeben wurde (d. h. sie hängt von der Höhe des Inhalts ab) und dieses Element nicht absolut positioniert ist, wird der Prozentwert wie <code>0</code> behandelt.",
+    "en-US": "The percentage is calculated with respect to the height of the generated box's containing block. If the height of the containing block is not specified explicitly (i.e., it depends on content height), and this element is not absolutely positioned, the percentage value is treated as <code>0</code>.",
+    "es": "Se refiere a la altura del bloque contenedor.",
+    "fr": "Le poucentage est par rapport à la hauteur de la boîte générée par le bloc contenant. Si la hauteur du bloc contenant n'est pas explicitement spécifiée (c'est-à-dire qu'elle dépend de la hauteur du contenu), et si cet élément n'est pas absolument positionné , la valeur du pourcentage est traitée comme si elle valait <code>0</code>.",
+    "ja": "パーセンテージは、生成ボックスの包含ブロックの高さを基準に計算されます。 包含ブロックの高さが明示的に定義されず(この場合コンテンツの高さに依存します)この要素が絶対位置指定されていないなら、パーセンテージ値は 0 として扱われます。",
+    "ru": "Процент для генерируемого блока рассчитывается по отношению к высоте содержащего блока. Если высота содержащего блока не задана явно (т.е. зависит от высоты содержимого), и этот этот элемент позиционирован не абсолютно, процентное значение интерпретируется как <code>0</code>."
+  },
+  "regardingHeightOfGeneratedBoxContainingBlockPercentagesNone": {
+    "de": "Der Prozentwert wird unter Berücksichtigung der Höhe des die generierte Box beinhaltenden Blocks berechnet. Falls die Höhe des beinhaltenden Blocks nicht explizit angegeben wurde (d. h. sie hängt von der Höhe des Inhalts ab) und dieses Element nicht absolut positioniert ist, wird der Prozentwert wie <code>none</code> behandelt.",
+    "en-US": "The percentage is calculated with respect to the height of the generated box's containing block. If the height of the containing block is not specified explicitly (i.e., it depends on content height), and this element is not absolutely positioned, the percentage value is treated as <code>none</code>.",
+    "fr": "Le pourcentage est par rapport à la hauteur de la boîte générée par le bloc contenant. Si la hauteur du bloc contenant n'est pas explicitement spécifiée (c'est-à-dire qu'elle dépend de la hauteur du contenu), et si cet élément n'est pas absolument positionné, la valeur du pourcentage est traitée comme si elle valait <code>none</code>.",
+    "ja": " パーセンテージは、生成ボックスの包含ブロックの高さを基準に計算されます。 包含ブロックの高さが明示的に定義されず(コンテンツの高さに依存します)この要素が絶対位置指定されていないなら、パーセンテージ値は none として扱われます。",
+    "ru": "Процент для генерируемого блока рассчитывается по отношению к высоте содержащего блока. Если высота содержащего блока не задана явно (т.е. зависит от высоты содержимого), и этот элемент позиционирован не абсолютно, процентное значение интерпретируется как <code>none</code>."
+  },
+  "regardingHeightOfGeneratedBoxContainingBlockPercentagesRelativeToContainingBlock": {
+    "de": "Der Prozentwert wird unter Berücksichtigung der Höhe des die generierte Box beinhaltenden Blocks berechnet. Falls die Höhe des beinhaltenden Blocks nicht explizit angegeben wurde (d. h. sie hängt von der Höhe des Inhalts ab) und dieses Element nicht absolut positioniert ist, ist der berechnete Wert <code>auto</code>. Eine prozentuale Höhe beim Wurzelelement ist relativ zum ursprünglichen beinhaltenden Block.",
+    "en-US": "The percentage is calculated with respect to the height of the generated box's containing block. If the height of the containing block is not specified explicitly (i.e., it depends on content height), and this element is not absolutely positioned, the value computes to <code>auto</code>. A percentage height on the root element is relative to the initial containing block.",
+    "fr": "Le poucentage est par rapport à la hauteur de la boîte générée par le bloc contenant. Si la hauteur du bloc contenant n'est pas explicitement spécifiée (c'est-à-dire qu'elle dépend de la hauteur du contenu), et si cet élément n'est pas absolument positionné, la valeur du pourcentage est traitée comme <code>auto</code> et la hauteur du pourcentage sur l'élément racine est relative au bloc contenant initial.",
+    "ja": "パーセンテージは包含ブロックの高さ基準。包含ブロックの高さが明示されず(=コンテンツの高さ依存の場合)、この要素が絶対位置指定されていないなら、値は <code>auto</code> になります。ルート要素で高さをパーセンテージ指定すると、初期包含ブロックに相対的になります。",
+    "ru": "Процент для генерируемого блока рассчитывается по отношению к высоте содержащего блока. Если высота содержащего блока не задана явно (т.е. зависит от высоты содержимого), и этот этот элемент позиционирован не абсолютно, значение будет <code>auto</code>. Процентная высота на корневом элементе относительна первоначальному блоку."
+  },
+  "relatedAtRule": {
+    "de": "Zugehörige <a href=\"/de/docs/Web/CSS/At-Regel\">@-Regel</a>",
+    "en-US": "Related <a href=\"/en-US/docs/Web/CSS/At-rule\">at-rule</a>",
+    "fr": "En lien avec les <a href=\"/fr/docs/Web/CSS/Règles_%40\">règles @</a>",
+    "ja": "関連する <a href=\"/ja/docs/Web/CSS/At-rule\">@規則</a>",
+    "ru": "Связано с <a href=\"/ru/docs/Web/CSS/At-rule\">@-правила</a>"
+  },
+  "relativeToBackgroundPositioningArea": {
+    "de": "bezieht sich auf den jeweiligen Bereich",
+    "en-US": "relative to the background positioning area",
+    "fr": "relatifs à la zone de positionnement du fond",
+    "ru": "относительно области позиционирования фона"
+  },
+  "relativeToMaskBorderImageArea": {
+    "en-US": "relative to width/height of the mask border image area"
+  },
+  "relativeToScrollContainerPaddingBoxAxis": {
+    "de": "relativ zur gleichen Achse der Innenabstandsbox des Scrollcontainers",
+    "en-US": "relative to same axis of the padding-box of the scroll container",
+    "fr": "relatif au même axe de la <code>padding-box</code> du conteneur d'ascenceur",
+    "ru": "относительно той же оси и внутренних отступов прокручиваемого контейнера"
+  },
+  "relativeToTheScrollContainersScrollport": {
+    "en-US": "relative to the scroll container's scrollport"
+  },
+  "repeatableList": {
+    "de": "mehrfache Werte der folgenden Eigenschaften: ",
+    "en-US": "a repeatable list of ",
+    "fr": "une liste répétable de ",
+    "ja": "の反復可能リスト",
+    "ru": "повторяющийся список из "
+  },
+  "repeatableListOfSimpleListOfLpc": {
+    "en-US": "repeatable list of simple list of length, percentage, or calc"
+  },
+  "replacedElements": {
+    "de": "ersetzte Elemente",
+    "en-US": "replaced elements",
+    "fr": "éléments remplacés",
+    "ru": "заменяемые элементы"
+  },
+  "rubyAnnotationsContainers": {
+    "de": "Ruby-Anmerkungscontainer",
+    "en-US": "ruby annotations containers",
+    "fr": "annotations ruby des conteneurs",
+    "ru": "контейнеры ruby-аннотаций"
+  },
+  "rubyBasesAnnotationsBaseAnnotationContainers": {
+    "de": "Ruby-Basiselemente, Ruby-Anmerkungen, Ruby-Basiscontainer, Ruby-Anmerkungscontainer",
+    "en-US": "ruby bases, ruby annotations, ruby base containers, ruby annotation containers",
+    "fr": "bases ruby, annotations ruby, conteneurs de bases ruby, conteneurs d'annotations ruby",
+    "ru": "базовые элементы ruby, аннотации к ruby, базовые ruby контейнеры, контейнеры аннотаций к ruby"
+  },
+  "sameAsBoxOffsets": {
+    "de": "wie die Boxoffsets: {{cssxref(\"top\")}}, {{cssxref(\"right\")}}, {{cssxref(\"bottom\")}}, {{cssxref(\"left\")}} Eigenschaften, mit dem Unterschied, dass die Richtungen logisch sind",
+    "en-US": "same as box offsets: {{cssxref(\"top\")}}, {{cssxref(\"right\")}}, {{cssxref(\"bottom\")}}, {{cssxref(\"left\")}} properties except that directions are logical",
+    "fr": "identiques aux propriétés qui décalent les boîtes : {{cssxref(\"top\")}}, {{cssxref(\"right\")}}, {{cssxref(\"bottom\")}}, {{cssxref(\"left\")}} sauf que ces directions sont logiques",
+    "ru": "также как смещение блоков свойствами: {{cssxref(\"top\")}}, {{cssxref(\"right\")}}, {{cssxref(\"bottom\")}}, {{cssxref(\"left\")}}, кроме того направления логичны"
+  },
+  "sameAsMargin": {
+    "de": "wie bei {{cssxref(\"margin\")}}",
+    "en-US": "same as {{cssxref(\"margin\")}}",
+    "fr": "identique à {{cssxref(\"margin\")}}",
+    "ru": "с таким же {{cssxref(\"margin\")}}"
+  },
+  "sameAsMaxWidthAndMaxHeight": {
+    "de": "wie bei {{cssxref(\"max-width\")}} und {{cssxref(\"max-height\")}}",
+    "en-US": "same as {{cssxref(\"max-width\")}} and {{cssxref(\"max-height\")}}",
+    "fr": "identique à {{cssxref(\"max-width\")}} et à {{cssxref(\"max-height\")}}",
+    "ru": "с такими же {{cssxref(\"max-width\")}} и {{cssxref(\"max-height\")}}"
+  },
+  "sameAsMinWidthAndMinHeight": {
+    "de": "wie bei {{cssxref(\"min-width\")}} und {{cssxref(\"min-height\")}}",
+    "en-US": "same as {{cssxref(\"min-width\")}} and {{cssxref(\"min-height\")}}",
+    "fr": "identique à {{cssxref(\"min-width\")}} et à {{cssxref(\"min-height\")}}",
+    "ru": "с такими же {{cssxref(\"min-width\")}} и {{cssxref(\"min-height\")}}"
+  },
+  "sameAsWidthAndHeight": {
+    "de": "wie bei {{cssxref(\"width\")}} und {{cssxref(\"height\")}}",
+    "en-US": "same as {{cssxref(\"width\")}} and {{cssxref(\"height\")}}",
+    "fr": "identique à {{cssxref(\"width\")}} et à {{cssxref(\"height\")}}",
+    "ru": "с такими же {{cssxref(\"width\")}} и {{cssxref(\"height\")}}"
+  },
+  "scrollContainers": {
+    "de": "Scrollcontainer",
+    "en-US": "scroll containers",
+    "fr": "conteneurs d'ascenseurs",
+    "ja": "スクロールコンテナー",
+    "ru": "прокручиваемые контейнеры"
+  },
+  "scrollingBoxes": {
+    "de": "scrollende Boxen",
+    "en-US": "scrolling boxes",
+    "fr": "boîtes défilantes",
+    "ja": "スクロールするボックス",
+    "ru": "прокручиваемые блоки"
+  },
+  "seeProse": {
+    "de": "siehe Text",
+    "en-US": "see prose",
+    "fr": "voir le texte",
+    "ru": "смотреть текст"
+  },
+  "shadowList": {
+    "de": "eine <a href=\"/de/docs/Web/CSS/box-shadow#Interpolation\" title=\"Die color, x, y, blur und spread (falls anwendbar) Komponenten einer Schattenliste werden unabhängig voneinander interpoliert. Falls sich der inset-Wert irgendeines Schattenpaares der beiden Listen unterscheidet, gilt die gesamte liste als nicht interpolierbar. Falls eine Liste kürzer ist als die andere, wird die kürzere mit transparenten Schatten aufgefüllt, deren Längen alle auf 0 gesetzt sind und deren inset-Wert der längeren Liste entspricht.\">Liste von Schatten</a>",
+    "en-US": "a <a href=\"/en-US/docs/Web/CSS/box-shadow#Interpolation\" title=\"The color, x, y, blur and spread (if applicable) components of shadow lists are interpolated independently. If the inset value of any shadow pair differs between both lists, the whole list is uninterpolable. If one list is smaller than the other, it gets padded with transparent shadows with all their lengths set to 0 and its inset value matching the longer list.\">shadow list</a>",
+    "fr": "une <a href=\"/fr/docs/Web/CSS/box-shadow#Interpolation\" title=\"Les composantes de couleur, coordonnées x, y, de flou et d'étalement (si applicable) des listes d'ombres sont interpolées indépendamment. Si la valeur inset de n'importe quelle ombre différe entre les deux listes, toute la liste ne pourra pas être interpolée. Si une liste est plus petite qu'une autre, elle sera complétée avec des ombres transparentes dont les longueurs sont nulles et dont les valeurs d'inset correspondent à celles de la liste plus longue.\">liste d'ombres</a>",
+    "ja": "a <a href=\"/ja/docs/Web/CSS/box-shadow#Interpolation\" title=\"影のリストは、色の成分、 x、 y、 ぼかし、 (適切であれば) 広がりの成分で個別に補完されます。両方のリストで影の組の inset の値が異なる場合は、リスト全体は補完されません。一方のリストがもう一方より短い場合は、 transparent の色の影で補完し、すべての長さが 0 であり、 inset (の有無) が一致するものがあれば、より長いリストに一致します。\">影のリスト</a>",
+    "ru": "<a href=\"/ru/docs/Web/CSS/box-shadow#Interpolation\" title=\"Цвет, абсцисса, ордината, размытие и распространение (если применено) списка теней интерполируются независимо. Если внутреннее значение какой-либо пары теней различается в обоих списках, интерполизуется весь список. Если один список меньше остальных, он дополняется прозрачностью теней со всей их длинной установленной в 0, а его внутреннее значение соответвует длинному списку.\">список теней</a>"
+  },
+  "simpleList": {
+    "de": "ein einfacher Wert der folgenden Eigenschaften: ",
+    "en-US": "a simple list of ",
+    "fr": "une simple liste de ",
+    "ja": "単純なリスト: ",
+    "ru": "простой список из "
+  },
+  "simpleListOfLpc": {
+    "en-US": "simple list of length, percentage, or calc",
+    "ja": "length, percentage, calc の単純なリスト"
+  },
+  "simpleListOfLpcDifferenceLpc": {
+    "en-US": "simple list of length, percentage, or calc, provided the only differences are in the values of the length, percentage, or calc components in the list"
+  },
+  "specifiedIntegerOrAbsoluteLength": {
+    "de": "die angegebene Ganzzahl oder eine absolute Länge",
+    "en-US": "the specified integer or an absolute length",
+    "fr": "l'entier spécifié ou une longueur absolue",
+    "ja": "指定された整数値または絶対的な長さ",
+    "ru": "указанное целое число или абсолютная длина"
+  },
+  "specifiedValueClipped0To1": {
+    "de": "der angegebene Wert, auf den Bereich <code>[0,1]</code> abgeschnitten",
+    "en-US": "the specified value, clipped in the range <code>[0,1]</code>",
+    "fr": "la valeur spécifiée, écrêtée à l'intervalle <code>[0,1]</code>",
+    "ja": "指定値。<code>[0,1]</code> の範囲内にクリップされます",
+    "ru": "указанное значение, обрезается до диапозона <code>[0,1]</code>"
+  },
+  "specifiedValueNumberClipped0To1": {
+    "de": "Derselbe wie der angegebene Wert nachdem die {{cssxref(\"number\")}} auf den Bereich [0.0, 1.0] zugeschnitten wurde.",
+    "en-US": "The same as the specified value after clipping the {{cssxref(\"number\")}} to the range [0.0, 1.0].",
+    "fr": "La même que la valeur spécifiée après avoir écrêté {{cssxref(\"number\")}} dans l'intervalle [0.0, 1.0].",
+    "ru": "Тоже, что и указанное значение, после обрезки {{cssxref(\"number\")}} до диапозона [0.0, 1.0]."
+  },
+  "startOrNamelessValueIfLTRRightIfRTL": {
+    "de": "<code>start</code> oder ein namenloser Wert, der sich wie <code>left</code> verhält, falls {{cssxref(\"direction\")}} den Wert <code>ltr</code> hat, <code>right</code>, falls {{cssxref(\"direction\")}} den Wert <code>rtl</code> hat, falls <code>start</code> nicht vom Browser unterstützt wird.",
+    "en-US": "<code>start</code>, or a nameless value that acts as <code>left</code> if {{cssxref(\"direction\")}} is <code>ltr</code>, <code>right</code> if {{cssxref(\"direction\")}} is <code>rtl</code> if <code>start</code> is not supported by the browser.",
+    "fr": "<code>start</code>, ou une valeur non nommée se comportant comme <code>left</code> si {{cssxref(\"direction\")}} est <code>ltr</code>, <code>right</code> si {{cssxref(\"direction\")}} est <code>rtl</code> si <code>start</code> n'est pas supporté par le navigateur",
+    "ja": "<code>start</code>。<code>start</code> をサポートしないブラウザでは、{{cssxref(\"direction\", \"文章の方向\")}}が <code>ltr</code> なら <code>left</code>、<code>rtl</code> なら <code>right</code> として動作する無名の値",
+    "ru": "<code>start</code>, или неназванное значение, которое действует как <code>left</code>, если {{cssxref(\"direction\")}}: <code>ltr</code> или как <code>right</code>, если {{cssxref(\"direction\")}}: <code>rtl</code>, а если <code>start</code> не поддерживается браузером."
+  },
+  "tableCaptionElements": {
+    "de": "table-caption Elemente",
+    "en-US": "table-caption elements",
+    "fr": "éléments qui sont des légendes de tableaux",
+    "ja": "table-caption 要素",
+    "ru": "заголовки таблиц"
+  },
+  "tableCellElements": {
+    "de": "table-cell Elemente",
+    "en-US": "table-cell elements",
+    "fr": "éléments qui sont des cellules de tableau",
+    "ja": "テーブルセル要素",
+    "ru": "ячейки таблицы"
+  },
+  "tableElements": {
+    "de": "<code>table</code>- und <code>inline-table</code>-Elemente",
+    "en-US": "<code>table</code> and <code>inline-table</code> elements",
+    "fr": "des éléments <code>table</code> and <code>inline-table</code>",
+    "ja": "<code>table</code> および <code>inline-table</code> 要素",
+    "ru": "<code>table</code> и <code>inline-table</code> элементы"
+  },
+  "textElements": {
+    "de": "Textelemente",
+    "en-US": "text elements",
+    "fr": "éléments textes",
+    "ja": "テキスト要素",
+    "ru": "текстовые элементы"
+  },
+  "textFields": {
+    "de": "Textfelder",
+    "en-US": "text fields",
+    "fr": "champs de texte",
+    "ja": "テキストフィールド",
+    "ru": "текстовые поля"
+  },
+  "transform": {
+    "de": "Transformation",
+    "en-US": "a transform",
+    "fr": "une transformation",
+    "ja": "transform",
+    "ru": "трансформация"
+  },
+  "transformableElements": {
+    "de": "transformierbare Elemente",
+    "en-US": "transformable elements",
+    "fr": "éléments transformables",
+    "ja": "変形可能要素",
+    "pt-BR": "qualquer elemento transformavel",
+    "ru": "трансформируемые элементы"
+  },
+  "translucentValuesRGBAOtherwiseRGB": {
+    "de": "Falls der Wert durchscheinend ist, ist der berechnete Wert der entsprechende <code>rgba()</code> Wert. Falls nicht, ist er der entsprechende <code>rgb()</code> Wert. Das <code>transparent</code> Schlüsselwort wird zu <code>rgb(0,0,0)</code>.",
+    "en-US": "If the value is translucent, the computed value will be the <code>rgba()</code> corresponding one. If it isn't, it will be the <code>rgb()</code> corresponding one. The <code>transparent</code> keyword maps to <code>rgba(0,0,0,0)</code>.",
+    "fr": "si la valeur est translucide, la valeur calculée est la fonction <code>rgba()</code>correspondante. Sinon, la fonction <code>rgb()</code>correspondante. Le mot-clé <code>transparent</code> devient <code>rgb(0,0,0)</code>.",
+    "ja": "半透明の値なら、計算値はそれに対応する <code>rgba()</code>。さもなくばその値に対応する <code>rgb()</code>。<code>transparent</code> キーワードは <code>rgba(0,0,0,0)</code> にマップされます。",
+    "ru": "Если значение полупрозрачно, значение будет соответствовать <code>rgba()</code>. А если не будет полупрозрачным, то будет использоваться <code>rgb()</code>. Ключевое слово <code>transparent</code> интерпретируется в <code>rgba(0,0,0,0)</code>."
+  },
+  "\"\"": {
+    "en-US": "\"\" (the empty string)"
+  },
+  "\". \"": {
+    "en-US": "\". \" (full stop followed by a space)"
+  },
+  "twoAbsoluteLengthOrPercentages": {
+    "de": "zwei absolute {{cssxref(\"length\")}} oder {{cssxref(\"percentage\")}}",
+    "en-US": "two absolute {{cssxref(\"length\")}}s or {{cssxref(\"percentage\")}}s",
+    "fr": "deux {{cssxref(\"longueur\",\"longueurs\")}} absolues ou deux {{cssxref(\"pourcentage\",\"pourcentages\")}}",
+    "ja": "2つの絶対的な {{cssxref(\"length\")}} 又は {{cssxref(\"percentage\")}} 値",
+    "ru": "две абсолютных {{cssxref(\"length\")}} или {{cssxref(\"percentage\")}}"
+  },
+  "twoAbsoluteLengths": {
+    "de": "zwei absolute Längen",
+    "en-US": "two absolute lengths",
+    "fr": "deux longueurs absolues",
+    "ru": "две абсолютные длины"
+  },
+  "uniqueOrder": {
+    "de": "die eindeutige Reihenfolge definiert durch die formale Grammatik",
+    "en-US": "the unique non-ambiguous order defined by the formal grammar",
+    "es": "el orden único no-ambigüo definido por la gramática formal",
+    "fr": "l'ordre unique et non-ambigu défini par la grammaire formelle",
+    "ja": "形式文法で定義される一意のあいまいでない順序",
+    "ru": "уникальный неоднозначный порядок, определённый формальной грамматикой"
+  },
+  "variesFromBrowserToBrowser": {
+    "de": "Variiert von einem Browser zum anderen",
+    "en-US": "Varies from one browser to another",
+    "fr": "Varie d'un navigateur à l'autre",
+    "ru": "Варьируется от браузера к браузеру"
+  },
+  "visibility": {
+    "de": "<a href=\"/de/docs/Web/CSS/visibility#Interpolation\">Sichtbarkeit</a>",
+    "en-US": "a <a href=\"/en-US/docs/Web/CSS/visibility#Interpolation\" title=\"Values of the visibility CSS property are interpolable if the start or the end value is visible. In that case all values of the timing function which are equal to 1 map to visible and non-equal to 1 to non-visible.\">visibility</a>",
+    "fr": "une <a href=\"/fr/docs/Web/CSS/visibility#Interpolation\" title=\"Les valeurs de la propriété CSS visibility sont interpolables si une des valeurs de début ou de fin est visible. Dans ce cas, toutes les valeurs de la fonction de temporisation qui sont égales à 1 sont associées à visible, et celles non égales à 1, à non-visible.\">visibilité</a>",
+    "ja": "<a href=\"/ja/docs/Web/CSS/visibility#Interpolation\" title=\"Values of the visibility CSS property are interpolable if the start or the end value is visible. In that case all values of the timing function which are equal to 1 map to visible and non-equal to 1 to non-visible.\">visibility</a>",
+    "ru": "<a href=\"/ru/docs/Web/CSS/visibility#Interpolation\" title=\"Значения свойства CSS visibility интерполируются, если начальное или конечное значение установлено в visible. В этом случае все значения временной функции, равные 1 отображаются, а не равные 1 не отображаются.\">видимость</a>"
+  },
+  "visual": {
+    "de": "visuell",
+    "en-US": "visual",
+    "fr": "visuel",
+    "ja": "視覚",
+    "ru": "визуальный"
+  },
+  "visualInContinuousMediaNoEffectInOverflowColumns": {
+    "de": "<code>visual</code>, aber in kontinuierlichen Medien hat sie keinen Effekt in überlaufenden Spalten",
+    "en-US": "<code>visual</code>, but, in continuous media, has no effect in overflow columns",
+    "fr": "<code>visual</code>, mais n'a pas d'effet sur le débordement des colonnes pour un média continu",
+    "ja": "<code>visual</code>。ただし連続メディアではオーバーフローした列に効果なし",
+    "ru": "<code>visual</code>, но в сплошной среде, не имеет никакого эффекта при переполнении колонок"
+  },
+  "xulImageElements": {
+    "de": "XUL {{XULElem(\"image\")}} Elementen und {{cssxref(\":-moz-tree-image\")}}, {{cssxref(\":-moz-tree-twisty\")}} und {{cssxref(\":-moz-tree-checkbox\")}} Pseudoelementen. <strong>Hinweis:</strong> <code>-moz-image-region</code> funktioniert nur mit {{XULElem(\"image\")}} Elementen, bei denen das Symbol durch {{cssxref(\"list-style-image\")}} angegeben wird. Es funktioniert nicht mit XUL <code>&lt;image src=\"url\" /&gt;</code>.",
+    "en-US": "XUL {{XULElem(\"image\")}} elements and {{cssxref(\":-moz-tree-image\")}}, {{cssxref(\":-moz-tree-twisty\")}}, and {{cssxref(\":-moz-tree-checkbox\")}} pseudo-elements. <strong>Note:</strong> <code>-moz-image-region</code> only works with {{XULElem(\"image\")}} elements where the icon is specified using {{cssxref(\"list-style-image\")}}. It will not work with XUL <code>&lt;image src=\"url\" /&gt;</code>.",
+    "fr": "éléments XUL {{XULElem(\"image\")}} et aux pseudo-éléments {{cssxref(\":-moz-tree-image\")}}, {{cssxref(\":-moz-tree-twisty\")}} et {{cssxref(\":-moz-tree-checkbox\")}}. <strong>Note&nbsp;:</strong> <code>-moz-image-region</code> ne fonctionnera qu'avec les éléments {{XULElem(\"image\")}} où l'icône est définie avec {{cssxref(\"list-style-image\")}}. Cela ne fonctionnera pas avec l'<code>&lt;image src=\"url\" /&gt;</code> XUL.",
+    "ru": "XUL {{XULElem(\"image\")}} элементы и {{cssxref(\":-moz-tree-image\")}}, {{cssxref(\":-moz-tree-twisty\")}} и {{cssxref(\":-moz-tree-checkbox\")}} псевдоэлементы. <strong>Заметьте:</strong> <code>-moz-image-region</code> работает только с элементами {{XULElem(\"image\")}}, где иконка определяется использованием {{cssxref(\"list-style-image\")}}. Это не будет работать с XUL <code>&lt;image src=\"url\" /&gt;</code>."
+  },
+  "yes": {
+    "de": "Ja",
+    "en-US": "yes",
+    "fr": "oui",
+    "ja": "あり",
+    "pl": "tak",
+    "ru": "да"
+  },
+  "zoomForTheTopLevelNoneForTheRest": {
+    "en-US": "zoom for the top level element, none for all other elements"
+  }
+}
diff --git a/node_modules/mdn-data/l10n/index.js b/node_modules/mdn-data/l10n/index.js
new file mode 100644
index 0000000..e1bea42
--- /dev/null
+++ b/node_modules/mdn-data/l10n/index.js
@@ -0,0 +1,3 @@
+module.exports = {
+  css: require('./css'),
+}
diff --git a/node_modules/mdn-data/package.json b/node_modules/mdn-data/package.json
new file mode 100644
index 0000000..5997dcc
--- /dev/null
+++ b/node_modules/mdn-data/package.json
@@ -0,0 +1,39 @@
+{
+  "name": "mdn-data",
+  "version": "2.0.14",
+  "description": "Open Web data by the Mozilla Developer Network",
+  "main": "index.js",
+  "files": [
+    "api/index.js",
+    "api/*.json",
+    "css/index.js",
+    "css/*.json",
+    "l10n/index.js",
+    "l10n/*.json"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/mdn/data.git"
+  },
+  "keywords": [
+    "data",
+    "mdn",
+    "mozilla",
+    "css"
+  ],
+  "author": "Mozilla Developer Network",
+  "license": "CC0-1.0",
+  "bugs": {
+    "url": "https://github.com/mdn/data/issues"
+  },
+  "homepage": "https://developer.mozilla.org",
+  "devDependencies": {
+    "ajv": "^5.0.1",
+    "better-ajv-errors": "^0.5.1"
+  },
+  "scripts": {
+    "lint": "node test/lint",
+    "travis": "npm test",
+    "test": "npm run lint"
+  }
+}
diff --git a/node_modules/nth-check/LICENSE b/node_modules/nth-check/LICENSE
new file mode 100644
index 0000000..c464f86
--- /dev/null
+++ b/node_modules/nth-check/LICENSE
@@ -0,0 +1,11 @@
+Copyright (c) Felix Böhm
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/nth-check/README.md b/node_modules/nth-check/README.md
new file mode 100644
index 0000000..d9d1acb
--- /dev/null
+++ b/node_modules/nth-check/README.md
@@ -0,0 +1,80 @@
+# nth-check [![Build Status](https://travis-ci.org/fb55/nth-check.svg)](https://travis-ci.org/fb55/nth-check)
+
+Parses and compiles CSS nth-checks to highly optimized functions.
+
+### About
+
+This module can be used to parse & compile nth-checks, as they are found in CSS 3's `nth-child()` and `nth-last-of-type()`.
+
+`nth-check` focusses on speed, providing optimized functions for different kinds of nth-child formulas, while still following the [spec](http://www.w3.org/TR/css3-selectors/#nth-child-pseudo).
+
+### API
+
+```js
+import nthCheck, { parse, compile } from "nth-check";
+```
+
+##### `nthCheck(formula)`
+
+Parses and compiles a formula to a highly optimized function. Combination of `parse` and `compile`.
+
+If the formula doesn't match any elements, it returns [`boolbase`](https://github.com/fb55/boolbase)'s `falseFunc`. Otherwise, a function accepting an _index_ is returned, which returns whether or not the passed _index_ matches the formula.
+
+**Note**: The nth-rule starts counting at `1`, the returned function at `0`.
+
+**Example:**
+
+```js
+const check = nthCheck("2n+3");
+
+check(0); // `false`
+check(1); // `false`
+check(2); // `true`
+check(3); // `false`
+check(4); // `true`
+check(5); // `false`
+check(6); // `true`
+```
+
+##### `parse(formula)`
+
+Parses the expression, throws an `Error` if it fails. Otherwise, returns an array containing the integer step size and the integer offset of the nth rule.
+
+**Example:**
+
+```js
+parse("2n+3"); // [2, 3]
+```
+
+##### `compile([a, b])`
+
+Takes an array with two elements (as returned by `.parse`) and returns a highly optimized function.
+
+**Example:**
+
+```js
+const check = compile([2, 3]);
+
+check(0); // `false`
+check(1); // `false`
+check(2); // `true`
+check(3); // `false`
+check(4); // `true`
+check(5); // `false`
+check(6); // `true`
+```
+
+---
+
+License: BSD-2-Clause
+
+## Security contact information
+
+To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security).
+Tidelift will coordinate the fix and disclosure.
+
+## `nth-check` for enterprise
+
+Available as part of the Tidelift Subscription
+
+The maintainers of `nth-check` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-nth-check?utm_source=npm-nth-check&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
diff --git a/node_modules/nth-check/lib/compile.d.ts b/node_modules/nth-check/lib/compile.d.ts
new file mode 100644
index 0000000..03a0be3
--- /dev/null
+++ b/node_modules/nth-check/lib/compile.d.ts
@@ -0,0 +1,19 @@
+/**
+ * Returns a function that checks if an elements index matches the given rule
+ * highly optimized to return the fastest solution.
+ *
+ * @param parsed A tuple [a, b], as returned by `parse`.
+ * @returns A highly optimized function that returns whether an index matches the nth-check.
+ * @example
+ * const check = nthCheck.compile([2, 3]);
+ *
+ * check(0); // `false`
+ * check(1); // `false`
+ * check(2); // `true`
+ * check(3); // `false`
+ * check(4); // `true`
+ * check(5); // `false`
+ * check(6); // `true`
+ */
+export declare function compile(parsed: [a: number, b: number]): (index: number) => boolean;
+//# sourceMappingURL=compile.d.ts.map
\ No newline at end of file
diff --git a/node_modules/nth-check/lib/compile.d.ts.map b/node_modules/nth-check/lib/compile.d.ts.map
new file mode 100644
index 0000000..d8645d6
--- /dev/null
+++ b/node_modules/nth-check/lib/compile.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,OAAO,CACnB,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,GAC/B,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAgC5B"}
\ No newline at end of file
diff --git a/node_modules/nth-check/lib/compile.js b/node_modules/nth-check/lib/compile.js
new file mode 100644
index 0000000..1cf3b09
--- /dev/null
+++ b/node_modules/nth-check/lib/compile.js
@@ -0,0 +1,55 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.compile = void 0;
+var boolbase_1 = require("boolbase");
+/**
+ * Returns a function that checks if an elements index matches the given rule
+ * highly optimized to return the fastest solution.
+ *
+ * @param parsed A tuple [a, b], as returned by `parse`.
+ * @returns A highly optimized function that returns whether an index matches the nth-check.
+ * @example
+ * const check = nthCheck.compile([2, 3]);
+ *
+ * check(0); // `false`
+ * check(1); // `false`
+ * check(2); // `true`
+ * check(3); // `false`
+ * check(4); // `true`
+ * check(5); // `false`
+ * check(6); // `true`
+ */
+function compile(parsed) {
+    var a = parsed[0];
+    // Subtract 1 from `b`, to convert from one- to zero-indexed.
+    var b = parsed[1] - 1;
+    /*
+     * When `b <= 0`, `a * n` won't be lead to any matches for `a < 0`.
+     * Besides, the specification states that no elements are
+     * matched when `a` and `b` are 0.
+     *
+     * `b < 0` here as we subtracted 1 from `b` above.
+     */
+    if (b < 0 && a <= 0)
+        return boolbase_1.falseFunc;
+    // When `a` is in the range -1..1, it matches any element (so only `b` is checked).
+    if (a === -1)
+        return function (index) { return index <= b; };
+    if (a === 0)
+        return function (index) { return index === b; };
+    // When `b <= 0` and `a === 1`, they match any element.
+    if (a === 1)
+        return b < 0 ? boolbase_1.trueFunc : function (index) { return index >= b; };
+    /*
+     * Otherwise, modulo can be used to check if there is a match.
+     *
+     * Modulo doesn't care about the sign, so let's use `a`s absolute value.
+     */
+    var absA = Math.abs(a);
+    // Get `b mod a`, + a if this is negative.
+    var bMod = ((b % absA) + absA) % absA;
+    return a > 1
+        ? function (index) { return index >= b && index % absA === bMod; }
+        : function (index) { return index <= b && index % absA === bMod; };
+}
+exports.compile = compile;
diff --git a/node_modules/nth-check/lib/index.d.ts b/node_modules/nth-check/lib/index.d.ts
new file mode 100644
index 0000000..0000051
--- /dev/null
+++ b/node_modules/nth-check/lib/index.d.ts
@@ -0,0 +1,30 @@
+import { compile } from "./compile";
+import { parse } from "./parse";
+
+export { compile , parse};
+
+/**
+ * Parses and compiles a formula to a highly optimized function.
+ * Combination of `parse` and `compile`.
+ *
+ * If the formula doesn't match any elements,
+ * it returns [`boolbase`](https://github.com/fb55/boolbase)'s `falseFunc`.
+ * Otherwise, a function accepting an _index_ is returned, which returns
+ * whether or not the passed _index_ matches the formula.
+ *
+ * Note: The nth-rule starts counting at `1`, the returned function at `0`.
+ *
+ * @param formula The formula to compile.
+ * @example
+ * const check = nthCheck("2n+3");
+ *
+ * check(0); // `false`
+ * check(1); // `false`
+ * check(2); // `true`
+ * check(3); // `false`
+ * check(4); // `true`
+ * check(5); // `false`
+ * check(6); // `true`
+ */
+export default function nthCheck(formula: string): (index: number) => boolean;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/nth-check/lib/index.d.ts.map b/node_modules/nth-check/lib/index.d.ts.map
new file mode 100644
index 0000000..eabcd19
--- /dev/null
+++ b/node_modules/nth-check/lib/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAE1B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAE5E"}
\ No newline at end of file
diff --git a/node_modules/nth-check/lib/index.js b/node_modules/nth-check/lib/index.js
new file mode 100644
index 0000000..fcab3e2
--- /dev/null
+++ b/node_modules/nth-check/lib/index.js
@@ -0,0 +1,34 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.compile = exports.parse = void 0;
+var parse_1 = require("./parse");
+Object.defineProperty(exports, "parse", { enumerable: true, get: function () { return parse_1.parse; } });
+var compile_1 = require("./compile");
+Object.defineProperty(exports, "compile", { enumerable: true, get: function () { return compile_1.compile; } });
+/**
+ * Parses and compiles a formula to a highly optimized function.
+ * Combination of `parse` and `compile`.
+ *
+ * If the formula doesn't match any elements,
+ * it returns [`boolbase`](https://github.com/fb55/boolbase)'s `falseFunc`.
+ * Otherwise, a function accepting an _index_ is returned, which returns
+ * whether or not the passed _index_ matches the formula.
+ *
+ * Note: The nth-rule starts counting at `1`, the returned function at `0`.
+ *
+ * @param formula The formula to compile.
+ * @example
+ * const check = nthCheck("2n+3");
+ *
+ * check(0); // `false`
+ * check(1); // `false`
+ * check(2); // `true`
+ * check(3); // `false`
+ * check(4); // `true`
+ * check(5); // `false`
+ * check(6); // `true`
+ */
+function nthCheck(formula) {
+    return compile_1.compile(parse_1.parse(formula));
+}
+exports.default = nthCheck;
diff --git a/node_modules/nth-check/lib/parse.d.ts b/node_modules/nth-check/lib/parse.d.ts
new file mode 100644
index 0000000..b4f817b
--- /dev/null
+++ b/node_modules/nth-check/lib/parse.d.ts
@@ -0,0 +1,9 @@
+/**
+ * Parses an expression.
+ *
+ * @throws An `Error` if parsing fails.
+ * @returns An array containing the integer step size and the integer offset of the nth rule.
+ * @example nthCheck.parse("2n+3"); // returns [2, 3]
+ */
+export declare function parse(formula: string): [a: number, b: number];
+//# sourceMappingURL=parse.d.ts.map
\ No newline at end of file
diff --git a/node_modules/nth-check/lib/parse.d.ts.map b/node_modules/nth-check/lib/parse.d.ts.map
new file mode 100644
index 0000000..3ddc186
--- /dev/null
+++ b/node_modules/nth-check/lib/parse.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CA6B7D"}
\ No newline at end of file
diff --git a/node_modules/nth-check/lib/parse.js b/node_modules/nth-check/lib/parse.js
new file mode 100644
index 0000000..f98d920
--- /dev/null
+++ b/node_modules/nth-check/lib/parse.js
@@ -0,0 +1,39 @@
+"use strict";
+// Following http://www.w3.org/TR/css3-selectors/#nth-child-pseudo
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.parse = void 0;
+// [ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]?
+var RE_NTH_ELEMENT = /^([+-]?\d*n)?\s*(?:([+-]?)\s*(\d+))?$/;
+/**
+ * Parses an expression.
+ *
+ * @throws An `Error` if parsing fails.
+ * @returns An array containing the integer step size and the integer offset of the nth rule.
+ * @example nthCheck.parse("2n+3"); // returns [2, 3]
+ */
+function parse(formula) {
+    formula = formula.trim().toLowerCase();
+    if (formula === "even") {
+        return [2, 0];
+    }
+    else if (formula === "odd") {
+        return [2, 1];
+    }
+    var parsed = formula.match(RE_NTH_ELEMENT);
+    if (!parsed) {
+        throw new Error("n-th rule couldn't be parsed ('" + formula + "')");
+    }
+    var a;
+    if (parsed[1]) {
+        a = parseInt(parsed[1], 10);
+        if (isNaN(a)) {
+            a = parsed[1].startsWith("-") ? -1 : 1;
+        }
+    }
+    else
+        a = 0;
+    var b = (parsed[2] === "-" ? -1 : 1) *
+        (parsed[3] ? parseInt(parsed[3], 10) : 0);
+    return [a, b];
+}
+exports.parse = parse;
diff --git a/node_modules/nth-check/package.json b/node_modules/nth-check/package.json
new file mode 100644
index 0000000..5396700
--- /dev/null
+++ b/node_modules/nth-check/package.json
@@ -0,0 +1,67 @@
+{
+  "name": "nth-check",
+  "version": "2.0.0",
+  "description": "Parses and compiles CSS nth-checks to highly optimized functions.",
+  "author": "Felix Boehm <me@feedic.com>",
+  "license": "BSD-2-Clause",
+  "sideEffects": false,
+  "funding": {
+    "url": "https://github.com/fb55/nth-check?sponsor=1"
+  },
+  "directories": {
+    "lib": "lib/"
+  },
+  "main": "lib/index.js",
+  "types": "lib/index.d.ts",
+  "files": [
+    "lib/**/*"
+  ],
+  "scripts": {
+    "test": "jest --coverage && npm run lint",
+    "coverage": "cat coverage/lcov.info | coveralls",
+    "lint": "npm run lint:es && npm run lint:prettier",
+    "lint:es": "eslint .",
+    "lint:prettier": "npm run prettier -- --check",
+    "format": "npm run format:es && npm run format:prettier",
+    "format:es": "npm run lint:es -- --fix",
+    "format:prettier": "npm run prettier -- --write",
+    "prettier": "prettier '**/*.{ts,md,json,yml}'",
+    "build": "tsc",
+    "prepare": "npm run build"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/fb55/nth-check"
+  },
+  "keywords": [
+    "nth-child",
+    "nth",
+    "css"
+  ],
+  "bugs": {
+    "url": "https://github.com/fb55/nth-check/issues"
+  },
+  "homepage": "https://github.com/fb55/nth-check",
+  "dependencies": {
+    "boolbase": "^1.0.0"
+  },
+  "devDependencies": {
+    "@types/jest": "^26.0.0",
+    "@types/node": "^14.0.5",
+    "@typescript-eslint/eslint-plugin": "^4.1.0",
+    "@typescript-eslint/parser": "^4.1.0",
+    "eslint": "^7.0.0",
+    "eslint-config-prettier": "^6.0.0",
+    "jest": "^26.0.1",
+    "prettier": "^2.1.1",
+    "ts-jest": "^26.0.0",
+    "typescript": "^4.0.2"
+  },
+  "jest": {
+    "preset": "ts-jest",
+    "testEnvironment": "node"
+  },
+  "prettier": {
+    "tabWidth": 4
+  }
+}
diff --git a/node_modules/stable/README.md b/node_modules/stable/README.md
new file mode 100644
index 0000000..deffe99
--- /dev/null
+++ b/node_modules/stable/README.md
@@ -0,0 +1,85 @@
+## Stable
+
+A stable array sort, because `Array#sort()` is not guaranteed stable.
+
+MIT licensed.
+
+[![Node.js CI](https://secure.travis-ci.org/Two-Screen/stable.png)](http://travis-ci.org/Two-Screen/stable)
+
+[![Browser CI](http://ci.testling.com/Two-Screen/stable.png)](http://ci.testling.com/Two-Screen/stable)
+
+#### From npm
+
+Install with:
+
+```sh
+npm install stable
+```
+
+Then use it in Node.js or some other CommonJS environment as:
+
+```js
+const stable = require('stable')
+```
+
+#### From the browser
+
+Include [`stable.js`] or the minified version [`stable.min.js`]
+in your page, then call `stable()`.
+
+ [`stable.js`]: https://raw.github.com/Two-Screen/stable/master/stable.js
+ [`stable.min.js`]: https://raw.github.com/Two-Screen/stable/master/stable.min.js
+
+#### Usage
+
+The default sort is, as with `Array#sort`, lexicographical:
+
+```js
+stable(['foo', 'bar', 'baz'])  // => ['bar', 'baz', 'foo']
+stable([10, 1, 5])             // => [1, 10, 5]
+```
+
+Unlike `Array#sort`, the default sort is **NOT** in-place. To do an in-place
+sort, use `stable.inplace`, which otherwise works the same:
+
+```js
+const arr = [10, 1, 5]
+stable(arr) === arr          // => false
+stable.inplace(arr) === arr  // => true
+```
+
+A comparator function can be specified:
+
+```js
+// Regular sort() compatible comparator, that returns a number.
+// This demonstrates the default behavior.
+const lexCmp = (a, b) => String(a).localeCompare(b)
+stable(['foo', 'bar', 'baz'], lexCmp)  // => ['bar', 'baz', 'foo']
+
+// Boolean comparator. Sorts `b` before `a` if true.
+// This demonstrates a simple way to sort numerically.
+const greaterThan = (a, b) => a > b
+stable([10, 1, 5], greaterThan)  // => [1, 5, 10]
+```
+
+#### License
+
+Copyright (C) 2018 Angry Bytes and contributors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/stable/index.d.ts b/node_modules/stable/index.d.ts
new file mode 100644
index 0000000..08cb335
--- /dev/null
+++ b/node_modules/stable/index.d.ts
@@ -0,0 +1,9 @@
+export as namespace stable;
+export = stable;
+
+type Comparator<T> = ((a : T, b : T)=>boolean) | ((a: T, b : T)=>number);
+
+declare function stable<T>(array : T[], comparator? : Comparator<T>) : T[];
+declare namespace stable {
+    export function inplace<T>(array: T[], comparator? : Comparator<T>) : T[];
+}
diff --git a/node_modules/stable/package.json b/node_modules/stable/package.json
new file mode 100644
index 0000000..d32fb70
--- /dev/null
+++ b/node_modules/stable/package.json
@@ -0,0 +1,58 @@
+{
+  "name": "stable",
+  "version": "0.1.8",
+  "keywords": [
+    "stable",
+    "array",
+    "sort"
+  ],
+  "description": "A stable array sort for JavaScript",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/Two-Screen/stable.git"
+  },
+  "main": "./stable.js",
+  "types": "./index.d.ts",
+  "files": [
+    "stable.js",
+    "stable.min.js",
+    "index.d.ts"
+  ],
+  "devDependencies": {
+    "rollup": "^0.57.1",
+    "standard": "^11.0.1",
+    "tape": "^4.6.3",
+    "uglify-js": "^3.3.21"
+  },
+  "scripts": {
+    "test": "standard src/ && node ./src/test.js",
+    "prepare": "npm run build && npm run minify",
+    "build": "rollup -c",
+    "minify": "uglifyjs --comments \"/^!/\" -c -m -o ./stable.min.js ./stable.js"
+  },
+  "testling": {
+    "files": "./src/test.js",
+    "browsers": [
+      "ie6",
+      "ie7",
+      "ie8",
+      "ie9",
+      "ie10",
+      "firefox/25",
+      "chrome/31",
+      "safari/6.0",
+      "opera/12.0",
+      "opera/17.0",
+      "iphone/6.0",
+      "android-browser/4.2"
+    ]
+  },
+  "author": "Angry Bytes <info@angrybytes.com>",
+  "contributors": [
+    "Domenic Denicola <domenic@domenicdenicola.com>",
+    "Mattias Buelens <mattias@buelens.com>",
+    "St\u00e9phan Kochen <stephan@angrybytes.com>",
+    "Yaffle"
+  ],
+  "license": "MIT"
+}
diff --git a/node_modules/stable/stable.js b/node_modules/stable/stable.js
new file mode 100644
index 0000000..c9bf9e3
--- /dev/null
+++ b/node_modules/stable/stable.js
@@ -0,0 +1,109 @@
+//! stable.js 0.1.8, https://github.com/Two-Screen/stable
+//! © 2018 Angry Bytes and contributors. MIT licensed.
+
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+  typeof define === 'function' && define.amd ? define(factory) :
+  (global.stable = factory());
+}(this, (function () { 'use strict';
+
+  // A stable array sort, because `Array#sort()` is not guaranteed stable.
+  // This is an implementation of merge sort, without recursion.
+
+  var stable = function (arr, comp) {
+    return exec(arr.slice(), comp)
+  };
+
+  stable.inplace = function (arr, comp) {
+    var result = exec(arr, comp);
+
+    // This simply copies back if the result isn't in the original array,
+    // which happens on an odd number of passes.
+    if (result !== arr) {
+      pass(result, null, arr.length, arr);
+    }
+
+    return arr
+  };
+
+  // Execute the sort using the input array and a second buffer as work space.
+  // Returns one of those two, containing the final result.
+  function exec(arr, comp) {
+    if (typeof(comp) !== 'function') {
+      comp = function (a, b) {
+        return String(a).localeCompare(b)
+      };
+    }
+
+    // Short-circuit when there's nothing to sort.
+    var len = arr.length;
+    if (len <= 1) {
+      return arr
+    }
+
+    // Rather than dividing input, simply iterate chunks of 1, 2, 4, 8, etc.
+    // Chunks are the size of the left or right hand in merge sort.
+    // Stop when the left-hand covers all of the array.
+    var buffer = new Array(len);
+    for (var chk = 1; chk < len; chk *= 2) {
+      pass(arr, comp, chk, buffer);
+
+      var tmp = arr;
+      arr = buffer;
+      buffer = tmp;
+    }
+
+    return arr
+  }
+
+  // Run a single pass with the given chunk size.
+  var pass = function (arr, comp, chk, result) {
+    var len = arr.length;
+    var i = 0;
+    // Step size / double chunk size.
+    var dbl = chk * 2;
+    // Bounds of the left and right chunks.
+    var l, r, e;
+    // Iterators over the left and right chunk.
+    var li, ri;
+
+    // Iterate over pairs of chunks.
+    for (l = 0; l < len; l += dbl) {
+      r = l + chk;
+      e = r + chk;
+      if (r > len) r = len;
+      if (e > len) e = len;
+
+      // Iterate both chunks in parallel.
+      li = l;
+      ri = r;
+      while (true) {
+        // Compare the chunks.
+        if (li < r && ri < e) {
+          // This works for a regular `sort()` compatible comparator,
+          // but also for a simple comparator like: `a > b`
+          if (comp(arr[li], arr[ri]) <= 0) {
+            result[i++] = arr[li++];
+          }
+          else {
+            result[i++] = arr[ri++];
+          }
+        }
+        // Nothing to compare, just flush what's left.
+        else if (li < r) {
+          result[i++] = arr[li++];
+        }
+        else if (ri < e) {
+          result[i++] = arr[ri++];
+        }
+        // Both iterators are at the chunk ends.
+        else {
+          break
+        }
+      }
+    }
+  };
+
+  return stable;
+
+})));
diff --git a/node_modules/stable/stable.min.js b/node_modules/stable/stable.min.js
new file mode 100644
index 0000000..43ab5c4
--- /dev/null
+++ b/node_modules/stable/stable.min.js
@@ -0,0 +1,3 @@
+//! stable.js 0.1.8, https://github.com/Two-Screen/stable
+//! © 2018 Angry Bytes and contributors. MIT licensed.
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):e.stable=n()}(this,function(){"use strict";var e=function(e,n){return t(e.slice(),n)};function t(e,n){"function"!=typeof n&&(n=function(e,n){return String(e).localeCompare(n)});var r=e.length;if(r<=1)return e;for(var t=new Array(r),f=1;f<r;f*=2){i(e,n,f,t);var o=e;e=t,t=o}return e}e.inplace=function(e,n){var r=t(e,n);return r!==e&&i(r,null,e.length,e),e};var i=function(e,n,r,t){var f,o,i,u,a,c=e.length,l=0,s=2*r;for(f=0;f<c;f+=s)for(i=(o=f+r)+r,c<o&&(o=c),c<i&&(i=c),u=f,a=o;;)if(u<o&&a<i)n(e[u],e[a])<=0?t[l++]=e[u++]:t[l++]=e[a++];else if(u<o)t[l++]=e[u++];else{if(!(a<i))break;t[l++]=e[a++]}};return e});
\ No newline at end of file
diff --git a/node_modules/svgo/LICENSE b/node_modules/svgo/LICENSE
new file mode 100644
index 0000000..38a47da
--- /dev/null
+++ b/node_modules/svgo/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) Kir Belevich
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/svgo/README.md b/node_modules/svgo/README.md
new file mode 100644
index 0000000..ddd5d7f
--- /dev/null
+++ b/node_modules/svgo/README.md
@@ -0,0 +1,293 @@
+<div align="center">
+  <img src="./logo/logo-web.svg" width="348.61" height="100" alt="SVGO logo"/>
+</div>
+
+
+## SVGO [![npm version](https://img.shields.io/npm/v/svgo)](https://npmjs.org/package/svgo) [![Discord](https://img.shields.io/discord/815166721315831868)](https://discord.gg/z8jX8NYxrE)
+
+**SVG O**ptimizer is a Node.js-based tool for optimizing SVG vector graphics files.
+
+## Why?
+
+SVG files, especially those exported from various editors, usually contain a lot of redundant and useless information. This can include editor metadata, comments, hidden elements, default or non-optimal values and other stuff that can be safely removed or converted without affecting the SVG rendering result.
+
+## Installation
+
+```sh
+npm -g install svgo
+```
+
+or
+
+```sh
+yarn global add svgo
+```
+
+## CLI usage
+
+```sh
+svgo one.svg two.svg -o one.min.svg two.min.svg
+```
+
+Or use the `--folder`/`-f` flag to optimize a whole folder of SVG icons
+
+```sh
+svgo -f ./path/to/folder/with/svg/files -o ./path/to/folder/with/svg/output
+```
+
+See help for advanced usage
+
+```sh
+svgo --help
+```
+
+## Configuration
+
+Some options can be configured with CLI though it may be easier to have the configuration in a separate file.
+SVGO automatically loads configuration from `svgo.config.js` or module specified with `--config` flag.
+
+```js
+module.exports = {
+  multipass: true, // boolean. false by default
+  datauri: 'enc', // 'base64', 'enc' or 'unenc'. 'base64' by default
+  js2svg: {
+    indent: 2, // string with spaces or number of spaces. 4 by default
+    pretty: true, // boolean, false by default
+  }
+}
+```
+
+SVGO has a plugin-based architecture, so almost every optimization is a separate plugin.
+There is a set of [built-in plugins](#built-in-plugins). See how to configure them:
+
+```js
+module.exports = {
+  plugins: [
+    // enable a built-in plugin by name
+    'builtinPluginName',
+    // or by expanded version
+    {
+      name: 'builtinPluginName'
+    },
+    // some plugins allow/require to pass options
+    {
+      name: 'builtinPluginName',
+      params: {
+        optionName: 'optionValue'
+      }
+    }
+  ]
+}
+```
+
+The default list is fully overridden if the `plugins` field is specified. To extend the default
+list use the `extendDefaultPlugins` utility:
+
+```js
+const { extendDefaultPlugins } = require('svgo');
+module.exports = {
+  plugins: extendDefaultPlugins([
+    {
+      name: 'builtinPluginName',
+      params: {
+        optionName: 'optionValue'
+      }
+    }
+  ])
+}
+```
+
+To disable one of the default plugins use the `active` field:
+
+```js
+const { extendDefaultPlugins } = require('svgo');
+module.exports = {
+  plugins: extendDefaultPlugins([
+    {
+      name: 'builtinPluginName',
+      active: false
+    }
+  ])
+}
+```
+
+See the list of the default plugins:
+
+```js
+module.exports = {
+  plugins: [
+    'removeDoctype',
+    'removeXMLProcInst',
+    'removeComments',
+    'removeMetadata',
+    'removeEditorsNSData',
+    'cleanupAttrs',
+    'mergeStyles',
+    'inlineStyles',
+    'minifyStyles',
+    'cleanupIDs',
+    'removeUselessDefs',
+    'cleanupNumericValues',
+    'convertColors',
+    'removeUnknownsAndDefaults',
+    'removeNonInheritableGroupAttrs',
+    'removeUselessStrokeAndFill',
+    'removeViewBox',
+    'cleanupEnableBackground',
+    'removeHiddenElems',
+    'removeEmptyText',
+    'convertShapeToPath',
+    'convertEllipseToCircle',
+    'moveElemsAttrsToGroup',
+    'moveGroupAttrsToElems',
+    'collapseGroups',
+    'convertPathData',
+    'convertTransform',
+    'removeEmptyAttrs',
+    'removeEmptyContainers',
+    'mergePaths',
+    'removeUnusedNS',
+    'sortDefsChildren',
+    'removeTitle',
+    'removeDesc'
+  ]
+}
+```
+
+It's also possible to specify a custom plugin:
+
+```js
+const anotherCustomPlugin = require('./another-custom-plugin.js')
+module.exports = {
+  plugins: [
+    {
+      name: 'customPluginName',
+      type: 'perItem', // 'perItem', 'perItemReverse' or 'full'
+      params: {
+        optionName: 'optionValue',
+      },
+      fn: (ast, params, info) => {}
+    },
+    anotherCustomPlugin
+  ]
+}
+```
+
+## API usage
+
+SVGO provides a few low level utilities. `extendDefaultPlugins` is described above.
+
+### optimize
+
+The core of SVGO is `optimize` function.
+
+```js
+const { optimize } = require('svgo');
+const result = optimize(svgString, {
+  // optional but recommended field
+  path: 'path-to.svg',
+  // all config fields are also available here
+  multipass: true
+})
+const optimizedSvgString = result.data
+```
+
+### loadConfig
+
+If you write a tool on top of SVGO you might need a way to load SVGO config.
+
+```js
+const { loadConfig } = require('svgo');
+const config = await loadConfig()
+
+// you can also specify a relative or absolute path and customize the current working directory
+const config = await loadConfig(configFile, cwd)
+```
+
+## Built-in plugins
+
+| Plugin | Description | Default |
+| ------ | ----------- | ------- |
+| [cleanupAttrs](https://github.com/svg/svgo/blob/master/plugins/cleanupAttrs.js) | cleanup attributes from newlines, trailing, and repeating spaces | `enabled` |
+| [mergeStyles](https://github.com/svg/svgo/blob/master/plugins/mergeStyles.js) | merge multiple style elements into one | `enabled` |
+| [inlineStyles](https://github.com/svg/svgo/blob/master/plugins/inlineStyles.js) | move and merge styles from `<style>` elements to element `style` attributes | `enabled` |
+| [removeDoctype](https://github.com/svg/svgo/blob/master/plugins/removeDoctype.js) | remove `doctype` declaration | `enabled` |
+| [removeXMLProcInst](https://github.com/svg/svgo/blob/master/plugins/removeXMLProcInst.js) | remove XML processing instructions | `enabled` |
+| [removeComments](https://github.com/svg/svgo/blob/master/plugins/removeComments.js) | remove comments | `enabled` |
+| [removeMetadata](https://github.com/svg/svgo/blob/master/plugins/removeMetadata.js) | remove `<metadata>` | `enabled` |
+| [removeTitle](https://github.com/svg/svgo/blob/master/plugins/removeTitle.js) | remove `<title>` | `enabled` |
+| [removeDesc](https://github.com/svg/svgo/blob/master/plugins/removeDesc.js) | remove `<desc>` | `enabled` |
+| [removeUselessDefs](https://github.com/svg/svgo/blob/master/plugins/removeUselessDefs.js) | remove elements of `<defs>` without `id` | `enabled` |
+| [removeXMLNS](https://github.com/svg/svgo/blob/master/plugins/removeXMLNS.js) | removes the `xmlns` attribute (for inline SVG) | `disabled` |
+| [removeEditorsNSData](https://github.com/svg/svgo/blob/master/plugins/removeEditorsNSData.js) | remove editors namespaces, elements, and attributes | `enabled` |
+| [removeEmptyAttrs](https://github.com/svg/svgo/blob/master/plugins/removeEmptyAttrs.js) | remove empty attributes | `enabled` |
+| [removeHiddenElems](https://github.com/svg/svgo/blob/master/plugins/removeHiddenElems.js) | remove hidden elements | `enabled` |
+| [removeEmptyText](https://github.com/svg/svgo/blob/master/plugins/removeEmptyText.js) | remove empty Text elements | `enabled` |
+| [removeEmptyContainers](https://github.com/svg/svgo/blob/master/plugins/removeEmptyContainers.js) | remove empty Container elements | `enabled` |
+| [removeViewBox](https://github.com/svg/svgo/blob/master/plugins/removeViewBox.js) | remove `viewBox` attribute when possible | `enabled` |
+| [cleanupEnableBackground](https://github.com/svg/svgo/blob/master/plugins/cleanupEnableBackground.js) | remove or cleanup `enable-background` attribute when possible | `enabled` |
+| [minifyStyles](https://github.com/svg/svgo/blob/master/plugins/minifyStyles.js) | minify `<style>` elements content with [CSSO](https://github.com/css/csso) | `enabled` |
+| [convertStyleToAttrs](https://github.com/svg/svgo/blob/master/plugins/convertStyleToAttrs.js) | convert styles into attributes | `enabled` |
+| [convertColors](https://github.com/svg/svgo/blob/master/plugins/convertColors.js) | convert colors (from `rgb()` to `#rrggbb`, from `#rrggbb` to `#rgb`) | `enabled` |
+| [convertPathData](https://github.com/svg/svgo/blob/master/plugins/convertPathData.js) | convert Path data to relative or absolute (whichever is shorter), convert one segment to another, trim useless delimiters, smart rounding, and much more | `enabled` |
+| [convertTransform](https://github.com/svg/svgo/blob/master/plugins/convertTransform.js) | collapse multiple transforms into one, convert matrices to the short aliases, and much more | `enabled` |
+| [removeUnknownsAndDefaults](https://github.com/svg/svgo/blob/master/plugins/removeUnknownsAndDefaults.js) | remove unknown elements content and attributes, remove attributes with default values | `enabled` |
+| [removeNonInheritableGroupAttrs](https://github.com/svg/svgo/blob/master/plugins/removeNonInheritableGroupAttrs.js) | remove non-inheritable group's "presentation" attributes | `enabled` |
+| [removeUselessStrokeAndFill](https://github.com/svg/svgo/blob/master/plugins/removeUselessStrokeAndFill.js) | remove useless `stroke` and `fill` attributes | `enabled` |
+| [removeUnusedNS](https://github.com/svg/svgo/blob/master/plugins/removeUnusedNS.js) | remove unused namespaces declaration | `enabled` |
+| [prefixIds](https://github.com/svg/svgo/blob/master/plugins/prefixIds.js) | prefix IDs and classes with the SVG filename or an arbitrary string | `disabled` |
+| [cleanupIDs](https://github.com/svg/svgo/blob/master/plugins/cleanupIDs.js) | remove unused and minify used IDs | `enabled` |
+| [cleanupNumericValues](https://github.com/svg/svgo/blob/master/plugins/cleanupNumericValues.js) | round numeric values to the fixed precision, remove default `px` units | `enabled` |
+| [cleanupListOfValues](https://github.com/svg/svgo/blob/master/plugins/cleanupListOfValues.js) | round numeric values in attributes that take a list of numbers (like `viewBox` or `enable-background`) | `disabled` |
+| [moveElemsAttrsToGroup](https://github.com/svg/svgo/blob/master/plugins/moveElemsAttrsToGroup.js) | move elements' attributes to their enclosing group | `enabled` |
+| [moveGroupAttrsToElems](https://github.com/svg/svgo/blob/master/plugins/moveGroupAttrsToElems.js) | move some group attributes to the contained elements | `enabled` |
+| [collapseGroups](https://github.com/svg/svgo/blob/master/plugins/collapseGroups.js) | collapse useless groups | `enabled` |
+| [removeRasterImages](https://github.com/svg/svgo/blob/master/plugins/removeRasterImages.js) | remove raster images | `disabled` |
+| [mergePaths](https://github.com/svg/svgo/blob/master/plugins/mergePaths.js) | merge multiple Paths into one | `enabled` |
+| [convertShapeToPath](https://github.com/svg/svgo/blob/master/plugins/convertShapeToPath.js) | convert some basic shapes to `<path>` | `enabled` |
+| [convertEllipseToCircle](https://github.com/svg/svgo/blob/master/plugins/convertEllipseToCircle.js) | convert non-eccentric `<ellipse>` to `<circle>` | `enabled` |
+| [sortAttrs](https://github.com/svg/svgo/blob/master/plugins/sortAttrs.js) | sort element attributes for epic readability | `disabled` |
+| [sortDefsChildren](https://github.com/svg/svgo/blob/master/plugins/sortDefsChildren.js) | sort children of `<defs>` in order to improve compression | `enabled` |
+| [removeDimensions](https://github.com/svg/svgo/blob/master/plugins/removeDimensions.js) | remove `width`/`height` and add `viewBox` if it's missing (opposite to removeViewBox, disable it first) | `disabled` |
+| [removeAttrs](https://github.com/svg/svgo/blob/master/plugins/removeAttrs.js) | remove attributes by pattern | `disabled` |
+| [removeAttributesBySelector](https://github.com/svg/svgo/blob/master/plugins/removeAttributesBySelector.js) | removes attributes of elements that match a CSS selector | `disabled` |
+| [removeElementsByAttr](https://github.com/svg/svgo/blob/master/plugins/removeElementsByAttr.js) | remove arbitrary elements by `ID` or `className` | `disabled` |
+| [addClassesToSVGElement](https://github.com/svg/svgo/blob/master/plugins/addClassesToSVGElement.js) | add classnames to an outer `<svg>` element | `disabled` |
+| [addAttributesToSVGElement](https://github.com/svg/svgo/blob/master/plugins/addAttributesToSVGElement.js) | adds attributes to an outer `<svg>` element | `disabled` |
+| [removeOffCanvasPaths](https://github.com/svg/svgo/blob/master/plugins/removeOffCanvasPaths.js) | removes elements that are drawn outside of the viewbox | `disabled` |
+| [removeStyleElement](https://github.com/svg/svgo/blob/master/plugins/removeStyleElement.js) | remove `<style>` elements | `disabled` |
+| [removeScriptElement](https://github.com/svg/svgo/blob/master/plugins/removeScriptElement.js) | remove `<script>` elements | `disabled` |
+| [reusePaths](https://github.com/svg/svgo/blob/master/plugins/reusePaths.js) | Find duplicated <path> elements and replace them with <use> links | `disabled` |
+
+## Other Ways to Use SVGO
+
+* as a web app – [SVGOMG](https://jakearchibald.github.io/svgomg/)
+* as a GitHub Action – [SVGO Action](https://github.com/marketplace/actions/svgo-action)
+* as a Node.js module – [examples](https://github.com/svg/svgo/tree/master/examples)
+* as a Grunt task – [grunt-svgmin](https://github.com/sindresorhus/grunt-svgmin)
+* as a Gulp task – [gulp-svgmin](https://github.com/ben-eb/gulp-svgmin)
+* as a Mimosa module – [mimosa-minify-svg](https://github.com/dbashford/mimosa-minify-svg)
+* as an OSX Folder Action – [svgo-osx-folder-action](https://github.com/svg/svgo-osx-folder-action)
+* as a webpack loader – [image-webpack-loader](https://github.com/tcoopman/image-webpack-loader)
+* as a Telegram Bot – [svgo_bot](https://github.com/maksugr/svgo_bot)
+* as a PostCSS plugin – [postcss-svgo](https://github.com/ben-eb/postcss-svgo)
+* as an Inkscape plugin – [inkscape-svgo](https://github.com/konsumer/inkscape-svgo)
+* as a Sketch plugin - [svgo-compressor](https://github.com/BohemianCoding/svgo-compressor)
+* as macOS app - [Image Shrinker](https://image-shrinker.com)
+* as a Rollup plugin - [rollup-plugin-svgo](https://github.com/porsager/rollup-plugin-svgo)
+* as a VS Code plugin - [vscode-svgo](https://github.com/1000ch/vscode-svgo)
+* as a Atom plugin - [atom-svgo](https://github.com/1000ch/atom-svgo)
+* as a Sublime plugin - [Sublime-svgo](https://github.com/1000ch/Sublime-svgo)
+* as a Figma plugin - [Advanced SVG Export](https://www.figma.com/c/plugin/782713260363070260/Advanced-SVG-Export)
+
+## Donators
+
+| [<img src="https://sheetjs.com/sketch128.png" width="80">](https://sheetjs.com/) | [<img src="https://raw.githubusercontent.com/fontello/fontello/master/fontello-image.svg" width="80">](https://fontello.com/) |
+|:-:|:-:|
+| [SheetJS LLC](https://sheetjs.com/) | [Fontello](https://fontello.com/) |
+
+## License and Copyright
+
+This software is released under the terms of the [MIT license](https://github.com/svg/svgo/blob/master/LICENSE).
+
+Logo by [André Castillo](https://github.com/DerianAndre).
diff --git a/node_modules/svgo/bin/svgo b/node_modules/svgo/bin/svgo
new file mode 100755
index 0000000..0c29452
--- /dev/null
+++ b/node_modules/svgo/bin/svgo
@@ -0,0 +1,10 @@
+#!/usr/bin/env node
+
+const { red } = require('chalk');
+const { program } = require('commander');
+const makeProgram = require('../lib/svgo/coa');
+makeProgram(program);
+program.parseAsync(process.argv).catch(error => {
+  console.error(red(error.stack));
+  process.exit(1);
+});
diff --git a/node_modules/svgo/dist/svgo.browser.js b/node_modules/svgo/dist/svgo.browser.js
new file mode 100644
index 0000000..a35da44
--- /dev/null
+++ b/node_modules/svgo/dist/svgo.browser.js
@@ -0,0 +1 @@
+var commonjsGlobal=typeof globalThis!=="undefined"?globalThis:typeof window!=="undefined"?window:typeof global!=="undefined"?global:typeof self!=="undefined"?self:{};function getAugmentedNamespace(n){if(n.__esModule)return n;var a=Object.defineProperty({},"__esModule",{value:true});Object.keys(n).forEach((function(k){var d=Object.getOwnPropertyDescriptor(n,k);Object.defineProperty(a,k,d.get?d:{enumerable:true,get:function(){return n[k]}})}));return a}function createCommonjsModule(fn){var module={exports:{}};return fn(module,module.exports),module.exports}var lib$7=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.Doctype=exports.CDATA=exports.Tag=exports.Style=exports.Script=exports.Comment=exports.Directive=exports.Text=exports.Root=exports.isTag=void 0;function isTag(elem){return elem.type==="tag"||elem.type==="script"||elem.type==="style"}exports.isTag=isTag;exports.Root="root";exports.Text="text";exports.Directive="directive";exports.Comment="comment";exports.Script="script";exports.Style="style";exports.Tag="tag";exports.CDATA="cdata";exports.Doctype="doctype"}));var tagtypes=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.hasChildren=exports.isComment=exports.isText=exports.isCDATA=exports.isTag=void 0;function isTag(node){return lib$7.isTag(node)}exports.isTag=isTag;function isCDATA(node){return node.type==="cdata"}exports.isCDATA=isCDATA;function isText(node){return node.type==="text"}exports.isText=isText;function isComment(node){return node.type==="comment"}exports.isComment=isComment;function hasChildren(node){return Object.prototype.hasOwnProperty.call(node,"children")}exports.hasChildren=hasChildren}));var Aacute$1="Á";var aacute$1="á";var Abreve="Ă";var abreve="ă";var ac="∾";var acd="∿";var acE="∾̳";var Acirc$1="Â";var acirc$1="â";var acute$1="´";var Acy="А";var acy="а";var AElig$1="Æ";var aelig$1="æ";var af="⁡";var Afr="𝔄";var afr="𝔞";var Agrave$1="À";var agrave$1="à";var alefsym="ℵ";var aleph="ℵ";var Alpha="Α";var alpha="α";var Amacr="Ā";var amacr="ā";var amalg="⨿";var amp$2="&";var AMP$1="&";var andand="⩕";var And="⩓";var and="∧";var andd="⩜";var andslope="⩘";var andv="⩚";var ang="∠";var ange="⦤";var angle="∠";var angmsdaa="⦨";var angmsdab="⦩";var angmsdac="⦪";var angmsdad="⦫";var angmsdae="⦬";var angmsdaf="⦭";var angmsdag="⦮";var angmsdah="⦯";var angmsd="∡";var angrt="∟";var angrtvb="⊾";var angrtvbd="⦝";var angsph="∢";var angst="Å";var angzarr="⍼";var Aogon="Ą";var aogon="ą";var Aopf="𝔸";var aopf="𝕒";var apacir="⩯";var ap="≈";var apE="⩰";var ape="≊";var apid="≋";var apos$1="'";var ApplyFunction="⁡";var approx="≈";var approxeq="≊";var Aring$1="Å";var aring$1="å";var Ascr="𝒜";var ascr="𝒶";var Assign="≔";var ast="*";var asymp="≈";var asympeq="≍";var Atilde$1="Ã";var atilde$1="ã";var Auml$1="Ä";var auml$1="ä";var awconint="∳";var awint="⨑";var backcong="≌";var backepsilon="϶";var backprime="‵";var backsim="∽";var backsimeq="⋍";var Backslash="∖";var Barv="⫧";var barvee="⊽";var barwed="⌅";var Barwed="⌆";var barwedge="⌅";var bbrk="⎵";var bbrktbrk="⎶";var bcong="≌";var Bcy="Б";var bcy="б";var bdquo="„";var becaus="∵";var because="∵";var Because="∵";var bemptyv="⦰";var bepsi="϶";var bernou="ℬ";var Bernoullis="ℬ";var Beta="Β";var beta="β";var beth="ℶ";var between="≬";var Bfr="𝔅";var bfr="𝔟";var bigcap="⋂";var bigcirc="◯";var bigcup="⋃";var bigodot="⨀";var bigoplus="⨁";var bigotimes="⨂";var bigsqcup="⨆";var bigstar="★";var bigtriangledown="▽";var bigtriangleup="△";var biguplus="⨄";var bigvee="⋁";var bigwedge="⋀";var bkarow="⤍";var blacklozenge="⧫";var blacksquare="▪";var blacktriangle="▴";var blacktriangledown="▾";var blacktriangleleft="◂";var blacktriangleright="▸";var blank="␣";var blk12="▒";var blk14="░";var blk34="▓";var block="█";var bne="=⃥";var bnequiv="≡⃥";var bNot="⫭";var bnot="⌐";var Bopf="𝔹";var bopf="𝕓";var bot="⊥";var bottom="⊥";var bowtie="⋈";var boxbox="⧉";var boxdl="┐";var boxdL="╕";var boxDl="╖";var boxDL="╗";var boxdr="┌";var boxdR="╒";var boxDr="╓";var boxDR="╔";var boxh="─";var boxH="═";var boxhd="┬";var boxHd="╤";var boxhD="╥";var boxHD="╦";var boxhu="┴";var boxHu="╧";var boxhU="╨";var boxHU="╩";var boxminus="⊟";var boxplus="⊞";var boxtimes="⊠";var boxul="┘";var boxuL="╛";var boxUl="╜";var boxUL="╝";var boxur="└";var boxuR="╘";var boxUr="╙";var boxUR="╚";var boxv="│";var boxV="║";var boxvh="┼";var boxvH="╪";var boxVh="╫";var boxVH="╬";var boxvl="┤";var boxvL="╡";var boxVl="╢";var boxVL="╣";var boxvr="├";var boxvR="╞";var boxVr="╟";var boxVR="╠";var bprime="‵";var breve="˘";var Breve="˘";var brvbar$1="¦";var bscr="𝒷";var Bscr="ℬ";var bsemi="⁏";var bsim="∽";var bsime="⋍";var bsolb="⧅";var bsol="\\";var bsolhsub="⟈";var bull="•";var bullet="•";var bump="≎";var bumpE="⪮";var bumpe="≏";var Bumpeq="≎";var bumpeq="≏";var Cacute="Ć";var cacute="ć";var capand="⩄";var capbrcup="⩉";var capcap="⩋";var cap="∩";var Cap="⋒";var capcup="⩇";var capdot="⩀";var CapitalDifferentialD="ⅅ";var caps="∩︀";var caret="⁁";var caron="ˇ";var Cayleys="ℭ";var ccaps="⩍";var Ccaron="Č";var ccaron="č";var Ccedil$1="Ç";var ccedil$1="ç";var Ccirc="Ĉ";var ccirc="ĉ";var Cconint="∰";var ccups="⩌";var ccupssm="⩐";var Cdot="Ċ";var cdot="ċ";var cedil$1="¸";var Cedilla="¸";var cemptyv="⦲";var cent$1="¢";var centerdot="·";var CenterDot="·";var cfr="𝔠";var Cfr="ℭ";var CHcy="Ч";var chcy="ч";var check="✓";var checkmark="✓";var Chi="Χ";var chi="χ";var circ="ˆ";var circeq="≗";var circlearrowleft="↺";var circlearrowright="↻";var circledast="⊛";var circledcirc="⊚";var circleddash="⊝";var CircleDot="⊙";var circledR="®";var circledS="Ⓢ";var CircleMinus="⊖";var CirclePlus="⊕";var CircleTimes="⊗";var cir="○";var cirE="⧃";var cire="≗";var cirfnint="⨐";var cirmid="⫯";var cirscir="⧂";var ClockwiseContourIntegral="∲";var CloseCurlyDoubleQuote="”";var CloseCurlyQuote="’";var clubs="♣";var clubsuit="♣";var colon=":";var Colon="∷";var Colone="⩴";var colone="≔";var coloneq="≔";var comma=",";var commat="@";var comp="∁";var compfn="∘";var complement="∁";var complexes="ℂ";var cong="≅";var congdot="⩭";var Congruent="≡";var conint="∮";var Conint="∯";var ContourIntegral="∮";var copf="𝕔";var Copf="ℂ";var coprod="∐";var Coproduct="∐";var copy$2="©";var COPY$1="©";var copysr="℗";var CounterClockwiseContourIntegral="∳";var crarr="↵";var cross="✗";var Cross="⨯";var Cscr="𝒞";var cscr="𝒸";var csub="⫏";var csube="⫑";var csup="⫐";var csupe="⫒";var ctdot="⋯";var cudarrl="⤸";var cudarrr="⤵";var cuepr="⋞";var cuesc="⋟";var cularr="↶";var cularrp="⤽";var cupbrcap="⩈";var cupcap="⩆";var CupCap="≍";var cup="∪";var Cup="⋓";var cupcup="⩊";var cupdot="⊍";var cupor="⩅";var cups="∪︀";var curarr="↷";var curarrm="⤼";var curlyeqprec="⋞";var curlyeqsucc="⋟";var curlyvee="⋎";var curlywedge="⋏";var curren$1="¤";var curvearrowleft="↶";var curvearrowright="↷";var cuvee="⋎";var cuwed="⋏";var cwconint="∲";var cwint="∱";var cylcty="⌭";var dagger="†";var Dagger="‡";var daleth="ℸ";var darr="↓";var Darr="↡";var dArr="⇓";var dash="‐";var Dashv="⫤";var dashv="⊣";var dbkarow="⤏";var dblac="˝";var Dcaron="Ď";var dcaron="ď";var Dcy="Д";var dcy="д";var ddagger="‡";var ddarr="⇊";var DD="ⅅ";var dd="ⅆ";var DDotrahd="⤑";var ddotseq="⩷";var deg$1="°";var Del="∇";var Delta="Δ";var delta="δ";var demptyv="⦱";var dfisht="⥿";var Dfr="𝔇";var dfr="𝔡";var dHar="⥥";var dharl="⇃";var dharr="⇂";var DiacriticalAcute="´";var DiacriticalDot="˙";var DiacriticalDoubleAcute="˝";var DiacriticalGrave="`";var DiacriticalTilde="˜";var diam="⋄";var diamond="⋄";var Diamond="⋄";var diamondsuit="♦";var diams="♦";var die="¨";var DifferentialD="ⅆ";var digamma="ϝ";var disin="⋲";var div="÷";var divide$1="÷";var divideontimes="⋇";var divonx="⋇";var DJcy="Ђ";var djcy="ђ";var dlcorn="⌞";var dlcrop="⌍";var dollar="$";var Dopf="𝔻";var dopf="𝕕";var Dot="¨";var dot="˙";var DotDot="⃜";var doteq="≐";var doteqdot="≑";var DotEqual="≐";var dotminus="∸";var dotplus="∔";var dotsquare="⊡";var doublebarwedge="⌆";var DoubleContourIntegral="∯";var DoubleDot="¨";var DoubleDownArrow="⇓";var DoubleLeftArrow="⇐";var DoubleLeftRightArrow="⇔";var DoubleLeftTee="⫤";var DoubleLongLeftArrow="⟸";var DoubleLongLeftRightArrow="⟺";var DoubleLongRightArrow="⟹";var DoubleRightArrow="⇒";var DoubleRightTee="⊨";var DoubleUpArrow="⇑";var DoubleUpDownArrow="⇕";var DoubleVerticalBar="∥";var DownArrowBar="⤓";var downarrow="↓";var DownArrow="↓";var Downarrow="⇓";var DownArrowUpArrow="⇵";var DownBreve="̑";var downdownarrows="⇊";var downharpoonleft="⇃";var downharpoonright="⇂";var DownLeftRightVector="⥐";var DownLeftTeeVector="⥞";var DownLeftVectorBar="⥖";var DownLeftVector="↽";var DownRightTeeVector="⥟";var DownRightVectorBar="⥗";var DownRightVector="⇁";var DownTeeArrow="↧";var DownTee="⊤";var drbkarow="⤐";var drcorn="⌟";var drcrop="⌌";var Dscr="𝒟";var dscr="𝒹";var DScy="Ѕ";var dscy="ѕ";var dsol="⧶";var Dstrok="Đ";var dstrok="đ";var dtdot="⋱";var dtri="▿";var dtrif="▾";var duarr="⇵";var duhar="⥯";var dwangle="⦦";var DZcy="Џ";var dzcy="џ";var dzigrarr="⟿";var Eacute$1="É";var eacute$1="é";var easter="⩮";var Ecaron="Ě";var ecaron="ě";var Ecirc$1="Ê";var ecirc$1="ê";var ecir="≖";var ecolon="≕";var Ecy="Э";var ecy="э";var eDDot="⩷";var Edot="Ė";var edot="ė";var eDot="≑";var ee="ⅇ";var efDot="≒";var Efr="𝔈";var efr="𝔢";var eg="⪚";var Egrave$1="È";var egrave$1="è";var egs="⪖";var egsdot="⪘";var el="⪙";var Element="∈";var elinters="⏧";var ell="ℓ";var els="⪕";var elsdot="⪗";var Emacr="Ē";var emacr="ē";var empty="∅";var emptyset="∅";var EmptySmallSquare="◻";var emptyv="∅";var EmptyVerySmallSquare="▫";var emsp13=" ";var emsp14=" ";var emsp=" ";var ENG="Ŋ";var eng="ŋ";var ensp=" ";var Eogon="Ę";var eogon="ę";var Eopf="𝔼";var eopf="𝕖";var epar="⋕";var eparsl="⧣";var eplus="⩱";var epsi="ε";var Epsilon="Ε";var epsilon="ε";var epsiv="ϵ";var eqcirc="≖";var eqcolon="≕";var eqsim="≂";var eqslantgtr="⪖";var eqslantless="⪕";var Equal="⩵";var equals="=";var EqualTilde="≂";var equest="≟";var Equilibrium="⇌";var equiv="≡";var equivDD="⩸";var eqvparsl="⧥";var erarr="⥱";var erDot="≓";var escr="ℯ";var Escr="ℰ";var esdot="≐";var Esim="⩳";var esim="≂";var Eta="Η";var eta="η";var ETH$1="Ð";var eth$1="ð";var Euml$1="Ë";var euml$1="ë";var euro="€";var excl="!";var exist="∃";var Exists="∃";var expectation="ℰ";var exponentiale="ⅇ";var ExponentialE="ⅇ";var fallingdotseq="≒";var Fcy="Ф";var fcy="ф";var female="♀";var ffilig="ffi";var fflig="ff";var ffllig="ffl";var Ffr="𝔉";var ffr="𝔣";var filig="fi";var FilledSmallSquare="◼";var FilledVerySmallSquare="▪";var fjlig="fj";var flat="♭";var fllig="fl";var fltns="▱";var fnof="ƒ";var Fopf="𝔽";var fopf="𝕗";var forall="∀";var ForAll="∀";var fork="⋔";var forkv="⫙";var Fouriertrf="ℱ";var fpartint="⨍";var frac12$1="½";var frac13="⅓";var frac14$1="¼";var frac15="⅕";var frac16="⅙";var frac18="⅛";var frac23="⅔";var frac25="⅖";var frac34$1="¾";var frac35="⅗";var frac38="⅜";var frac45="⅘";var frac56="⅚";var frac58="⅝";var frac78="⅞";var frasl="⁄";var frown="⌢";var fscr="𝒻";var Fscr="ℱ";var gacute="ǵ";var Gamma="Γ";var gamma="γ";var Gammad="Ϝ";var gammad="ϝ";var gap="⪆";var Gbreve="Ğ";var gbreve="ğ";var Gcedil="Ģ";var Gcirc="Ĝ";var gcirc="ĝ";var Gcy="Г";var gcy="г";var Gdot="Ġ";var gdot="ġ";var ge="≥";var gE="≧";var gEl="⪌";var gel="⋛";var geq="≥";var geqq="≧";var geqslant="⩾";var gescc="⪩";var ges="⩾";var gesdot="⪀";var gesdoto="⪂";var gesdotol="⪄";var gesl="⋛︀";var gesles="⪔";var Gfr="𝔊";var gfr="𝔤";var gg="≫";var Gg="⋙";var ggg="⋙";var gimel="ℷ";var GJcy="Ѓ";var gjcy="ѓ";var gla="⪥";var gl="≷";var glE="⪒";var glj="⪤";var gnap="⪊";var gnapprox="⪊";var gne="⪈";var gnE="≩";var gneq="⪈";var gneqq="≩";var gnsim="⋧";var Gopf="𝔾";var gopf="𝕘";var grave="`";var GreaterEqual="≥";var GreaterEqualLess="⋛";var GreaterFullEqual="≧";var GreaterGreater="⪢";var GreaterLess="≷";var GreaterSlantEqual="⩾";var GreaterTilde="≳";var Gscr="𝒢";var gscr="ℊ";var gsim="≳";var gsime="⪎";var gsiml="⪐";var gtcc="⪧";var gtcir="⩺";var gt$2=">";var GT$1=">";var Gt="≫";var gtdot="⋗";var gtlPar="⦕";var gtquest="⩼";var gtrapprox="⪆";var gtrarr="⥸";var gtrdot="⋗";var gtreqless="⋛";var gtreqqless="⪌";var gtrless="≷";var gtrsim="≳";var gvertneqq="≩︀";var gvnE="≩︀";var Hacek="ˇ";var hairsp=" ";var half="½";var hamilt="ℋ";var HARDcy="Ъ";var hardcy="ъ";var harrcir="⥈";var harr="↔";var hArr="⇔";var harrw="↭";var Hat="^";var hbar="ℏ";var Hcirc="Ĥ";var hcirc="ĥ";var hearts="♥";var heartsuit="♥";var hellip="…";var hercon="⊹";var hfr="𝔥";var Hfr="ℌ";var HilbertSpace="ℋ";var hksearow="⤥";var hkswarow="⤦";var hoarr="⇿";var homtht="∻";var hookleftarrow="↩";var hookrightarrow="↪";var hopf="𝕙";var Hopf="ℍ";var horbar="―";var HorizontalLine="─";var hscr="𝒽";var Hscr="ℋ";var hslash="ℏ";var Hstrok="Ħ";var hstrok="ħ";var HumpDownHump="≎";var HumpEqual="≏";var hybull="⁃";var hyphen="‐";var Iacute$1="Í";var iacute$1="í";var ic="⁣";var Icirc$1="Î";var icirc$1="î";var Icy="И";var icy="и";var Idot="İ";var IEcy="Е";var iecy="е";var iexcl$1="¡";var iff="⇔";var ifr="𝔦";var Ifr="ℑ";var Igrave$1="Ì";var igrave$1="ì";var ii="ⅈ";var iiiint="⨌";var iiint="∭";var iinfin="⧜";var iiota="℩";var IJlig="IJ";var ijlig="ij";var Imacr="Ī";var imacr="ī";var image="ℑ";var ImaginaryI="ⅈ";var imagline="ℐ";var imagpart="ℑ";var imath="ı";var Im="ℑ";var imof="⊷";var imped="Ƶ";var Implies="⇒";var incare="℅";var infin="∞";var infintie="⧝";var inodot="ı";var intcal="⊺";var int="∫";var Int="∬";var integers="ℤ";var Integral="∫";var intercal="⊺";var Intersection="⋂";var intlarhk="⨗";var intprod="⨼";var InvisibleComma="⁣";var InvisibleTimes="⁢";var IOcy="Ё";var iocy="ё";var Iogon="Į";var iogon="į";var Iopf="𝕀";var iopf="𝕚";var Iota="Ι";var iota="ι";var iprod="⨼";var iquest$1="¿";var iscr="𝒾";var Iscr="ℐ";var isin="∈";var isindot="⋵";var isinE="⋹";var isins="⋴";var isinsv="⋳";var isinv="∈";var it="⁢";var Itilde="Ĩ";var itilde="ĩ";var Iukcy="І";var iukcy="і";var Iuml$1="Ï";var iuml$1="ï";var Jcirc="Ĵ";var jcirc="ĵ";var Jcy="Й";var jcy="й";var Jfr="𝔍";var jfr="𝔧";var jmath="ȷ";var Jopf="𝕁";var jopf="𝕛";var Jscr="𝒥";var jscr="𝒿";var Jsercy="Ј";var jsercy="ј";var Jukcy="Є";var jukcy="є";var Kappa="Κ";var kappa="κ";var kappav="ϰ";var Kcedil="Ķ";var kcedil="ķ";var Kcy="К";var kcy="к";var Kfr="𝔎";var kfr="𝔨";var kgreen="ĸ";var KHcy="Х";var khcy="х";var KJcy="Ќ";var kjcy="ќ";var Kopf="𝕂";var kopf="𝕜";var Kscr="𝒦";var kscr="𝓀";var lAarr="⇚";var Lacute="Ĺ";var lacute="ĺ";var laemptyv="⦴";var lagran="ℒ";var Lambda="Λ";var lambda="λ";var lang="⟨";var Lang="⟪";var langd="⦑";var langle="⟨";var lap="⪅";var Laplacetrf="ℒ";var laquo$1="«";var larrb="⇤";var larrbfs="⤟";var larr="←";var Larr="↞";var lArr="⇐";var larrfs="⤝";var larrhk="↩";var larrlp="↫";var larrpl="⤹";var larrsim="⥳";var larrtl="↢";var latail="⤙";var lAtail="⤛";var lat="⪫";var late="⪭";var lates="⪭︀";var lbarr="⤌";var lBarr="⤎";var lbbrk="❲";var lbrace="{";var lbrack="[";var lbrke="⦋";var lbrksld="⦏";var lbrkslu="⦍";var Lcaron="Ľ";var lcaron="ľ";var Lcedil="Ļ";var lcedil="ļ";var lceil="⌈";var lcub="{";var Lcy="Л";var lcy="л";var ldca="⤶";var ldquo="“";var ldquor="„";var ldrdhar="⥧";var ldrushar="⥋";var ldsh="↲";var le="≤";var lE="≦";var LeftAngleBracket="⟨";var LeftArrowBar="⇤";var leftarrow="←";var LeftArrow="←";var Leftarrow="⇐";var LeftArrowRightArrow="⇆";var leftarrowtail="↢";var LeftCeiling="⌈";var LeftDoubleBracket="⟦";var LeftDownTeeVector="⥡";var LeftDownVectorBar="⥙";var LeftDownVector="⇃";var LeftFloor="⌊";var leftharpoondown="↽";var leftharpoonup="↼";var leftleftarrows="⇇";var leftrightarrow="↔";var LeftRightArrow="↔";var Leftrightarrow="⇔";var leftrightarrows="⇆";var leftrightharpoons="⇋";var leftrightsquigarrow="↭";var LeftRightVector="⥎";var LeftTeeArrow="↤";var LeftTee="⊣";var LeftTeeVector="⥚";var leftthreetimes="⋋";var LeftTriangleBar="⧏";var LeftTriangle="⊲";var LeftTriangleEqual="⊴";var LeftUpDownVector="⥑";var LeftUpTeeVector="⥠";var LeftUpVectorBar="⥘";var LeftUpVector="↿";var LeftVectorBar="⥒";var LeftVector="↼";var lEg="⪋";var leg="⋚";var leq="≤";var leqq="≦";var leqslant="⩽";var lescc="⪨";var les="⩽";var lesdot="⩿";var lesdoto="⪁";var lesdotor="⪃";var lesg="⋚︀";var lesges="⪓";var lessapprox="⪅";var lessdot="⋖";var lesseqgtr="⋚";var lesseqqgtr="⪋";var LessEqualGreater="⋚";var LessFullEqual="≦";var LessGreater="≶";var lessgtr="≶";var LessLess="⪡";var lesssim="≲";var LessSlantEqual="⩽";var LessTilde="≲";var lfisht="⥼";var lfloor="⌊";var Lfr="𝔏";var lfr="𝔩";var lg="≶";var lgE="⪑";var lHar="⥢";var lhard="↽";var lharu="↼";var lharul="⥪";var lhblk="▄";var LJcy="Љ";var ljcy="љ";var llarr="⇇";var ll="≪";var Ll="⋘";var llcorner="⌞";var Lleftarrow="⇚";var llhard="⥫";var lltri="◺";var Lmidot="Ŀ";var lmidot="ŀ";var lmoustache="⎰";var lmoust="⎰";var lnap="⪉";var lnapprox="⪉";var lne="⪇";var lnE="≨";var lneq="⪇";var lneqq="≨";var lnsim="⋦";var loang="⟬";var loarr="⇽";var lobrk="⟦";var longleftarrow="⟵";var LongLeftArrow="⟵";var Longleftarrow="⟸";var longleftrightarrow="⟷";var LongLeftRightArrow="⟷";var Longleftrightarrow="⟺";var longmapsto="⟼";var longrightarrow="⟶";var LongRightArrow="⟶";var Longrightarrow="⟹";var looparrowleft="↫";var looparrowright="↬";var lopar="⦅";var Lopf="𝕃";var lopf="𝕝";var loplus="⨭";var lotimes="⨴";var lowast="∗";var lowbar="_";var LowerLeftArrow="↙";var LowerRightArrow="↘";var loz="◊";var lozenge="◊";var lozf="⧫";var lpar="(";var lparlt="⦓";var lrarr="⇆";var lrcorner="⌟";var lrhar="⇋";var lrhard="⥭";var lrm="‎";var lrtri="⊿";var lsaquo="‹";var lscr="𝓁";var Lscr="ℒ";var lsh="↰";var Lsh="↰";var lsim="≲";var lsime="⪍";var lsimg="⪏";var lsqb="[";var lsquo="‘";var lsquor="‚";var Lstrok="Ł";var lstrok="ł";var ltcc="⪦";var ltcir="⩹";var lt$2="<";var LT$1="<";var Lt="≪";var ltdot="⋖";var lthree="⋋";var ltimes="⋉";var ltlarr="⥶";var ltquest="⩻";var ltri="◃";var ltrie="⊴";var ltrif="◂";var ltrPar="⦖";var lurdshar="⥊";var luruhar="⥦";var lvertneqq="≨︀";var lvnE="≨︀";var macr$1="¯";var male="♂";var malt="✠";var maltese="✠";var map="↦";var mapsto="↦";var mapstodown="↧";var mapstoleft="↤";var mapstoup="↥";var marker="▮";var mcomma="⨩";var Mcy="М";var mcy="м";var mdash="—";var mDDot="∺";var measuredangle="∡";var MediumSpace=" ";var Mellintrf="ℳ";var Mfr="𝔐";var mfr="𝔪";var mho="℧";var micro$1="µ";var midast="*";var midcir="⫰";var mid="∣";var middot$1="·";var minusb="⊟";var minus="−";var minusd="∸";var minusdu="⨪";var MinusPlus="∓";var mlcp="⫛";var mldr="…";var mnplus="∓";var models="⊧";var Mopf="𝕄";var mopf="𝕞";var mp="∓";var mscr="𝓂";var Mscr="ℳ";var mstpos="∾";var Mu="Μ";var mu="μ";var multimap="⊸";var mumap="⊸";var nabla="∇";var Nacute="Ń";var nacute="ń";var nang="∠⃒";var nap="≉";var napE="⩰̸";var napid="≋̸";var napos="ʼn";var napprox="≉";var natural="♮";var naturals="ℕ";var natur="♮";var nbsp$1=" ";var nbump="≎̸";var nbumpe="≏̸";var ncap="⩃";var Ncaron="Ň";var ncaron="ň";var Ncedil="Ņ";var ncedil="ņ";var ncong="≇";var ncongdot="⩭̸";var ncup="⩂";var Ncy="Н";var ncy="н";var ndash="–";var nearhk="⤤";var nearr="↗";var neArr="⇗";var nearrow="↗";var ne="≠";var nedot="≐̸";var NegativeMediumSpace="​";var NegativeThickSpace="​";var NegativeThinSpace="​";var NegativeVeryThinSpace="​";var nequiv="≢";var nesear="⤨";var nesim="≂̸";var NestedGreaterGreater="≫";var NestedLessLess="≪";var NewLine="\n";var nexist="∄";var nexists="∄";var Nfr="𝔑";var nfr="𝔫";var ngE="≧̸";var nge="≱";var ngeq="≱";var ngeqq="≧̸";var ngeqslant="⩾̸";var nges="⩾̸";var nGg="⋙̸";var ngsim="≵";var nGt="≫⃒";var ngt="≯";var ngtr="≯";var nGtv="≫̸";var nharr="↮";var nhArr="⇎";var nhpar="⫲";var ni="∋";var nis="⋼";var nisd="⋺";var niv="∋";var NJcy="Њ";var njcy="њ";var nlarr="↚";var nlArr="⇍";var nldr="‥";var nlE="≦̸";var nle="≰";var nleftarrow="↚";var nLeftarrow="⇍";var nleftrightarrow="↮";var nLeftrightarrow="⇎";var nleq="≰";var nleqq="≦̸";var nleqslant="⩽̸";var nles="⩽̸";var nless="≮";var nLl="⋘̸";var nlsim="≴";var nLt="≪⃒";var nlt="≮";var nltri="⋪";var nltrie="⋬";var nLtv="≪̸";var nmid="∤";var NoBreak="⁠";var NonBreakingSpace=" ";var nopf="𝕟";var Nopf="ℕ";var Not="⫬";var not$1="¬";var NotCongruent="≢";var NotCupCap="≭";var NotDoubleVerticalBar="∦";var NotElement="∉";var NotEqual="≠";var NotEqualTilde="≂̸";var NotExists="∄";var NotGreater="≯";var NotGreaterEqual="≱";var NotGreaterFullEqual="≧̸";var NotGreaterGreater="≫̸";var NotGreaterLess="≹";var NotGreaterSlantEqual="⩾̸";var NotGreaterTilde="≵";var NotHumpDownHump="≎̸";var NotHumpEqual="≏̸";var notin="∉";var notindot="⋵̸";var notinE="⋹̸";var notinva="∉";var notinvb="⋷";var notinvc="⋶";var NotLeftTriangleBar="⧏̸";var NotLeftTriangle="⋪";var NotLeftTriangleEqual="⋬";var NotLess="≮";var NotLessEqual="≰";var NotLessGreater="≸";var NotLessLess="≪̸";var NotLessSlantEqual="⩽̸";var NotLessTilde="≴";var NotNestedGreaterGreater="⪢̸";var NotNestedLessLess="⪡̸";var notni="∌";var notniva="∌";var notnivb="⋾";var notnivc="⋽";var NotPrecedes="⊀";var NotPrecedesEqual="⪯̸";var NotPrecedesSlantEqual="⋠";var NotReverseElement="∌";var NotRightTriangleBar="⧐̸";var NotRightTriangle="⋫";var NotRightTriangleEqual="⋭";var NotSquareSubset="⊏̸";var NotSquareSubsetEqual="⋢";var NotSquareSuperset="⊐̸";var NotSquareSupersetEqual="⋣";var NotSubset="⊂⃒";var NotSubsetEqual="⊈";var NotSucceeds="⊁";var NotSucceedsEqual="⪰̸";var NotSucceedsSlantEqual="⋡";var NotSucceedsTilde="≿̸";var NotSuperset="⊃⃒";var NotSupersetEqual="⊉";var NotTilde="≁";var NotTildeEqual="≄";var NotTildeFullEqual="≇";var NotTildeTilde="≉";var NotVerticalBar="∤";var nparallel="∦";var npar="∦";var nparsl="⫽⃥";var npart="∂̸";var npolint="⨔";var npr="⊀";var nprcue="⋠";var nprec="⊀";var npreceq="⪯̸";var npre="⪯̸";var nrarrc="⤳̸";var nrarr="↛";var nrArr="⇏";var nrarrw="↝̸";var nrightarrow="↛";var nRightarrow="⇏";var nrtri="⋫";var nrtrie="⋭";var nsc="⊁";var nsccue="⋡";var nsce="⪰̸";var Nscr="𝒩";var nscr="𝓃";var nshortmid="∤";var nshortparallel="∦";var nsim="≁";var nsime="≄";var nsimeq="≄";var nsmid="∤";var nspar="∦";var nsqsube="⋢";var nsqsupe="⋣";var nsub="⊄";var nsubE="⫅̸";var nsube="⊈";var nsubset="⊂⃒";var nsubseteq="⊈";var nsubseteqq="⫅̸";var nsucc="⊁";var nsucceq="⪰̸";var nsup="⊅";var nsupE="⫆̸";var nsupe="⊉";var nsupset="⊃⃒";var nsupseteq="⊉";var nsupseteqq="⫆̸";var ntgl="≹";var Ntilde$1="Ñ";var ntilde$1="ñ";var ntlg="≸";var ntriangleleft="⋪";var ntrianglelefteq="⋬";var ntriangleright="⋫";var ntrianglerighteq="⋭";var Nu="Ν";var nu="ν";var num="#";var numero="№";var numsp=" ";var nvap="≍⃒";var nvdash="⊬";var nvDash="⊭";var nVdash="⊮";var nVDash="⊯";var nvge="≥⃒";var nvgt=">⃒";var nvHarr="⤄";var nvinfin="⧞";var nvlArr="⤂";var nvle="≤⃒";var nvlt="<⃒";var nvltrie="⊴⃒";var nvrArr="⤃";var nvrtrie="⊵⃒";var nvsim="∼⃒";var nwarhk="⤣";var nwarr="↖";var nwArr="⇖";var nwarrow="↖";var nwnear="⤧";var Oacute$1="Ó";var oacute$1="ó";var oast="⊛";var Ocirc$1="Ô";var ocirc$1="ô";var ocir="⊚";var Ocy="О";var ocy="о";var odash="⊝";var Odblac="Ő";var odblac="ő";var odiv="⨸";var odot="⊙";var odsold="⦼";var OElig="Œ";var oelig="œ";var ofcir="⦿";var Ofr="𝔒";var ofr="𝔬";var ogon="˛";var Ograve$1="Ò";var ograve$1="ò";var ogt="⧁";var ohbar="⦵";var ohm="Ω";var oint="∮";var olarr="↺";var olcir="⦾";var olcross="⦻";var oline="‾";var olt="⧀";var Omacr="Ō";var omacr="ō";var Omega="Ω";var omega="ω";var Omicron="Ο";var omicron="ο";var omid="⦶";var ominus="⊖";var Oopf="𝕆";var oopf="𝕠";var opar="⦷";var OpenCurlyDoubleQuote="“";var OpenCurlyQuote="‘";var operp="⦹";var oplus="⊕";var orarr="↻";var Or="⩔";var or="∨";var ord="⩝";var order="ℴ";var orderof="ℴ";var ordf$1="ª";var ordm$1="º";var origof="⊶";var oror="⩖";var orslope="⩗";var orv="⩛";var oS="Ⓢ";var Oscr="𝒪";var oscr="ℴ";var Oslash$1="Ø";var oslash$1="ø";var osol="⊘";var Otilde$1="Õ";var otilde$1="õ";var otimesas="⨶";var Otimes="⨷";var otimes="⊗";var Ouml$1="Ö";var ouml$1="ö";var ovbar="⌽";var OverBar="‾";var OverBrace="⏞";var OverBracket="⎴";var OverParenthesis="⏜";var para$1="¶";var parallel="∥";var par="∥";var parsim="⫳";var parsl="⫽";var part="∂";var PartialD="∂";var Pcy="П";var pcy="п";var percnt="%";var period=".";var permil="‰";var perp="⊥";var pertenk="‱";var Pfr="𝔓";var pfr="𝔭";var Phi="Φ";var phi="φ";var phiv="ϕ";var phmmat="ℳ";var phone="☎";var Pi="Π";var pi="π";var pitchfork="⋔";var piv="ϖ";var planck="ℏ";var planckh="ℎ";var plankv="ℏ";var plusacir="⨣";var plusb="⊞";var pluscir="⨢";var plus="+";var plusdo="∔";var plusdu="⨥";var pluse="⩲";var PlusMinus="±";var plusmn$1="±";var plussim="⨦";var plustwo="⨧";var pm="±";var Poincareplane="ℌ";var pointint="⨕";var popf="𝕡";var Popf="ℙ";var pound$1="£";var prap="⪷";var Pr="⪻";var pr="≺";var prcue="≼";var precapprox="⪷";var prec="≺";var preccurlyeq="≼";var Precedes="≺";var PrecedesEqual="⪯";var PrecedesSlantEqual="≼";var PrecedesTilde="≾";var preceq="⪯";var precnapprox="⪹";var precneqq="⪵";var precnsim="⋨";var pre="⪯";var prE="⪳";var precsim="≾";var prime="′";var Prime="″";var primes="ℙ";var prnap="⪹";var prnE="⪵";var prnsim="⋨";var prod="∏";var Product="∏";var profalar="⌮";var profline="⌒";var profsurf="⌓";var prop="∝";var Proportional="∝";var Proportion="∷";var propto="∝";var prsim="≾";var prurel="⊰";var Pscr="𝒫";var pscr="𝓅";var Psi="Ψ";var psi="ψ";var puncsp=" ";var Qfr="𝔔";var qfr="𝔮";var qint="⨌";var qopf="𝕢";var Qopf="ℚ";var qprime="⁗";var Qscr="𝒬";var qscr="𝓆";var quaternions="ℍ";var quatint="⨖";var quest="?";var questeq="≟";var quot$2='"';var QUOT$1='"';var rAarr="⇛";var race="∽̱";var Racute="Ŕ";var racute="ŕ";var radic="√";var raemptyv="⦳";var rang="⟩";var Rang="⟫";var rangd="⦒";var range="⦥";var rangle="⟩";var raquo$1="»";var rarrap="⥵";var rarrb="⇥";var rarrbfs="⤠";var rarrc="⤳";var rarr="→";var Rarr="↠";var rArr="⇒";var rarrfs="⤞";var rarrhk="↪";var rarrlp="↬";var rarrpl="⥅";var rarrsim="⥴";var Rarrtl="⤖";var rarrtl="↣";var rarrw="↝";var ratail="⤚";var rAtail="⤜";var ratio="∶";var rationals="ℚ";var rbarr="⤍";var rBarr="⤏";var RBarr="⤐";var rbbrk="❳";var rbrace="}";var rbrack="]";var rbrke="⦌";var rbrksld="⦎";var rbrkslu="⦐";var Rcaron="Ř";var rcaron="ř";var Rcedil="Ŗ";var rcedil="ŗ";var rceil="⌉";var rcub="}";var Rcy="Р";var rcy="р";var rdca="⤷";var rdldhar="⥩";var rdquo="”";var rdquor="”";var rdsh="↳";var real="ℜ";var realine="ℛ";var realpart="ℜ";var reals="ℝ";var Re="ℜ";var rect="▭";var reg$1="®";var REG$1="®";var ReverseElement="∋";var ReverseEquilibrium="⇋";var ReverseUpEquilibrium="⥯";var rfisht="⥽";var rfloor="⌋";var rfr="𝔯";var Rfr="ℜ";var rHar="⥤";var rhard="⇁";var rharu="⇀";var rharul="⥬";var Rho="Ρ";var rho="ρ";var rhov="ϱ";var RightAngleBracket="⟩";var RightArrowBar="⇥";var rightarrow="→";var RightArrow="→";var Rightarrow="⇒";var RightArrowLeftArrow="⇄";var rightarrowtail="↣";var RightCeiling="⌉";var RightDoubleBracket="⟧";var RightDownTeeVector="⥝";var RightDownVectorBar="⥕";var RightDownVector="⇂";var RightFloor="⌋";var rightharpoondown="⇁";var rightharpoonup="⇀";var rightleftarrows="⇄";var rightleftharpoons="⇌";var rightrightarrows="⇉";var rightsquigarrow="↝";var RightTeeArrow="↦";var RightTee="⊢";var RightTeeVector="⥛";var rightthreetimes="⋌";var RightTriangleBar="⧐";var RightTriangle="⊳";var RightTriangleEqual="⊵";var RightUpDownVector="⥏";var RightUpTeeVector="⥜";var RightUpVectorBar="⥔";var RightUpVector="↾";var RightVectorBar="⥓";var RightVector="⇀";var ring="˚";var risingdotseq="≓";var rlarr="⇄";var rlhar="⇌";var rlm="‏";var rmoustache="⎱";var rmoust="⎱";var rnmid="⫮";var roang="⟭";var roarr="⇾";var robrk="⟧";var ropar="⦆";var ropf="𝕣";var Ropf="ℝ";var roplus="⨮";var rotimes="⨵";var RoundImplies="⥰";var rpar=")";var rpargt="⦔";var rppolint="⨒";var rrarr="⇉";var Rrightarrow="⇛";var rsaquo="›";var rscr="𝓇";var Rscr="ℛ";var rsh="↱";var Rsh="↱";var rsqb="]";var rsquo="’";var rsquor="’";var rthree="⋌";var rtimes="⋊";var rtri="▹";var rtrie="⊵";var rtrif="▸";var rtriltri="⧎";var RuleDelayed="⧴";var ruluhar="⥨";var rx="℞";var Sacute="Ś";var sacute="ś";var sbquo="‚";var scap="⪸";var Scaron="Š";var scaron="š";var Sc="⪼";var sc="≻";var sccue="≽";var sce="⪰";var scE="⪴";var Scedil="Ş";var scedil="ş";var Scirc="Ŝ";var scirc="ŝ";var scnap="⪺";var scnE="⪶";var scnsim="⋩";var scpolint="⨓";var scsim="≿";var Scy="С";var scy="с";var sdotb="⊡";var sdot="⋅";var sdote="⩦";var searhk="⤥";var searr="↘";var seArr="⇘";var searrow="↘";var sect$1="§";var semi=";";var seswar="⤩";var setminus="∖";var setmn="∖";var sext="✶";var Sfr="𝔖";var sfr="𝔰";var sfrown="⌢";var sharp="♯";var SHCHcy="Щ";var shchcy="щ";var SHcy="Ш";var shcy="ш";var ShortDownArrow="↓";var ShortLeftArrow="←";var shortmid="∣";var shortparallel="∥";var ShortRightArrow="→";var ShortUpArrow="↑";var shy$1="­";var Sigma="Σ";var sigma="σ";var sigmaf="ς";var sigmav="ς";var sim="∼";var simdot="⩪";var sime="≃";var simeq="≃";var simg="⪞";var simgE="⪠";var siml="⪝";var simlE="⪟";var simne="≆";var simplus="⨤";var simrarr="⥲";var slarr="←";var SmallCircle="∘";var smallsetminus="∖";var smashp="⨳";var smeparsl="⧤";var smid="∣";var smile="⌣";var smt="⪪";var smte="⪬";var smtes="⪬︀";var SOFTcy="Ь";var softcy="ь";var solbar="⌿";var solb="⧄";var sol="/";var Sopf="𝕊";var sopf="𝕤";var spades="♠";var spadesuit="♠";var spar="∥";var sqcap="⊓";var sqcaps="⊓︀";var sqcup="⊔";var sqcups="⊔︀";var Sqrt="√";var sqsub="⊏";var sqsube="⊑";var sqsubset="⊏";var sqsubseteq="⊑";var sqsup="⊐";var sqsupe="⊒";var sqsupset="⊐";var sqsupseteq="⊒";var square="□";var Square="□";var SquareIntersection="⊓";var SquareSubset="⊏";var SquareSubsetEqual="⊑";var SquareSuperset="⊐";var SquareSupersetEqual="⊒";var SquareUnion="⊔";var squarf="▪";var squ="□";var squf="▪";var srarr="→";var Sscr="𝒮";var sscr="𝓈";var ssetmn="∖";var ssmile="⌣";var sstarf="⋆";var Star="⋆";var star="☆";var starf="★";var straightepsilon="ϵ";var straightphi="ϕ";var strns="¯";var sub="⊂";var Sub="⋐";var subdot="⪽";var subE="⫅";var sube="⊆";var subedot="⫃";var submult="⫁";var subnE="⫋";var subne="⊊";var subplus="⪿";var subrarr="⥹";var subset="⊂";var Subset="⋐";var subseteq="⊆";var subseteqq="⫅";var SubsetEqual="⊆";var subsetneq="⊊";var subsetneqq="⫋";var subsim="⫇";var subsub="⫕";var subsup="⫓";var succapprox="⪸";var succ="≻";var succcurlyeq="≽";var Succeeds="≻";var SucceedsEqual="⪰";var SucceedsSlantEqual="≽";var SucceedsTilde="≿";var succeq="⪰";var succnapprox="⪺";var succneqq="⪶";var succnsim="⋩";var succsim="≿";var SuchThat="∋";var sum="∑";var Sum="∑";var sung="♪";var sup1$1="¹";var sup2$1="²";var sup3$1="³";var sup="⊃";var Sup="⋑";var supdot="⪾";var supdsub="⫘";var supE="⫆";var supe="⊇";var supedot="⫄";var Superset="⊃";var SupersetEqual="⊇";var suphsol="⟉";var suphsub="⫗";var suplarr="⥻";var supmult="⫂";var supnE="⫌";var supne="⊋";var supplus="⫀";var supset="⊃";var Supset="⋑";var supseteq="⊇";var supseteqq="⫆";var supsetneq="⊋";var supsetneqq="⫌";var supsim="⫈";var supsub="⫔";var supsup="⫖";var swarhk="⤦";var swarr="↙";var swArr="⇙";var swarrow="↙";var swnwar="⤪";var szlig$1="ß";var Tab="\t";var target="⌖";var Tau="Τ";var tau="τ";var tbrk="⎴";var Tcaron="Ť";var tcaron="ť";var Tcedil="Ţ";var tcedil="ţ";var Tcy="Т";var tcy="т";var tdot="⃛";var telrec="⌕";var Tfr="𝔗";var tfr="𝔱";var there4="∴";var therefore="∴";var Therefore="∴";var Theta="Θ";var theta="θ";var thetasym="ϑ";var thetav="ϑ";var thickapprox="≈";var thicksim="∼";var ThickSpace="  ";var ThinSpace=" ";var thinsp=" ";var thkap="≈";var thksim="∼";var THORN$1="Þ";var thorn$1="þ";var tilde="˜";var Tilde="∼";var TildeEqual="≃";var TildeFullEqual="≅";var TildeTilde="≈";var timesbar="⨱";var timesb="⊠";var times$1="×";var timesd="⨰";var tint="∭";var toea="⤨";var topbot="⌶";var topcir="⫱";var top="⊤";var Topf="𝕋";var topf="𝕥";var topfork="⫚";var tosa="⤩";var tprime="‴";var trade="™";var TRADE="™";var triangle="▵";var triangledown="▿";var triangleleft="◃";var trianglelefteq="⊴";var triangleq="≜";var triangleright="▹";var trianglerighteq="⊵";var tridot="◬";var trie="≜";var triminus="⨺";var TripleDot="⃛";var triplus="⨹";var trisb="⧍";var tritime="⨻";var trpezium="⏢";var Tscr="𝒯";var tscr="𝓉";var TScy="Ц";var tscy="ц";var TSHcy="Ћ";var tshcy="ћ";var Tstrok="Ŧ";var tstrok="ŧ";var twixt="≬";var twoheadleftarrow="↞";var twoheadrightarrow="↠";var Uacute$1="Ú";var uacute$1="ú";var uarr="↑";var Uarr="↟";var uArr="⇑";var Uarrocir="⥉";var Ubrcy="Ў";var ubrcy="ў";var Ubreve="Ŭ";var ubreve="ŭ";var Ucirc$1="Û";var ucirc$1="û";var Ucy="У";var ucy="у";var udarr="⇅";var Udblac="Ű";var udblac="ű";var udhar="⥮";var ufisht="⥾";var Ufr="𝔘";var ufr="𝔲";var Ugrave$1="Ù";var ugrave$1="ù";var uHar="⥣";var uharl="↿";var uharr="↾";var uhblk="▀";var ulcorn="⌜";var ulcorner="⌜";var ulcrop="⌏";var ultri="◸";var Umacr="Ū";var umacr="ū";var uml$1="¨";var UnderBar="_";var UnderBrace="⏟";var UnderBracket="⎵";var UnderParenthesis="⏝";var Union="⋃";var UnionPlus="⊎";var Uogon="Ų";var uogon="ų";var Uopf="𝕌";var uopf="𝕦";var UpArrowBar="⤒";var uparrow="↑";var UpArrow="↑";var Uparrow="⇑";var UpArrowDownArrow="⇅";var updownarrow="↕";var UpDownArrow="↕";var Updownarrow="⇕";var UpEquilibrium="⥮";var upharpoonleft="↿";var upharpoonright="↾";var uplus="⊎";var UpperLeftArrow="↖";var UpperRightArrow="↗";var upsi="υ";var Upsi="ϒ";var upsih="ϒ";var Upsilon="Υ";var upsilon="υ";var UpTeeArrow="↥";var UpTee="⊥";var upuparrows="⇈";var urcorn="⌝";var urcorner="⌝";var urcrop="⌎";var Uring="Ů";var uring="ů";var urtri="◹";var Uscr="𝒰";var uscr="𝓊";var utdot="⋰";var Utilde="Ũ";var utilde="ũ";var utri="▵";var utrif="▴";var uuarr="⇈";var Uuml$1="Ü";var uuml$1="ü";var uwangle="⦧";var vangrt="⦜";var varepsilon="ϵ";var varkappa="ϰ";var varnothing="∅";var varphi="ϕ";var varpi="ϖ";var varpropto="∝";var varr="↕";var vArr="⇕";var varrho="ϱ";var varsigma="ς";var varsubsetneq="⊊︀";var varsubsetneqq="⫋︀";var varsupsetneq="⊋︀";var varsupsetneqq="⫌︀";var vartheta="ϑ";var vartriangleleft="⊲";var vartriangleright="⊳";var vBar="⫨";var Vbar="⫫";var vBarv="⫩";var Vcy="В";var vcy="в";var vdash="⊢";var vDash="⊨";var Vdash="⊩";var VDash="⊫";var Vdashl="⫦";var veebar="⊻";var vee="∨";var Vee="⋁";var veeeq="≚";var vellip="⋮";var verbar="|";var Verbar="‖";var vert="|";var Vert="‖";var VerticalBar="∣";var VerticalLine="|";var VerticalSeparator="❘";var VerticalTilde="≀";var VeryThinSpace=" ";var Vfr="𝔙";var vfr="𝔳";var vltri="⊲";var vnsub="⊂⃒";var vnsup="⊃⃒";var Vopf="𝕍";var vopf="𝕧";var vprop="∝";var vrtri="⊳";var Vscr="𝒱";var vscr="𝓋";var vsubnE="⫋︀";var vsubne="⊊︀";var vsupnE="⫌︀";var vsupne="⊋︀";var Vvdash="⊪";var vzigzag="⦚";var Wcirc="Ŵ";var wcirc="ŵ";var wedbar="⩟";var wedge="∧";var Wedge="⋀";var wedgeq="≙";var weierp="℘";var Wfr="𝔚";var wfr="𝔴";var Wopf="𝕎";var wopf="𝕨";var wp="℘";var wr="≀";var wreath="≀";var Wscr="𝒲";var wscr="𝓌";var xcap="⋂";var xcirc="◯";var xcup="⋃";var xdtri="▽";var Xfr="𝔛";var xfr="𝔵";var xharr="⟷";var xhArr="⟺";var Xi="Ξ";var xi="ξ";var xlarr="⟵";var xlArr="⟸";var xmap="⟼";var xnis="⋻";var xodot="⨀";var Xopf="𝕏";var xopf="𝕩";var xoplus="⨁";var xotime="⨂";var xrarr="⟶";var xrArr="⟹";var Xscr="𝒳";var xscr="𝓍";var xsqcup="⨆";var xuplus="⨄";var xutri="△";var xvee="⋁";var xwedge="⋀";var Yacute$1="Ý";var yacute$1="ý";var YAcy="Я";var yacy="я";var Ycirc="Ŷ";var ycirc="ŷ";var Ycy="Ы";var ycy="ы";var yen$1="¥";var Yfr="𝔜";var yfr="𝔶";var YIcy="Ї";var yicy="ї";var Yopf="𝕐";var yopf="𝕪";var Yscr="𝒴";var yscr="𝓎";var YUcy="Ю";var yucy="ю";var yuml$1="ÿ";var Yuml="Ÿ";var Zacute="Ź";var zacute="ź";var Zcaron="Ž";var zcaron="ž";var Zcy="З";var zcy="з";var Zdot="Ż";var zdot="ż";var zeetrf="ℨ";var ZeroWidthSpace="​";var Zeta="Ζ";var zeta="ζ";var zfr="𝔷";var Zfr="ℨ";var ZHcy="Ж";var zhcy="ж";var zigrarr="⇝";var zopf="𝕫";var Zopf="ℤ";var Zscr="𝒵";var zscr="𝓏";var zwj="‍";var zwnj="‌";var require$$1$1={Aacute:Aacute$1,aacute:aacute$1,Abreve:Abreve,abreve:abreve,ac:ac,acd:acd,acE:acE,Acirc:Acirc$1,acirc:acirc$1,acute:acute$1,Acy:Acy,acy:acy,AElig:AElig$1,aelig:aelig$1,af:af,Afr:Afr,afr:afr,Agrave:Agrave$1,agrave:agrave$1,alefsym:alefsym,aleph:aleph,Alpha:Alpha,alpha:alpha,Amacr:Amacr,amacr:amacr,amalg:amalg,amp:amp$2,AMP:AMP$1,andand:andand,And:And,and:and,andd:andd,andslope:andslope,andv:andv,ang:ang,ange:ange,angle:angle,angmsdaa:angmsdaa,angmsdab:angmsdab,angmsdac:angmsdac,angmsdad:angmsdad,angmsdae:angmsdae,angmsdaf:angmsdaf,angmsdag:angmsdag,angmsdah:angmsdah,angmsd:angmsd,angrt:angrt,angrtvb:angrtvb,angrtvbd:angrtvbd,angsph:angsph,angst:angst,angzarr:angzarr,Aogon:Aogon,aogon:aogon,Aopf:Aopf,aopf:aopf,apacir:apacir,ap:ap,apE:apE,ape:ape,apid:apid,apos:apos$1,ApplyFunction:ApplyFunction,approx:approx,approxeq:approxeq,Aring:Aring$1,aring:aring$1,Ascr:Ascr,ascr:ascr,Assign:Assign,ast:ast,asymp:asymp,asympeq:asympeq,Atilde:Atilde$1,atilde:atilde$1,Auml:Auml$1,auml:auml$1,awconint:awconint,awint:awint,backcong:backcong,backepsilon:backepsilon,backprime:backprime,backsim:backsim,backsimeq:backsimeq,Backslash:Backslash,Barv:Barv,barvee:barvee,barwed:barwed,Barwed:Barwed,barwedge:barwedge,bbrk:bbrk,bbrktbrk:bbrktbrk,bcong:bcong,Bcy:Bcy,bcy:bcy,bdquo:bdquo,becaus:becaus,because:because,Because:Because,bemptyv:bemptyv,bepsi:bepsi,bernou:bernou,Bernoullis:Bernoullis,Beta:Beta,beta:beta,beth:beth,between:between,Bfr:Bfr,bfr:bfr,bigcap:bigcap,bigcirc:bigcirc,bigcup:bigcup,bigodot:bigodot,bigoplus:bigoplus,bigotimes:bigotimes,bigsqcup:bigsqcup,bigstar:bigstar,bigtriangledown:bigtriangledown,bigtriangleup:bigtriangleup,biguplus:biguplus,bigvee:bigvee,bigwedge:bigwedge,bkarow:bkarow,blacklozenge:blacklozenge,blacksquare:blacksquare,blacktriangle:blacktriangle,blacktriangledown:blacktriangledown,blacktriangleleft:blacktriangleleft,blacktriangleright:blacktriangleright,blank:blank,blk12:blk12,blk14:blk14,blk34:blk34,block:block,bne:bne,bnequiv:bnequiv,bNot:bNot,bnot:bnot,Bopf:Bopf,bopf:bopf,bot:bot,bottom:bottom,bowtie:bowtie,boxbox:boxbox,boxdl:boxdl,boxdL:boxdL,boxDl:boxDl,boxDL:boxDL,boxdr:boxdr,boxdR:boxdR,boxDr:boxDr,boxDR:boxDR,boxh:boxh,boxH:boxH,boxhd:boxhd,boxHd:boxHd,boxhD:boxhD,boxHD:boxHD,boxhu:boxhu,boxHu:boxHu,boxhU:boxhU,boxHU:boxHU,boxminus:boxminus,boxplus:boxplus,boxtimes:boxtimes,boxul:boxul,boxuL:boxuL,boxUl:boxUl,boxUL:boxUL,boxur:boxur,boxuR:boxuR,boxUr:boxUr,boxUR:boxUR,boxv:boxv,boxV:boxV,boxvh:boxvh,boxvH:boxvH,boxVh:boxVh,boxVH:boxVH,boxvl:boxvl,boxvL:boxvL,boxVl:boxVl,boxVL:boxVL,boxvr:boxvr,boxvR:boxvR,boxVr:boxVr,boxVR:boxVR,bprime:bprime,breve:breve,Breve:Breve,brvbar:brvbar$1,bscr:bscr,Bscr:Bscr,bsemi:bsemi,bsim:bsim,bsime:bsime,bsolb:bsolb,bsol:bsol,bsolhsub:bsolhsub,bull:bull,bullet:bullet,bump:bump,bumpE:bumpE,bumpe:bumpe,Bumpeq:Bumpeq,bumpeq:bumpeq,Cacute:Cacute,cacute:cacute,capand:capand,capbrcup:capbrcup,capcap:capcap,cap:cap,Cap:Cap,capcup:capcup,capdot:capdot,CapitalDifferentialD:CapitalDifferentialD,caps:caps,caret:caret,caron:caron,Cayleys:Cayleys,ccaps:ccaps,Ccaron:Ccaron,ccaron:ccaron,Ccedil:Ccedil$1,ccedil:ccedil$1,Ccirc:Ccirc,ccirc:ccirc,Cconint:Cconint,ccups:ccups,ccupssm:ccupssm,Cdot:Cdot,cdot:cdot,cedil:cedil$1,Cedilla:Cedilla,cemptyv:cemptyv,cent:cent$1,centerdot:centerdot,CenterDot:CenterDot,cfr:cfr,Cfr:Cfr,CHcy:CHcy,chcy:chcy,check:check,checkmark:checkmark,Chi:Chi,chi:chi,circ:circ,circeq:circeq,circlearrowleft:circlearrowleft,circlearrowright:circlearrowright,circledast:circledast,circledcirc:circledcirc,circleddash:circleddash,CircleDot:CircleDot,circledR:circledR,circledS:circledS,CircleMinus:CircleMinus,CirclePlus:CirclePlus,CircleTimes:CircleTimes,cir:cir,cirE:cirE,cire:cire,cirfnint:cirfnint,cirmid:cirmid,cirscir:cirscir,ClockwiseContourIntegral:ClockwiseContourIntegral,CloseCurlyDoubleQuote:CloseCurlyDoubleQuote,CloseCurlyQuote:CloseCurlyQuote,clubs:clubs,clubsuit:clubsuit,colon:colon,Colon:Colon,Colone:Colone,colone:colone,coloneq:coloneq,comma:comma,commat:commat,comp:comp,compfn:compfn,complement:complement,complexes:complexes,cong:cong,congdot:congdot,Congruent:Congruent,conint:conint,Conint:Conint,ContourIntegral:ContourIntegral,copf:copf,Copf:Copf,coprod:coprod,Coproduct:Coproduct,copy:copy$2,COPY:COPY$1,copysr:copysr,CounterClockwiseContourIntegral:CounterClockwiseContourIntegral,crarr:crarr,cross:cross,Cross:Cross,Cscr:Cscr,cscr:cscr,csub:csub,csube:csube,csup:csup,csupe:csupe,ctdot:ctdot,cudarrl:cudarrl,cudarrr:cudarrr,cuepr:cuepr,cuesc:cuesc,cularr:cularr,cularrp:cularrp,cupbrcap:cupbrcap,cupcap:cupcap,CupCap:CupCap,cup:cup,Cup:Cup,cupcup:cupcup,cupdot:cupdot,cupor:cupor,cups:cups,curarr:curarr,curarrm:curarrm,curlyeqprec:curlyeqprec,curlyeqsucc:curlyeqsucc,curlyvee:curlyvee,curlywedge:curlywedge,curren:curren$1,curvearrowleft:curvearrowleft,curvearrowright:curvearrowright,cuvee:cuvee,cuwed:cuwed,cwconint:cwconint,cwint:cwint,cylcty:cylcty,dagger:dagger,Dagger:Dagger,daleth:daleth,darr:darr,Darr:Darr,dArr:dArr,dash:dash,Dashv:Dashv,dashv:dashv,dbkarow:dbkarow,dblac:dblac,Dcaron:Dcaron,dcaron:dcaron,Dcy:Dcy,dcy:dcy,ddagger:ddagger,ddarr:ddarr,DD:DD,dd:dd,DDotrahd:DDotrahd,ddotseq:ddotseq,deg:deg$1,Del:Del,Delta:Delta,delta:delta,demptyv:demptyv,dfisht:dfisht,Dfr:Dfr,dfr:dfr,dHar:dHar,dharl:dharl,dharr:dharr,DiacriticalAcute:DiacriticalAcute,DiacriticalDot:DiacriticalDot,DiacriticalDoubleAcute:DiacriticalDoubleAcute,DiacriticalGrave:DiacriticalGrave,DiacriticalTilde:DiacriticalTilde,diam:diam,diamond:diamond,Diamond:Diamond,diamondsuit:diamondsuit,diams:diams,die:die,DifferentialD:DifferentialD,digamma:digamma,disin:disin,div:div,divide:divide$1,divideontimes:divideontimes,divonx:divonx,DJcy:DJcy,djcy:djcy,dlcorn:dlcorn,dlcrop:dlcrop,dollar:dollar,Dopf:Dopf,dopf:dopf,Dot:Dot,dot:dot,DotDot:DotDot,doteq:doteq,doteqdot:doteqdot,DotEqual:DotEqual,dotminus:dotminus,dotplus:dotplus,dotsquare:dotsquare,doublebarwedge:doublebarwedge,DoubleContourIntegral:DoubleContourIntegral,DoubleDot:DoubleDot,DoubleDownArrow:DoubleDownArrow,DoubleLeftArrow:DoubleLeftArrow,DoubleLeftRightArrow:DoubleLeftRightArrow,DoubleLeftTee:DoubleLeftTee,DoubleLongLeftArrow:DoubleLongLeftArrow,DoubleLongLeftRightArrow:DoubleLongLeftRightArrow,DoubleLongRightArrow:DoubleLongRightArrow,DoubleRightArrow:DoubleRightArrow,DoubleRightTee:DoubleRightTee,DoubleUpArrow:DoubleUpArrow,DoubleUpDownArrow:DoubleUpDownArrow,DoubleVerticalBar:DoubleVerticalBar,DownArrowBar:DownArrowBar,downarrow:downarrow,DownArrow:DownArrow,Downarrow:Downarrow,DownArrowUpArrow:DownArrowUpArrow,DownBreve:DownBreve,downdownarrows:downdownarrows,downharpoonleft:downharpoonleft,downharpoonright:downharpoonright,DownLeftRightVector:DownLeftRightVector,DownLeftTeeVector:DownLeftTeeVector,DownLeftVectorBar:DownLeftVectorBar,DownLeftVector:DownLeftVector,DownRightTeeVector:DownRightTeeVector,DownRightVectorBar:DownRightVectorBar,DownRightVector:DownRightVector,DownTeeArrow:DownTeeArrow,DownTee:DownTee,drbkarow:drbkarow,drcorn:drcorn,drcrop:drcrop,Dscr:Dscr,dscr:dscr,DScy:DScy,dscy:dscy,dsol:dsol,Dstrok:Dstrok,dstrok:dstrok,dtdot:dtdot,dtri:dtri,dtrif:dtrif,duarr:duarr,duhar:duhar,dwangle:dwangle,DZcy:DZcy,dzcy:dzcy,dzigrarr:dzigrarr,Eacute:Eacute$1,eacute:eacute$1,easter:easter,Ecaron:Ecaron,ecaron:ecaron,Ecirc:Ecirc$1,ecirc:ecirc$1,ecir:ecir,ecolon:ecolon,Ecy:Ecy,ecy:ecy,eDDot:eDDot,Edot:Edot,edot:edot,eDot:eDot,ee:ee,efDot:efDot,Efr:Efr,efr:efr,eg:eg,Egrave:Egrave$1,egrave:egrave$1,egs:egs,egsdot:egsdot,el:el,Element:Element,elinters:elinters,ell:ell,els:els,elsdot:elsdot,Emacr:Emacr,emacr:emacr,empty:empty,emptyset:emptyset,EmptySmallSquare:EmptySmallSquare,emptyv:emptyv,EmptyVerySmallSquare:EmptyVerySmallSquare,emsp13:emsp13,emsp14:emsp14,emsp:emsp,ENG:ENG,eng:eng,ensp:ensp,Eogon:Eogon,eogon:eogon,Eopf:Eopf,eopf:eopf,epar:epar,eparsl:eparsl,eplus:eplus,epsi:epsi,Epsilon:Epsilon,epsilon:epsilon,epsiv:epsiv,eqcirc:eqcirc,eqcolon:eqcolon,eqsim:eqsim,eqslantgtr:eqslantgtr,eqslantless:eqslantless,Equal:Equal,equals:equals,EqualTilde:EqualTilde,equest:equest,Equilibrium:Equilibrium,equiv:equiv,equivDD:equivDD,eqvparsl:eqvparsl,erarr:erarr,erDot:erDot,escr:escr,Escr:Escr,esdot:esdot,Esim:Esim,esim:esim,Eta:Eta,eta:eta,ETH:ETH$1,eth:eth$1,Euml:Euml$1,euml:euml$1,euro:euro,excl:excl,exist:exist,Exists:Exists,expectation:expectation,exponentiale:exponentiale,ExponentialE:ExponentialE,fallingdotseq:fallingdotseq,Fcy:Fcy,fcy:fcy,female:female,ffilig:ffilig,fflig:fflig,ffllig:ffllig,Ffr:Ffr,ffr:ffr,filig:filig,FilledSmallSquare:FilledSmallSquare,FilledVerySmallSquare:FilledVerySmallSquare,fjlig:fjlig,flat:flat,fllig:fllig,fltns:fltns,fnof:fnof,Fopf:Fopf,fopf:fopf,forall:forall,ForAll:ForAll,fork:fork,forkv:forkv,Fouriertrf:Fouriertrf,fpartint:fpartint,frac12:frac12$1,frac13:frac13,frac14:frac14$1,frac15:frac15,frac16:frac16,frac18:frac18,frac23:frac23,frac25:frac25,frac34:frac34$1,frac35:frac35,frac38:frac38,frac45:frac45,frac56:frac56,frac58:frac58,frac78:frac78,frasl:frasl,frown:frown,fscr:fscr,Fscr:Fscr,gacute:gacute,Gamma:Gamma,gamma:gamma,Gammad:Gammad,gammad:gammad,gap:gap,Gbreve:Gbreve,gbreve:gbreve,Gcedil:Gcedil,Gcirc:Gcirc,gcirc:gcirc,Gcy:Gcy,gcy:gcy,Gdot:Gdot,gdot:gdot,ge:ge,gE:gE,gEl:gEl,gel:gel,geq:geq,geqq:geqq,geqslant:geqslant,gescc:gescc,ges:ges,gesdot:gesdot,gesdoto:gesdoto,gesdotol:gesdotol,gesl:gesl,gesles:gesles,Gfr:Gfr,gfr:gfr,gg:gg,Gg:Gg,ggg:ggg,gimel:gimel,GJcy:GJcy,gjcy:gjcy,gla:gla,gl:gl,glE:glE,glj:glj,gnap:gnap,gnapprox:gnapprox,gne:gne,gnE:gnE,gneq:gneq,gneqq:gneqq,gnsim:gnsim,Gopf:Gopf,gopf:gopf,grave:grave,GreaterEqual:GreaterEqual,GreaterEqualLess:GreaterEqualLess,GreaterFullEqual:GreaterFullEqual,GreaterGreater:GreaterGreater,GreaterLess:GreaterLess,GreaterSlantEqual:GreaterSlantEqual,GreaterTilde:GreaterTilde,Gscr:Gscr,gscr:gscr,gsim:gsim,gsime:gsime,gsiml:gsiml,gtcc:gtcc,gtcir:gtcir,gt:gt$2,GT:GT$1,Gt:Gt,gtdot:gtdot,gtlPar:gtlPar,gtquest:gtquest,gtrapprox:gtrapprox,gtrarr:gtrarr,gtrdot:gtrdot,gtreqless:gtreqless,gtreqqless:gtreqqless,gtrless:gtrless,gtrsim:gtrsim,gvertneqq:gvertneqq,gvnE:gvnE,Hacek:Hacek,hairsp:hairsp,half:half,hamilt:hamilt,HARDcy:HARDcy,hardcy:hardcy,harrcir:harrcir,harr:harr,hArr:hArr,harrw:harrw,Hat:Hat,hbar:hbar,Hcirc:Hcirc,hcirc:hcirc,hearts:hearts,heartsuit:heartsuit,hellip:hellip,hercon:hercon,hfr:hfr,Hfr:Hfr,HilbertSpace:HilbertSpace,hksearow:hksearow,hkswarow:hkswarow,hoarr:hoarr,homtht:homtht,hookleftarrow:hookleftarrow,hookrightarrow:hookrightarrow,hopf:hopf,Hopf:Hopf,horbar:horbar,HorizontalLine:HorizontalLine,hscr:hscr,Hscr:Hscr,hslash:hslash,Hstrok:Hstrok,hstrok:hstrok,HumpDownHump:HumpDownHump,HumpEqual:HumpEqual,hybull:hybull,hyphen:hyphen,Iacute:Iacute$1,iacute:iacute$1,ic:ic,Icirc:Icirc$1,icirc:icirc$1,Icy:Icy,icy:icy,Idot:Idot,IEcy:IEcy,iecy:iecy,iexcl:iexcl$1,iff:iff,ifr:ifr,Ifr:Ifr,Igrave:Igrave$1,igrave:igrave$1,ii:ii,iiiint:iiiint,iiint:iiint,iinfin:iinfin,iiota:iiota,IJlig:IJlig,ijlig:ijlig,Imacr:Imacr,imacr:imacr,image:image,ImaginaryI:ImaginaryI,imagline:imagline,imagpart:imagpart,imath:imath,Im:Im,imof:imof,imped:imped,Implies:Implies,incare:incare,in:"∈",infin:infin,infintie:infintie,inodot:inodot,intcal:intcal,int:int,Int:Int,integers:integers,Integral:Integral,intercal:intercal,Intersection:Intersection,intlarhk:intlarhk,intprod:intprod,InvisibleComma:InvisibleComma,InvisibleTimes:InvisibleTimes,IOcy:IOcy,iocy:iocy,Iogon:Iogon,iogon:iogon,Iopf:Iopf,iopf:iopf,Iota:Iota,iota:iota,iprod:iprod,iquest:iquest$1,iscr:iscr,Iscr:Iscr,isin:isin,isindot:isindot,isinE:isinE,isins:isins,isinsv:isinsv,isinv:isinv,it:it,Itilde:Itilde,itilde:itilde,Iukcy:Iukcy,iukcy:iukcy,Iuml:Iuml$1,iuml:iuml$1,Jcirc:Jcirc,jcirc:jcirc,Jcy:Jcy,jcy:jcy,Jfr:Jfr,jfr:jfr,jmath:jmath,Jopf:Jopf,jopf:jopf,Jscr:Jscr,jscr:jscr,Jsercy:Jsercy,jsercy:jsercy,Jukcy:Jukcy,jukcy:jukcy,Kappa:Kappa,kappa:kappa,kappav:kappav,Kcedil:Kcedil,kcedil:kcedil,Kcy:Kcy,kcy:kcy,Kfr:Kfr,kfr:kfr,kgreen:kgreen,KHcy:KHcy,khcy:khcy,KJcy:KJcy,kjcy:kjcy,Kopf:Kopf,kopf:kopf,Kscr:Kscr,kscr:kscr,lAarr:lAarr,Lacute:Lacute,lacute:lacute,laemptyv:laemptyv,lagran:lagran,Lambda:Lambda,lambda:lambda,lang:lang,Lang:Lang,langd:langd,langle:langle,lap:lap,Laplacetrf:Laplacetrf,laquo:laquo$1,larrb:larrb,larrbfs:larrbfs,larr:larr,Larr:Larr,lArr:lArr,larrfs:larrfs,larrhk:larrhk,larrlp:larrlp,larrpl:larrpl,larrsim:larrsim,larrtl:larrtl,latail:latail,lAtail:lAtail,lat:lat,late:late,lates:lates,lbarr:lbarr,lBarr:lBarr,lbbrk:lbbrk,lbrace:lbrace,lbrack:lbrack,lbrke:lbrke,lbrksld:lbrksld,lbrkslu:lbrkslu,Lcaron:Lcaron,lcaron:lcaron,Lcedil:Lcedil,lcedil:lcedil,lceil:lceil,lcub:lcub,Lcy:Lcy,lcy:lcy,ldca:ldca,ldquo:ldquo,ldquor:ldquor,ldrdhar:ldrdhar,ldrushar:ldrushar,ldsh:ldsh,le:le,lE:lE,LeftAngleBracket:LeftAngleBracket,LeftArrowBar:LeftArrowBar,leftarrow:leftarrow,LeftArrow:LeftArrow,Leftarrow:Leftarrow,LeftArrowRightArrow:LeftArrowRightArrow,leftarrowtail:leftarrowtail,LeftCeiling:LeftCeiling,LeftDoubleBracket:LeftDoubleBracket,LeftDownTeeVector:LeftDownTeeVector,LeftDownVectorBar:LeftDownVectorBar,LeftDownVector:LeftDownVector,LeftFloor:LeftFloor,leftharpoondown:leftharpoondown,leftharpoonup:leftharpoonup,leftleftarrows:leftleftarrows,leftrightarrow:leftrightarrow,LeftRightArrow:LeftRightArrow,Leftrightarrow:Leftrightarrow,leftrightarrows:leftrightarrows,leftrightharpoons:leftrightharpoons,leftrightsquigarrow:leftrightsquigarrow,LeftRightVector:LeftRightVector,LeftTeeArrow:LeftTeeArrow,LeftTee:LeftTee,LeftTeeVector:LeftTeeVector,leftthreetimes:leftthreetimes,LeftTriangleBar:LeftTriangleBar,LeftTriangle:LeftTriangle,LeftTriangleEqual:LeftTriangleEqual,LeftUpDownVector:LeftUpDownVector,LeftUpTeeVector:LeftUpTeeVector,LeftUpVectorBar:LeftUpVectorBar,LeftUpVector:LeftUpVector,LeftVectorBar:LeftVectorBar,LeftVector:LeftVector,lEg:lEg,leg:leg,leq:leq,leqq:leqq,leqslant:leqslant,lescc:lescc,les:les,lesdot:lesdot,lesdoto:lesdoto,lesdotor:lesdotor,lesg:lesg,lesges:lesges,lessapprox:lessapprox,lessdot:lessdot,lesseqgtr:lesseqgtr,lesseqqgtr:lesseqqgtr,LessEqualGreater:LessEqualGreater,LessFullEqual:LessFullEqual,LessGreater:LessGreater,lessgtr:lessgtr,LessLess:LessLess,lesssim:lesssim,LessSlantEqual:LessSlantEqual,LessTilde:LessTilde,lfisht:lfisht,lfloor:lfloor,Lfr:Lfr,lfr:lfr,lg:lg,lgE:lgE,lHar:lHar,lhard:lhard,lharu:lharu,lharul:lharul,lhblk:lhblk,LJcy:LJcy,ljcy:ljcy,llarr:llarr,ll:ll,Ll:Ll,llcorner:llcorner,Lleftarrow:Lleftarrow,llhard:llhard,lltri:lltri,Lmidot:Lmidot,lmidot:lmidot,lmoustache:lmoustache,lmoust:lmoust,lnap:lnap,lnapprox:lnapprox,lne:lne,lnE:lnE,lneq:lneq,lneqq:lneqq,lnsim:lnsim,loang:loang,loarr:loarr,lobrk:lobrk,longleftarrow:longleftarrow,LongLeftArrow:LongLeftArrow,Longleftarrow:Longleftarrow,longleftrightarrow:longleftrightarrow,LongLeftRightArrow:LongLeftRightArrow,Longleftrightarrow:Longleftrightarrow,longmapsto:longmapsto,longrightarrow:longrightarrow,LongRightArrow:LongRightArrow,Longrightarrow:Longrightarrow,looparrowleft:looparrowleft,looparrowright:looparrowright,lopar:lopar,Lopf:Lopf,lopf:lopf,loplus:loplus,lotimes:lotimes,lowast:lowast,lowbar:lowbar,LowerLeftArrow:LowerLeftArrow,LowerRightArrow:LowerRightArrow,loz:loz,lozenge:lozenge,lozf:lozf,lpar:lpar,lparlt:lparlt,lrarr:lrarr,lrcorner:lrcorner,lrhar:lrhar,lrhard:lrhard,lrm:lrm,lrtri:lrtri,lsaquo:lsaquo,lscr:lscr,Lscr:Lscr,lsh:lsh,Lsh:Lsh,lsim:lsim,lsime:lsime,lsimg:lsimg,lsqb:lsqb,lsquo:lsquo,lsquor:lsquor,Lstrok:Lstrok,lstrok:lstrok,ltcc:ltcc,ltcir:ltcir,lt:lt$2,LT:LT$1,Lt:Lt,ltdot:ltdot,lthree:lthree,ltimes:ltimes,ltlarr:ltlarr,ltquest:ltquest,ltri:ltri,ltrie:ltrie,ltrif:ltrif,ltrPar:ltrPar,lurdshar:lurdshar,luruhar:luruhar,lvertneqq:lvertneqq,lvnE:lvnE,macr:macr$1,male:male,malt:malt,maltese:maltese,Map:"⤅",map:map,mapsto:mapsto,mapstodown:mapstodown,mapstoleft:mapstoleft,mapstoup:mapstoup,marker:marker,mcomma:mcomma,Mcy:Mcy,mcy:mcy,mdash:mdash,mDDot:mDDot,measuredangle:measuredangle,MediumSpace:MediumSpace,Mellintrf:Mellintrf,Mfr:Mfr,mfr:mfr,mho:mho,micro:micro$1,midast:midast,midcir:midcir,mid:mid,middot:middot$1,minusb:minusb,minus:minus,minusd:minusd,minusdu:minusdu,MinusPlus:MinusPlus,mlcp:mlcp,mldr:mldr,mnplus:mnplus,models:models,Mopf:Mopf,mopf:mopf,mp:mp,mscr:mscr,Mscr:Mscr,mstpos:mstpos,Mu:Mu,mu:mu,multimap:multimap,mumap:mumap,nabla:nabla,Nacute:Nacute,nacute:nacute,nang:nang,nap:nap,napE:napE,napid:napid,napos:napos,napprox:napprox,natural:natural,naturals:naturals,natur:natur,nbsp:nbsp$1,nbump:nbump,nbumpe:nbumpe,ncap:ncap,Ncaron:Ncaron,ncaron:ncaron,Ncedil:Ncedil,ncedil:ncedil,ncong:ncong,ncongdot:ncongdot,ncup:ncup,Ncy:Ncy,ncy:ncy,ndash:ndash,nearhk:nearhk,nearr:nearr,neArr:neArr,nearrow:nearrow,ne:ne,nedot:nedot,NegativeMediumSpace:NegativeMediumSpace,NegativeThickSpace:NegativeThickSpace,NegativeThinSpace:NegativeThinSpace,NegativeVeryThinSpace:NegativeVeryThinSpace,nequiv:nequiv,nesear:nesear,nesim:nesim,NestedGreaterGreater:NestedGreaterGreater,NestedLessLess:NestedLessLess,NewLine:NewLine,nexist:nexist,nexists:nexists,Nfr:Nfr,nfr:nfr,ngE:ngE,nge:nge,ngeq:ngeq,ngeqq:ngeqq,ngeqslant:ngeqslant,nges:nges,nGg:nGg,ngsim:ngsim,nGt:nGt,ngt:ngt,ngtr:ngtr,nGtv:nGtv,nharr:nharr,nhArr:nhArr,nhpar:nhpar,ni:ni,nis:nis,nisd:nisd,niv:niv,NJcy:NJcy,njcy:njcy,nlarr:nlarr,nlArr:nlArr,nldr:nldr,nlE:nlE,nle:nle,nleftarrow:nleftarrow,nLeftarrow:nLeftarrow,nleftrightarrow:nleftrightarrow,nLeftrightarrow:nLeftrightarrow,nleq:nleq,nleqq:nleqq,nleqslant:nleqslant,nles:nles,nless:nless,nLl:nLl,nlsim:nlsim,nLt:nLt,nlt:nlt,nltri:nltri,nltrie:nltrie,nLtv:nLtv,nmid:nmid,NoBreak:NoBreak,NonBreakingSpace:NonBreakingSpace,nopf:nopf,Nopf:Nopf,Not:Not,not:not$1,NotCongruent:NotCongruent,NotCupCap:NotCupCap,NotDoubleVerticalBar:NotDoubleVerticalBar,NotElement:NotElement,NotEqual:NotEqual,NotEqualTilde:NotEqualTilde,NotExists:NotExists,NotGreater:NotGreater,NotGreaterEqual:NotGreaterEqual,NotGreaterFullEqual:NotGreaterFullEqual,NotGreaterGreater:NotGreaterGreater,NotGreaterLess:NotGreaterLess,NotGreaterSlantEqual:NotGreaterSlantEqual,NotGreaterTilde:NotGreaterTilde,NotHumpDownHump:NotHumpDownHump,NotHumpEqual:NotHumpEqual,notin:notin,notindot:notindot,notinE:notinE,notinva:notinva,notinvb:notinvb,notinvc:notinvc,NotLeftTriangleBar:NotLeftTriangleBar,NotLeftTriangle:NotLeftTriangle,NotLeftTriangleEqual:NotLeftTriangleEqual,NotLess:NotLess,NotLessEqual:NotLessEqual,NotLessGreater:NotLessGreater,NotLessLess:NotLessLess,NotLessSlantEqual:NotLessSlantEqual,NotLessTilde:NotLessTilde,NotNestedGreaterGreater:NotNestedGreaterGreater,NotNestedLessLess:NotNestedLessLess,notni:notni,notniva:notniva,notnivb:notnivb,notnivc:notnivc,NotPrecedes:NotPrecedes,NotPrecedesEqual:NotPrecedesEqual,NotPrecedesSlantEqual:NotPrecedesSlantEqual,NotReverseElement:NotReverseElement,NotRightTriangleBar:NotRightTriangleBar,NotRightTriangle:NotRightTriangle,NotRightTriangleEqual:NotRightTriangleEqual,NotSquareSubset:NotSquareSubset,NotSquareSubsetEqual:NotSquareSubsetEqual,NotSquareSuperset:NotSquareSuperset,NotSquareSupersetEqual:NotSquareSupersetEqual,NotSubset:NotSubset,NotSubsetEqual:NotSubsetEqual,NotSucceeds:NotSucceeds,NotSucceedsEqual:NotSucceedsEqual,NotSucceedsSlantEqual:NotSucceedsSlantEqual,NotSucceedsTilde:NotSucceedsTilde,NotSuperset:NotSuperset,NotSupersetEqual:NotSupersetEqual,NotTilde:NotTilde,NotTildeEqual:NotTildeEqual,NotTildeFullEqual:NotTildeFullEqual,NotTildeTilde:NotTildeTilde,NotVerticalBar:NotVerticalBar,nparallel:nparallel,npar:npar,nparsl:nparsl,npart:npart,npolint:npolint,npr:npr,nprcue:nprcue,nprec:nprec,npreceq:npreceq,npre:npre,nrarrc:nrarrc,nrarr:nrarr,nrArr:nrArr,nrarrw:nrarrw,nrightarrow:nrightarrow,nRightarrow:nRightarrow,nrtri:nrtri,nrtrie:nrtrie,nsc:nsc,nsccue:nsccue,nsce:nsce,Nscr:Nscr,nscr:nscr,nshortmid:nshortmid,nshortparallel:nshortparallel,nsim:nsim,nsime:nsime,nsimeq:nsimeq,nsmid:nsmid,nspar:nspar,nsqsube:nsqsube,nsqsupe:nsqsupe,nsub:nsub,nsubE:nsubE,nsube:nsube,nsubset:nsubset,nsubseteq:nsubseteq,nsubseteqq:nsubseteqq,nsucc:nsucc,nsucceq:nsucceq,nsup:nsup,nsupE:nsupE,nsupe:nsupe,nsupset:nsupset,nsupseteq:nsupseteq,nsupseteqq:nsupseteqq,ntgl:ntgl,Ntilde:Ntilde$1,ntilde:ntilde$1,ntlg:ntlg,ntriangleleft:ntriangleleft,ntrianglelefteq:ntrianglelefteq,ntriangleright:ntriangleright,ntrianglerighteq:ntrianglerighteq,Nu:Nu,nu:nu,num:num,numero:numero,numsp:numsp,nvap:nvap,nvdash:nvdash,nvDash:nvDash,nVdash:nVdash,nVDash:nVDash,nvge:nvge,nvgt:nvgt,nvHarr:nvHarr,nvinfin:nvinfin,nvlArr:nvlArr,nvle:nvle,nvlt:nvlt,nvltrie:nvltrie,nvrArr:nvrArr,nvrtrie:nvrtrie,nvsim:nvsim,nwarhk:nwarhk,nwarr:nwarr,nwArr:nwArr,nwarrow:nwarrow,nwnear:nwnear,Oacute:Oacute$1,oacute:oacute$1,oast:oast,Ocirc:Ocirc$1,ocirc:ocirc$1,ocir:ocir,Ocy:Ocy,ocy:ocy,odash:odash,Odblac:Odblac,odblac:odblac,odiv:odiv,odot:odot,odsold:odsold,OElig:OElig,oelig:oelig,ofcir:ofcir,Ofr:Ofr,ofr:ofr,ogon:ogon,Ograve:Ograve$1,ograve:ograve$1,ogt:ogt,ohbar:ohbar,ohm:ohm,oint:oint,olarr:olarr,olcir:olcir,olcross:olcross,oline:oline,olt:olt,Omacr:Omacr,omacr:omacr,Omega:Omega,omega:omega,Omicron:Omicron,omicron:omicron,omid:omid,ominus:ominus,Oopf:Oopf,oopf:oopf,opar:opar,OpenCurlyDoubleQuote:OpenCurlyDoubleQuote,OpenCurlyQuote:OpenCurlyQuote,operp:operp,oplus:oplus,orarr:orarr,Or:Or,or:or,ord:ord,order:order,orderof:orderof,ordf:ordf$1,ordm:ordm$1,origof:origof,oror:oror,orslope:orslope,orv:orv,oS:oS,Oscr:Oscr,oscr:oscr,Oslash:Oslash$1,oslash:oslash$1,osol:osol,Otilde:Otilde$1,otilde:otilde$1,otimesas:otimesas,Otimes:Otimes,otimes:otimes,Ouml:Ouml$1,ouml:ouml$1,ovbar:ovbar,OverBar:OverBar,OverBrace:OverBrace,OverBracket:OverBracket,OverParenthesis:OverParenthesis,para:para$1,parallel:parallel,par:par,parsim:parsim,parsl:parsl,part:part,PartialD:PartialD,Pcy:Pcy,pcy:pcy,percnt:percnt,period:period,permil:permil,perp:perp,pertenk:pertenk,Pfr:Pfr,pfr:pfr,Phi:Phi,phi:phi,phiv:phiv,phmmat:phmmat,phone:phone,Pi:Pi,pi:pi,pitchfork:pitchfork,piv:piv,planck:planck,planckh:planckh,plankv:plankv,plusacir:plusacir,plusb:plusb,pluscir:pluscir,plus:plus,plusdo:plusdo,plusdu:plusdu,pluse:pluse,PlusMinus:PlusMinus,plusmn:plusmn$1,plussim:plussim,plustwo:plustwo,pm:pm,Poincareplane:Poincareplane,pointint:pointint,popf:popf,Popf:Popf,pound:pound$1,prap:prap,Pr:Pr,pr:pr,prcue:prcue,precapprox:precapprox,prec:prec,preccurlyeq:preccurlyeq,Precedes:Precedes,PrecedesEqual:PrecedesEqual,PrecedesSlantEqual:PrecedesSlantEqual,PrecedesTilde:PrecedesTilde,preceq:preceq,precnapprox:precnapprox,precneqq:precneqq,precnsim:precnsim,pre:pre,prE:prE,precsim:precsim,prime:prime,Prime:Prime,primes:primes,prnap:prnap,prnE:prnE,prnsim:prnsim,prod:prod,Product:Product,profalar:profalar,profline:profline,profsurf:profsurf,prop:prop,Proportional:Proportional,Proportion:Proportion,propto:propto,prsim:prsim,prurel:prurel,Pscr:Pscr,pscr:pscr,Psi:Psi,psi:psi,puncsp:puncsp,Qfr:Qfr,qfr:qfr,qint:qint,qopf:qopf,Qopf:Qopf,qprime:qprime,Qscr:Qscr,qscr:qscr,quaternions:quaternions,quatint:quatint,quest:quest,questeq:questeq,quot:quot$2,QUOT:QUOT$1,rAarr:rAarr,race:race,Racute:Racute,racute:racute,radic:radic,raemptyv:raemptyv,rang:rang,Rang:Rang,rangd:rangd,range:range,rangle:rangle,raquo:raquo$1,rarrap:rarrap,rarrb:rarrb,rarrbfs:rarrbfs,rarrc:rarrc,rarr:rarr,Rarr:Rarr,rArr:rArr,rarrfs:rarrfs,rarrhk:rarrhk,rarrlp:rarrlp,rarrpl:rarrpl,rarrsim:rarrsim,Rarrtl:Rarrtl,rarrtl:rarrtl,rarrw:rarrw,ratail:ratail,rAtail:rAtail,ratio:ratio,rationals:rationals,rbarr:rbarr,rBarr:rBarr,RBarr:RBarr,rbbrk:rbbrk,rbrace:rbrace,rbrack:rbrack,rbrke:rbrke,rbrksld:rbrksld,rbrkslu:rbrkslu,Rcaron:Rcaron,rcaron:rcaron,Rcedil:Rcedil,rcedil:rcedil,rceil:rceil,rcub:rcub,Rcy:Rcy,rcy:rcy,rdca:rdca,rdldhar:rdldhar,rdquo:rdquo,rdquor:rdquor,rdsh:rdsh,real:real,realine:realine,realpart:realpart,reals:reals,Re:Re,rect:rect,reg:reg$1,REG:REG$1,ReverseElement:ReverseElement,ReverseEquilibrium:ReverseEquilibrium,ReverseUpEquilibrium:ReverseUpEquilibrium,rfisht:rfisht,rfloor:rfloor,rfr:rfr,Rfr:Rfr,rHar:rHar,rhard:rhard,rharu:rharu,rharul:rharul,Rho:Rho,rho:rho,rhov:rhov,RightAngleBracket:RightAngleBracket,RightArrowBar:RightArrowBar,rightarrow:rightarrow,RightArrow:RightArrow,Rightarrow:Rightarrow,RightArrowLeftArrow:RightArrowLeftArrow,rightarrowtail:rightarrowtail,RightCeiling:RightCeiling,RightDoubleBracket:RightDoubleBracket,RightDownTeeVector:RightDownTeeVector,RightDownVectorBar:RightDownVectorBar,RightDownVector:RightDownVector,RightFloor:RightFloor,rightharpoondown:rightharpoondown,rightharpoonup:rightharpoonup,rightleftarrows:rightleftarrows,rightleftharpoons:rightleftharpoons,rightrightarrows:rightrightarrows,rightsquigarrow:rightsquigarrow,RightTeeArrow:RightTeeArrow,RightTee:RightTee,RightTeeVector:RightTeeVector,rightthreetimes:rightthreetimes,RightTriangleBar:RightTriangleBar,RightTriangle:RightTriangle,RightTriangleEqual:RightTriangleEqual,RightUpDownVector:RightUpDownVector,RightUpTeeVector:RightUpTeeVector,RightUpVectorBar:RightUpVectorBar,RightUpVector:RightUpVector,RightVectorBar:RightVectorBar,RightVector:RightVector,ring:ring,risingdotseq:risingdotseq,rlarr:rlarr,rlhar:rlhar,rlm:rlm,rmoustache:rmoustache,rmoust:rmoust,rnmid:rnmid,roang:roang,roarr:roarr,robrk:robrk,ropar:ropar,ropf:ropf,Ropf:Ropf,roplus:roplus,rotimes:rotimes,RoundImplies:RoundImplies,rpar:rpar,rpargt:rpargt,rppolint:rppolint,rrarr:rrarr,Rrightarrow:Rrightarrow,rsaquo:rsaquo,rscr:rscr,Rscr:Rscr,rsh:rsh,Rsh:Rsh,rsqb:rsqb,rsquo:rsquo,rsquor:rsquor,rthree:rthree,rtimes:rtimes,rtri:rtri,rtrie:rtrie,rtrif:rtrif,rtriltri:rtriltri,RuleDelayed:RuleDelayed,ruluhar:ruluhar,rx:rx,Sacute:Sacute,sacute:sacute,sbquo:sbquo,scap:scap,Scaron:Scaron,scaron:scaron,Sc:Sc,sc:sc,sccue:sccue,sce:sce,scE:scE,Scedil:Scedil,scedil:scedil,Scirc:Scirc,scirc:scirc,scnap:scnap,scnE:scnE,scnsim:scnsim,scpolint:scpolint,scsim:scsim,Scy:Scy,scy:scy,sdotb:sdotb,sdot:sdot,sdote:sdote,searhk:searhk,searr:searr,seArr:seArr,searrow:searrow,sect:sect$1,semi:semi,seswar:seswar,setminus:setminus,setmn:setmn,sext:sext,Sfr:Sfr,sfr:sfr,sfrown:sfrown,sharp:sharp,SHCHcy:SHCHcy,shchcy:shchcy,SHcy:SHcy,shcy:shcy,ShortDownArrow:ShortDownArrow,ShortLeftArrow:ShortLeftArrow,shortmid:shortmid,shortparallel:shortparallel,ShortRightArrow:ShortRightArrow,ShortUpArrow:ShortUpArrow,shy:shy$1,Sigma:Sigma,sigma:sigma,sigmaf:sigmaf,sigmav:sigmav,sim:sim,simdot:simdot,sime:sime,simeq:simeq,simg:simg,simgE:simgE,siml:siml,simlE:simlE,simne:simne,simplus:simplus,simrarr:simrarr,slarr:slarr,SmallCircle:SmallCircle,smallsetminus:smallsetminus,smashp:smashp,smeparsl:smeparsl,smid:smid,smile:smile,smt:smt,smte:smte,smtes:smtes,SOFTcy:SOFTcy,softcy:softcy,solbar:solbar,solb:solb,sol:sol,Sopf:Sopf,sopf:sopf,spades:spades,spadesuit:spadesuit,spar:spar,sqcap:sqcap,sqcaps:sqcaps,sqcup:sqcup,sqcups:sqcups,Sqrt:Sqrt,sqsub:sqsub,sqsube:sqsube,sqsubset:sqsubset,sqsubseteq:sqsubseteq,sqsup:sqsup,sqsupe:sqsupe,sqsupset:sqsupset,sqsupseteq:sqsupseteq,square:square,Square:Square,SquareIntersection:SquareIntersection,SquareSubset:SquareSubset,SquareSubsetEqual:SquareSubsetEqual,SquareSuperset:SquareSuperset,SquareSupersetEqual:SquareSupersetEqual,SquareUnion:SquareUnion,squarf:squarf,squ:squ,squf:squf,srarr:srarr,Sscr:Sscr,sscr:sscr,ssetmn:ssetmn,ssmile:ssmile,sstarf:sstarf,Star:Star,star:star,starf:starf,straightepsilon:straightepsilon,straightphi:straightphi,strns:strns,sub:sub,Sub:Sub,subdot:subdot,subE:subE,sube:sube,subedot:subedot,submult:submult,subnE:subnE,subne:subne,subplus:subplus,subrarr:subrarr,subset:subset,Subset:Subset,subseteq:subseteq,subseteqq:subseteqq,SubsetEqual:SubsetEqual,subsetneq:subsetneq,subsetneqq:subsetneqq,subsim:subsim,subsub:subsub,subsup:subsup,succapprox:succapprox,succ:succ,succcurlyeq:succcurlyeq,Succeeds:Succeeds,SucceedsEqual:SucceedsEqual,SucceedsSlantEqual:SucceedsSlantEqual,SucceedsTilde:SucceedsTilde,succeq:succeq,succnapprox:succnapprox,succneqq:succneqq,succnsim:succnsim,succsim:succsim,SuchThat:SuchThat,sum:sum,Sum:Sum,sung:sung,sup1:sup1$1,sup2:sup2$1,sup3:sup3$1,sup:sup,Sup:Sup,supdot:supdot,supdsub:supdsub,supE:supE,supe:supe,supedot:supedot,Superset:Superset,SupersetEqual:SupersetEqual,suphsol:suphsol,suphsub:suphsub,suplarr:suplarr,supmult:supmult,supnE:supnE,supne:supne,supplus:supplus,supset:supset,Supset:Supset,supseteq:supseteq,supseteqq:supseteqq,supsetneq:supsetneq,supsetneqq:supsetneqq,supsim:supsim,supsub:supsub,supsup:supsup,swarhk:swarhk,swarr:swarr,swArr:swArr,swarrow:swarrow,swnwar:swnwar,szlig:szlig$1,Tab:Tab,target:target,Tau:Tau,tau:tau,tbrk:tbrk,Tcaron:Tcaron,tcaron:tcaron,Tcedil:Tcedil,tcedil:tcedil,Tcy:Tcy,tcy:tcy,tdot:tdot,telrec:telrec,Tfr:Tfr,tfr:tfr,there4:there4,therefore:therefore,Therefore:Therefore,Theta:Theta,theta:theta,thetasym:thetasym,thetav:thetav,thickapprox:thickapprox,thicksim:thicksim,ThickSpace:ThickSpace,ThinSpace:ThinSpace,thinsp:thinsp,thkap:thkap,thksim:thksim,THORN:THORN$1,thorn:thorn$1,tilde:tilde,Tilde:Tilde,TildeEqual:TildeEqual,TildeFullEqual:TildeFullEqual,TildeTilde:TildeTilde,timesbar:timesbar,timesb:timesb,times:times$1,timesd:timesd,tint:tint,toea:toea,topbot:topbot,topcir:topcir,top:top,Topf:Topf,topf:topf,topfork:topfork,tosa:tosa,tprime:tprime,trade:trade,TRADE:TRADE,triangle:triangle,triangledown:triangledown,triangleleft:triangleleft,trianglelefteq:trianglelefteq,triangleq:triangleq,triangleright:triangleright,trianglerighteq:trianglerighteq,tridot:tridot,trie:trie,triminus:triminus,TripleDot:TripleDot,triplus:triplus,trisb:trisb,tritime:tritime,trpezium:trpezium,Tscr:Tscr,tscr:tscr,TScy:TScy,tscy:tscy,TSHcy:TSHcy,tshcy:tshcy,Tstrok:Tstrok,tstrok:tstrok,twixt:twixt,twoheadleftarrow:twoheadleftarrow,twoheadrightarrow:twoheadrightarrow,Uacute:Uacute$1,uacute:uacute$1,uarr:uarr,Uarr:Uarr,uArr:uArr,Uarrocir:Uarrocir,Ubrcy:Ubrcy,ubrcy:ubrcy,Ubreve:Ubreve,ubreve:ubreve,Ucirc:Ucirc$1,ucirc:ucirc$1,Ucy:Ucy,ucy:ucy,udarr:udarr,Udblac:Udblac,udblac:udblac,udhar:udhar,ufisht:ufisht,Ufr:Ufr,ufr:ufr,Ugrave:Ugrave$1,ugrave:ugrave$1,uHar:uHar,uharl:uharl,uharr:uharr,uhblk:uhblk,ulcorn:ulcorn,ulcorner:ulcorner,ulcrop:ulcrop,ultri:ultri,Umacr:Umacr,umacr:umacr,uml:uml$1,UnderBar:UnderBar,UnderBrace:UnderBrace,UnderBracket:UnderBracket,UnderParenthesis:UnderParenthesis,Union:Union,UnionPlus:UnionPlus,Uogon:Uogon,uogon:uogon,Uopf:Uopf,uopf:uopf,UpArrowBar:UpArrowBar,uparrow:uparrow,UpArrow:UpArrow,Uparrow:Uparrow,UpArrowDownArrow:UpArrowDownArrow,updownarrow:updownarrow,UpDownArrow:UpDownArrow,Updownarrow:Updownarrow,UpEquilibrium:UpEquilibrium,upharpoonleft:upharpoonleft,upharpoonright:upharpoonright,uplus:uplus,UpperLeftArrow:UpperLeftArrow,UpperRightArrow:UpperRightArrow,upsi:upsi,Upsi:Upsi,upsih:upsih,Upsilon:Upsilon,upsilon:upsilon,UpTeeArrow:UpTeeArrow,UpTee:UpTee,upuparrows:upuparrows,urcorn:urcorn,urcorner:urcorner,urcrop:urcrop,Uring:Uring,uring:uring,urtri:urtri,Uscr:Uscr,uscr:uscr,utdot:utdot,Utilde:Utilde,utilde:utilde,utri:utri,utrif:utrif,uuarr:uuarr,Uuml:Uuml$1,uuml:uuml$1,uwangle:uwangle,vangrt:vangrt,varepsilon:varepsilon,varkappa:varkappa,varnothing:varnothing,varphi:varphi,varpi:varpi,varpropto:varpropto,varr:varr,vArr:vArr,varrho:varrho,varsigma:varsigma,varsubsetneq:varsubsetneq,varsubsetneqq:varsubsetneqq,varsupsetneq:varsupsetneq,varsupsetneqq:varsupsetneqq,vartheta:vartheta,vartriangleleft:vartriangleleft,vartriangleright:vartriangleright,vBar:vBar,Vbar:Vbar,vBarv:vBarv,Vcy:Vcy,vcy:vcy,vdash:vdash,vDash:vDash,Vdash:Vdash,VDash:VDash,Vdashl:Vdashl,veebar:veebar,vee:vee,Vee:Vee,veeeq:veeeq,vellip:vellip,verbar:verbar,Verbar:Verbar,vert:vert,Vert:Vert,VerticalBar:VerticalBar,VerticalLine:VerticalLine,VerticalSeparator:VerticalSeparator,VerticalTilde:VerticalTilde,VeryThinSpace:VeryThinSpace,Vfr:Vfr,vfr:vfr,vltri:vltri,vnsub:vnsub,vnsup:vnsup,Vopf:Vopf,vopf:vopf,vprop:vprop,vrtri:vrtri,Vscr:Vscr,vscr:vscr,vsubnE:vsubnE,vsubne:vsubne,vsupnE:vsupnE,vsupne:vsupne,Vvdash:Vvdash,vzigzag:vzigzag,Wcirc:Wcirc,wcirc:wcirc,wedbar:wedbar,wedge:wedge,Wedge:Wedge,wedgeq:wedgeq,weierp:weierp,Wfr:Wfr,wfr:wfr,Wopf:Wopf,wopf:wopf,wp:wp,wr:wr,wreath:wreath,Wscr:Wscr,wscr:wscr,xcap:xcap,xcirc:xcirc,xcup:xcup,xdtri:xdtri,Xfr:Xfr,xfr:xfr,xharr:xharr,xhArr:xhArr,Xi:Xi,xi:xi,xlarr:xlarr,xlArr:xlArr,xmap:xmap,xnis:xnis,xodot:xodot,Xopf:Xopf,xopf:xopf,xoplus:xoplus,xotime:xotime,xrarr:xrarr,xrArr:xrArr,Xscr:Xscr,xscr:xscr,xsqcup:xsqcup,xuplus:xuplus,xutri:xutri,xvee:xvee,xwedge:xwedge,Yacute:Yacute$1,yacute:yacute$1,YAcy:YAcy,yacy:yacy,Ycirc:Ycirc,ycirc:ycirc,Ycy:Ycy,ycy:ycy,yen:yen$1,Yfr:Yfr,yfr:yfr,YIcy:YIcy,yicy:yicy,Yopf:Yopf,yopf:yopf,Yscr:Yscr,yscr:yscr,YUcy:YUcy,yucy:yucy,yuml:yuml$1,Yuml:Yuml,Zacute:Zacute,zacute:zacute,Zcaron:Zcaron,zcaron:zcaron,Zcy:Zcy,zcy:zcy,Zdot:Zdot,zdot:zdot,zeetrf:zeetrf,ZeroWidthSpace:ZeroWidthSpace,Zeta:Zeta,zeta:zeta,zfr:zfr,Zfr:Zfr,ZHcy:ZHcy,zhcy:zhcy,zigrarr:zigrarr,zopf:zopf,Zopf:Zopf,Zscr:Zscr,zscr:zscr,zwj:zwj,zwnj:zwnj};var Aacute="Á";var aacute="á";var Acirc="Â";var acirc="â";var acute="´";var AElig="Æ";var aelig="æ";var Agrave="À";var agrave="à";var amp$1="&";var AMP="&";var Aring="Å";var aring="å";var Atilde="Ã";var atilde="ã";var Auml="Ä";var auml="ä";var brvbar="¦";var Ccedil="Ç";var ccedil="ç";var cedil="¸";var cent="¢";var copy$1="©";var COPY="©";var curren="¤";var deg="°";var divide="÷";var Eacute="É";var eacute="é";var Ecirc="Ê";var ecirc="ê";var Egrave="È";var egrave="è";var ETH="Ð";var eth="ð";var Euml="Ë";var euml="ë";var frac12="½";var frac14="¼";var frac34="¾";var gt$1=">";var GT=">";var Iacute="Í";var iacute="í";var Icirc="Î";var icirc="î";var iexcl="¡";var Igrave="Ì";var igrave="ì";var iquest="¿";var Iuml="Ï";var iuml="ï";var laquo="«";var lt$1="<";var LT="<";var macr="¯";var micro="µ";var middot="·";var nbsp=" ";var not="¬";var Ntilde="Ñ";var ntilde="ñ";var Oacute="Ó";var oacute="ó";var Ocirc="Ô";var ocirc="ô";var Ograve="Ò";var ograve="ò";var ordf="ª";var ordm="º";var Oslash="Ø";var oslash="ø";var Otilde="Õ";var otilde="õ";var Ouml="Ö";var ouml="ö";var para="¶";var plusmn="±";var pound="£";var quot$1='"';var QUOT='"';var raquo="»";var reg="®";var REG="®";var sect="§";var shy="­";var sup1="¹";var sup2="²";var sup3="³";var szlig="ß";var THORN="Þ";var thorn="þ";var times="×";var Uacute="Ú";var uacute="ú";var Ucirc="Û";var ucirc="û";var Ugrave="Ù";var ugrave="ù";var uml="¨";var Uuml="Ü";var uuml="ü";var Yacute="Ý";var yacute="ý";var yen="¥";var yuml="ÿ";var require$$1={Aacute:Aacute,aacute:aacute,Acirc:Acirc,acirc:acirc,acute:acute,AElig:AElig,aelig:aelig,Agrave:Agrave,agrave:agrave,amp:amp$1,AMP:AMP,Aring:Aring,aring:aring,Atilde:Atilde,atilde:atilde,Auml:Auml,auml:auml,brvbar:brvbar,Ccedil:Ccedil,ccedil:ccedil,cedil:cedil,cent:cent,copy:copy$1,COPY:COPY,curren:curren,deg:deg,divide:divide,Eacute:Eacute,eacute:eacute,Ecirc:Ecirc,ecirc:ecirc,Egrave:Egrave,egrave:egrave,ETH:ETH,eth:eth,Euml:Euml,euml:euml,frac12:frac12,frac14:frac14,frac34:frac34,gt:gt$1,GT:GT,Iacute:Iacute,iacute:iacute,Icirc:Icirc,icirc:icirc,iexcl:iexcl,Igrave:Igrave,igrave:igrave,iquest:iquest,Iuml:Iuml,iuml:iuml,laquo:laquo,lt:lt$1,LT:LT,macr:macr,micro:micro,middot:middot,nbsp:nbsp,not:not,Ntilde:Ntilde,ntilde:ntilde,Oacute:Oacute,oacute:oacute,Ocirc:Ocirc,ocirc:ocirc,Ograve:Ograve,ograve:ograve,ordf:ordf,ordm:ordm,Oslash:Oslash,oslash:oslash,Otilde:Otilde,otilde:otilde,Ouml:Ouml,ouml:ouml,para:para,plusmn:plusmn,pound:pound,quot:quot$1,QUOT:QUOT,raquo:raquo,reg:reg,REG:REG,sect:sect,shy:shy,sup1:sup1,sup2:sup2,sup3:sup3,szlig:szlig,THORN:THORN,thorn:thorn,times:times,Uacute:Uacute,uacute:uacute,Ucirc:Ucirc,ucirc:ucirc,Ugrave:Ugrave,ugrave:ugrave,uml:uml,Uuml:Uuml,uuml:uuml,Yacute:Yacute,yacute:yacute,yen:yen,yuml:yuml};var amp="&";var apos="'";var gt=">";var lt="<";var quot='"';var require$$0$3={amp:amp,apos:apos,gt:gt,lt:lt,quot:quot};var require$$0$2={0:65533,128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376};var __importDefault=commonjsGlobal&&commonjsGlobal.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};var decode_json_1=__importDefault(require$$0$2);var fromCodePoint=String.fromCodePoint||function(codePoint){var output="";if(codePoint>65535){codePoint-=65536;output+=String.fromCharCode(codePoint>>>10&1023|55296);codePoint=56320|codePoint&1023}output+=String.fromCharCode(codePoint);return output};function decodeCodePoint(codePoint){if(codePoint>=55296&&codePoint<=57343||codePoint>1114111){return"�"}if(codePoint in decode_json_1.default){codePoint=decode_json_1.default[codePoint]}return fromCodePoint(codePoint)}var _default$3=decodeCodePoint;var decode_codepoint=Object.defineProperty({default:_default$3},"__esModule",{value:true});var decode=createCommonjsModule((function(module,exports){var __importDefault=commonjsGlobal&&commonjsGlobal.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:true});exports.decodeHTML=exports.decodeHTMLStrict=exports.decodeXML=void 0;var entities_json_1=__importDefault(require$$1$1);var legacy_json_1=__importDefault(require$$1);var xml_json_1=__importDefault(require$$0$3);var decode_codepoint_1=__importDefault(decode_codepoint);var strictEntityRe=/&(?:[a-zA-Z0-9]+|#[xX][\da-fA-F]+|#\d+);/g;exports.decodeXML=getStrictDecoder(xml_json_1.default);exports.decodeHTMLStrict=getStrictDecoder(entities_json_1.default);function getStrictDecoder(map){var replace=getReplacer(map);return function(str){return String(str).replace(strictEntityRe,replace)}}var sorter=function(a,b){return a<b?1:-1};exports.decodeHTML=function(){var legacy=Object.keys(legacy_json_1.default).sort(sorter);var keys=Object.keys(entities_json_1.default).sort(sorter);for(var i=0,j=0;i<keys.length;i++){if(legacy[j]===keys[i]){keys[i]+=";?";j++}else{keys[i]+=";"}}var re=new RegExp("&(?:"+keys.join("|")+"|#[xX][\\da-fA-F]+;?|#\\d+;?)","g");var replace=getReplacer(entities_json_1.default);function replacer(str){if(str.substr(-1)!==";")str+=";";return replace(str)}return function(str){return String(str).replace(re,replacer)}}();function getReplacer(map){return function replace(str){if(str.charAt(1)==="#"){var secondChar=str.charAt(2);if(secondChar==="X"||secondChar==="x"){return decode_codepoint_1.default(parseInt(str.substr(3),16))}return decode_codepoint_1.default(parseInt(str.substr(2),10))}return map[str.slice(1,-1)]||str}}}));var encode=createCommonjsModule((function(module,exports){var __importDefault=commonjsGlobal&&commonjsGlobal.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:true});exports.escapeUTF8=exports.escape=exports.encodeNonAsciiHTML=exports.encodeHTML=exports.encodeXML=void 0;var xml_json_1=__importDefault(require$$0$3);var inverseXML=getInverseObj(xml_json_1.default);var xmlReplacer=getInverseReplacer(inverseXML);exports.encodeXML=getASCIIEncoder(inverseXML);var entities_json_1=__importDefault(require$$1$1);var inverseHTML=getInverseObj(entities_json_1.default);var htmlReplacer=getInverseReplacer(inverseHTML);exports.encodeHTML=getInverse(inverseHTML,htmlReplacer);exports.encodeNonAsciiHTML=getASCIIEncoder(inverseHTML);function getInverseObj(obj){return Object.keys(obj).sort().reduce((function(inverse,name){inverse[obj[name]]="&"+name+";";return inverse}),{})}function getInverseReplacer(inverse){var single=[];var multiple=[];for(var _i=0,_a=Object.keys(inverse);_i<_a.length;_i++){var k=_a[_i];if(k.length===1){single.push("\\"+k)}else{multiple.push(k)}}single.sort();for(var start=0;start<single.length-1;start++){var end=start;while(end<single.length-1&&single[end].charCodeAt(1)+1===single[end+1].charCodeAt(1)){end+=1}var count=1+end-start;if(count<3)continue;single.splice(start,count,single[start]+"-"+single[end])}multiple.unshift("["+single.join("")+"]");return new RegExp(multiple.join("|"),"g")}var reNonASCII=/(?:[\x80-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g;var getCodePoint=String.prototype.codePointAt!=null?function(str){return str.codePointAt(0)}:function(c){return(c.charCodeAt(0)-55296)*1024+c.charCodeAt(1)-56320+65536};function singleCharReplacer(c){return"&#x"+(c.length>1?getCodePoint(c):c.charCodeAt(0)).toString(16).toUpperCase()+";"}function getInverse(inverse,re){return function(data){return data.replace(re,(function(name){return inverse[name]})).replace(reNonASCII,singleCharReplacer)}}var reEscapeChars=new RegExp(xmlReplacer.source+"|"+reNonASCII.source,"g");function escape(data){return data.replace(reEscapeChars,singleCharReplacer)}exports.escape=escape;function escapeUTF8(data){return data.replace(xmlReplacer,singleCharReplacer)}exports.escapeUTF8=escapeUTF8;function getASCIIEncoder(obj){return function(data){return data.replace(reEscapeChars,(function(c){return obj[c]||singleCharReplacer(c)}))}}}));var lib$6=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.decodeXMLStrict=exports.decodeHTML5Strict=exports.decodeHTML4Strict=exports.decodeHTML5=exports.decodeHTML4=exports.decodeHTMLStrict=exports.decodeHTML=exports.decodeXML=exports.encodeHTML5=exports.encodeHTML4=exports.escapeUTF8=exports.escape=exports.encodeNonAsciiHTML=exports.encodeHTML=exports.encodeXML=exports.encode=exports.decodeStrict=exports.decode=void 0;function decode$1(data,level){return(!level||level<=0?decode.decodeXML:decode.decodeHTML)(data)}exports.decode=decode$1;function decodeStrict(data,level){return(!level||level<=0?decode.decodeXML:decode.decodeHTMLStrict)(data)}exports.decodeStrict=decodeStrict;function encode$1(data,level){return(!level||level<=0?encode.encodeXML:encode.encodeHTML)(data)}exports.encode=encode$1;var encode_2=encode;Object.defineProperty(exports,"encodeXML",{enumerable:true,get:function(){return encode_2.encodeXML}});Object.defineProperty(exports,"encodeHTML",{enumerable:true,get:function(){return encode_2.encodeHTML}});Object.defineProperty(exports,"encodeNonAsciiHTML",{enumerable:true,get:function(){return encode_2.encodeNonAsciiHTML}});Object.defineProperty(exports,"escape",{enumerable:true,get:function(){return encode_2.escape}});Object.defineProperty(exports,"escapeUTF8",{enumerable:true,get:function(){return encode_2.escapeUTF8}});Object.defineProperty(exports,"encodeHTML4",{enumerable:true,get:function(){return encode_2.encodeHTML}});Object.defineProperty(exports,"encodeHTML5",{enumerable:true,get:function(){return encode_2.encodeHTML}});var decode_2=decode;Object.defineProperty(exports,"decodeXML",{enumerable:true,get:function(){return decode_2.decodeXML}});Object.defineProperty(exports,"decodeHTML",{enumerable:true,get:function(){return decode_2.decodeHTML}});Object.defineProperty(exports,"decodeHTMLStrict",{enumerable:true,get:function(){return decode_2.decodeHTMLStrict}});Object.defineProperty(exports,"decodeHTML4",{enumerable:true,get:function(){return decode_2.decodeHTML}});Object.defineProperty(exports,"decodeHTML5",{enumerable:true,get:function(){return decode_2.decodeHTML}});Object.defineProperty(exports,"decodeHTML4Strict",{enumerable:true,get:function(){return decode_2.decodeHTMLStrict}});Object.defineProperty(exports,"decodeHTML5Strict",{enumerable:true,get:function(){return decode_2.decodeHTMLStrict}});Object.defineProperty(exports,"decodeXMLStrict",{enumerable:true,get:function(){return decode_2.decodeXML}})}));var foreignNames=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.attributeNames=exports.elementNames=void 0;exports.elementNames=new Map([["altglyph","altGlyph"],["altglyphdef","altGlyphDef"],["altglyphitem","altGlyphItem"],["animatecolor","animateColor"],["animatemotion","animateMotion"],["animatetransform","animateTransform"],["clippath","clipPath"],["feblend","feBlend"],["fecolormatrix","feColorMatrix"],["fecomponenttransfer","feComponentTransfer"],["fecomposite","feComposite"],["feconvolvematrix","feConvolveMatrix"],["fediffuselighting","feDiffuseLighting"],["fedisplacementmap","feDisplacementMap"],["fedistantlight","feDistantLight"],["fedropshadow","feDropShadow"],["feflood","feFlood"],["fefunca","feFuncA"],["fefuncb","feFuncB"],["fefuncg","feFuncG"],["fefuncr","feFuncR"],["fegaussianblur","feGaussianBlur"],["feimage","feImage"],["femerge","feMerge"],["femergenode","feMergeNode"],["femorphology","feMorphology"],["feoffset","feOffset"],["fepointlight","fePointLight"],["fespecularlighting","feSpecularLighting"],["fespotlight","feSpotLight"],["fetile","feTile"],["feturbulence","feTurbulence"],["foreignobject","foreignObject"],["glyphref","glyphRef"],["lineargradient","linearGradient"],["radialgradient","radialGradient"],["textpath","textPath"]]);exports.attributeNames=new Map([["definitionurl","definitionURL"],["attributename","attributeName"],["attributetype","attributeType"],["basefrequency","baseFrequency"],["baseprofile","baseProfile"],["calcmode","calcMode"],["clippathunits","clipPathUnits"],["diffuseconstant","diffuseConstant"],["edgemode","edgeMode"],["filterunits","filterUnits"],["glyphref","glyphRef"],["gradienttransform","gradientTransform"],["gradientunits","gradientUnits"],["kernelmatrix","kernelMatrix"],["kernelunitlength","kernelUnitLength"],["keypoints","keyPoints"],["keysplines","keySplines"],["keytimes","keyTimes"],["lengthadjust","lengthAdjust"],["limitingconeangle","limitingConeAngle"],["markerheight","markerHeight"],["markerunits","markerUnits"],["markerwidth","markerWidth"],["maskcontentunits","maskContentUnits"],["maskunits","maskUnits"],["numoctaves","numOctaves"],["pathlength","pathLength"],["patterncontentunits","patternContentUnits"],["patterntransform","patternTransform"],["patternunits","patternUnits"],["pointsatx","pointsAtX"],["pointsaty","pointsAtY"],["pointsatz","pointsAtZ"],["preservealpha","preserveAlpha"],["preserveaspectratio","preserveAspectRatio"],["primitiveunits","primitiveUnits"],["refx","refX"],["refy","refY"],["repeatcount","repeatCount"],["repeatdur","repeatDur"],["requiredextensions","requiredExtensions"],["requiredfeatures","requiredFeatures"],["specularconstant","specularConstant"],["specularexponent","specularExponent"],["spreadmethod","spreadMethod"],["startoffset","startOffset"],["stddeviation","stdDeviation"],["stitchtiles","stitchTiles"],["surfacescale","surfaceScale"],["systemlanguage","systemLanguage"],["tablevalues","tableValues"],["targetx","targetX"],["targety","targetY"],["textlength","textLength"],["viewbox","viewBox"],["viewtarget","viewTarget"],["xchannelselector","xChannelSelector"],["ychannelselector","yChannelSelector"],["zoomandpan","zoomAndPan"]])}));var __assign=commonjsGlobal&&commonjsGlobal.__assign||function(){__assign=Object.assign||function(t){for(var s,i=1,n=arguments.length;i<n;i++){s=arguments[i];for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))t[p]=s[p]}return t};return __assign.apply(this,arguments)};var __createBinding=commonjsGlobal&&commonjsGlobal.__createBinding||(Object.create?function(o,m,k,k2){if(k2===undefined)k2=k;Object.defineProperty(o,k2,{enumerable:true,get:function(){return m[k]}})}:function(o,m,k,k2){if(k2===undefined)k2=k;o[k2]=m[k]});var __setModuleDefault=commonjsGlobal&&commonjsGlobal.__setModuleDefault||(Object.create?function(o,v){Object.defineProperty(o,"default",{enumerable:true,value:v})}:function(o,v){o["default"]=v});var __importStar=commonjsGlobal&&commonjsGlobal.__importStar||function(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null)for(var k in mod)if(k!=="default"&&Object.prototype.hasOwnProperty.call(mod,k))__createBinding(result,mod,k);__setModuleDefault(result,mod);return result};var ElementType=__importStar(lib$7);var unencodedElements=new Set(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]);function formatAttributes(attributes,opts){if(!attributes)return;return Object.keys(attributes).map((function(key){var _a,_b;var value=(_a=attributes[key])!==null&&_a!==void 0?_a:"";if(opts.xmlMode==="foreign"){key=(_b=foreignNames.attributeNames.get(key))!==null&&_b!==void 0?_b:key}if(!opts.emptyAttrs&&!opts.xmlMode&&value===""){return key}return key+'="'+(opts.decodeEntities?lib$6.encodeXML(value):value.replace(/"/g,"&quot;"))+'"'})).join(" ")}var singleTag=new Set(["area","base","basefont","br","col","command","embed","frame","hr","img","input","isindex","keygen","link","meta","param","source","track","wbr"]);function render(node,options){if(options===void 0){options={}}var nodes=Array.isArray(node)||node.cheerio?node:[node];var output="";for(var i=0;i<nodes.length;i++){output+=renderNode(nodes[i],options)}return output}var _default$2=render;function renderNode(node,options){switch(node.type){case ElementType.Root:return render(node.children,options);case ElementType.Directive:case ElementType.Doctype:return renderDirective(node);case ElementType.Comment:return renderComment(node);case ElementType.CDATA:return renderCdata(node);case ElementType.Script:case ElementType.Style:case ElementType.Tag:return renderTag(node,options);case ElementType.Text:return renderText(node,options)}}var foreignModeIntegrationPoints=new Set(["mi","mo","mn","ms","mtext","annotation-xml","foreignObject","desc","title"]);var foreignElements=new Set(["svg","math"]);function renderTag(elem,opts){var _a;if(opts.xmlMode==="foreign"){elem.name=(_a=foreignNames.elementNames.get(elem.name))!==null&&_a!==void 0?_a:elem.name;if(elem.parent&&foreignModeIntegrationPoints.has(elem.parent.name)){opts=__assign(__assign({},opts),{xmlMode:false})}}if(!opts.xmlMode&&foreignElements.has(elem.name)){opts=__assign(__assign({},opts),{xmlMode:"foreign"})}var tag="<"+elem.name;var attribs=formatAttributes(elem.attribs,opts);if(attribs){tag+=" "+attribs}if(elem.children.length===0&&(opts.xmlMode?opts.selfClosingTags!==false:opts.selfClosingTags&&singleTag.has(elem.name))){if(!opts.xmlMode)tag+=" ";tag+="/>"}else{tag+=">";if(elem.children.length>0){tag+=render(elem.children,opts)}if(opts.xmlMode||!singleTag.has(elem.name)){tag+="</"+elem.name+">"}}return tag}function renderDirective(elem){return"<"+elem.data+">"}function renderText(elem,opts){var data=elem.data||"";if(opts.decodeEntities&&!(elem.parent&&unencodedElements.has(elem.parent.name))){data=lib$6.encodeXML(data)}return data}function renderCdata(elem){return"<![CDATA["+elem.children[0].data+"]]>"}function renderComment(elem){return"\x3c!--"+elem.data+"--\x3e"}var lib$5=Object.defineProperty({default:_default$2},"__esModule",{value:true});var stringify$1=createCommonjsModule((function(module,exports){var __importDefault=commonjsGlobal&&commonjsGlobal.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:true});exports.getText=exports.getInnerHTML=exports.getOuterHTML=void 0;var dom_serializer_1=__importDefault(lib$5);function getOuterHTML(node,options){return dom_serializer_1.default(node,options)}exports.getOuterHTML=getOuterHTML;function getInnerHTML(node,options){return tagtypes.hasChildren(node)?node.children.map((function(node){return getOuterHTML(node,options)})).join(""):""}exports.getInnerHTML=getInnerHTML;function getText(node){if(Array.isArray(node))return node.map(getText).join("");if(tagtypes.isTag(node))return node.name==="br"?"\n":getText(node.children);if(tagtypes.isCDATA(node))return getText(node.children);if(tagtypes.isText(node))return node.data;return""}exports.getText=getText}));var traversal=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.prevElementSibling=exports.nextElementSibling=exports.getName=exports.hasAttrib=exports.getAttributeValue=exports.getSiblings=exports.getParent=exports.getChildren=void 0;var emptyArray=[];function getChildren(elem){var _a;return(_a=elem.children)!==null&&_a!==void 0?_a:emptyArray}exports.getChildren=getChildren;function getParent(elem){return elem.parent||null}exports.getParent=getParent;function getSiblings(elem){var _a,_b;var parent=getParent(elem);if(parent!=null)return getChildren(parent);var siblings=[elem];var prev=elem.prev,next=elem.next;while(prev!=null){siblings.unshift(prev);_a=prev,prev=_a.prev}while(next!=null){siblings.push(next);_b=next,next=_b.next}return siblings}exports.getSiblings=getSiblings;function getAttributeValue(elem,name){var _a;return(_a=elem.attribs)===null||_a===void 0?void 0:_a[name]}exports.getAttributeValue=getAttributeValue;function hasAttrib(elem,name){return elem.attribs!=null&&Object.prototype.hasOwnProperty.call(elem.attribs,name)&&elem.attribs[name]!=null}exports.hasAttrib=hasAttrib;function getName(elem){return elem.name}exports.getName=getName;function nextElementSibling(elem){var _a;var next=elem.next;while(next!==null&&!tagtypes.isTag(next))_a=next,next=_a.next;return next}exports.nextElementSibling=nextElementSibling;function prevElementSibling(elem){var _a;var prev=elem.prev;while(prev!==null&&!tagtypes.isTag(prev))_a=prev,prev=_a.prev;return prev}exports.prevElementSibling=prevElementSibling}));var manipulation=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.prepend=exports.prependChild=exports.append=exports.appendChild=exports.replaceElement=exports.removeElement=void 0;function removeElement(elem){if(elem.prev)elem.prev.next=elem.next;if(elem.next)elem.next.prev=elem.prev;if(elem.parent){var childs=elem.parent.children;childs.splice(childs.lastIndexOf(elem),1)}}exports.removeElement=removeElement;function replaceElement(elem,replacement){var prev=replacement.prev=elem.prev;if(prev){prev.next=replacement}var next=replacement.next=elem.next;if(next){next.prev=replacement}var parent=replacement.parent=elem.parent;if(parent){var childs=parent.children;childs[childs.lastIndexOf(elem)]=replacement}}exports.replaceElement=replaceElement;function appendChild(elem,child){removeElement(child);child.next=null;child.parent=elem;if(elem.children.push(child)>1){var sibling=elem.children[elem.children.length-2];sibling.next=child;child.prev=sibling}else{child.prev=null}}exports.appendChild=appendChild;function append(elem,next){removeElement(next);var parent=elem.parent;var currNext=elem.next;next.next=currNext;next.prev=elem;elem.next=next;next.parent=parent;if(currNext){currNext.prev=next;if(parent){var childs=parent.children;childs.splice(childs.lastIndexOf(currNext),0,next)}}else if(parent){parent.children.push(next)}}exports.append=append;function prependChild(elem,child){removeElement(child);child.parent=elem;child.prev=null;if(elem.children.unshift(child)!==1){var sibling=elem.children[1];sibling.prev=child;child.next=sibling}else{child.next=null}}exports.prependChild=prependChild;function prepend(elem,prev){removeElement(prev);var parent=elem.parent;if(parent){var childs=parent.children;childs.splice(childs.indexOf(elem),0,prev)}if(elem.prev){elem.prev.next=prev}prev.parent=parent;prev.prev=elem.prev;prev.next=elem;elem.prev=prev}exports.prepend=prepend}));var querying=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.findAll=exports.existsOne=exports.findOne=exports.findOneChild=exports.find=exports.filter=void 0;function filter(test,node,recurse,limit){if(recurse===void 0){recurse=true}if(limit===void 0){limit=Infinity}if(!Array.isArray(node))node=[node];return find(test,node,recurse,limit)}exports.filter=filter;function find(test,nodes,recurse,limit){var result=[];for(var _i=0,nodes_1=nodes;_i<nodes_1.length;_i++){var elem=nodes_1[_i];if(test(elem)){result.push(elem);if(--limit<=0)break}if(recurse&&tagtypes.hasChildren(elem)&&elem.children.length>0){var children=find(test,elem.children,recurse,limit);result.push.apply(result,children);limit-=children.length;if(limit<=0)break}}return result}exports.find=find;function findOneChild(test,nodes){return nodes.find(test)}exports.findOneChild=findOneChild;function findOne(test,nodes,recurse){if(recurse===void 0){recurse=true}var elem=null;for(var i=0;i<nodes.length&&!elem;i++){var checked=nodes[i];if(!tagtypes.isTag(checked)){continue}else if(test(checked)){elem=checked}else if(recurse&&checked.children.length>0){elem=findOne(test,checked.children)}}return elem}exports.findOne=findOne;function existsOne(test,nodes){return nodes.some((function(checked){return tagtypes.isTag(checked)&&(test(checked)||checked.children.length>0&&existsOne(test,checked.children))}))}exports.existsOne=existsOne;function findAll(test,nodes){var _a;var result=[];var stack=nodes.filter(tagtypes.isTag);var elem;while(elem=stack.shift()){var children=(_a=elem.children)===null||_a===void 0?void 0:_a.filter(tagtypes.isTag);if(children&&children.length>0){stack.unshift.apply(stack,children)}if(test(elem))result.push(elem)}return result}exports.findAll=findAll}));var legacy=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.getElementsByTagType=exports.getElementsByTagName=exports.getElementById=exports.getElements=exports.testElement=void 0;var Checks={tag_name:function(name){if(typeof name==="function"){return function(elem){return tagtypes.isTag(elem)&&name(elem.name)}}else if(name==="*"){return tagtypes.isTag}return function(elem){return tagtypes.isTag(elem)&&elem.name===name}},tag_type:function(type){if(typeof type==="function"){return function(elem){return type(elem.type)}}return function(elem){return elem.type===type}},tag_contains:function(data){if(typeof data==="function"){return function(elem){return tagtypes.isText(elem)&&data(elem.data)}}return function(elem){return tagtypes.isText(elem)&&elem.data===data}}};function getAttribCheck(attrib,value){if(typeof value==="function"){return function(elem){return tagtypes.isTag(elem)&&value(elem.attribs[attrib])}}return function(elem){return tagtypes.isTag(elem)&&elem.attribs[attrib]===value}}function combineFuncs(a,b){return function(elem){return a(elem)||b(elem)}}function compileTest(options){var funcs=Object.keys(options).map((function(key){var value=options[key];return key in Checks?Checks[key](value):getAttribCheck(key,value)}));return funcs.length===0?null:funcs.reduce(combineFuncs)}function testElement(options,node){var test=compileTest(options);return test?test(node):true}exports.testElement=testElement;function getElements(options,nodes,recurse,limit){if(limit===void 0){limit=Infinity}var test=compileTest(options);return test?querying.filter(test,nodes,recurse,limit):[]}exports.getElements=getElements;function getElementById(id,nodes,recurse){if(recurse===void 0){recurse=true}if(!Array.isArray(nodes))nodes=[nodes];return querying.findOne(getAttribCheck("id",id),nodes,recurse)}exports.getElementById=getElementById;function getElementsByTagName(tagName,nodes,recurse,limit){if(recurse===void 0){recurse=true}if(limit===void 0){limit=Infinity}return querying.filter(Checks.tag_name(tagName),nodes,recurse,limit)}exports.getElementsByTagName=getElementsByTagName;function getElementsByTagType(type,nodes,recurse,limit){if(recurse===void 0){recurse=true}if(limit===void 0){limit=Infinity}return querying.filter(Checks.tag_type(type),nodes,recurse,limit)}exports.getElementsByTagType=getElementsByTagType}));var helpers=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.uniqueSort=exports.compareDocumentPosition=exports.removeSubsets=void 0;function removeSubsets(nodes){var idx=nodes.length;while(--idx>=0){var node=nodes[idx];if(idx>0&&nodes.lastIndexOf(node,idx-1)>=0){nodes.splice(idx,1);continue}for(var ancestor=node.parent;ancestor;ancestor=ancestor.parent){if(nodes.includes(ancestor)){nodes.splice(idx,1);break}}}return nodes}exports.removeSubsets=removeSubsets;function compareDocumentPosition(nodeA,nodeB){var aParents=[];var bParents=[];if(nodeA===nodeB){return 0}var current=tagtypes.hasChildren(nodeA)?nodeA:nodeA.parent;while(current){aParents.unshift(current);current=current.parent}current=tagtypes.hasChildren(nodeB)?nodeB:nodeB.parent;while(current){bParents.unshift(current);current=current.parent}var maxIdx=Math.min(aParents.length,bParents.length);var idx=0;while(idx<maxIdx&&aParents[idx]===bParents[idx]){idx++}if(idx===0){return 1}var sharedParent=aParents[idx-1];var siblings=sharedParent.children;var aSibling=aParents[idx];var bSibling=bParents[idx];if(siblings.indexOf(aSibling)>siblings.indexOf(bSibling)){if(sharedParent===nodeB){return 4|16}return 4}if(sharedParent===nodeA){return 2|8}return 2}exports.compareDocumentPosition=compareDocumentPosition;function uniqueSort(nodes){nodes=nodes.filter((function(node,i,arr){return!arr.includes(node,i+1)}));nodes.sort((function(a,b){var relative=compareDocumentPosition(a,b);if(relative&2){return-1}else if(relative&4){return 1}return 0}));return nodes}exports.uniqueSort=uniqueSort}));var lib$4=createCommonjsModule((function(module,exports){var __createBinding=commonjsGlobal&&commonjsGlobal.__createBinding||(Object.create?function(o,m,k,k2){if(k2===undefined)k2=k;Object.defineProperty(o,k2,{enumerable:true,get:function(){return m[k]}})}:function(o,m,k,k2){if(k2===undefined)k2=k;o[k2]=m[k]});var __exportStar=commonjsGlobal&&commonjsGlobal.__exportStar||function(m,exports){for(var p in m)if(p!=="default"&&!Object.prototype.hasOwnProperty.call(exports,p))__createBinding(exports,m,p)};Object.defineProperty(exports,"__esModule",{value:true});__exportStar(stringify$1,exports);__exportStar(traversal,exports);__exportStar(manipulation,exports);__exportStar(querying,exports);__exportStar(legacy,exports);__exportStar(helpers,exports);__exportStar(tagtypes,exports)}));var boolbase={trueFunc:function trueFunc(){return true},falseFunc:function falseFunc(){return false}};var parse_1$1=createCommonjsModule((function(module,exports){var __spreadArrays=commonjsGlobal&&commonjsGlobal.__spreadArrays||function(){for(var s=0,i=0,il=arguments.length;i<il;i++)s+=arguments[i].length;for(var r=Array(s),k=0,i=0;i<il;i++)for(var a=arguments[i],j=0,jl=a.length;j<jl;j++,k++)r[k]=a[j];return r};Object.defineProperty(exports,"__esModule",{value:true});exports.isTraversal=void 0;var reName=/^[^\\#]?(?:\\(?:[\da-f]{1,6}\s?|.)|[\w\-\u00b0-\uFFFF])+/;var reEscape=/\\([\da-f]{1,6}\s?|(\s)|.)/gi;var reAttr=/^\s*(?:(\*|[-\w]*)\|)?((?:\\.|[\w\u00b0-\uFFFF-])+)\s*(?:(\S?)=\s*(?:(['"])((?:[^\\]|\\[^])*?)\4|(#?(?:\\.|[\w\u00b0-\uFFFF-])*)|)|)\s*([iI])?\]/;var actionTypes={undefined:"exists","":"equals","~":"element","^":"start",$:"end","*":"any","!":"not","|":"hyphen"};var Traversals={">":"child","<":"parent","~":"sibling","+":"adjacent"};var attribSelectors={"#":["id","equals"],".":["class","element"]};var unpackPseudos=new Set(["has","not","matches","is","host","host-context"]);var traversalNames=new Set(__spreadArrays(["descendant"],Object.keys(Traversals).map((function(k){return Traversals[k]}))));function isTraversal(selector){return traversalNames.has(selector.type)}exports.isTraversal=isTraversal;var stripQuotesFromPseudos=new Set(["contains","icontains"]);var quotes=new Set(['"',"'"]);function funescape(_,escaped,escapedWhitespace){var high=parseInt(escaped,16)-65536;return high!==high||escapedWhitespace?escaped:high<0?String.fromCharCode(high+65536):String.fromCharCode(high>>10|55296,high&1023|56320)}function unescapeCSS(str){return str.replace(reEscape,funescape)}function isWhitespace(c){return c===" "||c==="\n"||c==="\t"||c==="\f"||c==="\r"}function parse(selector,options){var subselects=[];var endIndex=parseSelector(subselects,""+selector,options,0);if(endIndex<selector.length){throw new Error("Unmatched selector: "+selector.slice(endIndex))}return subselects}exports.default=parse;function parseSelector(subselects,selector,options,selectorIndex){var _a,_b;if(options===void 0){options={}}var tokens=[];var sawWS=false;function getName(offset){var match=selector.slice(selectorIndex+offset).match(reName);if(!match){throw new Error("Expected name, found "+selector.slice(selectorIndex))}var name=match[0];selectorIndex+=offset+name.length;return unescapeCSS(name)}function stripWhitespace(offset){while(isWhitespace(selector.charAt(selectorIndex+offset)))offset++;selectorIndex+=offset}function isEscaped(pos){var slashCount=0;while(selector.charAt(--pos)==="\\")slashCount++;return(slashCount&1)===1}function ensureNotTraversal(){if(tokens.length>0&&isTraversal(tokens[tokens.length-1])){throw new Error("Did not expect successive traversals.")}}stripWhitespace(0);while(selector!==""){var firstChar=selector.charAt(selectorIndex);if(isWhitespace(firstChar)){sawWS=true;stripWhitespace(1)}else if(firstChar in Traversals){ensureNotTraversal();tokens.push({type:Traversals[firstChar]});sawWS=false;stripWhitespace(1)}else if(firstChar===","){if(tokens.length===0){throw new Error("Empty sub-selector")}subselects.push(tokens);tokens=[];sawWS=false;stripWhitespace(1)}else{if(sawWS){ensureNotTraversal();tokens.push({type:"descendant"});sawWS=false}if(firstChar in attribSelectors){var _c=attribSelectors[firstChar],name_1=_c[0],action=_c[1];tokens.push({type:"attribute",name:name_1,action:action,value:getName(1),ignoreCase:false,namespace:null})}else if(firstChar==="["){var attributeMatch=selector.slice(selectorIndex+1).match(reAttr);if(!attributeMatch){throw new Error("Malformed attribute selector: "+selector.slice(selectorIndex))}var completeSelector=attributeMatch[0],_d=attributeMatch[1],namespace=_d===void 0?null:_d,baseName=attributeMatch[2],actionType=attributeMatch[3],_e=attributeMatch[5],quotedValue=_e===void 0?"":_e,_f=attributeMatch[6],value=_f===void 0?quotedValue:_f,ignoreCase=attributeMatch[7];selectorIndex+=completeSelector.length+1;var name_2=unescapeCSS(baseName);if((_a=options.lowerCaseAttributeNames)!==null&&_a!==void 0?_a:!options.xmlMode){name_2=name_2.toLowerCase()}tokens.push({type:"attribute",name:name_2,action:actionTypes[actionType],value:unescapeCSS(value),namespace:namespace,ignoreCase:!!ignoreCase})}else if(firstChar===":"){if(selector.charAt(selectorIndex+1)===":"){tokens.push({type:"pseudo-element",name:getName(2).toLowerCase()});continue}var name_3=getName(1).toLowerCase();var data=null;if(selector.charAt(selectorIndex)==="("){if(unpackPseudos.has(name_3)){if(quotes.has(selector.charAt(selectorIndex+1))){throw new Error("Pseudo-selector "+name_3+" cannot be quoted")}data=[];selectorIndex=parseSelector(data,selector,options,selectorIndex+1);if(selector.charAt(selectorIndex)!==")"){throw new Error("Missing closing parenthesis in :"+name_3+" ("+selector+")")}selectorIndex+=1}else{selectorIndex+=1;var start=selectorIndex;var counter=1;for(;counter>0&&selectorIndex<selector.length;selectorIndex++){if(selector.charAt(selectorIndex)==="("&&!isEscaped(selectorIndex)){counter++}else if(selector.charAt(selectorIndex)===")"&&!isEscaped(selectorIndex)){counter--}}if(counter){throw new Error("Parenthesis not matched")}data=selector.slice(start,selectorIndex-1);if(stripQuotesFromPseudos.has(name_3)){var quot=data.charAt(0);if(quot===data.slice(-1)&&quotes.has(quot)){data=data.slice(1,-1)}data=unescapeCSS(data)}}}tokens.push({type:"pseudo",name:name_3,data:data})}else{var namespace=null;var name_4=void 0;if(firstChar==="*"){selectorIndex+=1;name_4="*"}else if(reName.test(selector.slice(selectorIndex))){name_4=getName(0)}else{if(tokens.length&&tokens[tokens.length-1].type==="descendant"){tokens.pop()}addToken(subselects,tokens);return selectorIndex}if(selector.charAt(selectorIndex)==="|"){namespace=name_4;if(selector.charAt(selectorIndex+1)==="*"){name_4="*";selectorIndex+=2}else{name_4=getName(1)}}if(name_4==="*"){tokens.push({type:"universal",namespace:namespace})}else{if((_b=options.lowerCaseTags)!==null&&_b!==void 0?_b:!options.xmlMode){name_4=name_4.toLowerCase()}tokens.push({type:"tag",name:name_4,namespace:namespace})}}}}addToken(subselects,tokens);return selectorIndex}function addToken(subselects,tokens){if(subselects.length>0&&tokens.length===0){throw new Error("Empty sub-selector")}subselects.push(tokens)}}));var __spreadArrays=commonjsGlobal&&commonjsGlobal.__spreadArrays||function(){for(var s=0,i=0,il=arguments.length;i<il;i++)s+=arguments[i].length;for(var r=Array(s),k=0,i=0;i<il;i++)for(var a=arguments[i],j=0,jl=a.length;j<jl;j++,k++)r[k]=a[j];return r};var actionTypes={equals:"",element:"~",start:"^",end:"$",any:"*",not:"!",hyphen:"|"};var charsToEscape=new Set(__spreadArrays(Object.keys(actionTypes).map((function(typeKey){return actionTypes[typeKey]})).filter(Boolean),[":","[","]"," ","\\","(",")"]));function stringify(selector){return selector.map(stringifySubselector).join(", ")}var _default$1=stringify;function stringifySubselector(token){return token.map(stringifyToken).join("")}function stringifyToken(token){switch(token.type){case"child":return" > ";case"parent":return" < ";case"sibling":return" ~ ";case"adjacent":return" + ";case"descendant":return" ";case"universal":return getNamespace(token.namespace)+"*";case"tag":return getNamespacedName(token);case"pseudo-element":return"::"+escapeName(token.name);case"pseudo":if(token.data===null)return":"+escapeName(token.name);if(typeof token.data==="string"){return":"+escapeName(token.name)+"("+escapeName(token.data)+")"}return":"+escapeName(token.name)+"("+stringify(token.data)+")";case"attribute":{if(token.name==="id"&&token.action==="equals"&&!token.ignoreCase&&!token.namespace){return"#"+escapeName(token.value)}if(token.name==="class"&&token.action==="element"&&!token.ignoreCase&&!token.namespace){return"."+escapeName(token.value)}var name_1=getNamespacedName(token);if(token.action==="exists"){return"["+name_1+"]"}return"["+name_1+actionTypes[token.action]+"='"+escapeName(token.value)+"'"+(token.ignoreCase?"i":"")+"]"}}}function getNamespacedName(token){return""+getNamespace(token.namespace)+escapeName(token.name)}function getNamespace(namespace){return namespace?(namespace==="*"?"*":escapeName(namespace))+"|":""}function escapeName(str){return str.split("").map((function(c){return charsToEscape.has(c)?"\\"+c:c})).join("")}var stringify_1=Object.defineProperty({default:_default$1},"__esModule",{value:true});var lib$3=createCommonjsModule((function(module,exports){var __createBinding=commonjsGlobal&&commonjsGlobal.__createBinding||(Object.create?function(o,m,k,k2){if(k2===undefined)k2=k;Object.defineProperty(o,k2,{enumerable:true,get:function(){return m[k]}})}:function(o,m,k,k2){if(k2===undefined)k2=k;o[k2]=m[k]});var __exportStar=commonjsGlobal&&commonjsGlobal.__exportStar||function(m,exports){for(var p in m)if(p!=="default"&&!Object.prototype.hasOwnProperty.call(exports,p))__createBinding(exports,m,p)};var __importDefault=commonjsGlobal&&commonjsGlobal.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:true});exports.stringify=exports.parse=void 0;__exportStar(parse_1$1,exports);Object.defineProperty(exports,"parse",{enumerable:true,get:function(){return __importDefault(parse_1$1).default}});Object.defineProperty(exports,"stringify",{enumerable:true,get:function(){return __importDefault(stringify_1).default}})}));var procedure=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.isTraversal=exports.procedure=void 0;exports.procedure={universal:50,tag:30,attribute:1,pseudo:0,"pseudo-element":0,descendant:-1,child:-1,parent:-1,sibling:-1,adjacent:-1,_flexibleDescendant:-1};function isTraversal(t){return exports.procedure[t.type]<0}exports.isTraversal=isTraversal}));var attributes$1={exists:10,equals:8,not:7,start:6,end:6,any:5,hyphen:4,element:4};function sortByProcedure(arr){var procs=arr.map(getProcedure);for(var i=1;i<arr.length;i++){var procNew=procs[i];if(procNew<0)continue;for(var j=i-1;j>=0&&procNew<procs[j];j--){var token=arr[j+1];arr[j+1]=arr[j];arr[j]=token;procs[j+1]=procs[j];procs[j]=procNew}}}var _default=sortByProcedure;function getProcedure(token){var proc=procedure.procedure[token.type];if(token.type==="attribute"){proc=attributes$1[token.action];if(proc===attributes$1.equals&&token.name==="id"){proc=9}if(token.ignoreCase){proc>>=1}}else if(token.type==="pseudo"){if(!token.data){proc=3}else if(token.name==="has"||token.name==="contains"){proc=0}else if(Array.isArray(token.data)){proc=0;for(var i=0;i<token.data.length;i++){if(token.data[i].length!==1)continue;var cur=getProcedure(token.data[i][0]);if(cur===0){proc=0;break}if(cur>proc)proc=cur}if(token.data.length>1&&proc>0)proc-=1}else{proc=1}}return proc}var sort=Object.defineProperty({default:_default},"__esModule",{value:true});var attributes=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.attributeRules=void 0;var reChars=/[-[\]{}()*+?.,\\^$|#\s]/g;function escapeRegex(value){return value.replace(reChars,"\\$&")}exports.attributeRules={equals:function(next,data,_a){var adapter=_a.adapter;var name=data.name;var value=data.value;if(data.ignoreCase){value=value.toLowerCase();return function(elem){var _a;return((_a=adapter.getAttributeValue(elem,name))===null||_a===void 0?void 0:_a.toLowerCase())===value&&next(elem)}}return function(elem){return adapter.getAttributeValue(elem,name)===value&&next(elem)}},hyphen:function(next,data,_a){var adapter=_a.adapter;var name=data.name;var value=data.value;var len=value.length;if(data.ignoreCase){value=value.toLowerCase();return function hyphenIC(elem){var attr=adapter.getAttributeValue(elem,name);return attr!=null&&(attr.length===len||attr.charAt(len)==="-")&&attr.substr(0,len).toLowerCase()===value&&next(elem)}}return function hyphen(elem){var attr=adapter.getAttributeValue(elem,name);return attr!=null&&attr.substr(0,len)===value&&(attr.length===len||attr.charAt(len)==="-")&&next(elem)}},element:function(next,_a,_b){var name=_a.name,value=_a.value,ignoreCase=_a.ignoreCase;var adapter=_b.adapter;if(/\s/.test(value)){return boolbase.falseFunc}var regex=new RegExp("(?:^|\\s)"+escapeRegex(value)+"(?:$|\\s)",ignoreCase?"i":"");return function element(elem){var attr=adapter.getAttributeValue(elem,name);return attr!=null&&regex.test(attr)&&next(elem)}},exists:function(next,_a,_b){var name=_a.name;var adapter=_b.adapter;return function(elem){return adapter.hasAttrib(elem,name)&&next(elem)}},start:function(next,data,_a){var adapter=_a.adapter;var name=data.name;var value=data.value;var len=value.length;if(len===0){return boolbase.falseFunc}if(data.ignoreCase){value=value.toLowerCase();return function(elem){var _a;return((_a=adapter.getAttributeValue(elem,name))===null||_a===void 0?void 0:_a.substr(0,len).toLowerCase())===value&&next(elem)}}return function(elem){var _a;return!!((_a=adapter.getAttributeValue(elem,name))===null||_a===void 0?void 0:_a.startsWith(value))&&next(elem)}},end:function(next,data,_a){var adapter=_a.adapter;var name=data.name;var value=data.value;var len=-value.length;if(len===0){return boolbase.falseFunc}if(data.ignoreCase){value=value.toLowerCase();return function(elem){var _a;return((_a=adapter.getAttributeValue(elem,name))===null||_a===void 0?void 0:_a.substr(len).toLowerCase())===value&&next(elem)}}return function(elem){var _a;return!!((_a=adapter.getAttributeValue(elem,name))===null||_a===void 0?void 0:_a.endsWith(value))&&next(elem)}},any:function(next,data,_a){var adapter=_a.adapter;var name=data.name,value=data.value;if(value===""){return boolbase.falseFunc}if(data.ignoreCase){var regex_1=new RegExp(escapeRegex(value),"i");return function anyIC(elem){var attr=adapter.getAttributeValue(elem,name);return attr!=null&&regex_1.test(attr)&&next(elem)}}return function(elem){var _a;return!!((_a=adapter.getAttributeValue(elem,name))===null||_a===void 0?void 0:_a.includes(value))&&next(elem)}},not:function(next,data,_a){var adapter=_a.adapter;var name=data.name;var value=data.value;if(value===""){return function(elem){return!!adapter.getAttributeValue(elem,name)&&next(elem)}}else if(data.ignoreCase){value=value.toLowerCase();return function(elem){var attr=adapter.getAttributeValue(elem,name);return attr!=null&&attr.toLocaleLowerCase()!==value&&next(elem)}}return function(elem){return adapter.getAttributeValue(elem,name)!==value&&next(elem)}}}}));var parse_1=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.parse=void 0;var RE_NTH_ELEMENT=/^([+-]?\d*n)?\s*(?:([+-]?)\s*(\d+))?$/;function parse(formula){formula=formula.trim().toLowerCase();if(formula==="even"){return[2,0]}else if(formula==="odd"){return[2,1]}var parsed=formula.match(RE_NTH_ELEMENT);if(!parsed){throw new Error("n-th rule couldn't be parsed ('"+formula+"')")}var a;if(parsed[1]){a=parseInt(parsed[1],10);if(isNaN(a)){a=parsed[1].startsWith("-")?-1:1}}else a=0;var b=(parsed[2]==="-"?-1:1)*(parsed[3]?parseInt(parsed[3],10):0);return[a,b]}exports.parse=parse}));var compile_1$1=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.compile=void 0;function compile(parsed){var a=parsed[0];var b=parsed[1]-1;if(b<0&&a<=0)return boolbase.falseFunc;if(a===-1)return function(index){return index<=b};if(a===0)return function(index){return index===b};if(a===1)return b<0?boolbase.trueFunc:function(index){return index>=b};var absA=Math.abs(a);var bMod=(b%absA+absA)%absA;return a>1?function(index){return index>=b&&index%absA===bMod}:function(index){return index<=b&&index%absA===bMod}}exports.compile=compile}));var lib$2=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.compile=exports.parse=void 0;Object.defineProperty(exports,"parse",{enumerable:true,get:function(){return parse_1.parse}});Object.defineProperty(exports,"compile",{enumerable:true,get:function(){return compile_1$1.compile}});function nthCheck(formula){return compile_1$1.compile(parse_1.parse(formula))}exports.default=nthCheck}));var filters$1=createCommonjsModule((function(module,exports){var __importDefault=commonjsGlobal&&commonjsGlobal.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:true});exports.filters=void 0;var nth_check_1=__importDefault(lib$2);var checkAttrib=attributes.attributeRules.equals;function getAttribFunc(name,value){var data={type:"attribute",action:"equals",ignoreCase:false,namespace:null,name:name,value:value};return function attribFunc(next,_rule,options){return checkAttrib(next,data,options)}}function getChildFunc(next,adapter){return function(elem){var parent=adapter.getParent(elem);return!!parent&&adapter.isTag(parent)&&next(elem)}}exports.filters={contains:function(next,text,_a){var adapter=_a.adapter;return function contains(elem){return next(elem)&&adapter.getText(elem).includes(text)}},icontains:function(next,text,_a){var adapter=_a.adapter;var itext=text.toLowerCase();return function icontains(elem){return next(elem)&&adapter.getText(elem).toLowerCase().includes(itext)}},"nth-child":function(next,rule,_a){var adapter=_a.adapter,equals=_a.equals;var func=nth_check_1.default(rule);if(func===boolbase.falseFunc)return boolbase.falseFunc;if(func===boolbase.trueFunc)return getChildFunc(next,adapter);return function nthChild(elem){var siblings=adapter.getSiblings(elem);var pos=0;for(var i=0;i<siblings.length;i++){if(equals(elem,siblings[i]))break;if(adapter.isTag(siblings[i])){pos++}}return func(pos)&&next(elem)}},"nth-last-child":function(next,rule,_a){var adapter=_a.adapter,equals=_a.equals;var func=nth_check_1.default(rule);if(func===boolbase.falseFunc)return boolbase.falseFunc;if(func===boolbase.trueFunc)return getChildFunc(next,adapter);return function nthLastChild(elem){var siblings=adapter.getSiblings(elem);var pos=0;for(var i=siblings.length-1;i>=0;i--){if(equals(elem,siblings[i]))break;if(adapter.isTag(siblings[i])){pos++}}return func(pos)&&next(elem)}},"nth-of-type":function(next,rule,_a){var adapter=_a.adapter,equals=_a.equals;var func=nth_check_1.default(rule);if(func===boolbase.falseFunc)return boolbase.falseFunc;if(func===boolbase.trueFunc)return getChildFunc(next,adapter);return function nthOfType(elem){var siblings=adapter.getSiblings(elem);var pos=0;for(var i=0;i<siblings.length;i++){var currentSibling=siblings[i];if(equals(elem,currentSibling))break;if(adapter.isTag(currentSibling)&&adapter.getName(currentSibling)===adapter.getName(elem)){pos++}}return func(pos)&&next(elem)}},"nth-last-of-type":function(next,rule,_a){var adapter=_a.adapter,equals=_a.equals;var func=nth_check_1.default(rule);if(func===boolbase.falseFunc)return boolbase.falseFunc;if(func===boolbase.trueFunc)return getChildFunc(next,adapter);return function nthLastOfType(elem){var siblings=adapter.getSiblings(elem);var pos=0;for(var i=siblings.length-1;i>=0;i--){var currentSibling=siblings[i];if(equals(elem,currentSibling))break;if(adapter.isTag(currentSibling)&&adapter.getName(currentSibling)===adapter.getName(elem)){pos++}}return func(pos)&&next(elem)}},root:function(next,_rule,_a){var adapter=_a.adapter;return function(elem){var parent=adapter.getParent(elem);return(parent==null||!adapter.isTag(parent))&&next(elem)}},scope:function(next,rule,options,context){var equals=options.equals;if(!context||context.length===0){return exports.filters.root(next,rule,options)}if(context.length===1){return function(elem){return equals(context[0],elem)&&next(elem)}}return function(elem){return context.includes(elem)&&next(elem)}},checkbox:getAttribFunc("type","checkbox"),file:getAttribFunc("type","file"),password:getAttribFunc("type","password"),radio:getAttribFunc("type","radio"),reset:getAttribFunc("type","reset"),image:getAttribFunc("type","image"),submit:getAttribFunc("type","submit"),hover:function(next,_rule,_a){var adapter=_a.adapter;var isHovered=adapter.isHovered;if(typeof isHovered!=="function"){return boolbase.falseFunc}return function hover(elem){return isHovered(elem)&&next(elem)}},visited:function(next,_rule,_a){var adapter=_a.adapter;var isVisited=adapter.isVisited;if(typeof isVisited!=="function"){return boolbase.falseFunc}return function visited(elem){return isVisited(elem)&&next(elem)}},active:function(next,_rule,_a){var adapter=_a.adapter;var isActive=adapter.isActive;if(typeof isActive!=="function"){return boolbase.falseFunc}return function active(elem){return isActive(elem)&&next(elem)}}}}));var pseudos=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.verifyPseudoArgs=exports.pseudos=void 0;var isLinkTag=namePseudo(["a","area","link"]);exports.pseudos={empty:function(elem,_a){var adapter=_a.adapter;return!adapter.getChildren(elem).some((function(elem){return adapter.isTag(elem)||adapter.getText(elem)!==""}))},"first-child":function(elem,_a){var adapter=_a.adapter,equals=_a.equals;var firstChild=adapter.getSiblings(elem).find((function(elem){return adapter.isTag(elem)}));return firstChild!=null&&equals(elem,firstChild)},"last-child":function(elem,_a){var adapter=_a.adapter,equals=_a.equals;var siblings=adapter.getSiblings(elem);for(var i=siblings.length-1;i>=0;i--){if(equals(elem,siblings[i]))return true;if(adapter.isTag(siblings[i]))break}return false},"first-of-type":function(elem,_a){var adapter=_a.adapter,equals=_a.equals;var siblings=adapter.getSiblings(elem);var elemName=adapter.getName(elem);for(var i=0;i<siblings.length;i++){var currentSibling=siblings[i];if(equals(elem,currentSibling))return true;if(adapter.isTag(currentSibling)&&adapter.getName(currentSibling)===elemName){break}}return false},"last-of-type":function(elem,_a){var adapter=_a.adapter,equals=_a.equals;var siblings=adapter.getSiblings(elem);var elemName=adapter.getName(elem);for(var i=siblings.length-1;i>=0;i--){var currentSibling=siblings[i];if(equals(elem,currentSibling))return true;if(adapter.isTag(currentSibling)&&adapter.getName(currentSibling)===elemName){break}}return false},"only-of-type":function(elem,_a){var adapter=_a.adapter,equals=_a.equals;var elemName=adapter.getName(elem);return adapter.getSiblings(elem).every((function(sibling){return equals(elem,sibling)||!adapter.isTag(sibling)||adapter.getName(sibling)!==elemName}))},"only-child":function(elem,_a){var adapter=_a.adapter,equals=_a.equals;return adapter.getSiblings(elem).every((function(sibling){return equals(elem,sibling)||!adapter.isTag(sibling)}))},"any-link":function(elem,options){return isLinkTag(elem,options)&&options.adapter.hasAttrib(elem,"href")},link:function(elem,options){var _a,_b;return((_b=(_a=options.adapter).isVisited)===null||_b===void 0?void 0:_b.call(_a,elem))!==true&&exports.pseudos["any-link"](elem,options)},selected:function(elem,_a){var adapter=_a.adapter,equals=_a.equals;if(adapter.hasAttrib(elem,"selected"))return true;else if(adapter.getName(elem)!=="option")return false;var parent=adapter.getParent(elem);if(!parent||!adapter.isTag(parent)||adapter.getName(parent)!=="select"||adapter.hasAttrib(parent,"multiple")){return false}var siblings=adapter.getChildren(parent);var sawElem=false;for(var i=0;i<siblings.length;i++){var currentSibling=siblings[i];if(adapter.isTag(currentSibling)){if(equals(elem,currentSibling)){sawElem=true}else if(!sawElem){return false}else if(adapter.hasAttrib(currentSibling,"selected")){return false}}}return sawElem},disabled:function(elem,_a){var adapter=_a.adapter;return adapter.hasAttrib(elem,"disabled")},enabled:function(elem,_a){var adapter=_a.adapter;return!adapter.hasAttrib(elem,"disabled")},checked:function(elem,options){return options.adapter.hasAttrib(elem,"checked")||exports.pseudos.selected(elem,options)},required:function(elem,_a){var adapter=_a.adapter;return adapter.hasAttrib(elem,"required")},optional:function(elem,_a){var adapter=_a.adapter;return!adapter.hasAttrib(elem,"required")},parent:function(elem,options){return!exports.pseudos.empty(elem,options)},header:namePseudo(["h1","h2","h3","h4","h5","h6"]),button:function(elem,_a){var adapter=_a.adapter;var name=adapter.getName(elem);return name==="button"||name==="input"&&adapter.getAttributeValue(elem,"type")==="button"},input:namePseudo(["input","textarea","select","button"]),text:function(elem,_a){var adapter=_a.adapter;var type=adapter.getAttributeValue(elem,"type");return adapter.getName(elem)==="input"&&(!type||type.toLowerCase()==="text")}};function namePseudo(names){if(typeof Set!=="undefined"){var nameSet_1=new Set(names);return function(elem,_a){var adapter=_a.adapter;return nameSet_1.has(adapter.getName(elem))}}return function(elem,_a){var adapter=_a.adapter;return names.includes(adapter.getName(elem))}}function verifyPseudoArgs(func,name,subselect){if(subselect===null){if(func.length>2&&name!=="scope"){throw new Error("pseudo-selector :"+name+" requires an argument")}}else{if(func.length===2){throw new Error("pseudo-selector :"+name+" doesn't have any arguments")}}}exports.verifyPseudoArgs=verifyPseudoArgs}));var subselects=createCommonjsModule((function(module,exports){var __spreadArrays=commonjsGlobal&&commonjsGlobal.__spreadArrays||function(){for(var s=0,i=0,il=arguments.length;i<il;i++)s+=arguments[i].length;for(var r=Array(s),k=0,i=0;i<il;i++)for(var a=arguments[i],j=0,jl=a.length;j<jl;j++,k++)r[k]=a[j];return r};Object.defineProperty(exports,"__esModule",{value:true});exports.subselects=exports.getNextSiblings=exports.ensureIsTag=exports.PLACEHOLDER_ELEMENT=void 0;exports.PLACEHOLDER_ELEMENT={};function containsTraversal(t){return t.some(procedure.isTraversal)}function ensureIsTag(next,adapter){if(next===boolbase.falseFunc)return next;return function(elem){return adapter.isTag(elem)&&next(elem)}}exports.ensureIsTag=ensureIsTag;function getNextSiblings(elem,adapter){var siblings=adapter.getSiblings(elem);if(siblings.length<=1)return[];var elemIndex=siblings.indexOf(elem);if(elemIndex<0||elemIndex===siblings.length-1)return[];return siblings.slice(elemIndex+1).filter(adapter.isTag)}exports.getNextSiblings=getNextSiblings;exports.subselects={is:function(next,token,options,context,compileToken){return exports.subselects.matches(next,token,options,context,compileToken)},matches:function(next,token,options,context,compileToken){var opts={xmlMode:!!options.xmlMode,strict:!!options.strict,adapter:options.adapter,equals:options.equals,rootFunc:next};return compileToken(token,opts,context)},not:function(next,token,options,context,compileToken){var opts={xmlMode:!!options.xmlMode,strict:!!options.strict,adapter:options.adapter,equals:options.equals};if(opts.strict){if(token.length>1||token.some(containsTraversal)){throw new Error("complex selectors in :not aren't allowed in strict mode")}}var func=compileToken(token,opts,context);if(func===boolbase.falseFunc)return next;if(func===boolbase.trueFunc)return boolbase.falseFunc;return function not(elem){return!func(elem)&&next(elem)}},has:function(next,subselect,options,_context,compileToken){var adapter=options.adapter;var opts={xmlMode:!!options.xmlMode,strict:!!options.strict,adapter:adapter,equals:options.equals};var context=subselect.some(containsTraversal)?[exports.PLACEHOLDER_ELEMENT]:undefined;var compiled=compileToken(subselect,opts,context);if(compiled===boolbase.falseFunc)return boolbase.falseFunc;if(compiled===boolbase.trueFunc){return function(elem){return adapter.getChildren(elem).some(adapter.isTag)&&next(elem)}}var hasElement=ensureIsTag(compiled,adapter);var _a=compiled.shouldTestNextSiblings,shouldTestNextSiblings=_a===void 0?false:_a;if(context){return function(elem){context[0]=elem;var childs=adapter.getChildren(elem);var nextElements=shouldTestNextSiblings?__spreadArrays(childs,getNextSiblings(elem,adapter)):childs;return next(elem)&&adapter.existsOne(hasElement,nextElements)}}return function(elem){return next(elem)&&adapter.existsOne(hasElement,adapter.getChildren(elem))}}}}));var pseudoSelectors=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.compilePseudoSelector=exports.pseudos=exports.filters=void 0;Object.defineProperty(exports,"filters",{enumerable:true,get:function(){return filters$1.filters}});Object.defineProperty(exports,"pseudos",{enumerable:true,get:function(){return pseudos.pseudos}});var reCSS3=/^(?:(?:nth|last|first|only)-(?:child|of-type)|root|empty|(?:en|dis)abled|checked|not)$/;function compilePseudoSelector(next,selector,options,context,compileToken){var name=selector.name,data=selector.data;if(options.strict&&!reCSS3.test(name)){throw new Error(":"+name+" isn't part of CSS3")}if(Array.isArray(data)){return subselects.subselects[name](next,data,options,context,compileToken)}if(name in filters$1.filters){return filters$1.filters[name](next,data,options,context)}if(name in pseudos.pseudos){var pseudo_1=pseudos.pseudos[name];pseudos.verifyPseudoArgs(pseudo_1,name,data);return pseudo_1===boolbase.falseFunc?boolbase.falseFunc:next===boolbase.trueFunc?function(elem){return pseudo_1(elem,options,data)}:function(elem){return pseudo_1(elem,options,data)&&next(elem)}}throw new Error("unmatched pseudo-class :"+name)}exports.compilePseudoSelector=compilePseudoSelector}));var general=createCommonjsModule((function(module,exports){Object.defineProperty(exports,"__esModule",{value:true});exports.compileGeneralSelector=void 0;function compileGeneralSelector(next,selector,options,context,compileToken){var adapter=options.adapter,equals=options.equals;switch(selector.type){case"pseudo-element":throw new Error("Pseudo-elements are not supported by css-select");case"attribute":if(options.strict&&(selector.ignoreCase||selector.action==="not")){throw new Error("Unsupported attribute selector")}return attributes.attributeRules[selector.action](next,selector,options);case"pseudo":return pseudoSelectors.compilePseudoSelector(next,selector,options,context,compileToken);case"tag":return function tag(elem){return adapter.getName(elem)===selector.name&&next(elem)};case"descendant":if(options.cacheResults===false||typeof WeakSet==="undefined"){return function descendant(elem){var current=elem;while(current=adapter.getParent(current)){if(adapter.isTag(current)&&next(current)){return true}}return false}}var isFalseCache_1=new WeakSet;return function cachedDescendant(elem){var current=elem;while(current=adapter.getParent(current)){if(!isFalseCache_1.has(current)){if(adapter.isTag(current)&&next(current)){return true}isFalseCache_1.add(current)}}return false};case"_flexibleDescendant":return function flexibleDescendant(elem){var current=elem;do{if(adapter.isTag(current)&&next(current))return true}while(current=adapter.getParent(current));return false};case"parent":if(options.strict){throw new Error("Parent selector isn't part of CSS3")}return function parent(elem){return adapter.getChildren(elem).some((function(elem){return adapter.isTag(elem)&&next(elem)}))};case"child":return function child(elem){var parent=adapter.getParent(elem);return!!parent&&adapter.isTag(parent)&&next(parent)};case"sibling":return function sibling(elem){var siblings=adapter.getSiblings(elem);for(var i=0;i<siblings.length;i++){var currentSibling=siblings[i];if(equals(elem,currentSibling))break;if(adapter.isTag(currentSibling)&&next(currentSibling)){return true}}return false};case"adjacent":return function adjacent(elem){var siblings=adapter.getSiblings(elem);var lastElement;for(var i=0;i<siblings.length;i++){var currentSibling=siblings[i];if(equals(elem,currentSibling))break;if(adapter.isTag(currentSibling)){lastElement=currentSibling}}return!!lastElement&&next(lastElement)};case"universal":return next}}exports.compileGeneralSelector=compileGeneralSelector}));var compile_1=createCommonjsModule((function(module,exports){var __importDefault=commonjsGlobal&&commonjsGlobal.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:true});exports.compileToken=exports.compileUnsafe=exports.compile=void 0;var sort_1=__importDefault(sort);function compile(selector,options,context){var next=compileUnsafe(selector,options,context);return subselects.ensureIsTag(next,options.adapter)}exports.compile=compile;function compileUnsafe(selector,options,context){var token=lib$3.parse(selector,options);return compileToken(token,options,context)}exports.compileUnsafe=compileUnsafe;function includesScopePseudo(t){return t.type==="pseudo"&&(t.name==="scope"||Array.isArray(t.data)&&t.data.some((function(data){return data.some(includesScopePseudo)})))}var DESCENDANT_TOKEN={type:"descendant"};var FLEXIBLE_DESCENDANT_TOKEN={type:"_flexibleDescendant"};var SCOPE_TOKEN={type:"pseudo",name:"scope",data:null};function absolutize(token,_a,context){var adapter=_a.adapter;var hasContext=!!(context===null||context===void 0?void 0:context.every((function(e){var parent=adapter.getParent(e);return e===subselects.PLACEHOLDER_ELEMENT||!!(parent&&adapter.isTag(parent))})));for(var _i=0,token_1=token;_i<token_1.length;_i++){var t=token_1[_i];if(t.length>0&&procedure.isTraversal(t[0])&&t[0].type!=="descendant");else if(hasContext&&!t.some(includesScopePseudo)){t.unshift(DESCENDANT_TOKEN)}else{continue}t.unshift(SCOPE_TOKEN)}}function compileToken(token,options,context){var _a;token=token.filter((function(t){return t.length>0}));token.forEach(sort_1.default);context=(_a=options.context)!==null&&_a!==void 0?_a:context;var isArrayContext=Array.isArray(context);var finalContext=context&&(Array.isArray(context)?context:[context]);absolutize(token,options,finalContext);var shouldTestNextSiblings=false;var query=token.map((function(rules){if(rules.length>=2){var first=rules[0],second=rules[1];if(first.type!=="pseudo"||first.name!=="scope");else if(isArrayContext&&second.type==="descendant"){rules[1]=FLEXIBLE_DESCENDANT_TOKEN}else if(second.type==="adjacent"||second.type==="sibling"){shouldTestNextSiblings=true}}return compileRules(rules,options,finalContext)})).reduce(reduceRules,boolbase.falseFunc);query.shouldTestNextSiblings=shouldTestNextSiblings;return query}exports.compileToken=compileToken;function compileRules(rules,options,context){var _a;return rules.reduce((function(previous,rule){return previous===boolbase.falseFunc?boolbase.falseFunc:general.compileGeneralSelector(previous,rule,options,context,compileToken)}),(_a=options.rootFunc)!==null&&_a!==void 0?_a:boolbase.trueFunc)}function reduceRules(a,b){if(b===boolbase.falseFunc||a===boolbase.trueFunc){return a}if(a===boolbase.falseFunc||b===boolbase.trueFunc){return b}return function combine(elem){return a(elem)||b(elem)}}}));var lib$1=createCommonjsModule((function(module,exports){var __createBinding=commonjsGlobal&&commonjsGlobal.__createBinding||(Object.create?function(o,m,k,k2){if(k2===undefined)k2=k;Object.defineProperty(o,k2,{enumerable:true,get:function(){return m[k]}})}:function(o,m,k,k2){if(k2===undefined)k2=k;o[k2]=m[k]});var __setModuleDefault=commonjsGlobal&&commonjsGlobal.__setModuleDefault||(Object.create?function(o,v){Object.defineProperty(o,"default",{enumerable:true,value:v})}:function(o,v){o["default"]=v});var __importStar=commonjsGlobal&&commonjsGlobal.__importStar||function(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null)for(var k in mod)if(k!=="default"&&Object.prototype.hasOwnProperty.call(mod,k))__createBinding(result,mod,k);__setModuleDefault(result,mod);return result};Object.defineProperty(exports,"__esModule",{value:true});exports.pseudos=exports.filters=exports.is=exports.selectOne=exports.selectAll=exports.prepareContext=exports._compileToken=exports._compileUnsafe=exports.compile=void 0;var DomUtils=__importStar(lib$4);var defaultEquals=function(a,b){return a===b};var defaultOptions={adapter:DomUtils,equals:defaultEquals};function convertOptionFormats(options){var _a,_b,_c,_d;var opts=options!==null&&options!==void 0?options:defaultOptions;(_a=opts.adapter)!==null&&_a!==void 0?_a:opts.adapter=DomUtils;(_b=opts.equals)!==null&&_b!==void 0?_b:opts.equals=(_d=(_c=opts.adapter)===null||_c===void 0?void 0:_c.equals)!==null&&_d!==void 0?_d:defaultEquals;return opts}function wrapCompile(func){return function addAdapter(selector,options,context){var opts=convertOptionFormats(options);return func(selector,opts,context)}}exports.compile=wrapCompile(compile_1.compile);exports._compileUnsafe=wrapCompile(compile_1.compileUnsafe);exports._compileToken=wrapCompile(compile_1.compileToken);function getSelectorFunc(searchFunc){return function select(query,elements,options){var opts=convertOptionFormats(options);if(typeof query!=="function"){query=compile_1.compileUnsafe(query,opts,elements)}var filteredElements=prepareContext(elements,opts.adapter,query.shouldTestNextSiblings);return searchFunc(query,filteredElements,opts)}}function prepareContext(elems,adapter,shouldTestNextSiblings){if(shouldTestNextSiblings===void 0){shouldTestNextSiblings=false}if(shouldTestNextSiblings){elems=appendNextSiblings(elems,adapter)}return Array.isArray(elems)?adapter.removeSubsets(elems):adapter.getChildren(elems)}exports.prepareContext=prepareContext;function appendNextSiblings(elem,adapter){var elems=Array.isArray(elem)?elem.slice(0):[elem];for(var i=0;i<elems.length;i++){var nextSiblings=subselects.getNextSiblings(elems[i],adapter);elems.push.apply(elems,nextSiblings)}return elems}exports.selectAll=getSelectorFunc((function(query,elems,options){return query===boolbase.falseFunc||!elems||elems.length===0?[]:options.adapter.findAll(query,elems)}));exports.selectOne=getSelectorFunc((function(query,elems,options){return query===boolbase.falseFunc||!elems||elems.length===0?null:options.adapter.findOne(query,elems)}));function is(elem,query,options){var opts=convertOptionFormats(options);return(typeof query==="function"?query:compile_1.compile(query,opts))(elem)}exports.is=is;exports.default=exports.selectAll;Object.defineProperty(exports,"filters",{enumerable:true,get:function(){return pseudoSelectors.filters}});Object.defineProperty(exports,"pseudos",{enumerable:true,get:function(){return pseudoSelectors.pseudos}})}));const isTag=node=>node.type==="element";const existsOne=(test,elems)=>elems.some((elem=>{if(isTag(elem)){return test(elem)||existsOne(test,getChildren(elem))}else{return false}}));const getAttributeValue=(elem,name)=>elem.attributes[name];const getChildren=node=>node.children||[];const getName=elemAst=>elemAst.name;const getParent=node=>node.parentNode||null;const getSiblings=elem=>{var parent=getParent(elem);return parent?getChildren(parent):[]};const getText=node=>{if(node.children[0].type==="text"&&node.children[0].type==="cdata"){return node.children[0].value}return""};const hasAttrib=(elem,name)=>elem.attributes[name]!==undefined;const removeSubsets=nodes=>{let idx=nodes.length;let node;let ancestor;let replace;while(--idx>-1){node=ancestor=nodes[idx];nodes[idx]=null;replace=true;while(ancestor){if(nodes.includes(ancestor)){replace=false;nodes.splice(idx,1);break}ancestor=getParent(ancestor)}if(replace){nodes[idx]=node}}return nodes};const findAll=(test,elems)=>{const result=[];for(const elem of elems){if(isTag(elem)){if(test(elem)){result.push(elem)}result.push(...findAll(test,getChildren(elem)))}}return result};const findOne=(test,elems)=>{for(const elem of elems){if(isTag(elem)){if(test(elem)){return elem}const result=findOne(test,getChildren(elem));if(result){return result}}}return null};const svgoCssSelectAdapter={isTag:isTag,existsOne:existsOne,getAttributeValue:getAttributeValue,getChildren:getChildren,getName:getName,getParent:getParent,getSiblings:getSiblings,getText:getText,hasAttrib:hasAttrib,removeSubsets:removeSubsets,findAll:findAll,findOne:findOne};var cssSelectAdapter=svgoCssSelectAdapter;const{selectAll:selectAll$2,selectOne:selectOne$1,is:is$2}=lib$1;const cssSelectOptions$1={xmlMode:true,adapter:cssSelectAdapter};const querySelectorAll$1=(node,selector)=>selectAll$2(selector,node,cssSelectOptions$1);var querySelectorAll_1=querySelectorAll$1;const querySelector$1=(node,selector)=>selectOne$1(selector,node,cssSelectOptions$1);var querySelector_1=querySelector$1;const matches=(node,selector)=>is$2(node,selector,cssSelectOptions$1);var matches_1=matches;const closestByName$5=(node,name)=>{let currentNode=node;while(currentNode){if(currentNode.type==="element"&&currentNode.name===name){return currentNode}currentNode=currentNode.parentNode}return null};var closestByName_1=closestByName$5;const traverseBreak$1=Symbol();var traverseBreak_1=traverseBreak$1;const traverse$5=(node,fn)=>{if(fn(node)===traverseBreak$1){return traverseBreak$1}if(node.type==="root"||node.type==="element"){for(const child of node.children){if(traverse$5(child,fn)===traverseBreak$1){return traverseBreak$1}}}};var traverse_1=traverse$5;const visit$1=(node,visitor)=>{const callbacks=visitor[node.type];if(callbacks&&callbacks.enter){callbacks.enter(node)}if(node.type==="root"){for(const child of node.children){visit$1(child,visitor)}}if(node.type==="element"){if(node.parentNode.children.includes(node)){for(const child of node.children){visit$1(child,visitor)}}}if(callbacks&&callbacks.exit){callbacks.exit(node)}};var visit_1=visit$1;const detachNodeFromParent$1=node=>{const parentNode=node.parentNode;parentNode.children=parentNode.children.filter((child=>child!==node))};var detachNodeFromParent_1=detachNodeFromParent$1;var xast={querySelectorAll:querySelectorAll_1,querySelector:querySelector_1,matches:matches_1,closestByName:closestByName_1,traverseBreak:traverseBreak_1,traverse:traverse_1,visit:visit_1,detachNodeFromParent:detachNodeFromParent_1};const{closestByName:closestByName$4}=xast;var type$N="perItem";var active$N=false;var description$O="adds attributes to an outer <svg> element";var ENOCLS$1=`Error in plugin "addAttributesToSVGElement": absent parameters.\nIt should have a list of "attributes" or one "attribute".\nConfig example:\n\nplugins: [\n  {\n    name: 'addAttributesToSVGElement',\n    params: {\n      attribute: "mySvg"\n    }\n  }\n]\n\nplugins: [\n  {\n    name: 'addAttributesToSVGElement',\n    params: {\n      attributes: ["mySvg", "size-big"]\n    }\n  }\n]\n\nplugins: [\n  {\n    name: 'addAttributesToSVGElement',\n    params: {\n      attributes: [\n        {\n          focusable: false\n        },\n        {\n          'data-image': icon\n        }\n      ]\n    }\n  }\n]\n`;var fn$N=(node,params)=>{if(node.type==="element"&&node.name==="svg"&&closestByName$4(node.parentNode,"svg")==null){if(!params||!(Array.isArray(params.attributes)||params.attribute)){console.error(ENOCLS$1);return}const attributes=params.attributes||[params.attribute];for(const attribute of attributes){if(typeof attribute==="string"){if(node.attributes[attribute]==null){node.attributes[attribute]=undefined}}if(typeof attribute==="object"){for(const key of Object.keys(attribute)){if(node.attributes[key]==null){node.attributes[key]=attribute[key]}}}}}};var addAttributesToSVGElement$1={type:type$N,active:active$N,description:description$O,fn:fn$N};var type$M="full";var active$M=false;var description$N="adds classnames to an outer <svg> element";var ENOCLS=`Error in plugin "addClassesToSVGElement": absent parameters.\nIt should have a list of classes in "classNames" or one "className".\nConfig example:\n\nplugins:\n- addClassesToSVGElement:\n    className: "mySvg"\n\nplugins:\n- addClassesToSVGElement:\n    classNames: ["mySvg", "size-big"]\n`;var fn$M=function(data,params){if(!params||!(Array.isArray(params.classNames)&&params.classNames.some(String)||params.className)){console.error(ENOCLS);return data}var classNames=params.classNames||[params.className],svg=data.children[0];if(svg.isElem("svg")){svg.class.add.apply(svg.class,classNames)}return data};var addClassesToSVGElement$1={type:type$M,active:active$M,description:description$N,fn:fn$M};var type$L="perItem";var active$L=true;var description$M="cleanups attributes from newlines, trailing and repeating spaces";var params$l={newlines:true,trim:true,spaces:true};var regNewlinesNeedSpace=/(\S)\r?\n(\S)/g,regNewlines=/\r?\n/g,regSpaces=/\s{2,}/g;var fn$L=function(item,params){if(item.type==="element"){for(const name of Object.keys(item.attributes)){if(params.newlines){item.attributes[name]=item.attributes[name].replace(regNewlinesNeedSpace,((match,p1,p2)=>p1+" "+p2));item.attributes[name]=item.attributes[name].replace(regNewlines,"")}if(params.trim){item.attributes[name]=item.attributes[name].trim()}if(params.spaces){item.attributes[name]=item.attributes[name].replace(regSpaces," ")}}}};var cleanupAttrs$1={type:type$L,active:active$L,description:description$M,params:params$l,fn:fn$L};const{traverse:traverse$4}=xast;var type$K="full";var active$K=true;var description$L="remove or cleanup enable-background attribute when possible";var fn$K=function(root){const regEnableBackground=/^new\s0\s0\s([-+]?\d*\.?\d+([eE][-+]?\d+)?)\s([-+]?\d*\.?\d+([eE][-+]?\d+)?)$/;let hasFilter=false;const elems=["svg","mask","pattern"];traverse$4(root,(node=>{if(node.type==="element"){if(elems.includes(node.name)&&node.attributes["enable-background"]!=null&&node.attributes.width!=null&&node.attributes.height!=null){const match=node.attributes["enable-background"].match(regEnableBackground);if(match){if(node.attributes.width===match[1]&&node.attributes.height===match[3]){if(node.name==="svg"){delete node.attributes["enable-background"]}else{node.attributes["enable-background"]="new"}}}}if(node.name==="filter"){hasFilter=true}}}));if(hasFilter===false){traverse$4(root,(node=>{if(node.type==="element"){delete node.attributes["enable-background"]}}))}return root};var cleanupEnableBackground$1={type:type$K,active:active$K,description:description$L,fn:fn$K};var encodeSVGDatauri$1=function(str,type){var prefix="data:image/svg+xml";if(!type||type==="base64"){prefix+=";base64,";str=prefix+Buffer.from(str).toString("base64")}else if(type==="enc"){str=prefix+","+encodeURIComponent(str)}else if(type==="unenc"){str=prefix+","+str}return str};var decodeSVGDatauri=function(str){var regexp=/data:image\/svg\+xml(;charset=[^;,]*)?(;base64)?,(.*)/;var match=regexp.exec(str);if(!match)return str;var data=match[3];if(match[2]){str=Buffer.from(data,"base64").toString("utf8")}else if(data.charAt(0)==="%"){str=decodeURIComponent(data)}else if(data.charAt(0)==="<"){str=data}return str};var intersectArrays=function(a,b){return a.filter((function(n){return b.indexOf(n)>-1}))};var cleanupOutData$2=function(data,params,command){var str="",delimiter,prev;data.forEach((function(item,i){delimiter=" ";if(i==0)delimiter="";if(params.noSpaceAfterFlags&&(command=="A"||command=="a")){var pos=i%7;if(pos==4||pos==5)delimiter=""}const itemStr=params.leadingZero?removeLeadingZero$3(item):item.toString();if(params.negativeExtraSpace&&delimiter!=""&&(item<0||itemStr.charAt(0)==="."&&prev%1!==0)){delimiter=""}prev=item;str+=delimiter+itemStr}));return str};var removeLeadingZero$3=function(num){var strNum=num.toString();if(0<num&&num<1&&strNum.charAt(0)==="0"){strNum=strNum.slice(1)}else if(-1<num&&num<0&&strNum.charAt(1)==="0"){strNum=strNum.charAt(0)+strNum.slice(2)}return strNum};var removeLeadingZero_1=removeLeadingZero$3;const parseName$6=name=>{if(name==null){return{prefix:"",local:""}}if(name==="xmlns"){return{prefix:"xmlns",local:""}}const chunks=name.split(":");if(chunks.length===1){return{prefix:"",local:chunks[0]}}return{prefix:chunks[0],local:chunks[1]}};var parseName_1=parseName$6;var tools={encodeSVGDatauri:encodeSVGDatauri$1,decodeSVGDatauri:decodeSVGDatauri,intersectArrays:intersectArrays,cleanupOutData:cleanupOutData$2,removeLeadingZero:removeLeadingZero_1,parseName:parseName_1};var _collections=createCommonjsModule((function(module,exports){exports.elemsGroups={animation:["animate","animateColor","animateMotion","animateTransform","set"],descriptive:["desc","metadata","title"],shape:["circle","ellipse","line","path","polygon","polyline","rect"],structural:["defs","g","svg","symbol","use"],paintServer:["solidColor","linearGradient","radialGradient","meshGradient","pattern","hatch"],nonRendering:["linearGradient","radialGradient","pattern","clipPath","mask","marker","symbol","filter","solidColor"],container:["a","defs","g","marker","mask","missing-glyph","pattern","svg","switch","symbol","foreignObject"],textContent:["altGlyph","altGlyphDef","altGlyphItem","glyph","glyphRef","textPath","text","tref","tspan"],textContentChild:["altGlyph","textPath","tref","tspan"],lightSource:["feDiffuseLighting","feSpecularLighting","feDistantLight","fePointLight","feSpotLight"],filterPrimitive:["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence"]};exports.textElems=exports.elemsGroups.textContent.concat("title");exports.pathElems=["path","glyph","missing-glyph"];exports.attrsGroups={animationAddition:["additive","accumulate"],animationAttributeTarget:["attributeType","attributeName"],animationEvent:["onbegin","onend","onrepeat","onload"],animationTiming:["begin","dur","end","min","max","restart","repeatCount","repeatDur","fill"],animationValue:["calcMode","values","keyTimes","keySplines","from","to","by"],conditionalProcessing:["requiredFeatures","requiredExtensions","systemLanguage"],core:["id","tabindex","xml:base","xml:lang","xml:space"],graphicalEvent:["onfocusin","onfocusout","onactivate","onclick","onmousedown","onmouseup","onmouseover","onmousemove","onmouseout","onload"],presentation:["alignment-baseline","baseline-shift","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cursor","direction","display","dominant-baseline","enable-background","fill","fill-opacity","fill-rule","filter","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","glyph-orientation-horizontal","glyph-orientation-vertical","image-rendering","letter-spacing","lighting-color","marker-end","marker-mid","marker-start","mask","opacity","overflow","paint-order","pointer-events","shape-rendering","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-anchor","text-decoration","text-overflow","text-rendering","transform","unicode-bidi","vector-effect","visibility","word-spacing","writing-mode"],xlink:["xlink:href","xlink:show","xlink:actuate","xlink:type","xlink:role","xlink:arcrole","xlink:title"],documentEvent:["onunload","onabort","onerror","onresize","onscroll","onzoom"],filterPrimitive:["x","y","width","height","result"],transferFunction:["type","tableValues","slope","intercept","amplitude","exponent","offset"]};exports.attrsGroupsDefaults={core:{"xml:space":"default"},presentation:{clip:"auto","clip-path":"none","clip-rule":"nonzero",mask:"none",opacity:"1","stop-color":"#000","stop-opacity":"1","fill-opacity":"1","fill-rule":"nonzero",fill:"#000",stroke:"none","stroke-width":"1","stroke-linecap":"butt","stroke-linejoin":"miter","stroke-miterlimit":"4","stroke-dasharray":"none","stroke-dashoffset":"0","stroke-opacity":"1","paint-order":"normal","vector-effect":"none",display:"inline",visibility:"visible","marker-start":"none","marker-mid":"none","marker-end":"none","color-interpolation":"sRGB","color-interpolation-filters":"linearRGB","color-rendering":"auto","shape-rendering":"auto","text-rendering":"auto","image-rendering":"auto","font-style":"normal","font-variant":"normal","font-weight":"normal","font-stretch":"normal","font-size":"medium","font-size-adjust":"none",kerning:"auto","letter-spacing":"normal","word-spacing":"normal","text-decoration":"none","text-anchor":"start","text-overflow":"clip","writing-mode":"lr-tb","glyph-orientation-vertical":"auto","glyph-orientation-horizontal":"0deg",direction:"ltr","unicode-bidi":"normal","dominant-baseline":"auto","alignment-baseline":"baseline","baseline-shift":"baseline"},transferFunction:{slope:"1",intercept:"0",amplitude:"1",exponent:"1",offset:"0"}};exports.elems={a:{attrsGroups:["conditionalProcessing","core","graphicalEvent","presentation","xlink"],attrs:["class","style","externalResourcesRequired","transform","target"],defaults:{target:"_self"},contentGroups:["animation","descriptive","shape","structural","paintServer"],content:["a","altGlyphDef","clipPath","color-profile","cursor","filter","font","font-face","foreignObject","image","marker","mask","pattern","script","style","switch","text","view","tspan"]},altGlyph:{attrsGroups:["conditionalProcessing","core","graphicalEvent","presentation","xlink"],attrs:["class","style","externalResourcesRequired","x","y","dx","dy","glyphRef","format","rotate"]},altGlyphDef:{attrsGroups:["core"],content:["glyphRef"]},altGlyphItem:{attrsGroups:["core"],content:["glyphRef","altGlyphItem"]},animate:{attrsGroups:["conditionalProcessing","core","animationAddition","animationAttributeTarget","animationEvent","animationTiming","animationValue","presentation","xlink"],attrs:["externalResourcesRequired"],contentGroups:["descriptive"]},animateColor:{attrsGroups:["conditionalProcessing","core","animationEvent","xlink","animationAttributeTarget","animationTiming","animationValue","animationAddition","presentation"],attrs:["externalResourcesRequired"],contentGroups:["descriptive"]},animateMotion:{attrsGroups:["conditionalProcessing","core","animationEvent","xlink","animationTiming","animationValue","animationAddition"],attrs:["externalResourcesRequired","path","keyPoints","rotate","origin"],defaults:{rotate:"0"},contentGroups:["descriptive"],content:["mpath"]},animateTransform:{attrsGroups:["conditionalProcessing","core","animationEvent","xlink","animationAttributeTarget","animationTiming","animationValue","animationAddition"],attrs:["externalResourcesRequired","type"],contentGroups:["descriptive"]},circle:{attrsGroups:["conditionalProcessing","core","graphicalEvent","presentation"],attrs:["class","style","externalResourcesRequired","transform","cx","cy","r"],defaults:{cx:"0",cy:"0"},contentGroups:["animation","descriptive"]},clipPath:{attrsGroups:["conditionalProcessing","core","presentation"],attrs:["class","style","externalResourcesRequired","transform","clipPathUnits"],defaults:{clipPathUnits:"userSpaceOnUse"},contentGroups:["animation","descriptive","shape"],content:["text","use"]},"color-profile":{attrsGroups:["core","xlink"],attrs:["local","name","rendering-intent"],defaults:{name:"sRGB","rendering-intent":"auto"},contentGroups:["descriptive"]},cursor:{attrsGroups:["core","conditionalProcessing","xlink"],attrs:["externalResourcesRequired","x","y"],defaults:{x:"0",y:"0"},contentGroups:["descriptive"]},defs:{attrsGroups:["conditionalProcessing","core","graphicalEvent","presentation"],attrs:["class","style","externalResourcesRequired","transform"],contentGroups:["animation","descriptive","shape","structural","paintServer"],content:["a","altGlyphDef","clipPath","color-profile","cursor","filter","font","font-face","foreignObject","image","marker","mask","pattern","script","style","switch","text","view"]},desc:{attrsGroups:["core"],attrs:["class","style"]},ellipse:{attrsGroups:["conditionalProcessing","core","graphicalEvent","presentation"],attrs:["class","style","externalResourcesRequired","transform","cx","cy","rx","ry"],defaults:{cx:"0",cy:"0"},contentGroups:["animation","descriptive"]},feBlend:{attrsGroups:["core","presentation","filterPrimitive"],attrs:["class","style","in","in2","mode"],defaults:{mode:"normal"},content:["animate","set"]},feColorMatrix:{attrsGroups:["core","presentation","filterPrimitive"],attrs:["class","style","in","type","values"],defaults:{type:"matrix"},content:["animate","set"]},feComponentTransfer:{attrsGroups:["core","presentation","filterPrimitive"],attrs:["class","style","in"],content:["feFuncA","feFuncB","feFuncG","feFuncR"]},feComposite:{attrsGroups:["core","presentation","filterPrimitive"],attrs:["class","style","in","in2","operator","k1","k2","k3","k4"],defaults:{operator:"over",k1:"0",k2:"0",k3:"0",k4:"0"},content:["animate","set"]},feConvolveMatrix:{attrsGroups:["core","presentation","filterPrimitive"],attrs:["class","style","in","order","kernelMatrix","divisor","bias","targetX","targetY","edgeMode","kernelUnitLength","preserveAlpha"],defaults:{order:"3",bias:"0",edgeMode:"duplicate",preserveAlpha:"false"},content:["animate","set"]},feDiffuseLighting:{attrsGroups:["core","presentation","filterPrimitive"],attrs:["class","style","in","surfaceScale","diffuseConstant","kernelUnitLength"],defaults:{surfaceScale:"1",diffuseConstant:"1"},contentGroups:["descriptive"],content:["feDistantLight","fePointLight","feSpotLight"]},feDisplacementMap:{attrsGroups:["core","presentation","filterPrimitive"],attrs:["class","style","in","in2","scale","xChannelSelector","yChannelSelector"],defaults:{scale:"0",xChannelSelector:"A",yChannelSelector:"A"},content:["animate","set"]},feDistantLight:{attrsGroups:["core"],attrs:["azimuth","elevation"],defaults:{azimuth:"0",elevation:"0"},content:["animate","set"]},feFlood:{attrsGroups:["core","presentation","filterPrimitive"],attrs:["class","style"],content:["animate","animateColor","set"]},feFuncA:{attrsGroups:["core","transferFunction"],content:["set","animate"]},feFuncB:{attrsGroups:["core","transferFunction"],content:["set","animate"]},feFuncG:{attrsGroups:["core","transferFunction"],content:["set","animate"]},feFuncR:{attrsGroups:["core","transferFunction"],content:["set","animate"]},feGaussianBlur:{attrsGroups:["core","presentation","filterPrimitive"],attrs:["class","style","in","stdDeviation"],defaults:{stdDeviation:"0"},content:["set","animate"]},feImage:{attrsGroups:["core","presentation","filterPrimitive","xlink"],attrs:["class","style","externalResourcesRequired","preserveAspectRatio","href","xlink:href"],defaults:{preserveAspectRatio:"xMidYMid meet"},content:["animate","animateTransform","set"]},feMerge:{attrsGroups:["core","presentation","filterPrimitive"],attrs:["class","style"],content:["feMergeNode"]},feMergeNode:{attrsGroups:["core"],attrs:["in"],content:["animate","set"]},feMorphology:{attrsGroups:["core","presentation","filterPrimitive"],attrs:["class","style","in","operator","radius"],defaults:{operator:"erode",radius:"0"},content:["animate","set"]},feOffset:{attrsGroups:["core","presentation","filterPrimitive"],attrs:["class","style","in","dx","dy"],defaults:{dx:"0",dy:"0"},content:["animate","set"]},fePointLight:{attrsGroups:["core"],attrs:["x","y","z"],defaults:{x:"0",y:"0",z:"0"},content:["animate","set"]},feSpecularLighting:{attrsGroups:["core","presentation","filterPrimitive"],attrs:["class","style","in","surfaceScale","specularConstant","specularExponent","kernelUnitLength"],defaults:{surfaceScale:"1",specularConstant:"1",specularExponent:"1"},contentGroups:["descriptive","lightSource"]},feSpotLight:{attrsGroups:["core"],attrs:["x","y","z","pointsAtX","pointsAtY","pointsAtZ","specularExponent","limitingConeAngle"],defaults:{x:"0",y:"0",z:"0",pointsAtX:"0",pointsAtY:"0",pointsAtZ:"0",specularExponent:"1"},content:["animate","set"]},feTile:{attrsGroups:["core","presentation","filterPrimitive"],attrs:["class","style","in"],content:["animate","set"]},feTurbulence:{attrsGroups:["core","presentation","filterPrimitive"],attrs:["class","style","baseFrequency","numOctaves","seed","stitchTiles","type"],defaults:{baseFrequency:"0",numOctaves:"1",seed:"0",stitchTiles:"noStitch",type:"turbulence"},content:["animate","set"]},filter:{attrsGroups:["core","presentation","xlink"],attrs:["class","style","externalResourcesRequired","x","y","width","height","filterRes","filterUnits","primitiveUnits","href","xlink:href"],defaults:{primitiveUnits:"userSpaceOnUse",x:"-10%",y:"-10%",width:"120%",height:"120%"},contentGroups:["descriptive","filterPrimitive"],content:["animate","set"]},font:{attrsGroups:["core","presentation"],attrs:["class","style","externalResourcesRequired","horiz-origin-x","horiz-origin-y","horiz-adv-x","vert-origin-x","vert-origin-y","vert-adv-y"],defaults:{"horiz-origin-x":"0","horiz-origin-y":"0"},contentGroups:["descriptive"],content:["font-face","glyph","hkern","missing-glyph","vkern"]},"font-face":{attrsGroups:["core"],attrs:["font-family","font-style","font-variant","font-weight","font-stretch","font-size","unicode-range","units-per-em","panose-1","stemv","stemh","slope","cap-height","x-height","accent-height","ascent","descent","widths","bbox","ideographic","alphabetic","mathematical","hanging","v-ideographic","v-alphabetic","v-mathematical","v-hanging","underline-position","underline-thickness","strikethrough-position","strikethrough-thickness","overline-position","overline-thickness"],defaults:{"font-style":"all","font-variant":"normal","font-weight":"all","font-stretch":"normal","unicode-range":"U+0-10FFFF","units-per-em":"1000","panose-1":"0 0 0 0 0 0 0 0 0 0",slope:"0"},contentGroups:["descriptive"],content:["font-face-src"]},"font-face-format":{attrsGroups:["core"],attrs:["string"]},"font-face-name":{attrsGroups:["core"],attrs:["name"]},"font-face-src":{attrsGroups:["core"],content:["font-face-name","font-face-uri"]},"font-face-uri":{attrsGroups:["core","xlink"],attrs:["href","xlink:href"],content:["font-face-format"]},foreignObject:{attrsGroups:["core","conditionalProcessing","graphicalEvent","presentation"],attrs:["class","style","externalResourcesRequired","transform","x","y","width","height"],defaults:{x:0,y:0}},g:{attrsGroups:["conditionalProcessing","core","graphicalEvent","presentation"],attrs:["class","style","externalResourcesRequired","transform"],contentGroups:["animation","descriptive","shape","structural","paintServer"],content:["a","altGlyphDef","clipPath","color-profile","cursor","filter","font","font-face","foreignObject","image","marker","mask","pattern","script","style","switch","text","view"]},glyph:{attrsGroups:["core","presentation"],attrs:["class","style","d","horiz-adv-x","vert-origin-x","vert-origin-y","vert-adv-y","unicode","glyph-name","orientation","arabic-form","lang"],defaults:{"arabic-form":"initial"},contentGroups:["animation","descriptive","shape","structural","paintServer"],content:["a","altGlyphDef","clipPath","color-profile","cursor","filter","font","font-face","foreignObject","image","marker","mask","pattern","script","style","switch","text","view"]},glyphRef:{attrsGroups:["core","presentation"],attrs:["class","style","d","horiz-adv-x","vert-origin-x","vert-origin-y","vert-adv-y"],contentGroups:["animation","descriptive","shape","structural","paintServer"],content:["a","altGlyphDef","clipPath","color-profile","cursor","filter","font","font-face","foreignObject","image","marker","mask","pattern","script","style","switch","text","view"]},hatch:{attrsGroups:["core","presentation","xlink"],attrs:["class","style","x","y","pitch","rotate","hatchUnits","hatchContentUnits","transform"],defaults:{hatchUnits:"objectBoundingBox",hatchContentUnits:"userSpaceOnUse",x:"0",y:"0",pitch:"0",rotate:"0"},contentGroups:["animation","descriptive"],content:["hatchPath"]},hatchPath:{attrsGroups:["core","presentation","xlink"],attrs:["class","style","d","offset"],defaults:{offset:"0"},contentGroups:["animation","descriptive"]},hkern:{attrsGroups:["core"],attrs:["u1","g1","u2","g2","k"]},image:{attrsGroups:["core","conditionalProcessing","graphicalEvent","xlink","presentation"],attrs:["class","style","externalResourcesRequired","preserveAspectRatio","transform","x","y","width","height","href","xlink:href"],defaults:{x:"0",y:"0",preserveAspectRatio:"xMidYMid meet"},contentGroups:["animation","descriptive"]},line:{attrsGroups:["conditionalProcessing","core","graphicalEvent","presentation"],attrs:["class","style","externalResourcesRequired","transform","x1","y1","x2","y2"],defaults:{x1:"0",y1:"0",x2:"0",y2:"0"},contentGroups:["animation","descriptive"]},linearGradient:{attrsGroups:["core","presentation","xlink"],attrs:["class","style","externalResourcesRequired","x1","y1","x2","y2","gradientUnits","gradientTransform","spreadMethod","href","xlink:href"],defaults:{x1:"0",y1:"0",x2:"100%",y2:"0",spreadMethod:"pad"},contentGroups:["descriptive"],content:["animate","animateTransform","set","stop"]},marker:{attrsGroups:["core","presentation"],attrs:["class","style","externalResourcesRequired","viewBox","preserveAspectRatio","refX","refY","markerUnits","markerWidth","markerHeight","orient"],defaults:{markerUnits:"strokeWidth",refX:"0",refY:"0",markerWidth:"3",markerHeight:"3"},contentGroups:["animation","descriptive","shape","structural","paintServer"],content:["a","altGlyphDef","clipPath","color-profile","cursor","filter","font","font-face","foreignObject","image","marker","mask","pattern","script","style","switch","text","view"]},mask:{attrsGroups:["conditionalProcessing","core","presentation"],attrs:["class","style","externalResourcesRequired","x","y","width","height","mask-type","maskUnits","maskContentUnits"],defaults:{maskUnits:"objectBoundingBox",maskContentUnits:"userSpaceOnUse",x:"-10%",y:"-10%",width:"120%",height:"120%"},contentGroups:["animation","descriptive","shape","structural","paintServer"],content:["a","altGlyphDef","clipPath","color-profile","cursor","filter","font","font-face","foreignObject","image","marker","mask","pattern","script","style","switch","text","view"]},metadata:{attrsGroups:["core"]},"missing-glyph":{attrsGroups:["core","presentation"],attrs:["class","style","d","horiz-adv-x","vert-origin-x","vert-origin-y","vert-adv-y"],contentGroups:["animation","descriptive","shape","structural","paintServer"],content:["a","altGlyphDef","clipPath","color-profile","cursor","filter","font","font-face","foreignObject","image","marker","mask","pattern","script","style","switch","text","view"]},mpath:{attrsGroups:["core","xlink"],attrs:["externalResourcesRequired","href","xlink:href"],contentGroups:["descriptive"]},path:{attrsGroups:["conditionalProcessing","core","graphicalEvent","presentation"],attrs:["class","style","externalResourcesRequired","transform","d","pathLength"],contentGroups:["animation","descriptive"]},pattern:{attrsGroups:["conditionalProcessing","core","presentation","xlink"],attrs:["class","style","externalResourcesRequired","viewBox","preserveAspectRatio","x","y","width","height","patternUnits","patternContentUnits","patternTransform","href","xlink:href"],defaults:{patternUnits:"objectBoundingBox",patternContentUnits:"userSpaceOnUse",x:"0",y:"0",width:"0",height:"0",preserveAspectRatio:"xMidYMid meet"},contentGroups:["animation","descriptive","paintServer","shape","structural"],content:["a","altGlyphDef","clipPath","color-profile","cursor","filter","font","font-face","foreignObject","image","marker","mask","pattern","script","style","switch","text","view"]},polygon:{attrsGroups:["conditionalProcessing","core","graphicalEvent","presentation"],attrs:["class","style","externalResourcesRequired","transform","points"],contentGroups:["animation","descriptive"]},polyline:{attrsGroups:["conditionalProcessing","core","graphicalEvent","presentation"],attrs:["class","style","externalResourcesRequired","transform","points"],contentGroups:["animation","descriptive"]},radialGradient:{attrsGroups:["core","presentation","xlink"],attrs:["class","style","externalResourcesRequired","cx","cy","r","fx","fy","fr","gradientUnits","gradientTransform","spreadMethod","href","xlink:href"],defaults:{gradientUnits:"objectBoundingBox",cx:"50%",cy:"50%",r:"50%"},contentGroups:["descriptive"],content:["animate","animateTransform","set","stop"]},meshGradient:{attrsGroups:["core","presentation","xlink"],attrs:["class","style","x","y","gradientUnits","transform"],contentGroups:["descriptive","paintServer","animation"],content:["meshRow"]},meshRow:{attrsGroups:["core","presentation"],attrs:["class","style"],contentGroups:["descriptive"],content:["meshPatch"]},meshPatch:{attrsGroups:["core","presentation"],attrs:["class","style"],contentGroups:["descriptive"],content:["stop"]},rect:{attrsGroups:["conditionalProcessing","core","graphicalEvent","presentation"],attrs:["class","style","externalResourcesRequired","transform","x","y","width","height","rx","ry"],defaults:{x:"0",y:"0"},contentGroups:["animation","descriptive"]},script:{attrsGroups:["core","xlink"],attrs:["externalResourcesRequired","type","href","xlink:href"]},set:{attrsGroups:["conditionalProcessing","core","animation","xlink","animationAttributeTarget","animationTiming"],attrs:["externalResourcesRequired","to"],contentGroups:["descriptive"]},solidColor:{attrsGroups:["core","presentation"],attrs:["class","style"],contentGroups:["paintServer"]},stop:{attrsGroups:["core","presentation"],attrs:["class","style","offset","path"],content:["animate","animateColor","set"]},style:{attrsGroups:["core"],attrs:["type","media","title"],defaults:{type:"text/css"}},svg:{attrsGroups:["conditionalProcessing","core","documentEvent","graphicalEvent","presentation"],attrs:["class","style","x","y","width","height","viewBox","preserveAspectRatio","zoomAndPan","version","baseProfile","contentScriptType","contentStyleType"],defaults:{x:"0",y:"0",width:"100%",height:"100%",preserveAspectRatio:"xMidYMid meet",zoomAndPan:"magnify",version:"1.1",baseProfile:"none",contentScriptType:"application/ecmascript",contentStyleType:"text/css"},contentGroups:["animation","descriptive","shape","structural","paintServer"],content:["a","altGlyphDef","clipPath","color-profile","cursor","filter","font","font-face","foreignObject","image","marker","mask","pattern","script","style","switch","text","view"]},switch:{attrsGroups:["conditionalProcessing","core","graphicalEvent","presentation"],attrs:["class","style","externalResourcesRequired","transform"],contentGroups:["animation","descriptive","shape"],content:["a","foreignObject","g","image","svg","switch","text","use"]},symbol:{attrsGroups:["core","graphicalEvent","presentation"],attrs:["class","style","externalResourcesRequired","preserveAspectRatio","viewBox","refX","refY"],defaults:{refX:0,refY:0},contentGroups:["animation","descriptive","shape","structural","paintServer"],content:["a","altGlyphDef","clipPath","color-profile","cursor","filter","font","font-face","foreignObject","image","marker","mask","pattern","script","style","switch","text","view"]},text:{attrsGroups:["conditionalProcessing","core","graphicalEvent","presentation"],attrs:["class","style","externalResourcesRequired","transform","lengthAdjust","x","y","dx","dy","rotate","textLength"],defaults:{x:"0",y:"0",lengthAdjust:"spacing"},contentGroups:["animation","descriptive","textContentChild"],content:["a"]},textPath:{attrsGroups:["conditionalProcessing","core","graphicalEvent","presentation","xlink"],attrs:["class","style","externalResourcesRequired","href","xlink:href","startOffset","method","spacing","d"],defaults:{startOffset:"0",method:"align",spacing:"exact"},contentGroups:["descriptive"],content:["a","altGlyph","animate","animateColor","set","tref","tspan"]},title:{attrsGroups:["core"],attrs:["class","style"]},tref:{attrsGroups:["conditionalProcessing","core","graphicalEvent","presentation","xlink"],attrs:["class","style","externalResourcesRequired","href","xlink:href"],contentGroups:["descriptive"],content:["animate","animateColor","set"]},tspan:{attrsGroups:["conditionalProcessing","core","graphicalEvent","presentation"],attrs:["class","style","externalResourcesRequired","x","y","dx","dy","rotate","textLength","lengthAdjust"],contentGroups:["descriptive"],content:["a","altGlyph","animate","animateColor","set","tref","tspan"]},use:{attrsGroups:["core","conditionalProcessing","graphicalEvent","presentation","xlink"],attrs:["class","style","externalResourcesRequired","transform","x","y","width","height","href","xlink:href"],defaults:{x:"0",y:"0"},contentGroups:["animation","descriptive"]},view:{attrsGroups:["core"],attrs:["externalResourcesRequired","viewBox","preserveAspectRatio","zoomAndPan","viewTarget"],contentGroups:["descriptive"]},vkern:{attrsGroups:["core"],attrs:["u1","g1","u2","g2","k"]}};exports.editorNamespaces=["http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd","http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd","http://www.inkscape.org/namespaces/inkscape","http://www.bohemiancoding.com/sketch/ns","http://ns.adobe.com/AdobeIllustrator/10.0/","http://ns.adobe.com/Graphs/1.0/","http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/","http://ns.adobe.com/Variables/1.0/","http://ns.adobe.com/SaveForWeb/1.0/","http://ns.adobe.com/Extensibility/1.0/","http://ns.adobe.com/Flows/1.0/","http://ns.adobe.com/ImageReplacement/1.0/","http://ns.adobe.com/GenericCustomNamespace/1.0/","http://ns.adobe.com/XPath/1.0/","http://schemas.microsoft.com/visio/2003/SVGExtensions/","http://taptrix.com/vectorillustrator/svg_extensions","http://www.figma.com/figma/ns","http://purl.org/dc/elements/1.1/","http://creativecommons.org/ns#","http://www.w3.org/1999/02/22-rdf-syntax-ns#","http://www.serif.com/","http://www.vector.evaxdesign.sk"];exports.referencesProps=["clip-path","color-profile","fill","filter","marker-start","marker-mid","marker-end","mask","stroke","style"];exports.inheritableAttrs=["clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cursor","direction","dominant-baseline","fill","fill-opacity","fill-rule","font","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","glyph-orientation-horizontal","glyph-orientation-vertical","image-rendering","letter-spacing","marker","marker-end","marker-mid","marker-start","paint-order","pointer-events","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-anchor","text-rendering","transform","visibility","word-spacing","writing-mode"];exports.presentationNonInheritableGroupAttrs=["display","clip-path","filter","mask","opacity","text-decoration","transform","unicode-bidi","visibility"];exports.colorsNames={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#0ff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000",blanchedalmond:"#ffebcd",blue:"#00f",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#0ff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#f0f",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#789",lightslategrey:"#789",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#0f0",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#f0f",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#639",red:"#f00",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#fff",whitesmoke:"#f5f5f5",yellow:"#ff0",yellowgreen:"#9acd32"};exports.colorsShortNames={"#f0ffff":"azure","#f5f5dc":"beige","#ffe4c4":"bisque","#a52a2a":"brown","#ff7f50":"coral","#ffd700":"gold","#808080":"gray","#008000":"green","#4b0082":"indigo","#fffff0":"ivory","#f0e68c":"khaki","#faf0e6":"linen","#800000":"maroon","#000080":"navy","#808000":"olive","#ffa500":"orange","#da70d6":"orchid","#cd853f":"peru","#ffc0cb":"pink","#dda0dd":"plum","#800080":"purple","#f00":"red","#ff0000":"red","#fa8072":"salmon","#a0522d":"sienna","#c0c0c0":"silver","#fffafa":"snow","#d2b48c":"tan","#008080":"teal","#ff6347":"tomato","#ee82ee":"violet","#f5deb3":"wheat"};exports.colorsProps=["color","fill","stroke","stop-color","flood-color","lighting-color"]}));const{traverse:traverse$3,traverseBreak:traverseBreak}=xast;const{parseName:parseName$5}=tools;var type$J="full";var active$J=true;var description$K="removes unused IDs and minifies used";var params$k={remove:true,minify:true,prefix:"",preserve:[],preservePrefixes:[],force:false};var referencesProps$3=new Set(_collections.referencesProps),regReferencesUrl=/\burl\(("|')?#(.+?)\1\)/,regReferencesHref=/^#(.+?)$/,regReferencesBegin=/(\w+)\./,styleOrScript$1=["style","script"],generateIDchars=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],maxIDindex=generateIDchars.length-1;var fn$J=function(root,params){var currentID,currentIDstring,IDs=new Map,referencesIDs=new Map,hasStyleOrScript=false,preserveIDs=new Set(Array.isArray(params.preserve)?params.preserve:params.preserve?[params.preserve]:[]),preserveIDPrefixes=new Set(Array.isArray(params.preservePrefixes)?params.preservePrefixes:params.preservePrefixes?[params.preservePrefixes]:[]),idValuePrefix="#",idValuePostfix=".";traverse$3(root,(node=>{if(hasStyleOrScript===true){return traverseBreak}if(!params.force){if(node.isElem(styleOrScript$1)&&node.children.length!==0){hasStyleOrScript=true;return}if(node.type==="element"&&node.name==="svg"){let hasDefsOnly=true;for(const child of node.children){if(child.type!=="element"||child.name!=="defs"){hasDefsOnly=false;break}}if(hasDefsOnly){return traverseBreak}}}if(node.type==="element"){for(const[name,value]of Object.entries(node.attributes)){let key;let match;if(name==="id"){key=value;if(IDs.has(key)){delete node.attributes.id}else{IDs.set(key,node)}}else{const{local:local}=parseName$5(name);if(referencesProps$3.has(name)&&(match=value.match(regReferencesUrl))){key=match[2]}else if(local==="href"&&(match=value.match(regReferencesHref))||name==="begin"&&(match=value.match(regReferencesBegin))){key=match[1]}if(key){const refs=referencesIDs.get(key)||[];refs.push({element:node,name:name,value:value});referencesIDs.set(key,refs)}}}}}));if(hasStyleOrScript){return root}const idPreserved=id=>preserveIDs.has(id)||idMatchesPrefix(preserveIDPrefixes,id);for(const[key,refs]of referencesIDs){if(IDs.has(key)){if(params.minify&&!idPreserved(key)){do{currentIDstring=getIDstring(currentID=generateID(currentID),params)}while(idPreserved(currentIDstring));IDs.get(key).attributes.id=currentIDstring;for(const{element:element,name:name,value:value}of refs){element.attributes[name]=value.includes(idValuePrefix)?value.replace(idValuePrefix+key,idValuePrefix+currentIDstring):value.replace(key+idValuePostfix,currentIDstring+idValuePostfix)}}IDs.delete(key)}}if(params.remove){for(var keyElem of IDs){if(!idPreserved(keyElem[0])){delete keyElem[1].attributes.id}}}return root};function idMatchesPrefix(prefixArray,currentID){if(!currentID)return false;for(var prefix of prefixArray)if(currentID.startsWith(prefix))return true;return false}function generateID(currentID){if(!currentID)return[0];currentID[currentID.length-1]++;for(var i=currentID.length-1;i>0;i--){if(currentID[i]>maxIDindex){currentID[i]=0;if(currentID[i-1]!==undefined){currentID[i-1]++}}}if(currentID[0]>maxIDindex){currentID[0]=0;currentID.unshift(0)}return currentID}function getIDstring(arr,params){var str=params.prefix;return str+arr.map((i=>generateIDchars[i])).join("")}var cleanupIDs$1={type:type$J,active:active$J,description:description$K,params:params$k,fn:fn$J};const{removeLeadingZero:removeLeadingZero$2}=tools;var type$I="perItem";var active$I=false;var description$J="rounds list of values to the fixed precision";var params$j={floatPrecision:3,leadingZero:true,defaultPx:true,convertToPx:true};const regNumericValues$2=/^([-+]?\d*\.?\d+([eE][-+]?\d+)?)(px|pt|pc|mm|cm|m|in|ft|em|ex|%)?$/;const regSeparator=/\s+,?\s*|,\s*/;const absoluteLengths$1={cm:96/2.54,mm:96/25.4,in:96,pt:4/3,pc:16};var fn$I=function(item,params){if(item.type!=="element"){return}if(item.attributes.points!=null){item.attributes.points=roundValues(item.attributes.points)}if(item.attributes["enable-background"]!=null){item.attributes["enable-background"]=roundValues(item.attributes["enable-background"])}if(item.attributes.viewBox!=null){item.attributes.viewBox=roundValues(item.attributes.viewBox)}if(item.attributes["stroke-dasharray"]!=null){item.attributes["stroke-dasharray"]=roundValues(item.attributes["stroke-dasharray"])}if(item.attributes.dx!=null){item.attributes.dx=roundValues(item.attributes.dx)}if(item.attributes.dy!=null){item.attributes.dy=roundValues(item.attributes.dy)}if(item.attributes.x!=null){item.attributes.x=roundValues(item.attributes.x)}if(item.attributes.y!=null){item.attributes.y=roundValues(item.attributes.y)}function roundValues(lists){var num,units,match,matchNew,listsArr=lists.split(regSeparator),roundedList=[];for(const elem of listsArr){match=elem.match(regNumericValues$2);matchNew=elem.match(/new/);if(match){num=+(+match[1]).toFixed(params.floatPrecision),units=match[3]||"";if(params.convertToPx&&units&&units in absoluteLengths$1){var pxNum=+(absoluteLengths$1[units]*match[1]).toFixed(params.floatPrecision);if(String(pxNum).length<match[0].length)num=pxNum,units="px"}if(params.leadingZero){num=removeLeadingZero$2(num)}if(params.defaultPx&&units==="px"){units=""}roundedList.push(num+units)}else if(matchNew){roundedList.push("new")}else if(elem){roundedList.push(elem)}}return roundedList.join(" ")}};var cleanupListOfValues$1={type:type$I,active:active$I,description:description$J,params:params$j,fn:fn$I};var type$H="perItem";var active$H=true;var description$I="rounds numeric values to the fixed precision, removes default ‘px’ units";var params$i={floatPrecision:3,leadingZero:true,defaultPx:true,convertToPx:true};var regNumericValues$1=/^([-+]?\d*\.?\d+([eE][-+]?\d+)?)(px|pt|pc|mm|cm|m|in|ft|em|ex|%)?$/,removeLeadingZero$1=tools.removeLeadingZero,absoluteLengths={cm:96/2.54,mm:96/25.4,in:96,pt:4/3,pc:16};var fn$H=function(item,params){if(item.type==="element"){var floatPrecision=params.floatPrecision;if(item.attributes.viewBox!=null){var nums=item.attributes.viewBox.split(/\s,?\s*|,\s*/g);item.attributes.viewBox=nums.map((function(value){var num=+value;return isNaN(num)?value:+num.toFixed(floatPrecision)})).join(" ")}for(const[name,value]of Object.entries(item.attributes)){if(name==="version"){continue}var match=value.match(regNumericValues$1);if(match){var num=+(+match[1]).toFixed(floatPrecision),units=match[3]||"";if(params.convertToPx&&units&&units in absoluteLengths){var pxNum=+(absoluteLengths[units]*match[1]).toFixed(floatPrecision);if(String(pxNum).length<match[0].length){num=pxNum;units="px"}}if(params.leadingZero){num=removeLeadingZero$1(num)}if(params.defaultPx&&units==="px"){units=""}item.attributes[name]=num+units}}}};var cleanupNumericValues$1={type:type$H,active:active$H,description:description$I,params:params$i,fn:fn$H};const{inheritableAttrs:inheritableAttrs$3,elemsGroups:elemsGroups$3}=_collections;var type$G="perItemReverse";var active$G=true;var description$H="collapses useless groups";function hasAnimatedAttr(item,name){if(item.type==="element"){return elemsGroups$3.animation.includes(item.name)&&item.attributes.attributeName===name||item.children.length!==0&&item.children.some((child=>hasAnimatedAttr(child,name)))}return false}var fn$G=function(item){if(item.type==="element"&&item.name!=="switch"&&item.children.length!==0){item.children.forEach((function(g,i){if(g.type==="element"&&g.name==="g"&&g.children.length!==0){if(Object.keys(g.attributes).length!==0&&g.children.length===1){var inner=g.children[0];if(inner.type==="element"&&inner.attributes.id==null&&g.attributes.filter==null&&(g.attributes.class==null||inner.attributes.class==null)&&(g.attributes["clip-path"]==null&&g.attributes.mask==null||inner.type==="element"&&inner.name==="g"&&g.attributes.transform==null&&inner.attributes.transform==null)){for(const[name,value]of Object.entries(g.attributes)){if(g.children.some((item=>hasAnimatedAttr(item,name))))return;if(inner.attributes[name]==null){inner.attributes[name]=value}else if(name=="transform"){inner.attributes[name]=value+" "+inner.attributes[name]}else if(inner.attributes[name]==="inherit"){inner.attributes[name]=value}else if(inheritableAttrs$3.includes(name)===false&&inner.attributes[name]!==value){return}delete g.attributes[name]}}}if(Object.keys(g.attributes).length===0&&!g.children.some((item=>item.isElem(elemsGroups$3.animation)))){item.spliceContent(i,1,g.children)}}}))}};var collapseGroups$1={type:type$G,active:active$G,description:description$H,fn:fn$G};var type$F="perItem";var active$F=true;var description$G="converts colors: rgb() to #rrggbb and #rrggbb to #rgb";var params$h={currentColor:false,names2hex:true,rgb2hex:true,shorthex:true,shortname:true};var rNumber="([+-]?(?:\\d*\\.\\d+|\\d+\\.?)%?)",rComma="\\s*,\\s*",regRGB=new RegExp("^rgb\\(\\s*"+rNumber+rComma+rNumber+rComma+rNumber+"\\s*\\)$"),regHEX=/^#(([a-fA-F0-9])\2){3}$/,none=/\bnone\b/i;var fn$F=function(item,params){if(item.type==="element"){for(const[name,value]of Object.entries(item.attributes)){if(_collections.colorsProps.includes(name)){let val=value;let match;if(params.currentColor){if(typeof params.currentColor==="string"){match=val===params.currentColor}else if(params.currentColor.exec){match=params.currentColor.exec(val)}else{match=!val.match(none)}if(match){val="currentColor"}}if(params.names2hex&&val.toLowerCase()in _collections.colorsNames){val=_collections.colorsNames[val.toLowerCase()]}if(params.rgb2hex&&(match=val.match(regRGB))){match=match.slice(1,4).map((function(m){if(m.indexOf("%")>-1)m=Math.round(parseFloat(m)*2.55);return Math.max(0,Math.min(m,255))}));val=rgb2hex(match)}if(params.shorthex&&(match=val.match(regHEX))){val="#"+match[0][1]+match[0][3]+match[0][5]}if(params.shortname){var lowerVal=val.toLowerCase();if(lowerVal in _collections.colorsShortNames){val=_collections.colorsShortNames[lowerVal]}}item.attributes[name]=val}}}};function rgb2hex(rgb){return"#"+("00000"+(rgb[0]<<16|rgb[1]<<8|rgb[2]).toString(16)).slice(-6).toUpperCase()}var convertColors$1={type:type$F,active:active$F,description:description$G,params:params$h,fn:fn$F};var type$E="perItem";var active$E=true;var description$F="converts non-eccentric <ellipse>s to <circle>s";var fn$E=function(item){if(item.isElem("ellipse")){const rx=item.attributes.rx||0;const ry=item.attributes.ry||0;if(rx===ry||rx==="auto"||ry==="auto"){var radius=rx!=="auto"?rx:ry;item.renameElem("circle");delete item.attributes.rx;delete item.attributes.ry;item.attributes.r=radius}}};var convertEllipseToCircle$1={type:type$E,active:active$E,description:description$F,fn:fn$E};var stable=createCommonjsModule((function(module,exports){(function(global,factory){module.exports=factory()})(commonjsGlobal,(function(){var stable=function(arr,comp){return exec(arr.slice(),comp)};stable.inplace=function(arr,comp){var result=exec(arr,comp);if(result!==arr){pass(result,null,arr.length,arr)}return arr};function exec(arr,comp){if(typeof comp!=="function"){comp=function(a,b){return String(a).localeCompare(b)}}var len=arr.length;if(len<=1){return arr}var buffer=new Array(len);for(var chk=1;chk<len;chk*=2){pass(arr,comp,chk,buffer);var tmp=arr;arr=buffer;buffer=tmp}return arr}var pass=function(arr,comp,chk,result){var len=arr.length;var i=0;var dbl=chk*2;var l,r,e;var li,ri;for(l=0;l<len;l+=dbl){r=l+chk;e=r+chk;if(r>len)r=len;if(e>len)e=len;li=l;ri=r;while(true){if(li<r&&ri<e){if(comp(arr[li],arr[ri])<=0){result[i++]=arr[li++]}else{result[i++]=arr[ri++]}}else if(li<r){result[i++]=arr[li++]}else if(ri<e){result[i++]=arr[ri++]}else{break}}}};return stable}))}));var csstree_min=createCommonjsModule((function(module,exports){!function(e,t){module.exports=t()}(commonjsGlobal,(function(){function e(e){return{prev:null,next:null,data:e}}function t(e,t,n){var i;return null!==r?(i=r,r=r.cursor,i.prev=t,i.next=n,i.cursor=e.cursor):i={prev:t,next:n,cursor:e.cursor},e.cursor=i,i}function n(e){var t=e.cursor;e.cursor=t.cursor,t.prev=null,t.next=null,t.cursor=r,r=t}var r=null,i=function(){this.cursor=null,this.head=null,this.tail=null};i.createItem=e,i.prototype.createItem=e,i.prototype.updateCursors=function(e,t,n,r){for(var i=this.cursor;null!==i;)i.prev===e&&(i.prev=t),i.next===n&&(i.next=r),i=i.cursor},i.prototype.getSize=function(){for(var e=0,t=this.head;t;)e++,t=t.next;return e},i.prototype.fromArray=function(t){var n=null;this.head=null;for(var r=0;r<t.length;r++){var i=e(t[r]);null!==n?n.next=i:this.head=i,i.prev=n,n=i}return this.tail=n,this},i.prototype.toArray=function(){for(var e=this.head,t=[];e;)t.push(e.data),e=e.next;return t},i.prototype.toJSON=i.prototype.toArray,i.prototype.isEmpty=function(){return null===this.head},i.prototype.first=function(){return this.head&&this.head.data},i.prototype.last=function(){return this.tail&&this.tail.data},i.prototype.each=function(e,r){var i;void 0===r&&(r=this);for(var a=t(this,null,this.head);null!==a.next;)i=a.next,a.next=i.next,e.call(r,i.data,i,this);n(this)},i.prototype.forEach=i.prototype.each,i.prototype.eachRight=function(e,r){var i;void 0===r&&(r=this);for(var a=t(this,this.tail,null);null!==a.prev;)i=a.prev,a.prev=i.prev,e.call(r,i.data,i,this);n(this)},i.prototype.forEachRight=i.prototype.eachRight,i.prototype.reduce=function(e,r,i){var a;void 0===i&&(i=this);for(var o=t(this,null,this.head),s=r;null!==o.next;)a=o.next,o.next=a.next,s=e.call(i,s,a.data,a,this);return n(this),s},i.prototype.reduceRight=function(e,r,i){var a;void 0===i&&(i=this);for(var o=t(this,this.tail,null),s=r;null!==o.prev;)a=o.prev,o.prev=a.prev,s=e.call(i,s,a.data,a,this);return n(this),s},i.prototype.nextUntil=function(e,r,i){if(null!==e){var a;void 0===i&&(i=this);for(var o=t(this,null,e);null!==o.next&&(a=o.next,o.next=a.next,!r.call(i,a.data,a,this)););n(this)}},i.prototype.prevUntil=function(e,r,i){if(null!==e){var a;void 0===i&&(i=this);for(var o=t(this,e,null);null!==o.prev&&(a=o.prev,o.prev=a.prev,!r.call(i,a.data,a,this)););n(this)}},i.prototype.some=function(e,t){var n=this.head;for(void 0===t&&(t=this);null!==n;){if(e.call(t,n.data,n,this))return!0;n=n.next}return!1},i.prototype.map=function(e,t){var n=new i,r=this.head;for(void 0===t&&(t=this);null!==r;)n.appendData(e.call(t,r.data,r,this)),r=r.next;return n},i.prototype.filter=function(e,t){var n=new i,r=this.head;for(void 0===t&&(t=this);null!==r;)e.call(t,r.data,r,this)&&n.appendData(r.data),r=r.next;return n},i.prototype.clear=function(){this.head=null,this.tail=null},i.prototype.copy=function(){for(var t=new i,n=this.head;null!==n;)t.insert(e(n.data)),n=n.next;return t},i.prototype.prepend=function(e){return this.updateCursors(null,e,this.head,e),null!==this.head?(this.head.prev=e,e.next=this.head):this.tail=e,this.head=e,this},i.prototype.prependData=function(t){return this.prepend(e(t))},i.prototype.append=function(e){return this.insert(e)},i.prototype.appendData=function(t){return this.insert(e(t))},i.prototype.insert=function(e,t){if(null!=t)if(this.updateCursors(t.prev,e,t,e),null===t.prev){if(this.head!==t)throw new Error("before doesn't belong to list");this.head=e,t.prev=e,e.next=t,this.updateCursors(null,e)}else t.prev.next=e,e.prev=t.prev,t.prev=e,e.next=t;else this.updateCursors(this.tail,e,null,e),null!==this.tail?(this.tail.next=e,e.prev=this.tail):this.head=e,this.tail=e;return this},i.prototype.insertData=function(t,n){return this.insert(e(t),n)},i.prototype.remove=function(e){if(this.updateCursors(e,e.prev,e,e.next),null!==e.prev)e.prev.next=e.next;else{if(this.head!==e)throw new Error("item doesn't belong to list");this.head=e.next}if(null!==e.next)e.next.prev=e.prev;else{if(this.tail!==e)throw new Error("item doesn't belong to list");this.tail=e.prev}return e.prev=null,e.next=null,e},i.prototype.push=function(t){this.insert(e(t))},i.prototype.pop=function(){if(null!==this.tail)return this.remove(this.tail)},i.prototype.unshift=function(t){this.prepend(e(t))},i.prototype.shift=function(){if(null!==this.head)return this.remove(this.head)},i.prototype.prependList=function(e){return this.insertList(e,this.head)},i.prototype.appendList=function(e){return this.insertList(e)},i.prototype.insertList=function(e,t){return null===e.head||(null!=t?(this.updateCursors(t.prev,e.tail,t,e.head),null!==t.prev?(t.prev.next=e.head,e.head.prev=t.prev):this.head=e.head,t.prev=e.tail,e.tail.next=t):(this.updateCursors(this.tail,e.tail,null,e.head),null!==this.tail?(this.tail.next=e.head,e.head.prev=this.tail):this.head=e.head,this.tail=e.tail),e.head=null,e.tail=null),this},i.prototype.replace=function(e,t){"head"in t?this.insertList(t,e):this.insert(t,e),this.remove(e)};var a=i,o=function(e,t){var n=Object.create(SyntaxError.prototype),r=new Error;return n.name=e,n.message=t,Object.defineProperty(n,"stack",{get:function(){return(r.stack||"").replace(/^(.+\n){1,3}/,e+": "+t+"\n")}}),n};function s(e,t){function n(e,t){return r.slice(e,t).map((function(t,n){for(var r=String(e+n+1);r.length<l;)r=" "+r;return r+" |"+t})).join("\n")}var r=e.source.split(/\r\n?|\n|\f/),i=e.line,a=e.column,o=Math.max(1,i-t)-1,s=Math.min(i+t,r.length+1),l=Math.max(4,String(s).length)+1,c=0;(a+=("    ".length-1)*(r[i-1].substr(0,a-1).match(/\t/g)||[]).length)>100&&(c=a-60+3,a=58);for(var u=o;u<=s;u++)u>=0&&u<r.length&&(r[u]=r[u].replace(/\t/g,"    "),r[u]=(c>0&&r[u].length>c?"…":"")+r[u].substr(c,98)+(r[u].length>c+100-1?"…":""));return[n(o,i),new Array(a+l+2).join("-")+"^",n(i,s)].filter(Boolean).join("\n")}var l=function(e,t,n,r,i){var a=o("SyntaxError",e);return a.source=t,a.offset=n,a.line=r,a.column=i,a.sourceFragment=function(e){return s(a,isNaN(e)?0:e)},Object.defineProperty(a,"formattedMessage",{get:function(){return"Parse error: "+a.message+"\n"+s(a,2)}}),a.parseError={offset:n,line:r,column:i},a},c={EOF:0,Ident:1,Function:2,AtKeyword:3,Hash:4,String:5,BadString:6,Url:7,BadUrl:8,Delim:9,Number:10,Percentage:11,Dimension:12,WhiteSpace:13,CDO:14,CDC:15,Colon:16,Semicolon:17,Comma:18,LeftSquareBracket:19,RightSquareBracket:20,LeftParenthesis:21,RightParenthesis:22,LeftCurlyBracket:23,RightCurlyBracket:24,Comment:25},u=Object.keys(c).reduce((function(e,t){return e[c[t]]=t,e}),{}),h={TYPE:c,NAME:u};function p(e){return e>=48&&e<=57}function d(e){return e>=65&&e<=90}function m(e){return e>=97&&e<=122}function g(e){return d(e)||m(e)}function f(e){return e>=128}function b(e){return g(e)||f(e)||95===e}function y(e){return e>=0&&e<=8||11===e||e>=14&&e<=31||127===e}function k(e){return 10===e||13===e||12===e}function v(e){return k(e)||32===e||9===e}function x(e,t){return 92===e&&(!k(t)&&0!==t)}var w=new Array(128);C.Eof=128,C.WhiteSpace=130,C.Digit=131,C.NameStart=132,C.NonPrintable=133;for(var S=0;S<w.length;S++)switch(!0){case v(S):w[S]=C.WhiteSpace;break;case p(S):w[S]=C.Digit;break;case b(S):w[S]=C.NameStart;break;case y(S):w[S]=C.NonPrintable;break;default:w[S]=S||C.Eof}function C(e){return e<128?w[e]:C.NameStart}var z={isDigit:p,isHexDigit:function(e){return p(e)||e>=65&&e<=70||e>=97&&e<=102},isUppercaseLetter:d,isLowercaseLetter:m,isLetter:g,isNonAscii:f,isNameStart:b,isName:function(e){return b(e)||p(e)||45===e},isNonPrintable:y,isNewline:k,isWhiteSpace:v,isValidEscape:x,isIdentifierStart:function(e,t,n){return 45===e?b(t)||45===t||x(t,n):!!b(e)||92===e&&x(e,t)},isNumberStart:function(e,t,n){return 43===e||45===e?p(t)?2:46===t&&p(n)?3:0:46===e?p(t)?2:0:p(e)?1:0},isBOM:function(e){return 65279===e||65534===e?1:0},charCodeCategory:C},A=z.isDigit,P=z.isHexDigit,T=z.isUppercaseLetter,L=z.isName,E=z.isWhiteSpace,D=z.isValidEscape;function O(e,t){return t<e.length?e.charCodeAt(t):0}function B(e,t,n){return 13===n&&10===O(e,t+1)?2:1}function I(e,t,n){var r=e.charCodeAt(t);return T(r)&&(r|=32),r===n}function N(e,t){for(;t<e.length&&A(e.charCodeAt(t));t++);return t}function R(e,t){if(P(O(e,(t+=2)-1))){for(var n=Math.min(e.length,t+5);t<n&&P(O(e,t));t++);var r=O(e,t);E(r)&&(t+=B(e,t,r))}return t}var M={consumeEscaped:R,consumeName:function(e,t){for(;t<e.length;t++){var n=e.charCodeAt(t);if(!L(n)){if(!D(n,O(e,t+1)))break;t=R(e,t)-1}}return t},consumeNumber:function(e,t){var n=e.charCodeAt(t);if(43!==n&&45!==n||(n=e.charCodeAt(t+=1)),A(n)&&(t=N(e,t+1),n=e.charCodeAt(t)),46===n&&A(e.charCodeAt(t+1))&&(n=e.charCodeAt(t+=2),t=N(e,t)),I(e,t,101)){var r=0;45!==(n=e.charCodeAt(t+1))&&43!==n||(r=1,n=e.charCodeAt(t+2)),A(n)&&(t=N(e,t+1+r+1))}return t},consumeBadUrlRemnants:function(e,t){for(;t<e.length;t++){var n=e.charCodeAt(t);if(41===n){t++;break}D(n,O(e,t+1))&&(t=R(e,t))}return t},cmpChar:I,cmpStr:function(e,t,n,r){if(n-t!==r.length)return!1;if(t<0||n>e.length)return!1;for(var i=t;i<n;i++){var a=e.charCodeAt(i),o=r.charCodeAt(i-t);if(T(a)&&(a|=32),a!==o)return!1}return!0},getNewlineLength:B,findWhiteSpaceStart:function(e,t){for(;t>=0&&E(e.charCodeAt(t));t--);return t+1},findWhiteSpaceEnd:function(e,t){for(;t<e.length&&E(e.charCodeAt(t));t++);return t}},j=h.TYPE,_=h.NAME,F=M.cmpStr,W=j.EOF,q=j.WhiteSpace,Y=j.Comment,U=function(){this.offsetAndType=null,this.balance=null,this.reset()};U.prototype={reset:function(){this.eof=!1,this.tokenIndex=-1,this.tokenType=0,this.tokenStart=this.firstCharOffset,this.tokenEnd=this.firstCharOffset},lookupType:function(e){return(e+=this.tokenIndex)<this.tokenCount?this.offsetAndType[e]>>24:W},lookupOffset:function(e){return(e+=this.tokenIndex)<this.tokenCount?16777215&this.offsetAndType[e-1]:this.source.length},lookupValue:function(e,t){return(e+=this.tokenIndex)<this.tokenCount&&F(this.source,16777215&this.offsetAndType[e-1],16777215&this.offsetAndType[e],t)},getTokenStart:function(e){return e===this.tokenIndex?this.tokenStart:e>0?e<this.tokenCount?16777215&this.offsetAndType[e-1]:16777215&this.offsetAndType[this.tokenCount]:this.firstCharOffset},getRawLength:function(e,t){var n,r=e,i=16777215&this.offsetAndType[Math.max(r-1,0)];e:for(;r<this.tokenCount&&!((n=this.balance[r])<e);r++)switch(t(this.offsetAndType[r]>>24,this.source,i)){case 1:break e;case 2:r++;break e;default:i=16777215&this.offsetAndType[r],this.balance[n]===r&&(r=n)}return r-this.tokenIndex},isBalanceEdge:function(e){return this.balance[this.tokenIndex]<e},isDelim:function(e,t){return t?this.lookupType(t)===j.Delim&&this.source.charCodeAt(this.lookupOffset(t))===e:this.tokenType===j.Delim&&this.source.charCodeAt(this.tokenStart)===e},getTokenValue:function(){return this.source.substring(this.tokenStart,this.tokenEnd)},getTokenLength:function(){return this.tokenEnd-this.tokenStart},substrToCursor:function(e){return this.source.substring(e,this.tokenStart)},skipWS:function(){for(var e=this.tokenIndex,t=0;e<this.tokenCount&&this.offsetAndType[e]>>24===q;e++,t++);t>0&&this.skip(t)},skipSC:function(){for(;this.tokenType===q||this.tokenType===Y;)this.next()},skip:function(e){var t=this.tokenIndex+e;t<this.tokenCount?(this.tokenIndex=t,this.tokenStart=16777215&this.offsetAndType[t-1],t=this.offsetAndType[t],this.tokenType=t>>24,this.tokenEnd=16777215&t):(this.tokenIndex=this.tokenCount,this.next())},next:function(){var e=this.tokenIndex+1;e<this.tokenCount?(this.tokenIndex=e,this.tokenStart=this.tokenEnd,e=this.offsetAndType[e],this.tokenType=e>>24,this.tokenEnd=16777215&e):(this.tokenIndex=this.tokenCount,this.eof=!0,this.tokenType=W,this.tokenStart=this.tokenEnd=this.source.length)},forEachToken(e){for(var t=0,n=this.firstCharOffset;t<this.tokenCount;t++){var r=n,i=this.offsetAndType[t],a=16777215&i;n=a,e(i>>24,r,a,t)}},dump(){var e=new Array(this.tokenCount);return this.forEachToken(((t,n,r,i)=>{e[i]={idx:i,type:_[t],chunk:this.source.substring(n,r),balance:this.balance[i]}})),e}};var H=U;function V(e){return e}function K(e,t,n,r){var i,a;switch(e.type){case"Group":i=function(e,t,n,r){var i=" "===e.combinator||r?e.combinator:" "+e.combinator+" ",a=e.terms.map((function(e){return K(e,t,n,r)})).join(i);return(e.explicit||n)&&(a=(r||","===a[0]?"[":"[ ")+a+(r?"]":" ]")),a}(e,t,n,r)+(e.disallowEmpty?"!":"");break;case"Multiplier":return K(e.term,t,n,r)+t(0===(a=e).min&&0===a.max?"*":0===a.min&&1===a.max?"?":1===a.min&&0===a.max?a.comma?"#":"+":1===a.min&&1===a.max?"":(a.comma?"#":"")+(a.min===a.max?"{"+a.min+"}":"{"+a.min+","+(0!==a.max?a.max:"")+"}"),e);case"Type":i="<"+e.name+(e.opts?t(function(e){switch(e.type){case"Range":return" ["+(null===e.min?"-∞":e.min)+","+(null===e.max?"∞":e.max)+"]";default:throw new Error("Unknown node type `"+e.type+"`")}}(e.opts),e.opts):"")+">";break;case"Property":i="<'"+e.name+"'>";break;case"Keyword":i=e.name;break;case"AtKeyword":i="@"+e.name;break;case"Function":i=e.name+"(";break;case"String":case"Token":i=e.value;break;case"Comma":i=",";break;default:throw new Error("Unknown node type `"+e.type+"`")}return t(i,e)}var G=function(e,t){var n=V,r=!1,i=!1;return"function"==typeof t?n=t:t&&(r=Boolean(t.forceBraces),i=Boolean(t.compact),"function"==typeof t.decorate&&(n=t.decorate)),K(e,n,r,i)};const Q={offset:0,line:1,column:1};function X(e,t){const n=e&&e.loc&&e.loc[t];return n?"line"in n?Z(n):n:null}function Z({offset:e,line:t,column:n},r){const i={offset:e,line:t,column:n};if(r){const e=r.split(/\n|\r\n?|\f/);i.offset+=r.length,i.line+=e.length-1,i.column=1===e.length?i.column+r.length:e.pop().length+1}return i}var $=function(e,t){const n=o("SyntaxReferenceError",e+(t?" `"+t+"`":""));return n.reference=t,n},J=function(e,t,n,r){const i=o("SyntaxMatchError",e),{css:a,mismatchOffset:s,mismatchLength:l,start:c,end:u}=function(e,t){const n=e.tokens,r=e.longestMatch,i=r<n.length&&n[r].node||null,a=i!==t?i:null;let o,s,l=0,c=0,u=0,h="";for(let e=0;e<n.length;e++){const t=n[e].value;e===r&&(c=t.length,l=h.length),null!==a&&n[e].node===a&&(e<=r?u++:u=0),h+=t}return r===n.length||u>1?(o=X(a||t,"end")||Z(Q,h),s=Z(o)):(o=X(a,"start")||Z(X(t,"start")||Q,h.slice(0,l)),s=X(a,"end")||Z(o,h.substr(l,c))),{css:h,mismatchOffset:l,mismatchLength:c,start:o,end:s}}(r,n);return i.rawMessage=e,i.syntax=t?G(t):"<generic>",i.css=a,i.mismatchOffset=s,i.mismatchLength=l,i.message=e+"\n  syntax: "+i.syntax+"\n   value: "+(a||"<empty string>")+"\n  --------"+new Array(i.mismatchOffset+1).join("-")+"^",Object.assign(i,c),i.loc={source:n&&n.loc&&n.loc.source||"<unknown>",start:c,end:u},i},ee=Object.prototype.hasOwnProperty,te=Object.create(null),ne=Object.create(null);function re(e,t){return t=t||0,e.length-t>=2&&45===e.charCodeAt(t)&&45===e.charCodeAt(t+1)}function ie(e,t){if(t=t||0,e.length-t>=3&&45===e.charCodeAt(t)&&45!==e.charCodeAt(t+1)){var n=e.indexOf("-",t+2);if(-1!==n)return e.substring(t,n+1)}return""}var ae={keyword:function(e){if(ee.call(te,e))return te[e];var t=e.toLowerCase();if(ee.call(te,t))return te[e]=te[t];var n=re(t,0),r=n?"":ie(t,0);return te[e]=Object.freeze({basename:t.substr(r.length),name:t,vendor:r,prefix:r,custom:n})},property:function(e){if(ee.call(ne,e))return ne[e];var t=e,n=e[0];"/"===n?n="/"===e[1]?"//":"/":"_"!==n&&"*"!==n&&"$"!==n&&"#"!==n&&"+"!==n&&"&"!==n&&(n="");var r=re(t,n.length);if(!r&&(t=t.toLowerCase(),ee.call(ne,t)))return ne[e]=ne[t];var i=r?"":ie(t,n.length),a=t.substr(0,n.length+i.length);return ne[e]=Object.freeze({basename:t.substr(a.length),name:t.substr(n.length),hack:n,vendor:i,prefix:a,custom:r})},isCustomProperty:re,vendorPrefix:ie},oe="undefined"!=typeof Uint32Array?Uint32Array:Array,se=function(e,t){return null===e||e.length<t?new oe(Math.max(t+1024,16384)):e},le=h.TYPE,ce=z.isNewline,ue=z.isName,he=z.isValidEscape,pe=z.isNumberStart,de=z.isIdentifierStart,me=z.charCodeCategory,ge=z.isBOM,fe=M.cmpStr,be=M.getNewlineLength,ye=M.findWhiteSpaceEnd,ke=M.consumeEscaped,ve=M.consumeName,xe=M.consumeNumber,we=M.consumeBadUrlRemnants;function Se(e,t){function n(t){return t<o?e.charCodeAt(t):0}function r(){return h=xe(e,h),de(n(h),n(h+1),n(h+2))?(f=le.Dimension,void(h=ve(e,h))):37===n(h)?(f=le.Percentage,void h++):void(f=le.Number)}function i(){const t=h;return h=ve(e,h),fe(e,t,h,"url")&&40===n(h)?34===n(h=ye(e,h+1))||39===n(h)?(f=le.Function,void(h=t+4)):void function(){for(f=le.Url,h=ye(e,h);h<e.length;h++){var t=e.charCodeAt(h);switch(me(t)){case 41:return void h++;case me.Eof:return;case me.WhiteSpace:return 41===n(h=ye(e,h))||h>=e.length?void(h<e.length&&h++):(h=we(e,h),void(f=le.BadUrl));case 34:case 39:case 40:case me.NonPrintable:return h=we(e,h),void(f=le.BadUrl);case 92:if(he(t,n(h+1))){h=ke(e,h)-1;break}return h=we(e,h),void(f=le.BadUrl)}}}():40===n(h)?(f=le.Function,void h++):void(f=le.Ident)}function a(t){for(t||(t=n(h++)),f=le.String;h<e.length;h++){var r=e.charCodeAt(h);switch(me(r)){case t:return void h++;case me.Eof:return;case me.WhiteSpace:if(ce(r))return h+=be(e,h,r),void(f=le.BadString);break;case 92:if(h===e.length-1)break;var i=n(h+1);ce(i)?h+=be(e,h+1,i):he(r,i)&&(h=ke(e,h)-1)}}}t||(t=new H);for(var o=(e=String(e||"")).length,s=se(t.offsetAndType,o+1),l=se(t.balance,o+1),c=0,u=ge(n(0)),h=u,p=0,d=0,m=0;h<o;){var g=e.charCodeAt(h),f=0;switch(l[c]=o,me(g)){case me.WhiteSpace:f=le.WhiteSpace,h=ye(e,h+1);break;case 34:a();break;case 35:ue(n(h+1))||he(n(h+1),n(h+2))?(f=le.Hash,h=ve(e,h+1)):(f=le.Delim,h++);break;case 39:a();break;case 40:f=le.LeftParenthesis,h++;break;case 41:f=le.RightParenthesis,h++;break;case 43:pe(g,n(h+1),n(h+2))?r():(f=le.Delim,h++);break;case 44:f=le.Comma,h++;break;case 45:pe(g,n(h+1),n(h+2))?r():45===n(h+1)&&62===n(h+2)?(f=le.CDC,h+=3):de(g,n(h+1),n(h+2))?i():(f=le.Delim,h++);break;case 46:pe(g,n(h+1),n(h+2))?r():(f=le.Delim,h++);break;case 47:42===n(h+1)?(f=le.Comment,1===(h=e.indexOf("*/",h+2)+2)&&(h=e.length)):(f=le.Delim,h++);break;case 58:f=le.Colon,h++;break;case 59:f=le.Semicolon,h++;break;case 60:33===n(h+1)&&45===n(h+2)&&45===n(h+3)?(f=le.CDO,h+=4):(f=le.Delim,h++);break;case 64:de(n(h+1),n(h+2),n(h+3))?(f=le.AtKeyword,h=ve(e,h+1)):(f=le.Delim,h++);break;case 91:f=le.LeftSquareBracket,h++;break;case 92:he(g,n(h+1))?i():(f=le.Delim,h++);break;case 93:f=le.RightSquareBracket,h++;break;case 123:f=le.LeftCurlyBracket,h++;break;case 125:f=le.RightCurlyBracket,h++;break;case me.Digit:r();break;case me.NameStart:i();break;case me.Eof:break;default:f=le.Delim,h++}switch(f){case p:for(p=(d=l[m=16777215&d])>>24,l[c]=m,l[m++]=c;m<c;m++)l[m]===o&&(l[m]=c);break;case le.LeftParenthesis:case le.Function:l[c]=d,d=(p=le.RightParenthesis)<<24|c;break;case le.LeftSquareBracket:l[c]=d,d=(p=le.RightSquareBracket)<<24|c;break;case le.LeftCurlyBracket:l[c]=d,d=(p=le.RightCurlyBracket)<<24|c}s[c++]=f<<24|h}for(s[c]=le.EOF<<24|h,l[c]=o,l[o]=o;0!==d;)d=l[m=16777215&d],l[m]=o;return t.source=e,t.firstCharOffset=u,t.offsetAndType=s,t.tokenCount=c,t.balance=l,t.reset(),t.next(),t}Object.keys(h).forEach((function(e){Se[e]=h[e]})),Object.keys(z).forEach((function(e){Se[e]=z[e]})),Object.keys(M).forEach((function(e){Se[e]=M[e]}));var Ce=Se,ze=Ce.isDigit,Ae=Ce.cmpChar,Pe=Ce.TYPE,Te=Pe.Delim,Le=Pe.WhiteSpace,Ee=Pe.Comment,De=Pe.Ident,Oe=Pe.Number,Be=Pe.Dimension;function Ie(e,t){return null!==e&&e.type===Te&&e.value.charCodeAt(0)===t}function Ne(e,t,n){for(;null!==e&&(e.type===Le||e.type===Ee);)e=n(++t);return t}function Re(e,t,n,r){if(!e)return 0;var i=e.value.charCodeAt(t);if(43===i||45===i){if(n)return 0;t++}for(;t<e.value.length;t++)if(!ze(e.value.charCodeAt(t)))return 0;return r+1}function Me(e,t,n){var r=!1,i=Ne(e,t,n);if(null===(e=n(i)))return t;if(e.type!==Oe){if(!Ie(e,43)&&!Ie(e,45))return t;if(r=!0,i=Ne(n(++i),i,n),null===(e=n(i))&&e.type!==Oe)return 0}if(!r){var a=e.value.charCodeAt(0);if(43!==a&&45!==a)return 0}return Re(e,r?0:1,r,i)}var je=Ce.isHexDigit,_e=Ce.cmpChar,Fe=Ce.TYPE,We=Fe.Ident,qe=Fe.Delim,Ye=Fe.Number,Ue=Fe.Dimension;function He(e,t){return null!==e&&e.type===qe&&e.value.charCodeAt(0)===t}function Ve(e,t){return e.value.charCodeAt(0)===t}function Ke(e,t,n){for(var r=t,i=0;r<e.value.length;r++){var a=e.value.charCodeAt(r);if(45===a&&n&&0!==i)return Ke(e,t+i+1,!1)>0?6:0;if(!je(a))return 0;if(++i>6)return 0}return i}function Ge(e,t,n){if(!e)return 0;for(;He(n(t),63);){if(++e>6)return 0;t++}return t}var Qe=Ce.isIdentifierStart,Xe=Ce.isHexDigit,Ze=Ce.isDigit,$e=Ce.cmpStr,Je=Ce.consumeNumber,et=Ce.TYPE,tt=["unset","initial","inherit"],nt=["calc(","-moz-calc(","-webkit-calc("];function rt(e,t){return t<e.length?e.charCodeAt(t):0}function it(e,t){return $e(e,0,e.length,t)}function at(e,t){for(var n=0;n<t.length;n++)if(it(e,t[n]))return!0;return!1}function ot(e,t){return t===e.length-2&&(92===e.charCodeAt(t)&&Ze(e.charCodeAt(t+1)))}function st(e,t,n){if(e&&"Range"===e.type){var r=Number(void 0!==n&&n!==t.length?t.substr(0,n):t);if(isNaN(r))return!0;if(null!==e.min&&r<e.min)return!0;if(null!==e.max&&r>e.max)return!0}return!1}function lt(e,t){var n=e.index,r=0;do{if(r++,e.balance<=n)break}while(e=t(r));return r}function ct(e){return function(t,n,r){return null===t?0:t.type===et.Function&&at(t.value,nt)?lt(t,n):e(t,n,r)}}function ut(e){return function(t){return null===t||t.type!==e?0:1}}function ht(e){return function(t,n,r){if(null===t||t.type!==et.Dimension)return 0;var i=Je(t.value,0);if(null!==e){var a=t.value.indexOf("\\",i),o=-1!==a&&ot(t.value,a)?t.value.substring(i,a):t.value.substr(i);if(!1===e.hasOwnProperty(o.toLowerCase()))return 0}return st(r,t.value,i)?0:1}}function pt(e){return"function"!=typeof e&&(e=function(){return 0}),function(t,n,r){return null!==t&&t.type===et.Number&&0===Number(t.value)?1:e(t,n,r)}}var dt,mt={"ident-token":ut(et.Ident),"function-token":ut(et.Function),"at-keyword-token":ut(et.AtKeyword),"hash-token":ut(et.Hash),"string-token":ut(et.String),"bad-string-token":ut(et.BadString),"url-token":ut(et.Url),"bad-url-token":ut(et.BadUrl),"delim-token":ut(et.Delim),"number-token":ut(et.Number),"percentage-token":ut(et.Percentage),"dimension-token":ut(et.Dimension),"whitespace-token":ut(et.WhiteSpace),"CDO-token":ut(et.CDO),"CDC-token":ut(et.CDC),"colon-token":ut(et.Colon),"semicolon-token":ut(et.Semicolon),"comma-token":ut(et.Comma),"[-token":ut(et.LeftSquareBracket),"]-token":ut(et.RightSquareBracket),"(-token":ut(et.LeftParenthesis),")-token":ut(et.RightParenthesis),"{-token":ut(et.LeftCurlyBracket),"}-token":ut(et.RightCurlyBracket),string:ut(et.String),ident:ut(et.Ident),"custom-ident":function(e){if(null===e||e.type!==et.Ident)return 0;var t=e.value.toLowerCase();return at(t,tt)||it(t,"default")?0:1},"custom-property-name":function(e){return null===e||e.type!==et.Ident||45!==rt(e.value,0)||45!==rt(e.value,1)?0:1},"hex-color":function(e){if(null===e||e.type!==et.Hash)return 0;var t=e.value.length;if(4!==t&&5!==t&&7!==t&&9!==t)return 0;for(var n=1;n<t;n++)if(!Xe(e.value.charCodeAt(n)))return 0;return 1},"id-selector":function(e){return null===e||e.type!==et.Hash?0:Qe(rt(e.value,1),rt(e.value,2),rt(e.value,3))?1:0},"an-plus-b":function(e,t){var n=0;if(!e)return 0;if(e.type===Oe)return Re(e,0,!1,n);if(e.type===De&&45===e.value.charCodeAt(0)){if(!Ae(e.value,1,110))return 0;switch(e.value.length){case 2:return Me(t(++n),n,t);case 3:return 45!==e.value.charCodeAt(2)?0:(n=Ne(t(++n),n,t),Re(e=t(n),0,!0,n));default:return 45!==e.value.charCodeAt(2)?0:Re(e,3,!0,n)}}else if(e.type===De||Ie(e,43)&&t(n+1).type===De){if(e.type!==De&&(e=t(++n)),null===e||!Ae(e.value,0,110))return 0;switch(e.value.length){case 1:return Me(t(++n),n,t);case 2:return 45!==e.value.charCodeAt(1)?0:(n=Ne(t(++n),n,t),Re(e=t(n),0,!0,n));default:return 45!==e.value.charCodeAt(1)?0:Re(e,2,!0,n)}}else if(e.type===Be){for(var r=e.value.charCodeAt(0),i=43===r||45===r?1:0,a=i;a<e.value.length&&ze(e.value.charCodeAt(a));a++);return a===i?0:Ae(e.value,a,110)?a+1===e.value.length?Me(t(++n),n,t):45!==e.value.charCodeAt(a+1)?0:a+2===e.value.length?(n=Ne(t(++n),n,t),Re(e=t(n),0,!0,n)):Re(e,a+2,!0,n):0}return 0},urange:function(e,t){var n=0;if(null===e||e.type!==We||!_e(e.value,0,117))return 0;if(null===(e=t(++n)))return 0;if(He(e,43))return null===(e=t(++n))?0:e.type===We?Ge(Ke(e,0,!0),++n,t):He(e,63)?Ge(1,++n,t):0;if(e.type===Ye){if(!Ve(e,43))return 0;var r=Ke(e,1,!0);return 0===r?0:null===(e=t(++n))?n:e.type===Ue||e.type===Ye?Ve(e,45)&&Ke(e,1,!1)?n+1:0:Ge(r,n,t)}return e.type===Ue&&Ve(e,43)?Ge(Ke(e,1,!0),++n,t):0},"declaration-value":function(e,t){if(!e)return 0;var n=0,r=0,i=e.index;e:do{switch(e.type){case et.BadString:case et.BadUrl:break e;case et.RightCurlyBracket:case et.RightParenthesis:case et.RightSquareBracket:if(e.balance>e.index||e.balance<i)break e;r--;break;case et.Semicolon:if(0===r)break e;break;case et.Delim:if("!"===e.value&&0===r)break e;break;case et.Function:case et.LeftParenthesis:case et.LeftSquareBracket:case et.LeftCurlyBracket:r++}if(n++,e.balance<=i)break}while(e=t(n));return n},"any-value":function(e,t){if(!e)return 0;var n=e.index,r=0;e:do{switch(e.type){case et.BadString:case et.BadUrl:break e;case et.RightCurlyBracket:case et.RightParenthesis:case et.RightSquareBracket:if(e.balance>e.index||e.balance<n)break e}if(r++,e.balance<=n)break}while(e=t(r));return r},dimension:ct(ht(null)),angle:ct(ht({deg:!0,grad:!0,rad:!0,turn:!0})),decibel:ct(ht({db:!0})),frequency:ct(ht({hz:!0,khz:!0})),flex:ct(ht({fr:!0})),length:ct(pt(ht({px:!0,mm:!0,cm:!0,in:!0,pt:!0,pc:!0,q:!0,em:!0,ex:!0,ch:!0,rem:!0,vh:!0,vw:!0,vmin:!0,vmax:!0,vm:!0}))),resolution:ct(ht({dpi:!0,dpcm:!0,dppx:!0,x:!0})),semitones:ct(ht({st:!0})),time:ct(ht({s:!0,ms:!0})),percentage:ct((function(e,t,n){return null===e||e.type!==et.Percentage||st(n,e.value,e.value.length-1)?0:1})),zero:pt(),number:ct((function(e,t,n){if(null===e)return 0;var r=Je(e.value,0);return r===e.value.length||ot(e.value,r)?st(n,e.value,r)?0:1:0})),integer:ct((function(e,t,n){if(null===e||e.type!==et.Number)return 0;for(var r=43===e.value.charCodeAt(0)||45===e.value.charCodeAt(0)?1:0;r<e.value.length;r++)if(!Ze(e.value.charCodeAt(r)))return 0;return st(n,e.value,r)?0:1})),"-ms-legacy-expression":(dt="expression",dt+="(",function(e,t){return null!==e&&it(e.value,dt)?lt(e,t):0})},gt=function(e,t,n){var r=o("SyntaxError",e);return r.input=t,r.offset=n,r.rawMessage=e,r.message=r.rawMessage+"\n  "+r.input+"\n--"+new Array((r.offset||r.input.length)+1).join("-")+"^",r},ft=function(e){this.str=e,this.pos=0};ft.prototype={charCodeAt:function(e){return e<this.str.length?this.str.charCodeAt(e):0},charCode:function(){return this.charCodeAt(this.pos)},nextCharCode:function(){return this.charCodeAt(this.pos+1)},nextNonWsCode:function(e){return this.charCodeAt(this.findWsEnd(e))},findWsEnd:function(e){for(;e<this.str.length;e++){var t=this.str.charCodeAt(e);if(13!==t&&10!==t&&12!==t&&32!==t&&9!==t)break}return e},substringToPos:function(e){return this.str.substring(this.pos,this.pos=e)},eat:function(e){this.charCode()!==e&&this.error("Expect `"+String.fromCharCode(e)+"`"),this.pos++},peek:function(){return this.pos<this.str.length?this.str.charAt(this.pos++):""},error:function(e){throw new gt(e,this.str,this.pos)}};var bt=ft,yt=function(e){for(var t="function"==typeof Uint32Array?new Uint32Array(128):new Array(128),n=0;n<128;n++)t[n]=e(String.fromCharCode(n))?1:0;return t}((function(e){return/[a-zA-Z0-9\-]/.test(e)})),kt={" ":1,"&&":2,"||":3,"|":4};function vt(e){return e.substringToPos(e.findWsEnd(e.pos))}function xt(e){for(var t=e.pos;t<e.str.length;t++){var n=e.str.charCodeAt(t);if(n>=128||0===yt[n])break}return e.pos===t&&e.error("Expect a keyword"),e.substringToPos(t)}function wt(e){for(var t=e.pos;t<e.str.length;t++){var n=e.str.charCodeAt(t);if(n<48||n>57)break}return e.pos===t&&e.error("Expect a number"),e.substringToPos(t)}function St(e){var t=e.str.indexOf("'",e.pos+1);return-1===t&&(e.pos=e.str.length,e.error("Expect an apostrophe")),e.substringToPos(t+1)}function Ct(e){var t,n=null;return e.eat(123),t=wt(e),44===e.charCode()?(e.pos++,125!==e.charCode()&&(n=wt(e))):n=t,e.eat(125),{min:Number(t),max:n?Number(n):0}}function zt(e,t){var n=function(e){var t=null,n=!1;switch(e.charCode()){case 42:e.pos++,t={min:0,max:0};break;case 43:e.pos++,t={min:1,max:0};break;case 63:e.pos++,t={min:0,max:1};break;case 35:e.pos++,n=!0,t=123===e.charCode()?Ct(e):{min:1,max:0};break;case 123:t=Ct(e);break;default:return null}return{type:"Multiplier",comma:n,min:t.min,max:t.max,term:null}}(e);return null!==n?(n.term=t,n):t}function At(e){var t=e.peek();return""===t?null:{type:"Token",value:t}}function Pt(e){var t,n=null;return e.eat(60),t=xt(e),40===e.charCode()&&41===e.nextCharCode()&&(e.pos+=2,t+="()"),91===e.charCodeAt(e.findWsEnd(e.pos))&&(vt(e),n=function(e){var t=null,n=null,r=1;return e.eat(91),45===e.charCode()&&(e.peek(),r=-1),-1==r&&8734===e.charCode()?e.peek():t=r*Number(wt(e)),vt(e),e.eat(44),vt(e),8734===e.charCode()?e.peek():(r=1,45===e.charCode()&&(e.peek(),r=-1),n=r*Number(wt(e))),e.eat(93),null===t&&null===n?null:{type:"Range",min:t,max:n}}(e)),e.eat(62),zt(e,{type:"Type",name:t,opts:n})}function Tt(e,t){function n(e,t){return{type:"Group",terms:e,combinator:t,disallowEmpty:!1,explicit:!1}}for(t=Object.keys(t).sort((function(e,t){return kt[e]-kt[t]}));t.length>0;){for(var r=t.shift(),i=0,a=0;i<e.length;i++){var o=e[i];"Combinator"===o.type&&(o.value===r?(-1===a&&(a=i-1),e.splice(i,1),i--):(-1!==a&&i-a>1&&(e.splice(a,i-a,n(e.slice(a,i),r)),i=a+1),a=-1))}-1!==a&&t.length&&e.splice(a,i-a,n(e.slice(a,i),r))}return r}function Lt(e){for(var t,n=[],r={},i=null,a=e.pos;t=Et(e);)"Spaces"!==t.type&&("Combinator"===t.type?(null!==i&&"Combinator"!==i.type||(e.pos=a,e.error("Unexpected combinator")),r[t.value]=!0):null!==i&&"Combinator"!==i.type&&(r[" "]=!0,n.push({type:"Combinator",value:" "})),n.push(t),i=t,a=e.pos);return null!==i&&"Combinator"===i.type&&(e.pos-=a,e.error("Unexpected combinator")),{type:"Group",terms:n,combinator:Tt(n,r)||" ",disallowEmpty:!1,explicit:!1}}function Et(e){var t=e.charCode();if(t<128&&1===yt[t])return function(e){var t;return t=xt(e),40===e.charCode()?(e.pos++,{type:"Function",name:t}):zt(e,{type:"Keyword",name:t})}(e);switch(t){case 93:break;case 91:return zt(e,function(e){var t;return e.eat(91),t=Lt(e),e.eat(93),t.explicit=!0,33===e.charCode()&&(e.pos++,t.disallowEmpty=!0),t}(e));case 60:return 39===e.nextCharCode()?function(e){var t;return e.eat(60),e.eat(39),t=xt(e),e.eat(39),e.eat(62),zt(e,{type:"Property",name:t})}(e):Pt(e);case 124:return{type:"Combinator",value:e.substringToPos(124===e.nextCharCode()?e.pos+2:e.pos+1)};case 38:return e.pos++,e.eat(38),{type:"Combinator",value:"&&"};case 44:return e.pos++,{type:"Comma"};case 39:return zt(e,{type:"String",value:St(e)});case 32:case 9:case 10:case 13:case 12:return{type:"Spaces",value:vt(e)};case 64:return(t=e.nextCharCode())<128&&1===yt[t]?(e.pos++,{type:"AtKeyword",name:xt(e)}):At(e);case 42:case 43:case 63:case 35:case 33:break;case 123:if((t=e.nextCharCode())<48||t>57)return At(e);break;default:return At(e)}}function Dt(e){var t=new bt(e),n=Lt(t);return t.pos!==e.length&&t.error("Unexpected input"),1===n.terms.length&&"Group"===n.terms[0].type&&(n=n.terms[0]),n}Dt("[a&&<b>#|<'c'>*||e() f{2} /,(% g#{1,2} h{2,})]!");var Ot=Dt,Bt=function(){};function It(e){return"function"==typeof e?e:Bt}var Nt=function(e,t,n){var r=Bt,i=Bt;if("function"==typeof t?r=t:t&&(r=It(t.enter),i=It(t.leave)),r===Bt&&i===Bt)throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function");!function e(t){switch(r.call(n,t),t.type){case"Group":t.terms.forEach(e);break;case"Multiplier":e(t.term);break;case"Type":case"Property":case"Keyword":case"AtKeyword":case"Function":case"String":case"Token":case"Comma":break;default:throw new Error("Unknown type: "+t.type)}i.call(n,t)}(e)},Rt=new H,Mt={decorator:function(e){var t=null,n={len:0,node:null},r=[n],i="";return{children:e.children,node:function(n){var r=t;t=n,e.node.call(this,n),t=r},chunk:function(e){i+=e,n.node!==t?r.push({len:e.length,node:t}):n.len+=e.length},result:function(){return jt(i,r)}}}};function jt(e,t){var n=[],r=0,i=0,a=t?t[i].node:null;for(Ce(e,Rt);!Rt.eof;){if(t)for(;i<t.length&&r+t[i].len<=Rt.tokenStart;)r+=t[i++].len,a=t[i].node;n.push({type:Rt.tokenType,value:Rt.getTokenValue(),index:Rt.tokenIndex,balance:Rt.balance[Rt.tokenIndex],node:a}),Rt.next()}return n}var _t={type:"Match"},Ft={type:"Mismatch"},Wt={type:"DisallowEmpty"};function qt(e,t,n){return t===_t&&n===Ft||e===_t&&t===_t&&n===_t?e:("If"===e.type&&e.else===Ft&&t===_t&&(t=e.then,e=e.match),{type:"If",match:e,then:t,else:n})}function Yt(e){return e.length>2&&40===e.charCodeAt(e.length-2)&&41===e.charCodeAt(e.length-1)}function Ut(e){return"Keyword"===e.type||"AtKeyword"===e.type||"Function"===e.type||"Type"===e.type&&Yt(e.name)}function Ht(e){if("function"==typeof e)return{type:"Generic",fn:e};switch(e.type){case"Group":var t=function e(t,n,r){switch(t){case" ":for(var i=_t,a=n.length-1;a>=0;a--){i=qt(l=n[a],i,Ft)}return i;case"|":i=Ft;var o=null;for(a=n.length-1;a>=0;a--){if(Ut(l=n[a])&&(null===o&&a>0&&Ut(n[a-1])&&(i=qt({type:"Enum",map:o=Object.create(null)},_t,i)),null!==o)){var s=(Yt(l.name)?l.name.slice(0,-1):l.name).toLowerCase();if(s in o==!1){o[s]=l;continue}}o=null,i=qt(l,_t,i)}return i;case"&&":if(n.length>5)return{type:"MatchOnce",terms:n,all:!0};for(i=Ft,a=n.length-1;a>=0;a--){var l=n[a];c=n.length>1?e(t,n.filter((function(e){return e!==l})),!1):_t,i=qt(l,c,i)}return i;case"||":if(n.length>5)return{type:"MatchOnce",terms:n,all:!1};for(i=r?_t:Ft,a=n.length-1;a>=0;a--){var c;l=n[a];c=n.length>1?e(t,n.filter((function(e){return e!==l})),!0):_t,i=qt(l,c,i)}return i}}(e.combinator,e.terms.map(Ht),!1);return e.disallowEmpty&&(t=qt(t,Wt,Ft)),t;case"Multiplier":return function(e){var t=_t,n=Ht(e.term);if(0===e.max)n=qt(n,Wt,Ft),(t=qt(n,null,Ft)).then=qt(_t,_t,t),e.comma&&(t.then.else=qt({type:"Comma",syntax:e},t,Ft));else for(var r=e.min||1;r<=e.max;r++)e.comma&&t!==_t&&(t=qt({type:"Comma",syntax:e},t,Ft)),t=qt(n,qt(_t,_t,t),Ft);if(0===e.min)t=qt(_t,_t,t);else for(r=0;r<e.min-1;r++)e.comma&&t!==_t&&(t=qt({type:"Comma",syntax:e},t,Ft)),t=qt(n,t,Ft);return t}(e);case"Type":case"Property":return{type:e.type,name:e.name,syntax:e};case"Keyword":return{type:e.type,name:e.name.toLowerCase(),syntax:e};case"AtKeyword":return{type:e.type,name:"@"+e.name.toLowerCase(),syntax:e};case"Function":return{type:e.type,name:e.name.toLowerCase()+"(",syntax:e};case"String":return 3===e.value.length?{type:"Token",value:e.value.charAt(1),syntax:e}:{type:e.type,value:e.value.substr(1,e.value.length-2).replace(/\\'/g,"'"),syntax:e};case"Token":return{type:e.type,value:e.value,syntax:e};case"Comma":return{type:e.type,syntax:e};default:throw new Error("Unknown node type:",e.type)}}var Vt=_t,Kt=Ft,Gt=Wt,Qt=function(e,t){return"string"==typeof e&&(e=Ot(e)),{type:"MatchGraph",match:Ht(e),syntax:t||null,source:e}},Xt=Object.prototype.hasOwnProperty,Zt=Vt,$t=Kt,Jt=Gt,en=h.TYPE;function tn(e){for(var t=null,n=null,r=e;null!==r;)n=r.prev,r.prev=t,t=r,r=n;return t}function nn(e,t){if(e.length!==t.length)return!1;for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r>=65&&r<=90&&(r|=32),r!==t.charCodeAt(n))return!1}return!0}function rn(e){return null===e||(e.type===en.Comma||e.type===en.Function||e.type===en.LeftParenthesis||e.type===en.LeftSquareBracket||e.type===en.LeftCurlyBracket||function(e){return e.type===en.Delim&&"?"!==e.value}(e))}function an(e){return null===e||(e.type===en.RightParenthesis||e.type===en.RightSquareBracket||e.type===en.RightCurlyBracket||e.type===en.Delim)}function on(e,t,n){function r(){do{b++,f=b<e.length?e[b]:null}while(null!==f&&(f.type===en.WhiteSpace||f.type===en.Comment))}function i(t){var n=b+t;return n<e.length?e[n]:null}function a(e,t){return{nextState:e,matchStack:k,syntaxStack:u,thenStack:h,tokenIndex:b,prev:t}}function o(e){h={nextState:e,matchStack:k,syntaxStack:u,prev:h}}function s(e){p=a(e,p)}function l(){k={type:1,syntax:t.syntax,token:f,prev:k},r(),d=null,b>y&&(y=b)}function c(){k=2===k.type?k.prev:{type:3,syntax:u.syntax,token:k.token,prev:k},u=u.prev}var u=null,h=null,p=null,d=null,m=0,g=null,f=null,b=-1,y=0,k={type:0,syntax:null,token:null,prev:null};for(r();null===g&&++m<15e3;)switch(t.type){case"Match":if(null===h){if(null!==f&&(b!==e.length-1||"\\0"!==f.value&&"\\9"!==f.value)){t=$t;break}g="Match";break}if((t=h.nextState)===Jt){if(h.matchStack===k){t=$t;break}t=Zt}for(;h.syntaxStack!==u;)c();h=h.prev;break;case"Mismatch":if(null!==d&&!1!==d)(null===p||b>p.tokenIndex)&&(p=d,d=!1);else if(null===p){g="Mismatch";break}t=p.nextState,h=p.thenStack,u=p.syntaxStack,k=p.matchStack,b=p.tokenIndex,f=b<e.length?e[b]:null,p=p.prev;break;case"MatchGraph":t=t.match;break;case"If":t.else!==$t&&s(t.else),t.then!==Zt&&o(t.then),t=t.match;break;case"MatchOnce":t={type:"MatchOnceBuffer",syntax:t,index:0,mask:0};break;case"MatchOnceBuffer":var v=t.syntax.terms;if(t.index===v.length){if(0===t.mask||t.syntax.all){t=$t;break}t=Zt;break}if(t.mask===(1<<v.length)-1){t=Zt;break}for(;t.index<v.length;t.index++){var x=1<<t.index;if(0==(t.mask&x)){s(t),o({type:"AddMatchOnce",syntax:t.syntax,mask:t.mask|x}),t=v[t.index++];break}}break;case"AddMatchOnce":t={type:"MatchOnceBuffer",syntax:t.syntax,index:0,mask:t.mask};break;case"Enum":if(null!==f)if(-1!==(A=f.value.toLowerCase()).indexOf("\\")&&(A=A.replace(/\\[09].*$/,"")),Xt.call(t.map,A)){t=t.map[A];break}t=$t;break;case"Generic":var w=null!==u?u.opts:null,S=b+Math.floor(t.fn(f,i,w));if(!isNaN(S)&&S>b){for(;b<S;)l();t=Zt}else t=$t;break;case"Type":case"Property":var C="Type"===t.type?"types":"properties",z=Xt.call(n,C)?n[C][t.name]:null;if(!z||!z.match)throw new Error("Bad syntax reference: "+("Type"===t.type?"<"+t.name+">":"<'"+t.name+"'>"));if(!1!==d&&null!==f&&"Type"===t.type)if("custom-ident"===t.name&&f.type===en.Ident||"length"===t.name&&"0"===f.value){null===d&&(d=a(t,p)),t=$t;break}u={syntax:t.syntax,opts:t.syntax.opts||null!==u&&u.opts||null,prev:u},k={type:2,syntax:t.syntax,token:k.token,prev:k},t=z.match;break;case"Keyword":var A=t.name;if(null!==f){var P=f.value;if(-1!==P.indexOf("\\")&&(P=P.replace(/\\[09].*$/,"")),nn(P,A)){l(),t=Zt;break}}t=$t;break;case"AtKeyword":case"Function":if(null!==f&&nn(f.value,t.name)){l(),t=Zt;break}t=$t;break;case"Token":if(null!==f&&f.value===t.value){l(),t=Zt;break}t=$t;break;case"Comma":null!==f&&f.type===en.Comma?rn(k.token)?t=$t:(l(),t=an(f)?$t:Zt):t=rn(k.token)||an(f)?Zt:$t;break;case"String":var T="";for(S=b;S<e.length&&T.length<t.value.length;S++)T+=e[S].value;if(nn(T,t.value)){for(;b<S;)l();t=Zt}else t=$t;break;default:throw new Error("Unknown node type: "+t.type)}switch(g){case null:console.warn("[csstree-match] BREAK after 15000 iterations"),g="Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)",k=null;break;case"Match":for(;null!==u;)c();break;default:k=null}return{tokens:e,reason:g,iterations:m,match:k,longestMatch:y}}var sn=function(e,t,n){var r=on(e,t,n||{});if(null===r.match)return r;var i=r.match,a=r.match={syntax:t.syntax||null,match:[]},o=[a];for(i=tn(i).prev;null!==i;){switch(i.type){case 2:a.match.push(a={syntax:i.syntax,match:[]}),o.push(a);break;case 3:o.pop(),a=o[o.length-1];break;default:a.match.push({syntax:i.syntax||null,token:i.token.value,node:i.token.node})}i=i.prev}return r};function ln(e){function t(e){return null!==e&&("Type"===e.type||"Property"===e.type||"Keyword"===e.type)}var n=null;return null!==this.matched&&function r(i){if(Array.isArray(i.match)){for(var a=0;a<i.match.length;a++)if(r(i.match[a]))return t(i.syntax)&&n.unshift(i.syntax),!0}else if(i.node===e)return n=t(i.syntax)?[i.syntax]:[],!0;return!1}(this.matched),n}function cn(e,t,n){var r=ln.call(e,t);return null!==r&&r.some(n)}var un={getTrace:ln,isType:function(e,t){return cn(this,e,(function(e){return"Type"===e.type&&e.name===t}))},isProperty:function(e,t){return cn(this,e,(function(e){return"Property"===e.type&&e.name===t}))},isKeyword:function(e){return cn(this,e,(function(e){return"Keyword"===e.type}))}};var hn={matchFragments:function(e,t,n,r,i){var o=[];return null!==n.matched&&function n(s){if(null!==s.syntax&&s.syntax.type===r&&s.syntax.name===i){var l=function e(t){return"node"in t?t.node:e(t.match[0])}(s),c=function e(t){return"node"in t?t.node:e(t.match[t.match.length-1])}(s);e.syntax.walk(t,(function(e,t,n){if(e===l){var r=new a;do{if(r.appendData(t.data),t.data===c)break;t=t.next}while(null!==t);o.push({parent:n,nodes:r})}}))}Array.isArray(s.match)&&s.match.forEach(n)}(n.matched),o}},pn=Object.prototype.hasOwnProperty;function dn(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e&&e>=0}function mn(e){return Boolean(e)&&dn(e.offset)&&dn(e.line)&&dn(e.column)}function gn(e,t){return function(n,r){if(!n||n.constructor!==Object)return r(n,"Type of node should be an Object");for(var i in n){var o=!0;if(!1!==pn.call(n,i)){if("type"===i)n.type!==e&&r(n,"Wrong node type `"+n.type+"`, expected `"+e+"`");else if("loc"===i){if(null===n.loc)continue;if(n.loc&&n.loc.constructor===Object)if("string"!=typeof n.loc.source)i+=".source";else if(mn(n.loc.start)){if(mn(n.loc.end))continue;i+=".end"}else i+=".start";o=!1}else if(t.hasOwnProperty(i)){var s=0;for(o=!1;!o&&s<t[i].length;s++){var l=t[i][s];switch(l){case String:o="string"==typeof n[i];break;case Boolean:o="boolean"==typeof n[i];break;case null:o=null===n[i];break;default:"string"==typeof l?o=n[i]&&n[i].type===l:Array.isArray(l)&&(o=n[i]instanceof a)}}}else r(n,"Unknown field `"+i+"` for "+e+" node type");o||r(n,"Bad value for `"+e+"."+i+"`")}}for(var i in t)pn.call(t,i)&&!1===pn.call(n,i)&&r(n,"Field `"+e+"."+i+"` is missed")}}function fn(e,t){var n=t.structure,r={type:String,loc:!0},i={type:'"'+e+'"'};for(var a in n)if(!1!==pn.call(n,a)){for(var o=[],s=r[a]=Array.isArray(n[a])?n[a].slice():[n[a]],l=0;l<s.length;l++){var c=s[l];if(c===String||c===Boolean)o.push(c.name);else if(null===c)o.push("null");else if("string"==typeof c)o.push("<"+c+">");else{if(!Array.isArray(c))throw new Error("Wrong value `"+c+"` in `"+e+"."+a+"` structure definition");o.push("List")}}i[a]=o.join(" | ")}return{docs:i,check:gn(e,r)}}var bn=$,yn=J,kn=Qt,vn=sn,xn=function(e){var t={};if(e.node)for(var n in e.node)if(pn.call(e.node,n)){var r=e.node[n];if(!r.structure)throw new Error("Missed `structure` field in `"+n+"` node type definition");t[n]=fn(n,r)}return t},wn=kn("inherit | initial | unset"),Sn=kn("inherit | initial | unset | <-ms-legacy-expression>");function Cn(e,t,n){var r={};for(var i in e)e[i].syntax&&(r[i]=n?e[i].syntax:G(e[i].syntax,{compact:t}));return r}function zn(e,t,n){const r={};for(const[i,a]of Object.entries(e))r[i]={prelude:a.prelude&&(n?a.prelude.syntax:G(a.prelude.syntax,{compact:t})),descriptors:a.descriptors&&Cn(a.descriptors,t,n)};return r}function An(e,t,n){return{matched:e,iterations:n,error:t,getTrace:un.getTrace,isType:un.isType,isProperty:un.isProperty,isKeyword:un.isKeyword}}function Pn(e,t,n,r){var i,a=function(e,t){return"string"==typeof e?jt(e,null):t.generate(e,Mt)}(n,e.syntax);return function(e){for(var t=0;t<e.length;t++)if("var("===e[t].value.toLowerCase())return!0;return!1}(a)?An(null,new Error("Matching for a tree with var() is not supported")):(r&&(i=vn(a,e.valueCommonSyntax,e)),r&&i.match||(i=vn(a,t.match,e)).match?An(i.match,null,i.iterations):An(null,new yn(i.reason,t.syntax,n,i),i.iterations))}var Tn=function(e,t,n){if(this.valueCommonSyntax=wn,this.syntax=t,this.generic=!1,this.atrules={},this.properties={},this.types={},this.structure=n||xn(e),e){if(e.types)for(var r in e.types)this.addType_(r,e.types[r]);if(e.generic)for(var r in this.generic=!0,mt)this.addType_(r,mt[r]);if(e.atrules)for(var r in e.atrules)this.addAtrule_(r,e.atrules[r]);if(e.properties)for(var r in e.properties)this.addProperty_(r,e.properties[r])}};Tn.prototype={structure:{},checkStructure:function(e){function t(e,t){r.push({node:e,message:t})}var n=this.structure,r=[];return this.syntax.walk(e,(function(e){n.hasOwnProperty(e.type)?n[e.type].check(e,t):t(e,"Unknown node type `"+e.type+"`")})),!!r.length&&r},createDescriptor:function(e,t,n,r=null){var i={type:t,name:n},a={type:t,name:n,parent:r,syntax:null,match:null};return"function"==typeof e?a.match=kn(e,i):("string"==typeof e?Object.defineProperty(a,"syntax",{get:function(){return Object.defineProperty(a,"syntax",{value:Ot(e)}),a.syntax}}):a.syntax=e,Object.defineProperty(a,"match",{get:function(){return Object.defineProperty(a,"match",{value:kn(a.syntax,i)}),a.match}})),a},addAtrule_:function(e,t){t&&(this.atrules[e]={type:"Atrule",name:e,prelude:t.prelude?this.createDescriptor(t.prelude,"AtrulePrelude",e):null,descriptors:t.descriptors?Object.keys(t.descriptors).reduce(((n,r)=>(n[r]=this.createDescriptor(t.descriptors[r],"AtruleDescriptor",r,e),n)),{}):null})},addProperty_:function(e,t){t&&(this.properties[e]=this.createDescriptor(t,"Property",e))},addType_:function(e,t){t&&(this.types[e]=this.createDescriptor(t,"Type",e),t===mt["-ms-legacy-expression"]&&(this.valueCommonSyntax=Sn))},checkAtruleName:function(e){if(!this.getAtrule(e))return new bn("Unknown at-rule","@"+e)},checkAtrulePrelude:function(e,t){let n=this.checkAtruleName(e);if(n)return n;var r=this.getAtrule(e);return!r.prelude&&t?new SyntaxError("At-rule `@"+e+"` should not contain a prelude"):r.prelude&&!t?new SyntaxError("At-rule `@"+e+"` should contain a prelude"):void 0},checkAtruleDescriptorName:function(e,t){let n=this.checkAtruleName(e);if(n)return n;var r=this.getAtrule(e),i=ae.keyword(t);return r.descriptors?r.descriptors[i.name]||r.descriptors[i.basename]?void 0:new bn("Unknown at-rule descriptor",t):new SyntaxError("At-rule `@"+e+"` has no known descriptors")},checkPropertyName:function(e){return ae.property(e).custom?new Error("Lexer matching doesn't applicable for custom properties"):this.getProperty(e)?void 0:new bn("Unknown property",e)},matchAtrulePrelude:function(e,t){var n=this.checkAtrulePrelude(e,t);return n?An(null,n):t?Pn(this,this.getAtrule(e).prelude,t,!0):An(null,null)},matchAtruleDescriptor:function(e,t,n){var r=this.checkAtruleDescriptorName(e,t);if(r)return An(null,r);var i=this.getAtrule(e),a=ae.keyword(t);return Pn(this,i.descriptors[a.name]||i.descriptors[a.basename],n,!0)},matchDeclaration:function(e){return"Declaration"!==e.type?An(null,new Error("Not a Declaration node")):this.matchProperty(e.property,e.value)},matchProperty:function(e,t){var n=this.checkPropertyName(e);return n?An(null,n):Pn(this,this.getProperty(e),t,!0)},matchType:function(e,t){var n=this.getType(e);return n?Pn(this,n,t,!1):An(null,new bn("Unknown type",e))},match:function(e,t){return"string"==typeof e||e&&e.type?("string"!=typeof e&&e.match||(e=this.createDescriptor(e,"Type","anonymous")),Pn(this,e,t,!1)):An(null,new bn("Bad syntax"))},findValueFragments:function(e,t,n,r){return hn.matchFragments(this,t,this.matchProperty(e,t),n,r)},findDeclarationValueFragments:function(e,t,n){return hn.matchFragments(this,e.value,this.matchDeclaration(e),t,n)},findAllFragments:function(e,t,n){var r=[];return this.syntax.walk(e,{visit:"Declaration",enter:function(e){r.push.apply(r,this.findDeclarationValueFragments(e,t,n))}.bind(this)}),r},getAtrule:function(e,t=!0){var n=ae.keyword(e);return(n.vendor&&t?this.atrules[n.name]||this.atrules[n.basename]:this.atrules[n.name])||null},getAtrulePrelude:function(e,t=!0){const n=this.getAtrule(e,t);return n&&n.prelude||null},getAtruleDescriptor:function(e,t){return this.atrules.hasOwnProperty(e)&&this.atrules.declarators&&this.atrules[e].declarators[t]||null},getProperty:function(e,t=!0){var n=ae.property(e);return(n.vendor&&t?this.properties[n.name]||this.properties[n.basename]:this.properties[n.name])||null},getType:function(e){return this.types.hasOwnProperty(e)?this.types[e]:null},validate:function(){function e(r,i,a,o){if(a.hasOwnProperty(i))return a[i];a[i]=!1,null!==o.syntax&&Nt(o.syntax,(function(o){if("Type"===o.type||"Property"===o.type){var s="Type"===o.type?r.types:r.properties,l="Type"===o.type?t:n;s.hasOwnProperty(o.name)&&!e(r,o.name,l,s[o.name])||(a[i]=!0)}}),this)}var t={},n={};for(var r in this.types)e(this,r,t,this.types[r]);for(var r in this.properties)e(this,r,n,this.properties[r]);return t=Object.keys(t).filter((function(e){return t[e]})),n=Object.keys(n).filter((function(e){return n[e]})),t.length||n.length?{types:t,properties:n}:null},dump:function(e,t){return{generic:this.generic,types:Cn(this.types,!t,e),properties:Cn(this.properties,!t,e),atrules:zn(this.atrules,!t,e)}},toString:function(){return JSON.stringify(this.dump())}};var Ln=Tn,En={SyntaxError:gt,parse:Ot,generate:G,walk:Nt},Dn=Ce.isBOM;var On=function(){this.lines=null,this.columns=null,this.linesAndColumnsComputed=!1};On.prototype={setSource:function(e,t,n,r){this.source=e,this.startOffset=void 0===t?0:t,this.startLine=void 0===n?1:n,this.startColumn=void 0===r?1:r,this.linesAndColumnsComputed=!1},ensureLinesAndColumnsComputed:function(){this.linesAndColumnsComputed||(!function(e,t){for(var n=t.length,r=se(e.lines,n),i=e.startLine,a=se(e.columns,n),o=e.startColumn,s=t.length>0?Dn(t.charCodeAt(0)):0;s<n;s++){var l=t.charCodeAt(s);r[s]=i,a[s]=o++,10!==l&&13!==l&&12!==l||(13===l&&s+1<n&&10===t.charCodeAt(s+1)&&(r[++s]=i,a[s]=o),i++,o=1)}r[s]=i,a[s]=o,e.lines=r,e.columns=a}(this,this.source),this.linesAndColumnsComputed=!0)},getLocation:function(e,t){return this.ensureLinesAndColumnsComputed(),{source:t,offset:this.startOffset+e,line:this.lines[e],column:this.columns[e]}},getLocationRange:function(e,t,n){return this.ensureLinesAndColumnsComputed(),{source:n,start:{offset:this.startOffset+e,line:this.lines[e],column:this.columns[e]},end:{offset:this.startOffset+t,line:this.lines[t],column:this.columns[t]}}}};var Bn=On,In=Ce.TYPE,Nn=In.WhiteSpace,Rn=In.Comment,Mn=function(e){var t=this.createList(),n=null,r={recognizer:e,space:null,ignoreWS:!1,ignoreWSAfter:!1};for(this.scanner.skipSC();!this.scanner.eof;){switch(this.scanner.tokenType){case Rn:this.scanner.next();continue;case Nn:r.ignoreWS?this.scanner.next():r.space=this.WhiteSpace();continue}if(void 0===(n=e.getNode.call(this,r)))break;null!==r.space&&(t.push(r.space),r.space=null),t.push(n),r.ignoreWSAfter?(r.ignoreWSAfter=!1,r.ignoreWS=!0):r.ignoreWS=!1}return t},{findWhiteSpaceStart:jn,cmpStr:_n}=M,Fn=function(){},Wn=h.TYPE,qn=h.NAME,Yn=Wn.WhiteSpace,Un=Wn.Comment,Hn=Wn.Ident,Vn=Wn.Function,Kn=Wn.Url,Gn=Wn.Hash,Qn=Wn.Percentage,Xn=Wn.Number;function Zn(e){return function(){return this[e]()}}var $n=function(e){var t={scanner:new H,locationMap:new Bn,filename:"<unknown>",needPositions:!1,onParseError:Fn,onParseErrorThrow:!1,parseAtrulePrelude:!0,parseRulePrelude:!0,parseValue:!0,parseCustomProperty:!1,readSequence:Mn,createList:function(){return new a},createSingleNodeList:function(e){return(new a).appendData(e)},getFirstListNode:function(e){return e&&e.first()},getLastListNode:function(e){return e.last()},parseWithFallback:function(e,t){var n=this.scanner.tokenIndex;try{return e.call(this)}catch(e){if(this.onParseErrorThrow)throw e;var r=t.call(this,n);return this.onParseErrorThrow=!0,this.onParseError(e,r),this.onParseErrorThrow=!1,r}},lookupNonWSType:function(e){do{var t=this.scanner.lookupType(e++);if(t!==Yn)return t}while(0!==t);return 0},eat:function(e){if(this.scanner.tokenType!==e){var t=this.scanner.tokenStart,n=qn[e]+" is expected";switch(e){case Hn:this.scanner.tokenType===Vn||this.scanner.tokenType===Kn?(t=this.scanner.tokenEnd-1,n="Identifier is expected but function found"):n="Identifier is expected";break;case Gn:this.scanner.isDelim(35)&&(this.scanner.next(),t++,n="Name is expected");break;case Qn:this.scanner.tokenType===Xn&&(t=this.scanner.tokenEnd,n="Percent sign is expected");break;default:this.scanner.source.charCodeAt(this.scanner.tokenStart)===e&&(t+=1)}this.error(n,t)}this.scanner.next()},consume:function(e){var t=this.scanner.getTokenValue();return this.eat(e),t},consumeFunctionName:function(){var e=this.scanner.source.substring(this.scanner.tokenStart,this.scanner.tokenEnd-1);return this.eat(Vn),e},getLocation:function(e,t){return this.needPositions?this.locationMap.getLocationRange(e,t,this.filename):null},getLocationFromList:function(e){if(this.needPositions){var t=this.getFirstListNode(e),n=this.getLastListNode(e);return this.locationMap.getLocationRange(null!==t?t.loc.start.offset-this.locationMap.startOffset:this.scanner.tokenStart,null!==n?n.loc.end.offset-this.locationMap.startOffset:this.scanner.tokenStart,this.filename)}return null},error:function(e,t){var n=void 0!==t&&t<this.scanner.source.length?this.locationMap.getLocation(t):this.scanner.eof?this.locationMap.getLocation(jn(this.scanner.source,this.scanner.source.length-1)):this.locationMap.getLocation(this.scanner.tokenStart);throw new l(e||"Unexpected input",this.scanner.source,n.offset,n.line,n.column)}};for(var n in e=function(e){var t={context:{},scope:{},atrule:{},pseudo:{}};if(e.parseContext)for(var n in e.parseContext)switch(typeof e.parseContext[n]){case"function":t.context[n]=e.parseContext[n];break;case"string":t.context[n]=Zn(e.parseContext[n])}if(e.scope)for(var n in e.scope)t.scope[n]=e.scope[n];if(e.atrule)for(var n in e.atrule){var r=e.atrule[n];r.parse&&(t.atrule[n]=r.parse)}if(e.pseudo)for(var n in e.pseudo){var i=e.pseudo[n];i.parse&&(t.pseudo[n]=i.parse)}if(e.node)for(var n in e.node)t[n]=e.node[n].parse;return t}(e||{}))t[n]=e[n];return function(e,n){var r,i=(n=n||{}).context||"default",a=n.onComment;if(Ce(e,t.scanner),t.locationMap.setSource(e,n.offset,n.line,n.column),t.filename=n.filename||"<unknown>",t.needPositions=Boolean(n.positions),t.onParseError="function"==typeof n.onParseError?n.onParseError:Fn,t.onParseErrorThrow=!1,t.parseAtrulePrelude=!("parseAtrulePrelude"in n)||Boolean(n.parseAtrulePrelude),t.parseRulePrelude=!("parseRulePrelude"in n)||Boolean(n.parseRulePrelude),t.parseValue=!("parseValue"in n)||Boolean(n.parseValue),t.parseCustomProperty="parseCustomProperty"in n&&Boolean(n.parseCustomProperty),!t.context.hasOwnProperty(i))throw new Error("Unknown context `"+i+"`");return"function"==typeof a&&t.scanner.forEachToken(((n,r,i)=>{if(n===Un){const n=t.getLocation(r,i),o=_n(e,i-2,i,"*/")?e.slice(r+2,i-2):e.slice(r+2,i);a(o,n)}})),r=t.context[i].call(t,n),t.scanner.eof||t.error(),r}},Jn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),er=function(e){if(0<=e&&e<Jn.length)return Jn[e];throw new TypeError("Must be between 0 and 63: "+e)};var tr=function(e){var t,n="",r=function(e){return e<0?1+(-e<<1):0+(e<<1)}(e);do{t=31&r,(r>>>=5)>0&&(t|=32),n+=er(t)}while(r>0);return n};var nr=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e,t){t.getArg=function(e,t,n){if(t in e)return e[t];if(3===arguments.length)return n;throw new Error('"'+t+'" is a required argument.')};var n=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,r=/^data:.+\,.+$/;function i(e){var t=e.match(n);return t?{scheme:t[1],auth:t[2],host:t[3],port:t[4],path:t[5]}:null}function a(e){var t="";return e.scheme&&(t+=e.scheme+":"),t+="//",e.auth&&(t+=e.auth+"@"),e.host&&(t+=e.host),e.port&&(t+=":"+e.port),e.path&&(t+=e.path),t}function o(e){var n=e,r=i(e);if(r){if(!r.path)return e;n=r.path}for(var o,s=t.isAbsolute(n),l=n.split(/\/+/),c=0,u=l.length-1;u>=0;u--)"."===(o=l[u])?l.splice(u,1):".."===o?c++:c>0&&(""===o?(l.splice(u+1,c),c=0):(l.splice(u,2),c--));return""===(n=l.join("/"))&&(n=s?"/":"."),r?(r.path=n,a(r)):n}function s(e,t){""===e&&(e="."),""===t&&(t=".");var n=i(t),s=i(e);if(s&&(e=s.path||"/"),n&&!n.scheme)return s&&(n.scheme=s.scheme),a(n);if(n||t.match(r))return t;if(s&&!s.host&&!s.path)return s.host=t,a(s);var l="/"===t.charAt(0)?t:o(e.replace(/\/+$/,"")+"/"+t);return s?(s.path=l,a(s)):l}t.urlParse=i,t.urlGenerate=a,t.normalize=o,t.join=s,t.isAbsolute=function(e){return"/"===e.charAt(0)||n.test(e)},t.relative=function(e,t){""===e&&(e="."),e=e.replace(/\/$/,"");for(var n=0;0!==t.indexOf(e+"/");){var r=e.lastIndexOf("/");if(r<0)return t;if((e=e.slice(0,r)).match(/^([^\/]+:\/)?\/*$/))return t;++n}return Array(n+1).join("../")+t.substr(e.length+1)};var l=!("__proto__"in Object.create(null));function c(e){return e}function u(e){if(!e)return!1;var t=e.length;if(t<9)return!1;if(95!==e.charCodeAt(t-1)||95!==e.charCodeAt(t-2)||111!==e.charCodeAt(t-3)||116!==e.charCodeAt(t-4)||111!==e.charCodeAt(t-5)||114!==e.charCodeAt(t-6)||112!==e.charCodeAt(t-7)||95!==e.charCodeAt(t-8)||95!==e.charCodeAt(t-9))return!1;for(var n=t-10;n>=0;n--)if(36!==e.charCodeAt(n))return!1;return!0}function h(e,t){return e===t?0:null===e?1:null===t?-1:e>t?1:-1}t.toSetString=l?c:function(e){return u(e)?"$"+e:e},t.fromSetString=l?c:function(e){return u(e)?e.slice(1):e},t.compareByOriginalPositions=function(e,t,n){var r=h(e.source,t.source);return 0!==r||0!==(r=e.originalLine-t.originalLine)||0!==(r=e.originalColumn-t.originalColumn)||n||0!==(r=e.generatedColumn-t.generatedColumn)||0!==(r=e.generatedLine-t.generatedLine)?r:h(e.name,t.name)},t.compareByGeneratedPositionsDeflated=function(e,t,n){var r=e.generatedLine-t.generatedLine;return 0!==r||0!==(r=e.generatedColumn-t.generatedColumn)||n||0!==(r=h(e.source,t.source))||0!==(r=e.originalLine-t.originalLine)||0!==(r=e.originalColumn-t.originalColumn)?r:h(e.name,t.name)},t.compareByGeneratedPositionsInflated=function(e,t){var n=e.generatedLine-t.generatedLine;return 0!==n||0!==(n=e.generatedColumn-t.generatedColumn)||0!==(n=h(e.source,t.source))||0!==(n=e.originalLine-t.originalLine)||0!==(n=e.originalColumn-t.originalColumn)?n:h(e.name,t.name)},t.parseSourceMapInput=function(e){return JSON.parse(e.replace(/^\)]}'[^\n]*\n/,""))},t.computeSourceURL=function(e,t,n){if(t=t||"",e&&("/"!==e[e.length-1]&&"/"!==t[0]&&(e+="/"),t=e+t),n){var r=i(n);if(!r)throw new Error("sourceMapURL could not be parsed");if(r.path){var l=r.path.lastIndexOf("/");l>=0&&(r.path=r.path.substring(0,l+1))}t=s(a(r),t)}return o(t)}})),rr=(nr.getArg,nr.urlParse,nr.urlGenerate,nr.normalize,nr.join,nr.isAbsolute,nr.relative,nr.toSetString,nr.fromSetString,nr.compareByOriginalPositions,nr.compareByGeneratedPositionsDeflated,nr.compareByGeneratedPositionsInflated,nr.parseSourceMapInput,nr.computeSourceURL,Object.prototype.hasOwnProperty),ir="undefined"!=typeof Map;function ar(){this._array=[],this._set=ir?new Map:Object.create(null)}ar.fromArray=function(e,t){for(var n=new ar,r=0,i=e.length;r<i;r++)n.add(e[r],t);return n},ar.prototype.size=function(){return ir?this._set.size:Object.getOwnPropertyNames(this._set).length},ar.prototype.add=function(e,t){var n=ir?e:nr.toSetString(e),r=ir?this.has(e):rr.call(this._set,n),i=this._array.length;r&&!t||this._array.push(e),r||(ir?this._set.set(e,i):this._set[n]=i)},ar.prototype.has=function(e){if(ir)return this._set.has(e);var t=nr.toSetString(e);return rr.call(this._set,t)},ar.prototype.indexOf=function(e){if(ir){var t=this._set.get(e);if(t>=0)return t}else{var n=nr.toSetString(e);if(rr.call(this._set,n))return this._set[n]}throw new Error('"'+e+'" is not in the set.')},ar.prototype.at=function(e){if(e>=0&&e<this._array.length)return this._array[e];throw new Error("No element indexed by "+e)},ar.prototype.toArray=function(){return this._array.slice()};var or={ArraySet:ar};function sr(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}sr.prototype.unsortedForEach=function(e,t){this._array.forEach(e,t)},sr.prototype.add=function(e){var t,n,r,i,a,o;t=this._last,n=e,r=t.generatedLine,i=n.generatedLine,a=t.generatedColumn,o=n.generatedColumn,i>r||i==r&&o>=a||nr.compareByGeneratedPositionsInflated(t,n)<=0?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e))},sr.prototype.toArray=function(){return this._sorted||(this._array.sort(nr.compareByGeneratedPositionsInflated),this._sorted=!0),this._array};var lr=or.ArraySet,cr={MappingList:sr}.MappingList;function ur(e){e||(e={}),this._file=nr.getArg(e,"file",null),this._sourceRoot=nr.getArg(e,"sourceRoot",null),this._skipValidation=nr.getArg(e,"skipValidation",!1),this._sources=new lr,this._names=new lr,this._mappings=new cr,this._sourcesContents=null}ur.prototype._version=3,ur.fromSourceMap=function(e){var t=e.sourceRoot,n=new ur({file:e.file,sourceRoot:t});return e.eachMapping((function(e){var r={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(r.source=e.source,null!=t&&(r.source=nr.relative(t,r.source)),r.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(r.name=e.name)),n.addMapping(r)})),e.sources.forEach((function(r){var i=r;null!==t&&(i=nr.relative(t,r)),n._sources.has(i)||n._sources.add(i);var a=e.sourceContentFor(r);null!=a&&n.setSourceContent(r,a)})),n},ur.prototype.addMapping=function(e){var t=nr.getArg(e,"generated"),n=nr.getArg(e,"original",null),r=nr.getArg(e,"source",null),i=nr.getArg(e,"name",null);this._skipValidation||this._validateMapping(t,n,r,i),null!=r&&(r=String(r),this._sources.has(r)||this._sources.add(r)),null!=i&&(i=String(i),this._names.has(i)||this._names.add(i)),this._mappings.add({generatedLine:t.line,generatedColumn:t.column,originalLine:null!=n&&n.line,originalColumn:null!=n&&n.column,source:r,name:i})},ur.prototype.setSourceContent=function(e,t){var n=e;null!=this._sourceRoot&&(n=nr.relative(this._sourceRoot,n)),null!=t?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[nr.toSetString(n)]=t):this._sourcesContents&&(delete this._sourcesContents[nr.toSetString(n)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},ur.prototype.applySourceMap=function(e,t,n){var r=t;if(null==t){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');r=e.file}var i=this._sourceRoot;null!=i&&(r=nr.relative(i,r));var a=new lr,o=new lr;this._mappings.unsortedForEach((function(t){if(t.source===r&&null!=t.originalLine){var s=e.originalPositionFor({line:t.originalLine,column:t.originalColumn});null!=s.source&&(t.source=s.source,null!=n&&(t.source=nr.join(n,t.source)),null!=i&&(t.source=nr.relative(i,t.source)),t.originalLine=s.line,t.originalColumn=s.column,null!=s.name&&(t.name=s.name))}var l=t.source;null==l||a.has(l)||a.add(l);var c=t.name;null==c||o.has(c)||o.add(c)}),this),this._sources=a,this._names=o,e.sources.forEach((function(t){var r=e.sourceContentFor(t);null!=r&&(null!=n&&(t=nr.join(n,t)),null!=i&&(t=nr.relative(i,t)),this.setSourceContent(t,r))}),this)},ur.prototype._validateMapping=function(e,t,n,r){if(t&&"number"!=typeof t.line&&"number"!=typeof t.column)throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if((!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0)||t||n||r)&&!(e&&"line"in e&&"column"in e&&t&&"line"in t&&"column"in t&&e.line>0&&e.column>=0&&t.line>0&&t.column>=0&&n))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:n,original:t,name:r}))},ur.prototype._serializeMappings=function(){for(var e,t,n,r,i=0,a=1,o=0,s=0,l=0,c=0,u="",h=this._mappings.toArray(),p=0,d=h.length;p<d;p++){if(e="",(t=h[p]).generatedLine!==a)for(i=0;t.generatedLine!==a;)e+=";",a++;else if(p>0){if(!nr.compareByGeneratedPositionsInflated(t,h[p-1]))continue;e+=","}e+=tr(t.generatedColumn-i),i=t.generatedColumn,null!=t.source&&(r=this._sources.indexOf(t.source),e+=tr(r-c),c=r,e+=tr(t.originalLine-1-s),s=t.originalLine-1,e+=tr(t.originalColumn-o),o=t.originalColumn,null!=t.name&&(n=this._names.indexOf(t.name),e+=tr(n-l),l=n)),u+=e}return u},ur.prototype._generateSourcesContent=function(e,t){return e.map((function(e){if(!this._sourcesContents)return null;null!=t&&(e=nr.relative(t,e));var n=nr.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,n)?this._sourcesContents[n]:null}),this)},ur.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},ur.prototype.toString=function(){return JSON.stringify(this.toJSON())};var hr={SourceMapGenerator:ur}.SourceMapGenerator,pr={Atrule:!0,Selector:!0,Declaration:!0},dr=Object.prototype.hasOwnProperty;function mr(e,t){var n=e.children,r=null;"function"!=typeof t?n.forEach(this.node,this):n.forEach((function(e){null!==r&&t.call(this,r),this.node(e),r=e}),this)}var gr=function(e){function t(e){if(!dr.call(n,e.type))throw new Error("Unknown node type: "+e.type);n[e.type].call(this,e)}var n={};if(e.node)for(var r in e.node)n[r]=e.node[r].generate;return function(e,n){var r="",i={children:mr,node:t,chunk:function(e){r+=e},result:function(){return r}};return n&&("function"==typeof n.decorator&&(i=n.decorator(i)),n.sourceMap&&(i=function(e){var t=new hr,n=1,r=0,i={line:1,column:0},a={line:0,column:0},o=!1,s={line:1,column:0},l={generated:s},c=e.node;e.node=function(e){if(e.loc&&e.loc.start&&pr.hasOwnProperty(e.type)){var u=e.loc.start.line,h=e.loc.start.column-1;a.line===u&&a.column===h||(a.line=u,a.column=h,i.line=n,i.column=r,o&&(o=!1,i.line===s.line&&i.column===s.column||t.addMapping(l)),o=!0,t.addMapping({source:e.loc.source,original:a,generated:i}))}c.call(this,e),o&&pr.hasOwnProperty(e.type)&&(s.line=n,s.column=r)};var u=e.chunk;e.chunk=function(e){for(var t=0;t<e.length;t++)10===e.charCodeAt(t)?(n++,r=0):r++;u(e)};var h=e.result;return e.result=function(){return o&&t.addMapping(l),{css:h(),map:t}},e}(i))),i.node(e),i.result()}},fr=Object.prototype.hasOwnProperty,br=function(){};function yr(e){return"function"==typeof e?e:br}function kr(e,t){return function(n,r,i){n.type===t&&e.call(this,n,r,i)}}function vr(e,t){var n=t.structure,r=[];for(var i in n)if(!1!==fr.call(n,i)){var a=n[i],o={name:i,type:!1,nullable:!1};Array.isArray(n[i])||(a=[n[i]]);for(var s=0;s<a.length;s++){var l=a[s];null===l?o.nullable=!0:"string"==typeof l?o.type="node":Array.isArray(l)&&(o.type="list")}o.type&&r.push(o)}return r.length?{context:t.walkContext,fields:r}:null}function xr(e,t){var n=e.fields.slice(),r=e.context,i="string"==typeof r;return t&&n.reverse(),function(e,a,o,s){var l;i&&(l=a[r],a[r]=e);for(var c=0;c<n.length;c++){var u=n[c],h=e[u.name];if(!u.nullable||h)if("list"===u.type){if(t?h.reduceRight(s,!1):h.reduce(s,!1))return!0}else if(o(h))return!0}i&&(a[r]=l)}}function wr(e){return{Atrule:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block},Rule:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block},Declaration:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block,DeclarationList:e.DeclarationList}}}var Sr=function(e){var t=function(e){var t={};for(var n in e.node)if(fr.call(e.node,n)){var r=e.node[n];if(!r.structure)throw new Error("Missed `structure` field in `"+n+"` node type definition");t[n]=vr(0,r)}return t}(e),n={},r={},i=Symbol("break-walk"),a=Symbol("skip-node");for(var o in t)fr.call(t,o)&&null!==t[o]&&(n[o]=xr(t[o],!1),r[o]=xr(t[o],!0));var s=wr(n),l=wr(r),c=function(e,o){function c(e,t,n){var r=h.call(m,e,t,n);return r===i||r!==a&&(!(!d.hasOwnProperty(e.type)||!d[e.type](e,m,c,u))||p.call(m,e,t,n)===i)}var u=(e,t,n,r)=>e||c(t,n,r),h=br,p=br,d=n,m={break:i,skip:a,root:e,stylesheet:null,atrule:null,atrulePrelude:null,rule:null,selector:null,block:null,declaration:null,function:null};if("function"==typeof o)h=o;else if(o&&(h=yr(o.enter),p=yr(o.leave),o.reverse&&(d=r),o.visit)){if(s.hasOwnProperty(o.visit))d=o.reverse?l[o.visit]:s[o.visit];else if(!t.hasOwnProperty(o.visit))throw new Error("Bad value `"+o.visit+"` for `visit` option (should be: "+Object.keys(t).join(", ")+")");h=kr(h,o.visit),p=kr(p,o.visit)}if(h===br&&p===br)throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function");c(e)};return c.break=i,c.skip=a,c.find=function(e,t){var n=null;return c(e,(function(e,r,a){if(t.call(this,e,r,a))return n=e,i})),n},c.findLast=function(e,t){var n=null;return c(e,{reverse:!0,enter:function(e,r,a){if(t.call(this,e,r,a))return n=e,i}}),n},c.findAll=function(e,t){var n=[];return c(e,(function(e,r,i){t.call(this,e,r,i)&&n.push(e)})),n},c},Cr=function e(t){var n={};for(var r in t){var i=t[r];i&&(Array.isArray(i)||i instanceof a?i=i.map(e):i.constructor===Object&&(i=e(i))),n[r]=i}return n};const zr=Object.prototype.hasOwnProperty,Ar={generic:!0,types:Er,atrules:{prelude:Dr,descriptors:Dr},properties:Er,parseContext:function(e,t){return Object.assign(e,t)},scope:function e(t,n){for(const r in n)zr.call(n,r)&&(Pr(t[r])?e(t[r],Tr(n[r])):t[r]=Tr(n[r]));return t},atrule:["parse"],pseudo:["parse"],node:["name","structure","parse","generate","walkContext"]};function Pr(e){return e&&e.constructor===Object}function Tr(e){return Pr(e)?Object.assign({},e):e}function Lr(e,t){return"string"==typeof t&&/^\s*\|/.test(t)?"string"==typeof e?e+t:t.replace(/^\s*\|\s*/,""):t||null}function Er(e,t){if("string"==typeof t)return Lr(e,t);const n=Object.assign({},e);for(let r in t)zr.call(t,r)&&(n[r]=Lr(zr.call(e,r)?e[r]:void 0,t[r]));return n}function Dr(e,t){const n=Er(e,t);return!Pr(n)||Object.keys(n).length?n:null}var Or=(e,t)=>function e(t,n,r){for(const i in r)if(!1!==zr.call(r,i))if(!0===r[i])i in n&&zr.call(n,i)&&(t[i]=Tr(n[i]));else if(r[i])if("function"==typeof r[i]){const e=r[i];t[i]=e({},t[i]),t[i]=e(t[i]||{},n[i])}else if(Pr(r[i])){const a={};for(let n in t[i])a[n]=e({},t[i][n],r[i]);for(let t in n[i])a[t]=e(a[t]||{},n[i][t],r[i]);t[i]=a}else if(Array.isArray(r[i])){const a={},o=r[i].reduce((function(e,t){return e[t]=!0,e}),{});for(const[n,r]of Object.entries(t[i]||{}))a[n]={},r&&e(a[n],r,o);for(const t in n[i])zr.call(n[i],t)&&(a[t]||(a[t]={}),n[i]&&n[i][t]&&e(a[t],n[i][t],o));t[i]=a}return t}(e,t,Ar);function Br(e){var t=$n(e),n=Sr(e),r=gr(e),i=function(e){return{fromPlainObject:function(t){return e(t,{enter:function(e){e.children&&e.children instanceof a==!1&&(e.children=(new a).fromArray(e.children))}}),t},toPlainObject:function(t){return e(t,{leave:function(e){e.children&&e.children instanceof a&&(e.children=e.children.toArray())}}),t}}}(n),o={List:a,SyntaxError:l,TokenStream:H,Lexer:Ln,vendorPrefix:ae.vendorPrefix,keyword:ae.keyword,property:ae.property,isCustomProperty:ae.isCustomProperty,definitionSyntax:En,lexer:null,createLexer:function(e){return new Ln(e,o,o.lexer.structure)},tokenize:Ce,parse:t,walk:n,generate:r,find:n.find,findLast:n.findLast,findAll:n.findAll,clone:Cr,fromPlainObject:i.fromPlainObject,toPlainObject:i.toPlainObject,createSyntax:function(e){return Br(Or({},e))},fork:function(t){var n=Or({},e);return Br("function"==typeof t?t(n,Object.assign):Or(n,t))}};return o.lexer=new Ln({generic:!0,types:e.types,atrules:e.atrules,properties:e.properties,node:e.node},o),o}var Ir=function(e){return Br(Or({},e))},Nr={generic:!0,types:{"absolute-size":"xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large","alpha-value":"<number>|<percentage>","angle-percentage":"<angle>|<percentage>","angular-color-hint":"<angle-percentage>","angular-color-stop":"<color>&&<color-stop-angle>?","angular-color-stop-list":"[<angular-color-stop> [, <angular-color-hint>]?]# , <angular-color-stop>","animateable-feature":"scroll-position|contents|<custom-ident>",attachment:"scroll|fixed|local","attr()":"attr( <attr-name> <type-or-unit>? [, <attr-fallback>]? )","attr-matcher":"['~'|'|'|'^'|'$'|'*']? '='","attr-modifier":"i|s","attribute-selector":"'[' <wq-name> ']'|'[' <wq-name> <attr-matcher> [<string-token>|<ident-token>] <attr-modifier>? ']'","auto-repeat":"repeat( [auto-fill|auto-fit] , [<line-names>? <fixed-size>]+ <line-names>? )","auto-track-list":"[<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>? <auto-repeat> [<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>?","baseline-position":"[first|last]? baseline","basic-shape":"<inset()>|<circle()>|<ellipse()>|<polygon()>|<path()>","bg-image":"none|<image>","bg-layer":"<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>","bg-position":"[[left|center|right|top|bottom|<length-percentage>]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]|[center|[left|right] <length-percentage>?]&&[center|[top|bottom] <length-percentage>?]]","bg-size":"[<length-percentage>|auto]{1,2}|cover|contain","blur()":"blur( <length> )","blend-mode":"normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|hard-light|soft-light|difference|exclusion|hue|saturation|color|luminosity",box:"border-box|padding-box|content-box","brightness()":"brightness( <number-percentage> )","calc()":"calc( <calc-sum> )","calc-sum":"<calc-product> [['+'|'-'] <calc-product>]*","calc-product":"<calc-value> ['*' <calc-value>|'/' <number>]*","calc-value":"<number>|<dimension>|<percentage>|( <calc-sum> )","cf-final-image":"<image>|<color>","cf-mixing-image":"<percentage>?&&<image>","circle()":"circle( [<shape-radius>]? [at <position>]? )","clamp()":"clamp( <calc-sum>#{3} )","class-selector":"'.' <ident-token>","clip-source":"<url>",color:"<rgb()>|<rgba()>|<hsl()>|<hsla()>|<hex-color>|<named-color>|currentcolor|<deprecated-system-color>","color-stop":"<color-stop-length>|<color-stop-angle>","color-stop-angle":"<angle-percentage>{1,2}","color-stop-length":"<length-percentage>{1,2}","color-stop-list":"[<linear-color-stop> [, <linear-color-hint>]?]# , <linear-color-stop>",combinator:"'>'|'+'|'~'|['||']","common-lig-values":"[common-ligatures|no-common-ligatures]","compat-auto":"searchfield|textarea|push-button|slider-horizontal|checkbox|radio|square-button|menulist|listbox|meter|progress-bar|button","composite-style":"clear|copy|source-over|source-in|source-out|source-atop|destination-over|destination-in|destination-out|destination-atop|xor","compositing-operator":"add|subtract|intersect|exclude","compound-selector":"[<type-selector>? <subclass-selector>* [<pseudo-element-selector> <pseudo-class-selector>*]*]!","compound-selector-list":"<compound-selector>#","complex-selector":"<compound-selector> [<combinator>? <compound-selector>]*","complex-selector-list":"<complex-selector>#","conic-gradient()":"conic-gradient( [from <angle>]? [at <position>]? , <angular-color-stop-list> )","contextual-alt-values":"[contextual|no-contextual]","content-distribution":"space-between|space-around|space-evenly|stretch","content-list":"[<string>|contents|<image>|<quote>|<target>|<leader()>|<attr()>|counter( <ident> , <'list-style-type'>? )]+","content-position":"center|start|end|flex-start|flex-end","content-replacement":"<image>","contrast()":"contrast( [<number-percentage>] )","counter()":"counter( <custom-ident> , <counter-style>? )","counter-style":"<counter-style-name>|symbols( )","counter-style-name":"<custom-ident>","counters()":"counters( <custom-ident> , <string> , <counter-style>? )","cross-fade()":"cross-fade( <cf-mixing-image> , <cf-final-image>? )","cubic-bezier-timing-function":"ease|ease-in|ease-out|ease-in-out|cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )","deprecated-system-color":"ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText","discretionary-lig-values":"[discretionary-ligatures|no-discretionary-ligatures]","display-box":"contents|none","display-inside":"flow|flow-root|table|flex|grid|ruby","display-internal":"table-row-group|table-header-group|table-footer-group|table-row|table-cell|table-column-group|table-column|table-caption|ruby-base|ruby-text|ruby-base-container|ruby-text-container","display-legacy":"inline-block|inline-list-item|inline-table|inline-flex|inline-grid","display-listitem":"<display-outside>?&&[flow|flow-root]?&&list-item","display-outside":"block|inline|run-in","drop-shadow()":"drop-shadow( <length>{2,3} <color>? )","east-asian-variant-values":"[jis78|jis83|jis90|jis04|simplified|traditional]","east-asian-width-values":"[full-width|proportional-width]","element()":"element( <custom-ident> , [first|start|last|first-except]? )|element( <id-selector> )","ellipse()":"ellipse( [<shape-radius>{2}]? [at <position>]? )","ending-shape":"circle|ellipse","env()":"env( <custom-ident> , <declaration-value>? )","explicit-track-list":"[<line-names>? <track-size>]+ <line-names>?","family-name":"<string>|<custom-ident>+","feature-tag-value":"<string> [<integer>|on|off]?","feature-type":"@stylistic|@historical-forms|@styleset|@character-variant|@swash|@ornaments|@annotation","feature-value-block":"<feature-type> '{' <feature-value-declaration-list> '}'","feature-value-block-list":"<feature-value-block>+","feature-value-declaration":"<custom-ident> : <integer>+ ;","feature-value-declaration-list":"<feature-value-declaration>","feature-value-name":"<custom-ident>","fill-rule":"nonzero|evenodd","filter-function":"<blur()>|<brightness()>|<contrast()>|<drop-shadow()>|<grayscale()>|<hue-rotate()>|<invert()>|<opacity()>|<saturate()>|<sepia()>","filter-function-list":"[<filter-function>|<url>]+","final-bg-layer":"<'background-color'>||<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>","fit-content()":"fit-content( [<length>|<percentage>] )","fixed-breadth":"<length-percentage>","fixed-repeat":"repeat( [<positive-integer>] , [<line-names>? <fixed-size>]+ <line-names>? )","fixed-size":"<fixed-breadth>|minmax( <fixed-breadth> , <track-breadth> )|minmax( <inflexible-breadth> , <fixed-breadth> )","font-stretch-absolute":"normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded|<percentage>","font-variant-css21":"[normal|small-caps]","font-weight-absolute":"normal|bold|<number [1,1000]>","frequency-percentage":"<frequency>|<percentage>","general-enclosed":"[<function-token> <any-value> )]|( <ident> <any-value> )","generic-family":"serif|sans-serif|cursive|fantasy|monospace|-apple-system","generic-name":"serif|sans-serif|cursive|fantasy|monospace","geometry-box":"<shape-box>|fill-box|stroke-box|view-box",gradient:"<linear-gradient()>|<repeating-linear-gradient()>|<radial-gradient()>|<repeating-radial-gradient()>|<conic-gradient()>|<-legacy-gradient>","grayscale()":"grayscale( <number-percentage> )","grid-line":"auto|<custom-ident>|[<integer>&&<custom-ident>?]|[span&&[<integer>||<custom-ident>]]","historical-lig-values":"[historical-ligatures|no-historical-ligatures]","hsl()":"hsl( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )","hsla()":"hsla( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )",hue:"<number>|<angle>","hue-rotate()":"hue-rotate( <angle> )",image:"<url>|<image()>|<image-set()>|<element()>|<paint()>|<cross-fade()>|<gradient>","image()":"image( <image-tags>? [<image-src>? , <color>?]! )","image-set()":"image-set( <image-set-option># )","image-set-option":"[<image>|<string>] <resolution>","image-src":"<url>|<string>","image-tags":"ltr|rtl","inflexible-breadth":"<length>|<percentage>|min-content|max-content|auto","inset()":"inset( <length-percentage>{1,4} [round <'border-radius'>]? )","invert()":"invert( <number-percentage> )","keyframes-name":"<custom-ident>|<string>","keyframe-block":"<keyframe-selector># { <declaration-list> }","keyframe-block-list":"<keyframe-block>+","keyframe-selector":"from|to|<percentage>","leader()":"leader( <leader-type> )","leader-type":"dotted|solid|space|<string>","length-percentage":"<length>|<percentage>","line-names":"'[' <custom-ident>* ']'","line-name-list":"[<line-names>|<name-repeat>]+","line-style":"none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset","line-width":"<length>|thin|medium|thick","linear-color-hint":"<length-percentage>","linear-color-stop":"<color> <color-stop-length>?","linear-gradient()":"linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )","mask-layer":"<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||<geometry-box>||[<geometry-box>|no-clip]||<compositing-operator>||<masking-mode>","mask-position":"[<length-percentage>|left|center|right] [<length-percentage>|top|center|bottom]?","mask-reference":"none|<image>|<mask-source>","mask-source":"<url>","masking-mode":"alpha|luminance|match-source","matrix()":"matrix( <number>#{6} )","matrix3d()":"matrix3d( <number>#{16} )","max()":"max( <calc-sum># )","media-and":"<media-in-parens> [and <media-in-parens>]+","media-condition":"<media-not>|<media-and>|<media-or>|<media-in-parens>","media-condition-without-or":"<media-not>|<media-and>|<media-in-parens>","media-feature":"( [<mf-plain>|<mf-boolean>|<mf-range>] )","media-in-parens":"( <media-condition> )|<media-feature>|<general-enclosed>","media-not":"not <media-in-parens>","media-or":"<media-in-parens> [or <media-in-parens>]+","media-query":"<media-condition>|[not|only]? <media-type> [and <media-condition-without-or>]?","media-query-list":"<media-query>#","media-type":"<ident>","mf-boolean":"<mf-name>","mf-name":"<ident>","mf-plain":"<mf-name> : <mf-value>","mf-range":"<mf-name> ['<'|'>']? '='? <mf-value>|<mf-value> ['<'|'>']? '='? <mf-name>|<mf-value> '<' '='? <mf-name> '<' '='? <mf-value>|<mf-value> '>' '='? <mf-name> '>' '='? <mf-value>","mf-value":"<number>|<dimension>|<ident>|<ratio>","min()":"min( <calc-sum># )","minmax()":"minmax( [<length>|<percentage>|min-content|max-content|auto] , [<length>|<percentage>|<flex>|min-content|max-content|auto] )","named-color":"transparent|aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen|<-non-standard-color>","namespace-prefix":"<ident>","ns-prefix":"[<ident-token>|'*']? '|'","number-percentage":"<number>|<percentage>","numeric-figure-values":"[lining-nums|oldstyle-nums]","numeric-fraction-values":"[diagonal-fractions|stacked-fractions]","numeric-spacing-values":"[proportional-nums|tabular-nums]",nth:"<an-plus-b>|even|odd","opacity()":"opacity( [<number-percentage>] )","overflow-position":"unsafe|safe","outline-radius":"<length>|<percentage>","page-body":"<declaration>? [; <page-body>]?|<page-margin-box> <page-body>","page-margin-box":"<page-margin-box-type> '{' <declaration-list> '}'","page-margin-box-type":"@top-left-corner|@top-left|@top-center|@top-right|@top-right-corner|@bottom-left-corner|@bottom-left|@bottom-center|@bottom-right|@bottom-right-corner|@left-top|@left-middle|@left-bottom|@right-top|@right-middle|@right-bottom","page-selector-list":"[<page-selector>#]?","page-selector":"<pseudo-page>+|<ident> <pseudo-page>*","path()":"path( [<fill-rule> ,]? <string> )","paint()":"paint( <ident> , <declaration-value>? )","perspective()":"perspective( <length> )","polygon()":"polygon( <fill-rule>? , [<length-percentage> <length-percentage>]# )",position:"[[left|center|right]||[top|center|bottom]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]?|[[left|right] <length-percentage>]&&[[top|bottom] <length-percentage>]]","pseudo-class-selector":"':' <ident-token>|':' <function-token> <any-value> ')'","pseudo-element-selector":"':' <pseudo-class-selector>","pseudo-page":": [left|right|first|blank]",quote:"open-quote|close-quote|no-open-quote|no-close-quote","radial-gradient()":"radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )","relative-selector":"<combinator>? <complex-selector>","relative-selector-list":"<relative-selector>#","relative-size":"larger|smaller","repeat-style":"repeat-x|repeat-y|[repeat|space|round|no-repeat]{1,2}","repeating-linear-gradient()":"repeating-linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )","repeating-radial-gradient()":"repeating-radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )","rgb()":"rgb( <percentage>{3} [/ <alpha-value>]? )|rgb( <number>{3} [/ <alpha-value>]? )|rgb( <percentage>#{3} , <alpha-value>? )|rgb( <number>#{3} , <alpha-value>? )","rgba()":"rgba( <percentage>{3} [/ <alpha-value>]? )|rgba( <number>{3} [/ <alpha-value>]? )|rgba( <percentage>#{3} , <alpha-value>? )|rgba( <number>#{3} , <alpha-value>? )","rotate()":"rotate( [<angle>|<zero>] )","rotate3d()":"rotate3d( <number> , <number> , <number> , [<angle>|<zero>] )","rotateX()":"rotateX( [<angle>|<zero>] )","rotateY()":"rotateY( [<angle>|<zero>] )","rotateZ()":"rotateZ( [<angle>|<zero>] )","saturate()":"saturate( <number-percentage> )","scale()":"scale( <number> , <number>? )","scale3d()":"scale3d( <number> , <number> , <number> )","scaleX()":"scaleX( <number> )","scaleY()":"scaleY( <number> )","scaleZ()":"scaleZ( <number> )","self-position":"center|start|end|self-start|self-end|flex-start|flex-end","shape-radius":"<length-percentage>|closest-side|farthest-side","skew()":"skew( [<angle>|<zero>] , [<angle>|<zero>]? )","skewX()":"skewX( [<angle>|<zero>] )","skewY()":"skewY( [<angle>|<zero>] )","sepia()":"sepia( <number-percentage> )",shadow:"inset?&&<length>{2,4}&&<color>?","shadow-t":"[<length>{2,3}&&<color>?]",shape:"rect( <top> , <right> , <bottom> , <left> )|rect( <top> <right> <bottom> <left> )","shape-box":"<box>|margin-box","side-or-corner":"[left|right]||[top|bottom]","single-animation":"<time>||<timing-function>||<time>||<single-animation-iteration-count>||<single-animation-direction>||<single-animation-fill-mode>||<single-animation-play-state>||[none|<keyframes-name>]","single-animation-direction":"normal|reverse|alternate|alternate-reverse","single-animation-fill-mode":"none|forwards|backwards|both","single-animation-iteration-count":"infinite|<number>","single-animation-play-state":"running|paused","single-transition":"[none|<single-transition-property>]||<time>||<timing-function>||<time>","single-transition-property":"all|<custom-ident>",size:"closest-side|farthest-side|closest-corner|farthest-corner|<length>|<length-percentage>{2}","step-position":"jump-start|jump-end|jump-none|jump-both|start|end","step-timing-function":"step-start|step-end|steps( <integer> [, <step-position>]? )","subclass-selector":"<id-selector>|<class-selector>|<attribute-selector>|<pseudo-class-selector>","supports-condition":"not <supports-in-parens>|<supports-in-parens> [and <supports-in-parens>]*|<supports-in-parens> [or <supports-in-parens>]*","supports-in-parens":"( <supports-condition> )|<supports-feature>|<general-enclosed>","supports-feature":"<supports-decl>|<supports-selector-fn>","supports-decl":"( <declaration> )","supports-selector-fn":"selector( <complex-selector> )",symbol:"<string>|<image>|<custom-ident>",target:"<target-counter()>|<target-counters()>|<target-text()>","target-counter()":"target-counter( [<string>|<url>] , <custom-ident> , <counter-style>? )","target-counters()":"target-counters( [<string>|<url>] , <custom-ident> , <string> , <counter-style>? )","target-text()":"target-text( [<string>|<url>] , [content|before|after|first-letter]? )","time-percentage":"<time>|<percentage>","timing-function":"linear|<cubic-bezier-timing-function>|<step-timing-function>","track-breadth":"<length-percentage>|<flex>|min-content|max-content|auto","track-list":"[<line-names>? [<track-size>|<track-repeat>]]+ <line-names>?","track-repeat":"repeat( [<positive-integer>] , [<line-names>? <track-size>]+ <line-names>? )","track-size":"<track-breadth>|minmax( <inflexible-breadth> , <track-breadth> )|fit-content( [<length>|<percentage>] )","transform-function":"<matrix()>|<translate()>|<translateX()>|<translateY()>|<scale()>|<scaleX()>|<scaleY()>|<rotate()>|<skew()>|<skewX()>|<skewY()>|<matrix3d()>|<translate3d()>|<translateZ()>|<scale3d()>|<scaleZ()>|<rotate3d()>|<rotateX()>|<rotateY()>|<rotateZ()>|<perspective()>","transform-list":"<transform-function>+","translate()":"translate( <length-percentage> , <length-percentage>? )","translate3d()":"translate3d( <length-percentage> , <length-percentage> , <length> )","translateX()":"translateX( <length-percentage> )","translateY()":"translateY( <length-percentage> )","translateZ()":"translateZ( <length> )","type-or-unit":"string|color|url|integer|number|length|angle|time|frequency|cap|ch|em|ex|ic|lh|rlh|rem|vb|vi|vw|vh|vmin|vmax|mm|Q|cm|in|pt|pc|px|deg|grad|rad|turn|ms|s|Hz|kHz|%","type-selector":"<wq-name>|<ns-prefix>? '*'","var()":"var( <custom-property-name> , <declaration-value>? )","viewport-length":"auto|<length-percentage>","wq-name":"<ns-prefix>? <ident-token>","-legacy-gradient":"<-webkit-gradient()>|<-legacy-linear-gradient>|<-legacy-repeating-linear-gradient>|<-legacy-radial-gradient>|<-legacy-repeating-radial-gradient>","-legacy-linear-gradient":"-moz-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-repeating-linear-gradient":"-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-linear-gradient-arguments":"[<angle>|<side-or-corner>]? , <color-stop-list>","-legacy-radial-gradient":"-moz-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-repeating-radial-gradient":"-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-radial-gradient-arguments":"[<position> ,]? [[[<-legacy-radial-gradient-shape>||<-legacy-radial-gradient-size>]|[<length>|<percentage>]{2}] ,]? <color-stop-list>","-legacy-radial-gradient-size":"closest-side|closest-corner|farthest-side|farthest-corner|contain|cover","-legacy-radial-gradient-shape":"circle|ellipse","-non-standard-font":"-apple-system-body|-apple-system-headline|-apple-system-subheadline|-apple-system-caption1|-apple-system-caption2|-apple-system-footnote|-apple-system-short-body|-apple-system-short-headline|-apple-system-short-subheadline|-apple-system-short-caption1|-apple-system-short-footnote|-apple-system-tall-body","-non-standard-color":"-moz-ButtonDefault|-moz-ButtonHoverFace|-moz-ButtonHoverText|-moz-CellHighlight|-moz-CellHighlightText|-moz-Combobox|-moz-ComboboxText|-moz-Dialog|-moz-DialogText|-moz-dragtargetzone|-moz-EvenTreeRow|-moz-Field|-moz-FieldText|-moz-html-CellHighlight|-moz-html-CellHighlightText|-moz-mac-accentdarkestshadow|-moz-mac-accentdarkshadow|-moz-mac-accentface|-moz-mac-accentlightesthighlight|-moz-mac-accentlightshadow|-moz-mac-accentregularhighlight|-moz-mac-accentregularshadow|-moz-mac-chrome-active|-moz-mac-chrome-inactive|-moz-mac-focusring|-moz-mac-menuselect|-moz-mac-menushadow|-moz-mac-menutextselect|-moz-MenuHover|-moz-MenuHoverText|-moz-MenuBarText|-moz-MenuBarHoverText|-moz-nativehyperlinktext|-moz-OddTreeRow|-moz-win-communicationstext|-moz-win-mediatext|-moz-activehyperlinktext|-moz-default-background-color|-moz-default-color|-moz-hyperlinktext|-moz-visitedhyperlinktext|-webkit-activelink|-webkit-focus-ring-color|-webkit-link|-webkit-text","-non-standard-image-rendering":"optimize-contrast|-moz-crisp-edges|-o-crisp-edges|-webkit-optimize-contrast","-non-standard-overflow":"-moz-scrollbars-none|-moz-scrollbars-horizontal|-moz-scrollbars-vertical|-moz-hidden-unscrollable","-non-standard-width":"fill-available|min-intrinsic|intrinsic|-moz-available|-moz-fit-content|-moz-min-content|-moz-max-content|-webkit-min-content|-webkit-max-content","-webkit-gradient()":"-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point>|, <-webkit-gradient-radius> , <-webkit-gradient-point>] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )","-webkit-gradient-color-stop":"from( <color> )|color-stop( [<number-zero-one>|<percentage>] , <color> )|to( <color> )","-webkit-gradient-point":"[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]","-webkit-gradient-radius":"<length>|<percentage>","-webkit-gradient-type":"linear|radial","-webkit-mask-box-repeat":"repeat|stretch|round","-webkit-mask-clip-style":"border|border-box|padding|padding-box|content|content-box|text","-ms-filter-function-list":"<-ms-filter-function>+","-ms-filter-function":"<-ms-filter-function-progid>|<-ms-filter-function-legacy>","-ms-filter-function-progid":"'progid:' [<ident-token> '.']* [<ident-token>|<function-token> <any-value>? )]","-ms-filter-function-legacy":"<ident-token>|<function-token> <any-value>? )","-ms-filter":"<string>",age:"child|young|old","attr-name":"<wq-name>","attr-fallback":"<any-value>","border-radius":"<length-percentage>{1,2}",bottom:"<length>|auto","generic-voice":"[<age>? <gender> <integer>?]",gender:"male|female|neutral",left:"<length>|auto","mask-image":"<mask-reference>#","name-repeat":"repeat( [<positive-integer>|auto-fill] , <line-names>+ )",paint:"none|<color>|<url> [none|<color>]?|context-fill|context-stroke","page-size":"A5|A4|A3|B5|B4|JIS-B5|JIS-B4|letter|legal|ledger",ratio:"<integer> / <integer>",right:"<length>|auto","svg-length":"<percentage>|<length>|<number>","svg-writing-mode":"lr-tb|rl-tb|tb-rl|lr|rl|tb",top:"<length>|auto","track-group":"'(' [<string>* <track-minmax> <string>*]+ ')' ['[' <positive-integer> ']']?|<track-minmax>","track-list-v0":"[<string>* <track-group> <string>*]+|none","track-minmax":"minmax( <track-breadth> , <track-breadth> )|auto|<track-breadth>|fit-content",x:"<number>",y:"<number>",declaration:"<ident-token> : <declaration-value>? ['!' important]?","declaration-list":"[<declaration>? ';']* <declaration>?",url:"url( <string> <url-modifier>* )|<url-token>","url-modifier":"<ident>|<function-token> <any-value> )","number-zero-one":"<number [0,1]>","number-one-or-greater":"<number [1,∞]>","positive-integer":"<integer [0,∞]>","-non-standard-display":"-ms-inline-flexbox|-ms-grid|-ms-inline-grid|-webkit-flex|-webkit-inline-flex|-webkit-box|-webkit-inline-box|-moz-inline-stack|-moz-box|-moz-inline-box"},properties:{"--*":"<declaration-value>","-ms-accelerator":"false|true","-ms-block-progression":"tb|rl|bt|lr","-ms-content-zoom-chaining":"none|chained","-ms-content-zooming":"none|zoom","-ms-content-zoom-limit":"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>","-ms-content-zoom-limit-max":"<percentage>","-ms-content-zoom-limit-min":"<percentage>","-ms-content-zoom-snap":"<'-ms-content-zoom-snap-type'>||<'-ms-content-zoom-snap-points'>","-ms-content-zoom-snap-points":"snapInterval( <percentage> , <percentage> )|snapList( <percentage># )","-ms-content-zoom-snap-type":"none|proximity|mandatory","-ms-filter":"<string>","-ms-flow-from":"[none|<custom-ident>]#","-ms-flow-into":"[none|<custom-ident>]#","-ms-grid-columns":"none|<track-list>|<auto-track-list>","-ms-grid-rows":"none|<track-list>|<auto-track-list>","-ms-high-contrast-adjust":"auto|none","-ms-hyphenate-limit-chars":"auto|<integer>{1,3}","-ms-hyphenate-limit-lines":"no-limit|<integer>","-ms-hyphenate-limit-zone":"<percentage>|<length>","-ms-ime-align":"auto|after","-ms-overflow-style":"auto|none|scrollbar|-ms-autohiding-scrollbar","-ms-scrollbar-3dlight-color":"<color>","-ms-scrollbar-arrow-color":"<color>","-ms-scrollbar-base-color":"<color>","-ms-scrollbar-darkshadow-color":"<color>","-ms-scrollbar-face-color":"<color>","-ms-scrollbar-highlight-color":"<color>","-ms-scrollbar-shadow-color":"<color>","-ms-scrollbar-track-color":"<color>","-ms-scroll-chaining":"chained|none","-ms-scroll-limit":"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>","-ms-scroll-limit-x-max":"auto|<length>","-ms-scroll-limit-x-min":"<length>","-ms-scroll-limit-y-max":"auto|<length>","-ms-scroll-limit-y-min":"<length>","-ms-scroll-rails":"none|railed","-ms-scroll-snap-points-x":"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )","-ms-scroll-snap-points-y":"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )","-ms-scroll-snap-type":"none|proximity|mandatory","-ms-scroll-snap-x":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>","-ms-scroll-snap-y":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>","-ms-scroll-translation":"none|vertical-to-horizontal","-ms-text-autospace":"none|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space","-ms-touch-select":"grippers|none","-ms-user-select":"none|element|text","-ms-wrap-flow":"auto|both|start|end|maximum|clear","-ms-wrap-margin":"<length>","-ms-wrap-through":"wrap|none","-moz-appearance":"none|button|button-arrow-down|button-arrow-next|button-arrow-previous|button-arrow-up|button-bevel|button-focus|caret|checkbox|checkbox-container|checkbox-label|checkmenuitem|dualbutton|groupbox|listbox|listitem|menuarrow|menubar|menucheckbox|menuimage|menuitem|menuitemtext|menulist|menulist-button|menulist-text|menulist-textfield|menupopup|menuradio|menuseparator|meterbar|meterchunk|progressbar|progressbar-vertical|progresschunk|progresschunk-vertical|radio|radio-container|radio-label|radiomenuitem|range|range-thumb|resizer|resizerpanel|scale-horizontal|scalethumbend|scalethumb-horizontal|scalethumbstart|scalethumbtick|scalethumb-vertical|scale-vertical|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|separator|sheet|spinner|spinner-downbutton|spinner-textfield|spinner-upbutton|splitter|statusbar|statusbarpanel|tab|tabpanel|tabpanels|tab-scroll-arrow-back|tab-scroll-arrow-forward|textfield|textfield-multiline|toolbar|toolbarbutton|toolbarbutton-dropdown|toolbargripper|toolbox|tooltip|treeheader|treeheadercell|treeheadersortarrow|treeitem|treeline|treetwisty|treetwistyopen|treeview|-moz-mac-unified-toolbar|-moz-win-borderless-glass|-moz-win-browsertabbar-toolbox|-moz-win-communicationstext|-moz-win-communications-toolbox|-moz-win-exclude-glass|-moz-win-glass|-moz-win-mediatext|-moz-win-media-toolbox|-moz-window-button-box|-moz-window-button-box-maximized|-moz-window-button-close|-moz-window-button-maximize|-moz-window-button-minimize|-moz-window-button-restore|-moz-window-frame-bottom|-moz-window-frame-left|-moz-window-frame-right|-moz-window-titlebar|-moz-window-titlebar-maximized","-moz-binding":"<url>|none","-moz-border-bottom-colors":"<color>+|none","-moz-border-left-colors":"<color>+|none","-moz-border-right-colors":"<color>+|none","-moz-border-top-colors":"<color>+|none","-moz-context-properties":"none|[fill|fill-opacity|stroke|stroke-opacity]#","-moz-float-edge":"border-box|content-box|margin-box|padding-box","-moz-force-broken-image-icon":"<integer [0,1]>","-moz-image-region":"<shape>|auto","-moz-orient":"inline|block|horizontal|vertical","-moz-outline-radius":"<outline-radius>{1,4} [/ <outline-radius>{1,4}]?","-moz-outline-radius-bottomleft":"<outline-radius>","-moz-outline-radius-bottomright":"<outline-radius>","-moz-outline-radius-topleft":"<outline-radius>","-moz-outline-radius-topright":"<outline-radius>","-moz-stack-sizing":"ignore|stretch-to-fit","-moz-text-blink":"none|blink","-moz-user-focus":"ignore|normal|select-after|select-before|select-menu|select-same|select-all|none","-moz-user-input":"auto|none|enabled|disabled","-moz-user-modify":"read-only|read-write|write-only","-moz-window-dragging":"drag|no-drag","-moz-window-shadow":"default|menu|tooltip|sheet|none","-webkit-appearance":"none|button|button-bevel|caps-lock-indicator|caret|checkbox|default-button|inner-spin-button|listbox|listitem|media-controls-background|media-controls-fullscreen-background|media-current-time-display|media-enter-fullscreen-button|media-exit-fullscreen-button|media-fullscreen-button|media-mute-button|media-overlay-play-button|media-play-button|media-seek-back-button|media-seek-forward-button|media-slider|media-sliderthumb|media-time-remaining-display|media-toggle-closed-captions-button|media-volume-slider|media-volume-slider-container|media-volume-sliderthumb|menulist|menulist-button|menulist-text|menulist-textfield|meter|progress-bar|progress-bar-value|push-button|radio|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbargripper-horizontal|scrollbargripper-vertical|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|searchfield-cancel-button|searchfield-decoration|searchfield-results-button|searchfield-results-decoration|slider-horizontal|slider-vertical|sliderthumb-horizontal|sliderthumb-vertical|square-button|textarea|textfield|-apple-pay-button","-webkit-border-before":"<'border-width'>||<'border-style'>||<'color'>","-webkit-border-before-color":"<'color'>","-webkit-border-before-style":"<'border-style'>","-webkit-border-before-width":"<'border-width'>","-webkit-box-reflect":"[above|below|right|left]? <length>? <image>?","-webkit-line-clamp":"none|<integer>","-webkit-mask":"[<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||[<box>|border|padding|content|text]||[<box>|border|padding|content]]#","-webkit-mask-attachment":"<attachment>#","-webkit-mask-clip":"[<box>|border|padding|content|text]#","-webkit-mask-composite":"<composite-style>#","-webkit-mask-image":"<mask-reference>#","-webkit-mask-origin":"[<box>|border|padding|content]#","-webkit-mask-position":"<position>#","-webkit-mask-position-x":"[<length-percentage>|left|center|right]#","-webkit-mask-position-y":"[<length-percentage>|top|center|bottom]#","-webkit-mask-repeat":"<repeat-style>#","-webkit-mask-repeat-x":"repeat|no-repeat|space|round","-webkit-mask-repeat-y":"repeat|no-repeat|space|round","-webkit-mask-size":"<bg-size>#","-webkit-overflow-scrolling":"auto|touch","-webkit-tap-highlight-color":"<color>","-webkit-text-fill-color":"<color>","-webkit-text-stroke":"<length>||<color>","-webkit-text-stroke-color":"<color>","-webkit-text-stroke-width":"<length>","-webkit-touch-callout":"default|none","-webkit-user-modify":"read-only|read-write|read-write-plaintext-only","align-content":"normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>","align-items":"normal|stretch|<baseline-position>|[<overflow-position>? <self-position>]","align-self":"auto|normal|stretch|<baseline-position>|<overflow-position>? <self-position>","align-tracks":"[normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>]#",all:"initial|inherit|unset|revert",animation:"<single-animation>#","animation-delay":"<time>#","animation-direction":"<single-animation-direction>#","animation-duration":"<time>#","animation-fill-mode":"<single-animation-fill-mode>#","animation-iteration-count":"<single-animation-iteration-count>#","animation-name":"[none|<keyframes-name>]#","animation-play-state":"<single-animation-play-state>#","animation-timing-function":"<timing-function>#",appearance:"none|auto|textfield|menulist-button|<compat-auto>","aspect-ratio":"auto|<ratio>",azimuth:"<angle>|[[left-side|far-left|left|center-left|center|center-right|right|far-right|right-side]||behind]|leftwards|rightwards","backdrop-filter":"none|<filter-function-list>","backface-visibility":"visible|hidden",background:"[<bg-layer> ,]* <final-bg-layer>","background-attachment":"<attachment>#","background-blend-mode":"<blend-mode>#","background-clip":"<box>#","background-color":"<color>","background-image":"<bg-image>#","background-origin":"<box>#","background-position":"<bg-position>#","background-position-x":"[center|[[left|right|x-start|x-end]? <length-percentage>?]!]#","background-position-y":"[center|[[top|bottom|y-start|y-end]? <length-percentage>?]!]#","background-repeat":"<repeat-style>#","background-size":"<bg-size>#","block-overflow":"clip|ellipsis|<string>","block-size":"<'width'>",border:"<line-width>||<line-style>||<color>","border-block":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-color":"<'border-top-color'>{1,2}","border-block-style":"<'border-top-style'>","border-block-width":"<'border-top-width'>","border-block-end":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-end-color":"<'border-top-color'>","border-block-end-style":"<'border-top-style'>","border-block-end-width":"<'border-top-width'>","border-block-start":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-start-color":"<'border-top-color'>","border-block-start-style":"<'border-top-style'>","border-block-start-width":"<'border-top-width'>","border-bottom":"<line-width>||<line-style>||<color>","border-bottom-color":"<'border-top-color'>","border-bottom-left-radius":"<length-percentage>{1,2}","border-bottom-right-radius":"<length-percentage>{1,2}","border-bottom-style":"<line-style>","border-bottom-width":"<line-width>","border-collapse":"collapse|separate","border-color":"<color>{1,4}","border-end-end-radius":"<length-percentage>{1,2}","border-end-start-radius":"<length-percentage>{1,2}","border-image":"<'border-image-source'>||<'border-image-slice'> [/ <'border-image-width'>|/ <'border-image-width'>? / <'border-image-outset'>]?||<'border-image-repeat'>","border-image-outset":"[<length>|<number>]{1,4}","border-image-repeat":"[stretch|repeat|round|space]{1,2}","border-image-slice":"<number-percentage>{1,4}&&fill?","border-image-source":"none|<image>","border-image-width":"[<length-percentage>|<number>|auto]{1,4}","border-inline":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-end":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-color":"<'border-top-color'>{1,2}","border-inline-style":"<'border-top-style'>","border-inline-width":"<'border-top-width'>","border-inline-end-color":"<'border-top-color'>","border-inline-end-style":"<'border-top-style'>","border-inline-end-width":"<'border-top-width'>","border-inline-start":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-start-color":"<'border-top-color'>","border-inline-start-style":"<'border-top-style'>","border-inline-start-width":"<'border-top-width'>","border-left":"<line-width>||<line-style>||<color>","border-left-color":"<color>","border-left-style":"<line-style>","border-left-width":"<line-width>","border-radius":"<length-percentage>{1,4} [/ <length-percentage>{1,4}]?","border-right":"<line-width>||<line-style>||<color>","border-right-color":"<color>","border-right-style":"<line-style>","border-right-width":"<line-width>","border-spacing":"<length> <length>?","border-start-end-radius":"<length-percentage>{1,2}","border-start-start-radius":"<length-percentage>{1,2}","border-style":"<line-style>{1,4}","border-top":"<line-width>||<line-style>||<color>","border-top-color":"<color>","border-top-left-radius":"<length-percentage>{1,2}","border-top-right-radius":"<length-percentage>{1,2}","border-top-style":"<line-style>","border-top-width":"<line-width>","border-width":"<line-width>{1,4}",bottom:"<length>|<percentage>|auto","box-align":"start|center|end|baseline|stretch","box-decoration-break":"slice|clone","box-direction":"normal|reverse|inherit","box-flex":"<number>","box-flex-group":"<integer>","box-lines":"single|multiple","box-ordinal-group":"<integer>","box-orient":"horizontal|vertical|inline-axis|block-axis|inherit","box-pack":"start|center|end|justify","box-shadow":"none|<shadow>#","box-sizing":"content-box|border-box","break-after":"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region","break-before":"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region","break-inside":"auto|avoid|avoid-page|avoid-column|avoid-region","caption-side":"top|bottom|block-start|block-end|inline-start|inline-end","caret-color":"auto|<color>",clear:"none|left|right|both|inline-start|inline-end",clip:"<shape>|auto","clip-path":"<clip-source>|[<basic-shape>||<geometry-box>]|none",color:"<color>","color-adjust":"economy|exact","column-count":"<integer>|auto","column-fill":"auto|balance|balance-all","column-gap":"normal|<length-percentage>","column-rule":"<'column-rule-width'>||<'column-rule-style'>||<'column-rule-color'>","column-rule-color":"<color>","column-rule-style":"<'border-style'>","column-rule-width":"<'border-width'>","column-span":"none|all","column-width":"<length>|auto",columns:"<'column-width'>||<'column-count'>",contain:"none|strict|content|[size||layout||style||paint]",content:"normal|none|[<content-replacement>|<content-list>] [/ <string>]?","counter-increment":"[<custom-ident> <integer>?]+|none","counter-reset":"[<custom-ident> <integer>?]+|none","counter-set":"[<custom-ident> <integer>?]+|none",cursor:"[[<url> [<x> <y>]? ,]* [auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|e-resize|n-resize|ne-resize|nw-resize|s-resize|se-resize|sw-resize|w-resize|ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize|row-resize|all-scroll|zoom-in|zoom-out|grab|grabbing|hand|-webkit-grab|-webkit-grabbing|-webkit-zoom-in|-webkit-zoom-out|-moz-grab|-moz-grabbing|-moz-zoom-in|-moz-zoom-out]]",direction:"ltr|rtl",display:"[<display-outside>||<display-inside>]|<display-listitem>|<display-internal>|<display-box>|<display-legacy>|<-non-standard-display>","empty-cells":"show|hide",filter:"none|<filter-function-list>|<-ms-filter-function-list>",flex:"none|[<'flex-grow'> <'flex-shrink'>?||<'flex-basis'>]","flex-basis":"content|<'width'>","flex-direction":"row|row-reverse|column|column-reverse","flex-flow":"<'flex-direction'>||<'flex-wrap'>","flex-grow":"<number>","flex-shrink":"<number>","flex-wrap":"nowrap|wrap|wrap-reverse",float:"left|right|none|inline-start|inline-end",font:"[[<'font-style'>||<font-variant-css21>||<'font-weight'>||<'font-stretch'>]? <'font-size'> [/ <'line-height'>]? <'font-family'>]|caption|icon|menu|message-box|small-caption|status-bar","font-family":"[<family-name>|<generic-family>]#","font-feature-settings":"normal|<feature-tag-value>#","font-kerning":"auto|normal|none","font-language-override":"normal|<string>","font-optical-sizing":"auto|none","font-variation-settings":"normal|[<string> <number>]#","font-size":"<absolute-size>|<relative-size>|<length-percentage>","font-size-adjust":"none|<number>","font-smooth":"auto|never|always|<absolute-size>|<length>","font-stretch":"<font-stretch-absolute>","font-style":"normal|italic|oblique <angle>?","font-synthesis":"none|[weight||style]","font-variant":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]","font-variant-alternates":"normal|[stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )]","font-variant-caps":"normal|small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps","font-variant-east-asian":"normal|[<east-asian-variant-values>||<east-asian-width-values>||ruby]","font-variant-ligatures":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>]","font-variant-numeric":"normal|[<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero]","font-variant-position":"normal|sub|super","font-weight":"<font-weight-absolute>|bolder|lighter",gap:"<'row-gap'> <'column-gap'>?",grid:"<'grid-template'>|<'grid-template-rows'> / [auto-flow&&dense?] <'grid-auto-columns'>?|[auto-flow&&dense?] <'grid-auto-rows'>? / <'grid-template-columns'>","grid-area":"<grid-line> [/ <grid-line>]{0,3}","grid-auto-columns":"<track-size>+","grid-auto-flow":"[row|column]||dense","grid-auto-rows":"<track-size>+","grid-column":"<grid-line> [/ <grid-line>]?","grid-column-end":"<grid-line>","grid-column-gap":"<length-percentage>","grid-column-start":"<grid-line>","grid-gap":"<'grid-row-gap'> <'grid-column-gap'>?","grid-row":"<grid-line> [/ <grid-line>]?","grid-row-end":"<grid-line>","grid-row-gap":"<length-percentage>","grid-row-start":"<grid-line>","grid-template":"none|[<'grid-template-rows'> / <'grid-template-columns'>]|[<line-names>? <string> <track-size>? <line-names>?]+ [/ <explicit-track-list>]?","grid-template-areas":"none|<string>+","grid-template-columns":"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?","grid-template-rows":"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?","hanging-punctuation":"none|[first||[force-end|allow-end]||last]",height:"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )",hyphens:"none|manual|auto","image-orientation":"from-image|<angle>|[<angle>? flip]","image-rendering":"auto|crisp-edges|pixelated|optimizeSpeed|optimizeQuality|<-non-standard-image-rendering>","image-resolution":"[from-image||<resolution>]&&snap?","ime-mode":"auto|normal|active|inactive|disabled","initial-letter":"normal|[<number> <integer>?]","initial-letter-align":"[auto|alphabetic|hanging|ideographic]","inline-size":"<'width'>",inset:"<'top'>{1,4}","inset-block":"<'top'>{1,2}","inset-block-end":"<'top'>","inset-block-start":"<'top'>","inset-inline":"<'top'>{1,2}","inset-inline-end":"<'top'>","inset-inline-start":"<'top'>",isolation:"auto|isolate","justify-content":"normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]","justify-items":"normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]|legacy|legacy&&[left|right|center]","justify-self":"auto|normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]","justify-tracks":"[normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]]#",left:"<length>|<percentage>|auto","letter-spacing":"normal|<length-percentage>","line-break":"auto|loose|normal|strict|anywhere","line-clamp":"none|<integer>","line-height":"normal|<number>|<length>|<percentage>","line-height-step":"<length>","list-style":"<'list-style-type'>||<'list-style-position'>||<'list-style-image'>","list-style-image":"<url>|none","list-style-position":"inside|outside","list-style-type":"<counter-style>|<string>|none",margin:"[<length>|<percentage>|auto]{1,4}","margin-block":"<'margin-left'>{1,2}","margin-block-end":"<'margin-left'>","margin-block-start":"<'margin-left'>","margin-bottom":"<length>|<percentage>|auto","margin-inline":"<'margin-left'>{1,2}","margin-inline-end":"<'margin-left'>","margin-inline-start":"<'margin-left'>","margin-left":"<length>|<percentage>|auto","margin-right":"<length>|<percentage>|auto","margin-top":"<length>|<percentage>|auto","margin-trim":"none|in-flow|all",mask:"<mask-layer>#","mask-border":"<'mask-border-source'>||<'mask-border-slice'> [/ <'mask-border-width'>? [/ <'mask-border-outset'>]?]?||<'mask-border-repeat'>||<'mask-border-mode'>","mask-border-mode":"luminance|alpha","mask-border-outset":"[<length>|<number>]{1,4}","mask-border-repeat":"[stretch|repeat|round|space]{1,2}","mask-border-slice":"<number-percentage>{1,4} fill?","mask-border-source":"none|<image>","mask-border-width":"[<length-percentage>|<number>|auto]{1,4}","mask-clip":"[<geometry-box>|no-clip]#","mask-composite":"<compositing-operator>#","mask-image":"<mask-reference>#","mask-mode":"<masking-mode>#","mask-origin":"<geometry-box>#","mask-position":"<position>#","mask-repeat":"<repeat-style>#","mask-size":"<bg-size>#","mask-type":"luminance|alpha","masonry-auto-flow":"[pack|next]||[definite-first|ordered]","math-style":"normal|compact","max-block-size":"<'max-width'>","max-height":"none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )","max-inline-size":"<'max-width'>","max-lines":"none|<integer>","max-width":"none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>","min-block-size":"<'min-width'>","min-height":"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )","min-inline-size":"<'min-width'>","min-width":"auto|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>","mix-blend-mode":"<blend-mode>","object-fit":"fill|contain|cover|none|scale-down","object-position":"<position>",offset:"[<'offset-position'>? [<'offset-path'> [<'offset-distance'>||<'offset-rotate'>]?]?]! [/ <'offset-anchor'>]?","offset-anchor":"auto|<position>","offset-distance":"<length-percentage>","offset-path":"none|ray( [<angle>&&<size>&&contain?] )|<path()>|<url>|[<basic-shape>||<geometry-box>]","offset-position":"auto|<position>","offset-rotate":"[auto|reverse]||<angle>",opacity:"<alpha-value>",order:"<integer>",orphans:"<integer>",outline:"[<'outline-color'>||<'outline-style'>||<'outline-width'>]","outline-color":"<color>|invert","outline-offset":"<length>","outline-style":"auto|<'border-style'>","outline-width":"<line-width>",overflow:"[visible|hidden|clip|scroll|auto]{1,2}|<-non-standard-overflow>","overflow-anchor":"auto|none","overflow-block":"visible|hidden|clip|scroll|auto","overflow-clip-box":"padding-box|content-box","overflow-inline":"visible|hidden|clip|scroll|auto","overflow-wrap":"normal|break-word|anywhere","overflow-x":"visible|hidden|clip|scroll|auto","overflow-y":"visible|hidden|clip|scroll|auto","overscroll-behavior":"[contain|none|auto]{1,2}","overscroll-behavior-block":"contain|none|auto","overscroll-behavior-inline":"contain|none|auto","overscroll-behavior-x":"contain|none|auto","overscroll-behavior-y":"contain|none|auto",padding:"[<length>|<percentage>]{1,4}","padding-block":"<'padding-left'>{1,2}","padding-block-end":"<'padding-left'>","padding-block-start":"<'padding-left'>","padding-bottom":"<length>|<percentage>","padding-inline":"<'padding-left'>{1,2}","padding-inline-end":"<'padding-left'>","padding-inline-start":"<'padding-left'>","padding-left":"<length>|<percentage>","padding-right":"<length>|<percentage>","padding-top":"<length>|<percentage>","page-break-after":"auto|always|avoid|left|right|recto|verso","page-break-before":"auto|always|avoid|left|right|recto|verso","page-break-inside":"auto|avoid","paint-order":"normal|[fill||stroke||markers]",perspective:"none|<length>","perspective-origin":"<position>","place-content":"<'align-content'> <'justify-content'>?","place-items":"<'align-items'> <'justify-items'>?","place-self":"<'align-self'> <'justify-self'>?","pointer-events":"auto|none|visiblePainted|visibleFill|visibleStroke|visible|painted|fill|stroke|all|inherit",position:"static|relative|absolute|sticky|fixed|-webkit-sticky",quotes:"none|auto|[<string> <string>]+",resize:"none|both|horizontal|vertical|block|inline",right:"<length>|<percentage>|auto",rotate:"none|<angle>|[x|y|z|<number>{3}]&&<angle>","row-gap":"normal|<length-percentage>","ruby-align":"start|center|space-between|space-around","ruby-merge":"separate|collapse|auto","ruby-position":"over|under|inter-character",scale:"none|<number>{1,3}","scrollbar-color":"auto|dark|light|<color>{2}","scrollbar-gutter":"auto|[stable|always]&&both?&&force?","scrollbar-width":"auto|thin|none","scroll-behavior":"auto|smooth","scroll-margin":"<length>{1,4}","scroll-margin-block":"<length>{1,2}","scroll-margin-block-start":"<length>","scroll-margin-block-end":"<length>","scroll-margin-bottom":"<length>","scroll-margin-inline":"<length>{1,2}","scroll-margin-inline-start":"<length>","scroll-margin-inline-end":"<length>","scroll-margin-left":"<length>","scroll-margin-right":"<length>","scroll-margin-top":"<length>","scroll-padding":"[auto|<length-percentage>]{1,4}","scroll-padding-block":"[auto|<length-percentage>]{1,2}","scroll-padding-block-start":"auto|<length-percentage>","scroll-padding-block-end":"auto|<length-percentage>","scroll-padding-bottom":"auto|<length-percentage>","scroll-padding-inline":"[auto|<length-percentage>]{1,2}","scroll-padding-inline-start":"auto|<length-percentage>","scroll-padding-inline-end":"auto|<length-percentage>","scroll-padding-left":"auto|<length-percentage>","scroll-padding-right":"auto|<length-percentage>","scroll-padding-top":"auto|<length-percentage>","scroll-snap-align":"[none|start|end|center]{1,2}","scroll-snap-coordinate":"none|<position>#","scroll-snap-destination":"<position>","scroll-snap-points-x":"none|repeat( <length-percentage> )","scroll-snap-points-y":"none|repeat( <length-percentage> )","scroll-snap-stop":"normal|always","scroll-snap-type":"none|[x|y|block|inline|both] [mandatory|proximity]?","scroll-snap-type-x":"none|mandatory|proximity","scroll-snap-type-y":"none|mandatory|proximity","shape-image-threshold":"<alpha-value>","shape-margin":"<length-percentage>","shape-outside":"none|<shape-box>||<basic-shape>|<image>","tab-size":"<integer>|<length>","table-layout":"auto|fixed","text-align":"start|end|left|right|center|justify|match-parent","text-align-last":"auto|start|end|left|right|center|justify","text-combine-upright":"none|all|[digits <integer>?]","text-decoration":"<'text-decoration-line'>||<'text-decoration-style'>||<'text-decoration-color'>||<'text-decoration-thickness'>","text-decoration-color":"<color>","text-decoration-line":"none|[underline||overline||line-through||blink]|spelling-error|grammar-error","text-decoration-skip":"none|[objects||[spaces|[leading-spaces||trailing-spaces]]||edges||box-decoration]","text-decoration-skip-ink":"auto|all|none","text-decoration-style":"solid|double|dotted|dashed|wavy","text-decoration-thickness":"auto|from-font|<length>|<percentage>","text-emphasis":"<'text-emphasis-style'>||<'text-emphasis-color'>","text-emphasis-color":"<color>","text-emphasis-position":"[over|under]&&[right|left]","text-emphasis-style":"none|[[filled|open]||[dot|circle|double-circle|triangle|sesame]]|<string>","text-indent":"<length-percentage>&&hanging?&&each-line?","text-justify":"auto|inter-character|inter-word|none","text-orientation":"mixed|upright|sideways","text-overflow":"[clip|ellipsis|<string>]{1,2}","text-rendering":"auto|optimizeSpeed|optimizeLegibility|geometricPrecision","text-shadow":"none|<shadow-t>#","text-size-adjust":"none|auto|<percentage>","text-transform":"none|capitalize|uppercase|lowercase|full-width|full-size-kana","text-underline-offset":"auto|<length>|<percentage>","text-underline-position":"auto|from-font|[under||[left|right]]",top:"<length>|<percentage>|auto","touch-action":"auto|none|[[pan-x|pan-left|pan-right]||[pan-y|pan-up|pan-down]||pinch-zoom]|manipulation",transform:"none|<transform-list>","transform-box":"content-box|border-box|fill-box|stroke-box|view-box","transform-origin":"[<length-percentage>|left|center|right|top|bottom]|[[<length-percentage>|left|center|right]&&[<length-percentage>|top|center|bottom]] <length>?","transform-style":"flat|preserve-3d",transition:"<single-transition>#","transition-delay":"<time>#","transition-duration":"<time>#","transition-property":"none|<single-transition-property>#","transition-timing-function":"<timing-function>#",translate:"none|<length-percentage> [<length-percentage> <length>?]?","unicode-bidi":"normal|embed|isolate|bidi-override|isolate-override|plaintext|-moz-isolate|-moz-isolate-override|-moz-plaintext|-webkit-isolate|-webkit-isolate-override|-webkit-plaintext","user-select":"auto|text|none|contain|all","vertical-align":"baseline|sub|super|text-top|text-bottom|middle|top|bottom|<percentage>|<length>",visibility:"visible|hidden|collapse","white-space":"normal|pre|nowrap|pre-wrap|pre-line|break-spaces",widows:"<integer>",width:"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )","will-change":"auto|<animateable-feature>#","word-break":"normal|break-all|keep-all|break-word","word-spacing":"normal|<length-percentage>","word-wrap":"normal|break-word","writing-mode":"horizontal-tb|vertical-rl|vertical-lr|sideways-rl|sideways-lr|<svg-writing-mode>","z-index":"auto|<integer>",zoom:"normal|reset|<number>|<percentage>","-moz-background-clip":"padding|border","-moz-border-radius-bottomleft":"<'border-bottom-left-radius'>","-moz-border-radius-bottomright":"<'border-bottom-right-radius'>","-moz-border-radius-topleft":"<'border-top-left-radius'>","-moz-border-radius-topright":"<'border-bottom-right-radius'>","-moz-control-character-visibility":"visible|hidden","-moz-osx-font-smoothing":"auto|grayscale","-moz-user-select":"none|text|all|-moz-none","-ms-flex-align":"start|end|center|baseline|stretch","-ms-flex-item-align":"auto|start|end|center|baseline|stretch","-ms-flex-line-pack":"start|end|center|justify|distribute|stretch","-ms-flex-negative":"<'flex-shrink'>","-ms-flex-pack":"start|end|center|justify|distribute","-ms-flex-order":"<integer>","-ms-flex-positive":"<'flex-grow'>","-ms-flex-preferred-size":"<'flex-basis'>","-ms-interpolation-mode":"nearest-neighbor|bicubic","-ms-grid-column-align":"start|end|center|stretch","-ms-grid-row-align":"start|end|center|stretch","-ms-hyphenate-limit-last":"none|always|column|page|spread","-webkit-background-clip":"[<box>|border|padding|content|text]#","-webkit-column-break-after":"always|auto|avoid","-webkit-column-break-before":"always|auto|avoid","-webkit-column-break-inside":"always|auto|avoid","-webkit-font-smoothing":"auto|none|antialiased|subpixel-antialiased","-webkit-mask-box-image":"[<url>|<gradient>|none] [<length-percentage>{4} <-webkit-mask-box-repeat>{2}]?","-webkit-print-color-adjust":"economy|exact","-webkit-text-security":"none|circle|disc|square","-webkit-user-drag":"none|element|auto","-webkit-user-select":"auto|none|text|all","alignment-baseline":"auto|baseline|before-edge|text-before-edge|middle|central|after-edge|text-after-edge|ideographic|alphabetic|hanging|mathematical","baseline-shift":"baseline|sub|super|<svg-length>",behavior:"<url>+","clip-rule":"nonzero|evenodd",cue:"<'cue-before'> <'cue-after'>?","cue-after":"<url> <decibel>?|none","cue-before":"<url> <decibel>?|none","dominant-baseline":"auto|use-script|no-change|reset-size|ideographic|alphabetic|hanging|mathematical|central|middle|text-after-edge|text-before-edge",fill:"<paint>","fill-opacity":"<number-zero-one>","fill-rule":"nonzero|evenodd","glyph-orientation-horizontal":"<angle>","glyph-orientation-vertical":"<angle>",kerning:"auto|<svg-length>",marker:"none|<url>","marker-end":"none|<url>","marker-mid":"none|<url>","marker-start":"none|<url>",pause:"<'pause-before'> <'pause-after'>?","pause-after":"<time>|none|x-weak|weak|medium|strong|x-strong","pause-before":"<time>|none|x-weak|weak|medium|strong|x-strong",rest:"<'rest-before'> <'rest-after'>?","rest-after":"<time>|none|x-weak|weak|medium|strong|x-strong","rest-before":"<time>|none|x-weak|weak|medium|strong|x-strong","shape-rendering":"auto|optimizeSpeed|crispEdges|geometricPrecision",src:"[<url> [format( <string># )]?|local( <family-name> )]#",speak:"auto|none|normal","speak-as":"normal|spell-out||digits||[literal-punctuation|no-punctuation]",stroke:"<paint>","stroke-dasharray":"none|[<svg-length>+]#","stroke-dashoffset":"<svg-length>","stroke-linecap":"butt|round|square","stroke-linejoin":"miter|round|bevel","stroke-miterlimit":"<number-one-or-greater>","stroke-opacity":"<number-zero-one>","stroke-width":"<svg-length>","text-anchor":"start|middle|end","unicode-range":"<urange>#","voice-balance":"<number>|left|center|right|leftwards|rightwards","voice-duration":"auto|<time>","voice-family":"[[<family-name>|<generic-voice>] ,]* [<family-name>|<generic-voice>]|preserve","voice-pitch":"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]","voice-range":"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]","voice-rate":"[normal|x-slow|slow|medium|fast|x-fast]||<percentage>","voice-stress":"normal|strong|moderate|none|reduced","voice-volume":"silent|[[x-soft|soft|medium|loud|x-loud]||<decibel>]"},atrules:{charset:{prelude:"<string>",descriptors:null},"counter-style":{prelude:"<counter-style-name>",descriptors:{"additive-symbols":"[<integer>&&<symbol>]#",fallback:"<counter-style-name>",negative:"<symbol> <symbol>?",pad:"<integer>&&<symbol>",prefix:"<symbol>",range:"[[<integer>|infinite]{2}]#|auto","speak-as":"auto|bullets|numbers|words|spell-out|<counter-style-name>",suffix:"<symbol>",symbols:"<symbol>+",system:"cyclic|numeric|alphabetic|symbolic|additive|[fixed <integer>?]|[extends <counter-style-name>]"}},document:{prelude:"[<url>|url-prefix( <string> )|domain( <string> )|media-document( <string> )|regexp( <string> )]#",descriptors:null},"font-face":{prelude:null,descriptors:{"font-display":"[auto|block|swap|fallback|optional]","font-family":"<family-name>","font-feature-settings":"normal|<feature-tag-value>#","font-variation-settings":"normal|[<string> <number>]#","font-stretch":"<font-stretch-absolute>{1,2}","font-style":"normal|italic|oblique <angle>{0,2}","font-weight":"<font-weight-absolute>{1,2}","font-variant":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]",src:"[<url> [format( <string># )]?|local( <family-name> )]#","unicode-range":"<urange>#"}},"font-feature-values":{prelude:"<family-name>#",descriptors:null},import:{prelude:"[<string>|<url>] [<media-query-list>]?",descriptors:null},keyframes:{prelude:"<keyframes-name>",descriptors:null},media:{prelude:"<media-query-list>",descriptors:null},namespace:{prelude:"<namespace-prefix>? [<string>|<url>]",descriptors:null},page:{prelude:"<page-selector-list>",descriptors:{bleed:"auto|<length>",marks:"none|[crop||cross]",size:"<length>{1,2}|auto|[<page-size>||[portrait|landscape]]"}},property:{prelude:"<custom-property-name>",descriptors:{syntax:"<string>",inherits:"true|false","initial-value":"<string>"}},supports:{prelude:"<supports-condition>",descriptors:null},viewport:{prelude:null,descriptors:{height:"<viewport-length>{1,2}","max-height":"<viewport-length>","max-width":"<viewport-length>","max-zoom":"auto|<number>|<percentage>","min-height":"<viewport-length>","min-width":"<viewport-length>","min-zoom":"auto|<number>|<percentage>",orientation:"auto|portrait|landscape","user-zoom":"zoom|fixed","viewport-fit":"auto|contain|cover",width:"<viewport-length>{1,2}",zoom:"auto|<number>|<percentage>"}}}},Rr=Ce.cmpChar,Mr=Ce.isDigit,jr=Ce.TYPE,_r=jr.WhiteSpace,Fr=jr.Comment,Wr=jr.Ident,qr=jr.Number,Yr=jr.Dimension;function Ur(e,t){var n=this.scanner.tokenStart+e,r=this.scanner.source.charCodeAt(n);for(43!==r&&45!==r||(t&&this.error("Number sign is not allowed"),n++);n<this.scanner.tokenEnd;n++)Mr(this.scanner.source.charCodeAt(n))||this.error("Integer is expected",n)}function Hr(e){return Ur.call(this,0,e)}function Vr(e,t){if(!Rr(this.scanner.source,this.scanner.tokenStart+e,t)){var n="";switch(t){case 110:n="N is expected";break;case 45:n="HyphenMinus is expected"}this.error(n,this.scanner.tokenStart+e)}}function Kr(){for(var e=0,t=0,n=this.scanner.tokenType;n===_r||n===Fr;)n=this.scanner.lookupType(++e);if(n!==qr){if(!this.scanner.isDelim(43,e)&&!this.scanner.isDelim(45,e))return null;t=this.scanner.isDelim(43,e)?43:45;do{n=this.scanner.lookupType(++e)}while(n===_r||n===Fr);n!==qr&&(this.scanner.skip(e),Hr.call(this,!0))}return e>0&&this.scanner.skip(e),0===t&&43!==(n=this.scanner.source.charCodeAt(this.scanner.tokenStart))&&45!==n&&this.error("Number sign is expected"),Hr.call(this,0!==t),45===t?"-"+this.consume(qr):this.consume(qr)}var Gr={name:"AnPlusB",structure:{a:[String,null],b:[String,null]},parse:function(){var e=this.scanner.tokenStart,t=null,n=null;if(this.scanner.tokenType===qr)Hr.call(this,!1),n=this.consume(qr);else if(this.scanner.tokenType===Wr&&Rr(this.scanner.source,this.scanner.tokenStart,45))switch(t="-1",Vr.call(this,1,110),this.scanner.getTokenLength()){case 2:this.scanner.next(),n=Kr.call(this);break;case 3:Vr.call(this,2,45),this.scanner.next(),this.scanner.skipSC(),Hr.call(this,!0),n="-"+this.consume(qr);break;default:Vr.call(this,2,45),Ur.call(this,3,!0),this.scanner.next(),n=this.scanner.substrToCursor(e+2)}else if(this.scanner.tokenType===Wr||this.scanner.isDelim(43)&&this.scanner.lookupType(1)===Wr){var r=0;switch(t="1",this.scanner.isDelim(43)&&(r=1,this.scanner.next()),Vr.call(this,0,110),this.scanner.getTokenLength()){case 1:this.scanner.next(),n=Kr.call(this);break;case 2:Vr.call(this,1,45),this.scanner.next(),this.scanner.skipSC(),Hr.call(this,!0),n="-"+this.consume(qr);break;default:Vr.call(this,1,45),Ur.call(this,2,!0),this.scanner.next(),n=this.scanner.substrToCursor(e+r+1)}}else if(this.scanner.tokenType===Yr){for(var i=this.scanner.source.charCodeAt(this.scanner.tokenStart),a=(r=43===i||45===i,this.scanner.tokenStart+r);a<this.scanner.tokenEnd&&Mr(this.scanner.source.charCodeAt(a));a++);a===this.scanner.tokenStart+r&&this.error("Integer is expected",this.scanner.tokenStart+r),Vr.call(this,a-this.scanner.tokenStart,110),t=this.scanner.source.substring(e,a),a+1===this.scanner.tokenEnd?(this.scanner.next(),n=Kr.call(this)):(Vr.call(this,a-this.scanner.tokenStart+1,45),a+2===this.scanner.tokenEnd?(this.scanner.next(),this.scanner.skipSC(),Hr.call(this,!0),n="-"+this.consume(qr)):(Ur.call(this,a-this.scanner.tokenStart+2,!0),this.scanner.next(),n=this.scanner.substrToCursor(a+1)))}else this.error();return null!==t&&43===t.charCodeAt(0)&&(t=t.substr(1)),null!==n&&43===n.charCodeAt(0)&&(n=n.substr(1)),{type:"AnPlusB",loc:this.getLocation(e,this.scanner.tokenStart),a:t,b:n}},generate:function(e){var t=null!==e.a&&void 0!==e.a,n=null!==e.b&&void 0!==e.b;t?(this.chunk("+1"===e.a?"+n":"1"===e.a?"n":"-1"===e.a?"-n":e.a+"n"),n&&("-"===(n=String(e.b)).charAt(0)||"+"===n.charAt(0)?(this.chunk(n.charAt(0)),this.chunk(n.substr(1))):(this.chunk("+"),this.chunk(n)))):this.chunk(String(e.b))}},Qr=Ce.TYPE,Xr=Qr.WhiteSpace,Zr=Qr.Semicolon,$r=Qr.LeftCurlyBracket,Jr=Qr.Delim;function ei(){return this.scanner.tokenIndex>0&&this.scanner.lookupType(-1)===Xr?this.scanner.tokenIndex>1?this.scanner.getTokenStart(this.scanner.tokenIndex-1):this.scanner.firstCharOffset:this.scanner.tokenStart}function ti(){return 0}var ni={name:"Raw",structure:{value:String},parse:function(e,t,n){var r,i=this.scanner.getTokenStart(e);return this.scanner.skip(this.scanner.getRawLength(e,t||ti)),r=n&&this.scanner.tokenStart>i?ei.call(this):this.scanner.tokenStart,{type:"Raw",loc:this.getLocation(i,r),value:this.scanner.source.substring(i,r)}},generate:function(e){this.chunk(e.value)},mode:{default:ti,leftCurlyBracket:function(e){return e===$r?1:0},leftCurlyBracketOrSemicolon:function(e){return e===$r||e===Zr?1:0},exclamationMarkOrSemicolon:function(e,t,n){return e===Jr&&33===t.charCodeAt(n)||e===Zr?1:0},semicolonIncluded:function(e){return e===Zr?2:0}}},ri=Ce.TYPE,ii=ni.mode,ai=ri.AtKeyword,oi=ri.Semicolon,si=ri.LeftCurlyBracket,li=ri.RightCurlyBracket;function ci(e){return this.Raw(e,ii.leftCurlyBracketOrSemicolon,!0)}function ui(){for(var e,t=1;e=this.scanner.lookupType(t);t++){if(e===li)return!0;if(e===si||e===ai)return!1}return!1}var hi={name:"Atrule",structure:{name:String,prelude:["AtrulePrelude","Raw",null],block:["Block",null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null,i=null;switch(this.eat(ai),t=(e=this.scanner.substrToCursor(n+1)).toLowerCase(),this.scanner.skipSC(),!1===this.scanner.eof&&this.scanner.tokenType!==si&&this.scanner.tokenType!==oi&&(this.parseAtrulePrelude?"AtrulePrelude"===(r=this.parseWithFallback(this.AtrulePrelude.bind(this,e),ci)).type&&null===r.children.head&&(r=null):r=ci.call(this,this.scanner.tokenIndex),this.scanner.skipSC()),this.scanner.tokenType){case oi:this.scanner.next();break;case si:i=this.atrule.hasOwnProperty(t)&&"function"==typeof this.atrule[t].block?this.atrule[t].block.call(this):this.Block(ui.call(this))}return{type:"Atrule",loc:this.getLocation(n,this.scanner.tokenStart),name:e,prelude:r,block:i}},generate:function(e){this.chunk("@"),this.chunk(e.name),null!==e.prelude&&(this.chunk(" "),this.node(e.prelude)),e.block?this.node(e.block):this.chunk(";")},walkContext:"atrule"},pi=Ce.TYPE,di=pi.Semicolon,mi=pi.LeftCurlyBracket,gi={name:"AtrulePrelude",structure:{children:[[]]},parse:function(e){var t=null;return null!==e&&(e=e.toLowerCase()),this.scanner.skipSC(),t=this.atrule.hasOwnProperty(e)&&"function"==typeof this.atrule[e].prelude?this.atrule[e].prelude.call(this):this.readSequence(this.scope.AtrulePrelude),this.scanner.skipSC(),!0!==this.scanner.eof&&this.scanner.tokenType!==mi&&this.scanner.tokenType!==di&&this.error("Semicolon or block is expected"),null===t&&(t=this.createList()),{type:"AtrulePrelude",loc:this.getLocationFromList(t),children:t}},generate:function(e){this.children(e)},walkContext:"atrulePrelude"},fi=Ce.TYPE,bi=fi.Ident,yi=fi.String,ki=fi.Colon,vi=fi.LeftSquareBracket,xi=fi.RightSquareBracket;function wi(){this.scanner.eof&&this.error("Unexpected end of input");var e=this.scanner.tokenStart,t=!1,n=!0;return this.scanner.isDelim(42)?(t=!0,n=!1,this.scanner.next()):this.scanner.isDelim(124)||this.eat(bi),this.scanner.isDelim(124)?61!==this.scanner.source.charCodeAt(this.scanner.tokenStart+1)?(this.scanner.next(),this.eat(bi)):t&&this.error("Identifier is expected",this.scanner.tokenEnd):t&&this.error("Vertical line is expected"),n&&this.scanner.tokenType===ki&&(this.scanner.next(),this.eat(bi)),{type:"Identifier",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}}function Si(){var e=this.scanner.tokenStart,t=this.scanner.source.charCodeAt(e);return 61!==t&&126!==t&&94!==t&&36!==t&&42!==t&&124!==t&&this.error("Attribute selector (=, ~=, ^=, $=, *=, |=) is expected"),this.scanner.next(),61!==t&&(this.scanner.isDelim(61)||this.error("Equal sign is expected"),this.scanner.next()),this.scanner.substrToCursor(e)}var Ci={name:"AttributeSelector",structure:{name:"Identifier",matcher:[String,null],value:["String","Identifier",null],flags:[String,null]},parse:function(){var e,t=this.scanner.tokenStart,n=null,r=null,i=null;return this.eat(vi),this.scanner.skipSC(),e=wi.call(this),this.scanner.skipSC(),this.scanner.tokenType!==xi&&(this.scanner.tokenType!==bi&&(n=Si.call(this),this.scanner.skipSC(),r=this.scanner.tokenType===yi?this.String():this.Identifier(),this.scanner.skipSC()),this.scanner.tokenType===bi&&(i=this.scanner.getTokenValue(),this.scanner.next(),this.scanner.skipSC())),this.eat(xi),{type:"AttributeSelector",loc:this.getLocation(t,this.scanner.tokenStart),name:e,matcher:n,value:r,flags:i}},generate:function(e){var t=" ";this.chunk("["),this.node(e.name),null!==e.matcher&&(this.chunk(e.matcher),null!==e.value&&(this.node(e.value),"String"===e.value.type&&(t=""))),null!==e.flags&&(this.chunk(t),this.chunk(e.flags)),this.chunk("]")}},zi=Ce.TYPE,Ai=ni.mode,Pi=zi.WhiteSpace,Ti=zi.Comment,Li=zi.Semicolon,Ei=zi.AtKeyword,Di=zi.LeftCurlyBracket,Oi=zi.RightCurlyBracket;function Bi(e){return this.Raw(e,null,!0)}function Ii(){return this.parseWithFallback(this.Rule,Bi)}function Ni(e){return this.Raw(e,Ai.semicolonIncluded,!0)}function Ri(){if(this.scanner.tokenType===Li)return Ni.call(this,this.scanner.tokenIndex);var e=this.parseWithFallback(this.Declaration,Ni);return this.scanner.tokenType===Li&&this.scanner.next(),e}var Mi={name:"Block",structure:{children:[["Atrule","Rule","Declaration"]]},parse:function(e){var t=e?Ri:Ii,n=this.scanner.tokenStart,r=this.createList();this.eat(Di);e:for(;!this.scanner.eof;)switch(this.scanner.tokenType){case Oi:break e;case Pi:case Ti:this.scanner.next();break;case Ei:r.push(this.parseWithFallback(this.Atrule,Bi));break;default:r.push(t.call(this))}return this.scanner.eof||this.eat(Oi),{type:"Block",loc:this.getLocation(n,this.scanner.tokenStart),children:r}},generate:function(e){this.chunk("{"),this.children(e,(function(e){"Declaration"===e.type&&this.chunk(";")})),this.chunk("}")},walkContext:"block"},ji=Ce.TYPE,_i=ji.LeftSquareBracket,Fi=ji.RightSquareBracket,Wi={name:"Brackets",structure:{children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart;return this.eat(_i),n=e.call(this,t),this.scanner.eof||this.eat(Fi),{type:"Brackets",loc:this.getLocation(r,this.scanner.tokenStart),children:n}},generate:function(e){this.chunk("["),this.children(e),this.chunk("]")}},qi=Ce.TYPE.CDC,Yi={name:"CDC",structure:[],parse:function(){var e=this.scanner.tokenStart;return this.eat(qi),{type:"CDC",loc:this.getLocation(e,this.scanner.tokenStart)}},generate:function(){this.chunk("--\x3e")}},Ui=Ce.TYPE.CDO,Hi={name:"CDO",structure:[],parse:function(){var e=this.scanner.tokenStart;return this.eat(Ui),{type:"CDO",loc:this.getLocation(e,this.scanner.tokenStart)}},generate:function(){this.chunk("\x3c!--")}},Vi=Ce.TYPE.Ident,Ki={name:"ClassSelector",structure:{name:String},parse:function(){return this.scanner.isDelim(46)||this.error("Full stop is expected"),this.scanner.next(),{type:"ClassSelector",loc:this.getLocation(this.scanner.tokenStart-1,this.scanner.tokenEnd),name:this.consume(Vi)}},generate:function(e){this.chunk("."),this.chunk(e.name)}},Gi=Ce.TYPE.Ident,Qi={name:"Combinator",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 62:case 43:case 126:this.scanner.next();break;case 47:this.scanner.next(),this.scanner.tokenType===Gi&&!1!==this.scanner.lookupValue(0,"deep")||this.error("Identifier `deep` is expected"),this.scanner.next(),this.scanner.isDelim(47)||this.error("Solidus is expected"),this.scanner.next();break;default:this.error("Combinator is expected")}return{type:"Combinator",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.name)}},Xi=Ce.TYPE.Comment,Zi={name:"Comment",structure:{value:String},parse:function(){var e=this.scanner.tokenStart,t=this.scanner.tokenEnd;return this.eat(Xi),t-e+2>=2&&42===this.scanner.source.charCodeAt(t-2)&&47===this.scanner.source.charCodeAt(t-1)&&(t-=2),{type:"Comment",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e+2,t)}},generate:function(e){this.chunk("/*"),this.chunk(e.value),this.chunk("*/")}},$i=ae.isCustomProperty,Ji=Ce.TYPE,ea=ni.mode,ta=Ji.Ident,na=Ji.Hash,ra=Ji.Colon,ia=Ji.Semicolon,aa=Ji.Delim,oa=Ji.WhiteSpace;function sa(e){return this.Raw(e,ea.exclamationMarkOrSemicolon,!0)}function la(e){return this.Raw(e,ea.exclamationMarkOrSemicolon,!1)}function ca(){var e=this.scanner.tokenIndex,t=this.Value();return"Raw"!==t.type&&!1===this.scanner.eof&&this.scanner.tokenType!==ia&&!1===this.scanner.isDelim(33)&&!1===this.scanner.isBalanceEdge(e)&&this.error(),t}var ua={name:"Declaration",structure:{important:[Boolean,String],property:String,value:["Value","Raw"]},parse:function(){var e,t=this.scanner.tokenStart,n=this.scanner.tokenIndex,r=ha.call(this),i=$i(r),a=i?this.parseCustomProperty:this.parseValue,o=i?la:sa,s=!1;this.scanner.skipSC(),this.eat(ra);const l=this.scanner.tokenIndex;if(i||this.scanner.skipSC(),e=a?this.parseWithFallback(ca,o):o.call(this,this.scanner.tokenIndex),i&&"Value"===e.type&&e.children.isEmpty())for(let t=l-this.scanner.tokenIndex;t<=0;t++)if(this.scanner.lookupType(t)===oa){e.children.appendData({type:"WhiteSpace",loc:null,value:" "});break}return this.scanner.isDelim(33)&&(s=pa.call(this),this.scanner.skipSC()),!1===this.scanner.eof&&this.scanner.tokenType!==ia&&!1===this.scanner.isBalanceEdge(n)&&this.error(),{type:"Declaration",loc:this.getLocation(t,this.scanner.tokenStart),important:s,property:r,value:e}},generate:function(e){this.chunk(e.property),this.chunk(":"),this.node(e.value),e.important&&this.chunk(!0===e.important?"!important":"!"+e.important)},walkContext:"declaration"};function ha(){var e=this.scanner.tokenStart;if(this.scanner.tokenType===aa)switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 42:case 36:case 43:case 35:case 38:this.scanner.next();break;case 47:this.scanner.next(),this.scanner.isDelim(47)&&this.scanner.next()}return this.scanner.tokenType===na?this.eat(na):this.eat(ta),this.scanner.substrToCursor(e)}function pa(){this.eat(aa),this.scanner.skipSC();var e=this.consume(ta);return"important"===e||e}var da=Ce.TYPE,ma=ni.mode,ga=da.WhiteSpace,fa=da.Comment,ba=da.Semicolon;function ya(e){return this.Raw(e,ma.semicolonIncluded,!0)}var ka={name:"DeclarationList",structure:{children:[["Declaration"]]},parse:function(){for(var e=this.createList();!this.scanner.eof;)switch(this.scanner.tokenType){case ga:case fa:case ba:this.scanner.next();break;default:e.push(this.parseWithFallback(this.Declaration,ya))}return{type:"DeclarationList",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e,(function(e){"Declaration"===e.type&&this.chunk(";")}))}},va=M.consumeNumber,xa=Ce.TYPE.Dimension,wa={name:"Dimension",structure:{value:String,unit:String},parse:function(){var e=this.scanner.tokenStart,t=va(this.scanner.source,e);return this.eat(xa),{type:"Dimension",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e,t),unit:this.scanner.source.substring(t,this.scanner.tokenStart)}},generate:function(e){this.chunk(e.value),this.chunk(e.unit)}},Sa=Ce.TYPE.RightParenthesis,Ca={name:"Function",structure:{name:String,children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart,i=this.consumeFunctionName(),a=i.toLowerCase();return n=t.hasOwnProperty(a)?t[a].call(this,t):e.call(this,t),this.scanner.eof||this.eat(Sa),{type:"Function",loc:this.getLocation(r,this.scanner.tokenStart),name:i,children:n}},generate:function(e){this.chunk(e.name),this.chunk("("),this.children(e),this.chunk(")")},walkContext:"function"},za=Ce.TYPE.Hash,Aa={name:"Hash",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return this.eat(za),{type:"Hash",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e+1)}},generate:function(e){this.chunk("#"),this.chunk(e.value)}},Pa=Ce.TYPE.Ident,Ta={name:"Identifier",structure:{name:String},parse:function(){return{type:"Identifier",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),name:this.consume(Pa)}},generate:function(e){this.chunk(e.name)}},La=Ce.TYPE.Hash,Ea={name:"IdSelector",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;return this.eat(La),{type:"IdSelector",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e+1)}},generate:function(e){this.chunk("#"),this.chunk(e.name)}},Da=Ce.TYPE,Oa=Da.Ident,Ba=Da.Number,Ia=Da.Dimension,Na=Da.LeftParenthesis,Ra=Da.RightParenthesis,Ma=Da.Colon,ja=Da.Delim,_a={name:"MediaFeature",structure:{name:String,value:["Identifier","Number","Dimension","Ratio",null]},parse:function(){var e,t=this.scanner.tokenStart,n=null;if(this.eat(Na),this.scanner.skipSC(),e=this.consume(Oa),this.scanner.skipSC(),this.scanner.tokenType!==Ra){switch(this.eat(Ma),this.scanner.skipSC(),this.scanner.tokenType){case Ba:n=this.lookupNonWSType(1)===ja?this.Ratio():this.Number();break;case Ia:n=this.Dimension();break;case Oa:n=this.Identifier();break;default:this.error("Number, dimension, ratio or identifier is expected")}this.scanner.skipSC()}return this.eat(Ra),{type:"MediaFeature",loc:this.getLocation(t,this.scanner.tokenStart),name:e,value:n}},generate:function(e){this.chunk("("),this.chunk(e.name),null!==e.value&&(this.chunk(":"),this.node(e.value)),this.chunk(")")}},Fa=Ce.TYPE,Wa=Fa.WhiteSpace,qa=Fa.Comment,Ya=Fa.Ident,Ua=Fa.LeftParenthesis,Ha={name:"MediaQuery",structure:{children:[["Identifier","MediaFeature","WhiteSpace"]]},parse:function(){this.scanner.skipSC();var e=this.createList(),t=null,n=null;e:for(;!this.scanner.eof;){switch(this.scanner.tokenType){case qa:this.scanner.next();continue;case Wa:n=this.WhiteSpace();continue;case Ya:t=this.Identifier();break;case Ua:t=this.MediaFeature();break;default:break e}null!==n&&(e.push(n),n=null),e.push(t)}return null===t&&this.error("Identifier or parenthesis is expected"),{type:"MediaQuery",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e)}},Va=Ce.TYPE.Comma,Ka={name:"MediaQueryList",structure:{children:[["MediaQuery"]]},parse:function(e){var t=this.createList();for(this.scanner.skipSC();!this.scanner.eof&&(t.push(this.MediaQuery(e)),this.scanner.tokenType===Va);)this.scanner.next();return{type:"MediaQueryList",loc:this.getLocationFromList(t),children:t}},generate:function(e){this.children(e,(function(){this.chunk(",")}))}},Ga=Ce.TYPE.Number,Qa={name:"Number",structure:{value:String},parse:function(){return{type:"Number",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),value:this.consume(Ga)}},generate:function(e){this.chunk(e.value)}},Xa={name:"Operator",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return this.scanner.next(),{type:"Operator",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.value)}},Za=Ce.TYPE,$a=Za.LeftParenthesis,Ja=Za.RightParenthesis,eo={name:"Parentheses",structure:{children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart;return this.eat($a),n=e.call(this,t),this.scanner.eof||this.eat(Ja),{type:"Parentheses",loc:this.getLocation(r,this.scanner.tokenStart),children:n}},generate:function(e){this.chunk("("),this.children(e),this.chunk(")")}},to=M.consumeNumber,no=Ce.TYPE.Percentage,ro={name:"Percentage",structure:{value:String},parse:function(){var e=this.scanner.tokenStart,t=to(this.scanner.source,e);return this.eat(no),{type:"Percentage",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e,t)}},generate:function(e){this.chunk(e.value),this.chunk("%")}},io=Ce.TYPE,ao=io.Ident,oo=io.Function,so=io.Colon,lo=io.RightParenthesis,co={name:"PseudoClassSelector",structure:{name:String,children:[["Raw"],null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null;return this.eat(so),this.scanner.tokenType===oo?(t=(e=this.consumeFunctionName()).toLowerCase(),this.pseudo.hasOwnProperty(t)?(this.scanner.skipSC(),r=this.pseudo[t].call(this),this.scanner.skipSC()):(r=this.createList()).push(this.Raw(this.scanner.tokenIndex,null,!1)),this.eat(lo)):e=this.consume(ao),{type:"PseudoClassSelector",loc:this.getLocation(n,this.scanner.tokenStart),name:e,children:r}},generate:function(e){this.chunk(":"),this.chunk(e.name),null!==e.children&&(this.chunk("("),this.children(e),this.chunk(")"))},walkContext:"function"},uo=Ce.TYPE,ho=uo.Ident,po=uo.Function,mo=uo.Colon,go=uo.RightParenthesis,fo={name:"PseudoElementSelector",structure:{name:String,children:[["Raw"],null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null;return this.eat(mo),this.eat(mo),this.scanner.tokenType===po?(t=(e=this.consumeFunctionName()).toLowerCase(),this.pseudo.hasOwnProperty(t)?(this.scanner.skipSC(),r=this.pseudo[t].call(this),this.scanner.skipSC()):(r=this.createList()).push(this.Raw(this.scanner.tokenIndex,null,!1)),this.eat(go)):e=this.consume(ho),{type:"PseudoElementSelector",loc:this.getLocation(n,this.scanner.tokenStart),name:e,children:r}},generate:function(e){this.chunk("::"),this.chunk(e.name),null!==e.children&&(this.chunk("("),this.children(e),this.chunk(")"))},walkContext:"function"},bo=Ce.isDigit,yo=Ce.TYPE,ko=yo.Number,vo=yo.Delim;function xo(){this.scanner.skipWS();for(var e=this.consume(ko),t=0;t<e.length;t++){var n=e.charCodeAt(t);bo(n)||46===n||this.error("Unsigned number is expected",this.scanner.tokenStart-e.length+t)}return 0===Number(e)&&this.error("Zero number is not allowed",this.scanner.tokenStart-e.length),e}var wo={name:"Ratio",structure:{left:String,right:String},parse:function(){var e,t=this.scanner.tokenStart,n=xo.call(this);return this.scanner.skipWS(),this.scanner.isDelim(47)||this.error("Solidus is expected"),this.eat(vo),e=xo.call(this),{type:"Ratio",loc:this.getLocation(t,this.scanner.tokenStart),left:n,right:e}},generate:function(e){this.chunk(e.left),this.chunk("/"),this.chunk(e.right)}},So=Ce.TYPE,Co=ni.mode,zo=So.LeftCurlyBracket;function Ao(e){return this.Raw(e,Co.leftCurlyBracket,!0)}function Po(){var e=this.SelectorList();return"Raw"!==e.type&&!1===this.scanner.eof&&this.scanner.tokenType!==zo&&this.error(),e}var To={name:"Rule",structure:{prelude:["SelectorList","Raw"],block:["Block"]},parse:function(){var e,t,n=this.scanner.tokenIndex,r=this.scanner.tokenStart;return e=this.parseRulePrelude?this.parseWithFallback(Po,Ao):Ao.call(this,n),t=this.Block(!0),{type:"Rule",loc:this.getLocation(r,this.scanner.tokenStart),prelude:e,block:t}},generate:function(e){this.node(e.prelude),this.node(e.block)},walkContext:"rule"},Lo=Ce.TYPE.Comma,Eo={name:"SelectorList",structure:{children:[["Selector","Raw"]]},parse:function(){for(var e=this.createList();!this.scanner.eof&&(e.push(this.Selector()),this.scanner.tokenType===Lo);)this.scanner.next();return{type:"SelectorList",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e,(function(){this.chunk(",")}))},walkContext:"selector"},Do=Ce.TYPE.String,Oo={name:"String",structure:{value:String},parse:function(){return{type:"String",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),value:this.consume(Do)}},generate:function(e){this.chunk(e.value)}},Bo=Ce.TYPE,Io=Bo.WhiteSpace,No=Bo.Comment,Ro=Bo.AtKeyword,Mo=Bo.CDO,jo=Bo.CDC;function _o(e){return this.Raw(e,null,!1)}var Fo={name:"StyleSheet",structure:{children:[["Comment","CDO","CDC","Atrule","Rule","Raw"]]},parse:function(){for(var e,t=this.scanner.tokenStart,n=this.createList();!this.scanner.eof;){switch(this.scanner.tokenType){case Io:this.scanner.next();continue;case No:if(33!==this.scanner.source.charCodeAt(this.scanner.tokenStart+2)){this.scanner.next();continue}e=this.Comment();break;case Mo:e=this.CDO();break;case jo:e=this.CDC();break;case Ro:e=this.parseWithFallback(this.Atrule,_o);break;default:e=this.parseWithFallback(this.Rule,_o)}n.push(e)}return{type:"StyleSheet",loc:this.getLocation(t,this.scanner.tokenStart),children:n}},generate:function(e){this.children(e)},walkContext:"stylesheet"},Wo=Ce.TYPE.Ident;function qo(){this.scanner.tokenType!==Wo&&!1===this.scanner.isDelim(42)&&this.error("Identifier or asterisk is expected"),this.scanner.next()}var Yo={name:"TypeSelector",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;return this.scanner.isDelim(124)?(this.scanner.next(),qo.call(this)):(qo.call(this),this.scanner.isDelim(124)&&(this.scanner.next(),qo.call(this))),{type:"TypeSelector",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.name)}},Uo=Ce.isHexDigit,Ho=Ce.cmpChar,Vo=Ce.TYPE,Ko=Ce.NAME,Go=Vo.Ident,Qo=Vo.Number,Xo=Vo.Dimension;function Zo(e,t){for(var n=this.scanner.tokenStart+e,r=0;n<this.scanner.tokenEnd;n++){var i=this.scanner.source.charCodeAt(n);if(45===i&&t&&0!==r)return 0===Zo.call(this,e+r+1,!1)&&this.error(),-1;Uo(i)||this.error(t&&0!==r?"HyphenMinus"+(r<6?" or hex digit":"")+" is expected":r<6?"Hex digit is expected":"Unexpected input",n),++r>6&&this.error("Too many hex digits",n)}return this.scanner.next(),r}function $o(e){for(var t=0;this.scanner.isDelim(63);)++t>e&&this.error("Too many question marks"),this.scanner.next()}function Jo(e){this.scanner.source.charCodeAt(this.scanner.tokenStart)!==e&&this.error(Ko[e]+" is expected")}function es(){var e=0;return this.scanner.isDelim(43)?(this.scanner.next(),this.scanner.tokenType===Go?void((e=Zo.call(this,0,!0))>0&&$o.call(this,6-e)):this.scanner.isDelim(63)?(this.scanner.next(),void $o.call(this,5)):void this.error("Hex digit or question mark is expected")):this.scanner.tokenType===Qo?(Jo.call(this,43),e=Zo.call(this,1,!0),this.scanner.isDelim(63)?void $o.call(this,6-e):this.scanner.tokenType===Xo||this.scanner.tokenType===Qo?(Jo.call(this,45),void Zo.call(this,1,!1)):void 0):this.scanner.tokenType===Xo?(Jo.call(this,43),void((e=Zo.call(this,1,!0))>0&&$o.call(this,6-e))):void this.error()}var ts={name:"UnicodeRange",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return Ho(this.scanner.source,e,117)||this.error("U is expected"),Ho(this.scanner.source,e+1,43)||this.error("Plus sign is expected"),this.scanner.next(),es.call(this),{type:"UnicodeRange",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.value)}},ns=Ce.isWhiteSpace,rs=Ce.cmpStr,is=Ce.TYPE,as=is.Function,os=is.Url,ss=is.RightParenthesis,ls={name:"Url",structure:{value:["String","Raw"]},parse:function(){var e,t=this.scanner.tokenStart;switch(this.scanner.tokenType){case os:for(var n=t+4,r=this.scanner.tokenEnd-1;n<r&&ns(this.scanner.source.charCodeAt(n));)n++;for(;n<r&&ns(this.scanner.source.charCodeAt(r-1));)r--;e={type:"Raw",loc:this.getLocation(n,r),value:this.scanner.source.substring(n,r)},this.eat(os);break;case as:rs(this.scanner.source,this.scanner.tokenStart,this.scanner.tokenEnd,"url(")||this.error("Function name must be `url`"),this.eat(as),this.scanner.skipSC(),e=this.String(),this.scanner.skipSC(),this.eat(ss);break;default:this.error("Url or Function is expected")}return{type:"Url",loc:this.getLocation(t,this.scanner.tokenStart),value:e}},generate:function(e){this.chunk("url"),this.chunk("("),this.node(e.value),this.chunk(")")}},cs=Ce.TYPE.WhiteSpace,us=Object.freeze({type:"WhiteSpace",loc:null,value:" "}),hs={AnPlusB:Gr,Atrule:hi,AtrulePrelude:gi,AttributeSelector:Ci,Block:Mi,Brackets:Wi,CDC:Yi,CDO:Hi,ClassSelector:Ki,Combinator:Qi,Comment:Zi,Declaration:ua,DeclarationList:ka,Dimension:wa,Function:Ca,Hash:Aa,Identifier:Ta,IdSelector:Ea,MediaFeature:_a,MediaQuery:Ha,MediaQueryList:Ka,Nth:{name:"Nth",structure:{nth:["AnPlusB","Identifier"],selector:["SelectorList",null]},parse:function(e){this.scanner.skipSC();var t,n=this.scanner.tokenStart,r=n,i=null;return t=this.scanner.lookupValue(0,"odd")||this.scanner.lookupValue(0,"even")?this.Identifier():this.AnPlusB(),this.scanner.skipSC(),e&&this.scanner.lookupValue(0,"of")?(this.scanner.next(),i=this.SelectorList(),this.needPositions&&(r=this.getLastListNode(i.children).loc.end.offset)):this.needPositions&&(r=t.loc.end.offset),{type:"Nth",loc:this.getLocation(n,r),nth:t,selector:i}},generate:function(e){this.node(e.nth),null!==e.selector&&(this.chunk(" of "),this.node(e.selector))}},Number:Qa,Operator:Xa,Parentheses:eo,Percentage:ro,PseudoClassSelector:co,PseudoElementSelector:fo,Ratio:wo,Raw:ni,Rule:To,Selector:{name:"Selector",structure:{children:[["TypeSelector","IdSelector","ClassSelector","AttributeSelector","PseudoClassSelector","PseudoElementSelector","Combinator","WhiteSpace"]]},parse:function(){var e=this.readSequence(this.scope.Selector);return null===this.getFirstListNode(e)&&this.error("Selector is expected"),{type:"Selector",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e)}},SelectorList:Eo,String:Oo,StyleSheet:Fo,TypeSelector:Yo,UnicodeRange:ts,Url:ls,Value:{name:"Value",structure:{children:[[]]},parse:function(){var e=this.scanner.tokenStart,t=this.readSequence(this.scope.Value);return{type:"Value",loc:this.getLocation(e,this.scanner.tokenStart),children:t}},generate:function(e){this.children(e)}},WhiteSpace:{name:"WhiteSpace",structure:{value:String},parse:function(){return this.eat(cs),us},generate:function(e){this.chunk(e.value)}}},ps={generic:!0,types:Nr.types,atrules:Nr.atrules,properties:Nr.properties,node:hs},ds=Ce.cmpChar,ms=Ce.cmpStr,gs=Ce.TYPE,fs=gs.Ident,bs=gs.String,ys=gs.Number,ks=gs.Function,vs=gs.Url,xs=gs.Hash,ws=gs.Dimension,Ss=gs.Percentage,Cs=gs.LeftParenthesis,zs=gs.LeftSquareBracket,As=gs.Comma,Ps=gs.Delim,Ts=function(e){switch(this.scanner.tokenType){case xs:return this.Hash();case As:return e.space=null,e.ignoreWSAfter=!0,this.Operator();case Cs:return this.Parentheses(this.readSequence,e.recognizer);case zs:return this.Brackets(this.readSequence,e.recognizer);case bs:return this.String();case ws:return this.Dimension();case Ss:return this.Percentage();case ys:return this.Number();case ks:return ms(this.scanner.source,this.scanner.tokenStart,this.scanner.tokenEnd,"url(")?this.Url():this.Function(this.readSequence,e.recognizer);case vs:return this.Url();case fs:return ds(this.scanner.source,this.scanner.tokenStart,117)&&ds(this.scanner.source,this.scanner.tokenStart+1,43)?this.UnicodeRange():this.Identifier();case Ps:var t=this.scanner.source.charCodeAt(this.scanner.tokenStart);if(47===t||42===t||43===t||45===t)return this.Operator();35===t&&this.error("Hex or identifier is expected",this.scanner.tokenStart+1)}},Ls={getNode:Ts},Es=Ce.TYPE,Ds=Es.Delim,Os=Es.Ident,Bs=Es.Dimension,Is=Es.Percentage,Ns=Es.Number,Rs=Es.Hash,Ms=Es.Colon,js=Es.LeftSquareBracket;var _s={getNode:function(e){switch(this.scanner.tokenType){case js:return this.AttributeSelector();case Rs:return this.IdSelector();case Ms:return this.scanner.lookupType(1)===Ms?this.PseudoElementSelector():this.PseudoClassSelector();case Os:return this.TypeSelector();case Ns:case Is:return this.Percentage();case Bs:46===this.scanner.source.charCodeAt(this.scanner.tokenStart)&&this.error("Identifier is expected",this.scanner.tokenStart+1);break;case Ds:switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 43:case 62:case 126:return e.space=null,e.ignoreWSAfter=!0,this.Combinator();case 47:return this.Combinator();case 46:return this.ClassSelector();case 42:case 124:return this.TypeSelector();case 35:return this.IdSelector()}}}},Fs=Ce.TYPE,Ws=ni.mode,qs=Fs.Comma,Ys=Fs.WhiteSpace,Us={AtrulePrelude:Ls,Selector:_s,Value:{getNode:Ts,expression:function(){return this.createSingleNodeList(this.Raw(this.scanner.tokenIndex,null,!1))},var:function(){var e=this.createList();if(this.scanner.skipSC(),e.push(this.Identifier()),this.scanner.skipSC(),this.scanner.tokenType===qs){e.push(this.Operator());const t=this.scanner.tokenIndex,n=this.parseCustomProperty?this.Value(null):this.Raw(this.scanner.tokenIndex,Ws.exclamationMarkOrSemicolon,!1);if("Value"===n.type&&n.children.isEmpty())for(let e=t-this.scanner.tokenIndex;e<=0;e++)if(this.scanner.lookupType(e)===Ys){n.children.appendData({type:"WhiteSpace",loc:null,value:" "});break}e.push(n)}return e}}},Hs=Ce.TYPE,Vs=Hs.String,Ks=Hs.Ident,Gs=Hs.Url,Qs=Hs.Function,Xs=Hs.LeftParenthesis,Zs={parse:{prelude:function(){var e=this.createList();switch(this.scanner.skipSC(),this.scanner.tokenType){case Vs:e.push(this.String());break;case Gs:case Qs:e.push(this.Url());break;default:this.error("String or url() is expected")}return this.lookupNonWSType(0)!==Ks&&this.lookupNonWSType(0)!==Xs||(e.push(this.WhiteSpace()),e.push(this.MediaQueryList())),e},block:null}},$s=Ce.TYPE,Js=$s.WhiteSpace,el=$s.Comment,tl=$s.Ident,nl=$s.Function,rl=$s.Colon,il=$s.LeftParenthesis;function al(){return this.createSingleNodeList(this.Raw(this.scanner.tokenIndex,null,!1))}function ol(){return this.scanner.skipSC(),this.scanner.tokenType===tl&&this.lookupNonWSType(1)===rl?this.createSingleNodeList(this.Declaration()):sl.call(this)}function sl(){var e,t=this.createList(),n=null;this.scanner.skipSC();e:for(;!this.scanner.eof;){switch(this.scanner.tokenType){case Js:n=this.WhiteSpace();continue;case el:this.scanner.next();continue;case nl:e=this.Function(al,this.scope.AtrulePrelude);break;case tl:e=this.Identifier();break;case il:e=this.Parentheses(ol,this.scope.AtrulePrelude);break;default:break e}null!==n&&(t.push(n),n=null),t.push(e)}return t}var ll,cl={parse:function(){return this.createSingleNodeList(this.SelectorList())}},ul={parse:function(){return this.createSingleNodeList(this.Nth(!0))}},hl={parse:function(){return this.createSingleNodeList(this.Nth(!1))}},pl={parseContext:{default:"StyleSheet",stylesheet:"StyleSheet",atrule:"Atrule",atrulePrelude:function(e){return this.AtrulePrelude(e.atrule?String(e.atrule):null)},mediaQueryList:"MediaQueryList",mediaQuery:"MediaQuery",rule:"Rule",selectorList:"SelectorList",selector:"Selector",block:function(){return this.Block(!0)},declarationList:"DeclarationList",declaration:"Declaration",value:"Value"},scope:Us,atrule:{"font-face":{parse:{prelude:null,block:function(){return this.Block(!0)}}},import:Zs,media:{parse:{prelude:function(){return this.createSingleNodeList(this.MediaQueryList())},block:function(){return this.Block(!1)}}},page:{parse:{prelude:function(){return this.createSingleNodeList(this.SelectorList())},block:function(){return this.Block(!0)}}},supports:{parse:{prelude:function(){var e=sl.call(this);return null===this.getFirstListNode(e)&&this.error("Condition is expected"),e},block:function(){return this.Block(!1)}}}},pseudo:{dir:{parse:function(){return this.createSingleNodeList(this.Identifier())}},has:{parse:function(){return this.createSingleNodeList(this.SelectorList())}},lang:{parse:function(){return this.createSingleNodeList(this.Identifier())}},matches:cl,not:cl,"nth-child":ul,"nth-last-child":ul,"nth-last-of-type":hl,"nth-of-type":hl,slotted:{parse:function(){return this.createSingleNodeList(this.Selector())}}},node:hs},dl={node:hs},ml={version:"1.1.2"},gl=(ll=Object.freeze({__proto__:null,version:"1.1.2",default:ml}))&&ll.default||ll;var fl=Ir(function(){for(var e={},t=0;t<arguments.length;t++){var n=arguments[t];for(var r in n)e[r]=n[r]}return e}(ps,pl,dl)),bl=gl.version;return fl.version=bl,fl}))}));var specificity=function specificity(simpleSelector){var A=0;var B=0;var C=0;simpleSelector.children.each((function walk(node){switch(node.type){case"SelectorList":case"Selector":node.children.each(walk);break;case"IdSelector":A++;break;case"ClassSelector":case"AttributeSelector":B++;break;case"PseudoClassSelector":switch(node.name.toLowerCase()){case"not":node.children.each(walk);break;case"before":case"after":case"first-line":case"first-letter":C++;break;default:B++}break;case"PseudoElementSelector":C++;break;case"TypeSelector":if(node.name.charAt(node.name.length-1)!=="*"){C++}break}}));return[A,B,C]};var List$6=csstree_min.List;function flattenToSelectors(cssAst){var selectors=[];csstree_min.walk(cssAst,{visit:"Rule",enter:function(node){if(node.type!=="Rule"){return}var atrule=this.atrule;var rule=node;node.prelude.children.each((function(selectorNode,selectorItem){var selector={item:selectorItem,atrule:atrule,rule:rule,pseudos:[]};selectorNode.children.each((function(selectorChildNode,selectorChildItem,selectorChildList){if(selectorChildNode.type==="PseudoClassSelector"||selectorChildNode.type==="PseudoElementSelector"){selector.pseudos.push({item:selectorChildItem,list:selectorChildList})}}));selectors.push(selector)}))}});return selectors}function filterByMqs(selectors,useMqs){return selectors.filter((function(selector){if(selector.atrule===null){return~useMqs.indexOf("")}var mqName=selector.atrule.name;var mqStr=mqName;if(selector.atrule.expression&&selector.atrule.expression.children.first().type==="MediaQueryList"){var mqExpr=csstree_min.generate(selector.atrule.expression);mqStr=[mqName,mqExpr].join(" ")}return~useMqs.indexOf(mqStr)}))}function filterByPseudos(selectors,usePseudos){return selectors.filter((function(selector){var pseudoSelectorsStr=csstree_min.generate({type:"Selector",children:(new List$6).fromArray(selector.pseudos.map((function(pseudo){return pseudo.item.data})))});return~usePseudos.indexOf(pseudoSelectorsStr)}))}function cleanPseudos(selectors){selectors.forEach((function(selector){selector.pseudos.forEach((function(pseudo){pseudo.list.remove(pseudo.item)}))}))}function compareSpecificity$1(aSpecificity,bSpecificity){for(var i=0;i<4;i+=1){if(aSpecificity[i]<bSpecificity[i]){return-1}else if(aSpecificity[i]>bSpecificity[i]){return 1}}return 0}function compareSimpleSelectorNode(aSimpleSelectorNode,bSimpleSelectorNode){var aSpecificity=specificity(aSimpleSelectorNode),bSpecificity=specificity(bSimpleSelectorNode);return compareSpecificity$1(aSpecificity,bSpecificity)}function _bySelectorSpecificity(selectorA,selectorB){return compareSimpleSelectorNode(selectorA.item.data,selectorB.item.data)}function sortSelectors(selectors){return stable(selectors,_bySelectorSpecificity)}function csstreeToStyleDeclaration(declaration){var propertyName=declaration.property,propertyValue=csstree_min.generate(declaration.value),propertyPriority=declaration.important?"important":"";return{name:propertyName,value:propertyValue,priority:propertyPriority}}function getCssStr(elem){if(elem.children.length>0&&(elem.children[0].type==="text"||elem.children[0].type==="cdata")){return elem.children[0].value}return""}function setCssStr(elem,css){if(elem.children.length===0){elem.children.push({type:"text",value:""})}if(elem.children[0].type!=="text"&&elem.children[0].type!=="cdata"){return css}elem.children[0].value=css;return css}var flattenToSelectors_1=flattenToSelectors;var filterByMqs_1=filterByMqs;var filterByPseudos_1=filterByPseudos;var cleanPseudos_1=cleanPseudos;var compareSpecificity_1=compareSpecificity$1;var compareSimpleSelectorNode_1=compareSimpleSelectorNode;var sortSelectors_1=sortSelectors;var csstreeToStyleDeclaration_1=csstreeToStyleDeclaration;var getCssStr_1=getCssStr;var setCssStr_1=setCssStr;var cssTools={flattenToSelectors:flattenToSelectors_1,filterByMqs:filterByMqs_1,filterByPseudos:filterByPseudos_1,cleanPseudos:cleanPseudos_1,compareSpecificity:compareSpecificity_1,compareSimpleSelectorNode:compareSimpleSelectorNode_1,sortSelectors:sortSelectors_1,csstreeToStyleDeclaration:csstreeToStyleDeclaration_1,getCssStr:getCssStr_1,setCssStr:setCssStr_1};const{selectAll:selectAll$1,is:is$1}=lib$1;const{compareSpecificity:compareSpecificity}=cssTools;const{attrsGroups:attrsGroups$3,inheritableAttrs:inheritableAttrs$2,presentationNonInheritableGroupAttrs:presentationNonInheritableGroupAttrs$1}=_collections;const cssSelectOptions={xmlMode:true,adapter:cssSelectAdapter};const parseRule=(ruleNode,dynamic)=>{let selectors;let selectorsSpecificity;const declarations=[];csstree_min.walk(ruleNode,(cssNode=>{if(cssNode.type==="SelectorList"){selectorsSpecificity=specificity(cssNode);const newSelectorsNode=csstree_min.clone(cssNode);csstree_min.walk(newSelectorsNode,((pseudoClassNode,item,list)=>{if(pseudoClassNode.type==="PseudoClassSelector"){dynamic=true;list.remove(item)}}));selectors=csstree_min.generate(newSelectorsNode);return csstree_min.walk.skip}if(cssNode.type==="Declaration"){declarations.push({name:cssNode.property,value:csstree_min.generate(cssNode.value),important:cssNode.important});return csstree_min.walk.skip}}));return{dynamic:dynamic,selectors:selectors,specificity:selectorsSpecificity,declarations:declarations}};const parseStylesheet=(css,dynamic)=>{const rules=[];const ast=csstree_min.parse(css);csstree_min.walk(ast,(cssNode=>{if(cssNode.type==="Rule"){rules.push(parseRule(cssNode,dynamic||false));return csstree_min.walk.skip}if(cssNode.type==="Atrule"){if(cssNode.name==="keyframes"){return csstree_min.walk.skip}csstree_min.walk(cssNode,(ruleNode=>{if(ruleNode.type==="Rule"){rules.push(parseRule(ruleNode,dynamic||true));return csstree_min.walk.skip}}));return csstree_min.walk.skip}}));return rules};const computeOwnStyle=(node,stylesheet)=>{const computedStyle={};const importantStyles=new Map;for(const[name,value]of Object.entries(node.attributes)){if(attrsGroups$3.presentation.includes(name)){computedStyle[name]={type:"static",inherited:false,value:value};importantStyles.set(name,false)}}for(const{selectors:selectors,declarations:declarations,dynamic:dynamic}of stylesheet){if(is$1(node,selectors,cssSelectOptions)){for(const{name:name,value:value,important:important}of declarations){const computed=computedStyle[name];if(computed&&computed.type==="dynamic"){continue}if(dynamic){computedStyle[name]={type:"dynamic",inherited:false};continue}if(computed==null||important===true||importantStyles.get(name)===false){computedStyle[name]={type:"static",inherited:false,value:value};importantStyles.set(name,important)}}}}for(const[name,{value:value,priority:priority}]of node.style.properties){const computed=computedStyle[name];const important=priority==="important";if(computed&&computed.type==="dynamic"){continue}if(computed==null||important===true||importantStyles.get(name)===false){computedStyle[name]={type:"static",inherited:false,value:value};importantStyles.set(name,important)}}return computedStyle};const computeStyle$3=node=>{let root=node;while(root.parentNode){root=root.parentNode}const styleNodes=selectAll$1("style",root,cssSelectOptions);const stylesheet=[];for(const styleNode of styleNodes){const dynamic=styleNode.attributes.media!=null&&styleNode.attributes.media!=="all";if(styleNode.attributes.type==null||styleNode.attributes.type===""||styleNode.attributes.type==="text/css"){const children=styleNode.children;for(const child of children){if(child.type==="text"||child.type==="cdata"){stylesheet.push(...parseStylesheet(child.value,dynamic))}}}}stable.inplace(stylesheet,((a,b)=>compareSpecificity(a.specificity,b.specificity)));const computedStyles=computeOwnStyle(node,stylesheet);let parent=node;while(parent.parentNode&&parent.parentNode.type!=="root"){const inheritedStyles=computeOwnStyle(parent.parentNode,stylesheet);for(const[name,computed]of Object.entries(inheritedStyles)){if(computedStyles[name]==null&&inheritableAttrs$2.includes(name)===true&&presentationNonInheritableGroupAttrs$1.includes(name)===false){computedStyles[name]={...computed,inherited:true}}}parent=parent.parentNode}return computedStyles};var computeStyle_1=computeStyle$3;var style={computeStyle:computeStyle_1};const argsCountPerCommand={M:2,m:2,Z:0,z:0,L:2,l:2,H:1,h:1,V:1,v:1,C:6,c:6,S:4,s:4,Q:4,q:4,T:2,t:2,A:7,a:7};const isCommand=c=>c in argsCountPerCommand;const isWsp=c=>{const codePoint=c.codePointAt(0);return codePoint===32||codePoint===9||codePoint===13||codePoint===10};const isDigit=c=>{const codePoint=c.codePointAt(0);if(codePoint==null){return false}return 48<=codePoint&&codePoint<=57};const readNumber=(string,cursor)=>{let i=cursor;let value="";let state="none";for(;i<string.length;i+=1){const c=string[i];if(c==="+"||c==="-"){if(state==="none"){state="sign";value+=c;continue}if(state==="e"){state="exponent_sign";value+=c;continue}}if(isDigit(c)){if(state==="none"||state==="sign"||state==="whole"){state="whole";value+=c;continue}if(state==="decimal_point"||state==="decimal"){state="decimal";value+=c;continue}if(state==="e"||state==="exponent_sign"||state==="exponent"){state="exponent";value+=c;continue}}if(c==="."){if(state==="none"||state==="sign"||state==="whole"){state="decimal_point";value+=c;continue}}if(c==="E"||c=="e"){if(state==="whole"||state==="decimal_point"||state==="decimal"){state="e";value+=c;continue}}break}const number=Number.parseFloat(value);if(Number.isNaN(number)){return[cursor,null]}else{return[i-1,number]}};const parsePathData$1=string=>{const pathData=[];let command=null;let args=[];let argsCount=0;let canHaveComma=false;let hadComma=false;for(let i=0;i<string.length;i+=1){const c=string.charAt(i);if(isWsp(c)){continue}if(canHaveComma&&c===","){if(hadComma){break}hadComma=true;continue}if(isCommand(c)){if(hadComma){return pathData}if(command==null){if(c!=="M"&&c!=="m"){return pathData}}else{if(args.length!==0){return pathData}}command=c;args=[];argsCount=argsCountPerCommand[command];canHaveComma=false;if(argsCount===0){pathData.push({command:command,args:args})}continue}if(command==null){return pathData}let newCursor=i;let number=null;if(command==="A"||command==="a"){const position=args.length;if(position===0||position===1){if(c!=="+"&&c!=="-"){[newCursor,number]=readNumber(string,i)}}if(position===2||position===5||position===6){[newCursor,number]=readNumber(string,i)}if(position===3||position===4){if(c==="0"){number=0}if(c==="1"){number=1}}}else{[newCursor,number]=readNumber(string,i)}if(number==null){return pathData}args.push(number);canHaveComma=true;hadComma=false;i=newCursor;if(args.length===argsCount){pathData.push({command:command,args:args});if(command==="M"){command="L"}if(command==="m"){command="l"}args=[]}}return pathData};var parsePathData_1=parsePathData$1;const stringifyNumber=({number:number,precision:precision})=>{if(precision!=null){const ratio=10**precision;number=Math.round(number*ratio)/ratio}return number.toString().replace(/^0\./,".").replace(/^-0\./,"-.")};const stringifyArgs=({command:command,args:args,precision:precision,disableSpaceAfterFlags:disableSpaceAfterFlags})=>{let result="";let prev="";for(let i=0;i<args.length;i+=1){const number=args[i];const numberString=stringifyNumber({number:number,precision:precision});if(disableSpaceAfterFlags&&(command==="A"||command==="a")&&(i===4||i===5)){result+=numberString}else if(i===0||numberString.startsWith("-")){result+=numberString}else if(prev.includes(".")&&numberString.startsWith(".")){result+=numberString}else{result+=` ${numberString}`}prev=numberString}return result};const stringifyPathData$1=({pathData:pathData,precision:precision,disableSpaceAfterFlags:disableSpaceAfterFlags})=>{let combined=[];for(let i=0;i<pathData.length;i+=1){const{command:command,args:args}=pathData[i];if(i===0){combined.push({command:command,args:args})}else{const last=combined[combined.length-1];if(i===1){if(command==="L"){last.command="M"}if(command==="l"){last.command="m"}}if(last.command===command&&last.command!=="M"&&last.command!=="m"||last.command==="M"&&command==="L"||last.command==="m"&&command==="l"){last.args=[...last.args,...args]}else{combined.push({command:command,args:args})}}}let result="";for(const{command:command,args:args}of combined){result+=command+stringifyArgs({command:command,args:args,precision:precision,disableSpaceAfterFlags:disableSpaceAfterFlags})}return result};var stringifyPathData_1=stringifyPathData$1;var path={parsePathData:parsePathData_1,stringifyPathData:stringifyPathData_1};var _path=createCommonjsModule((function(module,exports){const{parsePathData:parsePathData,stringifyPathData:stringifyPathData}=path;var prevCtrlPoint;exports.path2js=function(path){if(path.pathJS)return path.pathJS;const pathData=[];const newPathData=parsePathData(path.attributes.d);for(const{command:command,args:args}of newPathData){if(command==="Z"||command==="z"){pathData.push({instruction:"z"})}else{pathData.push({instruction:command,data:args})}}if(pathData.length&&pathData[0].instruction=="m"){pathData[0].instruction="M"}path.pathJS=pathData;return pathData};var relative2absolute=exports.relative2absolute=function(data){var currentPoint=[0,0],subpathPoint=[0,0],i;return data.map((function(item){var instruction=item.instruction,itemData=item.data&&item.data.slice();if(instruction=="M"){set(currentPoint,itemData);set(subpathPoint,itemData)}else if("mlcsqt".indexOf(instruction)>-1){for(i=0;i<itemData.length;i++){itemData[i]+=currentPoint[i%2]}set(currentPoint,itemData);if(instruction=="m"){set(subpathPoint,itemData)}}else if(instruction=="a"){itemData[5]+=currentPoint[0];itemData[6]+=currentPoint[1];set(currentPoint,itemData)}else if(instruction=="h"){itemData[0]+=currentPoint[0];currentPoint[0]=itemData[0]}else if(instruction=="v"){itemData[0]+=currentPoint[1];currentPoint[1]=itemData[0]}else if("MZLCSQTA".indexOf(instruction)>-1){set(currentPoint,itemData)}else if(instruction=="H"){currentPoint[0]=itemData[0]}else if(instruction=="V"){currentPoint[1]=itemData[0]}else if(instruction=="z"){set(currentPoint,subpathPoint)}return instruction=="z"?{instruction:"z"}:{instruction:instruction.toUpperCase(),data:itemData}}))};exports.computeCubicBoundingBox=function(xa,ya,xb,yb,xc,yc,xd,yd){var minx=Number.POSITIVE_INFINITY,miny=Number.POSITIVE_INFINITY,maxx=Number.NEGATIVE_INFINITY,maxy=Number.NEGATIVE_INFINITY,ts,t,x,y,i;if(xa<minx){minx=xa}if(xa>maxx){maxx=xa}if(xd<minx){minx=xd}if(xd>maxx){maxx=xd}ts=computeCubicFirstDerivativeRoots(xa,xb,xc,xd);for(i=0;i<ts.length;i++){t=ts[i];if(t>=0&&t<=1){x=computeCubicBaseValue(t,xa,xb,xc,xd);if(x<minx){minx=x}if(x>maxx){maxx=x}}}if(ya<miny){miny=ya}if(ya>maxy){maxy=ya}if(yd<miny){miny=yd}if(yd>maxy){maxy=yd}ts=computeCubicFirstDerivativeRoots(ya,yb,yc,yd);for(i=0;i<ts.length;i++){t=ts[i];if(t>=0&&t<=1){y=computeCubicBaseValue(t,ya,yb,yc,yd);if(y<miny){miny=y}if(y>maxy){maxy=y}}}return{minx:minx,miny:miny,maxx:maxx,maxy:maxy}};function computeCubicBaseValue(t,a,b,c,d){var mt=1-t;return mt*mt*mt*a+3*mt*mt*t*b+3*mt*t*t*c+t*t*t*d}function computeCubicFirstDerivativeRoots(a,b,c,d){var result=[-1,-1],tl=-a+2*b-c,tr=-Math.sqrt(-a*(c-d)+b*b-b*(c+d)+c*c),dn=-a+3*b-3*c+d;if(dn!==0){result[0]=(tl+tr)/dn;result[1]=(tl-tr)/dn}return result}exports.computeQuadraticBoundingBox=function(xa,ya,xb,yb,xc,yc){var minx=Number.POSITIVE_INFINITY,miny=Number.POSITIVE_INFINITY,maxx=Number.NEGATIVE_INFINITY,maxy=Number.NEGATIVE_INFINITY,t,x,y;if(xa<minx){minx=xa}if(xa>maxx){maxx=xa}if(xc<minx){minx=xc}if(xc>maxx){maxx=xc}t=computeQuadraticFirstDerivativeRoot(xa,xb,xc);if(t>=0&&t<=1){x=computeQuadraticBaseValue(t,xa,xb,xc);if(x<minx){minx=x}if(x>maxx){maxx=x}}if(ya<miny){miny=ya}if(ya>maxy){maxy=ya}if(yc<miny){miny=yc}if(yc>maxy){maxy=yc}t=computeQuadraticFirstDerivativeRoot(ya,yb,yc);if(t>=0&&t<=1){y=computeQuadraticBaseValue(t,ya,yb,yc);if(y<miny){miny=y}if(y>maxy){maxy=y}}return{minx:minx,miny:miny,maxx:maxx,maxy:maxy}};function computeQuadraticBaseValue(t,a,b,c){var mt=1-t;return mt*mt*a+2*mt*t*b+t*t*c}function computeQuadraticFirstDerivativeRoot(a,b,c){var t=-1,denominator=a-2*b+c;if(denominator!==0){t=(a-b)/denominator}return t}exports.js2path=function(path,data,params){path.pathJS=data;const pathData=[];for(const item of data){if(pathData.length!==0&&(item.instruction==="M"||item.instruction==="m")){const last=pathData[pathData.length-1];if(last.command==="M"||last.command==="m"){pathData.pop()}}pathData.push({command:item.instruction,args:item.data||[]})}path.attributes.d=stringifyPathData({pathData:pathData,precision:params.floatPrecision,disableSpaceAfterFlags:params.noSpaceAfterFlags})};function set(dest,source){dest[0]=source[source.length-2];dest[1]=source[source.length-1];return dest}exports.intersects=function(path1,path2){var points1=relative2absolute(path1).reduce(gatherPoints,[]),points2=relative2absolute(path2).reduce(gatherPoints,[]);if(points1.maxX<=points2.minX||points2.maxX<=points1.minX||points1.maxY<=points2.minY||points2.maxY<=points1.minY||points1.every((function(set1){return points2.every((function(set2){return set1[set1.maxX][0]<=set2[set2.minX][0]||set2[set2.maxX][0]<=set1[set1.minX][0]||set1[set1.maxY][1]<=set2[set2.minY][1]||set2[set2.maxY][1]<=set1[set1.minY][1]}))})))return false;var hullNest1=points1.map(convexHull),hullNest2=points2.map(convexHull);return hullNest1.some((function(hull1){if(hull1.length<3)return false;return hullNest2.some((function(hull2){if(hull2.length<3)return false;var simplex=[getSupport(hull1,hull2,[1,0])],direction=minus(simplex[0]);var iterations=1e4;while(true){if(iterations--==0){console.error("Error: infinite loop while processing mergePaths plugin.");return true}simplex.push(getSupport(hull1,hull2,direction));if(dot(direction,simplex[simplex.length-1])<=0)return false;if(processSimplex(simplex,direction))return true}}))}));function getSupport(a,b,direction){return sub(supportPoint(a,direction),supportPoint(b,minus(direction)))}function supportPoint(polygon,direction){var index=direction[1]>=0?direction[0]<0?polygon.maxY:polygon.maxX:direction[0]<0?polygon.minX:polygon.minY,max=-Infinity,value;while((value=dot(polygon[index],direction))>max){max=value;index=++index%polygon.length}return polygon[(index||polygon.length)-1]}};function processSimplex(simplex,direction){if(simplex.length==2){let a=simplex[1],b=simplex[0],AO=minus(simplex[1]),AB=sub(b,a);if(dot(AO,AB)>0){set(direction,orth(AB,a))}else{set(direction,AO);simplex.shift()}}else{let a=simplex[2],b=simplex[1],c=simplex[0],AB=sub(b,a),AC=sub(c,a),AO=minus(a),ACB=orth(AB,AC),ABC=orth(AC,AB);if(dot(ACB,AO)>0){if(dot(AB,AO)>0){set(direction,ACB);simplex.shift()}else{set(direction,AO);simplex.splice(0,2)}}else if(dot(ABC,AO)>0){if(dot(AC,AO)>0){set(direction,ABC);simplex.splice(1,1)}else{set(direction,AO);simplex.splice(0,2)}}else return true}return false}function minus(v){return[-v[0],-v[1]]}function sub(v1,v2){return[v1[0]-v2[0],v1[1]-v2[1]]}function dot(v1,v2){return v1[0]*v2[0]+v1[1]*v2[1]}function orth(v,from){var o=[-v[1],v[0]];return dot(o,minus(from))<0?minus(o):o}function gatherPoints(points,item,index,path){var subPath=points.length&&points[points.length-1],prev=index&&path[index-1],basePoint=subPath.length&&subPath[subPath.length-1],data=item.data,ctrlPoint=basePoint;switch(item.instruction){case"M":points.push(subPath=[]);break;case"H":addPoint(subPath,[data[0],basePoint[1]]);break;case"V":addPoint(subPath,[basePoint[0],data[0]]);break;case"Q":addPoint(subPath,data.slice(0,2));prevCtrlPoint=[data[2]-data[0],data[3]-data[1]];break;case"T":if(prev.instruction=="Q"||prev.instruction=="T"){ctrlPoint=[basePoint[0]+prevCtrlPoint[0],basePoint[1]+prevCtrlPoint[1]];addPoint(subPath,ctrlPoint);prevCtrlPoint=[data[0]-ctrlPoint[0],data[1]-ctrlPoint[1]]}break;case"C":addPoint(subPath,[.5*(basePoint[0]+data[0]),.5*(basePoint[1]+data[1])]);addPoint(subPath,[.5*(data[0]+data[2]),.5*(data[1]+data[3])]);addPoint(subPath,[.5*(data[2]+data[4]),.5*(data[3]+data[5])]);prevCtrlPoint=[data[4]-data[2],data[5]-data[3]];break;case"S":if(prev.instruction=="C"||prev.instruction=="S"){addPoint(subPath,[basePoint[0]+.5*prevCtrlPoint[0],basePoint[1]+.5*prevCtrlPoint[1]]);ctrlPoint=[basePoint[0]+prevCtrlPoint[0],basePoint[1]+prevCtrlPoint[1]]}addPoint(subPath,[.5*(ctrlPoint[0]+data[0]),.5*(ctrlPoint[1]+data[1])]);addPoint(subPath,[.5*(data[0]+data[2]),.5*(data[1]+data[3])]);prevCtrlPoint=[data[2]-data[0],data[3]-data[1]];break;case"A":var curves=a2c.apply(0,basePoint.concat(data));for(var cData;(cData=curves.splice(0,6).map(toAbsolute)).length;){addPoint(subPath,[.5*(basePoint[0]+cData[0]),.5*(basePoint[1]+cData[1])]);addPoint(subPath,[.5*(cData[0]+cData[2]),.5*(cData[1]+cData[3])]);addPoint(subPath,[.5*(cData[2]+cData[4]),.5*(cData[3]+cData[5])]);if(curves.length)addPoint(subPath,basePoint=cData.slice(-2))}break}if(data&&data.length>=2)addPoint(subPath,data.slice(-2));return points;function toAbsolute(n,i){return n+basePoint[i%2]}function addPoint(path,point){if(!path.length||point[1]>path[path.maxY][1]){path.maxY=path.length;points.maxY=points.length?Math.max(point[1],points.maxY):point[1]}if(!path.length||point[0]>path[path.maxX][0]){path.maxX=path.length;points.maxX=points.length?Math.max(point[0],points.maxX):point[0]}if(!path.length||point[1]<path[path.minY][1]){path.minY=path.length;points.minY=points.length?Math.min(point[1],points.minY):point[1]}if(!path.length||point[0]<path[path.minX][0]){path.minX=path.length;points.minX=points.length?Math.min(point[0],points.minX):point[0]}path.push(point)}}function convexHull(points){points.sort((function(a,b){return a[0]==b[0]?a[1]-b[1]:a[0]-b[0]}));var lower=[],minY=0,bottom=0;for(let i=0;i<points.length;i++){while(lower.length>=2&&cross(lower[lower.length-2],lower[lower.length-1],points[i])<=0){lower.pop()}if(points[i][1]<points[minY][1]){minY=i;bottom=lower.length}lower.push(points[i])}var upper=[],maxY=points.length-1,top=0;for(let i=points.length;i--;){while(upper.length>=2&&cross(upper[upper.length-2],upper[upper.length-1],points[i])<=0){upper.pop()}if(points[i][1]>points[maxY][1]){maxY=i;top=upper.length}upper.push(points[i])}upper.pop();lower.pop();var hull=lower.concat(upper);hull.minX=0;hull.maxX=lower.length;hull.minY=bottom;hull.maxY=(lower.length+top)%hull.length;return hull}function cross(o,a,b){return(a[0]-o[0])*(b[1]-o[1])-(a[1]-o[1])*(b[0]-o[0])}function a2c(x1,y1,rx,ry,angle,large_arc_flag,sweep_flag,x2,y2,recursive){var _120=Math.PI*120/180,rad=Math.PI/180*(+angle||0),res=[],rotateX=function(x,y,rad){return x*Math.cos(rad)-y*Math.sin(rad)},rotateY=function(x,y,rad){return x*Math.sin(rad)+y*Math.cos(rad)};if(!recursive){x1=rotateX(x1,y1,-rad);y1=rotateY(x1,y1,-rad);x2=rotateX(x2,y2,-rad);y2=rotateY(x2,y2,-rad);var x=(x1-x2)/2,y=(y1-y2)/2;var h=x*x/(rx*rx)+y*y/(ry*ry);if(h>1){h=Math.sqrt(h);rx=h*rx;ry=h*ry}var rx2=rx*rx,ry2=ry*ry,k=(large_arc_flag==sweep_flag?-1:1)*Math.sqrt(Math.abs((rx2*ry2-rx2*y*y-ry2*x*x)/(rx2*y*y+ry2*x*x))),cx=k*rx*y/ry+(x1+x2)/2,cy=k*-ry*x/rx+(y1+y2)/2,f1=Math.asin(((y1-cy)/ry).toFixed(9)),f2=Math.asin(((y2-cy)/ry).toFixed(9));f1=x1<cx?Math.PI-f1:f1;f2=x2<cx?Math.PI-f2:f2;f1<0&&(f1=Math.PI*2+f1);f2<0&&(f2=Math.PI*2+f2);if(sweep_flag&&f1>f2){f1=f1-Math.PI*2}if(!sweep_flag&&f2>f1){f2=f2-Math.PI*2}}else{f1=recursive[0];f2=recursive[1];cx=recursive[2];cy=recursive[3]}var df=f2-f1;if(Math.abs(df)>_120){var f2old=f2,x2old=x2,y2old=y2;f2=f1+_120*(sweep_flag&&f2>f1?1:-1);x2=cx+rx*Math.cos(f2);y2=cy+ry*Math.sin(f2);res=a2c(x2,y2,rx,ry,angle,0,sweep_flag,x2old,y2old,[f2,f2old,cx,cy])}df=f2-f1;var c1=Math.cos(f1),s1=Math.sin(f1),c2=Math.cos(f2),s2=Math.sin(f2),t=Math.tan(df/4),hx=4/3*rx*t,hy=4/3*ry*t,m=[-hx*s1,hy*c1,x2+hx*s2-x1,y2-hy*c2-y1,x2-x1,y2-y1];if(recursive){return m.concat(res)}else{res=m.concat(res);var newres=[];for(var i=0,n=res.length;i<n;i++){newres[i]=i%2?rotateY(res[i-1],res[i],rad):rotateX(res[i],res[i+1],rad)}return newres}}}));var _transforms=createCommonjsModule((function(module,exports){var regTransformTypes=/matrix|translate|scale|rotate|skewX|skewY/,regTransformSplit=/\s*(matrix|translate|scale|rotate|skewX|skewY)\s*\(\s*(.+?)\s*\)[\s,]*/,regNumericValues=/[-+]?(?:\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?/g;exports.transform2js=function(transformString){var transforms=[],current;transformString.split(regTransformSplit).forEach((function(item){var num;if(item){if(regTransformTypes.test(item)){transforms.push(current={name:item})}else{while(num=regNumericValues.exec(item)){num=Number(num);if(current.data)current.data.push(num);else current.data=[num]}}}}));return current&&current.data?transforms:[]};exports.transformsMultiply=function(transforms){transforms=transforms.map((function(transform){if(transform.name==="matrix"){return transform.data}return transformToMatrix(transform)}));transforms={name:"matrix",data:transforms.length>0?transforms.reduce(multiplyTransformMatrices):[]};return transforms};var mth=exports.mth={rad:function(deg){return deg*Math.PI/180},deg:function(rad){return rad*180/Math.PI},cos:function(deg){return Math.cos(this.rad(deg))},acos:function(val,floatPrecision){return+this.deg(Math.acos(val)).toFixed(floatPrecision)},sin:function(deg){return Math.sin(this.rad(deg))},asin:function(val,floatPrecision){return+this.deg(Math.asin(val)).toFixed(floatPrecision)},tan:function(deg){return Math.tan(this.rad(deg))},atan:function(val,floatPrecision){return+this.deg(Math.atan(val)).toFixed(floatPrecision)}};exports.matrixToTransform=function(transform,params){var floatPrecision=params.floatPrecision,data=transform.data,transforms=[],sx=+Math.hypot(data[0],data[1]).toFixed(params.transformPrecision),sy=+((data[0]*data[3]-data[1]*data[2])/sx).toFixed(params.transformPrecision),colsSum=data[0]*data[2]+data[1]*data[3],rowsSum=data[0]*data[1]+data[2]*data[3],scaleBefore=rowsSum!=0||sx==sy;if(data[4]||data[5]){transforms.push({name:"translate",data:data.slice(4,data[5]?6:5)})}if(!data[1]&&data[2]){transforms.push({name:"skewX",data:[mth.atan(data[2]/sy,floatPrecision)]})}else if(data[1]&&!data[2]){transforms.push({name:"skewY",data:[mth.atan(data[1]/data[0],floatPrecision)]});sx=data[0];sy=data[3]}else if(!colsSum||sx==1&&sy==1||!scaleBefore){if(!scaleBefore){sx=(data[0]<0?-1:1)*Math.hypot(data[0],data[2]);sy=(data[3]<0?-1:1)*Math.hypot(data[1],data[3]);transforms.push({name:"scale",data:[sx,sy]})}var angle=Math.min(Math.max(-1,data[0]/sx),1),rotate=[mth.acos(angle,floatPrecision)*((scaleBefore?1:sy)*data[1]<0?-1:1)];if(rotate[0])transforms.push({name:"rotate",data:rotate});if(rowsSum&&colsSum)transforms.push({name:"skewX",data:[mth.atan(colsSum/(sx*sx),floatPrecision)]});if(rotate[0]&&(data[4]||data[5])){transforms.shift();var cos=data[0]/sx,sin=data[1]/(scaleBefore?sx:sy),x=data[4]*(scaleBefore||sy),y=data[5]*(scaleBefore||sx),denom=(Math.pow(1-cos,2)+Math.pow(sin,2))*(scaleBefore||sx*sy);rotate.push(((1-cos)*x-sin*y)/denom);rotate.push(((1-cos)*y+sin*x)/denom)}}else if(data[1]||data[2]){return transform}if(scaleBefore&&(sx!=1||sy!=1)||!transforms.length)transforms.push({name:"scale",data:sx==sy?[sx]:[sx,sy]});return transforms};function transformToMatrix(transform){if(transform.name==="matrix")return transform.data;var matrix;switch(transform.name){case"translate":matrix=[1,0,0,1,transform.data[0],transform.data[1]||0];break;case"scale":matrix=[transform.data[0],0,0,transform.data[1]||transform.data[0],0,0];break;case"rotate":var cos=mth.cos(transform.data[0]),sin=mth.sin(transform.data[0]),cx=transform.data[1]||0,cy=transform.data[2]||0;matrix=[cos,sin,-sin,cos,(1-cos)*cx+sin*cy,(1-cos)*cy-sin*cx];break;case"skewX":matrix=[1,0,mth.tan(transform.data[0]),1,0,0];break;case"skewY":matrix=[1,mth.tan(transform.data[0]),0,1,0,0];break}return matrix}exports.transformArc=function(cursor,arc,transform){const x=arc[5]-cursor[0];const y=arc[6]-cursor[1];var a=arc[0],b=arc[1],rot=arc[2]*Math.PI/180,cos=Math.cos(rot),sin=Math.sin(rot),h=Math.pow(x*cos+y*sin,2)/(4*a*a)+Math.pow(y*cos-x*sin,2)/(4*b*b);if(h>1){h=Math.sqrt(h);a*=h;b*=h}var ellipse=[a*cos,a*sin,-b*sin,b*cos,0,0],m=multiplyTransformMatrices(transform,ellipse),lastCol=m[2]*m[2]+m[3]*m[3],squareSum=m[0]*m[0]+m[1]*m[1]+lastCol,root=Math.hypot(m[0]-m[3],m[1]+m[2])*Math.hypot(m[0]+m[3],m[1]-m[2]);if(!root){arc[0]=arc[1]=Math.sqrt(squareSum/2);arc[2]=0}else{var majorAxisSqr=(squareSum+root)/2,minorAxisSqr=(squareSum-root)/2,major=Math.abs(majorAxisSqr-lastCol)>1e-6,sub=(major?majorAxisSqr:minorAxisSqr)-lastCol,rowsSum=m[0]*m[2]+m[1]*m[3],term1=m[0]*sub+m[2]*rowsSum,term2=m[1]*sub+m[3]*rowsSum;arc[0]=Math.sqrt(majorAxisSqr);arc[1]=Math.sqrt(minorAxisSqr);arc[2]=((major?term2<0:term1>0)?-1:1)*Math.acos((major?term1:term2)/Math.hypot(term1,term2))*180/Math.PI}if(transform[0]<0!==transform[3]<0){arc[4]=1-arc[4]}return arc};function multiplyTransformMatrices(a,b){return[a[0]*b[0]+a[2]*b[1],a[1]*b[0]+a[3]*b[1],a[0]*b[2]+a[2]*b[3],a[1]*b[2]+a[3]*b[3],a[0]*b[4]+a[2]*b[5]+a[4],a[1]*b[4]+a[3]*b[5]+a[5]]}}));const{transformsMultiply:transformsMultiply$1,transform2js:transform2js$1,transformArc:transformArc}=_transforms;const{removeLeadingZero:removeLeadingZero}=tools;const{referencesProps:referencesProps$2,attrsGroupsDefaults:attrsGroupsDefaults$1}=_collections;const regNumericValues=/[-+]?(\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?/g;const defaultStrokeWidth=attrsGroupsDefaults$1.presentation["stroke-width"];const applyTransforms$1=(elem,pathData,params)=>{if(elem.attributes.transform==null||elem.attributes.transform===""||elem.attributes.style!=null||Object.entries(elem.attributes).some((([name,value])=>referencesProps$2.includes(name)&&value.includes("url(")))){return}const matrix=transformsMultiply$1(transform2js$1(elem.attributes.transform));const stroke=elem.computedAttr("stroke");const id=elem.computedAttr("id");const transformPrecision=params.transformPrecision;if(stroke&&stroke!="none"){if(!params.applyTransformsStroked||(matrix.data[0]!=matrix.data[3]||matrix.data[1]!=-matrix.data[2])&&(matrix.data[0]!=-matrix.data[3]||matrix.data[1]!=matrix.data[2]))return;if(id){let idElem=elem;let hasStrokeWidth=false;do{if(idElem.attributes["stroke-width"]){hasStrokeWidth=true}}while(idElem.attributes.id!==id&&!hasStrokeWidth&&(idElem=idElem.parentNode));if(!hasStrokeWidth)return}const scale=+Math.sqrt(matrix.data[0]*matrix.data[0]+matrix.data[1]*matrix.data[1]).toFixed(transformPrecision);if(scale!==1){const strokeWidth=elem.computedAttr("stroke-width")||defaultStrokeWidth;if(elem.attributes["vector-effect"]==null||elem.attributes["vector-effect"]!=="non-scaling-stroke"){if(elem.attributes["stroke-width"]!=null){elem.attributes["stroke-width"]=elem.attributes["stroke-width"].trim().replace(regNumericValues,(num=>removeLeadingZero(num*scale)))}else{elem.attributes["stroke-width"]=strokeWidth.replace(regNumericValues,(num=>removeLeadingZero(num*scale)))}if(elem.attributes["stroke-dashoffset"]!=null){elem.attributes["stroke-dashoffset"]=elem.attributes["stroke-dashoffset"].trim().replace(regNumericValues,(num=>removeLeadingZero(num*scale)))}if(elem.attributes["stroke-dasharray"]!=null){elem.attributes["stroke-dasharray"]=elem.attributes["stroke-dasharray"].trim().replace(regNumericValues,(num=>removeLeadingZero(num*scale)))}}}}else if(id){return}applyMatrixToPathData(pathData,matrix.data);delete elem.attributes.transform;return};var applyTransforms_1=applyTransforms$1;const transformAbsolutePoint=(matrix,x,y)=>{const newX=matrix[0]*x+matrix[2]*y+matrix[4];const newY=matrix[1]*x+matrix[3]*y+matrix[5];return[newX,newY]};const transformRelativePoint=(matrix,x,y)=>{const newX=matrix[0]*x+matrix[2]*y;const newY=matrix[1]*x+matrix[3]*y;return[newX,newY]};const applyMatrixToPathData=(pathData,matrix)=>{let start=[0,0];let cursor=[0,0];for(const pathItem of pathData){let{instruction:command,data:args}=pathItem;if(command==="M"){cursor[0]=args[0];cursor[1]=args[1];start[0]=cursor[0];start[1]=cursor[1];const[x,y]=transformAbsolutePoint(matrix,args[0],args[1]);args[0]=x;args[1]=y}if(command==="m"){cursor[0]+=args[0];cursor[1]+=args[1];start[0]=cursor[0];start[1]=cursor[1];const[x,y]=transformRelativePoint(matrix,args[0],args[1]);args[0]=x;args[1]=y}if(command==="H"){command="L";args=[args[0],cursor[1]]}if(command==="h"){command="l";args=[args[0],0]}if(command==="V"){command="L";args=[cursor[0],args[0]]}if(command==="v"){command="l";args=[0,args[0]]}if(command==="L"){cursor[0]=args[0];cursor[1]=args[1];const[x,y]=transformAbsolutePoint(matrix,args[0],args[1]);args[0]=x;args[1]=y}if(command==="l"){cursor[0]+=args[0];cursor[1]+=args[1];const[x,y]=transformRelativePoint(matrix,args[0],args[1]);args[0]=x;args[1]=y}if(command==="C"){cursor[0]=args[4];cursor[1]=args[5];const[x1,y1]=transformAbsolutePoint(matrix,args[0],args[1]);const[x2,y2]=transformAbsolutePoint(matrix,args[2],args[3]);const[x,y]=transformAbsolutePoint(matrix,args[4],args[5]);args[0]=x1;args[1]=y1;args[2]=x2;args[3]=y2;args[4]=x;args[5]=y}if(command==="c"){cursor[0]+=args[4];cursor[1]+=args[5];const[x1,y1]=transformRelativePoint(matrix,args[0],args[1]);const[x2,y2]=transformRelativePoint(matrix,args[2],args[3]);const[x,y]=transformRelativePoint(matrix,args[4],args[5]);args[0]=x1;args[1]=y1;args[2]=x2;args[3]=y2;args[4]=x;args[5]=y}if(command==="S"){cursor[0]=args[2];cursor[1]=args[3];const[x2,y2]=transformAbsolutePoint(matrix,args[0],args[1]);const[x,y]=transformAbsolutePoint(matrix,args[2],args[3]);args[0]=x2;args[1]=y2;args[2]=x;args[3]=y}if(command==="s"){cursor[0]+=args[2];cursor[1]+=args[3];const[x2,y2]=transformRelativePoint(matrix,args[0],args[1]);const[x,y]=transformRelativePoint(matrix,args[2],args[3]);args[0]=x2;args[1]=y2;args[2]=x;args[3]=y}if(command==="Q"){cursor[0]=args[2];cursor[1]=args[3];const[x1,y1]=transformAbsolutePoint(matrix,args[0],args[1]);const[x,y]=transformAbsolutePoint(matrix,args[2],args[3]);args[0]=x1;args[1]=y1;args[2]=x;args[3]=y}if(command==="q"){cursor[0]+=args[2];cursor[1]+=args[3];const[x1,y1]=transformRelativePoint(matrix,args[0],args[1]);const[x,y]=transformRelativePoint(matrix,args[2],args[3]);args[0]=x1;args[1]=y1;args[2]=x;args[3]=y}if(command==="T"){cursor[0]=args[0];cursor[1]=args[1];const[x,y]=transformAbsolutePoint(matrix,args[0],args[1]);args[0]=x;args[1]=y}if(command==="t"){cursor[0]+=args[0];cursor[1]+=args[1];const[x,y]=transformRelativePoint(matrix,args[0],args[1]);args[0]=x;args[1]=y}if(command==="A"){transformArc(cursor,args,matrix);cursor[0]=args[5];cursor[1]=args[6];if(Math.abs(args[2])>80){const a=args[0];const rotation=args[2];args[0]=args[1];args[1]=a;args[2]=rotation+(rotation>0?-90:90)}const[x,y]=transformAbsolutePoint(matrix,args[5],args[6]);args[5]=x;args[6]=y}if(command==="a"){transformArc([0,0],args,matrix);cursor[0]+=args[5];cursor[1]+=args[6];if(Math.abs(args[2])>80){const a=args[0];const rotation=args[2];args[0]=args[1];args[1]=a;args[2]=rotation+(rotation>0?-90:90)}const[x,y]=transformRelativePoint(matrix,args[5],args[6]);args[5]=x;args[6]=y}pathItem.instruction=command;pathItem.data=args}};var _applyTransforms={applyTransforms:applyTransforms_1};const{computeStyle:computeStyle$2}=style;const{pathElems:pathElems$2}=_collections;const{path2js:path2js$2,js2path:js2path$1}=_path;const{applyTransforms:applyTransforms}=_applyTransforms;const{cleanupOutData:cleanupOutData$1}=tools;var type$D="perItem";var active$D=true;var description$E="optimizes path data: writes in shorter form, applies transformations";var params$g={applyTransforms:true,applyTransformsStroked:true,makeArcs:{threshold:2.5,tolerance:.5},straightCurves:true,lineShorthands:true,curveSmoothShorthands:true,floatPrecision:3,transformPrecision:5,removeUseless:true,collapseRepeated:true,utilizeAbsolute:true,leadingZero:true,negativeExtraSpace:true,noSpaceAfterFlags:false,forceAbsolutePath:false};let roundData;let precision;let error;let arcThreshold;let arcTolerance;var fn$D=function(item,params){if(item.type==="element"&&pathElems$2.includes(item.name)&&item.attributes.d!=null){const computedStyle=computeStyle$2(item);precision=params.floatPrecision;error=precision!==false?+Math.pow(.1,precision).toFixed(precision):.01;roundData=precision>0&&precision<20?strongRound:round$1;if(params.makeArcs){arcThreshold=params.makeArcs.threshold;arcTolerance=params.makeArcs.tolerance}const hasMarkerMid=computedStyle["marker-mid"]!=null;const maybeHasStroke=computedStyle.stroke&&(computedStyle.stroke.type==="dynamic"||computedStyle.stroke.value!=="none");const maybeHasLinecap=computedStyle["stroke-linecap"]&&(computedStyle["stroke-linecap"].type==="dynamic"||computedStyle["stroke-linecap"].value!=="butt");const maybeHasStrokeAndLinecap=maybeHasStroke&&maybeHasLinecap;var data=path2js$2(item);if(data.length){if(params.applyTransforms){applyTransforms(item,data,params)}convertToRelative(data);data=filters(data,params,{maybeHasStrokeAndLinecap:maybeHasStrokeAndLinecap,hasMarkerMid:hasMarkerMid});if(params.utilizeAbsolute){data=convertToMixed(data,params)}js2path$1(item,data,params)}}};const convertToRelative=pathData=>{let start=[0,0];let cursor=[0,0];let prevCoords=[0,0];for(let i=0;i<pathData.length;i+=1){const pathItem=pathData[i];let{instruction:command,data:args}=pathItem;if(command==="m"){cursor[0]+=args[0];cursor[1]+=args[1];start[0]=cursor[0];start[1]=cursor[1]}if(command==="M"){if(i!==0){command="m"}args[0]-=cursor[0];args[1]-=cursor[1];cursor[0]+=args[0];cursor[1]+=args[1];start[0]=cursor[0];start[1]=cursor[1]}if(command==="l"){cursor[0]+=args[0];cursor[1]+=args[1]}if(command==="L"){command="l";args[0]-=cursor[0];args[1]-=cursor[1];cursor[0]+=args[0];cursor[1]+=args[1]}if(command==="h"){cursor[0]+=args[0]}if(command==="H"){command="h";args[0]-=cursor[0];cursor[0]+=args[0]}if(command==="v"){cursor[1]+=args[0]}if(command==="V"){command="v";args[0]-=cursor[1];cursor[1]+=args[0]}if(command==="c"){cursor[0]+=args[4];cursor[1]+=args[5]}if(command==="C"){command="c";args[0]-=cursor[0];args[1]-=cursor[1];args[2]-=cursor[0];args[3]-=cursor[1];args[4]-=cursor[0];args[5]-=cursor[1];cursor[0]+=args[4];cursor[1]+=args[5]}if(command==="s"){cursor[0]+=args[2];cursor[1]+=args[3]}if(command==="S"){command="s";args[0]-=cursor[0];args[1]-=cursor[1];args[2]-=cursor[0];args[3]-=cursor[1];cursor[0]+=args[2];cursor[1]+=args[3]}if(command==="q"){cursor[0]+=args[2];cursor[1]+=args[3]}if(command==="Q"){command="q";args[0]-=cursor[0];args[1]-=cursor[1];args[2]-=cursor[0];args[3]-=cursor[1];cursor[0]+=args[2];cursor[1]+=args[3]}if(command==="t"){cursor[0]+=args[0];cursor[1]+=args[1]}if(command==="T"){command="t";args[0]-=cursor[0];args[1]-=cursor[1];cursor[0]+=args[0];cursor[1]+=args[1]}if(command==="a"){cursor[0]+=args[5];cursor[1]+=args[6]}if(command==="A"){command="a";args[5]-=cursor[0];args[6]-=cursor[1];cursor[0]+=args[5];cursor[1]+=args[6]}if(command==="Z"||command==="z"){cursor[0]=start[0];cursor[1]=start[1]}pathItem.instruction=command;pathItem.data=args;pathItem.base=prevCoords;pathItem.coords=[cursor[0],cursor[1]];prevCoords=pathItem.coords}return pathData};function filters(path,params,{maybeHasStrokeAndLinecap:maybeHasStrokeAndLinecap,hasMarkerMid:hasMarkerMid}){var stringify=data2Path.bind(null,params),relSubpoint=[0,0],pathBase=[0,0],prev={};path=path.filter((function(item,index,path){var instruction=item.instruction,data=item.data,next=path[index+1];if(data){var sdata=data,circle;if(instruction==="s"){sdata=[0,0].concat(data);if("cs".indexOf(prev.instruction)>-1){var pdata=prev.data,n=pdata.length;sdata[0]=pdata[n-2]-pdata[n-4];sdata[1]=pdata[n-1]-pdata[n-3]}}if(params.makeArcs&&(instruction=="c"||instruction=="s")&&isConvex(sdata)&&(circle=findCircle(sdata))){var r=roundData([circle.radius])[0],angle=findArcAngle(sdata,circle),sweep=sdata[5]*sdata[0]-sdata[4]*sdata[1]>0?1:0,arc={instruction:"a",data:[r,r,0,0,sweep,sdata[4],sdata[5]],coords:item.coords.slice(),base:item.base},output=[arc],relCenter=[circle.center[0]-sdata[4],circle.center[1]-sdata[5]],relCircle={center:relCenter,radius:circle.radius},arcCurves=[item],hasPrev=0,suffix="",nextLonghand;if(prev.instruction=="c"&&isConvex(prev.data)&&isArcPrev(prev.data,circle)||prev.instruction=="a"&&prev.sdata&&isArcPrev(prev.sdata,circle)){arcCurves.unshift(prev);arc.base=prev.base;arc.data[5]=arc.coords[0]-arc.base[0];arc.data[6]=arc.coords[1]-arc.base[1];var prevData=prev.instruction=="a"?prev.sdata:prev.data;var prevAngle=findArcAngle(prevData,{center:[prevData[4]+circle.center[0],prevData[5]+circle.center[1]],radius:circle.radius});angle+=prevAngle;if(angle>Math.PI)arc.data[3]=1;hasPrev=1}for(var j=index;(next=path[++j])&&~"cs".indexOf(next.instruction);){var nextData=next.data;if(next.instruction=="s"){nextLonghand=makeLonghand({instruction:"s",data:next.data.slice()},path[j-1].data);nextData=nextLonghand.data;nextLonghand.data=nextData.slice(0,2);suffix=stringify([nextLonghand])}if(isConvex(nextData)&&isArc(nextData,relCircle)){angle+=findArcAngle(nextData,relCircle);if(angle-2*Math.PI>.001)break;if(angle>Math.PI)arc.data[3]=1;arcCurves.push(next);if(2*Math.PI-angle>.001){arc.coords=next.coords;arc.data[5]=arc.coords[0]-arc.base[0];arc.data[6]=arc.coords[1]-arc.base[1]}else{arc.data[5]=2*(relCircle.center[0]-nextData[4]);arc.data[6]=2*(relCircle.center[1]-nextData[5]);arc.coords=[arc.base[0]+arc.data[5],arc.base[1]+arc.data[6]];arc={instruction:"a",data:[r,r,0,0,sweep,next.coords[0]-arc.coords[0],next.coords[1]-arc.coords[1]],coords:next.coords,base:arc.coords};output.push(arc);j++;break}relCenter[0]-=nextData[4];relCenter[1]-=nextData[5]}else break}if((stringify(output)+suffix).length<stringify(arcCurves).length){if(path[j]&&path[j].instruction=="s"){makeLonghand(path[j],path[j-1].data)}if(hasPrev){var prevArc=output.shift();roundData(prevArc.data);relSubpoint[0]+=prevArc.data[5]-prev.data[prev.data.length-2];relSubpoint[1]+=prevArc.data[6]-prev.data[prev.data.length-1];prev.instruction="a";prev.data=prevArc.data;item.base=prev.coords=prevArc.coords}arc=output.shift();if(arcCurves.length==1){item.sdata=sdata.slice()}else if(arcCurves.length-1-hasPrev>0){path.splice.apply(path,[index+1,arcCurves.length-1-hasPrev].concat(output))}if(!arc)return false;instruction="a";data=arc.data;item.coords=arc.coords}}if(precision!==false){if("mltqsc".indexOf(instruction)>-1){for(var i=data.length;i--;){data[i]+=item.base[i%2]-relSubpoint[i%2]}}else if(instruction=="h"){data[0]+=item.base[0]-relSubpoint[0]}else if(instruction=="v"){data[0]+=item.base[1]-relSubpoint[1]}else if(instruction=="a"){data[5]+=item.base[0]-relSubpoint[0];data[6]+=item.base[1]-relSubpoint[1]}roundData(data);if(instruction=="h")relSubpoint[0]+=data[0];else if(instruction=="v")relSubpoint[1]+=data[0];else{relSubpoint[0]+=data[data.length-2];relSubpoint[1]+=data[data.length-1]}roundData(relSubpoint);if(instruction.toLowerCase()=="m"){pathBase[0]=relSubpoint[0];pathBase[1]=relSubpoint[1]}}if(params.straightCurves){if(instruction==="c"&&isCurveStraightLine(data)||instruction==="s"&&isCurveStraightLine(sdata)){if(next&&next.instruction=="s")makeLonghand(next,data);instruction="l";data=data.slice(-2)}else if(instruction==="q"&&isCurveStraightLine(data)){if(next&&next.instruction=="t")makeLonghand(next,data);instruction="l";data=data.slice(-2)}else if(instruction==="t"&&prev.instruction!=="q"&&prev.instruction!=="t"){instruction="l";data=data.slice(-2)}else if(instruction==="a"&&(data[0]===0||data[1]===0)){instruction="l";data=data.slice(-2)}}if(params.lineShorthands&&instruction==="l"){if(data[1]===0){instruction="h";data.pop()}else if(data[0]===0){instruction="v";data.shift()}}if(params.collapseRepeated&&hasMarkerMid===false&&"mhv".indexOf(instruction)>-1&&prev.instruction&&instruction==prev.instruction.toLowerCase()&&(instruction!="h"&&instruction!="v"||prev.data[0]>=0==data[0]>=0)){prev.data[0]+=data[0];if(instruction!="h"&&instruction!="v"){prev.data[1]+=data[1]}prev.coords=item.coords;path[index]=prev;return false}if(params.curveSmoothShorthands&&prev.instruction){if(instruction==="c"){if(prev.instruction==="c"&&data[0]===-(prev.data[2]-prev.data[4])&&data[1]===-(prev.data[3]-prev.data[5])){instruction="s";data=data.slice(2)}else if(prev.instruction==="s"&&data[0]===-(prev.data[0]-prev.data[2])&&data[1]===-(prev.data[1]-prev.data[3])){instruction="s";data=data.slice(2)}else if("cs".indexOf(prev.instruction)===-1&&data[0]===0&&data[1]===0){instruction="s";data=data.slice(2)}}else if(instruction==="q"){if(prev.instruction==="q"&&data[0]===prev.data[2]-prev.data[0]&&data[1]===prev.data[3]-prev.data[1]){instruction="t";data=data.slice(2)}else if(prev.instruction==="t"&&data[2]===prev.data[0]&&data[3]===prev.data[1]){instruction="t";data=data.slice(2)}}}if(params.removeUseless&&!maybeHasStrokeAndLinecap){if("lhvqtcs".indexOf(instruction)>-1&&data.every((function(i){return i===0}))){path[index]=prev;return false}if(instruction==="a"&&data[5]===0&&data[6]===0){path[index]=prev;return false}}item.instruction=instruction;item.data=data;prev=item}else{relSubpoint[0]=pathBase[0];relSubpoint[1]=pathBase[1];if(prev.instruction=="z")return false;prev=item}return true}));return path}function convertToMixed(path,params){var prev=path[0];path=path.filter((function(item,index){if(index==0)return true;if(!item.data){prev=item;return true}var instruction=item.instruction,data=item.data,adata=data&&data.slice(0);if("mltqsc".indexOf(instruction)>-1){for(var i=adata.length;i--;){adata[i]+=item.base[i%2]}}else if(instruction=="h"){adata[0]+=item.base[0]}else if(instruction=="v"){adata[0]+=item.base[1]}else if(instruction=="a"){adata[5]+=item.base[0];adata[6]+=item.base[1]}roundData(adata);var absoluteDataStr=cleanupOutData$1(adata,params),relativeDataStr=cleanupOutData$1(data,params);if(params.forceAbsolutePath||absoluteDataStr.length<relativeDataStr.length&&!(params.negativeExtraSpace&&instruction==prev.instruction&&prev.instruction.charCodeAt(0)>96&&absoluteDataStr.length==relativeDataStr.length-1&&(data[0]<0||/^0\./.test(data[0])&&prev.data[prev.data.length-1]%1))){item.instruction=instruction.toUpperCase();item.data=adata}prev=item;return true}));return path}function isConvex(data){var center=getIntersection([0,0,data[2],data[3],data[0],data[1],data[4],data[5]]);return center&&data[2]<center[0]==center[0]<0&&data[3]<center[1]==center[1]<0&&data[4]<center[0]==center[0]<data[0]&&data[5]<center[1]==center[1]<data[1]}function getIntersection(coords){var a1=coords[1]-coords[3],b1=coords[2]-coords[0],c1=coords[0]*coords[3]-coords[2]*coords[1],a2=coords[5]-coords[7],b2=coords[6]-coords[4],c2=coords[4]*coords[7]-coords[5]*coords[6],denom=a1*b2-a2*b1;if(!denom)return;var cross=[(b1*c2-b2*c1)/denom,(a1*c2-a2*c1)/-denom];if(!isNaN(cross[0])&&!isNaN(cross[1])&&isFinite(cross[0])&&isFinite(cross[1])){return cross}}function strongRound(data){for(var i=data.length;i-- >0;){if(data[i].toFixed(precision)!=data[i]){var rounded=+data[i].toFixed(precision-1);data[i]=+Math.abs(rounded-data[i]).toFixed(precision+1)>=error?+data[i].toFixed(precision):rounded}}return data}function round$1(data){for(var i=data.length;i-- >0;){data[i]=Math.round(data[i])}return data}function isCurveStraightLine(data){var i=data.length-2,a=-data[i+1],b=data[i],d=1/(a*a+b*b);if(i<=1||!isFinite(d))return false;while((i-=2)>=0){if(Math.sqrt(Math.pow(a*data[i]+b*data[i+1],2)*d)>error)return false}return true}function makeLonghand(item,data){switch(item.instruction){case"s":item.instruction="c";break;case"t":item.instruction="q";break}item.data.unshift(data[data.length-2]-data[data.length-4],data[data.length-1]-data[data.length-3]);return item}function getDistance(point1,point2){return Math.hypot(point1[0]-point2[0],point1[1]-point2[1])}function getCubicBezierPoint(curve,t){var sqrT=t*t,cubT=sqrT*t,mt=1-t,sqrMt=mt*mt;return[3*sqrMt*t*curve[0]+3*mt*sqrT*curve[2]+cubT*curve[4],3*sqrMt*t*curve[1]+3*mt*sqrT*curve[3]+cubT*curve[5]]}function findCircle(curve){var midPoint=getCubicBezierPoint(curve,1/2),m1=[midPoint[0]/2,midPoint[1]/2],m2=[(midPoint[0]+curve[4])/2,(midPoint[1]+curve[5])/2],center=getIntersection([m1[0],m1[1],m1[0]+m1[1],m1[1]-m1[0],m2[0],m2[1],m2[0]+(m2[1]-midPoint[1]),m2[1]-(m2[0]-midPoint[0])]),radius=center&&getDistance([0,0],center),tolerance=Math.min(arcThreshold*error,arcTolerance*radius/100);if(center&&radius<1e15&&[1/4,3/4].every((function(point){return Math.abs(getDistance(getCubicBezierPoint(curve,point),center)-radius)<=tolerance})))return{center:center,radius:radius}}function isArc(curve,circle){var tolerance=Math.min(arcThreshold*error,arcTolerance*circle.radius/100);return[0,1/4,1/2,3/4,1].every((function(point){return Math.abs(getDistance(getCubicBezierPoint(curve,point),circle.center)-circle.radius)<=tolerance}))}function isArcPrev(curve,circle){return isArc(curve,{center:[circle.center[0]+curve[4],circle.center[1]+curve[5]],radius:circle.radius})}function findArcAngle(curve,relCircle){var x1=-relCircle.center[0],y1=-relCircle.center[1],x2=curve[4]-relCircle.center[0],y2=curve[5]-relCircle.center[1];return Math.acos((x1*x2+y1*y2)/Math.sqrt((x1*x1+y1*y1)*(x2*x2+y2*y2)))}function data2Path(params,pathData){return pathData.reduce((function(pathString,item){var strData="";if(item.data){strData=cleanupOutData$1(roundData(item.data.slice()),params)}return pathString+item.instruction+strData}),"")}var convertPathData$1={type:type$D,active:active$D,description:description$E,params:params$g,fn:fn$D};const{stringifyPathData:stringifyPathData}=path;var type$C="perItem";var active$C=true;var description$D="converts basic shapes to more compact path form";var params$f={convertArcs:false,floatPrecision:null};const regNumber=/[-+]?(?:\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?/g;var fn$C=function(item,params){const precision=params?params.floatPrecision:null;const convertArcs=params&&params.convertArcs;if(item.isElem("rect")&&item.attributes.width!=null&&item.attributes.height!=null&&item.attributes.rx==null&&item.attributes.ry==null){const x=Number(item.attributes.x||"0");const y=Number(item.attributes.y||"0");const width=Number(item.attributes.width);const height=Number(item.attributes.height);if(isNaN(x-y+width-height))return;const pathData=[{command:"M",args:[x,y]},{command:"H",args:[x+width]},{command:"V",args:[y+height]},{command:"H",args:[x]},{command:"z",args:[]}];item.attributes.d=stringifyPathData({pathData:pathData,precision:precision});item.renameElem("path");delete item.attributes.x;delete item.attributes.y;delete item.attributes.width;delete item.attributes.height}if(item.isElem("line")){const x1=Number(item.attributes.x1||"0");const y1=Number(item.attributes.y1||"0");const x2=Number(item.attributes.x2||"0");const y2=Number(item.attributes.y2||"0");if(isNaN(x1-y1+x2-y2))return;const pathData=[{command:"M",args:[x1,y1]},{command:"L",args:[x2,y2]}];item.attributes.d=stringifyPathData({pathData:pathData,precision:precision});item.renameElem("path");delete item.attributes.x1;delete item.attributes.y1;delete item.attributes.x2;delete item.attributes.y2}if((item.isElem("polyline")||item.isElem("polygon"))&&item.attributes.points!=null){const coords=(item.attributes.points.match(regNumber)||[]).map(Number);if(coords.length<4)return false;const pathData=[];for(let i=0;i<coords.length;i+=2){pathData.push({command:i===0?"M":"L",args:coords.slice(i,i+2)})}if(item.isElem("polygon")){pathData.push({command:"z",args:[]})}item.attributes.d=stringifyPathData({pathData:pathData,precision:precision});item.renameElem("path");delete item.attributes.points}if(item.isElem("circle")&&convertArcs){const cx=Number(item.attributes.cx||"0");const cy=Number(item.attributes.cy||"0");const r=Number(item.attributes.r||"0");if(isNaN(cx-cy+r)){return}const pathData=[{command:"M",args:[cx,cy-r]},{command:"A",args:[r,r,0,1,0,cx,cy+r]},{command:"A",args:[r,r,0,1,0,cx,cy-r]},{command:"z",args:[]}];item.attributes.d=stringifyPathData({pathData:pathData,precision:precision});item.renameElem("path");delete item.attributes.cx;delete item.attributes.cy;delete item.attributes.r}if(item.isElem("ellipse")&&convertArcs){const ecx=Number(item.attributes.cx||"0");const ecy=Number(item.attributes.cy||"0");const rx=Number(item.attributes.rx||"0");const ry=Number(item.attributes.ry||"0");if(isNaN(ecx-ecy+rx-ry)){return}const pathData=[{command:"M",args:[ecx,ecy-ry]},{command:"A",args:[rx,ry,0,1,0,ecx,ecy+ry]},{command:"A",args:[rx,ry,0,1,0,ecx,ecy-ry]},{command:"z",args:[]}];item.attributes.d=stringifyPathData({pathData:pathData,precision:precision});item.renameElem("path");delete item.attributes.cx;delete item.attributes.cy;delete item.attributes.rx;delete item.attributes.ry}};var convertShapeToPath$1={type:type$C,active:active$C,description:description$D,params:params$f,fn:fn$C};var type$B="perItem";var active$B=false;var description$C="converts style to attributes";var params$e={keepImportant:false};var stylingProps=_collections.attrsGroups.presentation,rEscape="\\\\(?:[0-9a-f]{1,6}\\s?|\\r\\n|.)",rAttr="\\s*("+g("[^:;\\\\]",rEscape)+"*?)\\s*",rSingleQuotes="'(?:[^'\\n\\r\\\\]|"+rEscape+")*?(?:'|$)",rQuotes='"(?:[^"\\n\\r\\\\]|'+rEscape+')*?(?:"|$)',rQuotedString=new RegExp("^"+g(rSingleQuotes,rQuotes)+"$"),rParenthesis="\\("+g("[^'\"()\\\\]+",rEscape,rSingleQuotes,rQuotes)+"*?"+"\\)",rValue="\\s*("+g("[^!'\"();\\\\]+?",rEscape,rSingleQuotes,rQuotes,rParenthesis,"[^;]*?")+"*?"+")",rDeclEnd="\\s*(?:;\\s*|$)",rImportant="(\\s*!important(?![-(\\w]))?",regDeclarationBlock=new RegExp(rAttr+":"+rValue+rImportant+rDeclEnd,"ig"),regStripComments=new RegExp(g(rEscape,rSingleQuotes,rQuotes,"/\\*[^]*?\\*/"),"ig");var fn$B=function(item,params){if(item.type==="element"&&item.attributes.style!=null){let styles=[];const newAttributes={};const styleValue=item.attributes.style.replace(regStripComments,(match=>match[0]=="/"?"":match[0]=="\\"&&/[-g-z]/i.test(match[1])?match[1]:match));regDeclarationBlock.lastIndex=0;for(var rule;rule=regDeclarationBlock.exec(styleValue);){if(!params.keepImportant||!rule[3]){styles.push([rule[1],rule[2]])}}if(styles.length){styles=styles.filter((function(style){if(style[0]){var prop=style[0].toLowerCase(),val=style[1];if(rQuotedString.test(val)){val=val.slice(1,-1)}if(stylingProps.includes(prop)){newAttributes[prop]=val;return false}}return true}));Object.assign(item.attributes,newAttributes);if(styles.length){item.attributes.style=styles.map((declaration=>declaration.join(":"))).join(";")}else{delete item.attributes.style}}}};function g(){return"(?:"+Array.prototype.join.call(arguments,"|")+")"}var convertStyleToAttrs$1={type:type$B,active:active$B,description:description$C,params:params$e,fn:fn$B};var type$A="perItem";var active$A=true;var description$B="collapses multiple transformations and optimizes it";var params$d={convertToShorts:true,floatPrecision:3,transformPrecision:5,matrixToTransform:true,shortTranslate:true,shortScale:true,shortRotate:true,removeUseless:true,collapseIntoOne:true,leadingZero:true,negativeExtraSpace:false};var cleanupOutData=tools.cleanupOutData,transform2js=_transforms.transform2js,transformsMultiply=_transforms.transformsMultiply,matrixToTransform=_transforms.matrixToTransform,degRound,floatRound,transformRound;var fn$A=function(item,params){if(item.type==="element"){if(item.attributes.transform!=null){convertTransform$1(item,"transform",params)}if(item.attributes.gradientTransform!=null){convertTransform$1(item,"gradientTransform",params)}if(item.attributes.patternTransform!=null){convertTransform$1(item,"patternTransform",params)}}};function convertTransform$1(item,attrName,params){let data=transform2js(item.attributes[attrName]);params=definePrecision(data,params);if(params.collapseIntoOne&&data.length>1){data=[transformsMultiply(data)]}if(params.convertToShorts){data=convertToShorts(data,params)}else{data.forEach(roundTransform)}if(params.removeUseless){data=removeUseless(data)}if(data.length){item.attributes[attrName]=js2transform(data,params)}else{delete item.attributes[attrName]}}function definePrecision(data,params){var matrixData=data.reduce(getMatrixData,[]),significantDigits=params.transformPrecision;params=Object.assign({},params);if(matrixData.length){params.transformPrecision=Math.min(params.transformPrecision,Math.max.apply(Math,matrixData.map(floatDigits))||params.transformPrecision);significantDigits=Math.max.apply(Math,matrixData.map((function(n){return String(n).replace(/\D+/g,"").length})))}if(!("degPrecision"in params)){params.degPrecision=Math.max(0,Math.min(params.floatPrecision,significantDigits-2))}floatRound=params.floatPrecision>=1&&params.floatPrecision<20?smartRound.bind(this,params.floatPrecision):round;degRound=params.degPrecision>=1&&params.floatPrecision<20?smartRound.bind(this,params.degPrecision):round;transformRound=params.transformPrecision>=1&&params.floatPrecision<20?smartRound.bind(this,params.transformPrecision):round;return params}function getMatrixData(a,b){return b.name=="matrix"?a.concat(b.data.slice(0,4)):a}function floatDigits(n){return(n=String(n)).slice(n.indexOf(".")).length-1}function convertToShorts(transforms,params){for(var i=0;i<transforms.length;i++){var transform=transforms[i];if(params.matrixToTransform&&transform.name==="matrix"){var decomposed=matrixToTransform(transform,params);if(decomposed!=transform&&js2transform(decomposed,params).length<=js2transform([transform],params).length){transforms.splice.apply(transforms,[i,1].concat(decomposed))}transform=transforms[i]}roundTransform(transform);if(params.shortTranslate&&transform.name==="translate"&&transform.data.length===2&&!transform.data[1]){transform.data.pop()}if(params.shortScale&&transform.name==="scale"&&transform.data.length===2&&transform.data[0]===transform.data[1]){transform.data.pop()}if(params.shortRotate&&transforms[i-2]&&transforms[i-2].name==="translate"&&transforms[i-1].name==="rotate"&&transforms[i].name==="translate"&&transforms[i-2].data[0]===-transforms[i].data[0]&&transforms[i-2].data[1]===-transforms[i].data[1]){transforms.splice(i-2,3,{name:"rotate",data:[transforms[i-1].data[0],transforms[i-2].data[0],transforms[i-2].data[1]]});i-=2}}return transforms}function removeUseless(transforms){return transforms.filter((function(transform){if(["translate","rotate","skewX","skewY"].indexOf(transform.name)>-1&&(transform.data.length==1||transform.name=="rotate")&&!transform.data[0]||transform.name=="translate"&&!transform.data[0]&&!transform.data[1]||transform.name=="scale"&&transform.data[0]==1&&(transform.data.length<2||transform.data[1]==1)||transform.name=="matrix"&&transform.data[0]==1&&transform.data[3]==1&&!(transform.data[1]||transform.data[2]||transform.data[4]||transform.data[5])){return false}return true}))}function js2transform(transformJS,params){var transformString="";transformJS.forEach((function(transform){roundTransform(transform);transformString+=(transformString&&" ")+transform.name+"("+cleanupOutData(transform.data,params)+")"}));return transformString}function roundTransform(transform){switch(transform.name){case"translate":transform.data=floatRound(transform.data);break;case"rotate":transform.data=degRound(transform.data.slice(0,1)).concat(floatRound(transform.data.slice(1)));break;case"skewX":case"skewY":transform.data=degRound(transform.data);break;case"scale":transform.data=transformRound(transform.data);break;case"matrix":transform.data=transformRound(transform.data.slice(0,4)).concat(floatRound(transform.data.slice(4)));break}return transform}function round(data){return data.map(Math.round)}function smartRound(precision,data){for(var i=data.length,tolerance=+Math.pow(.1,precision).toFixed(precision);i--;){if(data[i].toFixed(precision)!=data[i]){var rounded=+data[i].toFixed(precision-1);data[i]=+Math.abs(rounded-data[i]).toFixed(precision+1)>=tolerance?+data[i].toFixed(precision):rounded}}return data}var convertTransform_1={type:type$A,active:active$A,description:description$B,params:params$d,fn:fn$A};var CSSClassList=function(node){this.parentNode=node;this.classNames=new Set;const value=node.attributes.class;if(value!=null){this.addClassValueHandler();this.setClassValue(value)}};CSSClassList.prototype.addClassValueHandler=function(){Object.defineProperty(this.parentNode.attributes,"class",{get:this.getClassValue.bind(this),set:this.setClassValue.bind(this),enumerable:true,configurable:true})};CSSClassList.prototype.getClassValue=function(){var arrClassNames=Array.from(this.classNames);return arrClassNames.join(" ")};CSSClassList.prototype.setClassValue=function(newValue){if(typeof newValue==="undefined"){this.classNames.clear();return}var arrClassNames=newValue.split(" ");this.classNames=new Set(arrClassNames)};CSSClassList.prototype.add=function(){this.addClassValueHandler();Object.values(arguments).forEach(this._addSingle.bind(this))};CSSClassList.prototype._addSingle=function(className){this.classNames.add(className)};CSSClassList.prototype.remove=function(){this.addClassValueHandler();Object.values(arguments).forEach(this._removeSingle.bind(this))};CSSClassList.prototype._removeSingle=function(className){this.classNames.delete(className)};CSSClassList.prototype.item=function(index){var arrClassNames=Array.from(this.classNames);return arrClassNames[index]};CSSClassList.prototype.toggle=function(className,force){if(this.contains(className)||force===false){this.classNames.delete(className)}this.classNames.add(className)};CSSClassList.prototype.contains=function(className){return this.classNames.has(className)};var cssClassList=CSSClassList;var CSSStyleDeclaration=function(node){this.parentNode=node;this.properties=new Map;this.hasSynced=false;this.styleValue=null;this.parseError=false;const value=node.attributes.style;if(value!=null){this.addStyleValueHandler();this.setStyleValue(value)}};CSSStyleDeclaration.prototype.addStyleValueHandler=function(){Object.defineProperty(this.parentNode.attributes,"style",{get:this.getStyleValue.bind(this),set:this.setStyleValue.bind(this),enumerable:true,configurable:true})};CSSStyleDeclaration.prototype.getStyleValue=function(){return this.getCssText()};CSSStyleDeclaration.prototype.setStyleValue=function(newValue){this.properties.clear();this.styleValue=newValue;this.hasSynced=false};CSSStyleDeclaration.prototype._loadCssText=function(){if(this.hasSynced){return}this.hasSynced=true;if(!this.styleValue||this.styleValue.length===0){return}var inlineCssStr=this.styleValue;var declarations={};try{declarations=csstree_min.parse(inlineCssStr,{context:"declarationList",parseValue:false})}catch(parseError){this.parseError=parseError;return}this.parseError=false;var self=this;declarations.children.each((function(declaration){try{var styleDeclaration=cssTools.csstreeToStyleDeclaration(declaration);self.setProperty(styleDeclaration.name,styleDeclaration.value,styleDeclaration.priority)}catch(styleError){if(styleError.message!=="Unknown node type: undefined"){self.parseError=styleError}}}))};CSSStyleDeclaration.prototype.getCssText=function(){var properties=this.getProperties();if(this.parseError){return this.styleValue}var cssText=[];properties.forEach((function(property,propertyName){var strImportant=property.priority==="important"?"!important":"";cssText.push(propertyName.trim()+":"+property.value.trim()+strImportant)}));return cssText.join(";")};CSSStyleDeclaration.prototype._handleParseError=function(){if(this.parseError){console.warn("Warning: Parse error when parsing inline styles, style properties of this element cannot be used. The raw styles can still be get/set using .attr('style').value. Error details: "+this.parseError)}};CSSStyleDeclaration.prototype._getProperty=function(propertyName){if(typeof propertyName==="undefined"){throw Error("1 argument required, but only 0 present.")}var properties=this.getProperties();this._handleParseError();var property=properties.get(propertyName.trim());return property};CSSStyleDeclaration.prototype.getPropertyPriority=function(propertyName){var property=this._getProperty(propertyName);return property?property.priority:""};CSSStyleDeclaration.prototype.getPropertyValue=function(propertyName){var property=this._getProperty(propertyName);return property?property.value:null};CSSStyleDeclaration.prototype.item=function(index){if(typeof index==="undefined"){throw Error("1 argument required, but only 0 present.")}var properties=this.getProperties();this._handleParseError();return Array.from(properties.keys())[index]};CSSStyleDeclaration.prototype.getProperties=function(){this._loadCssText();return this.properties};CSSStyleDeclaration.prototype.removeProperty=function(propertyName){if(typeof propertyName==="undefined"){throw Error("1 argument required, but only 0 present.")}this.addStyleValueHandler();var properties=this.getProperties();this._handleParseError();var oldValue=this.getPropertyValue(propertyName);properties.delete(propertyName.trim());return oldValue};CSSStyleDeclaration.prototype.setProperty=function(propertyName,value,priority){if(typeof propertyName==="undefined"){throw Error("propertyName argument required, but only not present.")}this.addStyleValueHandler();var properties=this.getProperties();this._handleParseError();var property={value:value.trim(),priority:priority.trim()};properties.set(propertyName.trim(),property);return property};var cssStyleDeclaration=CSSStyleDeclaration;const{selectAll:selectAll,selectOne:selectOne,is:is}=lib$1;const{parseName:parseName$4}=tools;var cssSelectOpts={xmlMode:true,adapter:cssSelectAdapter};const attrsHandler={get:(attributes,name)=>{if(attributes.hasOwnProperty(name)){return{name:name,get value(){return attributes[name]},set value(value){attributes[name]=value}}}},set:(attributes,name,attr)=>{attributes[name]=attr.value;return true}};var JSAPI=function(data,parentNode){Object.assign(this,data);if(this.type==="element"){if(this.attributes==null){this.attributes={}}if(this.children==null){this.children=[]}Object.defineProperty(this,"class",{writable:true,configurable:true,value:new cssClassList(this)});Object.defineProperty(this,"style",{writable:true,configurable:true,value:new cssStyleDeclaration(this)});Object.defineProperty(this,"parentNode",{writable:true,value:parentNode});const element=this;Object.defineProperty(this,"attrs",{configurable:true,get(){return new Proxy(element.attributes,attrsHandler)},set(value){const newAttributes={};for(const attr of Object.values(value)){newAttributes[attr.name]=attr.value}element.attributes=newAttributes}})}};var jsAPI=JSAPI;JSAPI.prototype.clone=function(){const{children:children,...nodeData}=this;const clonedNode=new JSAPI(JSON.parse(JSON.stringify(nodeData)),null);if(children){clonedNode.children=children.map((child=>{const clonedChild=child.clone();clonedChild.parentNode=clonedNode;return clonedChild}))}return clonedNode};JSAPI.prototype.isElem=function(param){if(this.type!=="element"){return false}if(param==null){return true}if(Array.isArray(param)){return param.includes(this.name)}return this.name===param};JSAPI.prototype.renameElem=function(name){if(name&&typeof name==="string")this.name=name;return this};JSAPI.prototype.isEmpty=function(){return!this.children||!this.children.length};JSAPI.prototype.closestElem=function(elemName){var elem=this;while((elem=elem.parentNode)&&!elem.isElem(elemName));return elem};JSAPI.prototype.spliceContent=function(start,n,insertion){if(arguments.length<2)return[];if(!Array.isArray(insertion))insertion=Array.apply(null,arguments).slice(2);insertion.forEach((function(inner){inner.parentNode=this}),this);return this.children.splice.apply(this.children,[start,n].concat(insertion))};JSAPI.prototype.hasAttr=function(name,val){if(this.type!=="element"){return false}if(Object.keys(this.attributes).length===0){return false}if(name==null){return true}if(this.attributes.hasOwnProperty(name)===false){return false}if(val!==undefined){return this.attributes[name]===val.toString()}return true};JSAPI.prototype.hasAttrLocal=function(localName,val){if(!this.attrs||!Object.keys(this.attrs).length)return false;if(!arguments.length)return!!this.attrs;var callback;switch(val!=null&&val.constructor&&val.constructor.name){case"Number":case"String":callback=stringValueTest;break;case"RegExp":callback=regexpValueTest;break;case"Function":callback=funcValueTest;break;default:callback=nameTest}return this.someAttr(callback);function nameTest(attr){const{local:local}=parseName$4(attr.name);return local===localName}function stringValueTest(attr){const{local:local}=parseName$4(attr.name);return local===localName&&val==attr.value}function regexpValueTest(attr){const{local:local}=parseName$4(attr.name);return local===localName&&val.test(attr.value)}function funcValueTest(attr){const{local:local}=parseName$4(attr.name);return local===localName&&val(attr.value)}};JSAPI.prototype.attr=function(name,val){if(this.hasAttr(name,val)){return this.attrs[name]}};JSAPI.prototype.computedAttr=function(name,val){if(!arguments.length)return;for(var elem=this;elem&&(!elem.hasAttr(name)||!elem.attributes[name]);elem=elem.parentNode);if(val!=null){return elem?elem.hasAttr(name,val):false}else if(elem&&elem.hasAttr(name)){return elem.attributes[name]}};JSAPI.prototype.removeAttr=function(name,val){if(this.type!=="element"){return false}if(arguments.length===0){return false}if(Array.isArray(name)){for(const nameItem of name){this.removeAttr(nameItem,val)}return false}if(this.hasAttr(name,val)===false){return false}delete this.attributes[name];return true};JSAPI.prototype.addAttr=function(attr){attr=attr||{};if(attr.name===undefined)return false;this.attributes[attr.name]=attr.value;if(attr.name==="class"){this.class.hasClass()}if(attr.name==="style"){this.style.hasStyle()}return this.attrs[attr.name]};JSAPI.prototype.eachAttr=function(callback,context){if(this.type!=="element"){return false}if(callback==null){return false}for(const attr of Object.values(this.attrs)){callback.call(context,attr)}return true};JSAPI.prototype.someAttr=function(callback,context){if(this.type!=="element"){return false}for(const attr of Object.values(this.attrs)){if(callback.call(context,attr))return true}return false};JSAPI.prototype.querySelectorAll=function(selectors){var matchedEls=selectAll(selectors,this,cssSelectOpts);return matchedEls.length>0?matchedEls:null};JSAPI.prototype.querySelector=function(selectors){return selectOne(selectors,this,cssSelectOpts)};JSAPI.prototype.matches=function(selector){return is(this,selector,cssSelectOpts)};const{closestByName:closestByName$3,detachNodeFromParent:detachNodeFromParent}=xast;var type$z="visitor";var active$z=true;var description$A="merge multiple style elements into one";var fn$z=()=>{let firstStyleElement=null;let collectedStyles="";let styleContentType="text";const enterElement=node=>{if(node.name!=="style"){return}if(node.attributes.type!=null&&node.attributes.type!==""&&node.attributes.type!=="text/css"){return}if(closestByName$3(node,"foreignObject")){return}let css="";for(const child of node.children){if(child.type==="text"){css+=child.value}if(child.type==="cdata"){styleContentType="cdata";css+=child.value}}if(css.trim().length===0){detachNodeFromParent(node);return}if(node.attributes.media==null){collectedStyles+=css}else{collectedStyles+=`@media ${node.attributes.media}{${css}}`;delete node.attributes.media}if(firstStyleElement==null){firstStyleElement=node}else{detachNodeFromParent(node);firstStyleElement.children=[new jsAPI({type:styleContentType,value:collectedStyles},firstStyleElement)]}};return{element:{enter:enterElement}}};var mergeStyles$1={type:type$z,active:active$z,description:description$A,fn:fn$z};const{querySelectorAll:querySelectorAll,closestByName:closestByName$2}=xast;var type$y="full";var active$y=true;var params$c={onlyMatchedOnce:true,removeMatchedSelectors:true,useMqs:["","screen"],usePseudos:[""]};var description$z="inline styles (additional options)";var fn$y=function(root,opts){var styleEls=querySelectorAll(root,"style");if(styleEls.length===0){return root}var styles=[],selectors=[];for(var styleEl of styleEls){if(styleEl.attributes.type!=null&&styleEl.attributes.type!==""&&styleEl.attributes.type!=="text/css"){continue}if(styleEl.children.length===0||closestByName$2(styleEl,"foreignObject")){continue}var cssStr=cssTools.getCssStr(styleEl);var cssAst={};try{cssAst=csstree_min.parse(cssStr,{parseValue:false,parseCustomProperty:false})}catch(parseError){continue}styles.push({styleEl:styleEl,cssAst:cssAst});selectors=selectors.concat(cssTools.flattenToSelectors(cssAst))}var selectorsMq=cssTools.filterByMqs(selectors,opts.useMqs);var selectorsPseudo=cssTools.filterByPseudos(selectorsMq,opts.usePseudos);cssTools.cleanPseudos(selectorsPseudo);var sortedSelectors=cssTools.sortSelectors(selectorsPseudo).reverse();var selector,selectedEl;for(selector of sortedSelectors){var selectorStr=csstree_min.generate(selector.item.data),selectedEls=null;try{selectedEls=querySelectorAll(root,selectorStr)}catch(selectError){continue}if(selectedEls.length===0){continue}selector.selectedEls=selectedEls}for(selector of sortedSelectors){if(!selector.selectedEls){continue}if(opts.onlyMatchedOnce&&selector.selectedEls!==null&&selector.selectedEls.length>1){continue}for(selectedEl of selector.selectedEls){if(selector.rule===null){continue}csstree_min.walk(selector.rule,{visit:"Declaration",enter:function(styleCsstreeDeclaration){var styleDeclaration=cssTools.csstreeToStyleDeclaration(styleCsstreeDeclaration);if(selectedEl.style.getPropertyValue(styleDeclaration.name)!==null&&selectedEl.style.getPropertyPriority(styleDeclaration.name)>=styleDeclaration.priority){return}selectedEl.style.setProperty(styleDeclaration.name,styleDeclaration.value,styleDeclaration.priority)}})}if(opts.removeMatchedSelectors&&selector.selectedEls!==null&&selector.selectedEls.length>0){selector.rule.prelude.children.remove(selector.item)}}if(!opts.removeMatchedSelectors){return root}for(selector of sortedSelectors){if(!selector.selectedEls){continue}if(opts.onlyMatchedOnce&&selector.selectedEls!==null&&selector.selectedEls.length>1){continue}for(selectedEl of selector.selectedEls){var firstSubSelector=selector.item.data.children.first();if(firstSubSelector.type==="ClassSelector"){selectedEl.class.remove(firstSubSelector.name)}if(typeof selectedEl.class.item(0)==="undefined"){delete selectedEl.attributes.class}if(firstSubSelector.type==="IdSelector"){if(selectedEl.attributes.id===firstSubSelector.name){delete selectedEl.attributes.id}}}}for(var style of styles){csstree_min.walk(style.cssAst,{visit:"Rule",enter:function(node,item,list){if(node.type==="Atrule"&&node.block!==null&&node.block.children.isEmpty()){list.remove(item);return}if(node.type==="Rule"&&node.prelude.children.isEmpty()){list.remove(item)}}});if(style.cssAst.children.isEmpty()){var styleParentEl=style.styleEl.parentNode;styleParentEl.spliceContent(styleParentEl.children.indexOf(style.styleEl),1);if(styleParentEl.name==="defs"&&styleParentEl.children.length===0){var defsParentEl=styleParentEl.parentNode;defsParentEl.spliceContent(defsParentEl.children.indexOf(styleParentEl),1)}continue}cssTools.setCssStr(style.styleEl,csstree_min.generate(style.cssAst))}return root};var inlineStyles$1={type:type$y,active:active$y,params:params$c,description:description$z,fn:fn$y};const{computeStyle:computeStyle$1}=style;const{path2js:path2js$1,js2path:js2path,intersects:intersects$1}=_path;var type$x="perItem";var active$x=true;var description$y="merges multiple paths in one if possible";var params$b={collapseRepeated:true,force:false,leadingZero:true,negativeExtraSpace:true,noSpaceAfterFlags:false};var fn$x=function(item,params){if(item.type!=="element"||item.children.length===0)return;let prevContentItem=null;let prevContentItemKeys=null;item.children=item.children.filter((function(contentItem){if(prevContentItem&&prevContentItem.isElem("path")&&prevContentItem.children.length===0&&prevContentItem.attributes.d!=null&&contentItem.isElem("path")&&contentItem.children.length===0&&contentItem.attributes.d!=null){const computedStyle=computeStyle$1(contentItem);if(computedStyle["marker-start"]||computedStyle["marker-mid"]||computedStyle["marker-end"]){return true}if(!prevContentItemKeys){prevContentItemKeys=Object.keys(prevContentItem.attributes)}const contentItemAttrs=Object.keys(contentItem.attributes);const equalData=prevContentItemKeys.length==contentItemAttrs.length&&contentItemAttrs.every((function(key){return key=="d"||prevContentItem.attributes[key]!=null&&prevContentItem.attributes[key]==contentItem.attributes[key]}));const prevPathJS=path2js$1(prevContentItem);const curPathJS=path2js$1(contentItem);if(equalData&&(params.force||!intersects$1(prevPathJS,curPathJS))){js2path(prevContentItem,prevPathJS.concat(curPathJS),params);return false}}prevContentItem=contentItem;prevContentItemKeys=null;return true}))};var mergePaths$1={type:type$x,active:active$x,description:description$y,params:params$b,fn:fn$x};var hasOwnProperty$3=Object.prototype.hasOwnProperty;function buildMap(list,caseInsensitive){var map=Object.create(null);if(!Array.isArray(list)){return null}for(var i=0;i<list.length;i++){var name=list[i];if(caseInsensitive){name=name.toLowerCase()}map[name]=true}return map}function buildList(data){if(!data){return null}var tags=buildMap(data.tags,true);var ids=buildMap(data.ids);var classes=buildMap(data.classes);if(tags===null&&ids===null&&classes===null){return null}return{tags:tags,ids:ids,classes:classes}}function buildIndex(data){var scopes=false;if(data.scopes&&Array.isArray(data.scopes)){scopes=Object.create(null);for(var i=0;i<data.scopes.length;i++){var list=data.scopes[i];if(!list||!Array.isArray(list)){throw new Error("Wrong usage format")}for(var j=0;j<list.length;j++){var name=list[j];if(hasOwnProperty$3.call(scopes,name)){throw new Error("Class can't be used for several scopes: "+name)}scopes[name]=i+1}}}return{whitelist:buildList(data),blacklist:buildList(data.blacklist),scopes:scopes}}var usage={buildIndex:buildIndex};var utils$1={hasNoChildren:function(node){return!node||!node.children||node.children.isEmpty()},isNodeChildrenList:function(node,list){return node!==null&&node.children===list}};var resolveKeyword$4=csstree_min.keyword;var{hasNoChildren:hasNoChildren$1}=utils$1;var Atrule$1=function cleanAtrule(node,item,list){if(node.block){if(this.stylesheet!==null){this.stylesheet.firstAtrulesAllowed=false}if(hasNoChildren$1(node.block)){list.remove(item);return}}switch(node.name){case"charset":if(hasNoChildren$1(node.prelude)){list.remove(item);return}if(item.prev){list.remove(item);return}break;case"import":if(this.stylesheet===null||!this.stylesheet.firstAtrulesAllowed){list.remove(item);return}list.prevUntil(item.prev,(function(rule){if(rule.type==="Atrule"){if(rule.name==="import"||rule.name==="charset"){return}}this.root.firstAtrulesAllowed=false;list.remove(item);return true}),this);break;default:var name=resolveKeyword$4(node.name).basename;if(name==="keyframes"||name==="media"||name==="supports"){if(hasNoChildren$1(node.prelude)||hasNoChildren$1(node.block)){list.remove(item)}}}};var Comment=function cleanComment(data,item,list){list.remove(item)};var property=csstree_min.property;var Declaration=function cleanDeclartion(node,item,list){if(node.value.children&&node.value.children.isEmpty()){list.remove(item);return}if(property(node.property).custom){if(/\S/.test(node.value.value)){node.value.value=node.value.value.trim()}}};var{isNodeChildrenList:isNodeChildrenList$1}=utils$1;var Raw=function cleanRaw(node,item,list){if(isNodeChildrenList$1(this.stylesheet,list)||isNodeChildrenList$1(this.block,list)){list.remove(item)}};var hasOwnProperty$2=Object.prototype.hasOwnProperty;var walk$b=csstree_min.walk;var{hasNoChildren:hasNoChildren}=utils$1;function cleanUnused(selectorList,usageData){selectorList.children.each((function(selector,item,list){var shouldRemove=false;walk$b(selector,(function(node){if(this.selector===null||this.selector===selectorList){switch(node.type){case"SelectorList":if(this.function===null||this.function.name.toLowerCase()!=="not"){if(cleanUnused(node,usageData)){shouldRemove=true}}break;case"ClassSelector":if(usageData.whitelist!==null&&usageData.whitelist.classes!==null&&!hasOwnProperty$2.call(usageData.whitelist.classes,node.name)){shouldRemove=true}if(usageData.blacklist!==null&&usageData.blacklist.classes!==null&&hasOwnProperty$2.call(usageData.blacklist.classes,node.name)){shouldRemove=true}break;case"IdSelector":if(usageData.whitelist!==null&&usageData.whitelist.ids!==null&&!hasOwnProperty$2.call(usageData.whitelist.ids,node.name)){shouldRemove=true}if(usageData.blacklist!==null&&usageData.blacklist.ids!==null&&hasOwnProperty$2.call(usageData.blacklist.ids,node.name)){shouldRemove=true}break;case"TypeSelector":if(node.name.charAt(node.name.length-1)!=="*"){if(usageData.whitelist!==null&&usageData.whitelist.tags!==null&&!hasOwnProperty$2.call(usageData.whitelist.tags,node.name.toLowerCase())){shouldRemove=true}if(usageData.blacklist!==null&&usageData.blacklist.tags!==null&&hasOwnProperty$2.call(usageData.blacklist.tags,node.name.toLowerCase())){shouldRemove=true}}break}}}));if(shouldRemove){list.remove(item)}}));return selectorList.children.isEmpty()}var Rule=function cleanRule(node,item,list,options){if(hasNoChildren(node.prelude)||hasNoChildren(node.block)){list.remove(item);return}var usageData=options.usage;if(usageData&&(usageData.whitelist!==null||usageData.blacklist!==null)){cleanUnused(node.prelude,usageData);if(hasNoChildren(node.prelude)){list.remove(item);return}}};var TypeSelector=function cleanTypeSelector(node,item,list){var name=item.data.name;if(name!=="*"){return}var nextType=item.next&&item.next.data.type;if(nextType==="IdSelector"||nextType==="ClassSelector"||nextType==="AttributeSelector"||nextType==="PseudoClassSelector"||nextType==="PseudoElementSelector"){list.remove(item)}};var{isNodeChildrenList:isNodeChildrenList}=utils$1;function isSafeOperator(node){return node.type==="Operator"&&node.value!=="+"&&node.value!=="-"}var WhiteSpace=function cleanWhitespace(node,item,list){if(item.next===null||item.prev===null){list.remove(item);return}if(isNodeChildrenList(this.stylesheet,list)||isNodeChildrenList(this.block,list)){list.remove(item);return}if(item.next.data.type==="WhiteSpace"){list.remove(item);return}if(isSafeOperator(item.prev.data)||isSafeOperator(item.next.data)){list.remove(item);return}};var walk$a=csstree_min.walk;var handlers$2={Atrule:Atrule$1,Comment:Comment,Declaration:Declaration,Raw:Raw,Rule:Rule,TypeSelector:TypeSelector,WhiteSpace:WhiteSpace};var clean=function(ast,options){walk$a(ast,{leave:function(node,item,list){if(handlers$2.hasOwnProperty(node.type)){handlers$2[node.type].call(this,node,item,list,options)}}})};var keyframes=function(node){node.block.children.each((function(rule){rule.prelude.children.each((function(simpleselector){simpleselector.children.each((function(data,item){if(data.type==="Percentage"&&data.value==="100"){item.data={type:"TypeSelector",loc:data.loc,name:"to"}}else if(data.type==="TypeSelector"&&data.name==="from"){item.data={type:"Percentage",loc:data.loc,value:"0"}}}))}))}))};var resolveKeyword$3=csstree_min.keyword;var Atrule=function(node){if(resolveKeyword$3(node.name).basename==="keyframes"){keyframes(node)}};var escapesRx=/\\([0-9A-Fa-f]{1,6})(\r\n|[ \t\n\f\r])?|\\./g;var blockUnquoteRx=/^(-?\d|--)|[\u0000-\u002c\u002e\u002f\u003A-\u0040\u005B-\u005E\u0060\u007B-\u009f]/;function canUnquote(value){if(value===""||value==="-"){return}value=value.replace(escapesRx,"a");return!blockUnquoteRx.test(value)}var AttributeSelector=function(node){var attrValue=node.value;if(!attrValue||attrValue.type!=="String"){return}var unquotedValue=attrValue.value.replace(/^(.)(.*)\1$/,"$2");if(canUnquote(unquotedValue)){node.value={type:"Identifier",loc:attrValue.loc,name:unquotedValue}}};var font=function compressFont(node){var list=node.children;list.eachRight((function(node,item){if(node.type==="Identifier"){if(node.name==="bold"){item.data={type:"Number",loc:node.loc,value:"700"}}else if(node.name==="normal"){var prev=item.prev;if(prev&&prev.data.type==="Operator"&&prev.data.value==="/"){this.remove(prev)}this.remove(item)}else if(node.name==="medium"){var next=item.next;if(!next||next.data.type!=="Operator"){this.remove(item)}}}}));list.each((function(node,item){if(node.type==="WhiteSpace"){if(!item.prev||!item.next||item.next.data.type==="WhiteSpace"){this.remove(item)}}}));if(list.isEmpty()){list.insert(list.createItem({type:"Identifier",name:"normal"}))}};var fontWeight=function compressFontWeight(node){var value=node.children.head.data;if(value.type==="Identifier"){switch(value.name){case"normal":node.children.head.data={type:"Number",loc:value.loc,value:"400"};break;case"bold":node.children.head.data={type:"Number",loc:value.loc,value:"700"};break}}};var List$5=csstree_min.List;var background=function compressBackground(node){function lastType(){if(buffer.length){return buffer[buffer.length-1].type}}function flush(){if(lastType()==="WhiteSpace"){buffer.pop()}if(!buffer.length){buffer.unshift({type:"Number",loc:null,value:"0"},{type:"WhiteSpace",value:" "},{type:"Number",loc:null,value:"0"})}newValue.push.apply(newValue,buffer);buffer=[]}var newValue=[];var buffer=[];node.children.each((function(node){if(node.type==="Operator"&&node.value===","){flush();newValue.push(node);return}if(node.type==="Identifier"){if(node.name==="transparent"||node.name==="none"||node.name==="repeat"||node.name==="scroll"){return}}if(node.type==="WhiteSpace"&&(!buffer.length||lastType()==="WhiteSpace")){return}buffer.push(node)}));flush();node.children=(new List$5).fromArray(newValue)};function removeItemAndRedundantWhiteSpace(list,item){var prev=item.prev;var next=item.next;if(next!==null){if(next.data.type==="WhiteSpace"&&(prev===null||prev.data.type==="WhiteSpace")){list.remove(next)}}else if(prev!==null&&prev.data.type==="WhiteSpace"){list.remove(prev)}list.remove(item)}var border=function compressBorder(node){node.children.each((function(node,item,list){if(node.type==="Identifier"&&node.name.toLowerCase()==="none"){if(list.head===list.tail){item.data={type:"Number",loc:node.loc,value:"0"}}else{removeItemAndRedundantWhiteSpace(list,item)}}}))};var resolveName=csstree_min.property;var handlers$1={font:font,"font-weight":fontWeight,background:background,border:border,outline:border};var Value=function compressValue(node){if(!this.declaration){return}var property=resolveName(this.declaration.property);if(handlers$1.hasOwnProperty(property.basename)){handlers$1[property.basename](node)}};var OMIT_PLUSSIGN=/^(?:\+|(-))?0*(\d*)(?:\.0*|(\.\d*?)0*)?$/;var KEEP_PLUSSIGN=/^([\+\-])?0*(\d*)(?:\.0*|(\.\d*?)0*)?$/;var unsafeToRemovePlusSignAfter={Dimension:true,Hash:true,Identifier:true,Number:true,Raw:true,UnicodeRange:true};function packNumber$3(value,item){var regexp=item&&item.prev!==null&&unsafeToRemovePlusSignAfter.hasOwnProperty(item.prev.data.type)?KEEP_PLUSSIGN:OMIT_PLUSSIGN;value=String(value).replace(regexp,"$1$2$3");if(value===""||value==="-"){value="0"}return value}var _Number=function(node,item){node.value=packNumber$3(node.value,item)};var pack=packNumber$3;_Number.pack=pack;var packNumber$2=_Number.pack;var MATH_FUNCTIONS={calc:true,min:true,max:true,clamp:true};var LENGTH_UNIT={px:true,mm:true,cm:true,in:true,pt:true,pc:true,em:true,ex:true,ch:true,rem:true,vh:true,vw:true,vmin:true,vmax:true,vm:true};var Dimension=function compressDimension(node,item){var value=packNumber$2(node.value,item);node.value=value;if(value==="0"&&this.declaration!==null&&this.atrulePrelude===null){var unit=node.unit.toLowerCase();if(!LENGTH_UNIT.hasOwnProperty(unit)){return}if(this.declaration.property==="-ms-flex"||this.declaration.property==="flex"){return}if(this.function&&MATH_FUNCTIONS.hasOwnProperty(this.function.name)){return}item.data={type:"Number",loc:node.loc,value:value}}};var lexer$1=csstree_min.lexer;var packNumber$1=_Number.pack;var blacklist=new Set(["width","min-width","max-width","height","min-height","max-height","flex","-ms-flex"]);var Percentage=function compressPercentage(node,item){node.value=packNumber$1(node.value,item);if(node.value==="0"&&this.declaration&&!blacklist.has(this.declaration.property)){item.data={type:"Number",loc:node.loc,value:node.value};if(!lexer$1.matchDeclaration(this.declaration).isType(item.data,"length")){item.data=node}}};var _String=function(node){var value=node.value;value=value.replace(/\\(\r\n|\r|\n|\f)/g,"");node.value=value};var UNICODE="\\\\[0-9a-f]{1,6}(\\r\\n|[ \\n\\r\\t\\f])?";var ESCAPE="("+UNICODE+"|\\\\[^\\n\\r\\f0-9a-fA-F])";var NONPRINTABLE="\0\b\v-";var SAFE_URL=new RegExp("^("+ESCAPE+"|[^\"'\\(\\)\\\\\\s"+NONPRINTABLE+"])*$","i");var Url=function(node){var value=node.value;if(value.type!=="String"){return}var quote=value.value[0];var url=value.value.substr(1,value.value.length-2);url=url.replace(/\\\\/g,"/");if(SAFE_URL.test(url)){node.value={type:"Raw",loc:node.value.loc,value:url}}else{node.value.value=url.indexOf('"')===-1?'"'+url+'"':quote+url+quote}};var lexer=csstree_min.lexer;var packNumber=_Number.pack;var NAME_TO_HEX={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgrey:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",grey:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"639",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"};var HEX_TO_NAME={8e5:"maroon",800080:"purple",808e3:"olive",808080:"gray","00ffff":"cyan",f0ffff:"azure",f5f5dc:"beige",ffe4c4:"bisque","000000":"black","0000ff":"blue",a52a2a:"brown",ff7f50:"coral",ffd700:"gold","008000":"green","4b0082":"indigo",fffff0:"ivory",f0e68c:"khaki","00ff00":"lime",faf0e6:"linen","000080":"navy",ffa500:"orange",da70d6:"orchid",cd853f:"peru",ffc0cb:"pink",dda0dd:"plum",f00:"red",ff0000:"red",fa8072:"salmon",a0522d:"sienna",c0c0c0:"silver",fffafa:"snow",d2b48c:"tan","008080":"teal",ff6347:"tomato",ee82ee:"violet",f5deb3:"wheat",ffffff:"white",ffff00:"yellow"};function hueToRgb(p,q,t){if(t<0){t+=1}if(t>1){t-=1}if(t<1/6){return p+(q-p)*6*t}if(t<1/2){return q}if(t<2/3){return p+(q-p)*(2/3-t)*6}return p}function hslToRgb(h,s,l,a){var r;var g;var b;if(s===0){r=g=b=l}else{var q=l<.5?l*(1+s):l+s-l*s;var p=2*l-q;r=hueToRgb(p,q,h+1/3);g=hueToRgb(p,q,h);b=hueToRgb(p,q,h-1/3)}return[Math.round(r*255),Math.round(g*255),Math.round(b*255),a]}function toHex(value){value=value.toString(16);return value.length===1?"0"+value:value}function parseFunctionArgs(functionArgs,count,rgb){var cursor=functionArgs.head;var args=[];var wasValue=false;while(cursor!==null){var node=cursor.data;var type=node.type;switch(type){case"Number":case"Percentage":if(wasValue){return}wasValue=true;args.push({type:type,value:Number(node.value)});break;case"Operator":if(node.value===","){if(!wasValue){return}wasValue=false}else if(wasValue||node.value!=="+"){return}break;default:return}cursor=cursor.next}if(args.length!==count){return}if(args.length===4){if(args[3].type!=="Number"){return}args[3].type="Alpha"}if(rgb){if(args[0].type!==args[1].type||args[0].type!==args[2].type){return}}else{if(args[0].type!=="Number"||args[1].type!=="Percentage"||args[2].type!=="Percentage"){return}args[0].type="Angle"}return args.map((function(arg){var value=Math.max(0,arg.value);switch(arg.type){case"Number":value=Math.min(value,255);break;case"Percentage":value=Math.min(value,100)/100;if(!rgb){return value}value=255*value;break;case"Angle":return(value%360+360)%360/360;case"Alpha":return Math.min(value,1)}return Math.round(value)}))}function compressFunction(node,item,list){var functionName=node.name;var args;if(functionName==="rgba"||functionName==="hsla"){args=parseFunctionArgs(node.children,4,functionName==="rgba");if(!args){return}if(functionName==="hsla"){args=hslToRgb.apply(null,args);node.name="rgba"}if(args[3]===0){var scopeFunctionName=this.function&&this.function.name;if(args[0]===0&&args[1]===0&&args[2]===0||!/^(?:to|from|color-stop)$|gradient$/i.test(scopeFunctionName)){item.data={type:"Identifier",loc:node.loc,name:"transparent"};return}}if(args[3]!==1){node.children.each((function(node,item,list){if(node.type==="Operator"){if(node.value!==","){list.remove(item)}return}item.data={type:"Number",loc:node.loc,value:packNumber(args.shift(),null)}}));return}functionName="rgb"}if(functionName==="hsl"){args=args||parseFunctionArgs(node.children,3,false);if(!args){return}args=hslToRgb.apply(null,args);functionName="rgb"}if(functionName==="rgb"){args=args||parseFunctionArgs(node.children,3,true);if(!args){return}var next=item.next;if(next&&next.data.type!=="WhiteSpace"){list.insert(list.createItem({type:"WhiteSpace",value:" "}),next)}item.data={type:"Hash",loc:node.loc,value:toHex(args[0])+toHex(args[1])+toHex(args[2])};compressHex(item.data,item)}}function compressIdent(node,item){if(this.declaration===null){return}var color=node.name.toLowerCase();if(NAME_TO_HEX.hasOwnProperty(color)&&lexer.matchDeclaration(this.declaration).isType(node,"color")){var hex=NAME_TO_HEX[color];if(hex.length+1<=color.length){item.data={type:"Hash",loc:node.loc,value:hex}}else{if(color==="grey"){color="gray"}node.name=color}}}function compressHex(node,item){var color=node.value.toLowerCase();if(color.length===6&&color[0]===color[1]&&color[2]===color[3]&&color[4]===color[5]){color=color[0]+color[2]+color[4]}if(HEX_TO_NAME[color]){item.data={type:"Identifier",loc:node.loc,name:HEX_TO_NAME[color]}}else{node.value=color}}var color={compressFunction:compressFunction,compressIdent:compressIdent,compressHex:compressHex};var walk$9=csstree_min.walk;var handlers={Atrule:Atrule,AttributeSelector:AttributeSelector,Value:Value,Dimension:Dimension,Percentage:Percentage,Number:_Number,String:_String,Url:Url,Hash:color.compressHex,Identifier:color.compressIdent,Function:color.compressFunction};var replace=function(ast){walk$9(ast,{leave:function(node,item,list){if(handlers.hasOwnProperty(node.type)){handlers[node.type].call(this,node,item,list)}}})};var generate$5=csstree_min.generate;function Index(){this.seed=0;this.map=Object.create(null)}Index.prototype.resolve=function(str){var index=this.map[str];if(!index){index=++this.seed;this.map[str]=index}return index};var createDeclarationIndexer=function createDeclarationIndexer(){var ids=new Index;return function markDeclaration(node){var id=generate$5(node);node.id=ids.resolve(id);node.length=id.length;node.fingerprint=null;return node}};var generate$4=csstree_min.generate;var nonFreezePseudoElements={"first-letter":true,"first-line":true,after:true,before:true};var nonFreezePseudoClasses={link:true,visited:true,hover:true,active:true,"first-letter":true,"first-line":true,after:true,before:true};var processSelector=function freeze(node,usageData){var pseudos=Object.create(null);var hasPseudo=false;node.prelude.children.each((function(simpleSelector){var tagName="*";var scope=0;simpleSelector.children.each((function(node){switch(node.type){case"ClassSelector":if(usageData&&usageData.scopes){var classScope=usageData.scopes[node.name]||0;if(scope!==0&&classScope!==scope){throw new Error("Selector can't has classes from different scopes: "+generate$4(simpleSelector))}scope=classScope}break;case"PseudoClassSelector":var name=node.name.toLowerCase();if(!nonFreezePseudoClasses.hasOwnProperty(name)){pseudos[":"+name]=true;hasPseudo=true}break;case"PseudoElementSelector":var name=node.name.toLowerCase();if(!nonFreezePseudoElements.hasOwnProperty(name)){pseudos["::"+name]=true;hasPseudo=true}break;case"TypeSelector":tagName=node.name.toLowerCase();break;case"AttributeSelector":if(node.flags){pseudos["["+node.flags.toLowerCase()+"]"]=true;hasPseudo=true}break;case"WhiteSpace":case"Combinator":tagName="*";break}}));simpleSelector.compareMarker=specificity(simpleSelector).toString();simpleSelector.id=null;simpleSelector.id=generate$4(simpleSelector);if(scope){simpleSelector.compareMarker+=":"+scope}if(tagName!=="*"){simpleSelector.compareMarker+=","+tagName}}));node.pseudoSignature=hasPseudo&&Object.keys(pseudos).sort().join(",")};var resolveKeyword$2=csstree_min.keyword;var walk$8=csstree_min.walk;var generate$3=csstree_min.generate;var prepare=function prepare(ast,options){var markDeclaration=createDeclarationIndexer();walk$8(ast,{visit:"Rule",enter:function processRule(node){node.block.children.each(markDeclaration);processSelector(node,options.usage)}});walk$8(ast,{visit:"Atrule",enter:function(node){if(node.prelude){node.prelude.id=null;node.prelude.id=generate$3(node.prelude)}if(resolveKeyword$2(node.name).basename==="keyframes"){node.block.avoidRulesMerge=true;node.block.children.each((function(rule){rule.prelude.children.each((function(simpleselector){simpleselector.compareMarker=simpleselector.id}))}))}}});return{declaration:markDeclaration}};var List$4=csstree_min.List;var resolveKeyword$1=csstree_min.keyword;var hasOwnProperty$1=Object.prototype.hasOwnProperty;var walk$7=csstree_min.walk;function addRuleToMap(map,item,list,single){var node=item.data;var name=resolveKeyword$1(node.name).basename;var id=node.name.toLowerCase()+"/"+(node.prelude?node.prelude.id:null);if(!hasOwnProperty$1.call(map,name)){map[name]=Object.create(null)}if(single){delete map[name][id]}if(!hasOwnProperty$1.call(map[name],id)){map[name][id]=new List$4}map[name][id].append(list.remove(item))}function relocateAtrules(ast,options){var collected=Object.create(null);var topInjectPoint=null;ast.children.each((function(node,item,list){if(node.type==="Atrule"){var name=resolveKeyword$1(node.name).basename;switch(name){case"keyframes":addRuleToMap(collected,item,list,true);return;case"media":if(options.forceMediaMerge){addRuleToMap(collected,item,list,false);return}break}if(topInjectPoint===null&&name!=="charset"&&name!=="import"){topInjectPoint=item}}else{if(topInjectPoint===null){topInjectPoint=item}}}));for(var atrule in collected){for(var id in collected[atrule]){ast.children.insertList(collected[atrule][id],atrule==="media"?null:topInjectPoint)}}}function isMediaRule(node){return node.type==="Atrule"&&node.name==="media"}function processAtrule(node,item,list){if(!isMediaRule(node)){return}var prev=item.prev&&item.prev.data;if(!prev||!isMediaRule(prev)){return}if(node.prelude&&prev.prelude&&node.prelude.id===prev.prelude.id){prev.block.children.appendList(node.block.children);list.remove(item)}}var _1MergeAtrule=function rejoinAtrule(ast,options){relocateAtrules(ast,options);walk$7(ast,{visit:"Atrule",reverse:true,enter:processAtrule})};var hasOwnProperty=Object.prototype.hasOwnProperty;function isEqualSelectors(a,b){var cursor1=a.head;var cursor2=b.head;while(cursor1!==null&&cursor2!==null&&cursor1.data.id===cursor2.data.id){cursor1=cursor1.next;cursor2=cursor2.next}return cursor1===null&&cursor2===null}function isEqualDeclarations(a,b){var cursor1=a.head;var cursor2=b.head;while(cursor1!==null&&cursor2!==null&&cursor1.data.id===cursor2.data.id){cursor1=cursor1.next;cursor2=cursor2.next}return cursor1===null&&cursor2===null}function compareDeclarations(declarations1,declarations2){var result={eq:[],ne1:[],ne2:[],ne2overrided:[]};var fingerprints=Object.create(null);var declarations2hash=Object.create(null);for(var cursor=declarations2.head;cursor;cursor=cursor.next){declarations2hash[cursor.data.id]=true}for(var cursor=declarations1.head;cursor;cursor=cursor.next){var data=cursor.data;if(data.fingerprint){fingerprints[data.fingerprint]=data.important}if(declarations2hash[data.id]){declarations2hash[data.id]=false;result.eq.push(data)}else{result.ne1.push(data)}}for(var cursor=declarations2.head;cursor;cursor=cursor.next){var data=cursor.data;if(declarations2hash[data.id]){if(!hasOwnProperty.call(fingerprints,data.fingerprint)||!fingerprints[data.fingerprint]&&data.important){result.ne2.push(data)}result.ne2overrided.push(data)}}return result}function addSelectors(dest,source){source.each((function(sourceData){var newStr=sourceData.id;var cursor=dest.head;while(cursor){var nextStr=cursor.data.id;if(nextStr===newStr){return}if(nextStr>newStr){break}cursor=cursor.next}dest.insert(dest.createItem(sourceData),cursor)}));return dest}function hasSimilarSelectors(selectors1,selectors2){var cursor1=selectors1.head;while(cursor1!==null){var cursor2=selectors2.head;while(cursor2!==null){if(cursor1.data.compareMarker===cursor2.data.compareMarker){return true}cursor2=cursor2.next}cursor1=cursor1.next}return false}function unsafeToSkipNode(node){switch(node.type){case"Rule":return hasSimilarSelectors(node.prelude.children,this);case"Atrule":if(node.block){return node.block.children.some(unsafeToSkipNode,this)}break;case"Declaration":return false}return true}var utils={isEqualSelectors:isEqualSelectors,isEqualDeclarations:isEqualDeclarations,compareDeclarations:compareDeclarations,addSelectors:addSelectors,hasSimilarSelectors:hasSimilarSelectors,unsafeToSkipNode:unsafeToSkipNode};var walk$6=csstree_min.walk;function processRule$5(node,item,list){var selectors=node.prelude.children;var declarations=node.block.children;list.prevUntil(item.prev,(function(prev){if(prev.type!=="Rule"){return utils.unsafeToSkipNode.call(selectors,prev)}var prevSelectors=prev.prelude.children;var prevDeclarations=prev.block.children;if(node.pseudoSignature===prev.pseudoSignature){if(utils.isEqualSelectors(prevSelectors,selectors)){prevDeclarations.appendList(declarations);list.remove(item);return true}if(utils.isEqualDeclarations(declarations,prevDeclarations)){utils.addSelectors(prevSelectors,selectors);list.remove(item);return true}}return utils.hasSimilarSelectors(selectors,prevSelectors)}))}var _2InitialMergeRuleset=function initialMergeRule(ast){walk$6(ast,{visit:"Rule",enter:processRule$5})};var List$3=csstree_min.List;var walk$5=csstree_min.walk;function processRule$4(node,item,list){var selectors=node.prelude.children;while(selectors.head!==selectors.tail){var newSelectors=new List$3;newSelectors.insert(selectors.remove(selectors.head));list.insert(list.createItem({type:"Rule",loc:node.loc,prelude:{type:"SelectorList",loc:node.prelude.loc,children:newSelectors},block:{type:"Block",loc:node.block.loc,children:node.block.children.copy()},pseudoSignature:node.pseudoSignature}),item)}}var _3DisjoinRuleset=function disjoinRule(ast){walk$5(ast,{visit:"Rule",reverse:true,enter:processRule$4})};var List$2=csstree_min.List;var generate$2=csstree_min.generate;var walk$4=csstree_min.walk;var REPLACE=1;var REMOVE=2;var TOP=0;var RIGHT=1;var BOTTOM=2;var LEFT=3;var SIDES=["top","right","bottom","left"];var SIDE={"margin-top":"top","margin-right":"right","margin-bottom":"bottom","margin-left":"left","padding-top":"top","padding-right":"right","padding-bottom":"bottom","padding-left":"left","border-top-color":"top","border-right-color":"right","border-bottom-color":"bottom","border-left-color":"left","border-top-width":"top","border-right-width":"right","border-bottom-width":"bottom","border-left-width":"left","border-top-style":"top","border-right-style":"right","border-bottom-style":"bottom","border-left-style":"left"};var MAIN_PROPERTY={margin:"margin","margin-top":"margin","margin-right":"margin","margin-bottom":"margin","margin-left":"margin",padding:"padding","padding-top":"padding","padding-right":"padding","padding-bottom":"padding","padding-left":"padding","border-color":"border-color","border-top-color":"border-color","border-right-color":"border-color","border-bottom-color":"border-color","border-left-color":"border-color","border-width":"border-width","border-top-width":"border-width","border-right-width":"border-width","border-bottom-width":"border-width","border-left-width":"border-width","border-style":"border-style","border-top-style":"border-style","border-right-style":"border-style","border-bottom-style":"border-style","border-left-style":"border-style"};function TRBL(name){this.name=name;this.loc=null;this.iehack=undefined;this.sides={top:null,right:null,bottom:null,left:null}}TRBL.prototype.getValueSequence=function(declaration,count){var values=[];var iehack="";var hasBadValues=declaration.value.type!=="Value"||declaration.value.children.some((function(child){var special=false;switch(child.type){case"Identifier":switch(child.name){case"\\0":case"\\9":iehack=child.name;return;case"inherit":case"initial":case"unset":case"revert":special=child.name;break}break;case"Dimension":switch(child.unit){case"rem":case"vw":case"vh":case"vmin":case"vmax":case"vm":special=child.unit;break}break;case"Hash":case"Number":case"Percentage":break;case"Function":if(child.name==="var"){return true}special=child.name;break;case"WhiteSpace":return false;default:return true}values.push({node:child,special:special,important:declaration.important})}));if(hasBadValues||values.length>count){return false}if(typeof this.iehack==="string"&&this.iehack!==iehack){return false}this.iehack=iehack;return values};TRBL.prototype.canOverride=function(side,value){var currentValue=this.sides[side];return!currentValue||value.important&&!currentValue.important};TRBL.prototype.add=function(name,declaration){function attemptToAdd(){var sides=this.sides;var side=SIDE[name];if(side){if(side in sides===false){return false}var values=this.getValueSequence(declaration,1);if(!values||!values.length){return false}for(var key in sides){if(sides[key]!==null&&sides[key].special!==values[0].special){return false}}if(!this.canOverride(side,values[0])){return true}sides[side]=values[0];return true}else if(name===this.name){var values=this.getValueSequence(declaration,4);if(!values||!values.length){return false}switch(values.length){case 1:values[RIGHT]=values[TOP];values[BOTTOM]=values[TOP];values[LEFT]=values[TOP];break;case 2:values[BOTTOM]=values[TOP];values[LEFT]=values[RIGHT];break;case 3:values[LEFT]=values[RIGHT];break}for(var i=0;i<4;i++){for(var key in sides){if(sides[key]!==null&&sides[key].special!==values[i].special){return false}}}for(var i=0;i<4;i++){if(this.canOverride(SIDES[i],values[i])){sides[SIDES[i]]=values[i]}}return true}}if(!attemptToAdd.call(this)){return false}if(!this.loc){this.loc=declaration.loc}return true};TRBL.prototype.isOkToMinimize=function(){var top=this.sides.top;var right=this.sides.right;var bottom=this.sides.bottom;var left=this.sides.left;if(top&&right&&bottom&&left){var important=top.important+right.important+bottom.important+left.important;return important===0||important===4}return false};TRBL.prototype.getValue=function(){var result=new List$2;var sides=this.sides;var values=[sides.top,sides.right,sides.bottom,sides.left];var stringValues=[generate$2(sides.top.node),generate$2(sides.right.node),generate$2(sides.bottom.node),generate$2(sides.left.node)];if(stringValues[LEFT]===stringValues[RIGHT]){values.pop();if(stringValues[BOTTOM]===stringValues[TOP]){values.pop();if(stringValues[RIGHT]===stringValues[TOP]){values.pop()}}}for(var i=0;i<values.length;i++){if(i){result.appendData({type:"WhiteSpace",value:" "})}result.appendData(values[i].node)}if(this.iehack){result.appendData({type:"WhiteSpace",value:" "});result.appendData({type:"Identifier",loc:null,name:this.iehack})}return{type:"Value",loc:null,children:result}};TRBL.prototype.getDeclaration=function(){return{type:"Declaration",loc:this.loc,important:this.sides.top.important,property:this.name,value:this.getValue()}};function processRule$3(rule,shorts,shortDeclarations,lastShortSelector){var declarations=rule.block.children;var selector=rule.prelude.children.first().id;rule.block.children.eachRight((function(declaration,item){var property=declaration.property;if(!MAIN_PROPERTY.hasOwnProperty(property)){return}var key=MAIN_PROPERTY[property];var shorthand;var operation;if(!lastShortSelector||selector===lastShortSelector){if(key in shorts){operation=REMOVE;shorthand=shorts[key]}}if(!shorthand||!shorthand.add(property,declaration)){operation=REPLACE;shorthand=new TRBL(key);if(!shorthand.add(property,declaration)){lastShortSelector=null;return}}shorts[key]=shorthand;shortDeclarations.push({operation:operation,block:declarations,item:item,shorthand:shorthand});lastShortSelector=selector}));return lastShortSelector}function processShorthands(shortDeclarations,markDeclaration){shortDeclarations.forEach((function(item){var shorthand=item.shorthand;if(!shorthand.isOkToMinimize()){return}if(item.operation===REPLACE){item.item.data=markDeclaration(shorthand.getDeclaration())}else{item.block.remove(item.item)}}))}var _4RestructShorthand=function restructBlock(ast,indexer){var stylesheetMap={};var shortDeclarations=[];walk$4(ast,{visit:"Rule",reverse:true,enter:function(node){var stylesheet=this.block||this.stylesheet;var ruleId=(node.pseudoSignature||"")+"|"+node.prelude.children.first().id;var ruleMap;var shorts;if(!stylesheetMap.hasOwnProperty(stylesheet.id)){ruleMap={lastShortSelector:null};stylesheetMap[stylesheet.id]=ruleMap}else{ruleMap=stylesheetMap[stylesheet.id]}if(ruleMap.hasOwnProperty(ruleId)){shorts=ruleMap[ruleId]}else{shorts={};ruleMap[ruleId]=shorts}ruleMap.lastShortSelector=processRule$3.call(this,node,shorts,shortDeclarations,ruleMap.lastShortSelector)}});processShorthands(shortDeclarations,indexer.declaration)};var resolveProperty=csstree_min.property;var resolveKeyword=csstree_min.keyword;var walk$3=csstree_min.walk;var generate$1=csstree_min.generate;var fingerprintId=1;var dontRestructure={src:1};var DONT_MIX_VALUE={display:/table|ruby|flex|-(flex)?box$|grid|contents|run-in/i,"text-align":/^(start|end|match-parent|justify-all)$/i};var SAFE_VALUES={cursor:["auto","crosshair","default","move","text","wait","help","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","pointer","progress","not-allowed","no-drop","vertical-text","all-scroll","col-resize","row-resize"],overflow:["hidden","visible","scroll","auto"],position:["static","relative","absolute","fixed"]};var NEEDLESS_TABLE={"border-width":["border"],"border-style":["border"],"border-color":["border"],"border-top":["border"],"border-right":["border"],"border-bottom":["border"],"border-left":["border"],"border-top-width":["border-top","border-width","border"],"border-right-width":["border-right","border-width","border"],"border-bottom-width":["border-bottom","border-width","border"],"border-left-width":["border-left","border-width","border"],"border-top-style":["border-top","border-style","border"],"border-right-style":["border-right","border-style","border"],"border-bottom-style":["border-bottom","border-style","border"],"border-left-style":["border-left","border-style","border"],"border-top-color":["border-top","border-color","border"],"border-right-color":["border-right","border-color","border"],"border-bottom-color":["border-bottom","border-color","border"],"border-left-color":["border-left","border-color","border"],"margin-top":["margin"],"margin-right":["margin"],"margin-bottom":["margin"],"margin-left":["margin"],"padding-top":["padding"],"padding-right":["padding"],"padding-bottom":["padding"],"padding-left":["padding"],"font-style":["font"],"font-variant":["font"],"font-weight":["font"],"font-size":["font"],"font-family":["font"],"list-style-type":["list-style"],"list-style-position":["list-style"],"list-style-image":["list-style"]};function getPropertyFingerprint(propertyName,declaration,fingerprints){var realName=resolveProperty(propertyName).basename;if(realName==="background"){return propertyName+":"+generate$1(declaration.value)}var declarationId=declaration.id;var fingerprint=fingerprints[declarationId];if(!fingerprint){switch(declaration.value.type){case"Value":var vendorId="";var iehack="";var special={};var raw=false;declaration.value.children.each((function walk(node){switch(node.type){case"Value":case"Brackets":case"Parentheses":node.children.each(walk);break;case"Raw":raw=true;break;case"Identifier":var name=node.name;if(!vendorId){vendorId=resolveKeyword(name).vendor}if(/\\[09]/.test(name)){iehack=RegExp.lastMatch}if(SAFE_VALUES.hasOwnProperty(realName)){if(SAFE_VALUES[realName].indexOf(name)===-1){special[name]=true}}else if(DONT_MIX_VALUE.hasOwnProperty(realName)){if(DONT_MIX_VALUE[realName].test(name)){special[name]=true}}break;case"Function":var name=node.name;if(!vendorId){vendorId=resolveKeyword(name).vendor}if(name==="rect"){var hasComma=node.children.some((function(node){return node.type==="Operator"&&node.value===","}));if(!hasComma){name="rect-backward"}}special[name+"()"]=true;node.children.each(walk);break;case"Dimension":var unit=node.unit;if(/\\[09]/.test(unit)){iehack=RegExp.lastMatch}switch(unit){case"rem":case"vw":case"vh":case"vmin":case"vmax":case"vm":special[unit]=true;break}break}}));fingerprint=raw?"!"+fingerprintId++:"!"+Object.keys(special).sort()+"|"+iehack+vendorId;break;case"Raw":fingerprint="!"+declaration.value.value;break;default:fingerprint=generate$1(declaration.value)}fingerprints[declarationId]=fingerprint}return propertyName+fingerprint}function needless(props,declaration,fingerprints){var property=resolveProperty(declaration.property);if(NEEDLESS_TABLE.hasOwnProperty(property.basename)){var table=NEEDLESS_TABLE[property.basename];for(var i=0;i<table.length;i++){var ppre=getPropertyFingerprint(property.prefix+table[i],declaration,fingerprints);var prev=props.hasOwnProperty(ppre)?props[ppre]:null;if(prev&&(!declaration.important||prev.item.data.important)){return prev}}}}function processRule$2(rule,item,list,props,fingerprints){var declarations=rule.block.children;declarations.eachRight((function(declaration,declarationItem){var property=declaration.property;var fingerprint=getPropertyFingerprint(property,declaration,fingerprints);var prev=props[fingerprint];if(prev&&!dontRestructure.hasOwnProperty(property)){if(declaration.important&&!prev.item.data.important){props[fingerprint]={block:declarations,item:declarationItem};prev.block.remove(prev.item)}else{declarations.remove(declarationItem)}}else{var prev=needless(props,declaration,fingerprints);if(prev){declarations.remove(declarationItem)}else{declaration.fingerprint=fingerprint;props[fingerprint]={block:declarations,item:declarationItem}}}}));if(declarations.isEmpty()){list.remove(item)}}var _6RestructBlock=function restructBlock(ast){var stylesheetMap={};var fingerprints=Object.create(null);walk$3(ast,{visit:"Rule",reverse:true,enter:function(node,item,list){var stylesheet=this.block||this.stylesheet;var ruleId=(node.pseudoSignature||"")+"|"+node.prelude.children.first().id;var ruleMap;var props;if(!stylesheetMap.hasOwnProperty(stylesheet.id)){ruleMap={};stylesheetMap[stylesheet.id]=ruleMap}else{ruleMap=stylesheetMap[stylesheet.id]}if(ruleMap.hasOwnProperty(ruleId)){props=ruleMap[ruleId]}else{props={};ruleMap[ruleId]=props}processRule$2.call(this,node,item,list,props,fingerprints)}})};var walk$2=csstree_min.walk;function processRule$1(node,item,list){var selectors=node.prelude.children;var declarations=node.block.children;var nodeCompareMarker=selectors.first().compareMarker;var skippedCompareMarkers={};list.nextUntil(item.next,(function(next,nextItem){if(next.type!=="Rule"){return utils.unsafeToSkipNode.call(selectors,next)}if(node.pseudoSignature!==next.pseudoSignature){return true}var nextFirstSelector=next.prelude.children.head;var nextDeclarations=next.block.children;var nextCompareMarker=nextFirstSelector.data.compareMarker;if(nextCompareMarker in skippedCompareMarkers){return true}if(selectors.head===selectors.tail){if(selectors.first().id===nextFirstSelector.data.id){declarations.appendList(nextDeclarations);list.remove(nextItem);return}}if(utils.isEqualDeclarations(declarations,nextDeclarations)){var nextStr=nextFirstSelector.data.id;selectors.some((function(data,item){var curStr=data.id;if(nextStr<curStr){selectors.insert(nextFirstSelector,item);return true}if(!item.next){selectors.insert(nextFirstSelector);return true}}));list.remove(nextItem);return}if(nextCompareMarker===nodeCompareMarker){return true}skippedCompareMarkers[nextCompareMarker]=true}))}var _7MergeRuleset=function mergeRule(ast){walk$2(ast,{visit:"Rule",enter:processRule$1})};var List$1=csstree_min.List;var walk$1=csstree_min.walk;function calcSelectorLength(list){var length=0;list.each((function(data){length+=data.id.length+1}));return length-1}function calcDeclarationsLength(tokens){var length=0;for(var i=0;i<tokens.length;i++){length+=tokens[i].length}return length+tokens.length-1}function processRule(node,item,list){var avoidRulesMerge=this.block!==null?this.block.avoidRulesMerge:false;var selectors=node.prelude.children;var block=node.block;var disallowDownMarkers=Object.create(null);var allowMergeUp=true;var allowMergeDown=true;list.prevUntil(item.prev,(function(prev,prevItem){var prevBlock=prev.block;var prevType=prev.type;if(prevType!=="Rule"){var unsafe=utils.unsafeToSkipNode.call(selectors,prev);if(!unsafe&&prevType==="Atrule"&&prevBlock){walk$1(prevBlock,{visit:"Rule",enter:function(node){node.prelude.children.each((function(data){disallowDownMarkers[data.compareMarker]=true}))}})}return unsafe}var prevSelectors=prev.prelude.children;if(node.pseudoSignature!==prev.pseudoSignature){return true}allowMergeDown=!prevSelectors.some((function(selector){return selector.compareMarker in disallowDownMarkers}));if(!allowMergeDown&&!allowMergeUp){return true}if(allowMergeUp&&utils.isEqualSelectors(prevSelectors,selectors)){prevBlock.children.appendList(block.children);list.remove(item);return true}var diff=utils.compareDeclarations(block.children,prevBlock.children);if(diff.eq.length){if(!diff.ne1.length&&!diff.ne2.length){if(allowMergeDown){utils.addSelectors(selectors,prevSelectors);list.remove(prevItem)}return true}else if(!avoidRulesMerge){if(diff.ne1.length&&!diff.ne2.length){var selectorLength=calcSelectorLength(selectors);var blockLength=calcDeclarationsLength(diff.eq);if(allowMergeUp&&selectorLength<blockLength){utils.addSelectors(prevSelectors,selectors);block.children=(new List$1).fromArray(diff.ne1)}}else if(!diff.ne1.length&&diff.ne2.length){var selectorLength=calcSelectorLength(prevSelectors);var blockLength=calcDeclarationsLength(diff.eq);if(allowMergeDown&&selectorLength<blockLength){utils.addSelectors(selectors,prevSelectors);prevBlock.children=(new List$1).fromArray(diff.ne2)}}else{var newSelector={type:"SelectorList",loc:null,children:utils.addSelectors(prevSelectors.copy(),selectors)};var newBlockLength=calcSelectorLength(newSelector.children)+2;var blockLength=calcDeclarationsLength(diff.eq);if(blockLength>=newBlockLength){var newItem=list.createItem({type:"Rule",loc:null,prelude:newSelector,block:{type:"Block",loc:null,children:(new List$1).fromArray(diff.eq)},pseudoSignature:node.pseudoSignature});block.children=(new List$1).fromArray(diff.ne1);prevBlock.children=(new List$1).fromArray(diff.ne2overrided);if(allowMergeUp){list.insert(newItem,prevItem)}else{list.insert(newItem,item)}return true}}}}if(allowMergeUp){allowMergeUp=!prevSelectors.some((function(prevSelector){return selectors.some((function(selector){return selector.compareMarker===prevSelector.compareMarker}))}))}prevSelectors.each((function(data){disallowDownMarkers[data.compareMarker]=true}))}))}var _8RestructRuleset=function restructRule(ast){walk$1(ast,{visit:"Rule",reverse:true,enter:processRule})};var restructure=function(ast,options){var indexer=prepare(ast,options);options.logger("prepare",ast);_1MergeAtrule(ast,options);options.logger("mergeAtrule",ast);_2InitialMergeRuleset(ast);options.logger("initialMergeRuleset",ast);_3DisjoinRuleset(ast);options.logger("disjoinRuleset",ast);_4RestructShorthand(ast,indexer);options.logger("restructShorthand",ast);_6RestructBlock(ast);options.logger("restructBlock",ast);_7MergeRuleset(ast);options.logger("mergeRuleset",ast);_8RestructRuleset(ast);options.logger("restructRuleset",ast)};var List=csstree_min.List;var clone=csstree_min.clone;var walk=csstree_min.walk;function readChunk(children,specialComments){var buffer=new List;var nonSpaceTokenInBuffer=false;var protectedComment;children.nextUntil(children.head,(function(node,item,list){if(node.type==="Comment"){if(!specialComments||node.value.charAt(0)!=="!"){list.remove(item);return}if(nonSpaceTokenInBuffer||protectedComment){return true}list.remove(item);protectedComment=node;return}if(node.type!=="WhiteSpace"){nonSpaceTokenInBuffer=true}buffer.insert(list.remove(item))}));return{comment:protectedComment,stylesheet:{type:"StyleSheet",loc:null,children:buffer}}}function compressChunk(ast,firstAtrulesAllowed,num,options){options.logger("Compress block #"+num,null,true);var seed=1;if(ast.type==="StyleSheet"){ast.firstAtrulesAllowed=firstAtrulesAllowed;ast.id=seed++}walk(ast,{visit:"Atrule",enter:function markScopes(node){if(node.block!==null){node.block.id=seed++}}});options.logger("init",ast);clean(ast,options);options.logger("clean",ast);replace(ast);options.logger("replace",ast);if(options.restructuring){restructure(ast,options)}return ast}function getCommentsOption(options){var comments="comments"in options?options.comments:"exclamation";if(typeof comments==="boolean"){comments=comments?"exclamation":false}else if(comments!=="exclamation"&&comments!=="first-exclamation"){comments=false}return comments}function getRestructureOption(options){if("restructure"in options){return options.restructure}return"restructuring"in options?options.restructuring:true}function wrapBlock(block){return(new List).appendData({type:"Rule",loc:null,prelude:{type:"SelectorList",loc:null,children:(new List).appendData({type:"Selector",loc:null,children:(new List).appendData({type:"TypeSelector",loc:null,name:"x"})})},block:block})}var compress=function compress(ast,options){ast=ast||{type:"StyleSheet",loc:null,children:new List};options=options||{};var compressOptions={logger:typeof options.logger==="function"?options.logger:function(){},restructuring:getRestructureOption(options),forceMediaMerge:Boolean(options.forceMediaMerge),usage:options.usage?usage.buildIndex(options.usage):false};var specialComments=getCommentsOption(options);var firstAtrulesAllowed=true;var input;var output=new List;var chunk;var chunkNum=1;var chunkChildren;if(options.clone){ast=clone(ast)}if(ast.type==="StyleSheet"){input=ast.children;ast.children=output}else{input=wrapBlock(ast)}do{chunk=readChunk(input,Boolean(specialComments));compressChunk(chunk.stylesheet,firstAtrulesAllowed,chunkNum++,compressOptions);chunkChildren=chunk.stylesheet.children;if(chunk.comment){if(!output.isEmpty()){output.insert(List.createItem({type:"Raw",value:"\n"}))}output.insert(List.createItem(chunk.comment));if(!chunkChildren.isEmpty()){output.insert(List.createItem({type:"Raw",value:"\n"}))}}if(firstAtrulesAllowed&&!chunkChildren.isEmpty()){var lastRule=chunkChildren.last();if(lastRule.type!=="Atrule"||lastRule.name!=="import"&&lastRule.name!=="charset"){firstAtrulesAllowed=false}}if(specialComments!=="exclamation"){specialComments=false}output.appendList(chunkChildren)}while(!input.isEmpty());return{ast:ast}};var _args=[["csso@4.2.0","/Users/bogdancadkin/host/svgo"]];var _from="csso@4.2.0";var _id="csso@4.2.0";var _inBundle=false;var _integrity="sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==";var _location="/csso";var _phantomChildren={};var _requested={type:"version",registry:true,raw:"csso@4.2.0",name:"csso",escapedName:"csso",rawSpec:"4.2.0",saveSpec:null,fetchSpec:"4.2.0"};var _requiredBy=["/"];var _resolved="https://registry.npmjs.org/csso/-/csso-4.2.0.tgz";var _spec="4.2.0";var _where="/Users/bogdancadkin/host/svgo";var author={name:"Sergey Kryzhanovsky",email:"skryzhanovsky@ya.ru",url:"https://github.com/afelix"};var browser={"css-tree":"css-tree/dist/csstree.min.js"};var bugs={url:"https://github.com/css/csso/issues"};var dependencies={"css-tree":"^1.1.2"};var description$x="CSS minifier with structural optimisations";var devDependencies={"@rollup/plugin-commonjs":"^11.0.1","@rollup/plugin-json":"^4.0.1","@rollup/plugin-node-resolve":"^7.0.0",coveralls:"^3.0.11",eslint:"^6.8.0",mocha:"^7.1.1",nyc:"^15.0.0",rollup:"^1.29.0","source-map":"^0.6.1",terser:"^4.6.3"};var engines={node:">=8.0.0"};var files=["dist","lib"];var homepage="https://github.com/css/csso";var keywords=["css","compress","minifier","minify","optimise","optimisation","csstree"];var license="MIT";var main="./lib/index";var maintainers=[{name:"Roman Dvornov",email:"rdvornov@gmail.com"}];var name="csso";var repository={type:"git",url:"git+https://github.com/css/csso.git"};var scripts={build:"rollup --config && terser dist/csso.js --compress --mangle -o dist/csso.min.js",coverage:"nyc npm test",coveralls:"nyc report --reporter=text-lcov | coveralls",hydrogen:"node --trace-hydrogen --trace-phase=Z --trace-deopt --code-comments --hydrogen-track-positions --redirect-code-traces --redirect-code-traces-to=code.asm --trace_hydrogen_file=code.cfg --print-opt-code bin/csso --stat -o /dev/null",lint:"eslint lib test","lint-and-test":"npm run lint && npm test",prepublishOnly:"npm run build",test:"mocha --reporter dot",travis:"nyc npm run lint-and-test && npm run coveralls"};var version="4.2.0";var require$$0$1={_args:_args,_from:_from,_id:_id,_inBundle:_inBundle,_integrity:_integrity,_location:_location,_phantomChildren:_phantomChildren,_requested:_requested,_requiredBy:_requiredBy,_resolved:_resolved,_spec:_spec,_where:_where,author:author,browser:browser,bugs:bugs,dependencies:dependencies,description:description$x,devDependencies:devDependencies,engines:engines,files:files,homepage:homepage,keywords:keywords,license:license,main:main,maintainers:maintainers,name:name,repository:repository,scripts:scripts,version:version};var parse=csstree_min.parse;var generate=csstree_min.generate;function debugOutput(name,options,startTime,data){if(options.debug){console.error("## "+name+" done in %d ms\n",Date.now()-startTime)}return data}function createDefaultLogger(level){var lastDebug;return function logger(title,ast){var line=title;if(ast){line="["+((Date.now()-lastDebug)/1e3).toFixed(3)+"s] "+line}if(level>1&&ast){var css=generate(ast);if(level===2&&css.length>256){css=css.substr(0,256)+"..."}line+="\n  "+css+"\n"}console.error(line);lastDebug=Date.now()}}function copy(obj){var result={};for(var key in obj){result[key]=obj[key]}return result}function buildCompressOptions(options){options=copy(options);if(typeof options.logger!=="function"&&options.debug){options.logger=createDefaultLogger(options.debug)}return options}function runHandler(ast,options,handlers){if(!Array.isArray(handlers)){handlers=[handlers]}handlers.forEach((function(fn){fn(ast,options)}))}function minify(context,source,options){options=options||{};var filename=options.filename||"<unknown>";var result;var ast=debugOutput("parsing",options,Date.now(),parse(source,{context:context,filename:filename,positions:Boolean(options.sourceMap)}));if(options.beforeCompress){debugOutput("beforeCompress",options,Date.now(),runHandler(ast,options,options.beforeCompress))}var compressResult=debugOutput("compress",options,Date.now(),compress(ast,buildCompressOptions(options)));if(options.afterCompress){debugOutput("afterCompress",options,Date.now(),runHandler(compressResult,options,options.afterCompress))}if(options.sourceMap){result=debugOutput("generate(sourceMap: true)",options,Date.now(),function(){var tmp=generate(compressResult.ast,{sourceMap:true});tmp.map._file=filename;tmp.map.setSourceContent(filename,source);return tmp}())}else{result=debugOutput("generate",options,Date.now(),{css:generate(compressResult.ast),map:null})}return result}function minifyStylesheet(source,options){return minify("stylesheet",source,options)}function minifyBlock(source,options){return minify("declarationList",source,options)}var lib={version:require$$0$1.version,minify:minifyStylesheet,minifyBlock:minifyBlock,syntax:Object.assign({compress:compress},csstree_min)};const{traverse:traverse$2}=xast;var type$w="full";var active$w=true;var description$w="minifies styles and removes unused styles based on usage data";var params$a={usage:{force:false,ids:true,classes:true,tags:true}};var fn$w=function(ast,options){options=options||{};var minifyOptionsForStylesheet=cloneObject(options);var minifyOptionsForAttribute=cloneObject(options);var elems=findStyleElems(ast);minifyOptionsForStylesheet.usage=collectUsageData(ast,options);minifyOptionsForAttribute.usage=null;elems.forEach((function(elem){if(elem.isElem("style")){if(elem.children[0].type==="text"||elem.children[0].type==="cdata"){const styleCss=elem.children[0].value;const minified=lib.minify(styleCss,minifyOptionsForStylesheet).css;if(styleCss.indexOf(">")>=0||styleCss.indexOf("<")>=0){elem.children[0].type="cdata";elem.children[0].value=minified}else{elem.children[0].type="text";elem.children[0].value=minified}}}else{var elemStyle=elem.attributes.style;elem.attributes.style=lib.minifyBlock(elemStyle,minifyOptionsForAttribute).css}}));return ast};function cloneObject(obj){return{...obj}}function findStyleElems(ast){const nodesWithStyles=[];traverse$2(ast,(node=>{if(node.type==="element"){if(node.name==="style"&&node.children.length!==0){nodesWithStyles.push(node)}else if(node.attributes.style!=null){nodesWithStyles.push(node)}}}));return nodesWithStyles}function shouldFilter(options,name){if("usage"in options===false){return true}if(options.usage&&name in options.usage===false){return true}return Boolean(options.usage&&options.usage[name])}function collectUsageData(ast,options){let safe=true;const usageData={};let hasData=false;const rawData={ids:Object.create(null),classes:Object.create(null),tags:Object.create(null)};traverse$2(ast,(node=>{if(node.type==="element"){if(node.name==="script"){safe=false}rawData.tags[node.name]=true;if(node.attributes.id!=null){rawData.ids[node.attributes.id]=true}if(node.attributes.class!=null){node.attributes.class.replace(/^\s+|\s+$/g,"").split(/\s+/).forEach((className=>{rawData.classes[className]=true}))}if(Object.keys(node.attributes).some((name=>/^on/i.test(name)))){safe=false}}}));if(!safe&&options.usage&&options.usage.force){safe=true}for(const[key,data]of Object.entries(rawData)){if(shouldFilter(options,key)){usageData[key]=Object.keys(data);hasData=true}}return safe&&hasData?usageData:null}var minifyStyles$1={type:type$w,active:active$w,description:description$w,params:params$a,fn:fn$w};const{inheritableAttrs:inheritableAttrs$1,pathElems:pathElems$1}=_collections;var type$v="perItemReverse";var active$v=true;var description$v="moves elements attributes to the existing group wrapper";var fn$v=function(item){if(item.type==="element"&&item.name==="g"&&item.children.length>1){var intersection={},hasTransform=false,hasClip=item.attributes["clip-path"]!=null||item.attributes.mask!=null,intersected=item.children.every((function(inner){if(inner.type==="element"&&Object.keys(inner.attributes).length!==0){if(inner.attributes.class)return false;if(!Object.keys(intersection).length){intersection=inner.attributes}else{intersection=intersectInheritableAttrs(intersection,inner.attributes);if(!intersection)return false}return true}})),allPath=item.children.every((function(inner){return inner.isElem(pathElems$1)}));if(intersected){item.children.forEach((function(g){for(const[name,value]of Object.entries(intersection)){if(!allPath&&!hasClip||name!=="transform"){delete g.attributes[name];if(name==="transform"){if(!hasTransform){if(item.attributes.transform!=null){item.attributes.transform=item.attributes.transform+" "+value}else{item.attributes.transform=value}hasTransform=true}}else{item.attributes[name]=value}}}}))}}};function intersectInheritableAttrs(a,b){var c={};for(const[name,value]of Object.entries(a)){if(b.hasOwnProperty(name)&&inheritableAttrs$1.includes(name)&&value===b[name]){c[name]=value}}if(!Object.keys(c).length)return false;return c}var moveElemsAttrsToGroup$1={type:type$v,active:active$v,description:description$v,fn:fn$v};const{pathElems:pathElems,referencesProps:referencesProps$1}=_collections;var type$u="perItem";var active$u=true;var description$u="moves some group attributes to the content elements";const pathElemsWithGroupsAndText=[...pathElems,"g","text"];var fn$u=function(item){if(item.type==="element"&&item.name==="g"&&item.children.length!==0&&item.attributes.transform!=null&&Object.entries(item.attributes).some((([name,value])=>referencesProps$1.includes(name)&&value.includes("url(")))===false&&item.children.every((inner=>pathElemsWithGroupsAndText.includes(inner.name)&&inner.attributes.id==null))){for(const inner of item.children){const value=item.attributes.transform;if(inner.attributes.transform!=null){inner.attributes.transform=value+" "+inner.attributes.transform}else{inner.attributes.transform=value}}delete item.attributes.transform}};var moveGroupAttrsToElems$1={type:type$u,active:active$u,description:description$u,fn:fn$u};var type$t="perItem";var active$t=false;var params$9={delim:"__",prefixIds:true,prefixClassNames:true};var description$t="prefix IDs";var referencesProps=_collections.referencesProps,rxId=/^#(.*)$/,addPrefix=null;const unquote=string=>{const first=string.charAt(0);if(first==="'"||first==='"'){if(first===string.charAt(string.length-1)){return string.slice(1,-1)}}return string};var escapeIdentifierName=function(str){return str.replace(/[. ]/g,"_")};var matchId=function(urlVal){var idUrlMatches=urlVal.match(rxId);if(idUrlMatches===null){return false}return idUrlMatches[1]};var matchUrl=function(val){var urlMatches=/url\((.*?)\)/gi.exec(val);if(urlMatches===null){return false}return urlMatches[1]};var prefixId=function(val){var idName=matchId(val);if(!idName){return false}return"#"+addPrefix(idName)};const addPrefixToClassAttr=(element,name)=>{if(element.attributes[name]==null||element.attributes[name].length===0){return}element.attributes[name]=element.attributes[name].split(/\s+/).map(addPrefix).join(" ")};const addPrefixToIdAttr=(element,name)=>{if(element.attributes[name]==null||element.attributes[name].length===0){return}element.attributes[name]=addPrefix(element.attributes[name])};const addPrefixToHrefAttr=(element,name)=>{if(element.attributes[name]==null||element.attributes[name].length===0){return}const idPrefixed=prefixId(element.attributes[name]);if(!idPrefixed){return}element.attributes[name]=idPrefixed};const addPrefixToUrlAttr=(element,name)=>{if(element.attributes[name]==null||element.attributes[name].length===0){return}const urlVal=matchUrl(element.attributes[name]);if(!urlVal){return}const idPrefixed=prefixId(urlVal);if(!idPrefixed){return}element.attributes[name]="url("+idPrefixed+")"};const addPrefixToBeginEndAttr=(element,name)=>{if(element.attributes[name]==null||element.attributes[name].length===0){return}const parts=element.attributes[name].split("; ").map((val=>{val=val.trim();if(val.endsWith(".end")||val.endsWith(".start")){const[id,postfix]=val.split(".");let idPrefixed=prefixId(`#${id}`);if(!idPrefixed){return val}idPrefixed=idPrefixed.slice(1);return`${idPrefixed}.${postfix}`}else{return val}}));element.attributes[name]=parts.join("; ")};const getBasename=path=>{const matched=path.match(/[/\\]([^/\\]+)$/);if(matched){return matched[1]}return""};var fn$t=function(node,opts,extra){if(extra.multipassCount&&extra.multipassCount>0){return}var prefix="prefix";if(opts.prefix){if(typeof opts.prefix==="function"){prefix=opts.prefix(node,extra)}else{prefix=opts.prefix}}else if(opts.prefix===false){prefix=false}else if(extra&&extra.path&&extra.path.length>0){var filename=getBasename(extra.path);prefix=filename}addPrefix=function(name){if(prefix===false){return escapeIdentifierName(name)}return escapeIdentifierName(prefix+opts.delim+name)};if(node.type==="element"&&node.name==="style"){if(node.children.length===0){return}var cssStr="";if(node.children[0].type==="text"||node.children[0].type==="cdata"){cssStr=node.children[0].value}var cssAst={};try{cssAst=csstree_min.parse(cssStr,{parseValue:true,parseCustomProperty:false})}catch(parseError){console.warn("Warning: Parse error of styles of <style/> element, skipped. Error details: "+parseError);return}var idPrefixed="";csstree_min.walk(cssAst,(function(node){if((opts.prefixIds&&node.type==="IdSelector"||opts.prefixClassNames&&node.type==="ClassSelector")&&node.name){node.name=addPrefix(node.name);return}if(node.type==="Url"&&node.value.value&&node.value.value.length>0){idPrefixed=prefixId(unquote(node.value.value));if(!idPrefixed){return}node.value.value=idPrefixed}}));node.children[0].value=csstree_min.generate(cssAst);return}if(node.type!=="element"){return}if(opts.prefixIds){addPrefixToIdAttr(node,"id")}if(opts.prefixClassNames){addPrefixToClassAttr(node,"class")}addPrefixToHrefAttr(node,"href");addPrefixToHrefAttr(node,"xlink:href");for(var referencesProp of referencesProps){addPrefixToUrlAttr(node,referencesProp)}addPrefixToBeginEndAttr(node,"begin");addPrefixToBeginEndAttr(node,"end")};var prefixIds$1={type:type$t,active:active$t,params:params$9,description:description$t,fn:fn$t};var type$s="perItem";var active$s=false;var description$s="removes attributes of elements that match a css selector";var fn$s=function(item,params){var selectors=Array.isArray(params.selectors)?params.selectors:[params];selectors.map((({selector:selector,attributes:attributes})=>{if(item.matches(selector)){if(Array.isArray(attributes)){for(const name of attributes){delete item.attributes[name]}}else{delete item.attributes[attributes]}}}))};var removeAttributesBySelector$1={type:type$s,active:active$s,description:description$s,fn:fn$s};var DEFAULT_SEPARATOR=":";var type$r="perItem";var active$r=false;var description$r="removes specified attributes";var params$8={elemSeparator:DEFAULT_SEPARATOR,preserveCurrentColor:false,attrs:[]};var fn$r=function(item,params){if(!Array.isArray(params.attrs)){params.attrs=[params.attrs]}if(item.type==="element"){var elemSeparator=typeof params.elemSeparator=="string"?params.elemSeparator:DEFAULT_SEPARATOR;var preserveCurrentColor=typeof params.preserveCurrentColor=="boolean"?params.preserveCurrentColor:false;var patterns=params.attrs.map((function(pattern){if(pattern.indexOf(elemSeparator)===-1){pattern=[".*",elemSeparator,pattern,elemSeparator,".*"].join("")}else if(pattern.split(elemSeparator).length<3){pattern=[pattern,elemSeparator,".*"].join("")}return pattern.split(elemSeparator).map((function(value){if(value==="*"){value=".*"}return new RegExp(["^",value,"$"].join(""),"i")}))}));patterns.forEach((function(pattern){if(pattern[0].test(item.name)){for(const[name,value]of Object.entries(item.attributes)){var isFillCurrentColor=preserveCurrentColor&&name=="fill"&&value=="currentColor";var isStrokeCurrentColor=preserveCurrentColor&&name=="stroke"&&value=="currentColor";if(!(isFillCurrentColor||isStrokeCurrentColor)){if(pattern[1].test(name)){if(pattern[2].test(value)){delete item.attributes[name]}}}}}}))}};var removeAttrs$1={type:type$r,active:active$r,description:description$r,params:params$8,fn:fn$r};var type$q="perItem";var active$q=true;var description$q="removes comments";var fn$q=function(item){if(item.type==="comment"&&item.value.charAt(0)!=="!"){return false}};var removeComments$1={type:type$q,active:active$q,description:description$q,fn:fn$q};var type$p="perItem";var active$p=true;var params$7={removeAny:true};var description$p="removes <desc>";var standardDescs=/^(Created with|Created using)/;var fn$p=function(item,params){return!item.isElem("desc")||!(params.removeAny||item.children.length===0||item.children[0].type==="text"&&standardDescs.test(item.children[0].value))};var removeDesc$1={type:type$p,active:active$p,params:params$7,description:description$p,fn:fn$p};var type$o="perItem";var active$o=false;var description$o="removes width and height in presence of viewBox (opposite to removeViewBox, disable it first)";var fn$o=function(item){if(item.type==="element"&&item.name==="svg"){if(item.attributes.viewBox!=null){delete item.attributes.width;delete item.attributes.height}else if(item.attributes.width!=null&&item.attributes.height!=null&&Number.isNaN(Number(item.attributes.width))===false&&Number.isNaN(Number(item.attributes.height))===false){const width=Number(item.attributes.width);const height=Number(item.attributes.height);item.attributes.viewBox=`0 0 ${width} ${height}`;delete item.attributes.width;delete item.attributes.height}}};var removeDimensions$1={type:type$o,active:active$o,description:description$o,fn:fn$o};var type$n="perItem";var active$n=true;var description$n="removes doctype declaration";var fn$n=function(item){if(item.type==="doctype"){return false}};var removeDoctype$1={type:type$n,active:active$n,description:description$n,fn:fn$n};const{parseName:parseName$3}=tools;const{editorNamespaces:editorNamespaces}=_collections;var type$m="perItem";var active$m=true;var description$m="removes editors namespaces, elements and attributes";const prefixes=[];var params$6={additionalNamespaces:[]};var fn$m=function(item,params){let namespaces=editorNamespaces;if(Array.isArray(params.additionalNamespaces)){namespaces=[...editorNamespaces,...params.additionalNamespaces]}if(item.type==="element"){if(item.isElem("svg")){for(const[name,value]of Object.entries(item.attributes)){const{prefix:prefix,local:local}=parseName$3(name);if(prefix==="xmlns"&&namespaces.includes(value)){prefixes.push(local);delete item.attributes[name]}}}for(const name of Object.keys(item.attributes)){const{prefix:prefix}=parseName$3(name);if(prefixes.includes(prefix)){delete item.attributes[name]}}const{prefix:prefix}=parseName$3(item.name);if(prefixes.includes(prefix)){return false}}};var removeEditorsNSData$1={type:type$m,active:active$m,description:description$m,params:params$6,fn:fn$m};var type$l="perItem";var active$l=false;var description$l="removes arbitrary elements by ID or className (disabled by default)";var params$5={id:[],class:[]};var fn$l=function(item,params){["id","class"].forEach((function(key){if(!Array.isArray(params[key])){params[key]=[params[key]]}}));if(item.type!=="element"){return}if(item.attributes.id!=null&&params.id.length!==0){return params.id.includes(item.attributes.id)===false}if(item.attributes.class&&params.class.length!==0){const classList=item.attributes.class.split(" ");return params.class.some((item=>classList.includes(item)))===false}};var removeElementsByAttr$1={type:type$l,active:active$l,description:description$l,params:params$5,fn:fn$l};const{attrsGroups:attrsGroups$2}=_collections;var type$k="perItem";var active$k=true;var description$k="removes empty attributes";var fn$k=function(item){if(item.type==="element"){for(const[name,value]of Object.entries(item.attributes)){if(value===""&&attrsGroups$2.conditionalProcessing.includes(name)===false){delete item.attributes[name]}}}};var removeEmptyAttrs$1={type:type$k,active:active$k,description:description$k,fn:fn$k};const{elemsGroups:elemsGroups$2}=_collections;var type$j="perItemReverse";var active$j=true;var description$j="removes empty container elements";var fn$j=function(item){if(item.type==="element"){return item.children.length!==0||elemsGroups$2.container.includes(item.name)===false||item.name==="svg"||item.name==="pattern"&&Object.keys(item.attributes).length!==0||item.name==="g"&&item.attributes.filter!=null||item.name==="mask"&&item.attributes.id!=null}return true};var removeEmptyContainers$1={type:type$j,active:active$j,description:description$j,fn:fn$j};var type$i="perItem";var active$i=true;var description$i="removes empty <text> elements";var params$4={text:true,tspan:true,tref:true};var fn$i=function(item,params){if(item.type==="element"){if(params.text&&item.name==="text"&&item.children.length===0){return false}if(params.tspan&&item.name==="tspan"&&item.children.length===0){return false}if(params.tref&&item.name==="tref"&&item.attributes["xlink:href"]==null){return false}}};var removeEmptyText$1={type:type$i,active:active$i,description:description$i,params:params$4,fn:fn$i};const{querySelector:querySelector,closestByName:closestByName$1}=xast;const{computeStyle:computeStyle}=style;const{parsePathData:parsePathData}=path;var type$h="perItem";var active$h=true;var description$h="removes hidden elements (zero sized, with absent attributes)";var params$3={isHidden:true,displayNone:true,opacity0:true,circleR0:true,ellipseRX0:true,ellipseRY0:true,rectWidth0:true,rectHeight0:true,patternWidth0:true,patternHeight0:true,imageWidth0:true,imageHeight0:true,pathEmptyD:true,polylineEmptyPoints:true,polygonEmptyPoints:true};var fn$h=function(item,params){if(item.type==="element"){const computedStyle=computeStyle(item);if(params.isHidden&&computedStyle.visibility&&computedStyle.visibility.type==="static"&&computedStyle.visibility.value==="hidden"&&querySelector(item,"[visibility=visible]")==null){return false}if(params.displayNone&&computedStyle.display&&computedStyle.display.type==="static"&&computedStyle.display.value==="none"&&item.isElem("marker")===false){return false}if(params.opacity0&&computedStyle.opacity&&computedStyle.opacity.type==="static"&&computedStyle.opacity.value==="0"&&closestByName$1(item,"clipPath")==null){return false}if(params.circleR0&&item.isElem("circle")&&item.children.length===0&&item.attributes.r==="0"){return false}if(params.ellipseRX0&&item.isElem("ellipse")&&item.children.length===0&&item.attributes.rx==="0"){return false}if(params.ellipseRY0&&item.isElem("ellipse")&&item.children.length===0&&item.attributes.ry==="0"){return false}if(params.rectWidth0&&item.isElem("rect")&&item.children.length===0&&item.attributes.width==="0"){return false}if(params.rectHeight0&&params.rectWidth0&&item.isElem("rect")&&item.children.length===0&&item.attributes.height==="0"){return false}if(params.patternWidth0&&item.isElem("pattern")&&item.attributes.width==="0"){return false}if(params.patternHeight0&&item.isElem("pattern")&&item.attributes.height==="0"){return false}if(params.imageWidth0&&item.isElem("image")&&item.attributes.width==="0"){return false}if(params.imageHeight0&&item.isElem("image")&&item.attributes.height==="0"){return false}if(params.pathEmptyD&&item.isElem("path")){if(item.attributes.d==null){return false}const pathData=parsePathData(item.attributes.d);if(pathData.length===0){return false}if(pathData.length===1&&computedStyle["marker-start"]==null&&computedStyle["marker-end"]==null){return false}return true}if(params.polylineEmptyPoints&&item.isElem("polyline")&&item.attributes.points==null){return false}if(params.polygonEmptyPoints&&item.isElem("polygon")&&item.attributes.points==null){return false}}};var removeHiddenElems$1={type:type$h,active:active$h,description:description$h,params:params$3,fn:fn$h};var type$g="perItem";var active$g=true;var description$g="removes <metadata>";var fn$g=function(item){return!item.isElem("metadata")};var removeMetadata$1={type:type$g,active:active$g,description:description$g,fn:fn$g};var type$f="perItem";var active$f=true;var description$f="removes non-inheritable group’s presentational attributes";const{inheritableAttrs:inheritableAttrs,attrsGroups:attrsGroups$1,presentationNonInheritableGroupAttrs:presentationNonInheritableGroupAttrs}=_collections;var fn$f=function(item){if(item.type==="element"&&item.name==="g"){for(const name of Object.keys(item.attributes)){if(attrsGroups$1.presentation.includes(name)===true&&inheritableAttrs.includes(name)===false&&presentationNonInheritableGroupAttrs.includes(name)===false){delete item.attributes[name]}}}};var removeNonInheritableGroupAttrs$1={type:type$f,active:active$f,description:description$f,fn:fn$f};var type$e="perItem";var active$e=false;var description$e="removes elements that are drawn outside of the viewbox (disabled by default)";var intersects=_path.intersects,path2js=_path.path2js,viewBox,viewBoxJS;var fn$e=function(item){if(item.type==="element"&&item.name==="path"&&item.attributes.d!=null&&typeof viewBox!=="undefined"){if(hasTransform(item)||pathMovesWithinViewBox(item.attributes.d)){return true}var pathJS=path2js(item);if(pathJS.length===2){pathJS=JSON.parse(JSON.stringify(pathJS));pathJS.push({instruction:"z"})}return intersects(viewBoxJS,pathJS)}if(item.type==="element"&&item.name==="svg"){parseViewBox(item)}return true};function hasTransform(item){return item.attributes.transform!=null||item.parentNode&&item.parentNode.type==="element"&&hasTransform(item.parentNode)}function parseViewBox(svg){var viewBoxData="";if(svg.attributes.viewBox!=null){viewBoxData=svg.attributes.viewBox}else if(svg.attributes.height!=null&&svg.attributes.width!=null){viewBoxData=`0 0 ${svg.attributes.width} ${svg.attributes.height}`}viewBoxData=viewBoxData.replace(/[,+]|px/g," ").replace(/\s+/g," ").replace(/^\s*|\s*$/g,"");var m=/^(-?\d*\.?\d+) (-?\d*\.?\d+) (\d*\.?\d+) (\d*\.?\d+)$/.exec(viewBoxData);if(!m){return}viewBox={left:parseFloat(m[1]),top:parseFloat(m[2]),right:parseFloat(m[1])+parseFloat(m[3]),bottom:parseFloat(m[2])+parseFloat(m[4])};var path=new jsAPI({type:"element",name:"path",attributes:{d:"M"+m[1]+" "+m[2]+"h"+m[3]+"v"+m[4]+"H"+m[1]+"z"},content:[]});viewBoxJS=path2js(path)}function pathMovesWithinViewBox(path){var regexp=/M\s*(-?\d*\.?\d+)(?!\d)\s*(-?\d*\.?\d+)/g,m;while(null!==(m=regexp.exec(path))){if(m[1]>=viewBox.left&&m[1]<=viewBox.right&&m[2]>=viewBox.top&&m[2]<=viewBox.bottom){return true}}return false}var removeOffCanvasPaths$1={type:type$e,active:active$e,description:description$e,fn:fn$e};var type$d="perItem";var active$d=false;var description$d="removes raster images (disabled by default)";var fn$d=function(item){if(item.type==="element"&&item.name==="image"&&item.attributes["xlink:href"]!=null&&/(\.|image\/)(jpg|png|gif)/.test(item.attributes["xlink:href"])){return false}};var removeRasterImages$1={type:type$d,active:active$d,description:description$d,fn:fn$d};var type$c="perItem";var active$c=false;var description$c="removes <script> elements (disabled by default)";var fn$c=function(item){return!item.isElem("script")};var removeScriptElement$1={type:type$c,active:active$c,description:description$c,fn:fn$c};var type$b="perItem";var active$b=false;var description$b="removes <style> element (disabled by default)";var fn$b=function(item){return!item.isElem("style")};var removeStyleElement$1={type:type$b,active:active$b,description:description$b,fn:fn$b};var type$a="perItem";var active$a=true;var description$a="removes <title>";var fn$a=function(item){return!item.isElem("title")};var removeTitle$1={type:type$a,active:active$a,description:description$a,fn:fn$a};const{parseName:parseName$2}=tools;var type$9="perItem";var active$9=true;var description$9="removes unknown elements content and attributes, removes attrs with default values";var params$2={unknownContent:true,unknownAttrs:true,defaultAttrs:true,uselessOverrides:true,keepDataAttrs:true,keepAriaAttrs:true,keepRoleAttr:false};var elems=_collections.elems,attrsGroups=_collections.attrsGroups,elemsGroups$1=_collections.elemsGroups,attrsGroupsDefaults=_collections.attrsGroupsDefaults,attrsInheritable=_collections.inheritableAttrs,applyGroups=_collections.presentationNonInheritableGroupAttrs;for(const elem of Object.values(elems)){if(elem.attrsGroups){elem.attrs=elem.attrs||[];elem.attrsGroups.forEach((function(attrsGroupName){elem.attrs=elem.attrs.concat(attrsGroups[attrsGroupName]);var groupDefaults=attrsGroupsDefaults[attrsGroupName];if(groupDefaults){elem.defaults=elem.defaults||{};for(const[attrName,attr]of Object.entries(groupDefaults)){elem.defaults[attrName]=attr}}}))}if(elem.contentGroups){elem.content=elem.content||[];elem.contentGroups.forEach((function(contentGroupName){elem.content=elem.content.concat(elemsGroups$1[contentGroupName])}))}}var fn$9=function(item,params){if(item.type==="element"&&!parseName$2(item.name).prefix){var elem=item.name;if(params.unknownContent&&elems[elem]&&elem!=="foreignObject"){item.children.forEach((function(content,i){if(content.type==="element"&&!parseName$2(content.name).prefix&&(elems[elem].content&&elems[elem].content.indexOf(content.name)===-1||!elems[elem].content&&!elems[content.name])){item.children.splice(i,1)}}))}if(elems[elem]&&elems[elem].attrs){for(const[name,value]of Object.entries(item.attributes)){const{prefix:prefix}=parseName$2(name);if(name!=="xmlns"&&(prefix==="xml"||!prefix)&&(!params.keepDataAttrs||name.indexOf("data-")!=0)&&(!params.keepAriaAttrs||name.indexOf("aria-")!=0)&&(!params.keepRoleAttr||name!="role")){if(params.unknownAttrs&&elems[elem].attrs.indexOf(name)===-1||params.defaultAttrs&&item.attributes.id==null&&elems[elem].defaults&&elems[elem].defaults[name]===value&&(attrsInheritable.includes(name)===false||!item.parentNode.computedAttr(name))||params.uselessOverrides&&item.attributes.id==null&&applyGroups.includes(name)===false&&attrsInheritable.includes(name)===true&&item.parentNode.computedAttr(name,value)){delete item.attributes[name]}}}}}};var removeUnknownsAndDefaults$1={type:type$9,active:active$9,description:description$9,params:params$2,fn:fn$9};const{traverse:traverse$1}=xast;const{parseName:parseName$1}=tools;var type$8="full";var active$8=true;var description$8="removes unused namespaces declaration";var fn$8=function(root){let svgElem;const xmlnsCollection=[];function removeNSfromCollection(ns){const pos=xmlnsCollection.indexOf(ns);if(pos>-1){xmlnsCollection.splice(pos,1)}}traverse$1(root,(node=>{if(node.type==="element"){if(node.name==="svg"){for(const name of Object.keys(node.attributes)){const{prefix:prefix,local:local}=parseName$1(name);if(prefix==="xmlns"&&local){xmlnsCollection.push(local)}}if(xmlnsCollection.length){svgElem=node}}if(xmlnsCollection.length){const{prefix:prefix}=parseName$1(node.name);if(prefix){removeNSfromCollection(prefix)}for(const name of Object.keys(node.attributes)){const{prefix:prefix}=parseName$1(name);removeNSfromCollection(prefix)}}}}));if(xmlnsCollection.length){for(const name of xmlnsCollection){delete svgElem.attributes["xmlns:"+name]}}return root};var removeUnusedNS$1={type:type$8,active:active$8,description:description$8,fn:fn$8};const{elemsGroups:elemsGroups}=_collections;var type$7="perItem";var active$7=true;var description$7="removes elements in <defs> without id";var fn$7=function(item){if(item.type==="element"){if(item.name==="defs"){item.children=getUsefulItems(item,[]);if(item.children.length===0){return false}}else if(elemsGroups.nonRendering.includes(item.name)&&item.attributes.id==null){return false}}};function getUsefulItems(item,usefulItems){for(const child of item.children){if(child.type==="element"){if(child.attributes.id!=null||child.name==="style"){usefulItems.push(child);child.parentNode=item}else{child.children=getUsefulItems(child,usefulItems)}}}return usefulItems}var removeUselessDefs$1={type:type$7,active:active$7,description:description$7,fn:fn$7};var type$6="perItem";var active$6=true;var description$6="removes useless stroke and fill attributes";var params$1={stroke:true,fill:true,removeNone:false,hasStyleOrScript:false};var shape=_collections.elemsGroups.shape,regStrokeProps=/^stroke/,regFillProps=/^fill-/,styleOrScript=["style","script"];var fn$6=function(item,params){if(item.isElem(styleOrScript)){params.hasStyleOrScript=true}if(!params.hasStyleOrScript&&item.isElem(shape)&&!item.computedAttr("id")){var stroke=params.stroke&&item.computedAttr("stroke"),fill=params.fill&&!item.computedAttr("fill","none");if(params.stroke&&(!stroke||stroke=="none"||item.computedAttr("stroke-opacity","0")||item.computedAttr("stroke-width","0"))){if(item.computedAttr("stroke-width","0")===true||item.computedAttr("marker-end")==null){var parentStroke=item.parentNode.computedAttr("stroke"),declineStroke=parentStroke&&parentStroke!="none";for(const name of Object.keys(item.attributes)){if(regStrokeProps.test(name)){delete item.attributes[name]}}if(declineStroke){item.attributes.stroke="none"}}}if(params.fill&&(!fill||item.computedAttr("fill-opacity","0"))){for(const name of Object.keys(item.attributes)){if(regFillProps.test(name)){delete item.attributes[name]}}if(fill){item.attributes.fill="none"}}if(params.removeNone&&(!stroke||item.attributes.stroke=="none")&&(!fill||item.attributes.fill=="none")){return false}}};var removeUselessStrokeAndFill$1={type:type$6,active:active$6,description:description$6,params:params$1,fn:fn$6};const{closestByName:closestByName}=xast;var type$5="perItem";var active$5=true;var description$5="removes viewBox attribute when possible";const viewBoxElems=["svg","pattern","symbol"];var fn$5=function(item){if(item.type==="element"&&viewBoxElems.includes(item.name)&&item.attributes.viewBox!=null&&item.attributes.width!=null&&item.attributes.height!=null){if(item.name==="svg"&&closestByName(item.parentNode,"svg")){return}const nums=item.attributes.viewBox.split(/[ ,]+/g);if(nums[0]==="0"&&nums[1]==="0"&&item.attributes.width.replace(/px$/,"")===nums[2]&&item.attributes.height.replace(/px$/,"")===nums[3]){delete item.attributes.viewBox}}};var removeViewBox$1={type:type$5,active:active$5,description:description$5,fn:fn$5};var type$4="perItem";var active$4=false;var description$4="removes xmlns attribute (for inline svg, disabled by default)";var fn$4=function(item){if(item.type==="element"&&item.name==="svg"){delete item.attributes.xmlns}};var removeXMLNS$1={type:type$4,active:active$4,description:description$4,fn:fn$4};var type$3="perItem";var active$3=true;var description$3="removes XML processing instructions";var fn$3=function(item){if(item.type==="instruction"&&item.name==="xml"){return false}return true};var removeXMLProcInst$1={type:type$3,active:active$3,description:description$3,fn:fn$3};const{traverse:traverse}=xast;var type$2="full";var active$2=false;var description$2="Finds <path> elements with the same d, fill, and "+"stroke, and converts them to <use> elements "+"referencing a single <path> def.";var fn$2=function(root){const seen=new Map;let count=0;const defs=[];traverse(root,(node=>{if(node.type!=="element"||node.name!=="path"||node.attributes.d==null){return}const d=node.attributes.d;const fill=node.attributes.fill||"";const stroke=node.attributes.stroke||"";const key=d+";s:"+stroke+";f:"+fill;const hasSeen=seen.get(key);if(!hasSeen){seen.set(key,{elem:node,reused:false});return}if(!hasSeen.reused){hasSeen.reused=true;if(hasSeen.elem.attributes.id==null){hasSeen.elem.attributes.id="reuse-"+count++}defs.push(hasSeen.elem)}convertToUse(node,hasSeen.elem.attributes.id)}));if(defs.length>0){const defsTag=new jsAPI({type:"element",name:"defs",attributes:{},children:[]},root);root.children[0].spliceContent(0,0,defsTag);for(let def of defs){const style=def.style;const defClass=def.class;delete def.style;delete def.class;const defClone=def.clone();def.style=style;def.class=defClass;delete defClone.attributes.transform;defsTag.spliceContent(0,0,defClone);def=convertToUse(def,defClone.attributes.id);delete def.attributes.id}}return root};function convertToUse(item,href){item.renameElem("use");delete item.attributes.d;delete item.attributes.stroke;delete item.attributes.fill;item.attributes["xlink:href"]="#"+href;delete item.pathJS;return item}var reusePaths$1={type:type$2,active:active$2,description:description$2,fn:fn$2};const{parseName:parseName}=tools;var type$1="perItem";var active$1=false;var description$1="sorts element attributes (disabled by default)";var params={order:["id","width","height","x","x1","x2","y","y1","y2","cx","cy","r","fill","stroke","marker","d","points"]};var fn$1=function(item,params){const orderlen=params.order.length+1;const xmlnsOrder=params.xmlnsOrder||"front";if(item.type==="element"){const attrs=Object.entries(item.attributes);attrs.sort((([aName],[bName])=>{const{prefix:aPrefix}=parseName(aName);const{prefix:bPrefix}=parseName(bName);if(aPrefix!=bPrefix){if(xmlnsOrder=="front"){if(aPrefix==="xmlns")return-1;if(bPrefix==="xmlns")return 1}return aPrefix<bPrefix?-1:1}let aindex=orderlen;let bindex=orderlen;for(let i=0;i<params.order.length;i++){if(aName==params.order[i]){aindex=i}else if(aName.indexOf(params.order[i]+"-")===0){aindex=i+.5}if(bName==params.order[i]){bindex=i}else if(bName.indexOf(params.order[i]+"-")===0){bindex=i+.5}}if(aindex!=bindex){return aindex-bindex}return aName<bName?-1:1}));const sorted={};for(const[name,value]of attrs){sorted[name]=value}item.attributes=sorted}};var sortAttrs$1={type:type$1,active:active$1,description:description$1,params:params,fn:fn$1};var type="perItem";var active=true;var description="Sorts children of <defs> to improve compression";var fn=function(item){if(item.isElem("defs")){var frequency=item.children.reduce((function(frequency,child){if(child.name in frequency){frequency[child.name]++}else{frequency[child.name]=1}return frequency}),{});item.children.sort((function(a,b){var frequencyComparison=frequency[b.name]-frequency[a.name];if(frequencyComparison!==0){return frequencyComparison}var lengthComparison=b.name.length-a.name.length;if(lengthComparison!==0){return lengthComparison}return a.name!=b.name?a.name>b.name?-1:1:0}));return true}};var sortDefsChildren$1={type:type,active:active,description:description,fn:fn};var addAttributesToSVGElement=addAttributesToSVGElement$1;var addClassesToSVGElement=addClassesToSVGElement$1;var cleanupAttrs=cleanupAttrs$1;var cleanupEnableBackground=cleanupEnableBackground$1;var cleanupIDs=cleanupIDs$1;var cleanupListOfValues=cleanupListOfValues$1;var cleanupNumericValues=cleanupNumericValues$1;var collapseGroups=collapseGroups$1;var convertColors=convertColors$1;var convertEllipseToCircle=convertEllipseToCircle$1;var convertPathData=convertPathData$1;var convertShapeToPath=convertShapeToPath$1;var convertStyleToAttrs=convertStyleToAttrs$1;var convertTransform=convertTransform_1;var mergeStyles=mergeStyles$1;var inlineStyles=inlineStyles$1;var mergePaths=mergePaths$1;var minifyStyles=minifyStyles$1;var moveElemsAttrsToGroup=moveElemsAttrsToGroup$1;var moveGroupAttrsToElems=moveGroupAttrsToElems$1;var prefixIds=prefixIds$1;var removeAttributesBySelector=removeAttributesBySelector$1;var removeAttrs=removeAttrs$1;var removeComments=removeComments$1;var removeDesc=removeDesc$1;var removeDimensions=removeDimensions$1;var removeDoctype=removeDoctype$1;var removeEditorsNSData=removeEditorsNSData$1;var removeElementsByAttr=removeElementsByAttr$1;var removeEmptyAttrs=removeEmptyAttrs$1;var removeEmptyContainers=removeEmptyContainers$1;var removeEmptyText=removeEmptyText$1;var removeHiddenElems=removeHiddenElems$1;var removeMetadata=removeMetadata$1;var removeNonInheritableGroupAttrs=removeNonInheritableGroupAttrs$1;var removeOffCanvasPaths=removeOffCanvasPaths$1;var removeRasterImages=removeRasterImages$1;var removeScriptElement=removeScriptElement$1;var removeStyleElement=removeStyleElement$1;var removeTitle=removeTitle$1;var removeUnknownsAndDefaults=removeUnknownsAndDefaults$1;var removeUnusedNS=removeUnusedNS$1;var removeUselessDefs=removeUselessDefs$1;var removeUselessStrokeAndFill=removeUselessStrokeAndFill$1;var removeViewBox=removeViewBox$1;var removeXMLNS=removeXMLNS$1;var removeXMLProcInst=removeXMLProcInst$1;var reusePaths=reusePaths$1;var sortAttrs=sortAttrs$1;var sortDefsChildren=sortDefsChildren$1;var plugins$1={addAttributesToSVGElement:addAttributesToSVGElement,addClassesToSVGElement:addClassesToSVGElement,cleanupAttrs:cleanupAttrs,cleanupEnableBackground:cleanupEnableBackground,cleanupIDs:cleanupIDs,cleanupListOfValues:cleanupListOfValues,cleanupNumericValues:cleanupNumericValues,collapseGroups:collapseGroups,convertColors:convertColors,convertEllipseToCircle:convertEllipseToCircle,convertPathData:convertPathData,convertShapeToPath:convertShapeToPath,convertStyleToAttrs:convertStyleToAttrs,convertTransform:convertTransform,mergeStyles:mergeStyles,inlineStyles:inlineStyles,mergePaths:mergePaths,minifyStyles:minifyStyles,moveElemsAttrsToGroup:moveElemsAttrsToGroup,moveGroupAttrsToElems:moveGroupAttrsToElems,prefixIds:prefixIds,removeAttributesBySelector:removeAttributesBySelector,removeAttrs:removeAttrs,removeComments:removeComments,removeDesc:removeDesc,removeDimensions:removeDimensions,removeDoctype:removeDoctype,removeEditorsNSData:removeEditorsNSData,removeElementsByAttr:removeElementsByAttr,removeEmptyAttrs:removeEmptyAttrs,removeEmptyContainers:removeEmptyContainers,removeEmptyText:removeEmptyText,removeHiddenElems:removeHiddenElems,removeMetadata:removeMetadata,removeNonInheritableGroupAttrs:removeNonInheritableGroupAttrs,removeOffCanvasPaths:removeOffCanvasPaths,removeRasterImages:removeRasterImages,removeScriptElement:removeScriptElement,removeStyleElement:removeStyleElement,removeTitle:removeTitle,removeUnknownsAndDefaults:removeUnknownsAndDefaults,removeUnusedNS:removeUnusedNS,removeUselessDefs:removeUselessDefs,removeUselessStrokeAndFill:removeUselessStrokeAndFill,removeViewBox:removeViewBox,removeXMLNS:removeXMLNS,removeXMLProcInst:removeXMLProcInst,reusePaths:reusePaths,sortAttrs:sortAttrs,sortDefsChildren:sortDefsChildren};const pluginsOrder=["removeDoctype","removeXMLProcInst","removeComments","removeMetadata","removeXMLNS","removeEditorsNSData","cleanupAttrs","mergeStyles","inlineStyles","minifyStyles","convertStyleToAttrs","cleanupIDs","prefixIds","removeRasterImages","removeUselessDefs","cleanupNumericValues","cleanupListOfValues","convertColors","removeUnknownsAndDefaults","removeNonInheritableGroupAttrs","removeUselessStrokeAndFill","removeViewBox","cleanupEnableBackground","removeHiddenElems","removeEmptyText","convertShapeToPath","convertEllipseToCircle","moveElemsAttrsToGroup","moveGroupAttrsToElems","collapseGroups","convertPathData","convertTransform","removeEmptyAttrs","removeEmptyContainers","mergePaths","removeUnusedNS","sortAttrs","sortDefsChildren","removeTitle","removeDesc","removeDimensions","removeAttrs","removeAttributesBySelector","removeElementsByAttr","addClassesToSVGElement","removeStyleElement","removeScriptElement","addAttributesToSVGElement","removeOffCanvasPaths","reusePaths"];const defaultPlugins$1=pluginsOrder.filter((name=>plugins$1[name].active));var defaultPlugins_1=defaultPlugins$1;const extendDefaultPlugins$1=plugins=>{const extendedPlugins=pluginsOrder.map((name=>({name:name,active:plugins$1[name].active})));for(const plugin of plugins){const resolvedPlugin=resolvePluginConfig$1(plugin,{});const index=pluginsOrder.indexOf(resolvedPlugin.name);if(index===-1){extendedPlugins.push(plugin)}else{extendedPlugins[index]=plugin}}return extendedPlugins};var extendDefaultPlugins_1$1=extendDefaultPlugins$1;const resolvePluginConfig$1=(plugin,config)=>{let configParams={};if("floatPrecision"in config){configParams.floatPrecision=config.floatPrecision}if(typeof plugin==="string"){const pluginConfig=plugins$1[plugin];if(pluginConfig==null){throw Error(`Unknown builtin plugin "${plugin}" specified.`)}return{...pluginConfig,name:plugin,active:true,params:{...pluginConfig.params,...configParams}}}if(typeof plugin==="object"&&plugin!=null){if(plugin.name==null){throw Error(`Plugin name should be specified`)}if(plugin.fn){return{active:true,...plugin,params:{...configParams,...plugin.params}}}else{const pluginConfig=plugins$1[plugin.name];if(pluginConfig==null){throw Error(`Unknown builtin plugin "${plugin.name}" specified.`)}return{...pluginConfig,active:true,...plugin,params:{...pluginConfig.params,...configParams,...plugin.params}}}}return null};var resolvePluginConfig_1=resolvePluginConfig$1;var config$1={defaultPlugins:defaultPlugins_1,extendDefaultPlugins:extendDefaultPlugins_1$1,resolvePluginConfig:resolvePluginConfig_1};var sax=createCommonjsModule((function(module,exports){(function(sax){sax.parser=function(strict,opt){return new SAXParser(strict,opt)};sax.SAXParser=SAXParser;sax.MAX_BUFFER_LENGTH=64*1024;var buffers=["comment","sgmlDecl","textNode","tagName","doctype","procInstName","procInstBody","entity","attribName","attribValue","cdata","script"];sax.EVENTS=["text","processinginstruction","sgmldeclaration","doctype","comment","opentagstart","attribute","opentag","closetag","opencdata","cdata","closecdata","error","end","ready","script","opennamespace","closenamespace"];function SAXParser(strict,opt){if(!(this instanceof SAXParser)){return new SAXParser(strict,opt)}var parser=this;clearBuffers(parser);parser.q=parser.c="";parser.bufferCheckPosition=sax.MAX_BUFFER_LENGTH;parser.opt=opt||{};parser.opt.lowercase=parser.opt.lowercase||parser.opt.lowercasetags;parser.looseCase=parser.opt.lowercase?"toLowerCase":"toUpperCase";parser.tags=[];parser.closed=parser.closedRoot=parser.sawRoot=false;parser.tag=parser.error=null;parser.strict=!!strict;parser.noscript=!!(strict||parser.opt.noscript);parser.state=S.BEGIN;parser.strictEntities=parser.opt.strictEntities;parser.ENTITIES=parser.strictEntities?Object.create(sax.XML_ENTITIES):Object.create(sax.ENTITIES);parser.attribList=[];if(parser.opt.xmlns){parser.ns=Object.create(rootNS)}parser.trackPosition=parser.opt.position!==false;if(parser.trackPosition){parser.position=parser.line=parser.column=0}emit(parser,"onready")}if(!Object.create){Object.create=function(o){function F(){}F.prototype=o;var newf=new F;return newf}}if(!Object.keys){Object.keys=function(o){var a=[];for(var i in o)if(o.hasOwnProperty(i))a.push(i);return a}}function checkBufferLength(parser){var maxAllowed=Math.max(sax.MAX_BUFFER_LENGTH,10);var maxActual=0;for(var i=0,l=buffers.length;i<l;i++){var len=parser[buffers[i]].length;if(len>maxAllowed){switch(buffers[i]){case"textNode":closeText(parser);break;case"cdata":emitNode(parser,"oncdata",parser.cdata);parser.cdata="";break;case"script":emitNode(parser,"onscript",parser.script);parser.script="";break;default:error(parser,"Max buffer length exceeded: "+buffers[i])}}maxActual=Math.max(maxActual,len)}var m=sax.MAX_BUFFER_LENGTH-maxActual;parser.bufferCheckPosition=m+parser.position}function clearBuffers(parser){for(var i=0,l=buffers.length;i<l;i++){parser[buffers[i]]=""}}function flushBuffers(parser){closeText(parser);if(parser.cdata!==""){emitNode(parser,"oncdata",parser.cdata);parser.cdata=""}if(parser.script!==""){emitNode(parser,"onscript",parser.script);parser.script=""}}SAXParser.prototype={end:function(){end(this)},write:write,resume:function(){this.error=null;return this},close:function(){return this.write(null)},flush:function(){flushBuffers(this)}};var CDATA="[CDATA[";var DOCTYPE="DOCTYPE";var XML_NAMESPACE="http://www.w3.org/XML/1998/namespace";var XMLNS_NAMESPACE="http://www.w3.org/2000/xmlns/";var rootNS={xml:XML_NAMESPACE,xmlns:XMLNS_NAMESPACE};var nameStart=/[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/;var nameBody=/[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/;var entityStart=/[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/;var entityBody=/[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/;function isWhitespace(c){return c===" "||c==="\n"||c==="\r"||c==="\t"}function isQuote(c){return c==='"'||c==="'"}function isAttribEnd(c){return c===">"||isWhitespace(c)}function isMatch(regex,c){return regex.test(c)}function notMatch(regex,c){return!isMatch(regex,c)}var S=0;sax.STATE={BEGIN:S++,BEGIN_WHITESPACE:S++,TEXT:S++,TEXT_ENTITY:S++,OPEN_WAKA:S++,SGML_DECL:S++,SGML_DECL_QUOTED:S++,DOCTYPE:S++,DOCTYPE_QUOTED:S++,DOCTYPE_DTD:S++,DOCTYPE_DTD_QUOTED:S++,COMMENT_STARTING:S++,COMMENT:S++,COMMENT_ENDING:S++,COMMENT_ENDED:S++,CDATA:S++,CDATA_ENDING:S++,CDATA_ENDING_2:S++,PROC_INST:S++,PROC_INST_BODY:S++,PROC_INST_ENDING:S++,OPEN_TAG:S++,OPEN_TAG_SLASH:S++,ATTRIB:S++,ATTRIB_NAME:S++,ATTRIB_NAME_SAW_WHITE:S++,ATTRIB_VALUE:S++,ATTRIB_VALUE_QUOTED:S++,ATTRIB_VALUE_CLOSED:S++,ATTRIB_VALUE_UNQUOTED:S++,ATTRIB_VALUE_ENTITY_Q:S++,ATTRIB_VALUE_ENTITY_U:S++,CLOSE_TAG:S++,CLOSE_TAG_SAW_WHITE:S++,SCRIPT:S++,SCRIPT_ENDING:S++};sax.XML_ENTITIES={amp:"&",gt:">",lt:"<",quot:'"',apos:"'"};sax.ENTITIES={amp:"&",gt:">",lt:"<",quot:'"',apos:"'",AElig:198,Aacute:193,Acirc:194,Agrave:192,Aring:197,Atilde:195,Auml:196,Ccedil:199,ETH:208,Eacute:201,Ecirc:202,Egrave:200,Euml:203,Iacute:205,Icirc:206,Igrave:204,Iuml:207,Ntilde:209,Oacute:211,Ocirc:212,Ograve:210,Oslash:216,Otilde:213,Ouml:214,THORN:222,Uacute:218,Ucirc:219,Ugrave:217,Uuml:220,Yacute:221,aacute:225,acirc:226,aelig:230,agrave:224,aring:229,atilde:227,auml:228,ccedil:231,eacute:233,ecirc:234,egrave:232,eth:240,euml:235,iacute:237,icirc:238,igrave:236,iuml:239,ntilde:241,oacute:243,ocirc:244,ograve:242,oslash:248,otilde:245,ouml:246,szlig:223,thorn:254,uacute:250,ucirc:251,ugrave:249,uuml:252,yacute:253,yuml:255,copy:169,reg:174,nbsp:160,iexcl:161,cent:162,pound:163,curren:164,yen:165,brvbar:166,sect:167,uml:168,ordf:170,laquo:171,not:172,shy:173,macr:175,deg:176,plusmn:177,sup1:185,sup2:178,sup3:179,acute:180,micro:181,para:182,middot:183,cedil:184,ordm:186,raquo:187,frac14:188,frac12:189,frac34:190,iquest:191,times:215,divide:247,OElig:338,oelig:339,Scaron:352,scaron:353,Yuml:376,fnof:402,circ:710,tilde:732,Alpha:913,Beta:914,Gamma:915,Delta:916,Epsilon:917,Zeta:918,Eta:919,Theta:920,Iota:921,Kappa:922,Lambda:923,Mu:924,Nu:925,Xi:926,Omicron:927,Pi:928,Rho:929,Sigma:931,Tau:932,Upsilon:933,Phi:934,Chi:935,Psi:936,Omega:937,alpha:945,beta:946,gamma:947,delta:948,epsilon:949,zeta:950,eta:951,theta:952,iota:953,kappa:954,lambda:955,mu:956,nu:957,xi:958,omicron:959,pi:960,rho:961,sigmaf:962,sigma:963,tau:964,upsilon:965,phi:966,chi:967,psi:968,omega:969,thetasym:977,upsih:978,piv:982,ensp:8194,emsp:8195,thinsp:8201,zwnj:8204,zwj:8205,lrm:8206,rlm:8207,ndash:8211,mdash:8212,lsquo:8216,rsquo:8217,sbquo:8218,ldquo:8220,rdquo:8221,bdquo:8222,dagger:8224,Dagger:8225,bull:8226,hellip:8230,permil:8240,prime:8242,Prime:8243,lsaquo:8249,rsaquo:8250,oline:8254,frasl:8260,euro:8364,image:8465,weierp:8472,real:8476,trade:8482,alefsym:8501,larr:8592,uarr:8593,rarr:8594,darr:8595,harr:8596,crarr:8629,lArr:8656,uArr:8657,rArr:8658,dArr:8659,hArr:8660,forall:8704,part:8706,exist:8707,empty:8709,nabla:8711,isin:8712,notin:8713,ni:8715,prod:8719,sum:8721,minus:8722,lowast:8727,radic:8730,prop:8733,infin:8734,ang:8736,and:8743,or:8744,cap:8745,cup:8746,int:8747,there4:8756,sim:8764,cong:8773,asymp:8776,ne:8800,equiv:8801,le:8804,ge:8805,sub:8834,sup:8835,nsub:8836,sube:8838,supe:8839,oplus:8853,otimes:8855,perp:8869,sdot:8901,lceil:8968,rceil:8969,lfloor:8970,rfloor:8971,lang:9001,rang:9002,loz:9674,spades:9824,clubs:9827,hearts:9829,diams:9830};Object.keys(sax.ENTITIES).forEach((function(key){var e=sax.ENTITIES[key];var s=typeof e==="number"?String.fromCharCode(e):e;sax.ENTITIES[key]=s}));for(var s in sax.STATE){sax.STATE[sax.STATE[s]]=s}S=sax.STATE;function emit(parser,event,data){parser[event]&&parser[event](data)}function emitNode(parser,nodeType,data){if(parser.textNode)closeText(parser);emit(parser,nodeType,data)}function closeText(parser){parser.textNode=textopts(parser.opt,parser.textNode);if(parser.textNode)emit(parser,"ontext",parser.textNode);parser.textNode=""}function textopts(opt,text){if(opt.trim)text=text.trim();if(opt.normalize)text=text.replace(/\s+/g," ");return text}function error(parser,er){closeText(parser);if(parser.trackPosition){er+="\nLine: "+parser.line+"\nColumn: "+parser.column+"\nChar: "+parser.c}er=new Error(er);parser.error=er;emit(parser,"onerror",er);return parser}function end(parser){if(parser.sawRoot&&!parser.closedRoot)strictFail(parser,"Unclosed root tag");if(parser.state!==S.BEGIN&&parser.state!==S.BEGIN_WHITESPACE&&parser.state!==S.TEXT){error(parser,"Unexpected end")}closeText(parser);parser.c="";parser.closed=true;emit(parser,"onend");SAXParser.call(parser,parser.strict,parser.opt);return parser}function strictFail(parser,message){if(typeof parser!=="object"||!(parser instanceof SAXParser)){throw new Error("bad call to strictFail")}if(parser.strict){error(parser,message)}}function newTag(parser){if(!parser.strict)parser.tagName=parser.tagName[parser.looseCase]();var parent=parser.tags[parser.tags.length-1]||parser;var tag=parser.tag={name:parser.tagName,attributes:{}};if(parser.opt.xmlns){tag.ns=parent.ns}parser.attribList.length=0;emitNode(parser,"onopentagstart",tag)}function qname(name,attribute){var i=name.indexOf(":");var qualName=i<0?["",name]:name.split(":");var prefix=qualName[0];var local=qualName[1];if(attribute&&name==="xmlns"){prefix="xmlns";local=""}return{prefix:prefix,local:local}}function attrib(parser){if(!parser.strict){parser.attribName=parser.attribName[parser.looseCase]()}if(parser.attribList.indexOf(parser.attribName)!==-1||parser.tag.attributes.hasOwnProperty(parser.attribName)){parser.attribName=parser.attribValue="";return}if(parser.opt.xmlns){var qn=qname(parser.attribName,true);var prefix=qn.prefix;var local=qn.local;if(prefix==="xmlns"){if(local==="xml"&&parser.attribValue!==XML_NAMESPACE){strictFail(parser,"xml: prefix must be bound to "+XML_NAMESPACE+"\n"+"Actual: "+parser.attribValue)}else if(local==="xmlns"&&parser.attribValue!==XMLNS_NAMESPACE){strictFail(parser,"xmlns: prefix must be bound to "+XMLNS_NAMESPACE+"\n"+"Actual: "+parser.attribValue)}else{var tag=parser.tag;var parent=parser.tags[parser.tags.length-1]||parser;if(tag.ns===parent.ns){tag.ns=Object.create(parent.ns)}tag.ns[local]=parser.attribValue}}parser.attribList.push([parser.attribName,parser.attribValue])}else{parser.tag.attributes[parser.attribName]=parser.attribValue;emitNode(parser,"onattribute",{name:parser.attribName,value:parser.attribValue})}parser.attribName=parser.attribValue=""}function openTag(parser,selfClosing){if(parser.opt.xmlns){var tag=parser.tag;var qn=qname(parser.tagName);tag.prefix=qn.prefix;tag.local=qn.local;tag.uri=tag.ns[qn.prefix]||"";if(tag.prefix&&!tag.uri){strictFail(parser,"Unbound namespace prefix: "+JSON.stringify(parser.tagName));tag.uri=qn.prefix}var parent=parser.tags[parser.tags.length-1]||parser;if(tag.ns&&parent.ns!==tag.ns){Object.keys(tag.ns).forEach((function(p){emitNode(parser,"onopennamespace",{prefix:p,uri:tag.ns[p]})}))}for(var i=0,l=parser.attribList.length;i<l;i++){var nv=parser.attribList[i];var name=nv[0];var value=nv[1];var qualName=qname(name,true);var prefix=qualName.prefix;var local=qualName.local;var uri=prefix===""?"":tag.ns[prefix]||"";var a={name:name,value:value,prefix:prefix,local:local,uri:uri};if(prefix&&prefix!=="xmlns"&&!uri){strictFail(parser,"Unbound namespace prefix: "+JSON.stringify(prefix));a.uri=prefix}parser.tag.attributes[name]=a;emitNode(parser,"onattribute",a)}parser.attribList.length=0}parser.tag.isSelfClosing=!!selfClosing;parser.sawRoot=true;parser.tags.push(parser.tag);emitNode(parser,"onopentag",parser.tag);if(!selfClosing){if(!parser.noscript&&parser.tagName.toLowerCase()==="script"){parser.state=S.SCRIPT}else{parser.state=S.TEXT}parser.tag=null;parser.tagName=""}parser.attribName=parser.attribValue="";parser.attribList.length=0}function closeTag(parser){if(!parser.tagName){strictFail(parser,"Weird empty close tag.");parser.textNode+="</>";parser.state=S.TEXT;return}if(parser.script){if(parser.tagName!=="script"){parser.script+="</"+parser.tagName+">";parser.tagName="";parser.state=S.SCRIPT;return}emitNode(parser,"onscript",parser.script);parser.script=""}var t=parser.tags.length;var tagName=parser.tagName;if(!parser.strict){tagName=tagName[parser.looseCase]()}var closeTo=tagName;while(t--){var close=parser.tags[t];if(close.name!==closeTo){strictFail(parser,"Unexpected close tag")}else{break}}if(t<0){strictFail(parser,"Unmatched closing tag: "+parser.tagName);parser.textNode+="</"+parser.tagName+">";parser.state=S.TEXT;return}parser.tagName=tagName;var s=parser.tags.length;while(s-- >t){var tag=parser.tag=parser.tags.pop();parser.tagName=parser.tag.name;emitNode(parser,"onclosetag",parser.tagName);var x={};for(var i in tag.ns){x[i]=tag.ns[i]}var parent=parser.tags[parser.tags.length-1]||parser;if(parser.opt.xmlns&&tag.ns!==parent.ns){Object.keys(tag.ns).forEach((function(p){var n=tag.ns[p];emitNode(parser,"onclosenamespace",{prefix:p,uri:n})}))}}if(t===0)parser.closedRoot=true;parser.tagName=parser.attribValue=parser.attribName="";parser.attribList.length=0;parser.state=S.TEXT}function parseEntity(parser){var entity=parser.entity;var entityLC=entity.toLowerCase();var num;var numStr="";if(parser.ENTITIES[entity]){return parser.ENTITIES[entity]}if(parser.ENTITIES[entityLC]){return parser.ENTITIES[entityLC]}entity=entityLC;if(entity.charAt(0)==="#"){if(entity.charAt(1)==="x"){entity=entity.slice(2);num=parseInt(entity,16);numStr=num.toString(16)}else{entity=entity.slice(1);num=parseInt(entity,10);numStr=num.toString(10)}}entity=entity.replace(/^0+/,"");if(isNaN(num)||numStr.toLowerCase()!==entity){strictFail(parser,"Invalid character entity");return"&"+parser.entity+";"}return String.fromCodePoint(num)}function beginWhiteSpace(parser,c){if(c==="<"){parser.state=S.OPEN_WAKA;parser.startTagPosition=parser.position}else if(!isWhitespace(c)){strictFail(parser,"Non-whitespace before first tag.");parser.textNode=c;parser.state=S.TEXT}}function charAt(chunk,i){var result="";if(i<chunk.length){result=chunk.charAt(i)}return result}function write(chunk){var parser=this;if(this.error){throw this.error}if(parser.closed){return error(parser,"Cannot write after close. Assign an onready handler.")}if(chunk===null){return end(parser)}if(typeof chunk==="object"){chunk=chunk.toString()}var i=0;var c="";while(true){c=charAt(chunk,i++);parser.c=c;if(!c){break}if(parser.trackPosition){parser.position++;if(c==="\n"){parser.line++;parser.column=0}else{parser.column++}}switch(parser.state){case S.BEGIN:parser.state=S.BEGIN_WHITESPACE;if(c==="\ufeff"){continue}beginWhiteSpace(parser,c);continue;case S.BEGIN_WHITESPACE:beginWhiteSpace(parser,c);continue;case S.TEXT:if(parser.sawRoot&&!parser.closedRoot){var starti=i-1;while(c&&c!=="<"&&c!=="&"){c=charAt(chunk,i++);if(c&&parser.trackPosition){parser.position++;if(c==="\n"){parser.line++;parser.column=0}else{parser.column++}}}parser.textNode+=chunk.substring(starti,i-1)}if(c==="<"&&!(parser.sawRoot&&parser.closedRoot&&!parser.strict)){parser.state=S.OPEN_WAKA;parser.startTagPosition=parser.position}else{if(!isWhitespace(c)&&(!parser.sawRoot||parser.closedRoot)){strictFail(parser,"Text data outside of root node.")}if(c==="&"){parser.state=S.TEXT_ENTITY}else{parser.textNode+=c}}continue;case S.SCRIPT:if(c==="<"){parser.state=S.SCRIPT_ENDING}else{parser.script+=c}continue;case S.SCRIPT_ENDING:if(c==="/"){parser.state=S.CLOSE_TAG}else{parser.script+="<"+c;parser.state=S.SCRIPT}continue;case S.OPEN_WAKA:if(c==="!"){parser.state=S.SGML_DECL;parser.sgmlDecl=""}else if(isWhitespace(c));else if(isMatch(nameStart,c)){parser.state=S.OPEN_TAG;parser.tagName=c}else if(c==="/"){parser.state=S.CLOSE_TAG;parser.tagName=""}else if(c==="?"){parser.state=S.PROC_INST;parser.procInstName=parser.procInstBody=""}else{strictFail(parser,"Unencoded <");if(parser.startTagPosition+1<parser.position){var pad=parser.position-parser.startTagPosition;c=new Array(pad).join(" ")+c}parser.textNode+="<"+c;parser.state=S.TEXT}continue;case S.SGML_DECL:if((parser.sgmlDecl+c).toUpperCase()===CDATA){emitNode(parser,"onopencdata");parser.state=S.CDATA;parser.sgmlDecl="";parser.cdata=""}else if(parser.sgmlDecl+c==="--"){parser.state=S.COMMENT;parser.comment="";parser.sgmlDecl=""}else if((parser.sgmlDecl+c).toUpperCase()===DOCTYPE){parser.state=S.DOCTYPE;if(parser.doctype||parser.sawRoot){strictFail(parser,"Inappropriately located doctype declaration")}parser.doctype="";parser.sgmlDecl=""}else if(c===">"){emitNode(parser,"onsgmldeclaration",parser.sgmlDecl);parser.sgmlDecl="";parser.state=S.TEXT}else if(isQuote(c)){parser.state=S.SGML_DECL_QUOTED;parser.sgmlDecl+=c}else{parser.sgmlDecl+=c}continue;case S.SGML_DECL_QUOTED:if(c===parser.q){parser.state=S.SGML_DECL;parser.q=""}parser.sgmlDecl+=c;continue;case S.DOCTYPE:if(c===">"){parser.state=S.TEXT;emitNode(parser,"ondoctype",parser.doctype);parser.doctype=true}else{parser.doctype+=c;if(c==="["){parser.state=S.DOCTYPE_DTD}else if(isQuote(c)){parser.state=S.DOCTYPE_QUOTED;parser.q=c}}continue;case S.DOCTYPE_QUOTED:parser.doctype+=c;if(c===parser.q){parser.q="";parser.state=S.DOCTYPE}continue;case S.DOCTYPE_DTD:parser.doctype+=c;if(c==="]"){parser.state=S.DOCTYPE}else if(isQuote(c)){parser.state=S.DOCTYPE_DTD_QUOTED;parser.q=c}continue;case S.DOCTYPE_DTD_QUOTED:parser.doctype+=c;if(c===parser.q){parser.state=S.DOCTYPE_DTD;parser.q=""}continue;case S.COMMENT:if(c==="-"){parser.state=S.COMMENT_ENDING}else{parser.comment+=c}continue;case S.COMMENT_ENDING:if(c==="-"){parser.state=S.COMMENT_ENDED;parser.comment=textopts(parser.opt,parser.comment);if(parser.comment){emitNode(parser,"oncomment",parser.comment)}parser.comment=""}else{parser.comment+="-"+c;parser.state=S.COMMENT}continue;case S.COMMENT_ENDED:if(c!==">"){strictFail(parser,"Malformed comment");parser.comment+="--"+c;parser.state=S.COMMENT}else{parser.state=S.TEXT}continue;case S.CDATA:if(c==="]"){parser.state=S.CDATA_ENDING}else{parser.cdata+=c}continue;case S.CDATA_ENDING:if(c==="]"){parser.state=S.CDATA_ENDING_2}else{parser.cdata+="]"+c;parser.state=S.CDATA}continue;case S.CDATA_ENDING_2:if(c===">"){if(parser.cdata){emitNode(parser,"oncdata",parser.cdata)}emitNode(parser,"onclosecdata");parser.cdata="";parser.state=S.TEXT}else if(c==="]"){parser.cdata+="]"}else{parser.cdata+="]]"+c;parser.state=S.CDATA}continue;case S.PROC_INST:if(c==="?"){parser.state=S.PROC_INST_ENDING}else if(isWhitespace(c)){parser.state=S.PROC_INST_BODY}else{parser.procInstName+=c}continue;case S.PROC_INST_BODY:if(!parser.procInstBody&&isWhitespace(c)){continue}else if(c==="?"){parser.state=S.PROC_INST_ENDING}else{parser.procInstBody+=c}continue;case S.PROC_INST_ENDING:if(c===">"){emitNode(parser,"onprocessinginstruction",{name:parser.procInstName,body:parser.procInstBody});parser.procInstName=parser.procInstBody="";parser.state=S.TEXT}else{parser.procInstBody+="?"+c;parser.state=S.PROC_INST_BODY}continue;case S.OPEN_TAG:if(isMatch(nameBody,c)){parser.tagName+=c}else{newTag(parser);if(c===">"){openTag(parser)}else if(c==="/"){parser.state=S.OPEN_TAG_SLASH}else{if(!isWhitespace(c)){strictFail(parser,"Invalid character in tag name")}parser.state=S.ATTRIB}}continue;case S.OPEN_TAG_SLASH:if(c===">"){openTag(parser,true);closeTag(parser)}else{strictFail(parser,"Forward-slash in opening tag not followed by >");parser.state=S.ATTRIB}continue;case S.ATTRIB:if(isWhitespace(c)){continue}else if(c===">"){openTag(parser)}else if(c==="/"){parser.state=S.OPEN_TAG_SLASH}else if(isMatch(nameStart,c)){parser.attribName=c;parser.attribValue="";parser.state=S.ATTRIB_NAME}else{strictFail(parser,"Invalid attribute name")}continue;case S.ATTRIB_NAME:if(c==="="){parser.state=S.ATTRIB_VALUE}else if(c===">"){strictFail(parser,"Attribute without value");parser.attribValue=parser.attribName;attrib(parser);openTag(parser)}else if(isWhitespace(c)){parser.state=S.ATTRIB_NAME_SAW_WHITE}else if(isMatch(nameBody,c)){parser.attribName+=c}else{strictFail(parser,"Invalid attribute name")}continue;case S.ATTRIB_NAME_SAW_WHITE:if(c==="="){parser.state=S.ATTRIB_VALUE}else if(isWhitespace(c)){continue}else{strictFail(parser,"Attribute without value");parser.tag.attributes[parser.attribName]="";parser.attribValue="";emitNode(parser,"onattribute",{name:parser.attribName,value:""});parser.attribName="";if(c===">"){openTag(parser)}else if(isMatch(nameStart,c)){parser.attribName=c;parser.state=S.ATTRIB_NAME}else{strictFail(parser,"Invalid attribute name");parser.state=S.ATTRIB}}continue;case S.ATTRIB_VALUE:if(isWhitespace(c)){continue}else if(isQuote(c)){parser.q=c;parser.state=S.ATTRIB_VALUE_QUOTED}else{strictFail(parser,"Unquoted attribute value");parser.state=S.ATTRIB_VALUE_UNQUOTED;parser.attribValue=c}continue;case S.ATTRIB_VALUE_QUOTED:if(c!==parser.q){if(c==="&"){parser.state=S.ATTRIB_VALUE_ENTITY_Q}else{parser.attribValue+=c}continue}attrib(parser);parser.q="";parser.state=S.ATTRIB_VALUE_CLOSED;continue;case S.ATTRIB_VALUE_CLOSED:if(isWhitespace(c)){parser.state=S.ATTRIB}else if(c===">"){openTag(parser)}else if(c==="/"){parser.state=S.OPEN_TAG_SLASH}else if(isMatch(nameStart,c)){strictFail(parser,"No whitespace between attributes");parser.attribName=c;parser.attribValue="";parser.state=S.ATTRIB_NAME}else{strictFail(parser,"Invalid attribute name")}continue;case S.ATTRIB_VALUE_UNQUOTED:if(!isAttribEnd(c)){if(c==="&"){parser.state=S.ATTRIB_VALUE_ENTITY_U}else{parser.attribValue+=c}continue}attrib(parser);if(c===">"){openTag(parser)}else{parser.state=S.ATTRIB}continue;case S.CLOSE_TAG:if(!parser.tagName){if(isWhitespace(c)){continue}else if(notMatch(nameStart,c)){if(parser.script){parser.script+="</"+c;parser.state=S.SCRIPT}else{strictFail(parser,"Invalid tagname in closing tag.")}}else{parser.tagName=c}}else if(c===">"){closeTag(parser)}else if(isMatch(nameBody,c)){parser.tagName+=c}else if(parser.script){parser.script+="</"+parser.tagName;parser.tagName="";parser.state=S.SCRIPT}else{if(!isWhitespace(c)){strictFail(parser,"Invalid tagname in closing tag")}parser.state=S.CLOSE_TAG_SAW_WHITE}continue;case S.CLOSE_TAG_SAW_WHITE:if(isWhitespace(c)){continue}if(c===">"){closeTag(parser)}else{strictFail(parser,"Invalid characters in closing tag")}continue;case S.TEXT_ENTITY:case S.ATTRIB_VALUE_ENTITY_Q:case S.ATTRIB_VALUE_ENTITY_U:var returnState;var buffer;switch(parser.state){case S.TEXT_ENTITY:returnState=S.TEXT;buffer="textNode";break;case S.ATTRIB_VALUE_ENTITY_Q:returnState=S.ATTRIB_VALUE_QUOTED;buffer="attribValue";break;case S.ATTRIB_VALUE_ENTITY_U:returnState=S.ATTRIB_VALUE_UNQUOTED;buffer="attribValue";break}if(c===";"){var parsedEntity=parseEntity(parser);if(parser.state===S.TEXT_ENTITY&&!sax.ENTITIES[parser.entity]&&parsedEntity!=="&"+parser.entity+";"){chunk=chunk.slice(0,i)+parsedEntity+chunk.slice(i)}else{parser[buffer]+=parsedEntity}parser.entity="";parser.state=returnState}else if(isMatch(parser.entity.length?entityBody:entityStart,c)){parser.entity+=c}else{strictFail(parser,"Invalid character in entity name");parser[buffer]+="&"+parser.entity+c;parser.entity="";parser.state=returnState}continue;default:throw new Error(parser,"Unknown state: "+parser.state)}}if(parser.position>=parser.bufferCheckPosition){checkBufferLength(parser)}return parser}})(exports)}));const{textElems:textElems$1}=_collections;const entityDeclaration=/<!ENTITY\s+(\S+)\s+(?:'([^']+)'|"([^"]+)")\s*>/g;const config={strict:true,trim:false,normalize:false,lowercase:true,xmlns:true,position:true};var svg2js=function(data){const sax$1=sax.parser(config.strict,config);const root=new jsAPI({type:"root",children:[]});let current=root;let stack=[root];function pushToContent(node){const wrapped=new jsAPI(node,current);current.children.push(wrapped);return wrapped}sax$1.ondoctype=function(doctype){pushToContent({type:"doctype",name:"svg",data:{doctype:doctype}});const subsetStart=doctype.indexOf("[");let entityMatch;if(subsetStart>=0){entityDeclaration.lastIndex=subsetStart;while((entityMatch=entityDeclaration.exec(data))!=null){sax$1.ENTITIES[entityMatch[1]]=entityMatch[2]||entityMatch[3]}}};sax$1.onprocessinginstruction=function(data){pushToContent({type:"instruction",name:data.name,value:data.body})};sax$1.oncomment=function(comment){pushToContent({type:"comment",value:comment.trim()})};sax$1.oncdata=function(cdata){pushToContent({type:"cdata",value:cdata})};sax$1.onopentag=function(data){var element={type:"element",name:data.name,attributes:{},children:[]};for(const[name,attr]of Object.entries(data.attributes)){element.attributes[name]=attr.value}element=pushToContent(element);current=element;stack.push(element)};sax$1.ontext=function(text){if(textElems$1.includes(current.name)&&!data.prefix){pushToContent({type:"text",value:text})}else if(/\S/.test(text)){pushToContent({type:"text",value:text.trim()})}};sax$1.onclosetag=function(){stack.pop();current=stack[stack.length-1]};sax$1.onerror=function(e){e.message="Error in parsing SVG: "+e.message;if(e.message.indexOf("Unexpected end")<0){throw e}};try{sax$1.write(data).close();return root}catch(e){return{error:e.message}}};var EOL$1="\n";var os=Object.freeze({__proto__:null,EOL:EOL$1});var require$$0=getAugmentedNamespace(os);var EOL=require$$0.EOL,textElems=_collections.textElems;var defaults={doctypeStart:"<!DOCTYPE",doctypeEnd:">",procInstStart:"<?",procInstEnd:"?>",tagOpenStart:"<",tagOpenEnd:">",tagCloseStart:"</",tagCloseEnd:">",tagShortStart:"<",tagShortEnd:"/>",attrStart:'="',attrEnd:'"',commentStart:"\x3c!--",commentEnd:"--\x3e",cdataStart:"<![CDATA[",cdataEnd:"]]>",textStart:"",textEnd:"",indent:4,regEntities:/[&'"<>]/g,regValEntities:/[&"<>]/g,encodeEntity:encodeEntity,pretty:false,useShortTags:true};var entities={"&":"&amp;","'":"&apos;",'"':"&quot;",">":"&gt;","<":"&lt;"};var js2svg=function(data,config){return new JS2SVG(config).convert(data)};function JS2SVG(config){if(config){this.config=Object.assign({},defaults,config)}else{this.config=Object.assign({},defaults)}var indent=this.config.indent;if(typeof indent=="number"&&!isNaN(indent)){this.config.indent=indent<0?"\t":" ".repeat(indent)}else if(typeof indent!="string"){this.config.indent="    "}if(this.config.pretty){this.config.doctypeEnd+=EOL;this.config.procInstEnd+=EOL;this.config.commentEnd+=EOL;this.config.cdataEnd+=EOL;this.config.tagShortEnd+=EOL;this.config.tagOpenEnd+=EOL;this.config.tagCloseEnd+=EOL;this.config.textEnd+=EOL}this.indentLevel=0;this.textContext=null}function encodeEntity(char){return entities[char]}JS2SVG.prototype.convert=function(data){var svg="";this.indentLevel++;for(const item of data.children){if(item.type==="element"){svg+=this.createElem(item)}if(item.type==="text"){svg+=this.createText(item)}if(item.type==="doctype"){svg+=this.createDoctype(item)}if(item.type==="instruction"){svg+=this.createProcInst(item)}if(item.type==="comment"){svg+=this.createComment(item)}if(item.type==="cdata"){svg+=this.createCDATA(item)}}this.indentLevel--;return{data:svg,info:{width:this.width,height:this.height}}};JS2SVG.prototype.createIndent=function(){var indent="";if(this.config.pretty&&!this.textContext){indent=this.config.indent.repeat(this.indentLevel-1)}return indent};JS2SVG.prototype.createDoctype=function(node){const{doctype:doctype}=node.data;return this.config.doctypeStart+doctype+this.config.doctypeEnd};JS2SVG.prototype.createProcInst=function(node){const{name:name,value:value}=node;return this.config.procInstStart+name+" "+value+this.config.procInstEnd};JS2SVG.prototype.createComment=function(node){const{value:value}=node;return this.config.commentStart+value+this.config.commentEnd};JS2SVG.prototype.createCDATA=function(node){const{value:value}=node;return this.createIndent()+this.config.cdataStart+value+this.config.cdataEnd};JS2SVG.prototype.createElem=function(data){if(data.name==="svg"&&data.attributes.width!=null&&data.attributes.height!=null){this.width=data.attributes.width;this.height=data.attributes.height}if(data.children.length===0){if(this.config.useShortTags){return this.createIndent()+this.config.tagShortStart+data.name+this.createAttrs(data)+this.config.tagShortEnd}else{return this.createIndent()+this.config.tagShortStart+data.name+this.createAttrs(data)+this.config.tagOpenEnd+this.config.tagCloseStart+data.name+this.config.tagCloseEnd}}else{var tagOpenStart=this.config.tagOpenStart,tagOpenEnd=this.config.tagOpenEnd,tagCloseStart=this.config.tagCloseStart,tagCloseEnd=this.config.tagCloseEnd,openIndent=this.createIndent(),closeIndent=this.createIndent(),processedData="",dataEnd="";if(this.textContext){tagOpenStart=defaults.tagOpenStart;tagOpenEnd=defaults.tagOpenEnd;tagCloseStart=defaults.tagCloseStart;tagCloseEnd=defaults.tagCloseEnd;openIndent=""}else if(data.isElem(textElems)){tagOpenEnd=defaults.tagOpenEnd;tagCloseStart=defaults.tagCloseStart;closeIndent="";this.textContext=data}processedData+=this.convert(data).data;if(this.textContext==data){this.textContext=null}return openIndent+tagOpenStart+data.name+this.createAttrs(data)+tagOpenEnd+processedData+dataEnd+closeIndent+tagCloseStart+data.name+tagCloseEnd}};JS2SVG.prototype.createAttrs=function(element){let attrs="";for(const[name,value]of Object.entries(element.attributes)){if(value!==undefined){const encodedValue=value.toString().replace(this.config.regValEntities,this.config.encodeEntity);attrs+=" "+name+this.config.attrStart+encodedValue+this.config.attrEnd}else{attrs+=" "+name}}return attrs};JS2SVG.prototype.createText=function(node){const{value:value}=node;return this.createIndent()+this.config.textStart+value.replace(this.config.regEntities,this.config.encodeEntity)+(this.textContext?"":this.config.textEnd)};const{visit:visit}=xast;var plugins=function(data,info,plugins){const groups=[];let prev;for(const plugin of plugins){if(prev&&plugin.type==prev[0].type){prev.push(plugin)}else{prev=[plugin];groups.push(prev)}}for(const group of groups){switch(group[0].type){case"perItem":data=perItem(data,info,group);break;case"perItemReverse":data=perItem(data,info,group,true);break;case"full":data=full(data,info,group);break;case"visitor":for(const plugin of group){if(plugin.active){const visitor=plugin.fn(data,plugin.params,info);visit(data,visitor)}}break}}return data};function perItem(data,info,plugins,reverse){function monkeys(items){items.children=items.children.filter((function(item){if(reverse&&item.children){monkeys(item)}var filter=true;for(var i=0;filter&&i<plugins.length;i++){var plugin=plugins[i];if(plugin.active&&plugin.fn(item,plugin.params,info)===false){filter=false}}if(!reverse&&item.children){monkeys(item)}return filter}));return items}return monkeys(data)}function full(data,info,plugins){plugins.forEach((function(plugin){if(plugin.active){data=plugin.fn(data,plugin.params,info)}}));return data}const{defaultPlugins:defaultPlugins,resolvePluginConfig:resolvePluginConfig,extendDefaultPlugins:extendDefaultPlugins}=config$1;const{encodeSVGDatauri:encodeSVGDatauri}=tools;var extendDefaultPlugins_1=extendDefaultPlugins;const optimize=(input,config)=>{if(config==null){config={}}if(typeof config!=="object"){throw Error("Config should be an object")}const maxPassCount=config.multipass?10:1;let prevResultSize=Number.POSITIVE_INFINITY;let svgjs=null;const info={};if(config.path!=null){info.path=config.path}for(let i=0;i<maxPassCount;i+=1){info.multipassCount=i;svgjs=svg2js(input);if(svgjs.error!=null){if(config.path!=null){svgjs.path=config.path}return svgjs}const plugins$1=config.plugins||defaultPlugins;if(Array.isArray(plugins$1)===false){throw Error("Invalid plugins list. Provided 'plugins' in config should be an array.")}const resolvedPlugins=plugins$1.map((plugin=>resolvePluginConfig(plugin,config)));svgjs=plugins(svgjs,info,resolvedPlugins);svgjs=js2svg(svgjs,config.js2svg);if(svgjs.error){throw Error(svgjs.error)}if(svgjs.data.length<prevResultSize){input=svgjs.data;prevResultSize=svgjs.data.length}else{if(config.datauri){svgjs.data=encodeSVGDatauri(svgjs.data,config.datauri)}if(config.path!=null){svgjs.path=config.path}return svgjs}}return svgjs};var optimize_1=optimize;const createContentItem=data=>new jsAPI(data);var createContentItem_1=createContentItem;var svgo={extendDefaultPlugins:extendDefaultPlugins_1,optimize:optimize_1,createContentItem:createContentItem_1};export default svgo;export{createContentItem_1 as createContentItem,extendDefaultPlugins_1 as extendDefaultPlugins,optimize_1 as optimize};
diff --git a/node_modules/svgo/lib/css-tools.js b/node_modules/svgo/lib/css-tools.js
new file mode 100644
index 0000000..a59aae6
--- /dev/null
+++ b/node_modules/svgo/lib/css-tools.js
@@ -0,0 +1,239 @@
+'use strict';
+
+var csstree = require('css-tree'),
+  List = csstree.List,
+  stable = require('stable'),
+  specificity = require('csso/lib/restructure/prepare/specificity');
+
+/**
+ * Flatten a CSS AST to a selectors list.
+ *
+ * @param {import('css-tree').CssNode} cssAst css-tree AST to flatten
+ * @return {Array} selectors
+ */
+function flattenToSelectors(cssAst) {
+  var selectors = [];
+
+  csstree.walk(cssAst, {
+    visit: 'Rule',
+    enter: function (node) {
+      if (node.type !== 'Rule') {
+        return;
+      }
+
+      var atrule = this.atrule;
+      var rule = node;
+
+      node.prelude.children.each(function (selectorNode, selectorItem) {
+        var selector = {
+          item: selectorItem,
+          atrule: atrule,
+          rule: rule,
+          pseudos: /** @type {{item: any; list: any[]}[]} */ ([]),
+        };
+
+        selectorNode.children.each(function (
+          selectorChildNode,
+          selectorChildItem,
+          selectorChildList
+        ) {
+          if (
+            selectorChildNode.type === 'PseudoClassSelector' ||
+            selectorChildNode.type === 'PseudoElementSelector'
+          ) {
+            selector.pseudos.push({
+              item: selectorChildItem,
+              list: selectorChildList,
+            });
+          }
+        });
+
+        selectors.push(selector);
+      });
+    },
+  });
+
+  return selectors;
+}
+
+/**
+ * Filter selectors by Media Query.
+ *
+ * @param {Array} selectors to filter
+ * @param {Array} useMqs Array with strings of media queries that should pass (<name> <expression>)
+ * @return {Array} Filtered selectors that match the passed media queries
+ */
+function filterByMqs(selectors, useMqs) {
+  return selectors.filter(function (selector) {
+    if (selector.atrule === null) {
+      return ~useMqs.indexOf('');
+    }
+
+    var mqName = selector.atrule.name;
+    var mqStr = mqName;
+    if (
+      selector.atrule.expression &&
+      selector.atrule.expression.children.first().type === 'MediaQueryList'
+    ) {
+      var mqExpr = csstree.generate(selector.atrule.expression);
+      mqStr = [mqName, mqExpr].join(' ');
+    }
+
+    return ~useMqs.indexOf(mqStr);
+  });
+}
+
+/**
+ * Filter selectors by the pseudo-elements and/or -classes they contain.
+ *
+ * @param {Array} selectors to filter
+ * @param {Array} usePseudos Array with strings of single or sequence of pseudo-elements and/or -classes that should pass
+ * @return {Array} Filtered selectors that match the passed pseudo-elements and/or -classes
+ */
+function filterByPseudos(selectors, usePseudos) {
+  return selectors.filter(function (selector) {
+    var pseudoSelectorsStr = csstree.generate({
+      type: 'Selector',
+      children: new List().fromArray(
+        selector.pseudos.map(function (pseudo) {
+          return pseudo.item.data;
+        })
+      ),
+    });
+    return ~usePseudos.indexOf(pseudoSelectorsStr);
+  });
+}
+
+/**
+ * Remove pseudo-elements and/or -classes from the selectors for proper matching.
+ *
+ * @param {Array} selectors to clean
+ * @return {void}
+ */
+function cleanPseudos(selectors) {
+  selectors.forEach(function (selector) {
+    selector.pseudos.forEach(function (pseudo) {
+      pseudo.list.remove(pseudo.item);
+    });
+  });
+}
+
+/**
+ * Compares two selector specificities.
+ * extracted from https://github.com/keeganstreet/specificity/blob/master/specificity.js#L211
+ *
+ * @param {Array} aSpecificity Specificity of selector A
+ * @param {Array} bSpecificity Specificity of selector B
+ * @return {number} Score of selector specificity A compared to selector specificity B
+ */
+function compareSpecificity(aSpecificity, bSpecificity) {
+  for (var i = 0; i < 4; i += 1) {
+    if (aSpecificity[i] < bSpecificity[i]) {
+      return -1;
+    } else if (aSpecificity[i] > bSpecificity[i]) {
+      return 1;
+    }
+  }
+
+  return 0;
+}
+
+/**
+ * Compare two simple selectors.
+ *
+ * @param {Object} aSimpleSelectorNode Simple selector A
+ * @param {Object} bSimpleSelectorNode Simple selector B
+ * @return {number} Score of selector A compared to selector B
+ */
+function compareSimpleSelectorNode(aSimpleSelectorNode, bSimpleSelectorNode) {
+  var aSpecificity = specificity(aSimpleSelectorNode),
+    bSpecificity = specificity(bSimpleSelectorNode);
+  return compareSpecificity(aSpecificity, bSpecificity);
+}
+
+function _bySelectorSpecificity(selectorA, selectorB) {
+  return compareSimpleSelectorNode(selectorA.item.data, selectorB.item.data);
+}
+
+/**
+ * Sort selectors stably by their specificity.
+ *
+ * @param {Array} selectors to be sorted
+ * @return {Array} Stable sorted selectors
+ */
+function sortSelectors(selectors) {
+  return stable(selectors, _bySelectorSpecificity);
+}
+
+/**
+ * Convert a css-tree AST style declaration to CSSStyleDeclaration property.
+ *
+ * @param {import('css-tree').CssNode} declaration css-tree style declaration
+ * @return {Object} CSSStyleDeclaration property
+ */
+function csstreeToStyleDeclaration(declaration) {
+  var propertyName = declaration.property,
+    propertyValue = csstree.generate(declaration.value),
+    propertyPriority = declaration.important ? 'important' : '';
+  return {
+    name: propertyName,
+    value: propertyValue,
+    priority: propertyPriority,
+  };
+}
+
+/**
+ * Gets the CSS string of a style element
+ *
+ * @param {Object} elem style element
+ * @return {string} CSS string or empty array if no styles are set
+ */
+function getCssStr(elem) {
+  if (
+    elem.children.length > 0 &&
+    (elem.children[0].type === 'text' || elem.children[0].type === 'cdata')
+  ) {
+    return elem.children[0].value;
+  }
+  return '';
+}
+
+/**
+ * Sets the CSS string of a style element
+ *
+ * @param {Object} elem style element
+ * @param {string} css string to be set
+ * @return {string} reference to field with CSS
+ */
+function setCssStr(elem, css) {
+  if (elem.children.length === 0) {
+    elem.children.push({
+      type: 'text',
+      value: '',
+    });
+  }
+
+  if (elem.children[0].type !== 'text' && elem.children[0].type !== 'cdata') {
+    return css;
+  }
+
+  elem.children[0].value = css;
+
+  return css;
+}
+
+module.exports.flattenToSelectors = flattenToSelectors;
+
+module.exports.filterByMqs = filterByMqs;
+module.exports.filterByPseudos = filterByPseudos;
+module.exports.cleanPseudos = cleanPseudos;
+
+module.exports.compareSpecificity = compareSpecificity;
+module.exports.compareSimpleSelectorNode = compareSimpleSelectorNode;
+
+module.exports.sortSelectors = sortSelectors;
+
+module.exports.csstreeToStyleDeclaration = csstreeToStyleDeclaration;
+
+module.exports.getCssStr = getCssStr;
+module.exports.setCssStr = setCssStr;
diff --git a/node_modules/svgo/lib/path.js b/node_modules/svgo/lib/path.js
new file mode 100644
index 0000000..f8d4822
--- /dev/null
+++ b/node_modules/svgo/lib/path.js
@@ -0,0 +1,356 @@
+'use strict';
+
+// Based on https://www.w3.org/TR/SVG11/paths.html#PathDataBNF
+
+const argsCountPerCommand = {
+  M: 2,
+  m: 2,
+  Z: 0,
+  z: 0,
+  L: 2,
+  l: 2,
+  H: 1,
+  h: 1,
+  V: 1,
+  v: 1,
+  C: 6,
+  c: 6,
+  S: 4,
+  s: 4,
+  Q: 4,
+  q: 4,
+  T: 2,
+  t: 2,
+  A: 7,
+  a: 7,
+};
+
+/**
+ * @param {string} c
+ */
+const isCommand = (c) => {
+  return c in argsCountPerCommand;
+};
+
+/**
+ * @param {string} c
+ */
+const isWsp = (c) => {
+  const codePoint = c.codePointAt(0);
+  return (
+    codePoint === 0x20 ||
+    codePoint === 0x9 ||
+    codePoint === 0xd ||
+    codePoint === 0xa
+  );
+};
+
+/**
+ * @param {string} c
+ */
+const isDigit = (c) => {
+  const codePoint = c.codePointAt(0);
+  if (codePoint == null) {
+    return false;
+  }
+  return 48 <= codePoint && codePoint <= 57;
+};
+
+/**
+ * @typedef {'none' | 'sign' | 'whole' | 'decimal_point' | 'decimal' | 'e' | 'exponent_sign' | 'exponent'} ReadNumberState
+ */
+
+/**
+ * @param {string} string
+ * @param {number} cursor
+ * @return {[number, number | null]}
+ */
+const readNumber = (string, cursor) => {
+  let i = cursor;
+  let value = '';
+  let state = /** @type {ReadNumberState} */ ('none');
+  for (; i < string.length; i += 1) {
+    const c = string[i];
+    if (c === '+' || c === '-') {
+      if (state === 'none') {
+        state = 'sign';
+        value += c;
+        continue;
+      }
+      if (state === 'e') {
+        state = 'exponent_sign';
+        value += c;
+        continue;
+      }
+    }
+    if (isDigit(c)) {
+      if (state === 'none' || state === 'sign' || state === 'whole') {
+        state = 'whole';
+        value += c;
+        continue;
+      }
+      if (state === 'decimal_point' || state === 'decimal') {
+        state = 'decimal';
+        value += c;
+        continue;
+      }
+      if (state === 'e' || state === 'exponent_sign' || state === 'exponent') {
+        state = 'exponent';
+        value += c;
+        continue;
+      }
+    }
+    if (c === '.') {
+      if (state === 'none' || state === 'sign' || state === 'whole') {
+        state = 'decimal_point';
+        value += c;
+        continue;
+      }
+    }
+    if (c === 'E' || c == 'e') {
+      if (
+        state === 'whole' ||
+        state === 'decimal_point' ||
+        state === 'decimal'
+      ) {
+        state = 'e';
+        value += c;
+        continue;
+      }
+    }
+    break;
+  }
+  const number = Number.parseFloat(value);
+  if (Number.isNaN(number)) {
+    return [cursor, null];
+  } else {
+    // step back to delegate iteration to parent loop
+    return [i - 1, number];
+  }
+};
+
+/**
+ * @param {string} string
+ */
+const parsePathData = (string) => {
+  const pathData = [];
+  let command = null;
+  let args = /** @type {number[]} */ ([]);
+  let argsCount = 0;
+  let canHaveComma = false;
+  let hadComma = false;
+  for (let i = 0; i < string.length; i += 1) {
+    const c = string.charAt(i);
+    if (isWsp(c)) {
+      continue;
+    }
+    // allow comma only between arguments
+    if (canHaveComma && c === ',') {
+      if (hadComma) {
+        break;
+      }
+      hadComma = true;
+      continue;
+    }
+    if (isCommand(c)) {
+      if (hadComma) {
+        return pathData;
+      }
+      if (command == null) {
+        // moveto should be leading command
+        if (c !== 'M' && c !== 'm') {
+          return pathData;
+        }
+      } else {
+        // stop if previous command arguments are not flushed
+        if (args.length !== 0) {
+          return pathData;
+        }
+      }
+      command = c;
+      args = [];
+      argsCount = argsCountPerCommand[command];
+      canHaveComma = false;
+      // flush command without arguments
+      if (argsCount === 0) {
+        pathData.push({ command, args });
+      }
+      continue;
+    }
+    // avoid parsing arguments if no command detected
+    if (command == null) {
+      return pathData;
+    }
+    // read next argument
+    let newCursor = i;
+    let number = null;
+    if (command === 'A' || command === 'a') {
+      const position = args.length;
+      if (position === 0 || position === 1) {
+        // allow only positive number without sign as first two arguments
+        if (c !== '+' && c !== '-') {
+          [newCursor, number] = readNumber(string, i);
+        }
+      }
+      if (position === 2 || position === 5 || position === 6) {
+        [newCursor, number] = readNumber(string, i);
+      }
+      if (position === 3 || position === 4) {
+        // read flags
+        if (c === '0') {
+          number = 0;
+        }
+        if (c === '1') {
+          number = 1;
+        }
+      }
+    } else {
+      [newCursor, number] = readNumber(string, i);
+    }
+    if (number == null) {
+      return pathData;
+    }
+    args.push(number);
+    canHaveComma = true;
+    hadComma = false;
+    i = newCursor;
+    // flush arguments when necessary count is reached
+    if (args.length === argsCount) {
+      pathData.push({ command, args });
+      // subsequent moveto coordinates are threated as implicit lineto commands
+      if (command === 'M') {
+        command = 'L';
+      }
+      if (command === 'm') {
+        command = 'l';
+      }
+      args = [];
+    }
+  }
+  return pathData;
+};
+exports.parsePathData = parsePathData;
+
+/**
+ * @typedef {{
+ *   number: number;
+ *   precision?: number;
+ * }} StringifyNumberOptions
+ */
+/**
+ * @param {StringifyNumberOptions} param
+ */
+const stringifyNumber = ({ number, precision }) => {
+  if (precision != null) {
+    const ratio = 10 ** precision;
+    number = Math.round(number * ratio) / ratio;
+  }
+  // remove zero whole from decimal number
+  return number.toString().replace(/^0\./, '.').replace(/^-0\./, '-.');
+};
+
+/**
+ * @typedef {{
+ *   command: string;
+ *   args: number[];
+ *   precision?: number;
+ *   disableSpaceAfterFlags?: boolean;
+ * }} StringifyArgsOptions
+ */
+/**
+ *
+ * Elliptical arc large-arc and sweep flags are rendered with spaces
+ * because many non-browser environments are not able to parse such paths
+ *
+ * @param {StringifyArgsOptions} param
+ */
+const stringifyArgs = ({
+  command,
+  args,
+  precision,
+  disableSpaceAfterFlags,
+}) => {
+  let result = '';
+  let prev = '';
+  for (let i = 0; i < args.length; i += 1) {
+    const number = args[i];
+    const numberString = stringifyNumber({ number, precision });
+    if (
+      disableSpaceAfterFlags &&
+      (command === 'A' || command === 'a') &&
+      (i === 4 || i === 5)
+    ) {
+      result += numberString;
+    } else if (i === 0 || numberString.startsWith('-')) {
+      // avoid space before first and negative numbers
+      result += numberString;
+    } else if (prev.includes('.') && numberString.startsWith('.')) {
+      // remove space before decimal with zero whole
+      // only when previous number is also decimal
+      result += numberString;
+    } else {
+      result += ` ${numberString}`;
+    }
+    prev = numberString;
+  }
+  return result;
+};
+
+/**
+ *
+ * @typedef {{
+ *   command: string;
+ *   args: number[];
+ * }} Command
+ */
+/**
+ * @typedef {{
+ *   pathData: Command[];
+ *   precision?: number;
+ *   disableSpaceAfterFlags?: boolean;
+ * }} StringifyPathDataOptions
+ */
+/**
+ * @param {StringifyPathDataOptions} param
+ */
+const stringifyPathData = ({ pathData, precision, disableSpaceAfterFlags }) => {
+  // combine sequence of the same commands
+  let combined = [];
+  for (let i = 0; i < pathData.length; i += 1) {
+    const { command, args } = pathData[i];
+    if (i === 0) {
+      combined.push({ command, args });
+    } else {
+      const last = combined[combined.length - 1];
+      // match leading moveto with following lineto
+      if (i === 1) {
+        if (command === 'L') {
+          last.command = 'M';
+        }
+        if (command === 'l') {
+          last.command = 'm';
+        }
+      }
+      if (
+        (last.command === command &&
+          last.command !== 'M' &&
+          last.command !== 'm') ||
+        // combine matching moveto and lineto sequences
+        (last.command === 'M' && command === 'L') ||
+        (last.command === 'm' && command === 'l')
+      ) {
+        last.args = [...last.args, ...args];
+      } else {
+        combined.push({ command, args });
+      }
+    }
+  }
+  let result = '';
+  for (const { command, args } of combined) {
+    result +=
+      command +
+      stringifyArgs({ command, args, precision, disableSpaceAfterFlags });
+  }
+  return result;
+};
+exports.stringifyPathData = stringifyPathData;
diff --git a/node_modules/svgo/lib/path.test.js b/node_modules/svgo/lib/path.test.js
new file mode 100644
index 0000000..879b8f9
--- /dev/null
+++ b/node_modules/svgo/lib/path.test.js
@@ -0,0 +1,183 @@
+'use strict';
+
+const { expect } = require('chai');
+const { parsePathData, stringifyPathData } = require('./path.js');
+
+describe('parse path data', () => {
+  it('should allow spaces between commands', () => {
+    expect(parsePathData('M0 10 L \n\r\t20 30')).to.deep.equal([
+      { command: 'M', args: [0, 10] },
+      { command: 'L', args: [20, 30] },
+    ]);
+  });
+  it('should allow spaces and commas between arguments', () => {
+    expect(parsePathData('M0 , 10 L 20 \n\r\t30,40,50')).to.deep.equal([
+      { command: 'M', args: [0, 10] },
+      { command: 'L', args: [20, 30] },
+      { command: 'L', args: [40, 50] },
+    ]);
+  });
+  it('should forbid commas before commands', () => {
+    expect(parsePathData(', M0 10')).to.deep.equal([]);
+  });
+  it('should forbid commas between commands', () => {
+    expect(parsePathData('M0,10 , L 20,30')).to.deep.equal([
+      { command: 'M', args: [0, 10] },
+    ]);
+  });
+  it('should forbid commas between command name and argument', () => {
+    expect(parsePathData('M0,10 L,20,30')).to.deep.equal([
+      { command: 'M', args: [0, 10] },
+    ]);
+  });
+  it('should forbid multipe commas in a row', () => {
+    expect(parsePathData('M0 , , 10')).to.deep.equal([]);
+  });
+  it('should stop when unknown char appears', () => {
+    expect(parsePathData('M0 10 , L 20 #40')).to.deep.equal([
+      { command: 'M', args: [0, 10] },
+    ]);
+  });
+  it('should stop when not enough arguments', () => {
+    expect(parsePathData('M0 10 L 20 L 30 40')).to.deep.equal([
+      { command: 'M', args: [0, 10] },
+    ]);
+  });
+  it('should stop if moveto not the first command', () => {
+    expect(parsePathData('L 10 20')).to.deep.equal([]);
+    expect(parsePathData('10 20')).to.deep.equal([]);
+  });
+  it('should stop on invalid scientific notation', () => {
+    expect(parsePathData('M 0 5e++1 L 0 0')).to.deep.equal([
+      { command: 'M', args: [0, 5] },
+    ]);
+  });
+  it('should stop on invalid numbers', () => {
+    expect(parsePathData('M ...')).to.deep.equal([]);
+  });
+  it('should handle arcs', () => {
+    expect(
+      parsePathData(
+        `
+          M600,350
+          l 50,-25
+          a25,25 -30 0,1 50,-25
+          25,50 -30 0,1 50,-25
+          25,75 -30 01.2,-25
+          a25,100 -30 0150,-25
+          l 50,-25
+        `
+      )
+    ).to.deep.equal([
+      { command: 'M', args: [600, 350] },
+      { command: 'l', args: [50, -25] },
+      { command: 'a', args: [25, 25, -30, 0, 1, 50, -25] },
+      { command: 'a', args: [25, 50, -30, 0, 1, 50, -25] },
+      { command: 'a', args: [25, 75, -30, 0, 1, 0.2, -25] },
+      { command: 'a', args: [25, 100, -30, 0, 1, 50, -25] },
+      { command: 'l', args: [50, -25] },
+    ]);
+  });
+});
+
+describe('stringify path data', () => {
+  it('should combine sequence of the same commands', () => {
+    expect(
+      stringifyPathData({
+        pathData: [
+          { command: 'M', args: [0, 0] },
+          { command: 'h', args: [10] },
+          { command: 'h', args: [20] },
+          { command: 'h', args: [30] },
+          { command: 'H', args: [40] },
+          { command: 'H', args: [50] },
+        ],
+      })
+    ).to.equal('M0 0h10 20 30H40 50');
+  });
+  it('should not combine sequence of moveto', () => {
+    expect(
+      stringifyPathData({
+        pathData: [
+          { command: 'M', args: [0, 0] },
+          { command: 'M', args: [10, 10] },
+          { command: 'm', args: [20, 30] },
+          { command: 'm', args: [40, 50] },
+        ],
+      })
+    ).to.equal('M0 0M10 10m20 30m40 50');
+  });
+  it('should combine moveto and sequence of lineto', () => {
+    expect(
+      stringifyPathData({
+        pathData: [
+          { command: 'M', args: [0, 0] },
+          { command: 'l', args: [10, 10] },
+          { command: 'M', args: [0, 0] },
+          { command: 'l', args: [10, 10] },
+          { command: 'M', args: [0, 0] },
+          { command: 'L', args: [10, 10] },
+        ],
+      })
+    ).to.equal('m0 0 10 10M0 0l10 10M0 0 10 10');
+    expect(
+      stringifyPathData({
+        pathData: [
+          { command: 'm', args: [0, 0] },
+          { command: 'L', args: [10, 10] },
+        ],
+      })
+    ).to.equal('M0 0 10 10');
+  });
+  it('should avoid space before first, negative and decimals', () => {
+    expect(
+      stringifyPathData({
+        pathData: [
+          { command: 'M', args: [0, -1.2] },
+          { command: 'L', args: [0.3, 4] },
+          { command: 'L', args: [5, -0.6] },
+          { command: 'L', args: [7, 0.8] },
+        ],
+      })
+    ).to.equal('M0-1.2.3 4 5-.6 7 .8');
+  });
+  it('should configure precision', () => {
+    const pathData = [
+      { command: 'M', args: [0, -1.9876] },
+      { command: 'L', args: [0.3, 3.14159265] },
+      { command: 'L', args: [-0.3, -3.14159265] },
+      { command: 'L', args: [100, 200] },
+    ];
+    expect(
+      stringifyPathData({
+        pathData,
+        precision: 3,
+      })
+    ).to.equal('M0-1.988.3 3.142-.3-3.142 100 200');
+    expect(
+      stringifyPathData({
+        pathData,
+        precision: 0,
+      })
+    ).to.equal('M0-2 0 3 0-3 100 200');
+  });
+  it('allows to avoid spaces after arc flags', () => {
+    const pathData = [
+      { command: 'M', args: [0, 0] },
+      { command: 'A', args: [50, 50, 10, 1, 0, 0.2, 20] },
+      { command: 'a', args: [50, 50, 10, 1, 0, 0.2, 20] },
+    ];
+    expect(
+      stringifyPathData({
+        pathData,
+        disableSpaceAfterFlags: false,
+      })
+    ).to.equal('M0 0A50 50 10 1 0 .2 20a50 50 10 1 0 .2 20');
+    expect(
+      stringifyPathData({
+        pathData,
+        disableSpaceAfterFlags: true,
+      })
+    ).to.equal('M0 0A50 50 10 10.2 20a50 50 10 10.2 20');
+  });
+});
diff --git a/node_modules/svgo/lib/style.js b/node_modules/svgo/lib/style.js
new file mode 100644
index 0000000..ef4dad0
--- /dev/null
+++ b/node_modules/svgo/lib/style.js
@@ -0,0 +1,187 @@
+'use strict';
+
+const stable = require('stable');
+const csstree = require('css-tree');
+const specificity = require('csso/lib/restructure/prepare/specificity');
+const { selectAll, is } = require('css-select');
+const svgoCssSelectAdapter = require('./svgo/css-select-adapter.js');
+const { compareSpecificity } = require('./css-tools.js');
+const {
+  attrsGroups,
+  inheritableAttrs,
+  presentationNonInheritableGroupAttrs,
+} = require('../plugins/_collections.js');
+
+const cssSelectOptions = {
+  xmlMode: true,
+  adapter: svgoCssSelectAdapter,
+};
+
+const parseRule = (ruleNode, dynamic) => {
+  let selectors;
+  let selectorsSpecificity;
+  const declarations = [];
+  csstree.walk(ruleNode, (cssNode) => {
+    if (cssNode.type === 'SelectorList') {
+      // compute specificity from original node to consider pseudo classes
+      selectorsSpecificity = specificity(cssNode);
+      const newSelectorsNode = csstree.clone(cssNode);
+      csstree.walk(newSelectorsNode, (pseudoClassNode, item, list) => {
+        if (pseudoClassNode.type === 'PseudoClassSelector') {
+          dynamic = true;
+          list.remove(item);
+        }
+      });
+      selectors = csstree.generate(newSelectorsNode);
+      return csstree.walk.skip;
+    }
+    if (cssNode.type === 'Declaration') {
+      declarations.push({
+        name: cssNode.property,
+        value: csstree.generate(cssNode.value),
+        important: cssNode.important,
+      });
+      return csstree.walk.skip;
+    }
+  });
+  return {
+    dynamic,
+    selectors,
+    specificity: selectorsSpecificity,
+    declarations,
+  };
+};
+
+const parseStylesheet = (css, dynamic) => {
+  const rules = [];
+  const ast = csstree.parse(css);
+  csstree.walk(ast, (cssNode) => {
+    if (cssNode.type === 'Rule') {
+      rules.push(parseRule(cssNode, dynamic || false));
+      return csstree.walk.skip;
+    }
+    if (cssNode.type === 'Atrule') {
+      if (cssNode.name === 'keyframes') {
+        return csstree.walk.skip;
+      }
+      csstree.walk(cssNode, (ruleNode) => {
+        if (ruleNode.type === 'Rule') {
+          rules.push(parseRule(ruleNode, dynamic || true));
+          return csstree.walk.skip;
+        }
+      });
+      return csstree.walk.skip;
+    }
+  });
+  return rules;
+};
+
+const computeOwnStyle = (node, stylesheet) => {
+  const computedStyle = {};
+  const importantStyles = new Map();
+
+  // collect attributes
+  for (const [name, value] of Object.entries(node.attributes)) {
+    if (attrsGroups.presentation.includes(name)) {
+      computedStyle[name] = { type: 'static', inherited: false, value };
+      importantStyles.set(name, false);
+    }
+  }
+
+  // collect matching rules
+  for (const { selectors, declarations, dynamic } of stylesheet) {
+    if (is(node, selectors, cssSelectOptions)) {
+      for (const { name, value, important } of declarations) {
+        const computed = computedStyle[name];
+        if (computed && computed.type === 'dynamic') {
+          continue;
+        }
+        if (dynamic) {
+          computedStyle[name] = { type: 'dynamic', inherited: false };
+          continue;
+        }
+        if (
+          computed == null ||
+          important === true ||
+          importantStyles.get(name) === false
+        ) {
+          computedStyle[name] = { type: 'static', inherited: false, value };
+          importantStyles.set(name, important);
+        }
+      }
+    }
+  }
+
+  // collect inline styles
+  for (const [name, { value, priority }] of node.style.properties) {
+    const computed = computedStyle[name];
+    const important = priority === 'important';
+    if (computed && computed.type === 'dynamic') {
+      continue;
+    }
+    if (
+      computed == null ||
+      important === true ||
+      importantStyles.get(name) === false
+    ) {
+      computedStyle[name] = { type: 'static', inherited: false, value };
+      importantStyles.set(name, important);
+    }
+  }
+
+  return computedStyle;
+};
+
+const computeStyle = (node) => {
+  // find root
+  let root = node;
+  while (root.parentNode) {
+    root = root.parentNode;
+  }
+  // find all styles
+  const styleNodes = selectAll('style', root, cssSelectOptions);
+  // parse all styles
+  const stylesheet = [];
+  for (const styleNode of styleNodes) {
+    const dynamic =
+      styleNode.attributes.media != null &&
+      styleNode.attributes.media !== 'all';
+    if (
+      styleNode.attributes.type == null ||
+      styleNode.attributes.type === '' ||
+      styleNode.attributes.type === 'text/css'
+    ) {
+      const children = styleNode.children;
+      for (const child of children) {
+        if (child.type === 'text' || child.type === 'cdata') {
+          stylesheet.push(...parseStylesheet(child.value, dynamic));
+        }
+      }
+    }
+  }
+  // sort by selectors specificity
+  stable.inplace(stylesheet, (a, b) =>
+    compareSpecificity(a.specificity, b.specificity)
+  );
+
+  // collect inherited styles
+  const computedStyles = computeOwnStyle(node, stylesheet);
+  let parent = node;
+  while (parent.parentNode && parent.parentNode.type !== 'root') {
+    const inheritedStyles = computeOwnStyle(parent.parentNode, stylesheet);
+    for (const [name, computed] of Object.entries(inheritedStyles)) {
+      if (
+        computedStyles[name] == null &&
+        // ignore not inheritable styles
+        inheritableAttrs.includes(name) === true &&
+        presentationNonInheritableGroupAttrs.includes(name) === false
+      ) {
+        computedStyles[name] = { ...computed, inherited: true };
+      }
+    }
+    parent = parent.parentNode;
+  }
+
+  return computedStyles;
+};
+exports.computeStyle = computeStyle;
diff --git a/node_modules/svgo/lib/style.test.js b/node_modules/svgo/lib/style.test.js
new file mode 100644
index 0000000..9171ffe
--- /dev/null
+++ b/node_modules/svgo/lib/style.test.js
@@ -0,0 +1,249 @@
+'use strict';
+
+const { expect } = require('chai');
+const { computeStyle } = require('./style.js');
+const { querySelector } = require('./xast.js');
+const svg2js = require('./svgo/svg2js.js');
+
+describe('computeStyle', () => {
+  it('collects styles', () => {
+    const root = svg2js(`
+      <svg>
+        <rect id="class" class="a" />
+        <rect id="two-classes" class="b a" />
+        <rect id="attribute" fill="purple" />
+        <rect id="inline-style" style="fill: grey;" />
+        <g fill="yellow">
+          <rect id="inheritance" />
+          <g style="fill: blue;">
+            <g>
+              <rect id="nested-inheritance" />
+            </g>
+          </g>
+        </g>
+        <style>
+          .a { fill: red; }
+        </style>
+        <style>
+          <![CDATA[
+            .b { fill: green; stroke: black; }
+          ]]>
+        </style>
+      </svg>
+    `);
+    expect(computeStyle(querySelector(root, '#class'))).to.deep.equal({
+      fill: { type: 'static', inherited: false, value: 'red' },
+    });
+    expect(computeStyle(querySelector(root, '#two-classes'))).to.deep.equal({
+      fill: { type: 'static', inherited: false, value: 'green' },
+      stroke: { type: 'static', inherited: false, value: 'black' },
+    });
+    expect(computeStyle(querySelector(root, '#attribute'))).to.deep.equal({
+      fill: { type: 'static', inherited: false, value: 'purple' },
+    });
+    expect(computeStyle(querySelector(root, '#inline-style'))).to.deep.equal({
+      fill: { type: 'static', inherited: false, value: 'grey' },
+    });
+    expect(computeStyle(querySelector(root, '#inheritance'))).to.deep.equal({
+      fill: { type: 'static', inherited: true, value: 'yellow' },
+    });
+    expect(
+      computeStyle(querySelector(root, '#nested-inheritance'))
+    ).to.deep.equal({
+      fill: { type: 'static', inherited: true, value: 'blue' },
+    });
+  });
+
+  it('prioritizes different kinds of styles', () => {
+    const root = svg2js(`
+      <svg>
+        <style>
+          g > .a { fill: red; }
+          .a { fill: green; }
+          .b { fill: blue; }
+        </style>
+        <g fill="yellow">
+          <rect id="complex-selector" class="a" />
+          <rect id="attribute-over-inheritance" fill="orange" />
+          <rect id="style-rule-over-attribute" class="b" fill="grey" />
+          <rect id="inline-style-over-style-rule" style="fill: purple;" class="b" />
+        </g>
+      </svg>
+    `);
+    expect(
+      computeStyle(querySelector(root, '#complex-selector'))
+    ).to.deep.equal({
+      fill: { type: 'static', inherited: false, value: 'red' },
+    });
+    expect(
+      computeStyle(querySelector(root, '#attribute-over-inheritance'))
+    ).to.deep.equal({
+      fill: { type: 'static', inherited: false, value: 'orange' },
+    });
+    expect(
+      computeStyle(querySelector(root, '#style-rule-over-attribute'))
+    ).to.deep.equal({
+      fill: { type: 'static', inherited: false, value: 'blue' },
+    });
+    expect(
+      computeStyle(querySelector(root, '#inline-style-over-style-rule'))
+    ).to.deep.equal({
+      fill: { type: 'static', inherited: false, value: 'purple' },
+    });
+  });
+
+  it('prioritizes important styles', () => {
+    const root = svg2js(`
+      <svg>
+        <style>
+          g > .a { fill: red; }
+          .b { fill: green !important; }
+        </style>
+        <rect id="complex-selector" class="a b" />
+        <rect id="style-rule-over-inline-style" style="fill: orange;" class="b" />
+        <rect id="inline-style-over-style-rule" style="fill: purple !important;" class="b" />
+      </svg>
+    `);
+    expect(
+      computeStyle(querySelector(root, '#complex-selector'))
+    ).to.deep.equal({
+      fill: { type: 'static', inherited: false, value: 'green' },
+    });
+    expect(
+      computeStyle(querySelector(root, '#style-rule-over-inline-style'))
+    ).to.deep.equal({
+      fill: { type: 'static', inherited: false, value: 'green' },
+    });
+    expect(
+      computeStyle(querySelector(root, '#inline-style-over-style-rule'))
+    ).to.deep.equal({
+      fill: { type: 'static', inherited: false, value: 'purple' },
+    });
+  });
+
+  it('treats at-rules and pseudo-classes as dynamic styles', () => {
+    const root = svg2js(`
+      <svg>
+        <style>
+          @media screen {
+            .a { fill: red; }
+          }
+          .b:hover { fill: green; }
+          .c { fill: blue; }
+          .d { fill: purple; }
+        </style>
+        <rect id="media-query" class="a d" style="fill: orange;" />
+        <rect id="hover" class="b" style="fill: yellow;" />
+        <g class="a">
+          <rect id="inherited" />
+          <rect id="inherited-overriden" class="c" />
+        </g>
+        <rect id="static" class="c" style="fill: black" />
+      </svg>
+    `);
+    expect(computeStyle(querySelector(root, '#media-query'))).to.deep.equal({
+      fill: { type: 'dynamic', inherited: false },
+    });
+    expect(computeStyle(querySelector(root, '#hover'))).to.deep.equal({
+      fill: { type: 'dynamic', inherited: false },
+    });
+    expect(computeStyle(querySelector(root, '#inherited'))).to.deep.equal({
+      fill: { type: 'dynamic', inherited: true },
+    });
+    expect(
+      computeStyle(querySelector(root, '#inherited-overriden'))
+    ).to.deep.equal({
+      fill: { type: 'static', inherited: false, value: 'blue' },
+    });
+    expect(computeStyle(querySelector(root, '#static'))).to.deep.equal({
+      fill: { type: 'static', inherited: false, value: 'black' },
+    });
+  });
+
+  it('considers <style> media attribute', () => {
+    const root = svg2js(`
+      <svg>
+        <style media="print">
+          @media screen {
+            .a { fill: red; }
+          }
+          .b { fill: green; }
+        </style>
+        <style media="all">
+          .c { fill: blue; }
+        </style>
+        <rect id="media-query" class="a" />
+        <rect id="kinda-static" class="b" />
+        <rect id="static" class="c" />
+      </svg>
+    `);
+    expect(computeStyle(querySelector(root, '#media-query'))).to.deep.equal({
+      fill: { type: 'dynamic', inherited: false },
+    });
+    expect(computeStyle(querySelector(root, '#kinda-static'))).to.deep.equal({
+      fill: { type: 'dynamic', inherited: false },
+    });
+    expect(computeStyle(querySelector(root, '#static'))).to.deep.equal({
+      fill: { type: 'static', inherited: false, value: 'blue' },
+    });
+  });
+
+  it('ignores <style> with invalid type', () => {
+    const root = svg2js(`
+      <svg>
+        <style type="text/css">
+          .a { fill: red; }
+        </style>
+        <style type="">
+          .b { fill: green; }
+        </style>
+        <style type="text/invalid">
+          .c { fill: blue; }
+        </style>
+        <rect id="valid-type" class="a" />
+        <rect id="empty-type" class="b" />
+        <rect id="invalid-type" class="c" />
+      </svg>
+    `);
+    expect(computeStyle(querySelector(root, '#valid-type'))).to.deep.equal({
+      fill: { type: 'static', inherited: false, value: 'red' },
+    });
+    expect(computeStyle(querySelector(root, '#empty-type'))).to.deep.equal({
+      fill: { type: 'static', inherited: false, value: 'green' },
+    });
+    expect(computeStyle(querySelector(root, '#invalid-type'))).to.deep.equal(
+      {}
+    );
+  });
+
+  it('ignores keyframes atrule', () => {
+    const root = svg2js(`
+      <svg>
+        <style>
+          .a {
+            animation: loading 4s linear infinite;
+          }
+          @keyframes loading {
+            0% {
+              stroke-dashoffset: 440;
+            }
+            50% {
+              stroke-dashoffset: 0;
+            }
+            50.1% {
+              stroke-dashoffset: 880;
+            }
+          }
+        </style>
+        <rect id="element" class="a" />
+      </svg>
+    `);
+    expect(computeStyle(querySelector(root, '#element'))).to.deep.equal({
+      animation: {
+        type: 'static',
+        inherited: false,
+        value: 'loading 4s linear infinite',
+      },
+    });
+  });
+});
diff --git a/node_modules/svgo/lib/svgo-node.js b/node_modules/svgo/lib/svgo-node.js
new file mode 100644
index 0000000..b7e26a2
--- /dev/null
+++ b/node_modules/svgo/lib/svgo-node.js
@@ -0,0 +1,54 @@
+'use strict';
+
+const fs = require('fs');
+const path = require('path');
+const {
+  extendDefaultPlugins,
+  optimize,
+  createContentItem,
+} = require('./svgo.js');
+
+const importConfig = async (configFile) => {
+  const config = require(configFile);
+  if (config == null || typeof config !== 'object' || Array.isArray(config)) {
+    throw Error(`Invalid config file "${configFile}"`);
+  }
+  return config;
+};
+
+const isFile = async (file) => {
+  try {
+    const stats = await fs.promises.stat(file);
+    return stats.isFile();
+  } catch {
+    return false;
+  }
+};
+
+const loadConfig = async (configFile, cwd = process.cwd()) => {
+  if (configFile != null) {
+    if (path.isAbsolute(configFile)) {
+      return await importConfig(configFile);
+    } else {
+      return await importConfig(path.join(cwd, configFile));
+    }
+  }
+  let dir = cwd;
+  // eslint-disable-next-line no-constant-condition
+  while (true) {
+    const file = path.join(dir, 'svgo.config.js');
+    if (await isFile(file)) {
+      return await importConfig(file);
+    }
+    const parent = path.dirname(dir);
+    if (dir === parent) {
+      return null;
+    }
+    dir = parent;
+  }
+};
+
+exports.loadConfig = loadConfig;
+exports.extendDefaultPlugins = extendDefaultPlugins;
+exports.optimize = optimize;
+exports.createContentItem = createContentItem;
diff --git a/node_modules/svgo/lib/svgo.js b/node_modules/svgo/lib/svgo.js
new file mode 100644
index 0000000..10c94c4
--- /dev/null
+++ b/node_modules/svgo/lib/svgo.js
@@ -0,0 +1,79 @@
+'use strict';
+
+const {
+  defaultPlugins,
+  resolvePluginConfig,
+  extendDefaultPlugins,
+} = require('./svgo/config.js');
+const svg2js = require('./svgo/svg2js.js');
+const js2svg = require('./svgo/js2svg.js');
+const invokePlugins = require('./svgo/plugins.js');
+const JSAPI = require('./svgo/jsAPI.js');
+const { encodeSVGDatauri } = require('./svgo/tools.js');
+
+exports.extendDefaultPlugins = extendDefaultPlugins;
+
+const optimize = (input, config) => {
+  if (config == null) {
+    config = {};
+  }
+  if (typeof config !== 'object') {
+    throw Error('Config should be an object');
+  }
+  const maxPassCount = config.multipass ? 10 : 1;
+  let prevResultSize = Number.POSITIVE_INFINITY;
+  let svgjs = null;
+  const info = {};
+  if (config.path != null) {
+    info.path = config.path;
+  }
+  for (let i = 0; i < maxPassCount; i += 1) {
+    info.multipassCount = i;
+    svgjs = svg2js(input);
+    if (svgjs.error != null) {
+      if (config.path != null) {
+        svgjs.path = config.path;
+      }
+      return svgjs;
+    }
+    const plugins = config.plugins || defaultPlugins;
+    if (Array.isArray(plugins) === false) {
+      throw Error(
+        "Invalid plugins list. Provided 'plugins' in config should be an array."
+      );
+    }
+    const resolvedPlugins = plugins.map((plugin) =>
+      resolvePluginConfig(plugin, config)
+    );
+    svgjs = invokePlugins(svgjs, info, resolvedPlugins);
+    svgjs = js2svg(svgjs, config.js2svg);
+    if (svgjs.error) {
+      throw Error(svgjs.error);
+    }
+    if (svgjs.data.length < prevResultSize) {
+      input = svgjs.data;
+      prevResultSize = svgjs.data.length;
+    } else {
+      if (config.datauri) {
+        svgjs.data = encodeSVGDatauri(svgjs.data, config.datauri);
+      }
+      if (config.path != null) {
+        svgjs.path = config.path;
+      }
+      return svgjs;
+    }
+  }
+  return svgjs;
+};
+exports.optimize = optimize;
+
+/**
+ * The factory that creates a content item with the helper methods.
+ *
+ * @param {Object} data which is passed to jsAPI constructor
+ * @returns {JSAPI} content item
+ */
+const createContentItem = (data) => {
+  return new JSAPI(data);
+};
+exports.createContentItem = createContentItem;
diff --git a/node_modules/svgo/lib/svgo/coa.js b/node_modules/svgo/lib/svgo/coa.js
new file mode 100644
index 0000000..3169d93
--- /dev/null
+++ b/node_modules/svgo/lib/svgo/coa.js
@@ -0,0 +1,493 @@
+'use strict';
+
+const FS = require('fs');
+const PATH = require('path');
+const chalk = require('chalk');
+const { loadConfig, optimize } = require('../svgo-node.js');
+const pluginsMap = require('../../plugins/plugins.js');
+const PKG = require('../../package.json');
+const { encodeSVGDatauri, decodeSVGDatauri } = require('./tools.js');
+const regSVGFile = /\.svg$/i;
+
+/**
+ * Synchronously check if path is a directory. Tolerant to errors like ENOENT.
+ * @param {string} path
+ */
+function checkIsDir(path) {
+  try {
+    return FS.lstatSync(path).isDirectory();
+  } catch (e) {
+    return false;
+  }
+}
+
+module.exports = function makeProgram(program) {
+  program
+    .name(PKG.name)
+    .description(PKG.description, {
+      INPUT: 'Alias to --input',
+    })
+    .version(PKG.version, '-v, --version')
+    .arguments('[INPUT...]')
+    .option('-i, --input <INPUT...>', 'Input files, "-" for STDIN')
+    .option('-s, --string <STRING>', 'Input SVG data string')
+    .option(
+      '-f, --folder <FOLDER>',
+      'Input folder, optimize and rewrite all *.svg files'
+    )
+    .option(
+      '-o, --output <OUTPUT...>',
+      'Output file or folder (by default the same as the input), "-" for STDOUT'
+    )
+    .option(
+      '-p, --precision <INTEGER>',
+      'Set number of digits in the fractional part, overrides plugins params'
+    )
+    .option('--config <CONFIG>', 'Custom config file, only .js is supported')
+    .option(
+      '--datauri <FORMAT>',
+      'Output as Data URI string (base64), URI encoded (enc) or unencoded (unenc)'
+    )
+    .option(
+      '--multipass',
+      'Pass over SVGs multiple times to ensure all optimizations are applied'
+    )
+    .option('--pretty', 'Make SVG pretty printed')
+    .option('--indent <INTEGER>', 'Indent number when pretty printing SVGs')
+    .option(
+      '-r, --recursive',
+      "Use with '--folder'. Optimizes *.svg files in folders recursively."
+    )
+    .option(
+      '--exclude <PATTERN...>',
+      "Use with '--folder'. Exclude files matching regular expression pattern."
+    )
+    .option(
+      '-q, --quiet',
+      'Only output error messages, not regular status messages'
+    )
+    .option('--show-plugins', 'Show available plugins and exit')
+    .action(action);
+};
+
+async function action(args, opts, command) {
+  var input = opts.input || args;
+  var output = opts.output;
+  var config = {};
+
+  if (opts.precision != null) {
+    const number = Number.parseInt(opts.precision, 10);
+    if (Number.isNaN(number)) {
+      console.error(
+        "error: option '-p, --precision' argument must be an integer number"
+      );
+      process.exit(1);
+    } else {
+      opts.precision = number;
+    }
+  }
+
+  if (opts.datauri != null) {
+    if (
+      opts.datauri !== 'base64' &&
+      opts.datauri !== 'enc' &&
+      opts.datauri !== 'unenc'
+    ) {
+      console.error(
+        "error: option '--datauri' must have one of the following values: 'base64', 'enc' or 'unenc'"
+      );
+      process.exit(1);
+    }
+  }
+
+  if (opts.indent != null) {
+    const number = Number.parseInt(opts.indent, 10);
+    if (Number.isNaN(number)) {
+      console.error(
+        "error: option '--indent' argument must be an integer number"
+      );
+      process.exit(1);
+    } else {
+      opts.indent = number;
+    }
+  }
+
+  // --show-plugins
+  if (opts.showPlugins) {
+    showAvailablePlugins();
+    return;
+  }
+
+  // w/o anything
+  if (
+    (input.length === 0 || input[0] === '-') &&
+    !opts.string &&
+    !opts.stdin &&
+    !opts.folder &&
+    process.stdin.isTTY === true
+  ) {
+    return command.help();
+  }
+
+  if (
+    typeof process == 'object' &&
+    process.versions &&
+    process.versions.node &&
+    PKG &&
+    PKG.engines.node
+  ) {
+    var nodeVersion = String(PKG.engines.node).match(/\d*(\.\d+)*/)[0];
+    if (parseFloat(process.versions.node) < parseFloat(nodeVersion)) {
+      throw Error(
+        `${PKG.name} requires Node.js version ${nodeVersion} or higher.`
+      );
+    }
+  }
+
+  // --config
+  const loadedConfig = await loadConfig(opts.config);
+  if (loadedConfig != null) {
+    config = loadedConfig;
+  }
+
+  // --quiet
+  if (opts.quiet) {
+    config.quiet = opts.quiet;
+  }
+
+  // --recursive
+  if (opts.recursive) {
+    config.recursive = opts.recursive;
+  }
+
+  // --exclude
+  config.exclude = opts.exclude
+    ? opts.exclude.map((pattern) => RegExp(pattern))
+    : [];
+
+  // --precision
+  if (opts.precision != null) {
+    var precision = Math.min(Math.max(0, opts.precision), 20);
+    config.floatPrecision = precision;
+  }
+
+  // --multipass
+  if (opts.multipass) {
+    config.multipass = true;
+  }
+
+  // --pretty
+  if (opts.pretty) {
+    config.js2svg = config.js2svg || {};
+    config.js2svg.pretty = true;
+    if (opts.indent != null) {
+      config.js2svg.indent = opts.indent;
+    }
+  }
+
+  // --output
+  if (output) {
+    if (input.length && input[0] != '-') {
+      if (output.length == 1 && checkIsDir(output[0])) {
+        var dir = output[0];
+        for (var i = 0; i < input.length; i++) {
+          output[i] = checkIsDir(input[i])
+            ? input[i]
+            : PATH.resolve(dir, PATH.basename(input[i]));
+        }
+      } else if (output.length < input.length) {
+        output = output.concat(input.slice(output.length));
+      }
+    }
+  } else if (input.length) {
+    output = input;
+  } else if (opts.string) {
+    output = '-';
+  }
+
+  if (opts.datauri) {
+    config.datauri = opts.datauri;
+  }
+
+  // --folder
+  if (opts.folder) {
+    var ouputFolder = (output && output[0]) || opts.folder;
+    await optimizeFolder(config, opts.folder, ouputFolder);
+  }
+
+  // --input
+  if (input.length !== 0) {
+    // STDIN
+    if (input[0] === '-') {
+      return new Promise((resolve, reject) => {
+        var data = '',
+          file = output[0];
+
+        process.stdin
+          .on('data', (chunk) => (data += chunk))
+          .once('end', () =>
+            processSVGData(config, { input: 'string' }, data, file).then(
+              resolve,
+              reject
+            )
+          );
+      });
+      // file
+    } else {
+      await Promise.all(
+        input.map((file, n) => optimizeFile(config, file, output[n]))
+      );
+    }
+
+    // --string
+  } else if (opts.string) {
+    var data = decodeSVGDatauri(opts.string);
+
+    return processSVGData(config, { input: 'string' }, data, output[0]);
+  }
+}
+
+/**
+ * Optimize SVG files in a directory.
+ * @param {Object} config options
+ * @param {string} dir input directory
+ * @param {string} output output directory
+ * @return {Promise}
+ */
+function optimizeFolder(config, dir, output) {
+  if (!config.quiet) {
+    console.log(`Processing directory '${dir}':\n`);
+  }
+  return FS.promises
+    .readdir(dir)
+    .then((files) => processDirectory(config, dir, files, output));
+}
+
+/**
+ * Process given files, take only SVG.
+ * @param {Object} config options
+ * @param {string} dir input directory
+ * @param {Array} files list of file names in the directory
+ * @param {string} output output directory
+ * @return {Promise}
+ */
+function processDirectory(config, dir, files, output) {
+  // take only *.svg files, recursively if necessary
+  var svgFilesDescriptions = getFilesDescriptions(config, dir, files, output);
+
+  return svgFilesDescriptions.length
+    ? Promise.all(
+        svgFilesDescriptions.map((fileDescription) =>
+          optimizeFile(
+            config,
+            fileDescription.inputPath,
+            fileDescription.outputPath
+          )
+        )
+      )
+    : Promise.reject(
+        new Error(`No SVG files have been found in '${dir}' directory.`)
+      );
+}
+
+/**
+ * Get svg files descriptions
+ * @param {Object} config options
+ * @param {string} dir input directory
+ * @param {Array} files list of file names in the directory
+ * @param {string} output output directory
+ * @return {Array}
+ */
+function getFilesDescriptions(config, dir, files, output) {
+  const filesInThisFolder = files
+    .filter(
+      (name) =>
+        regSVGFile.test(name) &&
+        !config.exclude.some((regExclude) => regExclude.test(name))
+    )
+    .map((name) => ({
+      inputPath: PATH.resolve(dir, name),
+      outputPath: PATH.resolve(output, name),
+    }));
+
+  return config.recursive
+    ? [].concat(
+        filesInThisFolder,
+        files
+          .filter((name) => checkIsDir(PATH.resolve(dir, name)))
+          .map((subFolderName) => {
+            const subFolderPath = PATH.resolve(dir, subFolderName);
+            const subFolderFiles = FS.readdirSync(subFolderPath);
+            const subFolderOutput = PATH.resolve(output, subFolderName);
+            return getFilesDescriptions(
+              config,
+              subFolderPath,
+              subFolderFiles,
+              subFolderOutput
+            );
+          })
+          .reduce((a, b) => [].concat(a, b), [])
+      )
+    : filesInThisFolder;
+}
+
+/**
+ * Read SVG file and pass to processing.
+ * @param {Object} config options
+ * @param {string} file
+ * @param {string} output
+ * @return {Promise}
+ */
+function optimizeFile(config, file, output) {
+  return FS.promises.readFile(file, 'utf8').then(
+    (data) =>
+      processSVGData(config, { input: 'file', path: file }, data, output, file),
+    (error) => checkOptimizeFileError(config, file, output, error)
+  );
+}
+
+/**
+ * Optimize SVG data.
+ * @param {Object} config options
+ * @param {string} data SVG content to optimize
+ * @param {string} output where to write optimized file
+ * @param {string} [input] input file name (being used if output is a directory)
+ * @return {Promise}
+ */
+function processSVGData(config, info, data, output, input) {
+  var startTime = Date.now(),
+    prevFileSize = Buffer.byteLength(data, 'utf8');
+
+  const result = optimize(data, { ...config, ...info });
+  if (result.error) {
+    let message = result.error;
+    if (result.path != null) {
+      message += `\nFile: ${result.path}`;
+    }
+    throw Error(message);
+  }
+  if (config.datauri) {
+    result.data = encodeSVGDatauri(result.data, config.datauri);
+  }
+  var resultFileSize = Buffer.byteLength(result.data, 'utf8'),
+    processingTime = Date.now() - startTime;
+
+  return writeOutput(input, output, result.data).then(
+    function () {
+      if (!config.quiet && output != '-') {
+        if (input) {
+          console.log(`\n${PATH.basename(input)}:`);
+        }
+        printTimeInfo(processingTime);
+        printProfitInfo(prevFileSize, resultFileSize);
+      }
+    },
+    (error) =>
+      Promise.reject(
+        new Error(
+          error.code === 'ENOTDIR'
+            ? `Error: output '${output}' is not a directory.`
+            : error
+        )
+      )
+  );
+}
+
+/**
+ * Write result of an optimization.
+ * @param {string} input
+ * @param {string} output output file name. '-' for stdout
+ * @param {string} data data to write
+ * @return {Promise}
+ */
+function writeOutput(input, output, data) {
+  if (output == '-') {
+    console.log(data);
+    return Promise.resolve();
+  }
+
+  FS.mkdirSync(PATH.dirname(output), { recursive: true });
+
+  return FS.promises
+    .writeFile(output, data, 'utf8')
+    .catch((error) => checkWriteFileError(input, output, data, error));
+}
+
+/**
+ * Write a time taken by optimization.
+ * @param {number} time time in milliseconds.
+ */
+function printTimeInfo(time) {
+  console.log(`Done in ${time} ms!`);
+}
+
+/**
+ * Write optimizing information in human readable format.
+ * @param {number} inBytes size before optimization.
+ * @param {number} outBytes size after optimization.
+ */
+function printProfitInfo(inBytes, outBytes) {
+  var profitPercents = 100 - (outBytes * 100) / inBytes;
+
+  console.log(
+    Math.round((inBytes / 1024) * 1000) / 1000 +
+      ' KiB' +
+      (profitPercents < 0 ? ' + ' : ' - ') +
+      chalk.green(Math.abs(Math.round(profitPercents * 10) / 10) + '%') +
+      ' = ' +
+      Math.round((outBytes / 1024) * 1000) / 1000 +
+      ' KiB'
+  );
+}
+
+/**
+ * Check for errors, if it's a dir optimize the dir.
+ * @param {Object} config
+ * @param {string} input
+ * @param {string} output
+ * @param {Error} error
+ * @return {Promise}
+ */
+function checkOptimizeFileError(config, input, output, error) {
+  if (error.code == 'EISDIR') {
+    return optimizeFolder(config, input, output);
+  } else if (error.code == 'ENOENT') {
+    return Promise.reject(
+      new Error(`Error: no such file or directory '${error.path}'.`)
+    );
+  }
+  return Promise.reject(error);
+}
+
+/**
+ * Check for saving file error. If the output is a dir, then write file there.
+ * @param {string} input
+ * @param {string} output
+ * @param {string} data
+ * @param {Error} error
+ * @return {Promise}
+ */
+function checkWriteFileError(input, output, data, error) {
+  if (error.code == 'EISDIR' && input) {
+    return FS.promises.writeFile(
+      PATH.resolve(output, PATH.basename(input)),
+      data,
+      'utf8'
+    );
+  } else {
+    return Promise.reject(error);
+  }
+}
+
+/**
+ * Show list of available plugins with short description.
+ */
+function showAvailablePlugins() {
+  const list = Object.entries(pluginsMap)
+    .sort(([a], [b]) => a.localeCompare(b))
+    .map(([name, plugin]) => ` [ ${chalk.green(name)} ] ${plugin.description}`)
+    .join('\n');
+  console.log('Currently available plugins:\n' + list);
+}
+
+module.exports.checkIsDir = checkIsDir;
diff --git a/node_modules/svgo/lib/svgo/config.js b/node_modules/svgo/lib/svgo/config.js
new file mode 100644
index 0000000..5f180aa
--- /dev/null
+++ b/node_modules/svgo/lib/svgo/config.js
@@ -0,0 +1,123 @@
+'use strict';
+
+const pluginsMap = require('../../plugins/plugins.js');
+
+const pluginsOrder = [
+  'removeDoctype',
+  'removeXMLProcInst',
+  'removeComments',
+  'removeMetadata',
+  'removeXMLNS',
+  'removeEditorsNSData',
+  'cleanupAttrs',
+  'mergeStyles',
+  'inlineStyles',
+  'minifyStyles',
+  'convertStyleToAttrs',
+  'cleanupIDs',
+  'prefixIds',
+  'removeRasterImages',
+  'removeUselessDefs',
+  'cleanupNumericValues',
+  'cleanupListOfValues',
+  'convertColors',
+  'removeUnknownsAndDefaults',
+  'removeNonInheritableGroupAttrs',
+  'removeUselessStrokeAndFill',
+  'removeViewBox',
+  'cleanupEnableBackground',
+  'removeHiddenElems',
+  'removeEmptyText',
+  'convertShapeToPath',
+  'convertEllipseToCircle',
+  'moveElemsAttrsToGroup',
+  'moveGroupAttrsToElems',
+  'collapseGroups',
+  'convertPathData',
+  'convertTransform',
+  'removeEmptyAttrs',
+  'removeEmptyContainers',
+  'mergePaths',
+  'removeUnusedNS',
+  'sortAttrs',
+  'sortDefsChildren',
+  'removeTitle',
+  'removeDesc',
+  'removeDimensions',
+  'removeAttrs',
+  'removeAttributesBySelector',
+  'removeElementsByAttr',
+  'addClassesToSVGElement',
+  'removeStyleElement',
+  'removeScriptElement',
+  'addAttributesToSVGElement',
+  'removeOffCanvasPaths',
+  'reusePaths',
+];
+const defaultPlugins = pluginsOrder.filter((name) => pluginsMap[name].active);
+exports.defaultPlugins = defaultPlugins;
+
+const extendDefaultPlugins = (plugins) => {
+  const extendedPlugins = pluginsOrder.map((name) => ({
+    name,
+    active: pluginsMap[name].active,
+  }));
+  for (const plugin of plugins) {
+    const resolvedPlugin = resolvePluginConfig(plugin, {});
+    const index = pluginsOrder.indexOf(resolvedPlugin.name);
+    if (index === -1) {
+      extendedPlugins.push(plugin);
+    } else {
+      extendedPlugins[index] = plugin;
+    }
+  }
+  return extendedPlugins;
+};
+exports.extendDefaultPlugins = extendDefaultPlugins;
+
+const resolvePluginConfig = (plugin, config) => {
+  let configParams = {};
+  if ('floatPrecision' in config) {
+    configParams.floatPrecision = config.floatPrecision;
+  }
+  if (typeof plugin === 'string') {
+    // resolve builtin plugin specified as string
+    const pluginConfig = pluginsMap[plugin];
+    if (pluginConfig == null) {
+      throw Error(`Unknown builtin plugin "${plugin}" specified.`);
+    }
+    return {
+      ...pluginConfig,
+      name: plugin,
+      active: true,
+      params: { ...pluginConfig.params, ...configParams },
+    };
+  }
+  if (typeof plugin === 'object' && plugin != null) {
+    if (plugin.name == null) {
+      throw Error(`Plugin name should be specified`);
+    }
+    if (plugin.fn) {
+      // resolve custom plugin with implementation
+      return {
+        active: true,
+        ...plugin,
+        params: { ...configParams, ...plugin.params },
+      };
+    } else {
+      // resolve builtin plugin specified as object without implementation
+      const pluginConfig = pluginsMap[plugin.name];
+      if (pluginConfig == null) {
+        throw Error(`Unknown builtin plugin "${plugin.name}" specified.`);
+      }
+      return {
+        ...pluginConfig,
+        active: true,
+        ...plugin,
+        params: { ...pluginConfig.params, ...configParams, ...plugin.params },
+      };
+    }
+  }
+  return null;
+};
+exports.resolvePluginConfig = resolvePluginConfig;
diff --git a/node_modules/svgo/lib/svgo/css-class-list.js b/node_modules/svgo/lib/svgo/css-class-list.js
new file mode 100644
index 0000000..33c5156
--- /dev/null
+++ b/node_modules/svgo/lib/svgo/css-class-list.js
@@ -0,0 +1,72 @@
+'use strict';
+
+var CSSClassList = function (node) {
+  this.parentNode = node;
+  this.classNames = new Set();
+  const value = node.attributes.class;
+  if (value != null) {
+    this.addClassValueHandler();
+    this.setClassValue(value);
+  }
+};
+
+// attr.class.value
+
+CSSClassList.prototype.addClassValueHandler = function () {
+  Object.defineProperty(this.parentNode.attributes, 'class', {
+    get: this.getClassValue.bind(this),
+    set: this.setClassValue.bind(this),
+    enumerable: true,
+    configurable: true,
+  });
+};
+
+CSSClassList.prototype.getClassValue = function () {
+  var arrClassNames = Array.from(this.classNames);
+  return arrClassNames.join(' ');
+};
+
+CSSClassList.prototype.setClassValue = function (newValue) {
+  if (typeof newValue === 'undefined') {
+    this.classNames.clear();
+    return;
+  }
+  var arrClassNames = newValue.split(' ');
+  this.classNames = new Set(arrClassNames);
+};
+
+CSSClassList.prototype.add = function (/* variadic */) {
+  this.addClassValueHandler();
+  Object.values(arguments).forEach(this._addSingle.bind(this));
+};
+
+CSSClassList.prototype._addSingle = function (className) {
+  this.classNames.add(className);
+};
+
+CSSClassList.prototype.remove = function (/* variadic */) {
+  this.addClassValueHandler();
+  Object.values(arguments).forEach(this._removeSingle.bind(this));
+};
+
+CSSClassList.prototype._removeSingle = function (className) {
+  this.classNames.delete(className);
+};
+
+CSSClassList.prototype.item = function (index) {
+  var arrClassNames = Array.from(this.classNames);
+  return arrClassNames[index];
+};
+
+CSSClassList.prototype.toggle = function (className, force) {
+  if (this.contains(className) || force === false) {
+    this.classNames.delete(className);
+  }
+  this.classNames.add(className);
+};
+
+CSSClassList.prototype.contains = function (className) {
+  return this.classNames.has(className);
+};
+
+module.exports = CSSClassList;
diff --git a/node_modules/svgo/lib/svgo/css-select-adapter.js b/node_modules/svgo/lib/svgo/css-select-adapter.js
new file mode 100644
index 0000000..79bf24f
--- /dev/null
+++ b/node_modules/svgo/lib/svgo/css-select-adapter.js
@@ -0,0 +1,124 @@
+'use strict';
+
+/**
+ * @param {any} node
+ * @return {node is any}
+ */
+const isTag = (node) => {
+  return node.type === 'element';
+};
+
+const existsOne = (test, elems) => {
+  return elems.some((elem) => {
+    if (isTag(elem)) {
+      return test(elem) || existsOne(test, getChildren(elem));
+    } else {
+      return false;
+    }
+  });
+};
+
+const getAttributeValue = (elem, name) => {
+  return elem.attributes[name];
+};
+
+const getChildren = (node) => {
+  return node.children || [];
+};
+
+const getName = (elemAst) => {
+  return elemAst.name;
+};
+
+const getParent = (node) => {
+  return node.parentNode || null;
+};
+
+const getSiblings = (elem) => {
+  var parent = getParent(elem);
+  return parent ? getChildren(parent) : [];
+};
+
+const getText = (node) => {
+  if (node.children[0].type === 'text' && node.children[0].type === 'cdata') {
+    return node.children[0].value;
+  }
+  return '';
+};
+
+const hasAttrib = (elem, name) => {
+  return elem.attributes[name] !== undefined;
+};
+
+const removeSubsets = (nodes) => {
+  let idx = nodes.length;
+  let node;
+  let ancestor;
+  let replace;
+  // Check if each node (or one of its ancestors) is already contained in the
+  // array.
+  while (--idx > -1) {
+    node = ancestor = nodes[idx];
+    // Temporarily remove the node under consideration
+    nodes[idx] = null;
+    replace = true;
+    while (ancestor) {
+      if (nodes.includes(ancestor)) {
+        replace = false;
+        nodes.splice(idx, 1);
+        break;
+      }
+      ancestor = getParent(ancestor);
+    }
+    // If the node has been found to be unique, re-insert it.
+    if (replace) {
+      nodes[idx] = node;
+    }
+  }
+  return nodes;
+};
+
+const findAll = (test, elems) => {
+  const result = [];
+  for (const elem of elems) {
+    if (isTag(elem)) {
+      if (test(elem)) {
+        result.push(elem);
+      }
+      result.push(...findAll(test, getChildren(elem)));
+    }
+  }
+  return result;
+};
+
+const findOne = (test, elems) => {
+  for (const elem of elems) {
+    if (isTag(elem)) {
+      if (test(elem)) {
+        return elem;
+      }
+      const result = findOne(test, getChildren(elem));
+      if (result) {
+        return result;
+      }
+    }
+  }
+  return null;
+};
+
+const svgoCssSelectAdapter = {
+  isTag,
+  existsOne,
+  getAttributeValue,
+  getChildren,
+  getName,
+  getParent,
+  getSiblings,
+  getText,
+  hasAttrib,
+  removeSubsets,
+  findAll,
+  findOne,
+};
+
+module.exports = svgoCssSelectAdapter;
diff --git a/node_modules/svgo/lib/svgo/css-style-declaration.js b/node_modules/svgo/lib/svgo/css-style-declaration.js
new file mode 100644
index 0000000..c5fb30c
--- /dev/null
+++ b/node_modules/svgo/lib/svgo/css-style-declaration.js
@@ -0,0 +1,232 @@
+'use strict';
+
+var csstree = require('css-tree'),
+  csstools = require('../css-tools');
+
+var CSSStyleDeclaration = function (node) {
+  this.parentNode = node;
+
+  this.properties = new Map();
+  this.hasSynced = false;
+
+  this.styleValue = null;
+
+  this.parseError = false;
+  const value = node.attributes.style;
+  if (value != null) {
+    this.addStyleValueHandler();
+    this.setStyleValue(value);
+  }
+};
+
+// attr.style.value
+
+CSSStyleDeclaration.prototype.addStyleValueHandler = function () {
+  Object.defineProperty(this.parentNode.attributes, 'style', {
+    get: this.getStyleValue.bind(this),
+    set: this.setStyleValue.bind(this),
+    enumerable: true,
+    configurable: true,
+  });
+};
+
+CSSStyleDeclaration.prototype.getStyleValue = function () {
+  return this.getCssText();
+};
+
+CSSStyleDeclaration.prototype.setStyleValue = function (newValue) {
+  this.properties.clear(); // reset all existing properties
+  this.styleValue = newValue;
+  this.hasSynced = false; // raw css changed
+};
+
+CSSStyleDeclaration.prototype._loadCssText = function () {
+  if (this.hasSynced) {
+    return;
+  }
+  this.hasSynced = true; // must be set here to prevent loop in setProperty(...)
+
+  if (!this.styleValue || this.styleValue.length === 0) {
+    return;
+  }
+  var inlineCssStr = this.styleValue;
+
+  var declarations = {};
+  try {
+    declarations = csstree.parse(inlineCssStr, {
+      context: 'declarationList',
+      parseValue: false,
+    });
+  } catch (parseError) {
+    this.parseError = parseError;
+    return;
+  }
+  this.parseError = false;
+
+  var self = this;
+  declarations.children.each(function (declaration) {
+    try {
+      var styleDeclaration = csstools.csstreeToStyleDeclaration(declaration);
+      self.setProperty(
+        styleDeclaration.name,
+        styleDeclaration.value,
+        styleDeclaration.priority
+      );
+    } catch (styleError) {
+      if (styleError.message !== 'Unknown node type: undefined') {
+        self.parseError = styleError;
+      }
+    }
+  });
+};
+
+// only reads from properties
+
+/**
+ * Get the textual representation of the declaration block (equivalent to .cssText attribute).
+ *
+ * @return {string} Textual representation of the declaration block (empty string for no properties)
+ */
+CSSStyleDeclaration.prototype.getCssText = function () {
+  var properties = this.getProperties();
+
+  if (this.parseError) {
+    // in case of a parse error, pass through original styles
+    return this.styleValue;
+  }
+
+  var cssText = [];
+  properties.forEach(function (property, propertyName) {
+    var strImportant = property.priority === 'important' ? '!important' : '';
+    cssText.push(
+      propertyName.trim() + ':' + property.value.trim() + strImportant
+    );
+  });
+  return cssText.join(';');
+};
+
+CSSStyleDeclaration.prototype._handleParseError = function () {
+  if (this.parseError) {
+    console.warn(
+      "Warning: Parse error when parsing inline styles, style properties of this element cannot be used. The raw styles can still be get/set using .attr('style').value. Error details: " +
+        this.parseError
+    );
+  }
+};
+
+CSSStyleDeclaration.prototype._getProperty = function (propertyName) {
+  if (typeof propertyName === 'undefined') {
+    throw Error('1 argument required, but only 0 present.');
+  }
+
+  var properties = this.getProperties();
+  this._handleParseError();
+
+  var property = properties.get(propertyName.trim());
+  return property;
+};
+
+/**
+ * Return the optional priority, "important".
+ *
+ * @param {string} propertyName representing the property name to be checked.
+ * @return {string} priority that represents the priority (e.g. "important") if one exists. If none exists, returns the empty string.
+ */
+CSSStyleDeclaration.prototype.getPropertyPriority = function (propertyName) {
+  var property = this._getProperty(propertyName);
+  return property ? property.priority : '';
+};
+
+/**
+ * Return the property value given a property name.
+ *
+ * @param {string} propertyName representing the property name to be checked.
+ * @return {string} value containing the value of the property. If not set, returns the empty string.
+ */
+CSSStyleDeclaration.prototype.getPropertyValue = function (propertyName) {
+  var property = this._getProperty(propertyName);
+  return property ? property.value : null;
+};
+
+/**
+ * Return a property name.
+ *
+ * @param {number} index of the node to be fetched. The index is zero-based.
+ * @return {string} propertyName that is the name of the CSS property at the specified index.
+ */
+CSSStyleDeclaration.prototype.item = function (index) {
+  if (typeof index === 'undefined') {
+    throw Error('1 argument required, but only 0 present.');
+  }
+
+  var properties = this.getProperties();
+  this._handleParseError();
+
+  return Array.from(properties.keys())[index];
+};
+
+/**
+ * Return all properties of the node.
+ *
+ * @return {Map} properties that is a Map with propertyName as key and property (propertyValue + propertyPriority) as value.
+ */
+CSSStyleDeclaration.prototype.getProperties = function () {
+  this._loadCssText();
+  return this.properties;
+};
+
+// writes to properties
+
+/**
+ * Remove a property from the CSS declaration block.
+ *
+ * @param {string} propertyName representing the property name to be removed.
+ * @return {string} oldValue equal to the value of the CSS property before it was removed.
+ */
+CSSStyleDeclaration.prototype.removeProperty = function (propertyName) {
+  if (typeof propertyName === 'undefined') {
+    throw Error('1 argument required, but only 0 present.');
+  }
+
+  this.addStyleValueHandler();
+
+  var properties = this.getProperties();
+  this._handleParseError();
+
+  var oldValue = this.getPropertyValue(propertyName);
+  properties.delete(propertyName.trim());
+  return oldValue;
+};
+
+/**
+ * Modify an existing CSS property or creates a new CSS property in the declaration block.
+ *
+ * @param {string} propertyName representing the CSS property name to be modified.
+ * @param {string} value containing the new property value. If not specified, treated as the empty string. value must not contain "!important" -- that should be set using the priority parameter.
+ * @param {string} priority allowing the "important" CSS priority to be set. If not specified, treated as the empty string.
+ * @return {{value: string, priority: string}}
+ */
+CSSStyleDeclaration.prototype.setProperty = function (
+  propertyName,
+  value,
+  priority
+) {
+  if (typeof propertyName === 'undefined') {
+    throw Error('propertyName argument required, but only not present.');
+  }
+
+  this.addStyleValueHandler();
+
+  var properties = this.getProperties();
+  this._handleParseError();
+
+  var property = {
+    value: value.trim(),
+    priority: priority.trim(),
+  };
+  properties.set(propertyName.trim(), property);
+
+  return property;
+};
+
+module.exports = CSSStyleDeclaration;
diff --git a/node_modules/svgo/lib/svgo/js2svg.js b/node_modules/svgo/lib/svgo/js2svg.js
new file mode 100644
index 0000000..69cf52b
--- /dev/null
+++ b/node_modules/svgo/lib/svgo/js2svg.js
@@ -0,0 +1,321 @@
+'use strict';
+
+var EOL = require('os').EOL,
+  textElems = require('../../plugins/_collections.js').textElems;
+
+var defaults = {
+  doctypeStart: '<!DOCTYPE',
+  doctypeEnd: '>',
+  procInstStart: '<?',
+  procInstEnd: '?>',
+  tagOpenStart: '<',
+  tagOpenEnd: '>',
+  tagCloseStart: '</',
+  tagCloseEnd: '>',
+  tagShortStart: '<',
+  tagShortEnd: '/>',
+  attrStart: '="',
+  attrEnd: '"',
+  commentStart: '<!--',
+  commentEnd: '-->',
+  cdataStart: '<![CDATA[',
+  cdataEnd: ']]>',
+  textStart: '',
+  textEnd: '',
+  indent: 4,
+  regEntities: /[&'"<>]/g,
+  regValEntities: /[&"<>]/g,
+  encodeEntity: encodeEntity,
+  pretty: false,
+  useShortTags: true,
+};
+
+var entities = {
+  '&': '&amp;',
+  "'": '&apos;',
+  '"': '&quot;',
+  '>': '&gt;',
+  '<': '&lt;',
+};
+
+/**
+ * Convert SVG-as-JS object to SVG (XML) string.
+ *
+ * @param {Object} data input data
+ * @param {Object} config config
+ *
+ * @return {Object} output data
+ */
+module.exports = function (data, config) {
+  return new JS2SVG(config).convert(data);
+};
+
+function JS2SVG(config) {
+  if (config) {
+    this.config = Object.assign({}, defaults, config);
+  } else {
+    this.config = Object.assign({}, defaults);
+  }
+
+  var indent = this.config.indent;
+  if (typeof indent == 'number' && !isNaN(indent)) {
+    this.config.indent = indent < 0 ? '\t' : ' '.repeat(indent);
+  } else if (typeof indent != 'string') {
+    this.config.indent = '    ';
+  }
+
+  if (this.config.pretty) {
+    this.config.doctypeEnd += EOL;
+    this.config.procInstEnd += EOL;
+    this.config.commentEnd += EOL;
+    this.config.cdataEnd += EOL;
+    this.config.tagShortEnd += EOL;
+    this.config.tagOpenEnd += EOL;
+    this.config.tagCloseEnd += EOL;
+    this.config.textEnd += EOL;
+  }
+
+  this.indentLevel = 0;
+  this.textContext = null;
+}
+
+function encodeEntity(char) {
+  return entities[char];
+}
+
+/**
+ * Start conversion.
+ *
+ * @param {Object} data input data
+ *
+ * @return {String}
+ */
+JS2SVG.prototype.convert = function (data) {
+  var svg = '';
+
+  this.indentLevel++;
+
+  for (const item of data.children) {
+    if (item.type === 'element') {
+      svg += this.createElem(item);
+    }
+    if (item.type === 'text') {
+      svg += this.createText(item);
+    }
+    if (item.type === 'doctype') {
+      svg += this.createDoctype(item);
+    }
+    if (item.type === 'instruction') {
+      svg += this.createProcInst(item);
+    }
+    if (item.type === 'comment') {
+      svg += this.createComment(item);
+    }
+    if (item.type === 'cdata') {
+      svg += this.createCDATA(item);
+    }
+  }
+
+  this.indentLevel--;
+
+  return {
+    data: svg,
+    info: {
+      width: this.width,
+      height: this.height,
+    },
+  };
+};
+
+/**
+ * Create indent string in accordance with the current node level.
+ *
+ * @return {String}
+ */
+JS2SVG.prototype.createIndent = function () {
+  var indent = '';
+
+  if (this.config.pretty && !this.textContext) {
+    indent = this.config.indent.repeat(this.indentLevel - 1);
+  }
+
+  return indent;
+};
+
+/**
+ * Create doctype tag.
+ *
+ * @param {String} doctype doctype body string
+ *
+ * @return {String}
+ */
+JS2SVG.prototype.createDoctype = function (node) {
+  const { doctype } = node.data;
+  return this.config.doctypeStart + doctype + this.config.doctypeEnd;
+};
+
+/**
+ * Create XML Processing Instruction tag.
+ *
+ * @param {Object} instruction instruction object
+ *
+ * @return {String}
+ */
+JS2SVG.prototype.createProcInst = function (node) {
+  const { name, value } = node;
+  return (
+    this.config.procInstStart + name + ' ' + value + this.config.procInstEnd
+  );
+};
+
+/**
+ * Create comment tag.
+ *
+ * @param {String} comment comment body
+ *
+ * @return {String}
+ */
+JS2SVG.prototype.createComment = function (node) {
+  const { value } = node;
+  return this.config.commentStart + value + this.config.commentEnd;
+};
+
+/**
+ * Create CDATA section.
+ *
+ * @param {String} cdata CDATA body
+ *
+ * @return {String}
+ */
+JS2SVG.prototype.createCDATA = function (node) {
+  const { value } = node;
+  return (
+    this.createIndent() + this.config.cdataStart + value + this.config.cdataEnd
+  );
+};
+
+/**
+ * Create element tag.
+ *
+ * @param {Object} data element object
+ *
+ * @return {String}
+ */
+JS2SVG.prototype.createElem = function (data) {
+  // beautiful injection for obtaining SVG information :)
+  if (
+    data.name === 'svg' &&
+    data.attributes.width != null &&
+    data.attributes.height != null
+  ) {
+    this.width = data.attributes.width;
+    this.height = data.attributes.height;
+  }
+
+  // empty element and short tag
+  if (data.children.length === 0) {
+    if (this.config.useShortTags) {
+      return (
+        this.createIndent() +
+        this.config.tagShortStart +
+        data.name +
+        this.createAttrs(data) +
+        this.config.tagShortEnd
+      );
+    } else {
+      return (
+        this.createIndent() +
+        this.config.tagShortStart +
+        data.name +
+        this.createAttrs(data) +
+        this.config.tagOpenEnd +
+        this.config.tagCloseStart +
+        data.name +
+        this.config.tagCloseEnd
+      );
+    }
+    // non-empty element
+  } else {
+    var tagOpenStart = this.config.tagOpenStart,
+      tagOpenEnd = this.config.tagOpenEnd,
+      tagCloseStart = this.config.tagCloseStart,
+      tagCloseEnd = this.config.tagCloseEnd,
+      openIndent = this.createIndent(),
+      closeIndent = this.createIndent(),
+      processedData = '',
+      dataEnd = '';
+
+    if (this.textContext) {
+      tagOpenStart = defaults.tagOpenStart;
+      tagOpenEnd = defaults.tagOpenEnd;
+      tagCloseStart = defaults.tagCloseStart;
+      tagCloseEnd = defaults.tagCloseEnd;
+      openIndent = '';
+    } else if (data.isElem(textElems)) {
+      tagOpenEnd = defaults.tagOpenEnd;
+      tagCloseStart = defaults.tagCloseStart;
+      closeIndent = '';
+      this.textContext = data;
+    }
+
+    processedData += this.convert(data).data;
+
+    if (this.textContext == data) {
+      this.textContext = null;
+    }
+
+    return (
+      openIndent +
+      tagOpenStart +
+      data.name +
+      this.createAttrs(data) +
+      tagOpenEnd +
+      processedData +
+      dataEnd +
+      closeIndent +
+      tagCloseStart +
+      data.name +
+      tagCloseEnd
+    );
+  }
+};
+
+/**
+ * Create element attributes.
+ *
+ * @param {Object} elem attributes object
+ *
+ * @return {String}
+ */
+JS2SVG.prototype.createAttrs = function (element) {
+  let attrs = '';
+  for (const [name, value] of Object.entries(element.attributes)) {
+    if (value !== undefined) {
+      const encodedValue = value
+        .toString()
+        .replace(this.config.regValEntities, this.config.encodeEntity);
+      attrs +=
+        ' ' + name + this.config.attrStart + encodedValue + this.config.attrEnd;
+    } else {
+      attrs += ' ' + name;
+    }
+  }
+  return attrs;
+};
+
+/**
+ * Create text node.
+ *
+ * @param {String} text text
+ *
+ * @return {String}
+ */
+JS2SVG.prototype.createText = function (node) {
+  const { value } = node;
+  return (
+    this.createIndent() +
+    this.config.textStart +
+    value.replace(this.config.regEntities, this.config.encodeEntity) +
+    (this.textContext ? '' : this.config.textEnd)
+  );
+};
diff --git a/node_modules/svgo/lib/svgo/jsAPI.js b/node_modules/svgo/lib/svgo/jsAPI.js
new file mode 100644
index 0000000..89eeade
--- /dev/null
+++ b/node_modules/svgo/lib/svgo/jsAPI.js
@@ -0,0 +1,415 @@
+'use strict';
+
+const { selectAll, selectOne, is } = require('css-select');
+const { parseName } = require('./tools.js');
+const svgoCssSelectAdapter = require('./css-select-adapter');
+const CSSClassList = require('./css-class-list');
+const CSSStyleDeclaration = require('./css-style-declaration');
+
+var cssSelectOpts = {
+  xmlMode: true,
+  adapter: svgoCssSelectAdapter,
+};
+
+const attrsHandler = {
+  get: (attributes, name) => {
+    // eslint-disable-next-line no-prototype-builtins
+    if (attributes.hasOwnProperty(name)) {
+      return {
+        name,
+        get value() {
+          return attributes[name];
+        },
+        set value(value) {
+          attributes[name] = value;
+        },
+      };
+    }
+  },
+  set: (attributes, name, attr) => {
+    attributes[name] = attr.value;
+    return true;
+  },
+};
+
+var JSAPI = function (data, parentNode) {
+  Object.assign(this, data);
+  if (this.type === 'element') {
+    if (this.attributes == null) {
+      this.attributes = {};
+    }
+    if (this.children == null) {
+      this.children = [];
+    }
+    Object.defineProperty(this, 'class', {
+      writable: true,
+      configurable: true,
+      value: new CSSClassList(this),
+    });
+    Object.defineProperty(this, 'style', {
+      writable: true,
+      configurable: true,
+      value: new CSSStyleDeclaration(this),
+    });
+    Object.defineProperty(this, 'parentNode', {
+      writable: true,
+      value: parentNode,
+    });
+
+    // temporary attrs polyfill
+    // TODO remove after migration
+    const element = this;
+    Object.defineProperty(this, 'attrs', {
+      configurable: true,
+      get() {
+        return new Proxy(element.attributes, attrsHandler);
+      },
+      set(value) {
+        const newAttributes = {};
+        for (const attr of Object.values(value)) {
+          newAttributes[attr.name] = attr.value;
+        }
+        element.attributes = newAttributes;
+      },
+    });
+  }
+};
+module.exports = JSAPI;
+
+/**
+ * Perform a deep clone of this node.
+ *
+ * @return {Object} element
+ */
+JSAPI.prototype.clone = function () {
+  const { children, ...nodeData } = this;
+  // Deep-clone node data.
+  const clonedNode = new JSAPI(JSON.parse(JSON.stringify(nodeData)), null);
+  if (children) {
+    clonedNode.children = children.map((child) => {
+      const clonedChild = child.clone();
+      clonedChild.parentNode = clonedNode;
+      return clonedChild;
+    });
+  }
+  return clonedNode;
+};
+
+/**
+ * Determine if item is an element
+ * (any, with a specific name or in a names array).
+ *
+ * @param {String|Array} [param] element name or names arrays
+ * @return {Boolean}
+ */
+JSAPI.prototype.isElem = function (param) {
+  if (this.type !== 'element') {
+    return false;
+  }
+  if (param == null) {
+    return true;
+  }
+  if (Array.isArray(param)) {
+    return param.includes(this.name);
+  }
+  return this.name === param;
+};
+
+/**
+ * Renames an element
+ *
+ * @param {String} name new element name
+ * @return {Object} element
+ */
+JSAPI.prototype.renameElem = function (name) {
+  if (name && typeof name === 'string') this.name = name;
+
+  return this;
+};
+
+/**
+ * Determine if element is empty.
+ *
+ * @return {Boolean}
+ */
+JSAPI.prototype.isEmpty = function () {
+  return !this.children || !this.children.length;
+};
+
+/**
+ * Find the closest ancestor of the current element.
+ * @param elemName
+ *
+ * @return {?Object}
+ */
+JSAPI.prototype.closestElem = function (elemName) {
+  var elem = this;
+
+  while ((elem = elem.parentNode) && !elem.isElem(elemName));
+
+  return elem;
+};
+
+/**
+ * Changes children by removing elements and/or adding new elements.
+ *
+ * @param {Number} start Index at which to start changing the children.
+ * @param {Number} n Number of elements to remove.
+ * @param {Array|Object} [insertion] Elements to add to the children.
+ * @return {Array} Removed elements.
+ */
+JSAPI.prototype.spliceContent = function (start, n, insertion) {
+  if (arguments.length < 2) return [];
+
+  if (!Array.isArray(insertion))
+    insertion = Array.apply(null, arguments).slice(2);
+
+  insertion.forEach(function (inner) {
+    inner.parentNode = this;
+  }, this);
+
+  return this.children.splice.apply(
+    this.children,
+    [start, n].concat(insertion)
+  );
+};
+
+/**
+ * Determine if element has an attribute
+ * (any, or by name or by name + value).
+ *
+ * @param {String} [name] attribute name
+ * @param {String} [val] attribute value (will be toString()'ed)
+ * @return {Boolean}
+ */
+JSAPI.prototype.hasAttr = function (name, val) {
+  if (this.type !== 'element') {
+    return false;
+  }
+  if (Object.keys(this.attributes).length === 0) {
+    return false;
+  }
+  if (name == null) {
+    return true;
+  }
+  // eslint-disable-next-line no-prototype-builtins
+  if (this.attributes.hasOwnProperty(name) === false) {
+    return false;
+  }
+  if (val !== undefined) {
+    return this.attributes[name] === val.toString();
+  }
+  return true;
+};
+
+/**
+ * Determine if element has an attribute by local name
+ * (any, or by name or by name + value).
+ *
+ * @param {String} [localName] local attribute name
+ * @param {Number|String|RegExp|Function} [val] attribute value (will be toString()'ed or executed, otherwise ignored)
+ * @return {Boolean}
+ */
+JSAPI.prototype.hasAttrLocal = function (localName, val) {
+  if (!this.attrs || !Object.keys(this.attrs).length) return false;
+
+  if (!arguments.length) return !!this.attrs;
+
+  var callback;
+
+  switch (val != null && val.constructor && val.constructor.name) {
+    case 'Number': // same as String
+    case 'String':
+      callback = stringValueTest;
+      break;
+    case 'RegExp':
+      callback = regexpValueTest;
+      break;
+    case 'Function':
+      callback = funcValueTest;
+      break;
+    default:
+      callback = nameTest;
+  }
+  return this.someAttr(callback);
+
+  function nameTest(attr) {
+    const { local } = parseName(attr.name);
+    return local === localName;
+  }
+
+  function stringValueTest(attr) {
+    const { local } = parseName(attr.name);
+    return local === localName && val == attr.value;
+  }
+
+  function regexpValueTest(attr) {
+    const { local } = parseName(attr.name);
+    return local === localName && val.test(attr.value);
+  }
+
+  function funcValueTest(attr) {
+    const { local } = parseName(attr.name);
+    return local === localName && val(attr.value);
+  }
+};
+
+/**
+ * Get a specific attribute from an element
+ * (by name or name + value).
+ *
+ * @param {String} name attribute name
+ * @param {String} [val] attribute value (will be toString()'ed)
+ * @return {Object|Undefined}
+ */
+JSAPI.prototype.attr = function (name, val) {
+  if (this.hasAttr(name, val)) {
+    return this.attrs[name];
+  }
+};
+
+/**
+ * Get computed attribute value from an element
+ *
+ * @param {String} name attribute name
+ * @return {Object|Undefined}
+ */
+JSAPI.prototype.computedAttr = function (name, val) {
+  if (!arguments.length) return;
+
+  for (
+    var elem = this;
+    elem && (!elem.hasAttr(name) || !elem.attributes[name]);
+    elem = elem.parentNode
+  );
+
+  if (val != null) {
+    return elem ? elem.hasAttr(name, val) : false;
+  } else if (elem && elem.hasAttr(name)) {
+    return elem.attributes[name];
+  }
+};
+
+/**
+ * Remove a specific attribute.
+ *
+ * @param {String|Array} name attribute name
+ * @param {String} [val] attribute value
+ * @return {Boolean}
+ */
+JSAPI.prototype.removeAttr = function (name, val) {
+  if (this.type !== 'element') {
+    return false;
+  }
+  if (arguments.length === 0) {
+    return false;
+  }
+  if (Array.isArray(name)) {
+    for (const nameItem of name) {
+      this.removeAttr(nameItem, val);
+    }
+    return false;
+  }
+  if (this.hasAttr(name, val) === false) {
+    return false;
+  }
+  delete this.attributes[name];
+  return true;
+};
+
+/**
+ * Add attribute.
+ *
+ * @param {Object} [attr={}] attribute object
+ * @return {Object|Boolean} created attribute or false if no attr was passed in
+ */
+JSAPI.prototype.addAttr = function (attr) {
+  attr = attr || {};
+
+  if (attr.name === undefined) return false;
+
+  this.attributes[attr.name] = attr.value;
+
+  if (attr.name === 'class') {
+    // newly added class attribute
+    this.class.hasClass();
+  }
+
+  if (attr.name === 'style') {
+    // newly added style attribute
+    this.style.hasStyle();
+  }
+
+  return this.attrs[attr.name];
+};
+
+/**
+ * Iterates over all attributes.
+ *
+ * @param {Function} callback callback
+ * @param {Object} [context] callback context
+ * @return {Boolean} false if there are no any attributes
+ */
+JSAPI.prototype.eachAttr = function (callback, context) {
+  if (this.type !== 'element') {
+    return false;
+  }
+  if (callback == null) {
+    return false;
+  }
+  for (const attr of Object.values(this.attrs)) {
+    callback.call(context, attr);
+  }
+  return true;
+};
+
+/**
+ * Tests whether some attribute passes the test.
+ *
+ * @param {Function} callback callback
+ * @param {Object} [context] callback context
+ * @return {Boolean} false if there are no any attributes
+ */
+JSAPI.prototype.someAttr = function (callback, context) {
+  if (this.type !== 'element') {
+    return false;
+  }
+
+  for (const attr of Object.values(this.attrs)) {
+    if (callback.call(context, attr)) return true;
+  }
+
+  return false;
+};
+
+/**
+ * Evaluate a string of CSS selectors against the element and returns matched elements.
+ *
+ * @param {String} selectors CSS selector(s) string
+ * @return {Array} null if no elements matched
+ */
+JSAPI.prototype.querySelectorAll = function (selectors) {
+  var matchedEls = selectAll(selectors, this, cssSelectOpts);
+
+  return matchedEls.length > 0 ? matchedEls : null;
+};
+
+/**
+ * Evaluate a string of CSS selectors against the element and returns only the first matched element.
+ *
+ * @param {String} selectors CSS selector(s) string
+ * @return {Array} null if no element matched
+ */
+JSAPI.prototype.querySelector = function (selectors) {
+  return selectOne(selectors, this, cssSelectOpts);
+};
+
+/**
+ * Test if a selector matches a given element.
+ *
+ * @param {String} selector CSS selector string
+ * @return {Boolean} true if element would be selected by selector string, false if it does not
+ */
+JSAPI.prototype.matches = function (selector) {
+  return is(this, selector, cssSelectOpts);
+};
diff --git a/node_modules/svgo/lib/svgo/plugins.js b/node_modules/svgo/lib/svgo/plugins.js
new file mode 100644
index 0000000..ed41813
--- /dev/null
+++ b/node_modules/svgo/lib/svgo/plugins.js
@@ -0,0 +1,110 @@
+'use strict';
+
+const { visit } = require('../xast.js');
+
+/**
+ * Plugins engine.
+ *
+ * @module plugins
+ *
+ * @param {Object} data input data
+ * @param {Object} info extra information
+ * @param {Array} plugins plugins object from config
+ * @return {Object} output data
+ */
+module.exports = function (data, info, plugins) {
+  // Try to group sequential elements of plugins array
+  // to optimize ast traversing
+  const groups = [];
+  let prev;
+  for (const plugin of plugins) {
+    if (prev && plugin.type == prev[0].type) {
+      prev.push(plugin);
+    } else {
+      prev = [plugin];
+      groups.push(prev);
+    }
+  }
+  for (const group of groups) {
+    switch (group[0].type) {
+      case 'perItem':
+        data = perItem(data, info, group);
+        break;
+      case 'perItemReverse':
+        data = perItem(data, info, group, true);
+        break;
+      case 'full':
+        data = full(data, info, group);
+        break;
+      case 'visitor':
+        for (const plugin of group) {
+          if (plugin.active) {
+            const visitor = plugin.fn(data, plugin.params, info);
+            visit(data, visitor);
+          }
+        }
+        break;
+    }
+  }
+  return data;
+};
+
+/**
+ * Direct or reverse per-item loop.
+ *
+ * @param {Object} data input data
+ * @param {Object} info extra information
+ * @param {Array} plugins plugins list to process
+ * @param {boolean} [reverse] reverse pass?
+ * @return {Object} output data
+ */
+function perItem(data, info, plugins, reverse) {
+  function monkeys(items) {
+    items.children = items.children.filter(function (item) {
+      // reverse pass
+      if (reverse && item.children) {
+        monkeys(item);
+      }
+
+      // main filter
+      var filter = true;
+
+      for (var i = 0; filter && i < plugins.length; i++) {
+        var plugin = plugins[i];
+
+        if (plugin.active && plugin.fn(item, plugin.params, info) === false) {
+          filter = false;
+        }
+      }
+
+      // direct pass
+      if (!reverse && item.children) {
+        monkeys(item);
+      }
+
+      return filter;
+    });
+
+    return items;
+  }
+
+  return monkeys(data);
+}
+
+/**
+ * "Full" plugins.
+ *
+ * @param {Object} data input data
+ * @param {Object} info extra information
+ * @param {Array} plugins plugins list to process
+ * @return {Object} output data
+ */
+function full(data, info, plugins) {
+  plugins.forEach(function (plugin) {
+    if (plugin.active) {
+      data = plugin.fn(data, plugin.params, info);
+    }
+  });
+
+  return data;
+}
diff --git a/node_modules/svgo/lib/svgo/svg2js.js b/node_modules/svgo/lib/svgo/svg2js.js
new file mode 100644
index 0000000..b150a5c
--- /dev/null
+++ b/node_modules/svgo/lib/svgo/svg2js.js
@@ -0,0 +1,130 @@
+'use strict';
+
+const SAX = require('@trysound/sax');
+const JSAPI = require('./jsAPI.js');
+const { textElems } = require('../../plugins/_collections.js');
+
+const entityDeclaration = /<!ENTITY\s+(\S+)\s+(?:'([^']+)'|"([^"]+)")\s*>/g;
+
+const config = {
+  strict: true,
+  trim: false,
+  normalize: false,
+  lowercase: true,
+  xmlns: true,
+  position: true,
+};
+
+/**
+ * Convert SVG (XML) string to SVG-as-JS object.
+ *
+ * @param {String} data input data
+ */
+module.exports = function (data) {
+  const sax = SAX.parser(config.strict, config);
+  const root = new JSAPI({ type: 'root', children: [] });
+  let current = root;
+  let stack = [root];
+
+  function pushToContent(node) {
+    const wrapped = new JSAPI(node, current);
+    current.children.push(wrapped);
+    return wrapped;
+  }
+
+  sax.ondoctype = function (doctype) {
+    pushToContent({
+      type: 'doctype',
+      // TODO parse doctype for name, public and system to match xast
+      name: 'svg',
+      data: {
+        doctype,
+      },
+    });
+
+    const subsetStart = doctype.indexOf('[');
+    let entityMatch;
+
+    if (subsetStart >= 0) {
+      entityDeclaration.lastIndex = subsetStart;
+
+      while ((entityMatch = entityDeclaration.exec(data)) != null) {
+        sax.ENTITIES[entityMatch[1]] = entityMatch[2] || entityMatch[3];
+      }
+    }
+  };
+
+  sax.onprocessinginstruction = function (data) {
+    pushToContent({
+      type: 'instruction',
+      name: data.name,
+      value: data.body,
+    });
+  };
+
+  sax.oncomment = function (comment) {
+    pushToContent({
+      type: 'comment',
+      value: comment.trim(),
+    });
+  };
+
+  sax.oncdata = function (cdata) {
+    pushToContent({
+      type: 'cdata',
+      value: cdata,
+    });
+  };
+
+  sax.onopentag = function (data) {
+    var element = {
+      type: 'element',
+      name: data.name,
+      attributes: {},
+      children: [],
+    };
+
+    for (const [name, attr] of Object.entries(data.attributes)) {
+      element.attributes[name] = attr.value;
+    }
+
+    element = pushToContent(element);
+    current = element;
+
+    stack.push(element);
+  };
+
+  sax.ontext = function (text) {
+    // prevent trimming of meaningful whitespace inside textual tags
+    if (textElems.includes(current.name) && !data.prefix) {
+      pushToContent({
+        type: 'text',
+        value: text,
+      });
+    } else if (/\S/.test(text)) {
+      pushToContent({
+        type: 'text',
+        value: text.trim(),
+      });
+    }
+  };
+
+  sax.onclosetag = function () {
+    stack.pop();
+    current = stack[stack.length - 1];
+  };
+
+  sax.onerror = function (e) {
+    e.message = 'Error in parsing SVG: ' + e.message;
+    if (e.message.indexOf('Unexpected end') < 0) {
+      throw e;
+    }
+  };
+
+  try {
+    sax.write(data).close();
+    return root;
+  } catch (e) {
+    return { error: e.message };
+  }
+};
diff --git a/node_modules/svgo/lib/svgo/tools.js b/node_modules/svgo/lib/svgo/tools.js
new file mode 100644
index 0000000..11c875a
--- /dev/null
+++ b/node_modules/svgo/lib/svgo/tools.js
@@ -0,0 +1,167 @@
+'use strict';
+
+/**
+ * Encode plain SVG data string into Data URI string.
+ *
+ * @param {string} str input string
+ * @param {string} type Data URI type
+ * @return {string} output string
+ */
+exports.encodeSVGDatauri = function (str, type) {
+  var prefix = 'data:image/svg+xml';
+  if (!type || type === 'base64') {
+    // base64
+    prefix += ';base64,';
+    str = prefix + Buffer.from(str).toString('base64');
+  } else if (type === 'enc') {
+    // URI encoded
+    str = prefix + ',' + encodeURIComponent(str);
+  } else if (type === 'unenc') {
+    // unencoded
+    str = prefix + ',' + str;
+  }
+  return str;
+};
+
+/**
+ * Decode SVG Data URI string into plain SVG string.
+ *
+ * @param {string} str input string
+ * @return {string} output string
+ */
+exports.decodeSVGDatauri = function (str) {
+  var regexp = /data:image\/svg\+xml(;charset=[^;,]*)?(;base64)?,(.*)/;
+  var match = regexp.exec(str);
+
+  // plain string
+  if (!match) return str;
+
+  var data = match[3];
+
+  if (match[2]) {
+    // base64
+    str = Buffer.from(data, 'base64').toString('utf8');
+  } else if (data.charAt(0) === '%') {
+    // URI encoded
+    str = decodeURIComponent(data);
+  } else if (data.charAt(0) === '<') {
+    // unencoded
+    str = data;
+  }
+  return str;
+};
+
+/**
+ * @param {any[]} a
+ * @param {any[]} b
+ */
+exports.intersectArrays = function (a, b) {
+  return a.filter(function (n) {
+    return b.indexOf(n) > -1;
+  });
+};
+
+/**
+ * Convert a row of numbers to an optimized string view.
+ *
+ * @example
+ * [0, -1, .5, .5] → "0-1 .5.5"
+ *
+ * @param {number[]} data
+ * @param {Object} params
+ * @param {string} [command] path data instruction
+ * @return {string}
+ */
+exports.cleanupOutData = function (data, params, command) {
+  var str = '',
+    delimiter,
+    prev;
+
+  data.forEach(function (item, i) {
+    // space delimiter by default
+    delimiter = ' ';
+
+    // no extra space in front of first number
+    if (i == 0) delimiter = '';
+
+    // no extra space after 'arcto' command flags(large-arc and sweep flags)
+    // a20 60 45 0 1 30 20 → a20 60 45 0130 20
+    if (params.noSpaceAfterFlags && (command == 'A' || command == 'a')) {
+      var pos = i % 7;
+      if (pos == 4 || pos == 5) delimiter = '';
+    }
+
+    // remove floating-point numbers leading zeros
+    // 0.5 → .5
+    // -0.5 → -.5
+    const itemStr = params.leadingZero
+      ? removeLeadingZero(item)
+      : item.toString();
+
+    // no extra space in front of negative number or
+    // in front of a floating number if a previous number is floating too
+    if (
+      params.negativeExtraSpace &&
+      delimiter != '' &&
+      (item < 0 || (itemStr.charAt(0) === '.' && prev % 1 !== 0))
+    ) {
+      delimiter = '';
+    }
+    // save prev item value
+    prev = item;
+    str += delimiter + itemStr;
+  });
+  return str;
+};
+
+/**
+ * Remove floating-point numbers leading zero.
+ *
+ * @example
+ * 0.5 → .5
+ *
+ * @example
+ * -0.5 → -.5
+ *
+ * @param {number} num input number
+ *
+ * @return {string} output number as string
+ */
+var removeLeadingZero = function (num) {
+  var strNum = num.toString();
+
+  if (0 < num && num < 1 && strNum.charAt(0) === '0') {
+    strNum = strNum.slice(1);
+  } else if (-1 < num && num < 0 && strNum.charAt(1) === '0') {
+    strNum = strNum.charAt(0) + strNum.slice(2);
+  }
+  return strNum;
+};
+exports.removeLeadingZero = removeLeadingZero;
+
+const parseName = (name) => {
+  if (name == null) {
+    return {
+      prefix: '',
+      local: '',
+    };
+  }
+  if (name === 'xmlns') {
+    return {
+      prefix: 'xmlns',
+      local: '',
+    };
+  }
+  const chunks = name.split(':');
+  if (chunks.length === 1) {
+    return {
+      prefix: '',
+      local: chunks[0],
+    };
+  }
+  return {
+    prefix: chunks[0],
+    local: chunks[1],
+  };
+};
+exports.parseName = parseName;
diff --git a/node_modules/svgo/lib/xast.js b/node_modules/svgo/lib/xast.js
new file mode 100644
index 0000000..9800e2a
--- /dev/null
+++ b/node_modules/svgo/lib/xast.js
@@ -0,0 +1,86 @@
+'use strict';
+
+const { selectAll, selectOne, is } = require('css-select');
+const xastAdaptor = require('./svgo/css-select-adapter.js');
+
+const cssSelectOptions = {
+  xmlMode: true,
+  adapter: xastAdaptor,
+};
+
+const querySelectorAll = (node, selector) => {
+  return selectAll(selector, node, cssSelectOptions);
+};
+exports.querySelectorAll = querySelectorAll;
+
+const querySelector = (node, selector) => {
+  return selectOne(selector, node, cssSelectOptions);
+};
+exports.querySelector = querySelector;
+
+const matches = (node, selector) => {
+  return is(node, selector, cssSelectOptions);
+};
+exports.matches = matches;
+
+const closestByName = (node, name) => {
+  let currentNode = node;
+  while (currentNode) {
+    if (currentNode.type === 'element' && currentNode.name === name) {
+      return currentNode;
+    }
+    currentNode = currentNode.parentNode;
+  }
+  return null;
+};
+exports.closestByName = closestByName;
+
+const traverseBreak = Symbol();
+exports.traverseBreak = traverseBreak;
+
+const traverse = (node, fn) => {
+  if (fn(node) === traverseBreak) {
+    return traverseBreak;
+  }
+  if (node.type === 'root' || node.type === 'element') {
+    for (const child of node.children) {
+      if (traverse(child, fn) === traverseBreak) {
+        return traverseBreak;
+      }
+    }
+  }
+};
+exports.traverse = traverse;
+
+const visit = (node, visitor) => {
+  const callbacks = visitor[node.type];
+  if (callbacks && callbacks.enter) {
+    callbacks.enter(node);
+  }
+  // visit root children
+  if (node.type === 'root') {
+    // copy children array to not loose cursor when children is spliced
+    for (const child of node.children) {
+      visit(child, visitor);
+    }
+  }
+  // visit element children if still attached to parent
+  if (node.type === 'element') {
+    if (node.parentNode.children.includes(node)) {
+      for (const child of node.children) {
+        visit(child, visitor);
+      }
+    }
+  }
+  if (callbacks && callbacks.exit) {
+    callbacks.exit(node);
+  }
+};
+exports.visit = visit;
+
+const detachNodeFromParent = (node) => {
+  const parentNode = node.parentNode;
+  // avoid splice to not break for loops
+  parentNode.children = parentNode.children.filter((child) => child !== node);
+};
+exports.detachNodeFromParent = detachNodeFromParent;
diff --git a/node_modules/svgo/lib/xast.test.js b/node_modules/svgo/lib/xast.test.js
new file mode 100644
index 0000000..0008b93
--- /dev/null
+++ b/node_modules/svgo/lib/xast.test.js
@@ -0,0 +1,108 @@
+'use strict';
+
+const { expect } = require('chai');
+const { visit, detachNodeFromParent } = require('./xast.js');
+
+const getAst = () => {
+  const ast = {
+    type: 'root',
+    children: [
+      {
+        type: 'element',
+        name: 'g',
+        attributes: {},
+        children: [
+          {
+            type: 'element',
+            name: 'rect',
+            attributes: {},
+            children: [],
+          },
+          {
+            type: 'element',
+            name: 'circle',
+            attributes: {},
+            children: [],
+          },
+        ],
+      },
+      {
+        type: 'element',
+        name: 'ellipse',
+        attributes: {},
+        children: [],
+      },
+    ],
+  };
+  ast.children[0].parentNode = ast;
+  ast.children[0].children[0].parentNode = ast.children[0];
+  ast.children[0].children[1].parentNode = ast.children[0];
+  ast.children[1].parentNode = ast;
+  return ast;
+};
+
+describe('xast', () => {
+  it('enter into nodes', () => {
+    const root = getAst();
+    const entered = [];
+    visit(root, {
+      root: {
+        enter: (node) => {
+          entered.push(node.type);
+        },
+      },
+      element: {
+        enter: (node) => {
+          entered.push(`${node.type}:${node.name}`);
+        },
+      },
+    });
+    expect(entered).to.deep.equal([
+      'root',
+      'element:g',
+      'element:rect',
+      'element:circle',
+      'element:ellipse',
+    ]);
+  });
+
+  it('exit from nodes', () => {
+    const root = getAst();
+    const exited = [];
+    visit(root, {
+      root: {
+        exit: (node) => {
+          exited.push(node.type);
+        },
+      },
+      element: {
+        exit: (node) => {
+          exited.push(`${node.type}:${node.name}`);
+        },
+      },
+    });
+    expect(exited).to.deep.equal([
+      'element:rect',
+      'element:circle',
+      'element:g',
+      'element:ellipse',
+      'root',
+    ]);
+  });
+
+  it('skip entering children if node is detached', () => {
+    const root = getAst();
+    const entered = [];
+    visit(root, {
+      element: {
+        enter: (node) => {
+          entered.push(node.name);
+          if (node.name === 'g') {
+            detachNodeFromParent(node);
+          }
+        },
+      },
+    });
+    expect(entered).to.deep.equal(['g', 'ellipse']);
+  });
+});
diff --git a/node_modules/svgo/node_modules/ansi-styles/index.d.ts b/node_modules/svgo/node_modules/ansi-styles/index.d.ts
new file mode 100644
index 0000000..44a907e
--- /dev/null
+++ b/node_modules/svgo/node_modules/ansi-styles/index.d.ts
@@ -0,0 +1,345 @@
+declare type CSSColor =
+	| 'aliceblue'
+	| 'antiquewhite'
+	| 'aqua'
+	| 'aquamarine'
+	| 'azure'
+	| 'beige'
+	| 'bisque'
+	| 'black'
+	| 'blanchedalmond'
+	| 'blue'
+	| 'blueviolet'
+	| 'brown'
+	| 'burlywood'
+	| 'cadetblue'
+	| 'chartreuse'
+	| 'chocolate'
+	| 'coral'
+	| 'cornflowerblue'
+	| 'cornsilk'
+	| 'crimson'
+	| 'cyan'
+	| 'darkblue'
+	| 'darkcyan'
+	| 'darkgoldenrod'
+	| 'darkgray'
+	| 'darkgreen'
+	| 'darkgrey'
+	| 'darkkhaki'
+	| 'darkmagenta'
+	| 'darkolivegreen'
+	| 'darkorange'
+	| 'darkorchid'
+	| 'darkred'
+	| 'darksalmon'
+	| 'darkseagreen'
+	| 'darkslateblue'
+	| 'darkslategray'
+	| 'darkslategrey'
+	| 'darkturquoise'
+	| 'darkviolet'
+	| 'deeppink'
+	| 'deepskyblue'
+	| 'dimgray'
+	| 'dimgrey'
+	| 'dodgerblue'
+	| 'firebrick'
+	| 'floralwhite'
+	| 'forestgreen'
+	| 'fuchsia'
+	| 'gainsboro'
+	| 'ghostwhite'
+	| 'gold'
+	| 'goldenrod'
+	| 'gray'
+	| 'green'
+	| 'greenyellow'
+	| 'grey'
+	| 'honeydew'
+	| 'hotpink'
+	| 'indianred'
+	| 'indigo'
+	| 'ivory'
+	| 'khaki'
+	| 'lavender'
+	| 'lavenderblush'
+	| 'lawngreen'
+	| 'lemonchiffon'
+	| 'lightblue'
+	| 'lightcoral'
+	| 'lightcyan'
+	| 'lightgoldenrodyellow'
+	| 'lightgray'
+	| 'lightgreen'
+	| 'lightgrey'
+	| 'lightpink'
+	| 'lightsalmon'
+	| 'lightseagreen'
+	| 'lightskyblue'
+	| 'lightslategray'
+	| 'lightslategrey'
+	| 'lightsteelblue'
+	| 'lightyellow'
+	| 'lime'
+	| 'limegreen'
+	| 'linen'
+	| 'magenta'
+	| 'maroon'
+	| 'mediumaquamarine'
+	| 'mediumblue'
+	| 'mediumorchid'
+	| 'mediumpurple'
+	| 'mediumseagreen'
+	| 'mediumslateblue'
+	| 'mediumspringgreen'
+	| 'mediumturquoise'
+	| 'mediumvioletred'
+	| 'midnightblue'
+	| 'mintcream'
+	| 'mistyrose'
+	| 'moccasin'
+	| 'navajowhite'
+	| 'navy'
+	| 'oldlace'
+	| 'olive'
+	| 'olivedrab'
+	| 'orange'
+	| 'orangered'
+	| 'orchid'
+	| 'palegoldenrod'
+	| 'palegreen'
+	| 'paleturquoise'
+	| 'palevioletred'
+	| 'papayawhip'
+	| 'peachpuff'
+	| 'peru'
+	| 'pink'
+	| 'plum'
+	| 'powderblue'
+	| 'purple'
+	| 'rebeccapurple'
+	| 'red'
+	| 'rosybrown'
+	| 'royalblue'
+	| 'saddlebrown'
+	| 'salmon'
+	| 'sandybrown'
+	| 'seagreen'
+	| 'seashell'
+	| 'sienna'
+	| 'silver'
+	| 'skyblue'
+	| 'slateblue'
+	| 'slategray'
+	| 'slategrey'
+	| 'snow'
+	| 'springgreen'
+	| 'steelblue'
+	| 'tan'
+	| 'teal'
+	| 'thistle'
+	| 'tomato'
+	| 'turquoise'
+	| 'violet'
+	| 'wheat'
+	| 'white'
+	| 'whitesmoke'
+	| 'yellow'
+	| 'yellowgreen';
+
+declare namespace ansiStyles {
+	interface ColorConvert {
+		/**
+		The RGB color space.
+
+		@param red - (`0`-`255`)
+		@param green - (`0`-`255`)
+		@param blue - (`0`-`255`)
+		*/
+		rgb(red: number, green: number, blue: number): string;
+
+		/**
+		The RGB HEX color space.
+
+		@param hex - A hexadecimal string containing RGB data.
+		*/
+		hex(hex: string): string;
+
+		/**
+		@param keyword - A CSS color name.
+		*/
+		keyword(keyword: CSSColor): string;
+
+		/**
+		The HSL color space.
+
+		@param hue - (`0`-`360`)
+		@param saturation - (`0`-`100`)
+		@param lightness - (`0`-`100`)
+		*/
+		hsl(hue: number, saturation: number, lightness: number): string;
+
+		/**
+		The HSV color space.
+
+		@param hue - (`0`-`360`)
+		@param saturation - (`0`-`100`)
+		@param value - (`0`-`100`)
+		*/
+		hsv(hue: number, saturation: number, value: number): string;
+
+		/**
+		The HSV color space.
+
+		@param hue - (`0`-`360`)
+		@param whiteness - (`0`-`100`)
+		@param blackness - (`0`-`100`)
+		*/
+		hwb(hue: number, whiteness: number, blackness: number): string;
+
+		/**
+		Use a [4-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4-bit) to set text color.
+		*/
+		ansi(ansi: number): string;
+
+		/**
+		Use an [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color.
+		*/
+		ansi256(ansi: number): string;
+	}
+
+	interface CSPair {
+		/**
+		The ANSI terminal control sequence for starting this style.
+		*/
+		readonly open: string;
+
+		/**
+		The ANSI terminal control sequence for ending this style.
+		*/
+		readonly close: string;
+	}
+
+	interface ColorBase {
+		readonly ansi: ColorConvert;
+		readonly ansi256: ColorConvert;
+		readonly ansi16m: ColorConvert;
+
+		/**
+		The ANSI terminal control sequence for ending this color.
+		*/
+		readonly close: string;
+	}
+
+	interface Modifier {
+		/**
+		Resets the current color chain.
+		*/
+		readonly reset: CSPair;
+
+		/**
+		Make text bold.
+		*/
+		readonly bold: CSPair;
+
+		/**
+		Emitting only a small amount of light.
+		*/
+		readonly dim: CSPair;
+
+		/**
+		Make text italic. (Not widely supported)
+		*/
+		readonly italic: CSPair;
+
+		/**
+		Make text underline. (Not widely supported)
+		*/
+		readonly underline: CSPair;
+
+		/**
+		Inverse background and foreground colors.
+		*/
+		readonly inverse: CSPair;
+
+		/**
+		Prints the text, but makes it invisible.
+		*/
+		readonly hidden: CSPair;
+
+		/**
+		Puts a horizontal line through the center of the text. (Not widely supported)
+		*/
+		readonly strikethrough: CSPair;
+	}
+
+	interface ForegroundColor {
+		readonly black: CSPair;
+		readonly red: CSPair;
+		readonly green: CSPair;
+		readonly yellow: CSPair;
+		readonly blue: CSPair;
+		readonly cyan: CSPair;
+		readonly magenta: CSPair;
+		readonly white: CSPair;
+
+		/**
+		Alias for `blackBright`.
+		*/
+		readonly gray: CSPair;
+
+		/**
+		Alias for `blackBright`.
+		*/
+		readonly grey: CSPair;
+
+		readonly blackBright: CSPair;
+		readonly redBright: CSPair;
+		readonly greenBright: CSPair;
+		readonly yellowBright: CSPair;
+		readonly blueBright: CSPair;
+		readonly cyanBright: CSPair;
+		readonly magentaBright: CSPair;
+		readonly whiteBright: CSPair;
+	}
+
+	interface BackgroundColor {
+		readonly bgBlack: CSPair;
+		readonly bgRed: CSPair;
+		readonly bgGreen: CSPair;
+		readonly bgYellow: CSPair;
+		readonly bgBlue: CSPair;
+		readonly bgCyan: CSPair;
+		readonly bgMagenta: CSPair;
+		readonly bgWhite: CSPair;
+
+		/**
+		Alias for `bgBlackBright`.
+		*/
+		readonly bgGray: CSPair;
+
+		/**
+		Alias for `bgBlackBright`.
+		*/
+		readonly bgGrey: CSPair;
+
+		readonly bgBlackBright: CSPair;
+		readonly bgRedBright: CSPair;
+		readonly bgGreenBright: CSPair;
+		readonly bgYellowBright: CSPair;
+		readonly bgBlueBright: CSPair;
+		readonly bgCyanBright: CSPair;
+		readonly bgMagentaBright: CSPair;
+		readonly bgWhiteBright: CSPair;
+	}
+}
+
+declare const ansiStyles: {
+	readonly modifier: ansiStyles.Modifier;
+	readonly color: ansiStyles.ForegroundColor & ansiStyles.ColorBase;
+	readonly bgColor: ansiStyles.BackgroundColor & ansiStyles.ColorBase;
+	readonly codes: ReadonlyMap<number, number>;
+} & ansiStyles.BackgroundColor & ansiStyles.ForegroundColor & ansiStyles.Modifier;
+
+export = ansiStyles;
diff --git a/node_modules/svgo/node_modules/ansi-styles/index.js b/node_modules/svgo/node_modules/ansi-styles/index.js
new file mode 100644
index 0000000..5d82581
--- /dev/null
+++ b/node_modules/svgo/node_modules/ansi-styles/index.js
@@ -0,0 +1,163 @@
+'use strict';
+
+const wrapAnsi16 = (fn, offset) => (...args) => {
+	const code = fn(...args);
+	return `\u001B[${code + offset}m`;
+};
+
+const wrapAnsi256 = (fn, offset) => (...args) => {
+	const code = fn(...args);
+	return `\u001B[${38 + offset};5;${code}m`;
+};
+
+const wrapAnsi16m = (fn, offset) => (...args) => {
+	const rgb = fn(...args);
+	return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;
+};
+
+const ansi2ansi = n => n;
+const rgb2rgb = (r, g, b) => [r, g, b];
+
+const setLazyProperty = (object, property, get) => {
+	Object.defineProperty(object, property, {
+		get: () => {
+			const value = get();
+
+			Object.defineProperty(object, property, {
+				value,
+				enumerable: true,
+				configurable: true
+			});
+
+			return value;
+		},
+		enumerable: true,
+		configurable: true
+	});
+};
+
+/** @type {typeof import('color-convert')} */
+let colorConvert;
+const makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => {
+	if (colorConvert === undefined) {
+		colorConvert = require('color-convert');
+	}
+
+	const offset = isBackground ? 10 : 0;
+	const styles = {};
+
+	for (const [sourceSpace, suite] of Object.entries(colorConvert)) {
+		const name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace;
+		if (sourceSpace === targetSpace) {
+			styles[name] = wrap(identity, offset);
+		} else if (typeof suite === 'object') {
+			styles[name] = wrap(suite[targetSpace], offset);
+		}
+	}
+
+	return styles;
+};
+
+function assembleStyles() {
+	const codes = new Map();
+	const styles = {
+		modifier: {
+			reset: [0, 0],
+			// 21 isn't widely supported and 22 does the same thing
+			bold: [1, 22],
+			dim: [2, 22],
+			italic: [3, 23],
+			underline: [4, 24],
+			inverse: [7, 27],
+			hidden: [8, 28],
+			strikethrough: [9, 29]
+		},
+		color: {
+			black: [30, 39],
+			red: [31, 39],
+			green: [32, 39],
+			yellow: [33, 39],
+			blue: [34, 39],
+			magenta: [35, 39],
+			cyan: [36, 39],
+			white: [37, 39],
+
+			// Bright color
+			blackBright: [90, 39],
+			redBright: [91, 39],
+			greenBright: [92, 39],
+			yellowBright: [93, 39],
+			blueBright: [94, 39],
+			magentaBright: [95, 39],
+			cyanBright: [96, 39],
+			whiteBright: [97, 39]
+		},
+		bgColor: {
+			bgBlack: [40, 49],
+			bgRed: [41, 49],
+			bgGreen: [42, 49],
+			bgYellow: [43, 49],
+			bgBlue: [44, 49],
+			bgMagenta: [45, 49],
+			bgCyan: [46, 49],
+			bgWhite: [47, 49],
+
+			// Bright color
+			bgBlackBright: [100, 49],
+			bgRedBright: [101, 49],
+			bgGreenBright: [102, 49],
+			bgYellowBright: [103, 49],
+			bgBlueBright: [104, 49],
+			bgMagentaBright: [105, 49],
+			bgCyanBright: [106, 49],
+			bgWhiteBright: [107, 49]
+		}
+	};
+
+	// Alias bright black as gray (and grey)
+	styles.color.gray = styles.color.blackBright;
+	styles.bgColor.bgGray = styles.bgColor.bgBlackBright;
+	styles.color.grey = styles.color.blackBright;
+	styles.bgColor.bgGrey = styles.bgColor.bgBlackBright;
+
+	for (const [groupName, group] of Object.entries(styles)) {
+		for (const [styleName, style] of Object.entries(group)) {
+			styles[styleName] = {
+				open: `\u001B[${style[0]}m`,
+				close: `\u001B[${style[1]}m`
+			};
+
+			group[styleName] = styles[styleName];
+
+			codes.set(style[0], style[1]);
+		}
+
+		Object.defineProperty(styles, groupName, {
+			value: group,
+			enumerable: false
+		});
+	}
+
+	Object.defineProperty(styles, 'codes', {
+		value: codes,
+		enumerable: false
+	});
+
+	styles.color.close = '\u001B[39m';
+	styles.bgColor.close = '\u001B[49m';
+
+	setLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false));
+	setLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false));
+	setLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false));
+	setLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true));
+	setLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true));
+	setLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true));
+
+	return styles;
+}
+
+// Make the export immutable
+Object.defineProperty(module, 'exports', {
+	enumerable: true,
+	get: assembleStyles
+});
diff --git a/node_modules/svgo/node_modules/ansi-styles/license b/node_modules/svgo/node_modules/ansi-styles/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/node_modules/svgo/node_modules/ansi-styles/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/svgo/node_modules/ansi-styles/package.json b/node_modules/svgo/node_modules/ansi-styles/package.json
new file mode 100644
index 0000000..71ec137
--- /dev/null
+++ b/node_modules/svgo/node_modules/ansi-styles/package.json
@@ -0,0 +1,56 @@
+{
+  "name": "ansi-styles",
+  "version": "4.3.0",
+  "description": "ANSI escape codes for styling strings in the terminal",
+  "license": "MIT",
+  "repository": "chalk/ansi-styles",
+  "funding": "https://github.com/chalk/ansi-styles?sponsor=1",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=8"
+  },
+  "scripts": {
+    "test": "xo && ava && tsd",
+    "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor"
+  },
+  "files": [
+    "index.js",
+    "index.d.ts"
+  ],
+  "keywords": [
+    "ansi",
+    "styles",
+    "color",
+    "colour",
+    "colors",
+    "terminal",
+    "console",
+    "cli",
+    "string",
+    "tty",
+    "escape",
+    "formatting",
+    "rgb",
+    "256",
+    "shell",
+    "xterm",
+    "log",
+    "logging",
+    "command-line",
+    "text"
+  ],
+  "dependencies": {
+    "color-convert": "^2.0.1"
+  },
+  "devDependencies": {
+    "@types/color-convert": "^1.9.0",
+    "ava": "^2.3.0",
+    "svg-term-cli": "^2.1.1",
+    "tsd": "^0.11.0",
+    "xo": "^0.25.3"
+  }
+}
diff --git a/node_modules/svgo/node_modules/ansi-styles/readme.md b/node_modules/svgo/node_modules/ansi-styles/readme.md
new file mode 100644
index 0000000..24883de
--- /dev/null
+++ b/node_modules/svgo/node_modules/ansi-styles/readme.md
@@ -0,0 +1,152 @@
+# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles)
+
+> [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal
+
+You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings.
+
+<img src="screenshot.svg" width="900">
+
+## Install
+
+```
+$ npm install ansi-styles
+```
+
+## Usage
+
+```js
+const style = require('ansi-styles');
+
+console.log(`${style.green.open}Hello world!${style.green.close}`);
+
+
+// Color conversion between 16/256/truecolor
+// NOTE: If conversion goes to 16 colors or 256 colors, the original color
+//       may be degraded to fit that color palette. This means terminals
+//       that do not support 16 million colors will best-match the
+//       original color.
+console.log(style.bgColor.ansi.hsl(120, 80, 72) + 'Hello world!' + style.bgColor.close);
+console.log(style.color.ansi256.rgb(199, 20, 250) + 'Hello world!' + style.color.close);
+console.log(style.color.ansi16m.hex('#abcdef') + 'Hello world!' + style.color.close);
+```
+
+## API
+
+Each style has an `open` and `close` property.
+
+## Styles
+
+### Modifiers
+
+- `reset`
+- `bold`
+- `dim`
+- `italic` *(Not widely supported)*
+- `underline`
+- `inverse`
+- `hidden`
+- `strikethrough` *(Not widely supported)*
+
+### Colors
+
+- `black`
+- `red`
+- `green`
+- `yellow`
+- `blue`
+- `magenta`
+- `cyan`
+- `white`
+- `blackBright` (alias: `gray`, `grey`)
+- `redBright`
+- `greenBright`
+- `yellowBright`
+- `blueBright`
+- `magentaBright`
+- `cyanBright`
+- `whiteBright`
+
+### Background colors
+
+- `bgBlack`
+- `bgRed`
+- `bgGreen`
+- `bgYellow`
+- `bgBlue`
+- `bgMagenta`
+- `bgCyan`
+- `bgWhite`
+- `bgBlackBright` (alias: `bgGray`, `bgGrey`)
+- `bgRedBright`
+- `bgGreenBright`
+- `bgYellowBright`
+- `bgBlueBright`
+- `bgMagentaBright`
+- `bgCyanBright`
+- `bgWhiteBright`
+
+## Advanced usage
+
+By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module.
+
+- `style.modifier`
+- `style.color`
+- `style.bgColor`
+
+###### Example
+
+```js
+console.log(style.color.green.open);
+```
+
+Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values.
+
+###### Example
+
+```js
+console.log(style.codes.get(36));
+//=> 39
+```
+
+## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728)
+
+`ansi-styles` uses the [`color-convert`](https://github.com/Qix-/color-convert) package to allow for converting between various colors and ANSI escapes, with support for 256 and 16 million colors.
+
+The following color spaces from `color-convert` are supported:
+
+- `rgb`
+- `hex`
+- `keyword`
+- `hsl`
+- `hsv`
+- `hwb`
+- `ansi`
+- `ansi256`
+
+To use these, call the associated conversion function with the intended output, for example:
+
+```js
+style.color.ansi.rgb(100, 200, 15); // RGB to 16 color ansi foreground code
+style.bgColor.ansi.rgb(100, 200, 15); // RGB to 16 color ansi background code
+
+style.color.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code
+style.bgColor.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code
+
+style.color.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color foreground code
+style.bgColor.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color background code
+```
+
+## Related
+
+- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal
+
+## Maintainers
+
+- [Sindre Sorhus](https://github.com/sindresorhus)
+- [Josh Junon](https://github.com/qix-)
+
+## For enterprise
+
+Available as part of the Tidelift Subscription.
+
+The maintainers of `ansi-styles` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-ansi-styles?utm_source=npm-ansi-styles&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
diff --git a/node_modules/svgo/node_modules/chalk/index.d.ts b/node_modules/svgo/node_modules/chalk/index.d.ts
new file mode 100644
index 0000000..9cd88f3
--- /dev/null
+++ b/node_modules/svgo/node_modules/chalk/index.d.ts
@@ -0,0 +1,415 @@
+/**
+Basic foreground colors.
+
+[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support)
+*/
+declare type ForegroundColor =
+	| 'black'
+	| 'red'
+	| 'green'
+	| 'yellow'
+	| 'blue'
+	| 'magenta'
+	| 'cyan'
+	| 'white'
+	| 'gray'
+	| 'grey'
+	| 'blackBright'
+	| 'redBright'
+	| 'greenBright'
+	| 'yellowBright'
+	| 'blueBright'
+	| 'magentaBright'
+	| 'cyanBright'
+	| 'whiteBright';
+
+/**
+Basic background colors.
+
+[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support)
+*/
+declare type BackgroundColor =
+	| 'bgBlack'
+	| 'bgRed'
+	| 'bgGreen'
+	| 'bgYellow'
+	| 'bgBlue'
+	| 'bgMagenta'
+	| 'bgCyan'
+	| 'bgWhite'
+	| 'bgGray'
+	| 'bgGrey'
+	| 'bgBlackBright'
+	| 'bgRedBright'
+	| 'bgGreenBright'
+	| 'bgYellowBright'
+	| 'bgBlueBright'
+	| 'bgMagentaBright'
+	| 'bgCyanBright'
+	| 'bgWhiteBright';
+
+/**
+Basic colors.
+
+[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support)
+*/
+declare type Color = ForegroundColor | BackgroundColor;
+
+declare type Modifiers =
+	| 'reset'
+	| 'bold'
+	| 'dim'
+	| 'italic'
+	| 'underline'
+	| 'inverse'
+	| 'hidden'
+	| 'strikethrough'
+	| 'visible';
+
+declare namespace chalk {
+	/**
+	Levels:
+	- `0` - All colors disabled.
+	- `1` - Basic 16 colors support.
+	- `2` - ANSI 256 colors support.
+	- `3` - Truecolor 16 million colors support.
+	*/
+	type Level = 0 | 1 | 2 | 3;
+
+	interface Options {
+		/**
+		Specify the color support for Chalk.
+
+		By default, color support is automatically detected based on the environment.
+
+		Levels:
+		- `0` - All colors disabled.
+		- `1` - Basic 16 colors support.
+		- `2` - ANSI 256 colors support.
+		- `3` - Truecolor 16 million colors support.
+		*/
+		level?: Level;
+	}
+
+	/**
+	Return a new Chalk instance.
+	*/
+	type Instance = new (options?: Options) => Chalk;
+
+	/**
+	Detect whether the terminal supports color.
+	*/
+	interface ColorSupport {
+		/**
+		The color level used by Chalk.
+		*/
+		level: Level;
+
+		/**
+		Return whether Chalk supports basic 16 colors.
+		*/
+		hasBasic: boolean;
+
+		/**
+		Return whether Chalk supports ANSI 256 colors.
+		*/
+		has256: boolean;
+
+		/**
+		Return whether Chalk supports Truecolor 16 million colors.
+		*/
+		has16m: boolean;
+	}
+
+	interface ChalkFunction {
+		/**
+		Use a template string.
+
+		@remarks Template literals are unsupported for nested calls (see [issue #341](https://github.com/chalk/chalk/issues/341))
+
+		@example
+		```
+		import chalk = require('chalk');
+
+		log(chalk`
+		CPU: {red ${cpu.totalPercent}%}
+		RAM: {green ${ram.used / ram.total * 100}%}
+		DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%}
+		`);
+		```
+
+		@example
+		```
+		import chalk = require('chalk');
+
+		log(chalk.red.bgBlack`2 + 3 = {bold ${2 + 3}}`)
+		```
+		*/
+		(text: TemplateStringsArray, ...placeholders: unknown[]): string;
+
+		(...text: unknown[]): string;
+	}
+
+	interface Chalk extends ChalkFunction {
+		/**
+		Return a new Chalk instance.
+		*/
+		Instance: Instance;
+
+		/**
+		The color support for Chalk.
+
+		By default, color support is automatically detected based on the environment.
+
+		Levels:
+		- `0` - All colors disabled.
+		- `1` - Basic 16 colors support.
+		- `2` - ANSI 256 colors support.
+		- `3` - Truecolor 16 million colors support.
+		*/
+		level: Level;
+
+		/**
+		Use HEX value to set text color.
+
+		@param color - Hexadecimal value representing the desired color.
+
+		@example
+		```
+		import chalk = require('chalk');
+
+		chalk.hex('#DEADED');
+		```
+		*/
+		hex(color: string): Chalk;
+
+		/**
+		Use keyword color value to set text color.
+
+		@param color - Keyword value representing the desired color.
+
+		@example
+		```
+		import chalk = require('chalk');
+
+		chalk.keyword('orange');
+		```
+		*/
+		keyword(color: string): Chalk;
+
+		/**
+		Use RGB values to set text color.
+		*/
+		rgb(red: number, green: number, blue: number): Chalk;
+
+		/**
+		Use HSL values to set text color.
+		*/
+		hsl(hue: number, saturation: number, lightness: number): Chalk;
+
+		/**
+		Use HSV values to set text color.
+		*/
+		hsv(hue: number, saturation: number, value: number): Chalk;
+
+		/**
+		Use HWB values to set text color.
+		*/
+		hwb(hue: number, whiteness: number, blackness: number): Chalk;
+
+		/**
+		Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set text color.
+
+		30 <= code && code < 38 || 90 <= code && code < 98
+		For example, 31 for red, 91 for redBright.
+		*/
+		ansi(code: number): Chalk;
+
+		/**
+		Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color.
+		*/
+		ansi256(index: number): Chalk;
+
+		/**
+		Use HEX value to set background color.
+
+		@param color - Hexadecimal value representing the desired color.
+
+		@example
+		```
+		import chalk = require('chalk');
+
+		chalk.bgHex('#DEADED');
+		```
+		*/
+		bgHex(color: string): Chalk;
+
+		/**
+		Use keyword color value to set background color.
+
+		@param color - Keyword value representing the desired color.
+
+		@example
+		```
+		import chalk = require('chalk');
+
+		chalk.bgKeyword('orange');
+		```
+		*/
+		bgKeyword(color: string): Chalk;
+
+		/**
+		Use RGB values to set background color.
+		*/
+		bgRgb(red: number, green: number, blue: number): Chalk;
+
+		/**
+		Use HSL values to set background color.
+		*/
+		bgHsl(hue: number, saturation: number, lightness: number): Chalk;
+
+		/**
+		Use HSV values to set background color.
+		*/
+		bgHsv(hue: number, saturation: number, value: number): Chalk;
+
+		/**
+		Use HWB values to set background color.
+		*/
+		bgHwb(hue: number, whiteness: number, blackness: number): Chalk;
+
+		/**
+		Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set background color.
+
+		30 <= code && code < 38 || 90 <= code && code < 98
+		For example, 31 for red, 91 for redBright.
+		Use the foreground code, not the background code (for example, not 41, nor 101).
+		*/
+		bgAnsi(code: number): Chalk;
+
+		/**
+		Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set background color.
+		*/
+		bgAnsi256(index: number): Chalk;
+
+		/**
+		Modifier: Resets the current color chain.
+		*/
+		readonly reset: Chalk;
+
+		/**
+		Modifier: Make text bold.
+		*/
+		readonly bold: Chalk;
+
+		/**
+		Modifier: Emitting only a small amount of light.
+		*/
+		readonly dim: Chalk;
+
+		/**
+		Modifier: Make text italic. (Not widely supported)
+		*/
+		readonly italic: Chalk;
+
+		/**
+		Modifier: Make text underline. (Not widely supported)
+		*/
+		readonly underline: Chalk;
+
+		/**
+		Modifier: Inverse background and foreground colors.
+		*/
+		readonly inverse: Chalk;
+
+		/**
+		Modifier: Prints the text, but makes it invisible.
+		*/
+		readonly hidden: Chalk;
+
+		/**
+		Modifier: Puts a horizontal line through the center of the text. (Not widely supported)
+		*/
+		readonly strikethrough: Chalk;
+
+		/**
+		Modifier: Prints the text only when Chalk has a color support level > 0.
+		Can be useful for things that are purely cosmetic.
+		*/
+		readonly visible: Chalk;
+
+		readonly black: Chalk;
+		readonly red: Chalk;
+		readonly green: Chalk;
+		readonly yellow: Chalk;
+		readonly blue: Chalk;
+		readonly magenta: Chalk;
+		readonly cyan: Chalk;
+		readonly white: Chalk;
+
+		/*
+		Alias for `blackBright`.
+		*/
+		readonly gray: Chalk;
+
+		/*
+		Alias for `blackBright`.
+		*/
+		readonly grey: Chalk;
+
+		readonly blackBright: Chalk;
+		readonly redBright: Chalk;
+		readonly greenBright: Chalk;
+		readonly yellowBright: Chalk;
+		readonly blueBright: Chalk;
+		readonly magentaBright: Chalk;
+		readonly cyanBright: Chalk;
+		readonly whiteBright: Chalk;
+
+		readonly bgBlack: Chalk;
+		readonly bgRed: Chalk;
+		readonly bgGreen: Chalk;
+		readonly bgYellow: Chalk;
+		readonly bgBlue: Chalk;
+		readonly bgMagenta: Chalk;
+		readonly bgCyan: Chalk;
+		readonly bgWhite: Chalk;
+
+		/*
+		Alias for `bgBlackBright`.
+		*/
+		readonly bgGray: Chalk;
+
+		/*
+		Alias for `bgBlackBright`.
+		*/
+		readonly bgGrey: Chalk;
+
+		readonly bgBlackBright: Chalk;
+		readonly bgRedBright: Chalk;
+		readonly bgGreenBright: Chalk;
+		readonly bgYellowBright: Chalk;
+		readonly bgBlueBright: Chalk;
+		readonly bgMagentaBright: Chalk;
+		readonly bgCyanBright: Chalk;
+		readonly bgWhiteBright: Chalk;
+	}
+}
+
+/**
+Main Chalk object that allows to chain styles together.
+Call the last one as a method with a string argument.
+Order doesn't matter, and later styles take precedent in case of a conflict.
+This simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`.
+*/
+declare const chalk: chalk.Chalk & chalk.ChalkFunction & {
+	supportsColor: chalk.ColorSupport | false;
+	Level: chalk.Level;
+	Color: Color;
+	ForegroundColor: ForegroundColor;
+	BackgroundColor: BackgroundColor;
+	Modifiers: Modifiers;
+	stderr: chalk.Chalk & {supportsColor: chalk.ColorSupport | false};
+};
+
+export = chalk;
diff --git a/node_modules/svgo/node_modules/chalk/license b/node_modules/svgo/node_modules/chalk/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/node_modules/svgo/node_modules/chalk/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/svgo/node_modules/chalk/package.json b/node_modules/svgo/node_modules/chalk/package.json
new file mode 100644
index 0000000..ea99b08
--- /dev/null
+++ b/node_modules/svgo/node_modules/chalk/package.json
@@ -0,0 +1,68 @@
+{
+  "name": "chalk",
+  "version": "4.1.1",
+  "description": "Terminal string styling done right",
+  "license": "MIT",
+  "repository": "chalk/chalk",
+  "funding": "https://github.com/chalk/chalk?sponsor=1",
+  "main": "source",
+  "engines": {
+    "node": ">=10"
+  },
+  "scripts": {
+    "test": "xo && nyc ava && tsd",
+    "bench": "matcha benchmark.js"
+  },
+  "files": [
+    "source",
+    "index.d.ts"
+  ],
+  "keywords": [
+    "color",
+    "colour",
+    "colors",
+    "terminal",
+    "console",
+    "cli",
+    "string",
+    "str",
+    "ansi",
+    "style",
+    "styles",
+    "tty",
+    "formatting",
+    "rgb",
+    "256",
+    "shell",
+    "xterm",
+    "log",
+    "logging",
+    "command-line",
+    "text"
+  ],
+  "dependencies": {
+    "ansi-styles": "^4.1.0",
+    "supports-color": "^7.1.0"
+  },
+  "devDependencies": {
+    "ava": "^2.4.0",
+    "coveralls": "^3.0.7",
+    "execa": "^4.0.0",
+    "import-fresh": "^3.1.0",
+    "matcha": "^0.7.0",
+    "nyc": "^15.0.0",
+    "resolve-from": "^5.0.0",
+    "tsd": "^0.7.4",
+    "xo": "^0.28.2"
+  },
+  "xo": {
+    "rules": {
+      "unicorn/prefer-string-slice": "off",
+      "unicorn/prefer-includes": "off",
+      "@typescript-eslint/member-ordering": "off",
+      "no-redeclare": "off",
+      "unicorn/string-content": "off",
+      "unicorn/better-regex": "off"
+    }
+  }
+}
diff --git a/node_modules/svgo/node_modules/chalk/readme.md b/node_modules/svgo/node_modules/chalk/readme.md
new file mode 100644
index 0000000..8512592
--- /dev/null
+++ b/node_modules/svgo/node_modules/chalk/readme.md
@@ -0,0 +1,335 @@
+<h1 align="center">
+	<br>
+	<br>
+	<img width="320" src="media/logo.svg" alt="Chalk">
+	<br>
+	<br>
+	<br>
+</h1>
+
+> Terminal string styling done right
+
+[![Build Status](https://travis-ci.org/chalk/chalk.svg?branch=master)](https://travis-ci.org/chalk/chalk) [![Coverage Status](https://coveralls.io/repos/github/chalk/chalk/badge.svg?branch=master)](https://coveralls.io/github/chalk/chalk?branch=master) [![npm dependents](https://badgen.net/npm/dependents/chalk)](https://www.npmjs.com/package/chalk?activeTab=dependents) [![Downloads](https://badgen.net/npm/dt/chalk)](https://www.npmjs.com/package/chalk) [![](https://img.shields.io/badge/unicorn-approved-ff69b4.svg)](https://www.youtube.com/watch?v=9auOCbH5Ns4) [![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/xojs/xo) ![TypeScript-ready](https://img.shields.io/npm/types/chalk.svg) [![run on repl.it](https://repl.it/badge/github/chalk/chalk)](https://repl.it/github/chalk/chalk)
+
+<img src="https://cdn.jsdelivr.net/gh/chalk/ansi-styles@8261697c95bf34b6c7767e2cbe9941a851d59385/screenshot.svg" width="900">
+
+<br>
+
+---
+
+<div align="center">
+	<p>
+		<p>
+			<sup>
+				Sindre Sorhus' open source work is supported by the community on <a href="https://github.com/sponsors/sindresorhus">GitHub Sponsors</a> and <a href="https://stakes.social/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15">Dev</a>
+			</sup>
+		</p>
+		<sup>Special thanks to:</sup>
+		<br>
+		<br>
+		<a href="https://standardresume.co/tech">
+			<img src="https://sindresorhus.com/assets/thanks/standard-resume-logo.svg" width="160"/>
+		</a>
+		<br>
+		<br>
+		<a href="https://retool.com/?utm_campaign=sindresorhus">
+			<img src="https://sindresorhus.com/assets/thanks/retool-logo.svg" width="210"/>
+		</a>
+		<br>
+		<br>
+		<a href="https://doppler.com/?utm_campaign=github_repo&utm_medium=referral&utm_content=chalk&utm_source=github">
+			<div>
+				<img src="https://dashboard.doppler.com/imgs/logo-long.svg" width="240" alt="Doppler">
+			</div>
+			<b>All your environment variables, in one place</b>
+			<div>
+				<span>Stop struggling with scattered API keys, hacking together home-brewed tools,</span>
+				<br>
+				<span>and avoiding access controls. Keep your team and servers in sync with Doppler.</span>
+			</div>
+		</a>
+	</p>
+</div>
+
+---
+
+<br>
+
+## Highlights
+
+- Expressive API
+- Highly performant
+- Ability to nest styles
+- [256/Truecolor color support](#256-and-truecolor-color-support)
+- Auto-detects color support
+- Doesn't extend `String.prototype`
+- Clean and focused
+- Actively maintained
+- [Used by ~50,000 packages](https://www.npmjs.com/browse/depended/chalk) as of January 1, 2020
+
+## Install
+
+```console
+$ npm install chalk
+```
+
+## Usage
+
+```js
+const chalk = require('chalk');
+
+console.log(chalk.blue('Hello world!'));
+```
+
+Chalk comes with an easy to use composable API where you just chain and nest the styles you want.
+
+```js
+const chalk = require('chalk');
+const log = console.log;
+
+// Combine styled and normal strings
+log(chalk.blue('Hello') + ' World' + chalk.red('!'));
+
+// Compose multiple styles using the chainable API
+log(chalk.blue.bgRed.bold('Hello world!'));
+
+// Pass in multiple arguments
+log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz'));
+
+// Nest styles
+log(chalk.red('Hello', chalk.underline.bgBlue('world') + '!'));
+
+// Nest styles of the same type even (color, underline, background)
+log(chalk.green(
+	'I am a green line ' +
+	chalk.blue.underline.bold('with a blue substring') +
+	' that becomes green again!'
+));
+
+// ES2015 template literal
+log(`
+CPU: ${chalk.red('90%')}
+RAM: ${chalk.green('40%')}
+DISK: ${chalk.yellow('70%')}
+`);
+
+// ES2015 tagged template literal
+log(chalk`
+CPU: {red ${cpu.totalPercent}%}
+RAM: {green ${ram.used / ram.total * 100}%}
+DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%}
+`);
+
+// Use RGB colors in terminal emulators that support it.
+log(chalk.keyword('orange')('Yay for orange colored text!'));
+log(chalk.rgb(123, 45, 67).underline('Underlined reddish color'));
+log(chalk.hex('#DEADED').bold('Bold gray!'));
+```
+
+Easily define your own themes:
+
+```js
+const chalk = require('chalk');
+
+const error = chalk.bold.red;
+const warning = chalk.keyword('orange');
+
+console.log(error('Error!'));
+console.log(warning('Warning!'));
+```
+
+Take advantage of console.log [string substitution](https://nodejs.org/docs/latest/api/console.html#console_console_log_data_args):
+
+```js
+const name = 'Sindre';
+console.log(chalk.green('Hello %s'), name);
+//=> 'Hello Sindre'
+```
+
+## API
+
+### chalk.`<style>[.<style>...](string, [string...])`
+
+Example: `chalk.red.bold.underline('Hello', 'world');`
+
+Chain [styles](#styles) and call the last one as a method with a string argument. Order doesn't matter, and later styles take precedent in case of a conflict. This simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`.
+
+Multiple arguments will be separated by space.
+
+### chalk.level
+
+Specifies the level of color support.
+
+Color support is automatically detected, but you can override it by setting the `level` property. You should however only do this in your own code as it applies globally to all Chalk consumers.
+
+If you need to change this in a reusable module, create a new instance:
+
+```js
+const ctx = new chalk.Instance({level: 0});
+```
+
+| Level | Description |
+| :---: | :--- |
+| `0` | All colors disabled |
+| `1` | Basic color support (16 colors) |
+| `2` | 256 color support |
+| `3` | Truecolor support (16 million colors) |
+
+### chalk.supportsColor
+
+Detect whether the terminal [supports color](https://github.com/chalk/supports-color). Used internally and handled for you, but exposed for convenience.
+
+Can be overridden by the user with the flags `--color` and `--no-color`. For situations where using `--color` is not possible, use the environment variable `FORCE_COLOR=1` (level 1), `FORCE_COLOR=2` (level 2), or `FORCE_COLOR=3` (level 3) to forcefully enable color, or `FORCE_COLOR=0` to forcefully disable. The use of `FORCE_COLOR` overrides all other color support checks.
+
+Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color=16m` flags, respectively.
+
+### chalk.stderr and chalk.stderr.supportsColor
+
+`chalk.stderr` contains a separate instance configured with color support detected for `stderr` stream instead of `stdout`. Override rules from `chalk.supportsColor` apply to this too. `chalk.stderr.supportsColor` is exposed for convenience.
+
+## Styles
+
+### Modifiers
+
+- `reset` - Resets the current color chain.
+- `bold` - Make text bold.
+- `dim` - Emitting only a small amount of light.
+- `italic` - Make text italic. *(Not widely supported)*
+- `underline` - Make text underline. *(Not widely supported)*
+- `inverse`- Inverse background and foreground colors.
+- `hidden` - Prints the text, but makes it invisible.
+- `strikethrough` - Puts a horizontal line through the center of the text. *(Not widely supported)*
+- `visible`- Prints the text only when Chalk has a color level > 0. Can be useful for things that are purely cosmetic.
+
+### Colors
+
+- `black`
+- `red`
+- `green`
+- `yellow`
+- `blue`
+- `magenta`
+- `cyan`
+- `white`
+- `blackBright` (alias: `gray`, `grey`)
+- `redBright`
+- `greenBright`
+- `yellowBright`
+- `blueBright`
+- `magentaBright`
+- `cyanBright`
+- `whiteBright`
+
+### Background colors
+
+- `bgBlack`
+- `bgRed`
+- `bgGreen`
+- `bgYellow`
+- `bgBlue`
+- `bgMagenta`
+- `bgCyan`
+- `bgWhite`
+- `bgBlackBright` (alias: `bgGray`, `bgGrey`)
+- `bgRedBright`
+- `bgGreenBright`
+- `bgYellowBright`
+- `bgBlueBright`
+- `bgMagentaBright`
+- `bgCyanBright`
+- `bgWhiteBright`
+
+## Tagged template literal
+
+Chalk can be used as a [tagged template literal](https://exploringjs.com/es6/ch_template-literals.html#_tagged-template-literals).
+
+```js
+const chalk = require('chalk');
+
+const miles = 18;
+const calculateFeet = miles => miles * 5280;
+
+console.log(chalk`
+	There are {bold 5280 feet} in a mile.
+	In {bold ${miles} miles}, there are {green.bold ${calculateFeet(miles)} feet}.
+`);
+```
+
+Blocks are delimited by an opening curly brace (`{`), a style, some content, and a closing curly brace (`}`).
+
+Template styles are chained exactly like normal Chalk styles. The following three statements are equivalent:
+
+```js
+console.log(chalk.bold.rgb(10, 100, 200)('Hello!'));
+console.log(chalk.bold.rgb(10, 100, 200)`Hello!`);
+console.log(chalk`{bold.rgb(10,100,200) Hello!}`);
+```
+
+Note that function styles (`rgb()`, `hsl()`, `keyword()`, etc.) may not contain spaces between parameters.
+
+All interpolated values (`` chalk`${foo}` ``) are converted to strings via the `.toString()` method. All curly braces (`{` and `}`) in interpolated value strings are escaped.
+
+## 256 and Truecolor color support
+
+Chalk supports 256 colors and [Truecolor](https://gist.github.com/XVilka/8346728) (16 million colors) on supported terminal apps.
+
+Colors are downsampled from 16 million RGB values to an ANSI color format that is supported by the terminal emulator (or by specifying `{level: n}` as a Chalk option). For example, Chalk configured to run at level 1 (basic color support) will downsample an RGB value of #FF0000 (red) to 31 (ANSI escape for red).
+
+Examples:
+
+- `chalk.hex('#DEADED').underline('Hello, world!')`
+- `chalk.keyword('orange')('Some orange text')`
+- `chalk.rgb(15, 100, 204).inverse('Hello!')`
+
+Background versions of these models are prefixed with `bg` and the first level of the module capitalized (e.g. `keyword` for foreground colors and `bgKeyword` for background colors).
+
+- `chalk.bgHex('#DEADED').underline('Hello, world!')`
+- `chalk.bgKeyword('orange')('Some orange text')`
+- `chalk.bgRgb(15, 100, 204).inverse('Hello!')`
+
+The following color models can be used:
+
+- [`rgb`](https://en.wikipedia.org/wiki/RGB_color_model) - Example: `chalk.rgb(255, 136, 0).bold('Orange!')`
+- [`hex`](https://en.wikipedia.org/wiki/Web_colors#Hex_triplet) - Example: `chalk.hex('#FF8800').bold('Orange!')`
+- [`keyword`](https://www.w3.org/wiki/CSS/Properties/color/keywords) (CSS keywords) - Example: `chalk.keyword('orange').bold('Orange!')`
+- [`hsl`](https://en.wikipedia.org/wiki/HSL_and_HSV) - Example: `chalk.hsl(32, 100, 50).bold('Orange!')`
+- [`hsv`](https://en.wikipedia.org/wiki/HSL_and_HSV) - Example: `chalk.hsv(32, 100, 100).bold('Orange!')`
+- [`hwb`](https://en.wikipedia.org/wiki/HWB_color_model) - Example: `chalk.hwb(32, 0, 50).bold('Orange!')`
+- [`ansi`](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) - Example: `chalk.ansi(31).bgAnsi(93)('red on yellowBright')`
+- [`ansi256`](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) - Example: `chalk.bgAnsi256(194)('Honeydew, more or less')`
+
+## Windows
+
+If you're on Windows, do yourself a favor and use [Windows Terminal](https://github.com/microsoft/terminal) instead of `cmd.exe`.
+
+## Origin story
+
+[colors.js](https://github.com/Marak/colors.js) used to be the most popular string styling module, but it has serious deficiencies like extending `String.prototype` which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68) and the package is unmaintained. Although there are other packages, they either do too much or not enough. Chalk is a clean and focused alternative.
+
+## chalk for enterprise
+
+Available as part of the Tidelift Subscription.
+
+The maintainers of chalk and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-chalk?utm_source=npm-chalk&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
+
+## Related
+
+- [chalk-cli](https://github.com/chalk/chalk-cli) - CLI for this module
+- [ansi-styles](https://github.com/chalk/ansi-styles) - ANSI escape codes for styling strings in the terminal
+- [supports-color](https://github.com/chalk/supports-color) - Detect whether a terminal supports color
+- [strip-ansi](https://github.com/chalk/strip-ansi) - Strip ANSI escape codes
+- [strip-ansi-stream](https://github.com/chalk/strip-ansi-stream) - Strip ANSI escape codes from a stream
+- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes
+- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes
+- [wrap-ansi](https://github.com/chalk/wrap-ansi) - Wordwrap a string with ANSI escape codes
+- [slice-ansi](https://github.com/chalk/slice-ansi) - Slice a string with ANSI escape codes
+- [color-convert](https://github.com/qix-/color-convert) - Converts colors between different models
+- [chalk-animation](https://github.com/bokub/chalk-animation) - Animate strings in the terminal
+- [gradient-string](https://github.com/bokub/gradient-string) - Apply color gradients to strings
+- [chalk-pipe](https://github.com/LitoMore/chalk-pipe) - Create chalk style schemes with simpler style strings
+- [terminal-link](https://github.com/sindresorhus/terminal-link) - Create clickable links in the terminal
+
+## Maintainers
+
+- [Sindre Sorhus](https://github.com/sindresorhus)
+- [Josh Junon](https://github.com/qix-)
diff --git a/node_modules/svgo/node_modules/chalk/source/index.js b/node_modules/svgo/node_modules/chalk/source/index.js
new file mode 100644
index 0000000..75ec663
--- /dev/null
+++ b/node_modules/svgo/node_modules/chalk/source/index.js
@@ -0,0 +1,229 @@
+'use strict';
+const ansiStyles = require('ansi-styles');
+const {stdout: stdoutColor, stderr: stderrColor} = require('supports-color');
+const {
+	stringReplaceAll,
+	stringEncaseCRLFWithFirstIndex
+} = require('./util');
+
+const {isArray} = Array;
+
+// `supportsColor.level` → `ansiStyles.color[name]` mapping
+const levelMapping = [
+	'ansi',
+	'ansi',
+	'ansi256',
+	'ansi16m'
+];
+
+const styles = Object.create(null);
+
+const applyOptions = (object, options = {}) => {
+	if (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {
+		throw new Error('The `level` option should be an integer from 0 to 3');
+	}
+
+	// Detect level if not set manually
+	const colorLevel = stdoutColor ? stdoutColor.level : 0;
+	object.level = options.level === undefined ? colorLevel : options.level;
+};
+
+class ChalkClass {
+	constructor(options) {
+		// eslint-disable-next-line no-constructor-return
+		return chalkFactory(options);
+	}
+}
+
+const chalkFactory = options => {
+	const chalk = {};
+	applyOptions(chalk, options);
+
+	chalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_);
+
+	Object.setPrototypeOf(chalk, Chalk.prototype);
+	Object.setPrototypeOf(chalk.template, chalk);
+
+	chalk.template.constructor = () => {
+		throw new Error('`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.');
+	};
+
+	chalk.template.Instance = ChalkClass;
+
+	return chalk.template;
+};
+
+function Chalk(options) {
+	return chalkFactory(options);
+}
+
+for (const [styleName, style] of Object.entries(ansiStyles)) {
+	styles[styleName] = {
+		get() {
+			const builder = createBuilder(this, createStyler(style.open, style.close, this._styler), this._isEmpty);
+			Object.defineProperty(this, styleName, {value: builder});
+			return builder;
+		}
+	};
+}
+
+styles.visible = {
+	get() {
+		const builder = createBuilder(this, this._styler, true);
+		Object.defineProperty(this, 'visible', {value: builder});
+		return builder;
+	}
+};
+
+const usedModels = ['rgb', 'hex', 'keyword', 'hsl', 'hsv', 'hwb', 'ansi', 'ansi256'];
+
+for (const model of usedModels) {
+	styles[model] = {
+		get() {
+			const {level} = this;
+			return function (...arguments_) {
+				const styler = createStyler(ansiStyles.color[levelMapping[level]][model](...arguments_), ansiStyles.color.close, this._styler);
+				return createBuilder(this, styler, this._isEmpty);
+			};
+		}
+	};
+}
+
+for (const model of usedModels) {
+	const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);
+	styles[bgModel] = {
+		get() {
+			const {level} = this;
+			return function (...arguments_) {
+				const styler = createStyler(ansiStyles.bgColor[levelMapping[level]][model](...arguments_), ansiStyles.bgColor.close, this._styler);
+				return createBuilder(this, styler, this._isEmpty);
+			};
+		}
+	};
+}
+
+const proto = Object.defineProperties(() => {}, {
+	...styles,
+	level: {
+		enumerable: true,
+		get() {
+			return this._generator.level;
+		},
+		set(level) {
+			this._generator.level = level;
+		}
+	}
+});
+
+const createStyler = (open, close, parent) => {
+	let openAll;
+	let closeAll;
+	if (parent === undefined) {
+		openAll = open;
+		closeAll = close;
+	} else {
+		openAll = parent.openAll + open;
+		closeAll = close + parent.closeAll;
+	}
+
+	return {
+		open,
+		close,
+		openAll,
+		closeAll,
+		parent
+	};
+};
+
+const createBuilder = (self, _styler, _isEmpty) => {
+	const builder = (...arguments_) => {
+		if (isArray(arguments_[0]) && isArray(arguments_[0].raw)) {
+			// Called as a template literal, for example: chalk.red`2 + 3 = {bold ${2+3}}`
+			return applyStyle(builder, chalkTag(builder, ...arguments_));
+		}
+
+		// Single argument is hot path, implicit coercion is faster than anything
+		// eslint-disable-next-line no-implicit-coercion
+		return applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));
+	};
+
+	// We alter the prototype because we must return a function, but there is
+	// no way to create a function with a different prototype
+	Object.setPrototypeOf(builder, proto);
+
+	builder._generator = self;
+	builder._styler = _styler;
+	builder._isEmpty = _isEmpty;
+
+	return builder;
+};
+
+const applyStyle = (self, string) => {
+	if (self.level <= 0 || !string) {
+		return self._isEmpty ? '' : string;
+	}
+
+	let styler = self._styler;
+
+	if (styler === undefined) {
+		return string;
+	}
+
+	const {openAll, closeAll} = styler;
+	if (string.indexOf('\u001B') !== -1) {
+		while (styler !== undefined) {
+			// Replace any instances already present with a re-opening code
+			// otherwise only the part of the string until said closing code
+			// will be colored, and the rest will simply be 'plain'.
+			string = stringReplaceAll(string, styler.close, styler.open);
+
+			styler = styler.parent;
+		}
+	}
+
+	// We can move both next actions out of loop, because remaining actions in loop won't have
+	// any/visible effect on parts we add here. Close the styling before a linebreak and reopen
+	// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92
+	const lfIndex = string.indexOf('\n');
+	if (lfIndex !== -1) {
+		string = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);
+	}
+
+	return openAll + string + closeAll;
+};
+
+let template;
+const chalkTag = (chalk, ...strings) => {
+	const [firstString] = strings;
+
+	if (!isArray(firstString) || !isArray(firstString.raw)) {
+		// If chalk() was called by itself or with a string,
+		// return the string itself as a string.
+		return strings.join(' ');
+	}
+
+	const arguments_ = strings.slice(1);
+	const parts = [firstString.raw[0]];
+
+	for (let i = 1; i < firstString.length; i++) {
+		parts.push(
+			String(arguments_[i - 1]).replace(/[{}\\]/g, '\\$&'),
+			String(firstString.raw[i])
+		);
+	}
+
+	if (template === undefined) {
+		template = require('./templates');
+	}
+
+	return template(chalk, parts.join(''));
+};
+
+Object.defineProperties(Chalk.prototype, styles);
+
+const chalk = Chalk(); // eslint-disable-line new-cap
+chalk.supportsColor = stdoutColor;
+chalk.stderr = Chalk({level: stderrColor ? stderrColor.level : 0}); // eslint-disable-line new-cap
+chalk.stderr.supportsColor = stderrColor;
+
+module.exports = chalk;
diff --git a/node_modules/svgo/node_modules/chalk/source/templates.js b/node_modules/svgo/node_modules/chalk/source/templates.js
new file mode 100644
index 0000000..b130949
--- /dev/null
+++ b/node_modules/svgo/node_modules/chalk/source/templates.js
@@ -0,0 +1,134 @@
+'use strict';
+const TEMPLATE_REGEX = /(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi;
+const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g;
+const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/;
+const ESCAPE_REGEX = /\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi;
+
+const ESCAPES = new Map([
+	['n', '\n'],
+	['r', '\r'],
+	['t', '\t'],
+	['b', '\b'],
+	['f', '\f'],
+	['v', '\v'],
+	['0', '\0'],
+	['\\', '\\'],
+	['e', '\u001B'],
+	['a', '\u0007']
+]);
+
+function unescape(c) {
+	const u = c[0] === 'u';
+	const bracket = c[1] === '{';
+
+	if ((u && !bracket && c.length === 5) || (c[0] === 'x' && c.length === 3)) {
+		return String.fromCharCode(parseInt(c.slice(1), 16));
+	}
+
+	if (u && bracket) {
+		return String.fromCodePoint(parseInt(c.slice(2, -1), 16));
+	}
+
+	return ESCAPES.get(c) || c;
+}
+
+function parseArguments(name, arguments_) {
+	const results = [];
+	const chunks = arguments_.trim().split(/\s*,\s*/g);
+	let matches;
+
+	for (const chunk of chunks) {
+		const number = Number(chunk);
+		if (!Number.isNaN(number)) {
+			results.push(number);
+		} else if ((matches = chunk.match(STRING_REGEX))) {
+			results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, character) => escape ? unescape(escape) : character));
+		} else {
+			throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);
+		}
+	}
+
+	return results;
+}
+
+function parseStyle(style) {
+	STYLE_REGEX.lastIndex = 0;
+
+	const results = [];
+	let matches;
+
+	while ((matches = STYLE_REGEX.exec(style)) !== null) {
+		const name = matches[1];
+
+		if (matches[2]) {
+			const args = parseArguments(name, matches[2]);
+			results.push([name].concat(args));
+		} else {
+			results.push([name]);
+		}
+	}
+
+	return results;
+}
+
+function buildStyle(chalk, styles) {
+	const enabled = {};
+
+	for (const layer of styles) {
+		for (const style of layer.styles) {
+			enabled[style[0]] = layer.inverse ? null : style.slice(1);
+		}
+	}
+
+	let current = chalk;
+	for (const [styleName, styles] of Object.entries(enabled)) {
+		if (!Array.isArray(styles)) {
+			continue;
+		}
+
+		if (!(styleName in current)) {
+			throw new Error(`Unknown Chalk style: ${styleName}`);
+		}
+
+		current = styles.length > 0 ? current[styleName](...styles) : current[styleName];
+	}
+
+	return current;
+}
+
+module.exports = (chalk, temporary) => {
+	const styles = [];
+	const chunks = [];
+	let chunk = [];
+
+	// eslint-disable-next-line max-params
+	temporary.replace(TEMPLATE_REGEX, (m, escapeCharacter, inverse, style, close, character) => {
+		if (escapeCharacter) {
+			chunk.push(unescape(escapeCharacter));
+		} else if (style) {
+			const string = chunk.join('');
+			chunk = [];
+			chunks.push(styles.length === 0 ? string : buildStyle(chalk, styles)(string));
+			styles.push({inverse, styles: parseStyle(style)});
+		} else if (close) {
+			if (styles.length === 0) {
+				throw new Error('Found extraneous } in Chalk template literal');
+			}
+
+			chunks.push(buildStyle(chalk, styles)(chunk.join('')));
+			chunk = [];
+			styles.pop();
+		} else {
+			chunk.push(character);
+		}
+	});
+
+	chunks.push(chunk.join(''));
+
+	if (styles.length > 0) {
+		const errMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`;
+		throw new Error(errMessage);
+	}
+
+	return chunks.join('');
+};
diff --git a/node_modules/svgo/node_modules/chalk/source/util.js b/node_modules/svgo/node_modules/chalk/source/util.js
new file mode 100644
index 0000000..ca466fd
--- /dev/null
+++ b/node_modules/svgo/node_modules/chalk/source/util.js
@@ -0,0 +1,39 @@
+'use strict';
+
+const stringReplaceAll = (string, substring, replacer) => {
+	let index = string.indexOf(substring);
+	if (index === -1) {
+		return string;
+	}
+
+	const substringLength = substring.length;
+	let endIndex = 0;
+	let returnValue = '';
+	do {
+		returnValue += string.substr(endIndex, index - endIndex) + substring + replacer;
+		endIndex = index + substringLength;
+		index = string.indexOf(substring, endIndex);
+	} while (index !== -1);
+
+	returnValue += string.substr(endIndex);
+	return returnValue;
+};
+
+const stringEncaseCRLFWithFirstIndex = (string, prefix, postfix, index) => {
+	let endIndex = 0;
+	let returnValue = '';
+	do {
+		const gotCR = string[index - 1] === '\r';
+		returnValue += string.substr(endIndex, (gotCR ? index - 1 : index) - endIndex) + prefix + (gotCR ? '\r\n' : '\n') + postfix;
+		endIndex = index + 1;
+		index = string.indexOf('\n', endIndex);
+	} while (index !== -1);
+
+	returnValue += string.substr(endIndex);
+	return returnValue;
+};
+
+module.exports = {
+	stringReplaceAll,
+	stringEncaseCRLFWithFirstIndex
+};
diff --git a/node_modules/svgo/node_modules/color-convert/CHANGELOG.md b/node_modules/svgo/node_modules/color-convert/CHANGELOG.md
new file mode 100644
index 0000000..0a7bce4
--- /dev/null
+++ b/node_modules/svgo/node_modules/color-convert/CHANGELOG.md
@@ -0,0 +1,54 @@
+# 1.0.0 - 2016-01-07
+
+- Removed: unused speed test
+- Added: Automatic routing between previously unsupported conversions
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Removed: `xxx2xxx()` and `xxx2xxxRaw()` functions
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Removed: `convert()` class
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Changed: all functions to lookup dictionary
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Changed: `ansi` to `ansi256`
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Fixed: argument grouping for functions requiring only one argument
+([#27](https://github.com/Qix-/color-convert/pull/27))
+
+# 0.6.0 - 2015-07-23
+
+- Added: methods to handle
+[ANSI](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) 16/256 colors:
+  - rgb2ansi16
+  - rgb2ansi
+  - hsl2ansi16
+  - hsl2ansi
+  - hsv2ansi16
+  - hsv2ansi
+  - hwb2ansi16
+  - hwb2ansi
+  - cmyk2ansi16
+  - cmyk2ansi
+  - keyword2ansi16
+  - keyword2ansi
+  - ansi162rgb
+  - ansi162hsl
+  - ansi162hsv
+  - ansi162hwb
+  - ansi162cmyk
+  - ansi162keyword
+  - ansi2rgb
+  - ansi2hsl
+  - ansi2hsv
+  - ansi2hwb
+  - ansi2cmyk
+  - ansi2keyword
+([#18](https://github.com/harthur/color-convert/pull/18))
+
+# 0.5.3 - 2015-06-02
+
+- Fixed: hsl2hsv does not return `NaN` anymore when using `[0,0,0]`
+([#15](https://github.com/harthur/color-convert/issues/15))
+
+---
+
+Check out commit logs for older releases
diff --git a/node_modules/svgo/node_modules/color-convert/LICENSE b/node_modules/svgo/node_modules/color-convert/LICENSE
new file mode 100644
index 0000000..5b4c386
--- /dev/null
+++ b/node_modules/svgo/node_modules/color-convert/LICENSE
@@ -0,0 +1,21 @@
+Copyright (c) 2011-2016 Heather Arthur <fayearthur@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/node_modules/svgo/node_modules/color-convert/README.md b/node_modules/svgo/node_modules/color-convert/README.md
new file mode 100644
index 0000000..d4b08fc
--- /dev/null
+++ b/node_modules/svgo/node_modules/color-convert/README.md
@@ -0,0 +1,68 @@
+# color-convert
+
+[![Build Status](https://travis-ci.org/Qix-/color-convert.svg?branch=master)](https://travis-ci.org/Qix-/color-convert)
+
+Color-convert is a color conversion library for JavaScript and node.
+It converts all ways between `rgb`, `hsl`, `hsv`, `hwb`, `cmyk`, `ansi`, `ansi16`, `hex` strings, and CSS `keyword`s (will round to closest):
+
+```js
+var convert = require('color-convert');
+
+convert.rgb.hsl(140, 200, 100);             // [96, 48, 59]
+convert.keyword.rgb('blue');                // [0, 0, 255]
+
+var rgbChannels = convert.rgb.channels;     // 3
+var cmykChannels = convert.cmyk.channels;   // 4
+var ansiChannels = convert.ansi16.channels; // 1
+```
+
+# Install
+
+```console
+$ npm install color-convert
+```
+
+# API
+
+Simply get the property of the _from_ and _to_ conversion that you're looking for.
+
+All functions have a rounded and unrounded variant. By default, return values are rounded. To get the unrounded (raw) results, simply tack on `.raw` to the function.
+
+All 'from' functions have a hidden property called `.channels` that indicates the number of channels the function expects (not including alpha).
+
+```js
+var convert = require('color-convert');
+
+// Hex to LAB
+convert.hex.lab('DEADBF');         // [ 76, 21, -2 ]
+convert.hex.lab.raw('DEADBF');     // [ 75.56213190997677, 20.653827952644754, -2.290532499330533 ]
+
+// RGB to CMYK
+convert.rgb.cmyk(167, 255, 4);     // [ 35, 0, 98, 0 ]
+convert.rgb.cmyk.raw(167, 255, 4); // [ 34.509803921568626, 0, 98.43137254901961, 0 ]
+```
+
+### Arrays
+All functions that accept multiple arguments also support passing an array.
+
+Note that this does **not** apply to functions that convert from a color that only requires one value (e.g. `keyword`, `ansi256`, `hex`, etc.)
+
+```js
+var convert = require('color-convert');
+
+convert.rgb.hex(123, 45, 67);      // '7B2D43'
+convert.rgb.hex([123, 45, 67]);    // '7B2D43'
+```
+
+## Routing
+
+Conversions that don't have an _explicitly_ defined conversion (in [conversions.js](conversions.js)), but can be converted by means of sub-conversions (e.g. XYZ -> **RGB** -> CMYK), are automatically routed together. This allows just about any color model supported by `color-convert` to be converted to any other model, so long as a sub-conversion path exists. This is also true for conversions requiring more than one step in between (e.g. LCH -> **LAB** -> **XYZ** -> **RGB** -> Hex).
+
+Keep in mind that extensive conversions _may_ result in a loss of precision, and exist only to be complete. For a list of "direct" (single-step) conversions, see [conversions.js](conversions.js).
+
+# Contribute
+
+If there is a new model you would like to support, or want to add a direct conversion between two existing models, please send us a pull request.
+
+# License
+Copyright &copy; 2011-2016, Heather Arthur and Josh Junon. Licensed under the [MIT License](LICENSE).
diff --git a/node_modules/svgo/node_modules/color-convert/conversions.js b/node_modules/svgo/node_modules/color-convert/conversions.js
new file mode 100644
index 0000000..2657f26
--- /dev/null
+++ b/node_modules/svgo/node_modules/color-convert/conversions.js
@@ -0,0 +1,839 @@
+/* MIT license */
+/* eslint-disable no-mixed-operators */
+const cssKeywords = require('color-name');
+
+// NOTE: conversions should only return primitive values (i.e. arrays, or
+//       values that give correct `typeof` results).
+//       do not use box values types (i.e. Number(), String(), etc.)
+
+const reverseKeywords = {};
+for (const key of Object.keys(cssKeywords)) {
+	reverseKeywords[cssKeywords[key]] = key;
+}
+
+const convert = {
+	rgb: {channels: 3, labels: 'rgb'},
+	hsl: {channels: 3, labels: 'hsl'},
+	hsv: {channels: 3, labels: 'hsv'},
+	hwb: {channels: 3, labels: 'hwb'},
+	cmyk: {channels: 4, labels: 'cmyk'},
+	xyz: {channels: 3, labels: 'xyz'},
+	lab: {channels: 3, labels: 'lab'},
+	lch: {channels: 3, labels: 'lch'},
+	hex: {channels: 1, labels: ['hex']},
+	keyword: {channels: 1, labels: ['keyword']},
+	ansi16: {channels: 1, labels: ['ansi16']},
+	ansi256: {channels: 1, labels: ['ansi256']},
+	hcg: {channels: 3, labels: ['h', 'c', 'g']},
+	apple: {channels: 3, labels: ['r16', 'g16', 'b16']},
+	gray: {channels: 1, labels: ['gray']}
+};
+
+module.exports = convert;
+
+// Hide .channels and .labels properties
+for (const model of Object.keys(convert)) {
+	if (!('channels' in convert[model])) {
+		throw new Error('missing channels property: ' + model);
+	}
+
+	if (!('labels' in convert[model])) {
+		throw new Error('missing channel labels property: ' + model);
+	}
+
+	if (convert[model].labels.length !== convert[model].channels) {
+		throw new Error('channel and label counts mismatch: ' + model);
+	}
+
+	const {channels, labels} = convert[model];
+	delete convert[model].channels;
+	delete convert[model].labels;
+	Object.defineProperty(convert[model], 'channels', {value: channels});
+	Object.defineProperty(convert[model], 'labels', {value: labels});
+}
+
+convert.rgb.hsl = function (rgb) {
+	const r = rgb[0] / 255;
+	const g = rgb[1] / 255;
+	const b = rgb[2] / 255;
+	const min = Math.min(r, g, b);
+	const max = Math.max(r, g, b);
+	const delta = max - min;
+	let h;
+	let s;
+
+	if (max === min) {
+		h = 0;
+	} else if (r === max) {
+		h = (g - b) / delta;
+	} else if (g === max) {
+		h = 2 + (b - r) / delta;
+	} else if (b === max) {
+		h = 4 + (r - g) / delta;
+	}
+
+	h = Math.min(h * 60, 360);
+
+	if (h < 0) {
+		h += 360;
+	}
+
+	const l = (min + max) / 2;
+
+	if (max === min) {
+		s = 0;
+	} else if (l <= 0.5) {
+		s = delta / (max + min);
+	} else {
+		s = delta / (2 - max - min);
+	}
+
+	return [h, s * 100, l * 100];
+};
+
+convert.rgb.hsv = function (rgb) {
+	let rdif;
+	let gdif;
+	let bdif;
+	let h;
+	let s;
+
+	const r = rgb[0] / 255;
+	const g = rgb[1] / 255;
+	const b = rgb[2] / 255;
+	const v = Math.max(r, g, b);
+	const diff = v - Math.min(r, g, b);
+	const diffc = function (c) {
+		return (v - c) / 6 / diff + 1 / 2;
+	};
+
+	if (diff === 0) {
+		h = 0;
+		s = 0;
+	} else {
+		s = diff / v;
+		rdif = diffc(r);
+		gdif = diffc(g);
+		bdif = diffc(b);
+
+		if (r === v) {
+			h = bdif - gdif;
+		} else if (g === v) {
+			h = (1 / 3) + rdif - bdif;
+		} else if (b === v) {
+			h = (2 / 3) + gdif - rdif;
+		}
+
+		if (h < 0) {
+			h += 1;
+		} else if (h > 1) {
+			h -= 1;
+		}
+	}
+
+	return [
+		h * 360,
+		s * 100,
+		v * 100
+	];
+};
+
+convert.rgb.hwb = function (rgb) {
+	const r = rgb[0];
+	const g = rgb[1];
+	let b = rgb[2];
+	const h = convert.rgb.hsl(rgb)[0];
+	const w = 1 / 255 * Math.min(r, Math.min(g, b));
+
+	b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
+
+	return [h, w * 100, b * 100];
+};
+
+convert.rgb.cmyk = function (rgb) {
+	const r = rgb[0] / 255;
+	const g = rgb[1] / 255;
+	const b = rgb[2] / 255;
+
+	const k = Math.min(1 - r, 1 - g, 1 - b);
+	const c = (1 - r - k) / (1 - k) || 0;
+	const m = (1 - g - k) / (1 - k) || 0;
+	const y = (1 - b - k) / (1 - k) || 0;
+
+	return [c * 100, m * 100, y * 100, k * 100];
+};
+
+function comparativeDistance(x, y) {
+	/*
+		See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
+	*/
+	return (
+		((x[0] - y[0]) ** 2) +
+		((x[1] - y[1]) ** 2) +
+		((x[2] - y[2]) ** 2)
+	);
+}
+
+convert.rgb.keyword = function (rgb) {
+	const reversed = reverseKeywords[rgb];
+	if (reversed) {
+		return reversed;
+	}
+
+	let currentClosestDistance = Infinity;
+	let currentClosestKeyword;
+
+	for (const keyword of Object.keys(cssKeywords)) {
+		const value = cssKeywords[keyword];
+
+		// Compute comparative distance
+		const distance = comparativeDistance(rgb, value);
+
+		// Check if its less, if so set as closest
+		if (distance < currentClosestDistance) {
+			currentClosestDistance = distance;
+			currentClosestKeyword = keyword;
+		}
+	}
+
+	return currentClosestKeyword;
+};
+
+convert.keyword.rgb = function (keyword) {
+	return cssKeywords[keyword];
+};
+
+convert.rgb.xyz = function (rgb) {
+	let r = rgb[0] / 255;
+	let g = rgb[1] / 255;
+	let b = rgb[2] / 255;
+
+	// Assume sRGB
+	r = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92);
+	g = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92);
+	b = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92);
+
+	const x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
+	const y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
+	const z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
+
+	return [x * 100, y * 100, z * 100];
+};
+
+convert.rgb.lab = function (rgb) {
+	const xyz = convert.rgb.xyz(rgb);
+	let x = xyz[0];
+	let y = xyz[1];
+	let z = xyz[2];
+
+	x /= 95.047;
+	y /= 100;
+	z /= 108.883;
+
+	x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);
+	y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);
+	z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);
+
+	const l = (116 * y) - 16;
+	const a = 500 * (x - y);
+	const b = 200 * (y - z);
+
+	return [l, a, b];
+};
+
+convert.hsl.rgb = function (hsl) {
+	const h = hsl[0] / 360;
+	const s = hsl[1] / 100;
+	const l = hsl[2] / 100;
+	let t2;
+	let t3;
+	let val;
+
+	if (s === 0) {
+		val = l * 255;
+		return [val, val, val];
+	}
+
+	if (l < 0.5) {
+		t2 = l * (1 + s);
+	} else {
+		t2 = l + s - l * s;
+	}
+
+	const t1 = 2 * l - t2;
+
+	const rgb = [0, 0, 0];
+	for (let i = 0; i < 3; i++) {
+		t3 = h + 1 / 3 * -(i - 1);
+		if (t3 < 0) {
+			t3++;
+		}
+
+		if (t3 > 1) {
+			t3--;
+		}
+
+		if (6 * t3 < 1) {
+			val = t1 + (t2 - t1) * 6 * t3;
+		} else if (2 * t3 < 1) {
+			val = t2;
+		} else if (3 * t3 < 2) {
+			val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
+		} else {
+			val = t1;
+		}
+
+		rgb[i] = val * 255;
+	}
+
+	return rgb;
+};
+
+convert.hsl.hsv = function (hsl) {
+	const h = hsl[0];
+	let s = hsl[1] / 100;
+	let l = hsl[2] / 100;
+	let smin = s;
+	const lmin = Math.max(l, 0.01);
+
+	l *= 2;
+	s *= (l <= 1) ? l : 2 - l;
+	smin *= lmin <= 1 ? lmin : 2 - lmin;
+	const v = (l + s) / 2;
+	const sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);
+
+	return [h, sv * 100, v * 100];
+};
+
+convert.hsv.rgb = function (hsv) {
+	const h = hsv[0] / 60;
+	const s = hsv[1] / 100;
+	let v = hsv[2] / 100;
+	const hi = Math.floor(h) % 6;
+
+	const f = h - Math.floor(h);
+	const p = 255 * v * (1 - s);
+	const q = 255 * v * (1 - (s * f));
+	const t = 255 * v * (1 - (s * (1 - f)));
+	v *= 255;
+
+	switch (hi) {
+		case 0:
+			return [v, t, p];
+		case 1:
+			return [q, v, p];
+		case 2:
+			return [p, v, t];
+		case 3:
+			return [p, q, v];
+		case 4:
+			return [t, p, v];
+		case 5:
+			return [v, p, q];
+	}
+};
+
+convert.hsv.hsl = function (hsv) {
+	const h = hsv[0];
+	const s = hsv[1] / 100;
+	const v = hsv[2] / 100;
+	const vmin = Math.max(v, 0.01);
+	let sl;
+	let l;
+
+	l = (2 - s) * v;
+	const lmin = (2 - s) * vmin;
+	sl = s * vmin;
+	sl /= (lmin <= 1) ? lmin : 2 - lmin;
+	sl = sl || 0;
+	l /= 2;
+
+	return [h, sl * 100, l * 100];
+};
+
+// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
+convert.hwb.rgb = function (hwb) {
+	const h = hwb[0] / 360;
+	let wh = hwb[1] / 100;
+	let bl = hwb[2] / 100;
+	const ratio = wh + bl;
+	let f;
+
+	// Wh + bl cant be > 1
+	if (ratio > 1) {
+		wh /= ratio;
+		bl /= ratio;
+	}
+
+	const i = Math.floor(6 * h);
+	const v = 1 - bl;
+	f = 6 * h - i;
+
+	if ((i & 0x01) !== 0) {
+		f = 1 - f;
+	}
+
+	const n = wh + f * (v - wh); // Linear interpolation
+
+	let r;
+	let g;
+	let b;
+	/* eslint-disable max-statements-per-line,no-multi-spaces */
+	switch (i) {
+		default:
+		case 6:
+		case 0: r = v;  g = n;  b = wh; break;
+		case 1: r = n;  g = v;  b = wh; break;
+		case 2: r = wh; g = v;  b = n; break;
+		case 3: r = wh; g = n;  b = v; break;
+		case 4: r = n;  g = wh; b = v; break;
+		case 5: r = v;  g = wh; b = n; break;
+	}
+	/* eslint-enable max-statements-per-line,no-multi-spaces */
+
+	return [r * 255, g * 255, b * 255];
+};
+
+convert.cmyk.rgb = function (cmyk) {
+	const c = cmyk[0] / 100;
+	const m = cmyk[1] / 100;
+	const y = cmyk[2] / 100;
+	const k = cmyk[3] / 100;
+
+	const r = 1 - Math.min(1, c * (1 - k) + k);
+	const g = 1 - Math.min(1, m * (1 - k) + k);
+	const b = 1 - Math.min(1, y * (1 - k) + k);
+
+	return [r * 255, g * 255, b * 255];
+};
+
+convert.xyz.rgb = function (xyz) {
+	const x = xyz[0] / 100;
+	const y = xyz[1] / 100;
+	const z = xyz[2] / 100;
+	let r;
+	let g;
+	let b;
+
+	r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
+	g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
+	b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
+
+	// Assume sRGB
+	r = r > 0.0031308
+		? ((1.055 * (r ** (1.0 / 2.4))) - 0.055)
+		: r * 12.92;
+
+	g = g > 0.0031308
+		? ((1.055 * (g ** (1.0 / 2.4))) - 0.055)
+		: g * 12.92;
+
+	b = b > 0.0031308
+		? ((1.055 * (b ** (1.0 / 2.4))) - 0.055)
+		: b * 12.92;
+
+	r = Math.min(Math.max(0, r), 1);
+	g = Math.min(Math.max(0, g), 1);
+	b = Math.min(Math.max(0, b), 1);
+
+	return [r * 255, g * 255, b * 255];
+};
+
+convert.xyz.lab = function (xyz) {
+	let x = xyz[0];
+	let y = xyz[1];
+	let z = xyz[2];
+
+	x /= 95.047;
+	y /= 100;
+	z /= 108.883;
+
+	x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);
+	y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);
+	z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);
+
+	const l = (116 * y) - 16;
+	const a = 500 * (x - y);
+	const b = 200 * (y - z);
+
+	return [l, a, b];
+};
+
+convert.lab.xyz = function (lab) {
+	const l = lab[0];
+	const a = lab[1];
+	const b = lab[2];
+	let x;
+	let y;
+	let z;
+
+	y = (l + 16) / 116;
+	x = a / 500 + y;
+	z = y - b / 200;
+
+	const y2 = y ** 3;
+	const x2 = x ** 3;
+	const z2 = z ** 3;
+	y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
+	x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
+	z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;
+
+	x *= 95.047;
+	y *= 100;
+	z *= 108.883;
+
+	return [x, y, z];
+};
+
+convert.lab.lch = function (lab) {
+	const l = lab[0];
+	const a = lab[1];
+	const b = lab[2];
+	let h;
+
+	const hr = Math.atan2(b, a);
+	h = hr * 360 / 2 / Math.PI;
+
+	if (h < 0) {
+		h += 360;
+	}
+
+	const c = Math.sqrt(a * a + b * b);
+
+	return [l, c, h];
+};
+
+convert.lch.lab = function (lch) {
+	const l = lch[0];
+	const c = lch[1];
+	const h = lch[2];
+
+	const hr = h / 360 * 2 * Math.PI;
+	const a = c * Math.cos(hr);
+	const b = c * Math.sin(hr);
+
+	return [l, a, b];
+};
+
+convert.rgb.ansi16 = function (args, saturation = null) {
+	const [r, g, b] = args;
+	let value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization
+
+	value = Math.round(value / 50);
+
+	if (value === 0) {
+		return 30;
+	}
+
+	let ansi = 30
+		+ ((Math.round(b / 255) << 2)
+		| (Math.round(g / 255) << 1)
+		| Math.round(r / 255));
+
+	if (value === 2) {
+		ansi += 60;
+	}
+
+	return ansi;
+};
+
+convert.hsv.ansi16 = function (args) {
+	// Optimization here; we already know the value and don't need to get
+	// it converted for us.
+	return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
+};
+
+convert.rgb.ansi256 = function (args) {
+	const r = args[0];
+	const g = args[1];
+	const b = args[2];
+
+	// We use the extended greyscale palette here, with the exception of
+	// black and white. normal palette only has 4 greyscale shades.
+	if (r === g && g === b) {
+		if (r < 8) {
+			return 16;
+		}
+
+		if (r > 248) {
+			return 231;
+		}
+
+		return Math.round(((r - 8) / 247) * 24) + 232;
+	}
+
+	const ansi = 16
+		+ (36 * Math.round(r / 255 * 5))
+		+ (6 * Math.round(g / 255 * 5))
+		+ Math.round(b / 255 * 5);
+
+	return ansi;
+};
+
+convert.ansi16.rgb = function (args) {
+	let color = args % 10;
+
+	// Handle greyscale
+	if (color === 0 || color === 7) {
+		if (args > 50) {
+			color += 3.5;
+		}
+
+		color = color / 10.5 * 255;
+
+		return [color, color, color];
+	}
+
+	const mult = (~~(args > 50) + 1) * 0.5;
+	const r = ((color & 1) * mult) * 255;
+	const g = (((color >> 1) & 1) * mult) * 255;
+	const b = (((color >> 2) & 1) * mult) * 255;
+
+	return [r, g, b];
+};
+
+convert.ansi256.rgb = function (args) {
+	// Handle greyscale
+	if (args >= 232) {
+		const c = (args - 232) * 10 + 8;
+		return [c, c, c];
+	}
+
+	args -= 16;
+
+	let rem;
+	const r = Math.floor(args / 36) / 5 * 255;
+	const g = Math.floor((rem = args % 36) / 6) / 5 * 255;
+	const b = (rem % 6) / 5 * 255;
+
+	return [r, g, b];
+};
+
+convert.rgb.hex = function (args) {
+	const integer = ((Math.round(args[0]) & 0xFF) << 16)
+		+ ((Math.round(args[1]) & 0xFF) << 8)
+		+ (Math.round(args[2]) & 0xFF);
+
+	const string = integer.toString(16).toUpperCase();
+	return '000000'.substring(string.length) + string;
+};
+
+convert.hex.rgb = function (args) {
+	const match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
+	if (!match) {
+		return [0, 0, 0];
+	}
+
+	let colorString = match[0];
+
+	if (match[0].length === 3) {
+		colorString = colorString.split('').map(char => {
+			return char + char;
+		}).join('');
+	}
+
+	const integer = parseInt(colorString, 16);
+	const r = (integer >> 16) & 0xFF;
+	const g = (integer >> 8) & 0xFF;
+	const b = integer & 0xFF;
+
+	return [r, g, b];
+};
+
+convert.rgb.hcg = function (rgb) {
+	const r = rgb[0] / 255;
+	const g = rgb[1] / 255;
+	const b = rgb[2] / 255;
+	const max = Math.max(Math.max(r, g), b);
+	const min = Math.min(Math.min(r, g), b);
+	const chroma = (max - min);
+	let grayscale;
+	let hue;
+
+	if (chroma < 1) {
+		grayscale = min / (1 - chroma);
+	} else {
+		grayscale = 0;
+	}
+
+	if (chroma <= 0) {
+		hue = 0;
+	} else
+	if (max === r) {
+		hue = ((g - b) / chroma) % 6;
+	} else
+	if (max === g) {
+		hue = 2 + (b - r) / chroma;
+	} else {
+		hue = 4 + (r - g) / chroma;
+	}
+
+	hue /= 6;
+	hue %= 1;
+
+	return [hue * 360, chroma * 100, grayscale * 100];
+};
+
+convert.hsl.hcg = function (hsl) {
+	const s = hsl[1] / 100;
+	const l = hsl[2] / 100;
+
+	const c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l));
+
+	let f = 0;
+	if (c < 1.0) {
+		f = (l - 0.5 * c) / (1.0 - c);
+	}
+
+	return [hsl[0], c * 100, f * 100];
+};
+
+convert.hsv.hcg = function (hsv) {
+	const s = hsv[1] / 100;
+	const v = hsv[2] / 100;
+
+	const c = s * v;
+	let f = 0;
+
+	if (c < 1.0) {
+		f = (v - c) / (1 - c);
+	}
+
+	return [hsv[0], c * 100, f * 100];
+};
+
+convert.hcg.rgb = function (hcg) {
+	const h = hcg[0] / 360;
+	const c = hcg[1] / 100;
+	const g = hcg[2] / 100;
+
+	if (c === 0.0) {
+		return [g * 255, g * 255, g * 255];
+	}
+
+	const pure = [0, 0, 0];
+	const hi = (h % 1) * 6;
+	const v = hi % 1;
+	const w = 1 - v;
+	let mg = 0;
+
+	/* eslint-disable max-statements-per-line */
+	switch (Math.floor(hi)) {
+		case 0:
+			pure[0] = 1; pure[1] = v; pure[2] = 0; break;
+		case 1:
+			pure[0] = w; pure[1] = 1; pure[2] = 0; break;
+		case 2:
+			pure[0] = 0; pure[1] = 1; pure[2] = v; break;
+		case 3:
+			pure[0] = 0; pure[1] = w; pure[2] = 1; break;
+		case 4:
+			pure[0] = v; pure[1] = 0; pure[2] = 1; break;
+		default:
+			pure[0] = 1; pure[1] = 0; pure[2] = w;
+	}
+	/* eslint-enable max-statements-per-line */
+
+	mg = (1.0 - c) * g;
+
+	return [
+		(c * pure[0] + mg) * 255,
+		(c * pure[1] + mg) * 255,
+		(c * pure[2] + mg) * 255
+	];
+};
+
+convert.hcg.hsv = function (hcg) {
+	const c = hcg[1] / 100;
+	const g = hcg[2] / 100;
+
+	const v = c + g * (1.0 - c);
+	let f = 0;
+
+	if (v > 0.0) {
+		f = c / v;
+	}
+
+	return [hcg[0], f * 100, v * 100];
+};
+
+convert.hcg.hsl = function (hcg) {
+	const c = hcg[1] / 100;
+	const g = hcg[2] / 100;
+
+	const l = g * (1.0 - c) + 0.5 * c;
+	let s = 0;
+
+	if (l > 0.0 && l < 0.5) {
+		s = c / (2 * l);
+	} else
+	if (l >= 0.5 && l < 1.0) {
+		s = c / (2 * (1 - l));
+	}
+
+	return [hcg[0], s * 100, l * 100];
+};
+
+convert.hcg.hwb = function (hcg) {
+	const c = hcg[1] / 100;
+	const g = hcg[2] / 100;
+	const v = c + g * (1.0 - c);
+	return [hcg[0], (v - c) * 100, (1 - v) * 100];
+};
+
+convert.hwb.hcg = function (hwb) {
+	const w = hwb[1] / 100;
+	const b = hwb[2] / 100;
+	const v = 1 - b;
+	const c = v - w;
+	let g = 0;
+
+	if (c < 1) {
+		g = (v - c) / (1 - c);
+	}
+
+	return [hwb[0], c * 100, g * 100];
+};
+
+convert.apple.rgb = function (apple) {
+	return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];
+};
+
+convert.rgb.apple = function (rgb) {
+	return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];
+};
+
+convert.gray.rgb = function (args) {
+	return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
+};
+
+convert.gray.hsl = function (args) {
+	return [0, 0, args[0]];
+};
+
+convert.gray.hsv = convert.gray.hsl;
+
+convert.gray.hwb = function (gray) {
+	return [0, 100, gray[0]];
+};
+
+convert.gray.cmyk = function (gray) {
+	return [0, 0, 0, gray[0]];
+};
+
+convert.gray.lab = function (gray) {
+	return [gray[0], 0, 0];
+};
+
+convert.gray.hex = function (gray) {
+	const val = Math.round(gray[0] / 100 * 255) & 0xFF;
+	const integer = (val << 16) + (val << 8) + val;
+
+	const string = integer.toString(16).toUpperCase();
+	return '000000'.substring(string.length) + string;
+};
+
+convert.rgb.gray = function (rgb) {
+	const val = (rgb[0] + rgb[1] + rgb[2]) / 3;
+	return [val / 255 * 100];
+};
diff --git a/node_modules/svgo/node_modules/color-convert/index.js b/node_modules/svgo/node_modules/color-convert/index.js
new file mode 100644
index 0000000..b648e57
--- /dev/null
+++ b/node_modules/svgo/node_modules/color-convert/index.js
@@ -0,0 +1,81 @@
+const conversions = require('./conversions');
+const route = require('./route');
+
+const convert = {};
+
+const models = Object.keys(conversions);
+
+function wrapRaw(fn) {
+	const wrappedFn = function (...args) {
+		const arg0 = args[0];
+		if (arg0 === undefined || arg0 === null) {
+			return arg0;
+		}
+
+		if (arg0.length > 1) {
+			args = arg0;
+		}
+
+		return fn(args);
+	};
+
+	// Preserve .conversion property if there is one
+	if ('conversion' in fn) {
+		wrappedFn.conversion = fn.conversion;
+	}
+
+	return wrappedFn;
+}
+
+function wrapRounded(fn) {
+	const wrappedFn = function (...args) {
+		const arg0 = args[0];
+
+		if (arg0 === undefined || arg0 === null) {
+			return arg0;
+		}
+
+		if (arg0.length > 1) {
+			args = arg0;
+		}
+
+		const result = fn(args);
+
+		// We're assuming the result is an array here.
+		// see notice in conversions.js; don't use box types
+		// in conversion functions.
+		if (typeof result === 'object') {
+			for (let len = result.length, i = 0; i < len; i++) {
+				result[i] = Math.round(result[i]);
+			}
+		}
+
+		return result;
+	};
+
+	// Preserve .conversion property if there is one
+	if ('conversion' in fn) {
+		wrappedFn.conversion = fn.conversion;
+	}
+
+	return wrappedFn;
+}
+
+models.forEach(fromModel => {
+	convert[fromModel] = {};
+
+	Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});
+	Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});
+
+	const routes = route(fromModel);
+	const routeModels = Object.keys(routes);
+
+	routeModels.forEach(toModel => {
+		const fn = routes[toModel];
+
+		convert[fromModel][toModel] = wrapRounded(fn);
+		convert[fromModel][toModel].raw = wrapRaw(fn);
+	});
+});
+
+module.exports = convert;
diff --git a/node_modules/svgo/node_modules/color-convert/package.json b/node_modules/svgo/node_modules/color-convert/package.json
new file mode 100644
index 0000000..6e48000
--- /dev/null
+++ b/node_modules/svgo/node_modules/color-convert/package.json
@@ -0,0 +1,48 @@
+{
+  "name": "color-convert",
+  "description": "Plain color conversion functions",
+  "version": "2.0.1",
+  "author": "Heather Arthur <fayearthur@gmail.com>",
+  "license": "MIT",
+  "repository": "Qix-/color-convert",
+  "scripts": {
+    "pretest": "xo",
+    "test": "node test/basic.js"
+  },
+  "engines": {
+    "node": ">=7.0.0"
+  },
+  "keywords": [
+    "color",
+    "colour",
+    "convert",
+    "converter",
+    "conversion",
+    "rgb",
+    "hsl",
+    "hsv",
+    "hwb",
+    "cmyk",
+    "ansi",
+    "ansi16"
+  ],
+  "files": [
+    "index.js",
+    "conversions.js",
+    "route.js"
+  ],
+  "xo": {
+    "rules": {
+      "default-case": 0,
+      "no-inline-comments": 0,
+      "operator-linebreak": 0
+    }
+  },
+  "devDependencies": {
+    "chalk": "^2.4.2",
+    "xo": "^0.24.0"
+  },
+  "dependencies": {
+    "color-name": "~1.1.4"
+  }
+}
diff --git a/node_modules/svgo/node_modules/color-convert/route.js b/node_modules/svgo/node_modules/color-convert/route.js
new file mode 100644
index 0000000..1a08521
--- /dev/null
+++ b/node_modules/svgo/node_modules/color-convert/route.js
@@ -0,0 +1,97 @@
+const conversions = require('./conversions');
+
+/*
+	This function routes a model to all other models.
+
+	all functions that are routed have a property `.conversion` attached
+	to the returned synthetic function. This property is an array
+	of strings, each with the steps in between the 'from' and 'to'
+	color models (inclusive).
+
+	conversions that are not possible simply are not included.
+*/
+
+function buildGraph() {
+	const graph = {};
+	// https://jsperf.com/object-keys-vs-for-in-with-closure/3
+	const models = Object.keys(conversions);
+
+	for (let len = models.length, i = 0; i < len; i++) {
+		graph[models[i]] = {
+			// http://jsperf.com/1-vs-infinity
+			// micro-opt, but this is simple.
+			distance: -1,
+			parent: null
+		};
+	}
+
+	return graph;
+}
+
+// https://en.wikipedia.org/wiki/Breadth-first_search
+function deriveBFS(fromModel) {
+	const graph = buildGraph();
+	const queue = [fromModel]; // Unshift -> queue -> pop
+
+	graph[fromModel].distance = 0;
+
+	while (queue.length) {
+		const current = queue.pop();
+		const adjacents = Object.keys(conversions[current]);
+
+		for (let len = adjacents.length, i = 0; i < len; i++) {
+			const adjacent = adjacents[i];
+			const node = graph[adjacent];
+
+			if (node.distance === -1) {
+				node.distance = graph[current].distance + 1;
+				node.parent = current;
+				queue.unshift(adjacent);
+			}
+		}
+	}
+
+	return graph;
+}
+
+function link(from, to) {
+	return function (args) {
+		return to(from(args));
+	};
+}
+
+function wrapConversion(toModel, graph) {
+	const path = [graph[toModel].parent, toModel];
+	let fn = conversions[graph[toModel].parent][toModel];
+
+	let cur = graph[toModel].parent;
+	while (graph[cur].parent) {
+		path.unshift(graph[cur].parent);
+		fn = link(conversions[graph[cur].parent][cur], fn);
+		cur = graph[cur].parent;
+	}
+
+	fn.conversion = path;
+	return fn;
+}
+
+module.exports = function (fromModel) {
+	const graph = deriveBFS(fromModel);
+	const conversion = {};
+
+	const models = Object.keys(graph);
+	for (let len = models.length, i = 0; i < len; i++) {
+		const toModel = models[i];
+		const node = graph[toModel];
+
+		if (node.parent === null) {
+			// No possible conversion, or this node is the source model.
+			continue;
+		}
+
+		conversion[toModel] = wrapConversion(toModel, graph);
+	}
+
+	return conversion;
+};
+
diff --git a/node_modules/svgo/node_modules/color-name/LICENSE b/node_modules/svgo/node_modules/color-name/LICENSE
new file mode 100644
index 0000000..4d9802a
--- /dev/null
+++ b/node_modules/svgo/node_modules/color-name/LICENSE
@@ -0,0 +1,8 @@
+The MIT License (MIT)
+Copyright (c) 2015 Dmitry Ivanov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/svgo/node_modules/color-name/README.md b/node_modules/svgo/node_modules/color-name/README.md
new file mode 100644
index 0000000..3611a6b
--- /dev/null
+++ b/node_modules/svgo/node_modules/color-name/README.md
@@ -0,0 +1,11 @@
+A JSON with color names and its values. Based on http://dev.w3.org/csswg/css-color/#named-colors.
+
+[![NPM](https://nodei.co/npm/color-name.png?mini=true)](https://nodei.co/npm/color-name/)
+
+
+```js
+var colors = require('color-name');
+colors.red //[255,0,0]
+```
+
+<a href="LICENSE"><img src="https://upload.wikimedia.org/wikipedia/commons/0/0c/MIT_logo.svg" width="120"/></a>
diff --git a/node_modules/svgo/node_modules/color-name/index.js b/node_modules/svgo/node_modules/color-name/index.js
new file mode 100644
index 0000000..e42aa68
--- /dev/null
+++ b/node_modules/svgo/node_modules/color-name/index.js
@@ -0,0 +1,152 @@
+'use strict'
+
+module.exports = {
+	"aliceblue": [240, 248, 255],
+	"antiquewhite": [250, 235, 215],
+	"aqua": [0, 255, 255],
+	"aquamarine": [127, 255, 212],
+	"azure": [240, 255, 255],
+	"beige": [245, 245, 220],
+	"bisque": [255, 228, 196],
+	"black": [0, 0, 0],
+	"blanchedalmond": [255, 235, 205],
+	"blue": [0, 0, 255],
+	"blueviolet": [138, 43, 226],
+	"brown": [165, 42, 42],
+	"burlywood": [222, 184, 135],
+	"cadetblue": [95, 158, 160],
+	"chartreuse": [127, 255, 0],
+	"chocolate": [210, 105, 30],
+	"coral": [255, 127, 80],
+	"cornflowerblue": [100, 149, 237],
+	"cornsilk": [255, 248, 220],
+	"crimson": [220, 20, 60],
+	"cyan": [0, 255, 255],
+	"darkblue": [0, 0, 139],
+	"darkcyan": [0, 139, 139],
+	"darkgoldenrod": [184, 134, 11],
+	"darkgray": [169, 169, 169],
+	"darkgreen": [0, 100, 0],
+	"darkgrey": [169, 169, 169],
+	"darkkhaki": [189, 183, 107],
+	"darkmagenta": [139, 0, 139],
+	"darkolivegreen": [85, 107, 47],
+	"darkorange": [255, 140, 0],
+	"darkorchid": [153, 50, 204],
+	"darkred": [139, 0, 0],
+	"darksalmon": [233, 150, 122],
+	"darkseagreen": [143, 188, 143],
+	"darkslateblue": [72, 61, 139],
+	"darkslategray": [47, 79, 79],
+	"darkslategrey": [47, 79, 79],
+	"darkturquoise": [0, 206, 209],
+	"darkviolet": [148, 0, 211],
+	"deeppink": [255, 20, 147],
+	"deepskyblue": [0, 191, 255],
+	"dimgray": [105, 105, 105],
+	"dimgrey": [105, 105, 105],
+	"dodgerblue": [30, 144, 255],
+	"firebrick": [178, 34, 34],
+	"floralwhite": [255, 250, 240],
+	"forestgreen": [34, 139, 34],
+	"fuchsia": [255, 0, 255],
+	"gainsboro": [220, 220, 220],
+	"ghostwhite": [248, 248, 255],
+	"gold": [255, 215, 0],
+	"goldenrod": [218, 165, 32],
+	"gray": [128, 128, 128],
+	"green": [0, 128, 0],
+	"greenyellow": [173, 255, 47],
+	"grey": [128, 128, 128],
+	"honeydew": [240, 255, 240],
+	"hotpink": [255, 105, 180],
+	"indianred": [205, 92, 92],
+	"indigo": [75, 0, 130],
+	"ivory": [255, 255, 240],
+	"khaki": [240, 230, 140],
+	"lavender": [230, 230, 250],
+	"lavenderblush": [255, 240, 245],
+	"lawngreen": [124, 252, 0],
+	"lemonchiffon": [255, 250, 205],
+	"lightblue": [173, 216, 230],
+	"lightcoral": [240, 128, 128],
+	"lightcyan": [224, 255, 255],
+	"lightgoldenrodyellow": [250, 250, 210],
+	"lightgray": [211, 211, 211],
+	"lightgreen": [144, 238, 144],
+	"lightgrey": [211, 211, 211],
+	"lightpink": [255, 182, 193],
+	"lightsalmon": [255, 160, 122],
+	"lightseagreen": [32, 178, 170],
+	"lightskyblue": [135, 206, 250],
+	"lightslategray": [119, 136, 153],
+	"lightslategrey": [119, 136, 153],
+	"lightsteelblue": [176, 196, 222],
+	"lightyellow": [255, 255, 224],
+	"lime": [0, 255, 0],
+	"limegreen": [50, 205, 50],
+	"linen": [250, 240, 230],
+	"magenta": [255, 0, 255],
+	"maroon": [128, 0, 0],
+	"mediumaquamarine": [102, 205, 170],
+	"mediumblue": [0, 0, 205],
+	"mediumorchid": [186, 85, 211],
+	"mediumpurple": [147, 112, 219],
+	"mediumseagreen": [60, 179, 113],
+	"mediumslateblue": [123, 104, 238],
+	"mediumspringgreen": [0, 250, 154],
+	"mediumturquoise": [72, 209, 204],
+	"mediumvioletred": [199, 21, 133],
+	"midnightblue": [25, 25, 112],
+	"mintcream": [245, 255, 250],
+	"mistyrose": [255, 228, 225],
+	"moccasin": [255, 228, 181],
+	"navajowhite": [255, 222, 173],
+	"navy": [0, 0, 128],
+	"oldlace": [253, 245, 230],
+	"olive": [128, 128, 0],
+	"olivedrab": [107, 142, 35],
+	"orange": [255, 165, 0],
+	"orangered": [255, 69, 0],
+	"orchid": [218, 112, 214],
+	"palegoldenrod": [238, 232, 170],
+	"palegreen": [152, 251, 152],
+	"paleturquoise": [175, 238, 238],
+	"palevioletred": [219, 112, 147],
+	"papayawhip": [255, 239, 213],
+	"peachpuff": [255, 218, 185],
+	"peru": [205, 133, 63],
+	"pink": [255, 192, 203],
+	"plum": [221, 160, 221],
+	"powderblue": [176, 224, 230],
+	"purple": [128, 0, 128],
+	"rebeccapurple": [102, 51, 153],
+	"red": [255, 0, 0],
+	"rosybrown": [188, 143, 143],
+	"royalblue": [65, 105, 225],
+	"saddlebrown": [139, 69, 19],
+	"salmon": [250, 128, 114],
+	"sandybrown": [244, 164, 96],
+	"seagreen": [46, 139, 87],
+	"seashell": [255, 245, 238],
+	"sienna": [160, 82, 45],
+	"silver": [192, 192, 192],
+	"skyblue": [135, 206, 235],
+	"slateblue": [106, 90, 205],
+	"slategray": [112, 128, 144],
+	"slategrey": [112, 128, 144],
+	"snow": [255, 250, 250],
+	"springgreen": [0, 255, 127],
+	"steelblue": [70, 130, 180],
+	"tan": [210, 180, 140],
+	"teal": [0, 128, 128],
+	"thistle": [216, 191, 216],
+	"tomato": [255, 99, 71],
+	"turquoise": [64, 224, 208],
+	"violet": [238, 130, 238],
+	"wheat": [245, 222, 179],
+	"white": [255, 255, 255],
+	"whitesmoke": [245, 245, 245],
+	"yellow": [255, 255, 0],
+	"yellowgreen": [154, 205, 50]
+};
diff --git a/node_modules/svgo/node_modules/color-name/package.json b/node_modules/svgo/node_modules/color-name/package.json
new file mode 100644
index 0000000..7acc902
--- /dev/null
+++ b/node_modules/svgo/node_modules/color-name/package.json
@@ -0,0 +1,28 @@
+{
+  "name": "color-name",
+  "version": "1.1.4",
+  "description": "A list of color names and its values",
+  "main": "index.js",
+  "files": [
+    "index.js"
+  ],
+  "scripts": {
+    "test": "node test.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git@github.com:colorjs/color-name.git"
+  },
+  "keywords": [
+    "color-name",
+    "color",
+    "color-keyword",
+    "keyword"
+  ],
+  "author": "DY <dfcreative@gmail.com>",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/colorjs/color-name/issues"
+  },
+  "homepage": "https://github.com/colorjs/color-name"
+}
diff --git a/node_modules/svgo/node_modules/commander/CHANGELOG.md b/node_modules/svgo/node_modules/commander/CHANGELOG.md
new file mode 100644
index 0000000..0b55881
--- /dev/null
+++ b/node_modules/svgo/node_modules/commander/CHANGELOG.md
@@ -0,0 +1,440 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). (Format adopted after v3.0.0.)
+
+<!-- markdownlint-disable MD024 -->
+<!-- markdownlint-disable MD004 -->
+
+## [7.2.0] (2021-03-26)
+
+### Added
+
+- TypeScript typing for `parent` property on `Command` ([#1475])
+- TypeScript typing for `.attributeName()` on `Option` ([#1483])
+- support information in package ([#1477])
+
+### Changed
+
+- improvements to error messages, README, and tests
+- update dependencies
+
+## [7.1.0] (2021-02-15)
+
+### Added
+
+- support for named imports from ECMAScript modules ([#1440])
+- add `.cjs` to list of expected script file extensions ([#1449])
+- allow using option choices and variadic together ([#1454])
+
+### Fixed
+
+- replace use of deprecated `process.mainModule` ([#1448])
+- regression for legacy `command('*')` and call when command line includes options ([#1464])
+- regression for `on('command:*', ...)` and call when command line includes unknown options ([#1464])
+- display best error for combination of unknown command and unknown option (i.e. unknown command) ([#1464])
+
+### Changed
+
+- make TypeScript typings tests stricter ([#1453])
+- improvements to README and tests
+
+## [7.0.0] (2021-01-15)
+
+### Added
+
+- `.enablePositionalOptions()` to let program and subcommand reuse same option ([#1427])
+- `.passThroughOptions()` to pass options through to other programs without needing `--` ([#1427])
+- `.allowExcessArguments(false)` to show an error message if there are too many command-arguments on command line for the action handler ([#1409])
+- `.configureOutput()` to modify use of stdout and stderr or customise display of errors ([#1387])
+- use `.addHelpText()` to add text before or after the built-in help, for just current command or also for all subcommands ([#1296])
+- enhance Option class ([#1331])
+  - allow hiding options from help
+  - allow restricting option arguments to a list of choices
+  - allow setting how default value is shown in help
+- `.createOption()` to support subclassing of automatically created options (like `.createCommand()`) ([#1380])
+- refactor the code generating the help into a separate public Help class ([#1365])
+  - support sorting subcommands and options in help
+  - support specifying wrap width (columns)
+  - allow subclassing Help class
+  - allow configuring Help class without subclassing
+
+### Changed
+
+- *Breaking:* options are stored safely by default, not as properties on the command ([#1409])
+    - this especially affects accessing options on program, use `program.opts()`
+    - revert behaviour with `.storeOptionsAsProperties()`
+- *Breaking:* action handlers are passed options and command separately ([#1409])
+- deprecated callback parameter to `.help()` and `.outputHelp()` (removed from README) ([#1296])
+- *Breaking:* errors now displayed using `process.stderr.write()` instead of `console.error()`
+- deprecate `.on('--help')` (removed from README) ([#1296])
+- initialise the command description to empty string (previously undefined) ([#1365])
+- document and annotate deprecated routines ([#1349])
+
+### Fixed
+
+- wrapping bugs in help ([#1365])
+  - first line of command description was wrapping two characters early
+  - pad width calculation was not including help option and help command
+  - pad width calculation was including hidden options and commands
+- improve backwards compatibility for custom command event listeners ([#1403])
+  
+### Deleted
+
+- *Breaking:* `.passCommandToAction()` ([#1409])
+    - no longer needed as action handler is passed options and command
+- *Breaking:* "extra arguments" parameter to action handler ([#1409])
+    - if being used to detect excess arguments, there is now an error available by setting `.allowExcessArguments(false)`
+
+### Migration Tips
+
+The biggest change is the parsed option values. Previously the options were stored by default as properties on the command object, and now the options are stored separately.
+
+If you wish to restore the old behaviour and get running quickly you can call `.storeOptionsAsProperties()`. 
+To allow you to move to the new code patterns incrementally, the action handler will be passed the command _twice_,
+to match the new "options" and "command" parameters (see below).
+
+**program options**
+
+Use the `.opts()` method to access the options. This is available on any command but is used most with the program.
+
+```js
+program.option('-d, --debug');
+program.parse();
+// Old code before Commander 7
+if (program.debug) console.log(`Program name is ${program.name()}`);
+```
+
+```js
+// New code
+const options = program.opts();
+if (options.debug) console.log(`Program name is ${program.name()}`);
+```
+
+**action handler**
+
+The action handler gets passed a parameter for each command-argument you declared. Previously by default the next parameter was the command object with the options as properties. Now the next two parameters are instead the options and the command. If you
+only accessed the options there may be no code changes required.
+
+```js
+program
+  .command('compress <filename>')
+  .option('-t, --trace')
+  // Old code before Commander 7
+  .action((filename, cmd)) => {
+    if (cmd.trace) console.log(`Command name is ${cmd.name()}`);
+  });
+```
+
+```js
+  // New code
+  .action((filename, options, command)) => {
+    if (options.trace) console.log(`Command name is ${command.name()}`);
+  });
+```
+
+If you already set `.storeOptionsAsProperties(false)` you may still need to adjust your code.
+
+```js
+program
+  .command('compress <filename>')
+  .storeOptionsAsProperties(false)
+  .option('-t, --trace')
+  // Old code before Commander 7
+  .action((filename, command)) => {
+    if (command.opts().trace) console.log(`Command name is ${command.name()}`);
+  });
+```
+
+```js
+   // New code
+   .action((filename, options, command)) => {
+      if (command.opts().trace) console.log(`Command name is ${command.name()}`);
+   });
+```
+
+## [7.0.0-2] (2020-12-14)
+
+(Released in 7.0.0)
+
+## [7.0.0-1] (2020-11-21)
+
+(Released in 7.0.0)
+
+## [7.0.0-0] (2020-10-25)
+
+(Released in 7.0.0)
+
+## [6.2.1] (2020-12-13)
+
+### Fixed
+
+- some tests failed if directory path included a space ([1390])
+
+## [6.2.0] (2020-10-25)
+
+### Added
+
+- added 'tsx' file extension for stand-alone executable subcommands ([#1368])
+- documented second parameter to `.description()` to describe command arguments ([#1353])
+- documentation of special cases with options taking varying numbers of option-arguments ([#1332])
+- documentation for terminology ([#1361])
+  
+### Fixed
+
+- add missing TypeScript definition for `.addHelpCommand()' ([#1375])
+- removed blank line after "Arguments:" in help, to match "Options:" and "Commands:" ([#1360])
+
+### Changed
+
+- update dependencies
+
+## [6.1.0] (2020-08-28)
+
+### Added
+
+- include URL to relevant section of README for error for potential conflict between Command properties and option values ([#1306])
+- `.combineFlagAndOptionalValue(false)` to ease upgrade path from older versions of Commander ([#1326])
+- allow disabling the built-in help option using `.helpOption(false)` ([#1325])
+- allow just some arguments in `argumentDescription` to `.description()` ([#1323])
+
+### Changed
+
+- tidy async test and remove lint override ([#1312])
+
+### Fixed
+
+- executable subcommand launching when script path not known ([#1322])
+
+## [6.0.0] (2020-07-21)
+
+### Added
+
+- add support for variadic options ([#1250])
+- allow options to be added with just a short flag ([#1256])
+  - *Breaking* the option property has same case as flag. e.g. flag `-n` accessed as `opts().n` (previously uppercase)
+- *Breaking* throw an error if there might be a clash between option name and a Command property, with advice on how to resolve ([#1275])
+
+### Fixed
+
+- Options which contain -no- in the middle of the option flag should not be treated as negatable. ([#1301])
+
+## [6.0.0-0] (2020-06-20)
+
+(Released in 6.0.0)
+
+## [5.1.0] (2020-04-25)
+
+### Added
+
+- support for multiple command aliases, the first of which is shown in the auto-generated help ([#531], [#1236])
+- configuration support in `addCommand()` for `hidden` and `isDefault` ([#1232])
+
+### Fixed
+
+- omit masked help flags from the displayed help ([#645], [#1247])
+- remove old short help flag when change help flags using `helpOption` ([#1248])
+
+### Changed
+
+- remove use of `arguments` to improve auto-generated help in editors ([#1235])
+- rename `.command()` configuration `noHelp` to `hidden` (but not remove old support) ([#1232])
+- improvements to documentation
+- update dependencies
+- update tested versions of node
+- eliminate lint errors in TypeScript ([#1208])
+
+## [5.0.0] (2020-03-14)
+
+### Added
+
+* support for nested commands with action-handlers ([#1] [#764] [#1149])
+* `.addCommand()` for adding a separately configured command ([#764] [#1149])
+* allow a non-executable to be set as the default command ([#742] [#1149])
+* implicit help command when there are subcommands (previously only if executables) ([#1149])
+* customise implicit help command with `.addHelpCommand()` ([#1149])
+* display error message for unknown subcommand, by default ([#432] [#1088] [#1149])
+* display help for missing subcommand, by default ([#1088] [#1149])
+* combined short options as single argument may include boolean flags and value flag and value (e.g. `-a -b -p 80` can be written as `-abp80`) ([#1145])
+* `.parseOption()` includes short flag and long flag expansions ([#1145])
+* `.helpInformation()` returns help text as a string, previously a private routine ([#1169])
+* `.parse()` implicitly uses `process.argv` if arguments not specified ([#1172])
+* optionally specify where `.parse()` arguments "from", if not following node conventions ([#512] [#1172])
+* suggest help option along with unknown command error ([#1179])
+* TypeScript definition for `commands` property of `Command` ([#1184])
+* export `program` property ([#1195])
+* `createCommand` factory method to simplify subclassing ([#1191])
+
+### Fixed
+
+* preserve argument order in subcommands ([#508] [#962] [#1138])
+* do not emit `command:*` for executable subcommands ([#809] [#1149])
+* action handler called whether or not there are non-option arguments ([#1062] [#1149])
+* combining option short flag and value in single argument now works for subcommands ([#1145])
+* only add implicit help command when it will not conflict with other uses of argument ([#1153] [#1149])
+* implicit help command works with command aliases ([#948] [#1149])
+* options are validated whether or not there is an action handler ([#1149])
+
+### Changed
+
+* *Breaking* `.args` contains command arguments with just recognised options removed ([#1032] [#1138])
+* *Breaking* display error if required argument for command is missing ([#995] [#1149])
+* tighten TypeScript definition of custom option processing function passed to `.option()` ([#1119])
+* *Breaking* `.allowUnknownOption()` ([#802] [#1138])
+  * unknown options included in arguments passed to command action handler
+  * unknown options included in `.args`
+* only recognised option short flags and long flags are expanded (e.g. `-ab` or `--foo=bar`) ([#1145])
+* *Breaking* `.parseOptions()` ([#1138])
+  * `args` in returned result renamed `operands` and does not include anything after first unknown option
+  * `unknown` in returned result has arguments after first unknown option including operands, not just options and values
+* *Breaking* `.on('command:*', callback)` and other command events passed (changed) results from `.parseOptions`, i.e. operands and unknown  ([#1138])
+* refactor Option from prototype to class ([#1133])
+* refactor Command from prototype to class ([#1159])
+* changes to error handling ([#1165])
+  * throw for author error, not just display message
+  * preflight for variadic error
+  * add tips to missing subcommand executable
+* TypeScript fluent return types changed to be more subclass friendly, return `this` rather than `Command` ([#1180])
+* `.parseAsync` returns `Promise<this>` to be consistent with `.parse()` ([#1180])
+* update dependencies
+
+### Removed
+
+* removed EventEmitter from TypeScript definition for Command, eliminating implicit peer dependency on `@types/node` ([#1146])
+* removed private function `normalize` (the functionality has been integrated into `parseOptions`) ([#1145])
+* `parseExpectedArgs` is now private ([#1149])
+
+### Migration Tips
+
+If you use `.on('command:*')` or more complicated tests to detect an unrecognised subcommand, you may be able to delete the code and rely on the default behaviour.
+
+If you use `program.args` or more complicated tests to detect a missing subcommand, you may be able to delete the code and rely on the default behaviour.
+
+If you use `.command('*')` to add a default command, you may be be able to switch to `isDefault:true` with a named command.
+
+If you want to continue combining short options with optional values as though they were boolean flags, set `combineFlagAndOptionalValue(false)`
+to expand `-fb` to `-f -b` rather than `-f b`.
+
+## [5.0.0-4] (2020-03-03)
+
+(Released in 5.0.0)
+
+## [5.0.0-3] (2020-02-20)
+
+(Released in 5.0.0)
+
+## [5.0.0-2] (2020-02-10)
+
+(Released in 5.0.0)
+
+## [5.0.0-1] (2020-02-08)
+
+(Released in 5.0.0)
+
+## [5.0.0-0] (2020-02-02)
+
+(Released in 5.0.0)
+
+## Older versions
+
+* [4.x](./changelogs/CHANGELOG-4.md)
+* [3.x](./changelogs/CHANGELOG-3.md)
+* [2.x](./changelogs/CHANGELOG-2.md)
+* [1.x](./changelogs/CHANGELOG-1.md)
+* [0.x](./changelogs/CHANGELOG-0.md)
+
+[#1]: https://github.com/tj/commander.js/issues/1
+[#432]: https://github.com/tj/commander.js/issues/432
+[#508]: https://github.com/tj/commander.js/issues/508
+[#512]: https://github.com/tj/commander.js/issues/512
+[#531]: https://github.com/tj/commander.js/issues/531
+[#645]: https://github.com/tj/commander.js/issues/645
+[#742]: https://github.com/tj/commander.js/issues/742
+[#764]: https://github.com/tj/commander.js/issues/764
+[#802]: https://github.com/tj/commander.js/issues/802
+[#809]: https://github.com/tj/commander.js/issues/809
+[#948]: https://github.com/tj/commander.js/issues/948
+[#962]: https://github.com/tj/commander.js/issues/962
+[#995]: https://github.com/tj/commander.js/issues/995
+[#1032]: https://github.com/tj/commander.js/issues/1032
+[#1062]: https://github.com/tj/commander.js/pull/1062
+[#1088]: https://github.com/tj/commander.js/issues/1088
+[#1119]: https://github.com/tj/commander.js/pull/1119
+[#1133]: https://github.com/tj/commander.js/pull/1133
+[#1138]: https://github.com/tj/commander.js/pull/1138
+[#1145]: https://github.com/tj/commander.js/pull/1145
+[#1146]: https://github.com/tj/commander.js/pull/1146
+[#1149]: https://github.com/tj/commander.js/pull/1149
+[#1153]: https://github.com/tj/commander.js/issues/1153
+[#1159]: https://github.com/tj/commander.js/pull/1159
+[#1165]: https://github.com/tj/commander.js/pull/1165
+[#1169]: https://github.com/tj/commander.js/pull/1169
+[#1172]: https://github.com/tj/commander.js/pull/1172
+[#1179]: https://github.com/tj/commander.js/pull/1179
+[#1180]: https://github.com/tj/commander.js/pull/1180
+[#1184]: https://github.com/tj/commander.js/pull/1184
+[#1191]: https://github.com/tj/commander.js/pull/1191
+[#1195]: https://github.com/tj/commander.js/pull/1195
+[#1208]: https://github.com/tj/commander.js/pull/1208
+[#1232]: https://github.com/tj/commander.js/pull/1232
+[#1235]: https://github.com/tj/commander.js/pull/1235
+[#1236]: https://github.com/tj/commander.js/pull/1236
+[#1247]: https://github.com/tj/commander.js/pull/1247
+[#1248]: https://github.com/tj/commander.js/pull/1248
+[#1250]: https://github.com/tj/commander.js/pull/1250
+[#1256]: https://github.com/tj/commander.js/pull/1256
+[#1275]: https://github.com/tj/commander.js/pull/1275
+[#1296]: https://github.com/tj/commander.js/pull/1296
+[#1301]: https://github.com/tj/commander.js/issues/1301
+[#1306]: https://github.com/tj/commander.js/pull/1306
+[#1312]: https://github.com/tj/commander.js/pull/1312
+[#1322]: https://github.com/tj/commander.js/pull/1322
+[#1323]: https://github.com/tj/commander.js/pull/1323
+[#1325]: https://github.com/tj/commander.js/pull/1325
+[#1326]: https://github.com/tj/commander.js/pull/1326
+[#1331]: https://github.com/tj/commander.js/pull/1331
+[#1332]: https://github.com/tj/commander.js/pull/1332
+[#1349]: https://github.com/tj/commander.js/pull/1349
+[#1353]: https://github.com/tj/commander.js/pull/1353
+[#1360]: https://github.com/tj/commander.js/pull/1360
+[#1361]: https://github.com/tj/commander.js/pull/1361
+[#1365]: https://github.com/tj/commander.js/pull/1365
+[#1368]: https://github.com/tj/commander.js/pull/1368
+[#1375]: https://github.com/tj/commander.js/pull/1375
+[#1380]: https://github.com/tj/commander.js/pull/1380
+[#1387]: https://github.com/tj/commander.js/pull/1387
+[#1390]: https://github.com/tj/commander.js/pull/1390
+[#1403]: https://github.com/tj/commander.js/pull/1403
+[#1409]: https://github.com/tj/commander.js/pull/1409
+[#1427]: https://github.com/tj/commander.js/pull/1427
+[#1440]: https://github.com/tj/commander.js/pull/1440
+[#1448]: https://github.com/tj/commander.js/pull/1448
+[#1449]: https://github.com/tj/commander.js/pull/1449
+[#1453]: https://github.com/tj/commander.js/pull/1453
+[#1454]: https://github.com/tj/commander.js/pull/1454
+[#1464]: https://github.com/tj/commander.js/pull/1464
+[#1475]: https://github.com/tj/commander.js/pull/1475
+[#1477]: https://github.com/tj/commander.js/pull/1477
+[#1483]: https://github.com/tj/commander.js/pull/1483
+
+[Unreleased]: https://github.com/tj/commander.js/compare/master...develop
+[7.2.0]: https://github.com/tj/commander.js/compare/v7.1.0...v7.2.0
+[7.1.0]: https://github.com/tj/commander.js/compare/v7.0.0...v7.1.0
+[7.0.0]: https://github.com/tj/commander.js/compare/v6.2.1...v7.0.0
+[7.0.0-2]: https://github.com/tj/commander.js/compare/v7.0.0-1...v7.0.0-2
+[7.0.0-1]: https://github.com/tj/commander.js/compare/v7.0.0-0...v7.0.0-1
+[7.0.0-0]: https://github.com/tj/commander.js/compare/v6.2.0...v7.0.0-0
+[6.2.1]: https://github.com/tj/commander.js/compare/v6.2.0..v6.2.1
+[6.2.0]: https://github.com/tj/commander.js/compare/v6.1.0..v6.2.0
+[6.1.0]: https://github.com/tj/commander.js/compare/v6.0.0..v6.1.0
+[6.0.0]: https://github.com/tj/commander.js/compare/v5.1.0..v6.0.0
+[6.0.0-0]: https://github.com/tj/commander.js/compare/v5.1.0..v6.0.0-0
+[5.1.0]: https://github.com/tj/commander.js/compare/v5.0.0..v5.1.0
+[5.0.0]: https://github.com/tj/commander.js/compare/v4.1.1..v5.0.0
+[5.0.0-4]: https://github.com/tj/commander.js/compare/v5.0.0-3..v5.0.0-4
+[5.0.0-3]: https://github.com/tj/commander.js/compare/v5.0.0-2..v5.0.0-3
+[5.0.0-2]: https://github.com/tj/commander.js/compare/v5.0.0-1..v5.0.0-2
+[5.0.0-1]: https://github.com/tj/commander.js/compare/v5.0.0-0..v5.0.0-1
+[5.0.0-0]: https://github.com/tj/commander.js/compare/v4.1.1..v5.0.0-0
diff --git a/node_modules/svgo/node_modules/commander/LICENSE b/node_modules/svgo/node_modules/commander/LICENSE
new file mode 100644
index 0000000..10f997a
--- /dev/null
+++ b/node_modules/svgo/node_modules/commander/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/svgo/node_modules/commander/Readme.md b/node_modules/svgo/node_modules/commander/Readme.md
new file mode 100644
index 0000000..d2a88a7
--- /dev/null
+++ b/node_modules/svgo/node_modules/commander/Readme.md
@@ -0,0 +1,917 @@
+# Commander.js
+
+[![Build Status](https://github.com/tj/commander.js/workflows/build/badge.svg)](https://github.com/tj/commander.js/actions?query=workflow%3A%22build%22)
+[![NPM Version](http://img.shields.io/npm/v/commander.svg?style=flat)](https://www.npmjs.org/package/commander)
+[![NPM Downloads](https://img.shields.io/npm/dm/commander.svg?style=flat)](https://npmcharts.com/compare/commander?minimal=true)
+[![Install Size](https://packagephobia.now.sh/badge?p=commander)](https://packagephobia.now.sh/result?p=commander)
+
+The complete solution for [node.js](http://nodejs.org) command-line interfaces.
+
+Read this in other languages: English | [简体中文](./Readme_zh-CN.md)
+
+- [Commander.js](#commanderjs)
+  - [Installation](#installation)
+  - [Declaring _program_ variable](#declaring-program-variable)
+  - [Options](#options)
+    - [Common option types, boolean and value](#common-option-types-boolean-and-value)
+    - [Default option value](#default-option-value)
+    - [Other option types, negatable boolean and boolean|value](#other-option-types-negatable-boolean-and-booleanvalue)
+    - [Required option](#required-option)
+    - [Variadic option](#variadic-option)
+    - [Version option](#version-option)
+    - [More configuration](#more-configuration)
+    - [Custom option processing](#custom-option-processing)
+  - [Commands](#commands)
+    - [Specify the argument syntax](#specify-the-argument-syntax)
+    - [Action handler](#action-handler)
+    - [Stand-alone executable (sub)commands](#stand-alone-executable-subcommands)
+  - [Automated help](#automated-help)
+    - [Custom help](#custom-help)
+    - [Display help from code](#display-help-from-code)
+    - [.usage and .name](#usage-and-name)
+    - [.helpOption(flags, description)](#helpoptionflags-description)
+    - [.addHelpCommand()](#addhelpcommand)
+    - [More configuration](#more-configuration-1)
+  - [Custom event listeners](#custom-event-listeners)
+  - [Bits and pieces](#bits-and-pieces)
+    - [.parse() and .parseAsync()](#parse-and-parseasync)
+    - [Parsing Configuration](#parsing-configuration)
+    - [Legacy options as properties](#legacy-options-as-properties)
+    - [TypeScript](#typescript)
+    - [createCommand()](#createcommand)
+    - [Node options such as `--harmony`](#node-options-such-as---harmony)
+    - [Debugging stand-alone executable subcommands](#debugging-stand-alone-executable-subcommands)
+    - [Override exit and output handling](#override-exit-and-output-handling)
+    - [Additional documentation](#additional-documentation)
+  - [Examples](#examples)
+  - [Support](#support)
+    - [Commander for enterprise](#commander-for-enterprise)
+
+For information about terms used in this document see: [terminology](./docs/terminology.md)
+
+## Installation
+
+```bash
+npm install commander
+```
+
+## Declaring _program_ variable
+
+Commander exports a global object which is convenient for quick programs.
+This is used in the examples in this README for brevity.
+
+```js
+const { program } = require('commander');
+program.version('0.0.1');
+```
+
+For larger programs which may use commander in multiple ways, including unit testing, it is better to create a local Command object to use.
+
+```js
+const { Command } = require('commander');
+const program = new Command();
+program.version('0.0.1');
+```
+
+For named imports in ECMAScript modules, import from `commander/esm.mjs`.
+
+```js
+// index.mjs
+import { Command } from 'commander/esm.mjs';
+const program = new Command();
+```
+
+And in TypeScript:
+
+```ts
+// index.ts
+import { Command } from 'commander';
+const program = new Command();
+```
+
+
+## Options
+
+Options are defined with the `.option()` method, also serving as documentation for the options. Each option can have a short flag (single character) and a long name, separated by a comma or space or vertical bar ('|').
+
+The parsed options can be accessed by calling `.opts()` on a `Command` object, and are passed to the action handler. Multi-word options such as "--template-engine" are camel-cased, becoming `program.opts().templateEngine` etc.
+
+Multiple short flags may optionally be combined in a single argument following the dash: boolean flags, followed by a single option taking a value (possibly followed by the value).
+For example `-a -b -p 80` may be written as `-ab -p80` or even `-abp80`.
+
+You can use `--` to indicate the end of the options, and any remaining arguments will be used without being interpreted.
+
+By default options on the command line are not positional, and can be specified before or after other arguments.
+
+### Common option types, boolean and value
+
+The two most used option types are a boolean option, and an option which takes its value
+from the following argument (declared with angle brackets like `--expect <value>`). Both are `undefined` unless specified on command line.  
+
+Example file: [options-common.js](./examples/options-common.js)
+
+```js
+program
+  .option('-d, --debug', 'output extra debugging')
+  .option('-s, --small', 'small pizza size')
+  .option('-p, --pizza-type <type>', 'flavour of pizza');
+
+program.parse(process.argv);
+
+const options = program.opts();
+if (options.debug) console.log(options);
+console.log('pizza details:');
+if (options.small) console.log('- small pizza size');
+if (options.pizzaType) console.log(`- ${options.pizzaType}`);
+```
+
+```bash
+$ pizza-options -d
+{ debug: true, small: undefined, pizzaType: undefined }
+pizza details:
+$ pizza-options -p
+error: option '-p, --pizza-type <type>' argument missing
+$ pizza-options -ds -p vegetarian
+{ debug: true, small: true, pizzaType: 'vegetarian' }
+pizza details:
+- small pizza size
+- vegetarian
+$ pizza-options --pizza-type=cheese
+pizza details:
+- cheese
+```
+
+`program.parse(arguments)` processes the arguments, leaving any args not consumed by the program options in the `program.args` array. The parameter is optional and defaults to `process.argv`.
+
+### Default option value
+
+You can specify a default value for an option which takes a value.
+
+Example file: [options-defaults.js](./examples/options-defaults.js)
+
+```js
+program
+  .option('-c, --cheese <type>', 'add the specified type of cheese', 'blue');
+
+program.parse();
+
+console.log(`cheese: ${program.opts().cheese}`);
+```
+
+```bash
+$ pizza-options
+cheese: blue
+$ pizza-options --cheese stilton
+cheese: stilton
+```
+
+### Other option types, negatable boolean and boolean|value
+
+You can define a boolean option long name with a leading `no-` to set the option value to false when used.
+Defined alone this also makes the option true by default.
+
+If you define `--foo` first, adding `--no-foo` does not change the default value from what it would
+otherwise be. You can specify a default boolean value for a boolean option and it can be overridden on command line.
+
+Example file: [options-negatable.js](./examples/options-negatable.js)
+
+```js
+program
+  .option('--no-sauce', 'Remove sauce')
+  .option('--cheese <flavour>', 'cheese flavour', 'mozzarella')
+  .option('--no-cheese', 'plain with no cheese')
+  .parse();
+
+const options = program.opts();
+const sauceStr = options.sauce ? 'sauce' : 'no sauce';
+const cheeseStr = (options.cheese === false) ? 'no cheese' : `${options.cheese} cheese`;
+console.log(`You ordered a pizza with ${sauceStr} and ${cheeseStr}`);
+```
+
+```bash
+$ pizza-options
+You ordered a pizza with sauce and mozzarella cheese
+$ pizza-options --sauce
+error: unknown option '--sauce'
+$ pizza-options --cheese=blue
+You ordered a pizza with sauce and blue cheese
+$ pizza-options --no-sauce --no-cheese
+You ordered a pizza with no sauce and no cheese
+```
+
+You can specify an option which may be used as a boolean option but may optionally take an option-argument
+(declared with square brackets like `--optional [value]`).
+
+Example file: [options-boolean-or-value.js](./examples/options-boolean-or-value.js)
+
+```js
+program
+  .option('-c, --cheese [type]', 'Add cheese with optional type');
+
+program.parse(process.argv);
+
+const options = program.opts();
+if (options.cheese === undefined) console.log('no cheese');
+else if (options.cheese === true) console.log('add cheese');
+else console.log(`add cheese type ${options.cheese}`);
+```
+
+```bash
+$ pizza-options
+no cheese
+$ pizza-options --cheese
+add cheese
+$ pizza-options --cheese mozzarella
+add cheese type mozzarella
+```
+
+For information about possible ambiguous cases, see [options taking varying arguments](./docs/options-taking-varying-arguments.md).
+
+### Required option
+
+You may specify a required (mandatory) option using `.requiredOption`. The option must have a value after parsing, usually specified on the command line, or perhaps from a default value (say from environment). The method is otherwise the same as `.option` in format, taking flags and description, and optional default value or custom processing.
+
+Example file: [options-required.js](./examples/options-required.js)
+
+```js
+program
+  .requiredOption('-c, --cheese <type>', 'pizza must have cheese');
+
+program.parse();
+```
+
+```bash
+$ pizza
+error: required option '-c, --cheese <type>' not specified
+```
+
+### Variadic option
+
+You may make an option variadic by appending `...` to the value placeholder when declaring the option. On the command line you
+can then specify multiple option-arguments, and the parsed option value will be an array. The extra arguments
+are read until the first argument starting with a dash. The special argument `--` stops option processing entirely. If a value
+is specified in the same argument as the option then no further values are read.
+
+Example file: [options-variadic.js](./examples/options-variadic.js)
+
+```js
+program
+  .option('-n, --number <numbers...>', 'specify numbers')
+  .option('-l, --letter [letters...]', 'specify letters');
+
+program.parse();
+
+console.log('Options: ', program.opts());
+console.log('Remaining arguments: ', program.args);
+```
+
+```bash
+$ collect -n 1 2 3 --letter a b c
+Options:  { number: [ '1', '2', '3' ], letter: [ 'a', 'b', 'c' ] }
+Remaining arguments:  []
+$ collect --letter=A -n80 operand
+Options:  { number: [ '80' ], letter: [ 'A' ] }
+Remaining arguments:  [ 'operand' ]
+$ collect --letter -n 1 -n 2 3 -- operand
+Options:  { number: [ '1', '2', '3' ], letter: true }
+Remaining arguments:  [ 'operand' ]
+```
+
+For information about possible ambiguous cases, see [options taking varying arguments](./docs/options-taking-varying-arguments.md).
+
+### Version option
+
+The optional `version` method adds handling for displaying the command version. The default option flags are `-V` and `--version`, and when present the command prints the version number and exits.
+
+```js
+program.version('0.0.1');
+```
+
+```bash
+$ ./examples/pizza -V
+0.0.1
+```
+
+You may change the flags and description by passing additional parameters to the `version` method, using
+the same syntax for flags as the `option` method.
+
+```js
+program.version('0.0.1', '-v, --vers', 'output the current version');
+```
+
+### More configuration
+
+You can add most options using the `.option()` method, but there are some additional features available
+by constructing an `Option` explicitly for less common cases.
+
+Example file: [options-extra.js](./examples/options-extra.js)
+
+```js
+program
+  .addOption(new Option('-s, --secret').hideHelp())
+  .addOption(new Option('-t, --timeout <delay>', 'timeout in seconds').default(60, 'one minute'))
+  .addOption(new Option('-d, --drink <size>', 'drink size').choices(['small', 'medium', 'large']));
+```
+
+```bash
+$ extra --help
+Usage: help [options]
+
+Options:
+  -t, --timeout <delay>  timeout in seconds (default: one minute)
+  -d, --drink <size>     drink cup size (choices: "small", "medium", "large")
+  -h, --help             display help for command
+
+$ extra --drink huge
+error: option '-d, --drink <size>' argument 'huge' is invalid. Allowed choices are small, medium, large.
+```
+
+### Custom option processing
+
+You may specify a function to do custom processing of option-arguments. The callback function receives two parameters,
+the user specified option-argument and the previous value for the option. It returns the new value for the option.
+
+This allows you to coerce the option-argument to the desired type, or accumulate values, or do entirely custom processing.
+
+You can optionally specify the default/starting value for the option after the function parameter.
+
+Example file: [options-custom-processing.js](./examples/options-custom-processing.js)
+
+```js
+function myParseInt(value, dummyPrevious) {
+  // parseInt takes a string and a radix
+  const parsedValue = parseInt(value, 10);
+  if (isNaN(parsedValue)) {
+    throw new commander.InvalidOptionArgumentError('Not a number.');
+  }
+  return parsedValue;
+}
+
+function increaseVerbosity(dummyValue, previous) {
+  return previous + 1;
+}
+
+function collect(value, previous) {
+  return previous.concat([value]);
+}
+
+function commaSeparatedList(value, dummyPrevious) {
+  return value.split(',');
+}
+
+program
+  .option('-f, --float <number>', 'float argument', parseFloat)
+  .option('-i, --integer <number>', 'integer argument', myParseInt)
+  .option('-v, --verbose', 'verbosity that can be increased', increaseVerbosity, 0)
+  .option('-c, --collect <value>', 'repeatable value', collect, [])
+  .option('-l, --list <items>', 'comma separated list', commaSeparatedList)
+;
+
+program.parse();
+
+const options = program.opts();
+if (options.float !== undefined) console.log(`float: ${options.float}`);
+if (options.integer !== undefined) console.log(`integer: ${options.integer}`);
+if (options.verbose > 0) console.log(`verbosity: ${options.verbose}`);
+if (options.collect.length > 0) console.log(options.collect);
+if (options.list !== undefined) console.log(options.list);
+```
+
+```bash
+$ custom -f 1e2
+float: 100
+$ custom --integer 2
+integer: 2
+$ custom -v -v -v
+verbose: 3
+$ custom -c a -c b -c c
+[ 'a', 'b', 'c' ]
+$ custom --list x,y,z
+[ 'x', 'y', 'z' ]
+```
+
+## Commands
+
+You can specify (sub)commands using `.command()` or `.addCommand()`. There are two ways these can be implemented: using an action handler attached to the command, or as a stand-alone executable file (described in more detail later). The subcommands may be nested ([example](./examples/nestedCommands.js)).
+
+In the first parameter to `.command()` you specify the command name and any command-arguments. The arguments may be `<required>` or `[optional]`, and the last argument may also be `variadic...`.
+
+You can use `.addCommand()` to add an already configured subcommand to the program.
+
+For example:
+
+```js
+// Command implemented using action handler (description is supplied separately to `.command`)
+// Returns new command for configuring.
+program
+  .command('clone <source> [destination]')
+  .description('clone a repository into a newly created directory')
+  .action((source, destination) => {
+    console.log('clone command called');
+  });
+
+// Command implemented using stand-alone executable file (description is second parameter to `.command`)
+// Returns `this` for adding more commands.
+program
+  .command('start <service>', 'start named service')
+  .command('stop [service]', 'stop named service, or all if no name supplied');
+
+// Command prepared separately.
+// Returns `this` for adding more commands.
+program
+  .addCommand(build.makeBuildCommand());
+```
+
+Configuration options can be passed with the call to `.command()` and `.addCommand()`. Specifying `hidden: true` will 
+remove the command from the generated help output. Specifying `isDefault: true` will run the subcommand if no other
+subcommand is specified ([example](./examples/defaultCommand.js)).
+
+### Specify the argument syntax
+
+You use `.arguments` to specify the expected command-arguments for the top-level command, and for subcommands they are usually
+included in the `.command` call. Angled brackets (e.g. `<required>`) indicate required command-arguments.
+Square brackets (e.g. `[optional]`) indicate optional command-arguments.
+You can optionally describe the arguments in the help by supplying a hash as second parameter to `.description()`.
+
+Example file: [arguments.js](./examples/arguments.js)
+
+```js
+program
+  .version('0.1.0')
+  .arguments('<username> [password]')
+  .description('test command', {
+    username: 'user to login',
+    password: 'password for user, if required'
+  })
+  .action((username, password) => {
+    console.log('username:', username);
+    console.log('environment:', password || 'no password given');
+  });
+```
+
+ The last argument of a command can be variadic, and only the last argument.  To make an argument variadic you
+ append `...` to the argument name. For example:
+
+```js
+program
+  .version('0.1.0')
+  .command('rmdir <dirs...>')
+  .action(function (dirs) {
+    dirs.forEach((dir) => {
+      console.log('rmdir %s', dir);
+    });
+  });
+```
+
+The variadic argument is passed to the action handler as an array.
+
+### Action handler
+
+The action handler gets passed a parameter for each command-argument you declared, and two additional parameters
+which are the parsed options and the command object itself. 
+
+Example file: [thank.js](./examples/thank.js)
+
+```js
+program
+  .arguments('<name>')
+  .option('-t, --title <honorific>', 'title to use before name')
+  .option('-d, --debug', 'display some debugging')
+  .action((name, options, command) => {
+    if (options.debug) {
+      console.error('Called %s with options %o', command.name(), options);
+    }
+    const title = options.title ? `${options.title} ` : '';
+    console.log(`Thank-you ${title}${name}`);
+  });
+```
+
+You may supply an `async` action handler, in which case you call `.parseAsync` rather than `.parse`.
+
+```js
+async function run() { /* code goes here */ }
+
+async function main() {
+  program
+    .command('run')
+    .action(run);
+  await program.parseAsync(process.argv);
+}
+```
+
+A command's options and arguments on the command line are validated when the command is used. Any unknown options or missing arguments will be reported as an error. You can suppress the unknown option checks with `.allowUnknownOption()`. By default it is not an error to
+pass more arguments than declared, but you can make this an error with `.allowExcessArguments(false)`.
+
+### Stand-alone executable (sub)commands
+
+When `.command()` is invoked with a description argument, this tells Commander that you're going to use stand-alone executables for subcommands.
+Commander will search the executables in the directory of the entry script (like `./examples/pm`) with the name `program-subcommand`, like `pm-install`, `pm-search`.
+You can specify a custom name with the `executableFile` configuration option.
+
+You handle the options for an executable (sub)command in the executable, and don't declare them at the top-level.
+
+Example file: [pm](./examples/pm)
+
+```js
+program
+  .version('0.1.0')
+  .command('install [name]', 'install one or more packages')
+  .command('search [query]', 'search with optional query')
+  .command('update', 'update installed packages', { executableFile: 'myUpdateSubCommand' })
+  .command('list', 'list packages installed', { isDefault: true });
+
+program.parse(process.argv);
+```
+
+If the program is designed to be installed globally, make sure the executables have proper modes, like `755`.
+
+## Automated help
+
+The help information is auto-generated based on the information commander already knows about your program. The default
+help option is `-h,--help`.
+
+Example file: [pizza](./examples/pizza)
+
+```bash
+$ node ./examples/pizza --help
+Usage: pizza [options]
+
+An application for pizza ordering
+
+Options:
+  -p, --peppers        Add peppers
+  -c, --cheese <type>  Add the specified type of cheese (default: "marble")
+  -C, --no-cheese      You do not want any cheese
+  -h, --help           display help for command
+```
+
+A `help` command is added by default if your command has subcommands. It can be used alone, or with a subcommand name to show
+further help for the subcommand. These are effectively the same if the `shell` program has implicit help:
+
+```bash
+shell help
+shell --help
+
+shell help spawn
+shell spawn --help
+```
+
+### Custom help
+
+You can add extra text to be displayed along with the built-in help. 
+
+Example file: [custom-help](./examples/custom-help)
+
+```js
+program
+  .option('-f, --foo', 'enable some foo');
+
+program.addHelpText('after', `
+
+Example call:
+  $ custom-help --help`);
+```
+
+Yields the following help output:
+
+```Text
+Usage: custom-help [options]
+
+Options:
+  -f, --foo   enable some foo
+  -h, --help  display help for command
+
+Example call:
+  $ custom-help --help
+```
+
+The positions in order displayed are:
+
+- `beforeAll`: add to the program for a global banner or header
+- `before`: display extra information before built-in help
+- `after`: display extra information after built-in help
+- `afterAll`: add to the program for a global footer (epilog)
+
+The positions "beforeAll" and "afterAll" apply to the command and all its subcommands. 
+
+The second parameter can be a string, or a function returning a string. The function is passed a context object for your convenience. The properties are:
+
+- error: a boolean for whether the help is being displayed due to a usage error
+- command: the Command which is displaying the help
+
+### Display help from code
+
+`.help()`: display help information and exit immediately. You can optionally pass `{ error: true }` to display on stderr and exit with an error status.
+
+`.outputHelp()`: output help information without exiting. You can optionally pass `{ error: true }` to display on stderr.
+
+`.helpInformation()`: get the built-in command help information as a string for processing or displaying yourself.
+
+### .usage and .name
+
+These allow you to customise the usage description in the first line of the help. The name is otherwise
+deduced from the (full) program arguments. Given:
+
+```js
+program
+  .name("my-command")
+  .usage("[global options] command")
+```
+
+The help will start with:
+
+```Text
+Usage: my-command [global options] command
+```
+
+### .helpOption(flags, description)
+
+By default every command has a help option. Override the default help flags and description. Pass false to disable the built-in help option.
+
+```js
+program
+  .helpOption('-e, --HELP', 'read more information');
+```
+
+### .addHelpCommand()
+
+A help command is added by default if your command has subcommands. You can explicitly turn on or off the implicit help command with `.addHelpCommand()` and `.addHelpCommand(false)`.
+
+You can both turn on and customise the help command by supplying the name and description:
+
+```js
+program.addHelpCommand('assist [command]', 'show assistance');
+```
+
+### More configuration
+
+The built-in help is formatted using the Help class.
+You can configure the Help behaviour by modifying data properties and methods using `.configureHelp()`, or by subclassing using `.createHelp()` if you prefer.
+
+The data properties are:
+
+- `helpWidth`: specify the wrap width, useful for unit tests
+- `sortSubcommands`: sort the subcommands alphabetically
+- `sortOptions`: sort the options alphabetically
+
+There are methods getting the visible lists of arguments, options, and subcommands. There are methods for formatting the items in the lists, with each item having a _term_ and _description_. Take a look at `.formatHelp()` to see how they are used.
+
+Example file: [configure-help.js](./examples/configure-help.js)
+
+```
+program.configureHelp({
+  sortSubcommands: true,
+  subcommandTerm: (cmd) => cmd.name() // Just show the name, instead of short usage.
+});
+```
+
+## Custom event listeners
+
+You can execute custom actions by listening to command and option events.
+
+```js
+program.on('option:verbose', function () {
+  process.env.VERBOSE = this.opts().verbose;
+});
+
+program.on('command:*', function (operands) {
+  console.error(`error: unknown command '${operands[0]}'`);
+  const availableCommands = program.commands.map(cmd => cmd.name());
+  mySuggestBestMatch(operands[0], availableCommands);
+  process.exitCode = 1;
+});
+```
+
+## Bits and pieces
+
+### .parse() and .parseAsync()
+
+The first argument to `.parse` is the array of strings to parse. You may omit the parameter to implicitly use `process.argv`.
+
+If the arguments follow different conventions than node you can pass a `from` option in the second parameter:
+
+- 'node': default, `argv[0]` is the application and `argv[1]` is the script being run, with user parameters after that
+- 'electron': `argv[1]` varies depending on whether the electron application is packaged
+- 'user': all of the arguments from the user
+
+For example:
+
+```js
+program.parse(process.argv); // Explicit, node conventions
+program.parse(); // Implicit, and auto-detect electron
+program.parse(['-f', 'filename'], { from: 'user' });
+```
+
+### Parsing Configuration
+
+If the default parsing does not suit your needs, there are some behaviours to support other usage patterns.
+
+By default program options are recognised before and after subcommands. To only look for program options before subcommands, use `.enablePositionalOptions()`. This lets you use
+an option for a different purpose in subcommands.
+
+Example file: [positional-options.js](./examples/positional-options.js)
+
+With positional options, the `-b` is a program option in the first line and a subcommand option in the second line:
+
+```sh
+program -b subcommand
+program subcommand -b
+```
+
+By default options are recognised before and after command-arguments. To only process options that come
+before the command-arguments, use `.passThroughOptions()`. This lets you pass the  arguments and following options through to another program
+without needing to use `--` to end the option processing. 
+To use pass through options in a subcommand, the program needs to enable positional options.
+
+Example file: [pass-through-options.js](./examples/pass-through-options.js)
+
+With pass through options, the `--port=80` is a program option in the first line and passed through as a command-argument in the second line:
+
+```sh
+program --port=80 arg
+program arg --port=80
+```
+
+By default the option processing shows an error for an unknown option. To have an unknown option treated as an ordinary command-argument and continue looking for options, use `.allowUnknownOption()`. This lets you mix known and unknown options.
+
+By default the argument processing does not display an error for more command-arguments than expected.
+To display an error for excess arguments, use`.allowExcessArguments(false)`.
+
+### Legacy options as properties 
+
+Before Commander 7, the option values were stored as properties on the command.
+This was convenient to code but the downside was possible clashes with
+existing properties of `Command`. You can revert to the old behaviour to run unmodified legacy code by using `.storeOptionsAsProperties()`.
+
+```js
+program
+  .storeOptionsAsProperties()
+  .option('-d, --debug')
+  .action((commandAndOptions) => {
+    if (commandAndOptions.debug) {
+      console.error(`Called ${commandAndOptions.name()}`);
+    }
+  });
+```
+
+### TypeScript
+
+If you use `ts-node` and  stand-alone executable subcommands written as `.ts` files, you need to call your program through node to get the subcommands called correctly. e.g.
+
+```bash
+node -r ts-node/register pm.ts
+```
+
+### createCommand()
+
+This factory function creates a new command. It is exported and may be used instead of using `new`, like:
+
+```js
+const { createCommand } = require('commander');
+const program = createCommand();
+```
+
+`createCommand` is also a method of the Command object, and creates a new command rather than a subcommand. This gets used internally
+when creating subcommands using `.command()`, and you may override it to
+customise the new subcommand (example file [custom-command-class.js](./examples/custom-command-class.js)).
+
+### Node options such as `--harmony`
+
+You can enable `--harmony` option in two ways:
+
+- Use `#! /usr/bin/env node --harmony` in the subcommands scripts. (Note Windows does not support this pattern.)
+- Use the `--harmony` option when call the command, like `node --harmony examples/pm publish`. The `--harmony` option will be preserved when spawning subcommand process.
+
+### Debugging stand-alone executable subcommands
+
+An executable subcommand is launched as a separate child process.
+
+If you are using the node inspector for [debugging](https://nodejs.org/en/docs/guides/debugging-getting-started/) executable subcommands using `node --inspect` et al,
+the inspector port is incremented by 1 for the spawned subcommand.
+
+If you are using VSCode to debug executable subcommands you need to set the `"autoAttachChildProcesses": true` flag in your launch.json configuration.
+
+### Override exit and output handling
+
+By default Commander calls `process.exit` when it detects errors, or after displaying the help or version. You can override
+this behaviour and optionally supply a callback. The default override throws a `CommanderError`.
+
+The override callback is passed a `CommanderError` with properties `exitCode` number, `code` string, and `message`. The default override behaviour is to throw the error, except for async handling of executable subcommand completion which carries on. The normal display of error messages or version or help
+is not affected by the override which is called after the display.
+
+```js
+program.exitOverride();
+
+try {
+  program.parse(process.argv);
+} catch (err) {
+  // custom processing...
+}
+```
+
+By default Commander is configured for a command-line application and writes to stdout and stderr.
+You can modify this behaviour for custom applications. In addition, you can modify the display of error messages.
+
+Example file: [configure-output.js](./examples/configure-output.js)
+
+
+```js
+function errorColor(str) {
+  // Add ANSI escape codes to display text in red.
+  return `\x1b[31m${str}\x1b[0m`;
+}
+
+program
+  .configureOutput({
+    // Visibly override write routines as example!
+    writeOut: (str) => process.stdout.write(`[OUT] ${str}`),
+    writeErr: (str) => process.stdout.write(`[ERR] ${str}`),
+    // Highlight errors in color.
+    outputError: (str, write) => write(errorColor(str))
+  });
+```
+
+### Additional documentation
+
+There is more information available about:
+
+- [deprecated](./docs/deprecated.md) features still supported for backwards compatibility
+- [options taking varying arguments](./docs/options-taking-varying-arguments.md)
+
+## Examples
+
+In a single command program, you might not need an action handler.
+
+Example file: [pizza](./examples/pizza)
+
+```js
+const { program } = require('commander');
+
+program
+  .description('An application for pizza ordering')
+  .option('-p, --peppers', 'Add peppers')
+  .option('-c, --cheese <type>', 'Add the specified type of cheese', 'marble')
+  .option('-C, --no-cheese', 'You do not want any cheese');
+
+program.parse();
+
+const options = program.opts();
+console.log('you ordered a pizza with:');
+if (options.peppers) console.log('  - peppers');
+const cheese = !options.cheese ? 'no' : options.cheese;
+console.log('  - %s cheese', cheese);
+```
+
+In a multi-command program, you will have action handlers for each command (or stand-alone executables for the commands).
+
+Example file: [deploy](./examples/deploy)
+
+```js
+const { Command } = require('commander');
+const program = new Command();
+
+program
+  .version('0.0.1')
+  .option('-c, --config <path>', 'set config path', './deploy.conf');
+
+program
+  .command('setup [env]')
+  .description('run setup commands for all envs')
+  .option('-s, --setup_mode <mode>', 'Which setup mode to use', 'normal')
+  .action((env, options) => {
+    env = env || 'all';
+    console.log('read config from %s', program.opts().config);
+    console.log('setup for %s env(s) with %s mode', env, options.setup_mode);
+  });
+
+program
+  .command('exec <script>')
+  .alias('ex')
+  .description('execute the given remote cmd')
+  .option('-e, --exec_mode <mode>', 'Which exec mode to use', 'fast')
+  .action((script, options) => {
+    console.log('read config from %s', program.opts().config);
+    console.log('exec "%s" using %s mode and config %s', script, options.exec_mode, program.opts().config);
+  }).addHelpText('after', `
+Examples:
+  $ deploy exec sequential
+  $ deploy exec async`
+  );
+  
+program.parse(process.argv);
+```
+
+More samples can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory.
+
+## Support
+
+The current version of Commander is fully supported on Long Term Support versions of node, and requires at least node v10.
+(For older versions of node, use an older version of Commander. Commander version 2.x has the widest support.)
+
+The main forum for free and community support is the project [Issues](https://github.com/tj/commander.js/issues) on GitHub.
+
+### Commander for enterprise
+
+Available as part of the Tidelift Subscription
+
+The maintainers of Commander and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-commander?utm_source=npm-commander&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
diff --git a/node_modules/svgo/node_modules/commander/esm.mjs b/node_modules/svgo/node_modules/commander/esm.mjs
new file mode 100644
index 0000000..60bf252
--- /dev/null
+++ b/node_modules/svgo/node_modules/commander/esm.mjs
@@ -0,0 +1,4 @@
+import commander from './index.js';
+
+// wrapper to provide named exports for ESM.
+export const { program, Option, Command, CommanderError, InvalidOptionArgumentError, Help, createCommand } = commander;
diff --git a/node_modules/svgo/node_modules/commander/index.js b/node_modules/svgo/node_modules/commander/index.js
new file mode 100644
index 0000000..985a8cf
--- /dev/null
+++ b/node_modules/svgo/node_modules/commander/index.js
@@ -0,0 +1,2217 @@
+/**
+ * Module dependencies.
+ */
+
+const EventEmitter = require('events').EventEmitter;
+const childProcess = require('child_process');
+const path = require('path');
+const fs = require('fs');
+
+// @ts-check
+
+// Although this is a class, methods are static in style to allow override using subclass or just functions.
+class Help {
+  constructor() {
+    this.helpWidth = undefined;
+    this.sortSubcommands = false;
+    this.sortOptions = false;
+  }
+
+  /**
+   * Get an array of the visible subcommands. Includes a placeholder for the implicit help command, if there is one.
+   *
+   * @param {Command} cmd
+   * @returns {Command[]}
+   */
+
+  visibleCommands(cmd) {
+    const visibleCommands = cmd.commands.filter(cmd => !cmd._hidden);
+    if (cmd._hasImplicitHelpCommand()) {
+      // Create a command matching the implicit help command.
+      const args = cmd._helpCommandnameAndArgs.split(/ +/);
+      const helpCommand = cmd.createCommand(args.shift())
+        .helpOption(false);
+      helpCommand.description(cmd._helpCommandDescription);
+      helpCommand._parseExpectedArgs(args);
+      visibleCommands.push(helpCommand);
+    }
+    if (this.sortSubcommands) {
+      visibleCommands.sort((a, b) => {
+        return a.name().localeCompare(b.name());
+      });
+    }
+    return visibleCommands;
+  }
+
+  /**
+   * Get an array of the visible options. Includes a placeholder for the implicit help option, if there is one.
+   *
+   * @param {Command} cmd
+   * @returns {Option[]}
+   */
+
+  visibleOptions(cmd) {
+    const visibleOptions = cmd.options.filter((option) => !option.hidden);
+    // Implicit help
+    const showShortHelpFlag = cmd._hasHelpOption && cmd._helpShortFlag && !cmd._findOption(cmd._helpShortFlag);
+    const showLongHelpFlag = cmd._hasHelpOption && !cmd._findOption(cmd._helpLongFlag);
+    if (showShortHelpFlag || showLongHelpFlag) {
+      let helpOption;
+      if (!showShortHelpFlag) {
+        helpOption = cmd.createOption(cmd._helpLongFlag, cmd._helpDescription);
+      } else if (!showLongHelpFlag) {
+        helpOption = cmd.createOption(cmd._helpShortFlag, cmd._helpDescription);
+      } else {
+        helpOption = cmd.createOption(cmd._helpFlags, cmd._helpDescription);
+      }
+      visibleOptions.push(helpOption);
+    }
+    if (this.sortOptions) {
+      const getSortKey = (option) => {
+        // WYSIWYG for order displayed in help with short before long, no special handling for negated.
+        return option.short ? option.short.replace(/^-/, '') : option.long.replace(/^--/, '');
+      };
+      visibleOptions.sort((a, b) => {
+        return getSortKey(a).localeCompare(getSortKey(b));
+      });
+    }
+    return visibleOptions;
+  }
+
+  /**
+   * Get an array of the arguments which have descriptions.
+   *
+   * @param {Command} cmd
+   * @returns {{ term: string, description:string }[]}
+   */
+
+  visibleArguments(cmd) {
+    if (cmd._argsDescription && cmd._args.length) {
+      return cmd._args.map((argument) => {
+        return { term: argument.name, description: cmd._argsDescription[argument.name] || '' };
+      }, 0);
+    }
+    return [];
+  }
+
+  /**
+   * Get the command term to show in the list of subcommands.
+   *
+   * @param {Command} cmd
+   * @returns {string}
+   */
+
+  subcommandTerm(cmd) {
+    // Legacy. Ignores custom usage string, and nested commands.
+    const args = cmd._args.map(arg => humanReadableArgName(arg)).join(' ');
+    return cmd._name +
+      (cmd._aliases[0] ? '|' + cmd._aliases[0] : '') +
+      (cmd.options.length ? ' [options]' : '') + // simplistic check for non-help option
+      (args ? ' ' + args : '');
+  }
+
+  /**
+   * Get the option term to show in the list of options.
+   *
+   * @param {Option} option
+   * @returns {string}
+   */
+
+  optionTerm(option) {
+    return option.flags;
+  }
+
+  /**
+   * Get the longest command term length.
+   *
+   * @param {Command} cmd
+   * @param {Help} helper
+   * @returns {number}
+   */
+
+  longestSubcommandTermLength(cmd, helper) {
+    return helper.visibleCommands(cmd).reduce((max, command) => {
+      return Math.max(max, helper.subcommandTerm(command).length);
+    }, 0);
+  };
+
+  /**
+   * Get the longest option term length.
+   *
+   * @param {Command} cmd
+   * @param {Help} helper
+   * @returns {number}
+   */
+
+  longestOptionTermLength(cmd, helper) {
+    return helper.visibleOptions(cmd).reduce((max, option) => {
+      return Math.max(max, helper.optionTerm(option).length);
+    }, 0);
+  };
+
+  /**
+   * Get the longest argument term length.
+   *
+   * @param {Command} cmd
+   * @param {Help} helper
+   * @returns {number}
+   */
+
+  longestArgumentTermLength(cmd, helper) {
+    return helper.visibleArguments(cmd).reduce((max, argument) => {
+      return Math.max(max, argument.term.length);
+    }, 0);
+  };
+
+  /**
+   * Get the command usage to be displayed at the top of the built-in help.
+   *
+   * @param {Command} cmd
+   * @returns {string}
+   */
+
+  commandUsage(cmd) {
+    // Usage
+    let cmdName = cmd._name;
+    if (cmd._aliases[0]) {
+      cmdName = cmdName + '|' + cmd._aliases[0];
+    }
+    let parentCmdNames = '';
+    for (let parentCmd = cmd.parent; parentCmd; parentCmd = parentCmd.parent) {
+      parentCmdNames = parentCmd.name() + ' ' + parentCmdNames;
+    }
+    return parentCmdNames + cmdName + ' ' + cmd.usage();
+  }
+
+  /**
+   * Get the description for the command.
+   *
+   * @param {Command} cmd
+   * @returns {string}
+   */
+
+  commandDescription(cmd) {
+    // @ts-ignore: overloaded return type
+    return cmd.description();
+  }
+
+  /**
+   * Get the command description to show in the list of subcommands.
+   *
+   * @param {Command} cmd
+   * @returns {string}
+   */
+
+  subcommandDescription(cmd) {
+    // @ts-ignore: overloaded return type
+    return cmd.description();
+  }
+
+  /**
+   * Get the option description to show in the list of options.
+   *
+   * @param {Option} option
+   * @return {string}
+   */
+
+  optionDescription(option) {
+    if (option.negate) {
+      return option.description;
+    }
+    const extraInfo = [];
+    if (option.argChoices) {
+      extraInfo.push(
+        // use stringify to match the display of the default value
+        `choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`);
+    }
+    if (option.defaultValue !== undefined) {
+      extraInfo.push(`default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}`);
+    }
+    if (extraInfo.length > 0) {
+      return `${option.description} (${extraInfo.join(', ')})`;
+    }
+    return option.description;
+  };
+
+  /**
+   * Generate the built-in help text.
+   *
+   * @param {Command} cmd
+   * @param {Help} helper
+   * @returns {string}
+   */
+
+  formatHelp(cmd, helper) {
+    const termWidth = helper.padWidth(cmd, helper);
+    const helpWidth = helper.helpWidth || 80;
+    const itemIndentWidth = 2;
+    const itemSeparatorWidth = 2; // between term and description
+    function formatItem(term, description) {
+      if (description) {
+        const fullText = `${term.padEnd(termWidth + itemSeparatorWidth)}${description}`;
+        return helper.wrap(fullText, helpWidth - itemIndentWidth, termWidth + itemSeparatorWidth);
+      }
+      return term;
+    };
+    function formatList(textArray) {
+      return textArray.join('\n').replace(/^/gm, ' '.repeat(itemIndentWidth));
+    }
+
+    // Usage
+    let output = [`Usage: ${helper.commandUsage(cmd)}`, ''];
+
+    // Description
+    const commandDescription = helper.commandDescription(cmd);
+    if (commandDescription.length > 0) {
+      output = output.concat([commandDescription, '']);
+    }
+
+    // Arguments
+    const argumentList = helper.visibleArguments(cmd).map((argument) => {
+      return formatItem(argument.term, argument.description);
+    });
+    if (argumentList.length > 0) {
+      output = output.concat(['Arguments:', formatList(argumentList), '']);
+    }
+
+    // Options
+    const optionList = helper.visibleOptions(cmd).map((option) => {
+      return formatItem(helper.optionTerm(option), helper.optionDescription(option));
+    });
+    if (optionList.length > 0) {
+      output = output.concat(['Options:', formatList(optionList), '']);
+    }
+
+    // Commands
+    const commandList = helper.visibleCommands(cmd).map((cmd) => {
+      return formatItem(helper.subcommandTerm(cmd), helper.subcommandDescription(cmd));
+    });
+    if (commandList.length > 0) {
+      output = output.concat(['Commands:', formatList(commandList), '']);
+    }
+
+    return output.join('\n');
+  }
+
+  /**
+   * Calculate the pad width from the maximum term length.
+   *
+   * @param {Command} cmd
+   * @param {Help} helper
+   * @returns {number}
+   */
+
+  padWidth(cmd, helper) {
+    return Math.max(
+      helper.longestOptionTermLength(cmd, helper),
+      helper.longestSubcommandTermLength(cmd, helper),
+      helper.longestArgumentTermLength(cmd, helper)
+    );
+  };
+
+  /**
+   * Wrap the given string to width characters per line, with lines after the first indented.
+   * Do not wrap if insufficient room for wrapping (minColumnWidth), or string is manually formatted.
+   *
+   * @param {string} str
+   * @param {number} width
+   * @param {number} indent
+   * @param {number} [minColumnWidth=40]
+   * @return {string}
+   *
+   */
+
+  wrap(str, width, indent, minColumnWidth = 40) {
+    // Detect manually wrapped and indented strings by searching for line breaks
+    // followed by multiple spaces/tabs.
+    if (str.match(/[\n]\s+/)) return str;
+    // Do not wrap if not enough room for a wrapped column of text (as could end up with a word per line).
+    const columnWidth = width - indent;
+    if (columnWidth < minColumnWidth) return str;
+
+    const leadingStr = str.substr(0, indent);
+    const columnText = str.substr(indent);
+
+    const indentString = ' '.repeat(indent);
+    const regex = new RegExp('.{1,' + (columnWidth - 1) + '}([\\s\u200B]|$)|[^\\s\u200B]+?([\\s\u200B]|$)', 'g');
+    const lines = columnText.match(regex) || [];
+    return leadingStr + lines.map((line, i) => {
+      if (line.slice(-1) === '\n') {
+        line = line.slice(0, line.length - 1);
+      }
+      return ((i > 0) ? indentString : '') + line.trimRight();
+    }).join('\n');
+  }
+}
+
+class Option {
+  /**
+   * Initialize a new `Option` with the given `flags` and `description`.
+   *
+   * @param {string} flags
+   * @param {string} [description]
+   */
+
+  constructor(flags, description) {
+    this.flags = flags;
+    this.description = description || '';
+
+    this.required = flags.includes('<'); // A value must be supplied when the option is specified.
+    this.optional = flags.includes('['); // A value is optional when the option is specified.
+    // variadic test ignores <value,...> et al which might be used to describe custom splitting of single argument
+    this.variadic = /\w\.\.\.[>\]]$/.test(flags); // The option can take multiple values.
+    this.mandatory = false; // The option must have a value after parsing, which usually means it must be specified on command line.
+    const optionFlags = _parseOptionFlags(flags);
+    this.short = optionFlags.shortFlag;
+    this.long = optionFlags.longFlag;
+    this.negate = false;
+    if (this.long) {
+      this.negate = this.long.startsWith('--no-');
+    }
+    this.defaultValue = undefined;
+    this.defaultValueDescription = undefined;
+    this.parseArg = undefined;
+    this.hidden = false;
+    this.argChoices = undefined;
+  }
+
+  /**
+   * Set the default value, and optionally supply the description to be displayed in the help.
+   *
+   * @param {any} value
+   * @param {string} [description]
+   * @return {Option}
+   */
+
+  default(value, description) {
+    this.defaultValue = value;
+    this.defaultValueDescription = description;
+    return this;
+  };
+
+  /**
+   * Set the custom handler for processing CLI option arguments into option values.
+   *
+   * @param {Function} [fn]
+   * @return {Option}
+   */
+
+  argParser(fn) {
+    this.parseArg = fn;
+    return this;
+  };
+
+  /**
+   * Whether the option is mandatory and must have a value after parsing.
+   *
+   * @param {boolean} [mandatory=true]
+   * @return {Option}
+   */
+
+  makeOptionMandatory(mandatory = true) {
+    this.mandatory = !!mandatory;
+    return this;
+  };
+
+  /**
+   * Hide option in help.
+   *
+   * @param {boolean} [hide=true]
+   * @return {Option}
+   */
+
+  hideHelp(hide = true) {
+    this.hidden = !!hide;
+    return this;
+  };
+
+  /**
+   * @api private
+   */
+
+  _concatValue(value, previous) {
+    if (previous === this.defaultValue || !Array.isArray(previous)) {
+      return [value];
+    }
+
+    return previous.concat(value);
+  }
+
+  /**
+   * Only allow option value to be one of choices.
+   *
+   * @param {string[]} values
+   * @return {Option}
+   */
+
+  choices(values) {
+    this.argChoices = values;
+    this.parseArg = (arg, previous) => {
+      if (!values.includes(arg)) {
+        throw new InvalidOptionArgumentError(`Allowed choices are ${values.join(', ')}.`);
+      }
+      if (this.variadic) {
+        return this._concatValue(arg, previous);
+      }
+      return arg;
+    };
+    return this;
+  };
+
+  /**
+   * Return option name.
+   *
+   * @return {string}
+   */
+
+  name() {
+    if (this.long) {
+      return this.long.replace(/^--/, '');
+    }
+    return this.short.replace(/^-/, '');
+  };
+
+  /**
+   * Return option name, in a camelcase format that can be used
+   * as a object attribute key.
+   *
+   * @return {string}
+   * @api private
+   */
+
+  attributeName() {
+    return camelcase(this.name().replace(/^no-/, ''));
+  };
+
+  /**
+   * Check if `arg` matches the short or long flag.
+   *
+   * @param {string} arg
+   * @return {boolean}
+   * @api private
+   */
+
+  is(arg) {
+    return this.short === arg || this.long === arg;
+  };
+}
+
+/**
+ * CommanderError class
+ * @class
+ */
+class CommanderError extends Error {
+  /**
+   * Constructs the CommanderError class
+   * @param {number} exitCode suggested exit code which could be used with process.exit
+   * @param {string} code an id string representing the error
+   * @param {string} message human-readable description of the error
+   * @constructor
+   */
+  constructor(exitCode, code, message) {
+    super(message);
+    // properly capture stack trace in Node.js
+    Error.captureStackTrace(this, this.constructor);
+    this.name = this.constructor.name;
+    this.code = code;
+    this.exitCode = exitCode;
+    this.nestedError = undefined;
+  }
+}
+
+/**
+ * InvalidOptionArgumentError class
+ * @class
+ */
+class InvalidOptionArgumentError extends CommanderError {
+  /**
+   * Constructs the InvalidOptionArgumentError class
+   * @param {string} [message] explanation of why argument is invalid
+   * @constructor
+   */
+  constructor(message) {
+    super(1, 'commander.invalidOptionArgument', message);
+    // properly capture stack trace in Node.js
+    Error.captureStackTrace(this, this.constructor);
+    this.name = this.constructor.name;
+  }
+}
+
+class Command extends EventEmitter {
+  /**
+   * Initialize a new `Command`.
+   *
+   * @param {string} [name]
+   */
+
+  constructor(name) {
+    super();
+    this.commands = [];
+    this.options = [];
+    this.parent = null;
+    this._allowUnknownOption = false;
+    this._allowExcessArguments = true;
+    this._args = [];
+    this.rawArgs = null;
+    this._scriptPath = null;
+    this._name = name || '';
+    this._optionValues = {};
+    this._storeOptionsAsProperties = false;
+    this._actionResults = [];
+    this._actionHandler = null;
+    this._executableHandler = false;
+    this._executableFile = null; // custom name for executable
+    this._defaultCommandName = null;
+    this._exitCallback = null;
+    this._aliases = [];
+    this._combineFlagAndOptionalValue = true;
+    this._description = '';
+    this._argsDescription = undefined;
+    this._enablePositionalOptions = false;
+    this._passThroughOptions = false;
+
+    // see .configureOutput() for docs
+    this._outputConfiguration = {
+      writeOut: (str) => process.stdout.write(str),
+      writeErr: (str) => process.stderr.write(str),
+      getOutHelpWidth: () => process.stdout.isTTY ? process.stdout.columns : undefined,
+      getErrHelpWidth: () => process.stderr.isTTY ? process.stderr.columns : undefined,
+      outputError: (str, write) => write(str)
+    };
+
+    this._hidden = false;
+    this._hasHelpOption = true;
+    this._helpFlags = '-h, --help';
+    this._helpDescription = 'display help for command';
+    this._helpShortFlag = '-h';
+    this._helpLongFlag = '--help';
+    this._addImplicitHelpCommand = undefined; // Deliberately undefined, not decided whether true or false
+    this._helpCommandName = 'help';
+    this._helpCommandnameAndArgs = 'help [command]';
+    this._helpCommandDescription = 'display help for command';
+    this._helpConfiguration = {};
+  }
+
+  /**
+   * Define a command.
+   *
+   * There are two styles of command: pay attention to where to put the description.
+   *
+   * Examples:
+   *
+   *      // Command implemented using action handler (description is supplied separately to `.command`)
+   *      program
+   *        .command('clone <source> [destination]')
+   *        .description('clone a repository into a newly created directory')
+   *        .action((source, destination) => {
+   *          console.log('clone command called');
+   *        });
+   *
+   *      // Command implemented using separate executable file (description is second parameter to `.command`)
+   *      program
+   *        .command('start <service>', 'start named service')
+   *        .command('stop [service]', 'stop named service, or all if no name supplied');
+   *
+   * @param {string} nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`
+   * @param {Object|string} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable)
+   * @param {Object} [execOpts] - configuration options (for executable)
+   * @return {Command} returns new command for action handler, or `this` for executable command
+   */
+
+  command(nameAndArgs, actionOptsOrExecDesc, execOpts) {
+    let desc = actionOptsOrExecDesc;
+    let opts = execOpts;
+    if (typeof desc === 'object' && desc !== null) {
+      opts = desc;
+      desc = null;
+    }
+    opts = opts || {};
+    const args = nameAndArgs.split(/ +/);
+    const cmd = this.createCommand(args.shift());
+
+    if (desc) {
+      cmd.description(desc);
+      cmd._executableHandler = true;
+    }
+    if (opts.isDefault) this._defaultCommandName = cmd._name;
+
+    cmd._outputConfiguration = this._outputConfiguration;
+
+    cmd._hidden = !!(opts.noHelp || opts.hidden); // noHelp is deprecated old name for hidden
+    cmd._hasHelpOption = this._hasHelpOption;
+    cmd._helpFlags = this._helpFlags;
+    cmd._helpDescription = this._helpDescription;
+    cmd._helpShortFlag = this._helpShortFlag;
+    cmd._helpLongFlag = this._helpLongFlag;
+    cmd._helpCommandName = this._helpCommandName;
+    cmd._helpCommandnameAndArgs = this._helpCommandnameAndArgs;
+    cmd._helpCommandDescription = this._helpCommandDescription;
+    cmd._helpConfiguration = this._helpConfiguration;
+    cmd._exitCallback = this._exitCallback;
+    cmd._storeOptionsAsProperties = this._storeOptionsAsProperties;
+    cmd._combineFlagAndOptionalValue = this._combineFlagAndOptionalValue;
+    cmd._allowExcessArguments = this._allowExcessArguments;
+    cmd._enablePositionalOptions = this._enablePositionalOptions;
+
+    cmd._executableFile = opts.executableFile || null; // Custom name for executable file, set missing to null to match constructor
+    this.commands.push(cmd);
+    cmd._parseExpectedArgs(args);
+    cmd.parent = this;
+
+    if (desc) return this;
+    return cmd;
+  };
+
+  /**
+   * Factory routine to create a new unattached command.
+   *
+   * See .command() for creating an attached subcommand, which uses this routine to
+   * create the command. You can override createCommand to customise subcommands.
+   *
+   * @param {string} [name]
+   * @return {Command} new command
+   */
+
+  createCommand(name) {
+    return new Command(name);
+  };
+
+  /**
+   * You can customise the help with a subclass of Help by overriding createHelp,
+   * or by overriding Help properties using configureHelp().
+   *
+   * @return {Help}
+   */
+
+  createHelp() {
+    return Object.assign(new Help(), this.configureHelp());
+  };
+
+  /**
+   * You can customise the help by overriding Help properties using configureHelp(),
+   * or with a subclass of Help by overriding createHelp().
+   *
+   * @param {Object} [configuration] - configuration options
+   * @return {Command|Object} `this` command for chaining, or stored configuration
+   */
+
+  configureHelp(configuration) {
+    if (configuration === undefined) return this._helpConfiguration;
+
+    this._helpConfiguration = configuration;
+    return this;
+  }
+
+  /**
+   * The default output goes to stdout and stderr. You can customise this for special
+   * applications. You can also customise the display of errors by overriding outputError.
+   *
+   * The configuration properties are all functions:
+   *
+   *    // functions to change where being written, stdout and stderr
+   *    writeOut(str)
+   *    writeErr(str)
+   *    // matching functions to specify width for wrapping help
+   *    getOutHelpWidth()
+   *    getErrHelpWidth()
+   *    // functions based on what is being written out
+   *    outputError(str, write) // used for displaying errors, and not used for displaying help
+   *
+   * @param {Object} [configuration] - configuration options
+   * @return {Command|Object} `this` command for chaining, or stored configuration
+   */
+
+  configureOutput(configuration) {
+    if (configuration === undefined) return this._outputConfiguration;
+
+    Object.assign(this._outputConfiguration, configuration);
+    return this;
+  }
+
+  /**
+   * Add a prepared subcommand.
+   *
+   * See .command() for creating an attached subcommand which inherits settings from its parent.
+   *
+   * @param {Command} cmd - new subcommand
+   * @param {Object} [opts] - configuration options
+   * @return {Command} `this` command for chaining
+   */
+
+  addCommand(cmd, opts) {
+    if (!cmd._name) throw new Error('Command passed to .addCommand() must have a name');
+
+    // To keep things simple, block automatic name generation for deeply nested executables.
+    // Fail fast and detect when adding rather than later when parsing.
+    function checkExplicitNames(commandArray) {
+      commandArray.forEach((cmd) => {
+        if (cmd._executableHandler && !cmd._executableFile) {
+          throw new Error(`Must specify executableFile for deeply nested executable: ${cmd.name()}`);
+        }
+        checkExplicitNames(cmd.commands);
+      });
+    }
+    checkExplicitNames(cmd.commands);
+
+    opts = opts || {};
+    if (opts.isDefault) this._defaultCommandName = cmd._name;
+    if (opts.noHelp || opts.hidden) cmd._hidden = true; // modifying passed command due to existing implementation
+
+    this.commands.push(cmd);
+    cmd.parent = this;
+    return this;
+  };
+
+  /**
+   * Define argument syntax for the command.
+   */
+
+  arguments(desc) {
+    return this._parseExpectedArgs(desc.split(/ +/));
+  };
+
+  /**
+   * Override default decision whether to add implicit help command.
+   *
+   *    addHelpCommand() // force on
+   *    addHelpCommand(false); // force off
+   *    addHelpCommand('help [cmd]', 'display help for [cmd]'); // force on with custom details
+   *
+   * @return {Command} `this` command for chaining
+   */
+
+  addHelpCommand(enableOrNameAndArgs, description) {
+    if (enableOrNameAndArgs === false) {
+      this._addImplicitHelpCommand = false;
+    } else {
+      this._addImplicitHelpCommand = true;
+      if (typeof enableOrNameAndArgs === 'string') {
+        this._helpCommandName = enableOrNameAndArgs.split(' ')[0];
+        this._helpCommandnameAndArgs = enableOrNameAndArgs;
+      }
+      this._helpCommandDescription = description || this._helpCommandDescription;
+    }
+    return this;
+  };
+
+  /**
+   * @return {boolean}
+   * @api private
+   */
+
+  _hasImplicitHelpCommand() {
+    if (this._addImplicitHelpCommand === undefined) {
+      return this.commands.length && !this._actionHandler && !this._findCommand('help');
+    }
+    return this._addImplicitHelpCommand;
+  };
+
+  /**
+   * Parse expected `args`.
+   *
+   * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
+   *
+   * @param {Array} args
+   * @return {Command} `this` command for chaining
+   * @api private
+   */
+
+  _parseExpectedArgs(args) {
+    if (!args.length) return;
+    args.forEach((arg) => {
+      const argDetails = {
+        required: false,
+        name: '',
+        variadic: false
+      };
+
+      switch (arg[0]) {
+        case '<':
+          argDetails.required = true;
+          argDetails.name = arg.slice(1, -1);
+          break;
+        case '[':
+          argDetails.name = arg.slice(1, -1);
+          break;
+      }
+
+      if (argDetails.name.length > 3 && argDetails.name.slice(-3) === '...') {
+        argDetails.variadic = true;
+        argDetails.name = argDetails.name.slice(0, -3);
+      }
+      if (argDetails.name) {
+        this._args.push(argDetails);
+      }
+    });
+    this._args.forEach((arg, i) => {
+      if (arg.variadic && i < this._args.length - 1) {
+        throw new Error(`only the last argument can be variadic '${arg.name}'`);
+      }
+    });
+    return this;
+  };
+
+  /**
+   * Register callback to use as replacement for calling process.exit.
+   *
+   * @param {Function} [fn] optional callback which will be passed a CommanderError, defaults to throwing
+   * @return {Command} `this` command for chaining
+   */
+
+  exitOverride(fn) {
+    if (fn) {
+      this._exitCallback = fn;
+    } else {
+      this._exitCallback = (err) => {
+        if (err.code !== 'commander.executeSubCommandAsync') {
+          throw err;
+        } else {
+          // Async callback from spawn events, not useful to throw.
+        }
+      };
+    }
+    return this;
+  };
+
+  /**
+   * Call process.exit, and _exitCallback if defined.
+   *
+   * @param {number} exitCode exit code for using with process.exit
+   * @param {string} code an id string representing the error
+   * @param {string} message human-readable description of the error
+   * @return never
+   * @api private
+   */
+
+  _exit(exitCode, code, message) {
+    if (this._exitCallback) {
+      this._exitCallback(new CommanderError(exitCode, code, message));
+      // Expecting this line is not reached.
+    }
+    process.exit(exitCode);
+  };
+
+  /**
+   * Register callback `fn` for the command.
+   *
+   * Examples:
+   *
+   *      program
+   *        .command('help')
+   *        .description('display verbose help')
+   *        .action(function() {
+   *           // output help here
+   *        });
+   *
+   * @param {Function} fn
+   * @return {Command} `this` command for chaining
+   */
+
+  action(fn) {
+    const listener = (args) => {
+      // The .action callback takes an extra parameter which is the command or options.
+      const expectedArgsCount = this._args.length;
+      const actionArgs = args.slice(0, expectedArgsCount);
+      if (this._storeOptionsAsProperties) {
+        actionArgs[expectedArgsCount] = this; // backwards compatible "options"
+      } else {
+        actionArgs[expectedArgsCount] = this.opts();
+      }
+      actionArgs.push(this);
+
+      const actionResult = fn.apply(this, actionArgs);
+      // Remember result in case it is async. Assume parseAsync getting called on root.
+      let rootCommand = this;
+      while (rootCommand.parent) {
+        rootCommand = rootCommand.parent;
+      }
+      rootCommand._actionResults.push(actionResult);
+    };
+    this._actionHandler = listener;
+    return this;
+  };
+
+  /**
+   * Factory routine to create a new unattached option.
+   *
+   * See .option() for creating an attached option, which uses this routine to
+   * create the option. You can override createOption to return a custom option.
+   *
+   * @param {string} flags
+   * @param {string} [description]
+   * @return {Option} new option
+   */
+
+  createOption(flags, description) {
+    return new Option(flags, description);
+  };
+
+  /**
+   * Add an option.
+   *
+   * @param {Option} option
+   * @return {Command} `this` command for chaining
+   */
+  addOption(option) {
+    const oname = option.name();
+    const name = option.attributeName();
+
+    let defaultValue = option.defaultValue;
+
+    // preassign default value for --no-*, [optional], <required>, or plain flag if boolean value
+    if (option.negate || option.optional || option.required || typeof defaultValue === 'boolean') {
+      // when --no-foo we make sure default is true, unless a --foo option is already defined
+      if (option.negate) {
+        const positiveLongFlag = option.long.replace(/^--no-/, '--');
+        defaultValue = this._findOption(positiveLongFlag) ? this._getOptionValue(name) : true;
+      }
+      // preassign only if we have a default
+      if (defaultValue !== undefined) {
+        this._setOptionValue(name, defaultValue);
+      }
+    }
+
+    // register the option
+    this.options.push(option);
+
+    // when it's passed assign the value
+    // and conditionally invoke the callback
+    this.on('option:' + oname, (val) => {
+      const oldValue = this._getOptionValue(name);
+
+      // custom processing
+      if (val !== null && option.parseArg) {
+        try {
+          val = option.parseArg(val, oldValue === undefined ? defaultValue : oldValue);
+        } catch (err) {
+          if (err.code === 'commander.invalidOptionArgument') {
+            const message = `error: option '${option.flags}' argument '${val}' is invalid. ${err.message}`;
+            this._displayError(err.exitCode, err.code, message);
+          }
+          throw err;
+        }
+      } else if (val !== null && option.variadic) {
+        val = option._concatValue(val, oldValue);
+      }
+
+      // unassigned or boolean value
+      if (typeof oldValue === 'boolean' || typeof oldValue === 'undefined') {
+        // if no value, negate false, and we have a default, then use it!
+        if (val == null) {
+          this._setOptionValue(name, option.negate
+            ? false
+            : defaultValue || true);
+        } else {
+          this._setOptionValue(name, val);
+        }
+      } else if (val !== null) {
+        // reassign
+        this._setOptionValue(name, option.negate ? false : val);
+      }
+    });
+
+    return this;
+  }
+
+  /**
+   * Internal implementation shared by .option() and .requiredOption()
+   *
+   * @api private
+   */
+  _optionEx(config, flags, description, fn, defaultValue) {
+    const option = this.createOption(flags, description);
+    option.makeOptionMandatory(!!config.mandatory);
+    if (typeof fn === 'function') {
+      option.default(defaultValue).argParser(fn);
+    } else if (fn instanceof RegExp) {
+      // deprecated
+      const regex = fn;
+      fn = (val, def) => {
+        const m = regex.exec(val);
+        return m ? m[0] : def;
+      };
+      option.default(defaultValue).argParser(fn);
+    } else {
+      option.default(fn);
+    }
+
+    return this.addOption(option);
+  }
+
+  /**
+   * Define option with `flags`, `description` and optional
+   * coercion `fn`.
+   *
+   * The `flags` string contains the short and/or long flags,
+   * separated by comma, a pipe or space. The following are all valid
+   * all will output this way when `--help` is used.
+   *
+   *    "-p, --pepper"
+   *    "-p|--pepper"
+   *    "-p --pepper"
+   *
+   * Examples:
+   *
+   *     // simple boolean defaulting to undefined
+   *     program.option('-p, --pepper', 'add pepper');
+   *
+   *     program.pepper
+   *     // => undefined
+   *
+   *     --pepper
+   *     program.pepper
+   *     // => true
+   *
+   *     // simple boolean defaulting to true (unless non-negated option is also defined)
+   *     program.option('-C, --no-cheese', 'remove cheese');
+   *
+   *     program.cheese
+   *     // => true
+   *
+   *     --no-cheese
+   *     program.cheese
+   *     // => false
+   *
+   *     // required argument
+   *     program.option('-C, --chdir <path>', 'change the working directory');
+   *
+   *     --chdir /tmp
+   *     program.chdir
+   *     // => "/tmp"
+   *
+   *     // optional argument
+   *     program.option('-c, --cheese [type]', 'add cheese [marble]');
+   *
+   * @param {string} flags
+   * @param {string} [description]
+   * @param {Function|*} [fn] - custom option processing function or default value
+   * @param {*} [defaultValue]
+   * @return {Command} `this` command for chaining
+   */
+
+  option(flags, description, fn, defaultValue) {
+    return this._optionEx({}, flags, description, fn, defaultValue);
+  };
+
+  /**
+  * Add a required option which must have a value after parsing. This usually means
+  * the option must be specified on the command line. (Otherwise the same as .option().)
+  *
+  * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space.
+  *
+  * @param {string} flags
+  * @param {string} [description]
+  * @param {Function|*} [fn] - custom option processing function or default value
+  * @param {*} [defaultValue]
+  * @return {Command} `this` command for chaining
+  */
+
+  requiredOption(flags, description, fn, defaultValue) {
+    return this._optionEx({ mandatory: true }, flags, description, fn, defaultValue);
+  };
+
+  /**
+   * Alter parsing of short flags with optional values.
+   *
+   * Examples:
+   *
+   *    // for `.option('-f,--flag [value]'):
+   *    .combineFlagAndOptionalValue(true)  // `-f80` is treated like `--flag=80`, this is the default behaviour
+   *    .combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b`
+   *
+   * @param {Boolean} [combine=true] - if `true` or omitted, an optional value can be specified directly after the flag.
+   */
+  combineFlagAndOptionalValue(combine = true) {
+    this._combineFlagAndOptionalValue = !!combine;
+    return this;
+  };
+
+  /**
+   * Allow unknown options on the command line.
+   *
+   * @param {Boolean} [allowUnknown=true] - if `true` or omitted, no error will be thrown
+   * for unknown options.
+   */
+  allowUnknownOption(allowUnknown = true) {
+    this._allowUnknownOption = !!allowUnknown;
+    return this;
+  };
+
+  /**
+   * Allow excess command-arguments on the command line. Pass false to make excess arguments an error.
+   *
+   * @param {Boolean} [allowExcess=true] - if `true` or omitted, no error will be thrown
+   * for excess arguments.
+   */
+  allowExcessArguments(allowExcess = true) {
+    this._allowExcessArguments = !!allowExcess;
+    return this;
+  };
+
+  /**
+   * Enable positional options. Positional means global options are specified before subcommands which lets
+   * subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions.
+   * The default behaviour is non-positional and global options may appear anywhere on the command line.
+   *
+   * @param {Boolean} [positional=true]
+   */
+  enablePositionalOptions(positional = true) {
+    this._enablePositionalOptions = !!positional;
+    return this;
+  };
+
+  /**
+   * Pass through options that come after command-arguments rather than treat them as command-options,
+   * so actual command-options come before command-arguments. Turning this on for a subcommand requires
+   * positional options to have been enabled on the program (parent commands).
+   * The default behaviour is non-positional and options may appear before or after command-arguments.
+   *
+   * @param {Boolean} [passThrough=true]
+   * for unknown options.
+   */
+  passThroughOptions(passThrough = true) {
+    this._passThroughOptions = !!passThrough;
+    if (!!this.parent && passThrough && !this.parent._enablePositionalOptions) {
+      throw new Error('passThroughOptions can not be used without turning on enablePositionalOptions for parent command(s)');
+    }
+    return this;
+  };
+
+  /**
+    * Whether to store option values as properties on command object,
+    * or store separately (specify false). In both cases the option values can be accessed using .opts().
+    *
+    * @param {boolean} [storeAsProperties=true]
+    * @return {Command} `this` command for chaining
+    */
+
+  storeOptionsAsProperties(storeAsProperties = true) {
+    this._storeOptionsAsProperties = !!storeAsProperties;
+    if (this.options.length) {
+      throw new Error('call .storeOptionsAsProperties() before adding options');
+    }
+    return this;
+  };
+
+  /**
+   * Store option value
+   *
+   * @param {string} key
+   * @param {Object} value
+   * @api private
+   */
+
+  _setOptionValue(key, value) {
+    if (this._storeOptionsAsProperties) {
+      this[key] = value;
+    } else {
+      this._optionValues[key] = value;
+    }
+  };
+
+  /**
+   * Retrieve option value
+   *
+   * @param {string} key
+   * @return {Object} value
+   * @api private
+   */
+
+  _getOptionValue(key) {
+    if (this._storeOptionsAsProperties) {
+      return this[key];
+    }
+    return this._optionValues[key];
+  };
+
+  /**
+   * Parse `argv`, setting options and invoking commands when defined.
+   *
+   * The default expectation is that the arguments are from node and have the application as argv[0]
+   * and the script being run in argv[1], with user parameters after that.
+   *
+   * Examples:
+   *
+   *      program.parse(process.argv);
+   *      program.parse(); // implicitly use process.argv and auto-detect node vs electron conventions
+   *      program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
+   *
+   * @param {string[]} [argv] - optional, defaults to process.argv
+   * @param {Object} [parseOptions] - optionally specify style of options with from: node/user/electron
+   * @param {string} [parseOptions.from] - where the args are from: 'node', 'user', 'electron'
+   * @return {Command} `this` command for chaining
+   */
+
+  parse(argv, parseOptions) {
+    if (argv !== undefined && !Array.isArray(argv)) {
+      throw new Error('first parameter to parse must be array or undefined');
+    }
+    parseOptions = parseOptions || {};
+
+    // Default to using process.argv
+    if (argv === undefined) {
+      argv = process.argv;
+      // @ts-ignore: unknown property
+      if (process.versions && process.versions.electron) {
+        parseOptions.from = 'electron';
+      }
+    }
+    this.rawArgs = argv.slice();
+
+    // make it a little easier for callers by supporting various argv conventions
+    let userArgs;
+    switch (parseOptions.from) {
+      case undefined:
+      case 'node':
+        this._scriptPath = argv[1];
+        userArgs = argv.slice(2);
+        break;
+      case 'electron':
+        // @ts-ignore: unknown property
+        if (process.defaultApp) {
+          this._scriptPath = argv[1];
+          userArgs = argv.slice(2);
+        } else {
+          userArgs = argv.slice(1);
+        }
+        break;
+      case 'user':
+        userArgs = argv.slice(0);
+        break;
+      default:
+        throw new Error(`unexpected parse option { from: '${parseOptions.from}' }`);
+    }
+    if (!this._scriptPath && require.main) {
+      this._scriptPath = require.main.filename;
+    }
+
+    // Guess name, used in usage in help.
+    this._name = this._name || (this._scriptPath && path.basename(this._scriptPath, path.extname(this._scriptPath)));
+
+    // Let's go!
+    this._parseCommand([], userArgs);
+
+    return this;
+  };
+
+  /**
+   * Parse `argv`, setting options and invoking commands when defined.
+   *
+   * Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise.
+   *
+   * The default expectation is that the arguments are from node and have the application as argv[0]
+   * and the script being run in argv[1], with user parameters after that.
+   *
+   * Examples:
+   *
+   *      program.parseAsync(process.argv);
+   *      program.parseAsync(); // implicitly use process.argv and auto-detect node vs electron conventions
+   *      program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
+   *
+   * @param {string[]} [argv]
+   * @param {Object} [parseOptions]
+   * @param {string} parseOptions.from - where the args are from: 'node', 'user', 'electron'
+   * @return {Promise}
+   */
+
+  parseAsync(argv, parseOptions) {
+    this.parse(argv, parseOptions);
+    return Promise.all(this._actionResults).then(() => this);
+  };
+
+  /**
+   * Execute a sub-command executable.
+   *
+   * @api private
+   */
+
+  _executeSubCommand(subcommand, args) {
+    args = args.slice();
+    let launchWithNode = false; // Use node for source targets so do not need to get permissions correct, and on Windows.
+    const sourceExt = ['.js', '.ts', '.tsx', '.mjs', '.cjs'];
+
+    // Not checking for help first. Unlikely to have mandatory and executable, and can't robustly test for help flags in external command.
+    this._checkForMissingMandatoryOptions();
+
+    // Want the entry script as the reference for command name and directory for searching for other files.
+    let scriptPath = this._scriptPath;
+    // Fallback in case not set, due to how Command created or called.
+    if (!scriptPath && require.main) {
+      scriptPath = require.main.filename;
+    }
+
+    let baseDir;
+    try {
+      const resolvedLink = fs.realpathSync(scriptPath);
+      baseDir = path.dirname(resolvedLink);
+    } catch (e) {
+      baseDir = '.'; // dummy, probably not going to find executable!
+    }
+
+    // name of the subcommand, like `pm-install`
+    let bin = path.basename(scriptPath, path.extname(scriptPath)) + '-' + subcommand._name;
+    if (subcommand._executableFile) {
+      bin = subcommand._executableFile;
+    }
+
+    const localBin = path.join(baseDir, bin);
+    if (fs.existsSync(localBin)) {
+      // prefer local `./<bin>` to bin in the $PATH
+      bin = localBin;
+    } else {
+      // Look for source files.
+      sourceExt.forEach((ext) => {
+        if (fs.existsSync(`${localBin}${ext}`)) {
+          bin = `${localBin}${ext}`;
+        }
+      });
+    }
+    launchWithNode = sourceExt.includes(path.extname(bin));
+
+    let proc;
+    if (process.platform !== 'win32') {
+      if (launchWithNode) {
+        args.unshift(bin);
+        // add executable arguments to spawn
+        args = incrementNodeInspectorPort(process.execArgv).concat(args);
+
+        proc = childProcess.spawn(process.argv[0], args, { stdio: 'inherit' });
+      } else {
+        proc = childProcess.spawn(bin, args, { stdio: 'inherit' });
+      }
+    } else {
+      args.unshift(bin);
+      // add executable arguments to spawn
+      args = incrementNodeInspectorPort(process.execArgv).concat(args);
+      proc = childProcess.spawn(process.execPath, args, { stdio: 'inherit' });
+    }
+
+    const signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];
+    signals.forEach((signal) => {
+      // @ts-ignore
+      process.on(signal, () => {
+        if (proc.killed === false && proc.exitCode === null) {
+          proc.kill(signal);
+        }
+      });
+    });
+
+    // By default terminate process when spawned process terminates.
+    // Suppressing the exit if exitCallback defined is a bit messy and of limited use, but does allow process to stay running!
+    const exitCallback = this._exitCallback;
+    if (!exitCallback) {
+      proc.on('close', process.exit.bind(process));
+    } else {
+      proc.on('close', () => {
+        exitCallback(new CommanderError(process.exitCode || 0, 'commander.executeSubCommandAsync', '(close)'));
+      });
+    }
+    proc.on('error', (err) => {
+      // @ts-ignore
+      if (err.code === 'ENOENT') {
+        const executableMissing = `'${bin}' does not exist
+ - if '${subcommand._name}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead
+ - if the default executable name is not suitable, use the executableFile option to supply a custom name`;
+        throw new Error(executableMissing);
+      // @ts-ignore
+      } else if (err.code === 'EACCES') {
+        throw new Error(`'${bin}' not executable`);
+      }
+      if (!exitCallback) {
+        process.exit(1);
+      } else {
+        const wrappedError = new CommanderError(1, 'commander.executeSubCommandAsync', '(error)');
+        wrappedError.nestedError = err;
+        exitCallback(wrappedError);
+      }
+    });
+
+    // Store the reference to the child process
+    this.runningCommand = proc;
+  };
+
+  /**
+   * @api private
+   */
+  _dispatchSubcommand(commandName, operands, unknown) {
+    const subCommand = this._findCommand(commandName);
+    if (!subCommand) this.help({ error: true });
+
+    if (subCommand._executableHandler) {
+      this._executeSubCommand(subCommand, operands.concat(unknown));
+    } else {
+      subCommand._parseCommand(operands, unknown);
+    }
+  };
+
+  /**
+   * Process arguments in context of this command.
+   *
+   * @api private
+   */
+
+  _parseCommand(operands, unknown) {
+    const parsed = this.parseOptions(unknown);
+    operands = operands.concat(parsed.operands);
+    unknown = parsed.unknown;
+    this.args = operands.concat(unknown);
+
+    if (operands && this._findCommand(operands[0])) {
+      this._dispatchSubcommand(operands[0], operands.slice(1), unknown);
+    } else if (this._hasImplicitHelpCommand() && operands[0] === this._helpCommandName) {
+      if (operands.length === 1) {
+        this.help();
+      } else {
+        this._dispatchSubcommand(operands[1], [], [this._helpLongFlag]);
+      }
+    } else if (this._defaultCommandName) {
+      outputHelpIfRequested(this, unknown); // Run the help for default command from parent rather than passing to default command
+      this._dispatchSubcommand(this._defaultCommandName, operands, unknown);
+    } else {
+      if (this.commands.length && this.args.length === 0 && !this._actionHandler && !this._defaultCommandName) {
+        // probably missing subcommand and no handler, user needs help
+        this.help({ error: true });
+      }
+
+      outputHelpIfRequested(this, parsed.unknown);
+      this._checkForMissingMandatoryOptions();
+
+      // We do not always call this check to avoid masking a "better" error, like unknown command.
+      const checkForUnknownOptions = () => {
+        if (parsed.unknown.length > 0) {
+          this.unknownOption(parsed.unknown[0]);
+        }
+      };
+
+      const commandEvent = `command:${this.name()}`;
+      if (this._actionHandler) {
+        checkForUnknownOptions();
+        // Check expected arguments and collect variadic together.
+        const args = this.args.slice();
+        this._args.forEach((arg, i) => {
+          if (arg.required && args[i] == null) {
+            this.missingArgument(arg.name);
+          } else if (arg.variadic) {
+            args[i] = args.splice(i);
+            args.length = Math.min(i + 1, args.length);
+          }
+        });
+        if (args.length > this._args.length) {
+          this._excessArguments(args);
+        }
+
+        this._actionHandler(args);
+        if (this.parent) this.parent.emit(commandEvent, operands, unknown); // legacy
+      } else if (this.parent && this.parent.listenerCount(commandEvent)) {
+        checkForUnknownOptions();
+        this.parent.emit(commandEvent, operands, unknown); // legacy
+      } else if (operands.length) {
+        if (this._findCommand('*')) { // legacy default command
+          this._dispatchSubcommand('*', operands, unknown);
+        } else if (this.listenerCount('command:*')) {
+          // skip option check, emit event for possible misspelling suggestion
+          this.emit('command:*', operands, unknown);
+        } else if (this.commands.length) {
+          this.unknownCommand();
+        } else {
+          checkForUnknownOptions();
+        }
+      } else if (this.commands.length) {
+        // This command has subcommands and nothing hooked up at this level, so display help.
+        this.help({ error: true });
+      } else {
+        checkForUnknownOptions();
+        // fall through for caller to handle after calling .parse()
+      }
+    }
+  };
+
+  /**
+   * Find matching command.
+   *
+   * @api private
+   */
+  _findCommand(name) {
+    if (!name) return undefined;
+    return this.commands.find(cmd => cmd._name === name || cmd._aliases.includes(name));
+  };
+
+  /**
+   * Return an option matching `arg` if any.
+   *
+   * @param {string} arg
+   * @return {Option}
+   * @api private
+   */
+
+  _findOption(arg) {
+    return this.options.find(option => option.is(arg));
+  };
+
+  /**
+   * Display an error message if a mandatory option does not have a value.
+   * Lazy calling after checking for help flags from leaf subcommand.
+   *
+   * @api private
+   */
+
+  _checkForMissingMandatoryOptions() {
+    // Walk up hierarchy so can call in subcommand after checking for displaying help.
+    for (let cmd = this; cmd; cmd = cmd.parent) {
+      cmd.options.forEach((anOption) => {
+        if (anOption.mandatory && (cmd._getOptionValue(anOption.attributeName()) === undefined)) {
+          cmd.missingMandatoryOptionValue(anOption);
+        }
+      });
+    }
+  };
+
+  /**
+   * Parse options from `argv` removing known options,
+   * and return argv split into operands and unknown arguments.
+   *
+   * Examples:
+   *
+   *    argv => operands, unknown
+   *    --known kkk op => [op], []
+   *    op --known kkk => [op], []
+   *    sub --unknown uuu op => [sub], [--unknown uuu op]
+   *    sub -- --unknown uuu op => [sub --unknown uuu op], []
+   *
+   * @param {String[]} argv
+   * @return {{operands: String[], unknown: String[]}}
+   */
+
+  parseOptions(argv) {
+    const operands = []; // operands, not options or values
+    const unknown = []; // first unknown option and remaining unknown args
+    let dest = operands;
+    const args = argv.slice();
+
+    function maybeOption(arg) {
+      return arg.length > 1 && arg[0] === '-';
+    }
+
+    // parse options
+    let activeVariadicOption = null;
+    while (args.length) {
+      const arg = args.shift();
+
+      // literal
+      if (arg === '--') {
+        if (dest === unknown) dest.push(arg);
+        dest.push(...args);
+        break;
+      }
+
+      if (activeVariadicOption && !maybeOption(arg)) {
+        this.emit(`option:${activeVariadicOption.name()}`, arg);
+        continue;
+      }
+      activeVariadicOption = null;
+
+      if (maybeOption(arg)) {
+        const option = this._findOption(arg);
+        // recognised option, call listener to assign value with possible custom processing
+        if (option) {
+          if (option.required) {
+            const value = args.shift();
+            if (value === undefined) this.optionMissingArgument(option);
+            this.emit(`option:${option.name()}`, value);
+          } else if (option.optional) {
+            let value = null;
+            // historical behaviour is optional value is following arg unless an option
+            if (args.length > 0 && !maybeOption(args[0])) {
+              value = args.shift();
+            }
+            this.emit(`option:${option.name()}`, value);
+          } else { // boolean flag
+            this.emit(`option:${option.name()}`);
+          }
+          activeVariadicOption = option.variadic ? option : null;
+          continue;
+        }
+      }
+
+      // Look for combo options following single dash, eat first one if known.
+      if (arg.length > 2 && arg[0] === '-' && arg[1] !== '-') {
+        const option = this._findOption(`-${arg[1]}`);
+        if (option) {
+          if (option.required || (option.optional && this._combineFlagAndOptionalValue)) {
+            // option with value following in same argument
+            this.emit(`option:${option.name()}`, arg.slice(2));
+          } else {
+            // boolean option, emit and put back remainder of arg for further processing
+            this.emit(`option:${option.name()}`);
+            args.unshift(`-${arg.slice(2)}`);
+          }
+          continue;
+        }
+      }
+
+      // Look for known long flag with value, like --foo=bar
+      if (/^--[^=]+=/.test(arg)) {
+        const index = arg.indexOf('=');
+        const option = this._findOption(arg.slice(0, index));
+        if (option && (option.required || option.optional)) {
+          this.emit(`option:${option.name()}`, arg.slice(index + 1));
+          continue;
+        }
+      }
+
+      // Not a recognised option by this command.
+      // Might be a command-argument, or subcommand option, or unknown option, or help command or option.
+
+      // An unknown option means further arguments also classified as unknown so can be reprocessed by subcommands.
+      if (maybeOption(arg)) {
+        dest = unknown;
+      }
+
+      // If using positionalOptions, stop processing our options at subcommand.
+      if ((this._enablePositionalOptions || this._passThroughOptions) && operands.length === 0 && unknown.length === 0) {
+        if (this._findCommand(arg)) {
+          operands.push(arg);
+          if (args.length > 0) unknown.push(...args);
+          break;
+        } else if (arg === this._helpCommandName && this._hasImplicitHelpCommand()) {
+          operands.push(arg);
+          if (args.length > 0) operands.push(...args);
+          break;
+        } else if (this._defaultCommandName) {
+          unknown.push(arg);
+          if (args.length > 0) unknown.push(...args);
+          break;
+        }
+      }
+
+      // If using passThroughOptions, stop processing options at first command-argument.
+      if (this._passThroughOptions) {
+        dest.push(arg);
+        if (args.length > 0) dest.push(...args);
+        break;
+      }
+
+      // add arg
+      dest.push(arg);
+    }
+
+    return { operands, unknown };
+  };
+
+  /**
+   * Return an object containing options as key-value pairs
+   *
+   * @return {Object}
+   */
+  opts() {
+    if (this._storeOptionsAsProperties) {
+      // Preserve original behaviour so backwards compatible when still using properties
+      const result = {};
+      const len = this.options.length;
+
+      for (let i = 0; i < len; i++) {
+        const key = this.options[i].attributeName();
+        result[key] = key === this._versionOptionName ? this._version : this[key];
+      }
+      return result;
+    }
+
+    return this._optionValues;
+  };
+
+  /**
+   * Internal bottleneck for handling of parsing errors.
+   *
+   * @api private
+   */
+  _displayError(exitCode, code, message) {
+    this._outputConfiguration.outputError(`${message}\n`, this._outputConfiguration.writeErr);
+    this._exit(exitCode, code, message);
+  }
+
+  /**
+   * Argument `name` is missing.
+   *
+   * @param {string} name
+   * @api private
+   */
+
+  missingArgument(name) {
+    const message = `error: missing required argument '${name}'`;
+    this._displayError(1, 'commander.missingArgument', message);
+  };
+
+  /**
+   * `Option` is missing an argument.
+   *
+   * @param {Option} option
+   * @api private
+   */
+
+  optionMissingArgument(option) {
+    const message = `error: option '${option.flags}' argument missing`;
+    this._displayError(1, 'commander.optionMissingArgument', message);
+  };
+
+  /**
+   * `Option` does not have a value, and is a mandatory option.
+   *
+   * @param {Option} option
+   * @api private
+   */
+
+  missingMandatoryOptionValue(option) {
+    const message = `error: required option '${option.flags}' not specified`;
+    this._displayError(1, 'commander.missingMandatoryOptionValue', message);
+  };
+
+  /**
+   * Unknown option `flag`.
+   *
+   * @param {string} flag
+   * @api private
+   */
+
+  unknownOption(flag) {
+    if (this._allowUnknownOption) return;
+    const message = `error: unknown option '${flag}'`;
+    this._displayError(1, 'commander.unknownOption', message);
+  };
+
+  /**
+   * Excess arguments, more than expected.
+   *
+   * @param {string[]} receivedArgs
+   * @api private
+   */
+
+  _excessArguments(receivedArgs) {
+    if (this._allowExcessArguments) return;
+
+    const expected = this._args.length;
+    const s = (expected === 1) ? '' : 's';
+    const forSubcommand = this.parent ? ` for '${this.name()}'` : '';
+    const message = `error: too many arguments${forSubcommand}. Expected ${expected} argument${s} but got ${receivedArgs.length}.`;
+    this._displayError(1, 'commander.excessArguments', message);
+  };
+
+  /**
+   * Unknown command.
+   *
+   * @api private
+   */
+
+  unknownCommand() {
+    const partCommands = [this.name()];
+    for (let parentCmd = this.parent; parentCmd; parentCmd = parentCmd.parent) {
+      partCommands.unshift(parentCmd.name());
+    }
+    const fullCommand = partCommands.join(' ');
+    const message = `error: unknown command '${this.args[0]}'.` +
+      (this._hasHelpOption ? ` See '${fullCommand} ${this._helpLongFlag}'.` : '');
+    this._displayError(1, 'commander.unknownCommand', message);
+  };
+
+  /**
+   * Set the program version to `str`.
+   *
+   * This method auto-registers the "-V, --version" flag
+   * which will print the version number when passed.
+   *
+   * You can optionally supply the  flags and description to override the defaults.
+   *
+   * @param {string} str
+   * @param {string} [flags]
+   * @param {string} [description]
+   * @return {this | string} `this` command for chaining, or version string if no arguments
+   */
+
+  version(str, flags, description) {
+    if (str === undefined) return this._version;
+    this._version = str;
+    flags = flags || '-V, --version';
+    description = description || 'output the version number';
+    const versionOption = this.createOption(flags, description);
+    this._versionOptionName = versionOption.attributeName();
+    this.options.push(versionOption);
+    this.on('option:' + versionOption.name(), () => {
+      this._outputConfiguration.writeOut(`${str}\n`);
+      this._exit(0, 'commander.version', str);
+    });
+    return this;
+  };
+
+  /**
+   * Set the description to `str`.
+   *
+   * @param {string} [str]
+   * @param {Object} [argsDescription]
+   * @return {string|Command}
+   */
+  description(str, argsDescription) {
+    if (str === undefined && argsDescription === undefined) return this._description;
+    this._description = str;
+    this._argsDescription = argsDescription;
+    return this;
+  };
+
+  /**
+   * Set an alias for the command.
+   *
+   * You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help.
+   *
+   * @param {string} [alias]
+   * @return {string|Command}
+   */
+
+  alias(alias) {
+    if (alias === undefined) return this._aliases[0]; // just return first, for backwards compatibility
+
+    let command = this;
+    if (this.commands.length !== 0 && this.commands[this.commands.length - 1]._executableHandler) {
+      // assume adding alias for last added executable subcommand, rather than this
+      command = this.commands[this.commands.length - 1];
+    }
+
+    if (alias === command._name) throw new Error('Command alias can\'t be the same as its name');
+
+    command._aliases.push(alias);
+    return this;
+  };
+
+  /**
+   * Set aliases for the command.
+   *
+   * Only the first alias is shown in the auto-generated help.
+   *
+   * @param {string[]} [aliases]
+   * @return {string[]|Command}
+   */
+
+  aliases(aliases) {
+    // Getter for the array of aliases is the main reason for having aliases() in addition to alias().
+    if (aliases === undefined) return this._aliases;
+
+    aliases.forEach((alias) => this.alias(alias));
+    return this;
+  };
+
+  /**
+   * Set / get the command usage `str`.
+   *
+   * @param {string} [str]
+   * @return {String|Command}
+   */
+
+  usage(str) {
+    if (str === undefined) {
+      if (this._usage) return this._usage;
+
+      const args = this._args.map((arg) => {
+        return humanReadableArgName(arg);
+      });
+      return [].concat(
+        (this.options.length || this._hasHelpOption ? '[options]' : []),
+        (this.commands.length ? '[command]' : []),
+        (this._args.length ? args : [])
+      ).join(' ');
+    }
+
+    this._usage = str;
+    return this;
+  };
+
+  /**
+   * Get or set the name of the command
+   *
+   * @param {string} [str]
+   * @return {string|Command}
+   */
+
+  name(str) {
+    if (str === undefined) return this._name;
+    this._name = str;
+    return this;
+  };
+
+  /**
+   * Return program help documentation.
+   *
+   * @param {{ error: boolean }} [contextOptions] - pass {error:true} to wrap for stderr instead of stdout
+   * @return {string}
+   */
+
+  helpInformation(contextOptions) {
+    const helper = this.createHelp();
+    if (helper.helpWidth === undefined) {
+      helper.helpWidth = (contextOptions && contextOptions.error) ? this._outputConfiguration.getErrHelpWidth() : this._outputConfiguration.getOutHelpWidth();
+    }
+    return helper.formatHelp(this, helper);
+  };
+
+  /**
+   * @api private
+   */
+
+  _getHelpContext(contextOptions) {
+    contextOptions = contextOptions || {};
+    const context = { error: !!contextOptions.error };
+    let write;
+    if (context.error) {
+      write = (arg) => this._outputConfiguration.writeErr(arg);
+    } else {
+      write = (arg) => this._outputConfiguration.writeOut(arg);
+    }
+    context.write = contextOptions.write || write;
+    context.command = this;
+    return context;
+  }
+
+  /**
+   * Output help information for this command.
+   *
+   * Outputs built-in help, and custom text added using `.addHelpText()`.
+   *
+   * @param {{ error: boolean } | Function} [contextOptions] - pass {error:true} to write to stderr instead of stdout
+   */
+
+  outputHelp(contextOptions) {
+    let deprecatedCallback;
+    if (typeof contextOptions === 'function') {
+      deprecatedCallback = contextOptions;
+      contextOptions = undefined;
+    }
+    const context = this._getHelpContext(contextOptions);
+
+    const groupListeners = [];
+    let command = this;
+    while (command) {
+      groupListeners.push(command); // ordered from current command to root
+      command = command.parent;
+    }
+
+    groupListeners.slice().reverse().forEach(command => command.emit('beforeAllHelp', context));
+    this.emit('beforeHelp', context);
+
+    let helpInformation = this.helpInformation(context);
+    if (deprecatedCallback) {
+      helpInformation = deprecatedCallback(helpInformation);
+      if (typeof helpInformation !== 'string' && !Buffer.isBuffer(helpInformation)) {
+        throw new Error('outputHelp callback must return a string or a Buffer');
+      }
+    }
+    context.write(helpInformation);
+
+    this.emit(this._helpLongFlag); // deprecated
+    this.emit('afterHelp', context);
+    groupListeners.forEach(command => command.emit('afterAllHelp', context));
+  };
+
+  /**
+   * You can pass in flags and a description to override the help
+   * flags and help description for your command. Pass in false to
+   * disable the built-in help option.
+   *
+   * @param {string | boolean} [flags]
+   * @param {string} [description]
+   * @return {Command} `this` command for chaining
+   */
+
+  helpOption(flags, description) {
+    if (typeof flags === 'boolean') {
+      this._hasHelpOption = flags;
+      return this;
+    }
+    this._helpFlags = flags || this._helpFlags;
+    this._helpDescription = description || this._helpDescription;
+
+    const helpFlags = _parseOptionFlags(this._helpFlags);
+    this._helpShortFlag = helpFlags.shortFlag;
+    this._helpLongFlag = helpFlags.longFlag;
+
+    return this;
+  };
+
+  /**
+   * Output help information and exit.
+   *
+   * Outputs built-in help, and custom text added using `.addHelpText()`.
+   *
+   * @param {{ error: boolean }} [contextOptions] - pass {error:true} to write to stderr instead of stdout
+   */
+
+  help(contextOptions) {
+    this.outputHelp(contextOptions);
+    let exitCode = process.exitCode || 0;
+    if (exitCode === 0 && contextOptions && typeof contextOptions !== 'function' && contextOptions.error) {
+      exitCode = 1;
+    }
+    // message: do not have all displayed text available so only passing placeholder.
+    this._exit(exitCode, 'commander.help', '(outputHelp)');
+  };
+
+  /**
+   * Add additional text to be displayed with the built-in help.
+   *
+   * Position is 'before' or 'after' to affect just this command,
+   * and 'beforeAll' or 'afterAll' to affect this command and all its subcommands.
+   *
+   * @param {string} position - before or after built-in help
+   * @param {string | Function} text - string to add, or a function returning a string
+   * @return {Command} `this` command for chaining
+   */
+  addHelpText(position, text) {
+    const allowedValues = ['beforeAll', 'before', 'after', 'afterAll'];
+    if (!allowedValues.includes(position)) {
+      throw new Error(`Unexpected value for position to addHelpText.
+Expecting one of '${allowedValues.join("', '")}'`);
+    }
+    const helpEvent = `${position}Help`;
+    this.on(helpEvent, (context) => {
+      let helpStr;
+      if (typeof text === 'function') {
+        helpStr = text({ error: context.error, command: context.command });
+      } else {
+        helpStr = text;
+      }
+      // Ignore falsy value when nothing to output.
+      if (helpStr) {
+        context.write(`${helpStr}\n`);
+      }
+    });
+    return this;
+  }
+};
+
+/**
+ * Expose the root command.
+ */
+
+exports = module.exports = new Command();
+exports.program = exports; // More explicit access to global command.
+
+/**
+ * Expose classes
+ */
+
+exports.Command = Command;
+exports.Option = Option;
+exports.CommanderError = CommanderError;
+exports.InvalidOptionArgumentError = InvalidOptionArgumentError;
+exports.Help = Help;
+
+/**
+ * Camel-case the given `flag`
+ *
+ * @param {string} flag
+ * @return {string}
+ * @api private
+ */
+
+function camelcase(flag) {
+  return flag.split('-').reduce((str, word) => {
+    return str + word[0].toUpperCase() + word.slice(1);
+  });
+}
+
+/**
+ * Output help information if help flags specified
+ *
+ * @param {Command} cmd - command to output help for
+ * @param {Array} args - array of options to search for help flags
+ * @api private
+ */
+
+function outputHelpIfRequested(cmd, args) {
+  const helpOption = cmd._hasHelpOption && args.find(arg => arg === cmd._helpLongFlag || arg === cmd._helpShortFlag);
+  if (helpOption) {
+    cmd.outputHelp();
+    // (Do not have all displayed text available so only passing placeholder.)
+    cmd._exit(0, 'commander.helpDisplayed', '(outputHelp)');
+  }
+}
+
+/**
+ * Takes an argument and returns its human readable equivalent for help usage.
+ *
+ * @param {Object} arg
+ * @return {string}
+ * @api private
+ */
+
+function humanReadableArgName(arg) {
+  const nameOutput = arg.name + (arg.variadic === true ? '...' : '');
+
+  return arg.required
+    ? '<' + nameOutput + '>'
+    : '[' + nameOutput + ']';
+}
+
+/**
+ * Parse the short and long flag out of something like '-m,--mixed <value>'
+ *
+ * @api private
+ */
+
+function _parseOptionFlags(flags) {
+  let shortFlag;
+  let longFlag;
+  // Use original very loose parsing to maintain backwards compatibility for now,
+  // which allowed for example unintended `-sw, --short-word` [sic].
+  const flagParts = flags.split(/[ |,]+/);
+  if (flagParts.length > 1 && !/^[[<]/.test(flagParts[1])) shortFlag = flagParts.shift();
+  longFlag = flagParts.shift();
+  // Add support for lone short flag without significantly changing parsing!
+  if (!shortFlag && /^-[^-]$/.test(longFlag)) {
+    shortFlag = longFlag;
+    longFlag = undefined;
+  }
+  return { shortFlag, longFlag };
+}
+
+/**
+ * Scan arguments and increment port number for inspect calls (to avoid conflicts when spawning new command).
+ *
+ * @param {string[]} args - array of arguments from node.execArgv
+ * @returns {string[]}
+ * @api private
+ */
+
+function incrementNodeInspectorPort(args) {
+  // Testing for these options:
+  //  --inspect[=[host:]port]
+  //  --inspect-brk[=[host:]port]
+  //  --inspect-port=[host:]port
+  return args.map((arg) => {
+    if (!arg.startsWith('--inspect')) {
+      return arg;
+    }
+    let debugOption;
+    let debugHost = '127.0.0.1';
+    let debugPort = '9229';
+    let match;
+    if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) {
+      // e.g. --inspect
+      debugOption = match[1];
+    } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null) {
+      debugOption = match[1];
+      if (/^\d+$/.test(match[3])) {
+        // e.g. --inspect=1234
+        debugPort = match[3];
+      } else {
+        // e.g. --inspect=localhost
+        debugHost = match[3];
+      }
+    } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/)) !== null) {
+      // e.g. --inspect=localhost:1234
+      debugOption = match[1];
+      debugHost = match[3];
+      debugPort = match[4];
+    }
+
+    if (debugOption && debugPort !== '0') {
+      return `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`;
+    }
+    return arg;
+  });
+}
diff --git a/node_modules/svgo/node_modules/commander/package-support.json b/node_modules/svgo/node_modules/commander/package-support.json
new file mode 100644
index 0000000..4eabb97
--- /dev/null
+++ b/node_modules/svgo/node_modules/commander/package-support.json
@@ -0,0 +1,16 @@
+{
+  "versions": [
+    {
+      "version": "*",
+      "target": {
+        "node": "supported"
+      },
+      "response": {
+        "type": "time-permitting"
+      },
+      "backing": {
+        "npm-funding": true
+      }
+    }
+  ]
+}
diff --git a/node_modules/svgo/node_modules/commander/package.json b/node_modules/svgo/node_modules/commander/package.json
new file mode 100644
index 0000000..ca153e5
--- /dev/null
+++ b/node_modules/svgo/node_modules/commander/package.json
@@ -0,0 +1,68 @@
+{
+  "name": "commander",
+  "version": "7.2.0",
+  "description": "the complete solution for node.js command-line programs",
+  "keywords": [
+    "commander",
+    "command",
+    "option",
+    "parser",
+    "cli",
+    "argument",
+    "args",
+    "argv"
+  ],
+  "author": "TJ Holowaychuk <tj@vision-media.ca>",
+  "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/tj/commander.js.git"
+  },
+  "scripts": {
+    "lint": "eslint index.js esm.mjs \"tests/**/*.js\"",
+    "typescript-lint": "eslint typings/*.ts tests/*.ts",
+    "test": "jest && npm run test-typings",
+    "test-esm": "node --experimental-modules ./tests/esm-imports-test.mjs",
+    "test-typings": "tsd",
+    "typescript-checkJS": "tsc --allowJS --checkJS index.js --noEmit",
+    "test-all": "npm run test && npm run lint && npm run typescript-lint && npm run typescript-checkJS && npm run test-esm"
+  },
+  "main": "./index.js",
+  "files": [
+    "index.js",
+    "esm.mjs",
+    "typings/index.d.ts",
+    "package-support.json"
+  ],
+  "type": "commonjs",
+  "dependencies": {},
+  "devDependencies": {
+    "@types/jest": "^26.0.20",
+    "@types/node": "^14.14.20",
+    "@typescript-eslint/eslint-plugin": "^4.12.0",
+    "@typescript-eslint/parser": "^4.12.0",
+    "eslint": "^7.17.0",
+    "eslint-config-standard": "^16.0.2",
+    "eslint-plugin-jest": "^24.1.3",
+    "jest": "^26.6.3",
+    "standard": "^16.0.3",
+    "ts-jest": "^26.5.1",
+    "tsd": "^0.14.0",
+    "typescript": "^4.1.2"
+  },
+  "types": "typings/index.d.ts",
+  "jest": {
+    "testEnvironment": "node",
+    "collectCoverage": true,
+    "transform": {
+      "^.+\\.tsx?$": "ts-jest"
+    },
+    "testPathIgnorePatterns": [
+      "/node_modules/"
+    ]
+  },
+  "engines": {
+    "node": ">= 10"
+  },
+  "support": true
+}
diff --git a/node_modules/svgo/node_modules/commander/typings/index.d.ts b/node_modules/svgo/node_modules/commander/typings/index.d.ts
new file mode 100644
index 0000000..ee40d89
--- /dev/null
+++ b/node_modules/svgo/node_modules/commander/typings/index.d.ts
@@ -0,0 +1,627 @@
+// Type definitions for commander
+// Original definitions by: Alan Agius <https://github.com/alan-agius4>, Marcelo Dezem <https://github.com/mdezem>, vvakame <https://github.com/vvakame>, Jules Randolph <https://github.com/sveinburne>
+
+// Using method rather than property for method-signature-style, to document method overloads separately. Allow either.
+/* eslint-disable @typescript-eslint/method-signature-style */
+/* eslint-disable @typescript-eslint/no-explicit-any */
+
+declare namespace commander {
+
+  interface CommanderError extends Error {
+    code: string;
+    exitCode: number;
+    message: string;
+    nestedError?: string;
+  }
+  type CommanderErrorConstructor = new (exitCode: number, code: string, message: string) => CommanderError;
+
+  // eslint-disable-next-line @typescript-eslint/no-empty-interface
+  interface InvalidOptionArgumentError extends CommanderError {
+  }
+  type InvalidOptionArgumentErrorConstructor = new (message: string) => InvalidOptionArgumentError;
+
+  interface Option {
+    flags: string;
+    description: string;
+
+    required: boolean; // A value must be supplied when the option is specified.
+    optional: boolean; // A value is optional when the option is specified.
+    variadic: boolean;
+    mandatory: boolean; // The option must have a value after parsing, which usually means it must be specified on command line.
+    optionFlags: string;
+    short?: string;
+    long?: string;
+    negate: boolean;
+    defaultValue?: any;
+    defaultValueDescription?: string;
+    parseArg?: <T>(value: string, previous: T) => T;
+    hidden: boolean;
+    argChoices?: string[];
+
+    /**
+     * Set the default value, and optionally supply the description to be displayed in the help.
+     */
+    default(value: any, description?: string): this;
+
+    /**
+     * Calculate the full description, including defaultValue etc.
+     */
+    fullDescription(): string;
+
+    /**
+     * Set the custom handler for processing CLI option arguments into option values.
+     */
+    argParser<T>(fn: (value: string, previous: T) => T): this;
+
+    /**
+     * Whether the option is mandatory and must have a value after parsing.
+     */
+    makeOptionMandatory(mandatory?: boolean): this;
+
+    /**
+     * Hide option in help.
+     */
+    hideHelp(hide?: boolean): this;
+
+    /**
+     * Validation of option argument failed.
+     * Intended for use from custom argument processing functions.
+     */
+    argumentRejected(messsage: string): never;
+
+    /**
+     * Only allow option value to be one of choices.
+     */
+    choices(values: string[]): this;
+
+    /**
+     * Return option name.
+     */
+    name(): string;
+
+    /**
+     * Return option name, in a camelcase format that can be used
+     * as a object attribute key.
+     */
+    attributeName(): string;
+  }
+  type OptionConstructor = new (flags: string, description?: string) => Option;
+
+  interface Help {
+    /** output helpWidth, long lines are wrapped to fit */
+    helpWidth?: number;
+    sortSubcommands: boolean;
+    sortOptions: boolean;
+
+    /** Get the command term to show in the list of subcommands. */
+    subcommandTerm(cmd: Command): string;
+    /** Get the command description to show in the list of subcommands. */
+    subcommandDescription(cmd: Command): string;
+    /** Get the option term to show in the list of options. */
+    optionTerm(option: Option): string;
+    /** Get the option description to show in the list of options. */
+    optionDescription(option: Option): string;
+
+    /** Get the command usage to be displayed at the top of the built-in help. */
+    commandUsage(cmd: Command): string;
+    /** Get the description for the command. */
+    commandDescription(cmd: Command): string;
+
+    /** Get an array of the visible subcommands. Includes a placeholder for the implicit help command, if there is one. */
+    visibleCommands(cmd: Command): Command[];
+    /** Get an array of the visible options. Includes a placeholder for the implicit help option, if there is one. */
+    visibleOptions(cmd: Command): Option[];
+    /** Get an array of the arguments which have descriptions. */
+    visibleArguments(cmd: Command): Array<{ term: string; description: string}>;
+
+    /** Get the longest command term length. */
+    longestSubcommandTermLength(cmd: Command, helper: Help): number;
+    /** Get the longest option term length. */
+    longestOptionTermLength(cmd: Command, helper: Help): number;
+    /** Get the longest argument term length. */
+    longestArgumentTermLength(cmd: Command, helper: Help): number;
+    /** Calculate the pad width from the maximum term length. */
+    padWidth(cmd: Command, helper: Help): number;
+
+    /**
+     * Wrap the given string to width characters per line, with lines after the first indented.
+     * Do not wrap if insufficient room for wrapping (minColumnWidth), or string is manually formatted.
+     */
+    wrap(str: string, width: number, indent: number, minColumnWidth?: number): string;
+
+    /** Generate the built-in help text. */
+    formatHelp(cmd: Command, helper: Help): string;
+  }
+  type HelpConstructor = new () => Help;
+  type HelpConfiguration = Partial<Help>;
+
+  interface ParseOptions {
+    from: 'node' | 'electron' | 'user';
+  }
+  interface HelpContext { // optional parameter for .help() and .outputHelp()
+    error: boolean;
+  }
+  interface AddHelpTextContext { // passed to text function used with .addHelpText()
+    error: boolean;
+    command: Command;
+  }
+  interface OutputConfiguration {
+    writeOut?(str: string): void;
+    writeErr?(str: string): void;
+    getOutHelpWidth?(): number;
+    getErrHelpWidth?(): number;
+    outputError?(str: string, write: (str: string) => void): void;
+
+  }
+
+  type AddHelpTextPosition = 'beforeAll' | 'before' | 'after' | 'afterAll';
+
+  interface OptionValues {
+    [key: string]: any;
+  }
+
+  interface Command {
+    args: string[];
+    commands: Command[];
+    parent: Command | null;
+
+    /**
+     * Set the program version to `str`.
+     *
+     * This method auto-registers the "-V, --version" flag
+     * which will print the version number when passed.
+     *
+     * You can optionally supply the  flags and description to override the defaults.
+     */
+    version(str: string, flags?: string, description?: string): this;
+
+    /**
+     * Define a command, implemented using an action handler.
+     *
+     * @remarks
+     * The command description is supplied using `.description`, not as a parameter to `.command`.
+     *
+     * @example
+     * ```ts
+     *  program
+     *    .command('clone <source> [destination]')
+     *    .description('clone a repository into a newly created directory')
+     *    .action((source, destination) => {
+     *      console.log('clone command called');
+     *    });
+     * ```
+     *
+     * @param nameAndArgs - command name and arguments, args are  `<required>` or `[optional]` and last may also be `variadic...`
+     * @param opts - configuration options
+     * @returns new command
+     */
+    command(nameAndArgs: string, opts?: CommandOptions): ReturnType<this['createCommand']>;
+    /**
+     * Define a command, implemented in a separate executable file.
+     *
+     * @remarks
+     * The command description is supplied as the second parameter to `.command`.
+     *
+     * @example
+     * ```ts
+     *  program
+     *    .command('start <service>', 'start named service')
+     *    .command('stop [service]', 'stop named service, or all if no name supplied');
+     * ```
+     *
+     * @param nameAndArgs - command name and arguments, args are  `<required>` or `[optional]` and last may also be `variadic...`
+     * @param description - description of executable command
+     * @param opts - configuration options
+     * @returns `this` command for chaining
+     */
+    command(nameAndArgs: string, description: string, opts?: commander.ExecutableCommandOptions): this;
+
+    /**
+     * Factory routine to create a new unattached command.
+     *
+     * See .command() for creating an attached subcommand, which uses this routine to
+     * create the command. You can override createCommand to customise subcommands.
+     */
+    createCommand(name?: string): Command;
+
+    /**
+     * Add a prepared subcommand.
+     *
+     * See .command() for creating an attached subcommand which inherits settings from its parent.
+     *
+     * @returns `this` command for chaining
+     */
+    addCommand(cmd: Command, opts?: CommandOptions): this;
+
+    /**
+     * Define argument syntax for command.
+     *
+     * @returns `this` command for chaining
+     */
+    arguments(desc: string): this;
+
+    /**
+     * Override default decision whether to add implicit help command.
+     *
+     *    addHelpCommand() // force on
+     *    addHelpCommand(false); // force off
+     *    addHelpCommand('help [cmd]', 'display help for [cmd]'); // force on with custom details
+     *
+     * @returns `this` command for chaining
+     */
+    addHelpCommand(enableOrNameAndArgs?: string | boolean, description?: string): this;
+
+    /**
+     * Register callback to use as replacement for calling process.exit.
+     */
+    exitOverride(callback?: (err: CommanderError) => never|void): this;
+
+    /**
+     * You can customise the help with a subclass of Help by overriding createHelp,
+     * or by overriding Help properties using configureHelp().
+     */
+    createHelp(): Help;
+
+    /**
+     * You can customise the help by overriding Help properties using configureHelp(),
+     * or with a subclass of Help by overriding createHelp().
+     */
+    configureHelp(configuration: HelpConfiguration): this;
+    /** Get configuration */
+    configureHelp(): HelpConfiguration;
+
+    /**
+     * The default output goes to stdout and stderr. You can customise this for special
+     * applications. You can also customise the display of errors by overriding outputError.
+     *
+     * The configuration properties are all functions:
+     *
+     *    // functions to change where being written, stdout and stderr
+     *    writeOut(str)
+     *    writeErr(str)
+     *    // matching functions to specify width for wrapping help
+     *    getOutHelpWidth()
+     *    getErrHelpWidth()
+     *    // functions based on what is being written out
+     *    outputError(str, write) // used for displaying errors, and not used for displaying help
+     */
+    configureOutput(configuration: OutputConfiguration): this;
+    /** Get configuration */
+    configureOutput(): OutputConfiguration;
+
+    /**
+     * Register callback `fn` for the command.
+     *
+     * @example
+     *      program
+     *        .command('help')
+     *        .description('display verbose help')
+     *        .action(function() {
+     *           // output help here
+     *        });
+     *
+     * @returns `this` command for chaining
+     */
+    action(fn: (...args: any[]) => void | Promise<void>): this;
+
+    /**
+     * Define option with `flags`, `description` and optional
+     * coercion `fn`.
+     *
+     * The `flags` string contains the short and/or long flags,
+     * separated by comma, a pipe or space. The following are all valid
+     * all will output this way when `--help` is used.
+     *
+     *    "-p, --pepper"
+     *    "-p|--pepper"
+     *    "-p --pepper"
+     *
+     * @example
+     *     // simple boolean defaulting to false
+     *     program.option('-p, --pepper', 'add pepper');
+     *
+     *     --pepper
+     *     program.pepper
+     *     // => Boolean
+     *
+     *     // simple boolean defaulting to true
+     *     program.option('-C, --no-cheese', 'remove cheese');
+     *
+     *     program.cheese
+     *     // => true
+     *
+     *     --no-cheese
+     *     program.cheese
+     *     // => false
+     *
+     *     // required argument
+     *     program.option('-C, --chdir <path>', 'change the working directory');
+     *
+     *     --chdir /tmp
+     *     program.chdir
+     *     // => "/tmp"
+     *
+     *     // optional argument
+     *     program.option('-c, --cheese [type]', 'add cheese [marble]');
+     *
+     * @returns `this` command for chaining
+     */
+    option(flags: string, description?: string, defaultValue?: string | boolean): this;
+    option<T>(flags: string, description: string, fn: (value: string, previous: T) => T, defaultValue?: T): this;
+    /** @deprecated since v7, instead use choices or a custom function */
+    option(flags: string, description: string, regexp: RegExp, defaultValue?: string | boolean): this;
+
+    /**
+     * Define a required option, which must have a value after parsing. This usually means
+     * the option must be specified on the command line. (Otherwise the same as .option().)
+     *
+     * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space.
+     */
+    requiredOption(flags: string, description?: string, defaultValue?: string | boolean): this;
+    requiredOption<T>(flags: string, description: string, fn: (value: string, previous: T) => T, defaultValue?: T): this;
+    /** @deprecated since v7, instead use choices or a custom function */
+    requiredOption(flags: string, description: string, regexp: RegExp, defaultValue?: string | boolean): this;
+
+    /**
+     * Factory routine to create a new unattached option.
+     *
+     * See .option() for creating an attached option, which uses this routine to
+     * create the option. You can override createOption to return a custom option.
+     */
+
+    createOption(flags: string, description?: string): Option;
+
+    /**
+     * Add a prepared Option.
+     *
+     * See .option() and .requiredOption() for creating and attaching an option in a single call.
+     */
+    addOption(option: Option): this;
+
+    /**
+     * Whether to store option values as properties on command object,
+     * or store separately (specify false). In both cases the option values can be accessed using .opts().
+     *
+     * @returns `this` command for chaining
+     */
+    storeOptionsAsProperties(): this & OptionValues;
+    storeOptionsAsProperties(storeAsProperties: true): this & OptionValues;
+    storeOptionsAsProperties(storeAsProperties?: boolean): this;
+
+    /**
+     * Alter parsing of short flags with optional values.
+     *
+     * @example
+     *    // for `.option('-f,--flag [value]'):
+     *   .combineFlagAndOptionalValue(true)  // `-f80` is treated like `--flag=80`, this is the default behaviour
+     *   .combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b`
+     *
+     * @returns `this` command for chaining
+     */
+    combineFlagAndOptionalValue(combine?: boolean): this;
+
+    /**
+     * Allow unknown options on the command line.
+     *
+     * @returns `this` command for chaining
+     */
+    allowUnknownOption(allowUnknown?: boolean): this;
+
+    /**
+     * Allow excess command-arguments on the command line. Pass false to make excess arguments an error.
+     *
+     * @returns `this` command for chaining
+     */
+    allowExcessArguments(allowExcess?: boolean): this;
+
+    /**
+     * Enable positional options. Positional means global options are specified before subcommands which lets
+     * subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions.
+     *
+     * The default behaviour is non-positional and global options may appear anywhere on the command line.
+     *
+     * @returns `this` command for chaining
+     */
+    enablePositionalOptions(positional?: boolean): this;
+
+    /**
+     * Pass through options that come after command-arguments rather than treat them as command-options,
+     * so actual command-options come before command-arguments. Turning this on for a subcommand requires
+     * positional options to have been enabled on the program (parent commands).
+     *
+     * The default behaviour is non-positional and options may appear before or after command-arguments.
+     *
+     * @returns `this` command for chaining
+     */
+    passThroughOptions(passThrough?: boolean): this;
+
+    /**
+     * Parse `argv`, setting options and invoking commands when defined.
+     *
+     * The default expectation is that the arguments are from node and have the application as argv[0]
+     * and the script being run in argv[1], with user parameters after that.
+     *
+     * Examples:
+     *
+     *      program.parse(process.argv);
+     *      program.parse(); // implicitly use process.argv and auto-detect node vs electron conventions
+     *      program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
+     *
+     * @returns `this` command for chaining
+     */
+    parse(argv?: string[], options?: ParseOptions): this;
+
+    /**
+     * Parse `argv`, setting options and invoking commands when defined.
+     *
+     * Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise.
+     *
+     * The default expectation is that the arguments are from node and have the application as argv[0]
+     * and the script being run in argv[1], with user parameters after that.
+     *
+     * Examples:
+     *
+     *      program.parseAsync(process.argv);
+     *      program.parseAsync(); // implicitly use process.argv and auto-detect node vs electron conventions
+     *      program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
+     *
+     * @returns Promise
+     */
+    parseAsync(argv?: string[], options?: ParseOptions): Promise<this>;
+
+    /**
+     * Parse options from `argv` removing known options,
+     * and return argv split into operands and unknown arguments.
+     *
+     * @example
+     *    argv => operands, unknown
+     *    --known kkk op => [op], []
+     *    op --known kkk => [op], []
+     *    sub --unknown uuu op => [sub], [--unknown uuu op]
+     *    sub -- --unknown uuu op => [sub --unknown uuu op], []
+     */
+    parseOptions(argv: string[]): commander.ParseOptionsResult;
+
+    /**
+     * Return an object containing options as key-value pairs
+     */
+    opts(): OptionValues;
+
+    /**
+     * Set the description.
+     *
+     * @returns `this` command for chaining
+     */
+    description(str: string, argsDescription?: {[argName: string]: string}): this;
+    /**
+     * Get the description.
+     */
+    description(): string;
+
+    /**
+     * Set an alias for the command.
+     *
+     * You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help.
+     *
+     * @returns `this` command for chaining
+     */
+    alias(alias: string): this;
+    /**
+     * Get alias for the command.
+     */
+    alias(): string;
+
+    /**
+     * Set aliases for the command.
+     *
+     * Only the first alias is shown in the auto-generated help.
+     *
+     * @returns `this` command for chaining
+     */
+    aliases(aliases: string[]): this;
+    /**
+     * Get aliases for the command.
+     */
+    aliases(): string[];
+
+    /**
+     * Set the command usage.
+     *
+     * @returns `this` command for chaining
+     */
+    usage(str: string): this;
+    /**
+     * Get the command usage.
+     */
+    usage(): string;
+
+    /**
+     * Set the name of the command.
+     *
+     * @returns `this` command for chaining
+     */
+    name(str: string): this;
+    /**
+     * Get the name of the command.
+     */
+    name(): string;
+
+    /**
+     * Output help information for this command.
+     *
+     * Outputs built-in help, and custom text added using `.addHelpText()`.
+     *
+     */
+    outputHelp(context?: HelpContext): void;
+    /** @deprecated since v7 */
+    outputHelp(cb?: (str: string) => string): void;
+
+    /**
+     * Return command help documentation.
+     */
+    helpInformation(context?: HelpContext): string;
+
+    /**
+     * You can pass in flags and a description to override the help
+     * flags and help description for your command. Pass in false
+     * to disable the built-in help option.
+     */
+    helpOption(flags?: string | boolean, description?: string): this;
+
+    /**
+     * Output help information and exit.
+     *
+     * Outputs built-in help, and custom text added using `.addHelpText()`.
+     */
+    help(context?: HelpContext): never;
+    /** @deprecated since v7 */
+    help(cb?: (str: string) => string): never;
+
+    /**
+     * Add additional text to be displayed with the built-in help.
+     *
+     * Position is 'before' or 'after' to affect just this command,
+     * and 'beforeAll' or 'afterAll' to affect this command and all its subcommands.
+     */
+    addHelpText(position: AddHelpTextPosition, text: string): this;
+    addHelpText(position: AddHelpTextPosition, text: (context: AddHelpTextContext) => string | undefined): this;
+
+    /**
+     * Add a listener (callback) for when events occur. (Implemented using EventEmitter.)
+     */
+    on(event: string | symbol, listener: (...args: any[]) => void): this;
+  }
+  type CommandConstructor = new (name?: string) => Command;
+
+  interface CommandOptions {
+    hidden?: boolean;
+    isDefault?: boolean;
+    /** @deprecated since v7, replaced by hidden */
+    noHelp?: boolean;
+  }
+  interface ExecutableCommandOptions extends CommandOptions {
+    executableFile?: string;
+  }
+
+  // eslint-disable-next-line @typescript-eslint/no-unused-vars
+  interface ParseOptionsResult {
+    operands: string[];
+    unknown: string[];
+  }
+
+  // eslint-disable-next-line @typescript-eslint/no-unused-vars
+  interface CommanderStatic extends Command {
+    program: Command;
+    Command: CommandConstructor;
+    Option: OptionConstructor;
+    CommanderError: CommanderErrorConstructor;
+    InvalidOptionArgumentError: InvalidOptionArgumentErrorConstructor;
+    Help: HelpConstructor;
+  }
+
+}
+
+// Declaring namespace AND global
+// eslint-disable-next-line @typescript-eslint/no-redeclare
+declare const commander: commander.CommanderStatic;
+export = commander;
diff --git a/node_modules/svgo/node_modules/has-flag/index.d.ts b/node_modules/svgo/node_modules/has-flag/index.d.ts
new file mode 100644
index 0000000..a0a48c8
--- /dev/null
+++ b/node_modules/svgo/node_modules/has-flag/index.d.ts
@@ -0,0 +1,39 @@
+/**
+Check if [`argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv) has a specific flag.
+
+@param flag - CLI flag to look for. The `--` prefix is optional.
+@param argv - CLI arguments. Default: `process.argv`.
+@returns Whether the flag exists.
+
+@example
+```
+// $ ts-node foo.ts -f --unicorn --foo=bar -- --rainbow
+
+// foo.ts
+import hasFlag = require('has-flag');
+
+hasFlag('unicorn');
+//=> true
+
+hasFlag('--unicorn');
+//=> true
+
+hasFlag('f');
+//=> true
+
+hasFlag('-f');
+//=> true
+
+hasFlag('foo=bar');
+//=> true
+
+hasFlag('foo');
+//=> false
+
+hasFlag('rainbow');
+//=> false
+```
+*/
+declare function hasFlag(flag: string, argv?: string[]): boolean;
+
+export = hasFlag;
diff --git a/node_modules/svgo/node_modules/has-flag/index.js b/node_modules/svgo/node_modules/has-flag/index.js
new file mode 100644
index 0000000..b6f80b1
--- /dev/null
+++ b/node_modules/svgo/node_modules/has-flag/index.js
@@ -0,0 +1,8 @@
+'use strict';
+
+module.exports = (flag, argv = process.argv) => {
+	const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');
+	const position = argv.indexOf(prefix + flag);
+	const terminatorPosition = argv.indexOf('--');
+	return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);
+};
diff --git a/node_modules/svgo/node_modules/has-flag/license b/node_modules/svgo/node_modules/has-flag/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/node_modules/svgo/node_modules/has-flag/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/svgo/node_modules/has-flag/package.json b/node_modules/svgo/node_modules/has-flag/package.json
new file mode 100644
index 0000000..9b7c182
--- /dev/null
+++ b/node_modules/svgo/node_modules/has-flag/package.json
@@ -0,0 +1,46 @@
+{
+  "name": "has-flag",
+  "version": "4.0.0",
+  "description": "Check if argv has a specific flag",
+  "license": "MIT",
+  "repository": "sindresorhus/has-flag",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=8"
+  },
+  "scripts": {
+    "test": "xo && ava && tsd"
+  },
+  "files": [
+    "index.js",
+    "index.d.ts"
+  ],
+  "keywords": [
+    "has",
+    "check",
+    "detect",
+    "contains",
+    "find",
+    "flag",
+    "cli",
+    "command-line",
+    "argv",
+    "process",
+    "arg",
+    "args",
+    "argument",
+    "arguments",
+    "getopt",
+    "minimist",
+    "optimist"
+  ],
+  "devDependencies": {
+    "ava": "^1.4.1",
+    "tsd": "^0.7.2",
+    "xo": "^0.24.0"
+  }
+}
diff --git a/node_modules/svgo/node_modules/has-flag/readme.md b/node_modules/svgo/node_modules/has-flag/readme.md
new file mode 100644
index 0000000..3f72dff
--- /dev/null
+++ b/node_modules/svgo/node_modules/has-flag/readme.md
@@ -0,0 +1,89 @@
+# has-flag [![Build Status](https://travis-ci.org/sindresorhus/has-flag.svg?branch=master)](https://travis-ci.org/sindresorhus/has-flag)
+
+> Check if [`argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv) has a specific flag
+
+Correctly stops looking after an `--` argument terminator.
+
+---
+
+<div align="center">
+	<b>
+		<a href="https://tidelift.com/subscription/pkg/npm-has-flag?utm_source=npm-has-flag&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
+	</b>
+	<br>
+	<sub>
+		Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
+	</sub>
+</div>
+
+---
+
+
+## Install
+
+```
+$ npm install has-flag
+```
+
+
+## Usage
+
+```js
+// foo.js
+const hasFlag = require('has-flag');
+
+hasFlag('unicorn');
+//=> true
+
+hasFlag('--unicorn');
+//=> true
+
+hasFlag('f');
+//=> true
+
+hasFlag('-f');
+//=> true
+
+hasFlag('foo=bar');
+//=> true
+
+hasFlag('foo');
+//=> false
+
+hasFlag('rainbow');
+//=> false
+```
+
+```
+$ node foo.js -f --unicorn --foo=bar -- --rainbow
+```
+
+
+## API
+
+### hasFlag(flag, [argv])
+
+Returns a boolean for whether the flag exists.
+
+#### flag
+
+Type: `string`
+
+CLI flag to look for. The `--` prefix is optional.
+
+#### argv
+
+Type: `string[]`<br>
+Default: `process.argv`
+
+CLI arguments.
+
+
+## Security
+
+To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure.
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/svgo/node_modules/supports-color/browser.js b/node_modules/svgo/node_modules/supports-color/browser.js
new file mode 100644
index 0000000..62afa3a
--- /dev/null
+++ b/node_modules/svgo/node_modules/supports-color/browser.js
@@ -0,0 +1,5 @@
+'use strict';
+module.exports = {
+	stdout: false,
+	stderr: false
+};
diff --git a/node_modules/svgo/node_modules/supports-color/index.js b/node_modules/svgo/node_modules/supports-color/index.js
new file mode 100644
index 0000000..6fada39
--- /dev/null
+++ b/node_modules/svgo/node_modules/supports-color/index.js
@@ -0,0 +1,135 @@
+'use strict';
+const os = require('os');
+const tty = require('tty');
+const hasFlag = require('has-flag');
+
+const {env} = process;
+
+let forceColor;
+if (hasFlag('no-color') ||
+	hasFlag('no-colors') ||
+	hasFlag('color=false') ||
+	hasFlag('color=never')) {
+	forceColor = 0;
+} else if (hasFlag('color') ||
+	hasFlag('colors') ||
+	hasFlag('color=true') ||
+	hasFlag('color=always')) {
+	forceColor = 1;
+}
+
+if ('FORCE_COLOR' in env) {
+	if (env.FORCE_COLOR === 'true') {
+		forceColor = 1;
+	} else if (env.FORCE_COLOR === 'false') {
+		forceColor = 0;
+	} else {
+		forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);
+	}
+}
+
+function translateLevel(level) {
+	if (level === 0) {
+		return false;
+	}
+
+	return {
+		level,
+		hasBasic: true,
+		has256: level >= 2,
+		has16m: level >= 3
+	};
+}
+
+function supportsColor(haveStream, streamIsTTY) {
+	if (forceColor === 0) {
+		return 0;
+	}
+
+	if (hasFlag('color=16m') ||
+		hasFlag('color=full') ||
+		hasFlag('color=truecolor')) {
+		return 3;
+	}
+
+	if (hasFlag('color=256')) {
+		return 2;
+	}
+
+	if (haveStream && !streamIsTTY && forceColor === undefined) {
+		return 0;
+	}
+
+	const min = forceColor || 0;
+
+	if (env.TERM === 'dumb') {
+		return min;
+	}
+
+	if (process.platform === 'win32') {
+		// Windows 10 build 10586 is the first Windows release that supports 256 colors.
+		// Windows 10 build 14931 is the first release that supports 16m/TrueColor.
+		const osRelease = os.release().split('.');
+		if (
+			Number(osRelease[0]) >= 10 &&
+			Number(osRelease[2]) >= 10586
+		) {
+			return Number(osRelease[2]) >= 14931 ? 3 : 2;
+		}
+
+		return 1;
+	}
+
+	if ('CI' in env) {
+		if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {
+			return 1;
+		}
+
+		return min;
+	}
+
+	if ('TEAMCITY_VERSION' in env) {
+		return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
+	}
+
+	if (env.COLORTERM === 'truecolor') {
+		return 3;
+	}
+
+	if ('TERM_PROGRAM' in env) {
+		const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);
+
+		switch (env.TERM_PROGRAM) {
+			case 'iTerm.app':
+				return version >= 3 ? 3 : 2;
+			case 'Apple_Terminal':
+				return 2;
+			// No default
+		}
+	}
+
+	if (/-256(color)?$/i.test(env.TERM)) {
+		return 2;
+	}
+
+	if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
+		return 1;
+	}
+
+	if ('COLORTERM' in env) {
+		return 1;
+	}
+
+	return min;
+}
+
+function getSupportLevel(stream) {
+	const level = supportsColor(stream, stream && stream.isTTY);
+	return translateLevel(level);
+}
+
+module.exports = {
+	supportsColor: getSupportLevel,
+	stdout: translateLevel(supportsColor(true, tty.isatty(1))),
+	stderr: translateLevel(supportsColor(true, tty.isatty(2)))
+};
diff --git a/node_modules/svgo/node_modules/supports-color/license b/node_modules/svgo/node_modules/supports-color/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/node_modules/svgo/node_modules/supports-color/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/svgo/node_modules/supports-color/package.json b/node_modules/svgo/node_modules/supports-color/package.json
new file mode 100644
index 0000000..746ec7c
--- /dev/null
+++ b/node_modules/svgo/node_modules/supports-color/package.json
@@ -0,0 +1,53 @@
+{
+  "name": "supports-color",
+  "version": "7.2.0",
+  "description": "Detect whether a terminal supports color",
+  "license": "MIT",
+  "repository": "chalk/supports-color",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=8"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "files": [
+    "index.js",
+    "browser.js"
+  ],
+  "keywords": [
+    "color",
+    "colour",
+    "colors",
+    "terminal",
+    "console",
+    "cli",
+    "ansi",
+    "styles",
+    "tty",
+    "rgb",
+    "256",
+    "shell",
+    "xterm",
+    "command-line",
+    "support",
+    "supports",
+    "capability",
+    "detect",
+    "truecolor",
+    "16m"
+  ],
+  "dependencies": {
+    "has-flag": "^4.0.0"
+  },
+  "devDependencies": {
+    "ava": "^1.4.1",
+    "import-fresh": "^3.0.0",
+    "xo": "^0.24.0"
+  },
+  "browser": "browser.js"
+}
diff --git a/node_modules/svgo/node_modules/supports-color/readme.md b/node_modules/svgo/node_modules/supports-color/readme.md
new file mode 100644
index 0000000..3654228
--- /dev/null
+++ b/node_modules/svgo/node_modules/supports-color/readme.md
@@ -0,0 +1,76 @@
+# supports-color [![Build Status](https://travis-ci.org/chalk/supports-color.svg?branch=master)](https://travis-ci.org/chalk/supports-color)
+
+> Detect whether a terminal supports color
+
+
+## Install
+
+```
+$ npm install supports-color
+```
+
+
+## Usage
+
+```js
+const supportsColor = require('supports-color');
+
+if (supportsColor.stdout) {
+	console.log('Terminal stdout supports color');
+}
+
+if (supportsColor.stdout.has256) {
+	console.log('Terminal stdout supports 256 colors');
+}
+
+if (supportsColor.stderr.has16m) {
+	console.log('Terminal stderr supports 16 million colors (truecolor)');
+}
+```
+
+
+## API
+
+Returns an `Object` with a `stdout` and `stderr` property for testing either streams. Each property is an `Object`, or `false` if color is not supported.
+
+The `stdout`/`stderr` objects specifies a level of support for color through a `.level` property and a corresponding flag:
+
+- `.level = 1` and `.hasBasic = true`: Basic color support (16 colors)
+- `.level = 2` and `.has256 = true`: 256 color support
+- `.level = 3` and `.has16m = true`: Truecolor support (16 million colors)
+
+
+## Info
+
+It obeys the `--color` and `--no-color` CLI flags.
+
+For situations where using `--color` is not possible, use the environment variable `FORCE_COLOR=1` (level 1), `FORCE_COLOR=2` (level 2), or `FORCE_COLOR=3` (level 3) to forcefully enable color, or `FORCE_COLOR=0` to forcefully disable. The use of `FORCE_COLOR` overrides all other color support checks.
+
+Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color=16m` flags, respectively.
+
+
+## Related
+
+- [supports-color-cli](https://github.com/chalk/supports-color-cli) - CLI for this module
+- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right
+
+
+## Maintainers
+
+- [Sindre Sorhus](https://github.com/sindresorhus)
+- [Josh Junon](https://github.com/qix-)
+
+
+---
+
+<div align="center">
+	<b>
+		<a href="https://tidelift.com/subscription/pkg/npm-supports-color?utm_source=npm-supports-color&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
+	</b>
+	<br>
+	<sub>
+		Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
+	</sub>
+</div>
+
+---
diff --git a/node_modules/svgo/package.json b/node_modules/svgo/package.json
new file mode 100644
index 0000000..762ed4d
--- /dev/null
+++ b/node_modules/svgo/package.json
@@ -0,0 +1,128 @@
+{
+  "name": "svgo",
+  "version": "2.3.0",
+  "description": "Nodejs-based tool for optimizing SVG vector graphics files",
+  "keywords": [
+    "svgo",
+    "svg",
+    "optimize",
+    "minify"
+  ],
+  "homepage": "https://github.com/svg/svgo",
+  "bugs": {
+    "url": "https://github.com/svg/svgo/issues"
+  },
+  "author": {
+    "name": "Kir Belevich",
+    "email": "kir@belevi.ch",
+    "url": "https://github.com/deepsweet"
+  },
+  "contributors": [
+    {
+      "name": "Sergey Belov",
+      "email": "peimei@ya.ru",
+      "url": "https://github.com/arikon"
+    },
+    {
+      "name": "Lev Solntsev",
+      "email": "lev.sun@ya.ru",
+      "url": "https://github.com/GreLI"
+    },
+    {
+      "name": "Bogdan Chadkin",
+      "email": "trysound@yandex.ru",
+      "url": "https://github.com/TrySound"
+    }
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/svg/svgo.git"
+  },
+  "main": "./lib/svgo-node.js",
+  "bin": {
+    "svgo": "./bin/svgo"
+  },
+  "files": [
+    "bin",
+    "lib",
+    "plugins",
+    "dist"
+  ],
+  "scripts": {
+    "test": "c8 --reporter=html --reporter=text mocha \"test/*/_index.js\" \"**/*.test.js\" --ignore=\"node_modules/**\"",
+    "lint": "eslint --ignore-path .gitignore . && prettier --list-different \"**/*.js\" --ignore-path .gitignore",
+    "fix": "eslint --ignore-path .gitignore --fix . && prettier --write \"**/*.js\" --ignore-path .gitignore",
+    "typecheck": "tsc",
+    "test-browser": "rollup -c && node ./test/browser.js",
+    "test-regression": "node ./test/regression-extract.js && NO_DIFF=1 node ./test/regression.js",
+    "prepublishOnly": "rm -rf dist && rollup -c"
+  },
+  "prettier": {
+    "singleQuote": true
+  },
+  "eslintConfig": {
+    "parserOptions": {
+      "ecmaVersion": "2021"
+    },
+    "env": {
+      "node": true,
+      "es2021": true
+    },
+    "extends": [
+      "eslint:recommended"
+    ],
+    "overrides": [
+      {
+        "files": [
+          "rollup.config.js"
+        ],
+        "parserOptions": {
+          "sourceType": "module"
+        }
+      },
+      {
+        "files": [
+          "test/**/*.js",
+          "**/*.test.js"
+        ],
+        "env": {
+          "mocha": true
+        }
+      }
+    ]
+  },
+  "dependencies": {
+    "@trysound/sax": "0.1.1",
+    "chalk": "^4.1.0",
+    "commander": "^7.1.0",
+    "css-select": "^3.1.2",
+    "css-tree": "^1.1.2",
+    "csso": "^4.2.0",
+    "stable": "^0.1.8"
+  },
+  "devDependencies": {
+    "@rollup/plugin-commonjs": "^17.1.0",
+    "@rollup/plugin-json": "^4.1.0",
+    "@rollup/plugin-node-resolve": "^11.2.0",
+    "@types/mocha": "^8.2.2",
+    "c8": "^7.6.0",
+    "chai": "^4.3.4",
+    "del": "^6.0.0",
+    "eslint": "^7.22.0",
+    "mocha": "^8.3.2",
+    "mock-stdin": "^1.0.0",
+    "node-fetch": "^2.6.1",
+    "pixelmatch": "^5.2.1",
+    "playwright": "^1.9.2",
+    "pngjs": "^6.0.0",
+    "prettier": "^2.2.1",
+    "rollup": "^2.42.1",
+    "rollup-plugin-terser": "^7.0.2",
+    "tar-stream": "^2.2.0",
+    "typescript": "^4.2.3"
+  },
+  "engines": {
+    "node": ">=10.13.0"
+  },
+  "license": "MIT"
+}
diff --git a/node_modules/svgo/plugins/_applyTransforms.js b/node_modules/svgo/plugins/_applyTransforms.js
new file mode 100644
index 0000000..307160d
--- /dev/null
+++ b/node_modules/svgo/plugins/_applyTransforms.js
@@ -0,0 +1,329 @@
+'use strict';
+
+// TODO implement as separate plugin
+
+const {
+  transformsMultiply,
+  transform2js,
+  transformArc,
+} = require('./_transforms.js');
+const { removeLeadingZero } = require('../lib/svgo/tools.js');
+const { referencesProps, attrsGroupsDefaults } = require('./_collections.js');
+
+const regNumericValues = /[-+]?(\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?/g;
+const defaultStrokeWidth = attrsGroupsDefaults.presentation['stroke-width'];
+
+/**
+ * Apply transformation(s) to the Path data.
+ *
+ * @param {Object} elem current element
+ * @param {Array} path input path data
+ * @param {Object} params whether to apply transforms to stroked lines and transform precision (used for stroke width)
+ * @return {Array} output path data
+ */
+const applyTransforms = (elem, pathData, params) => {
+  // if there are no 'stroke' attr and references to other objects such as
+  // gradiends or clip-path which are also subjects to transform.
+  if (
+    elem.attributes.transform == null ||
+    elem.attributes.transform === '' ||
+    // styles are not considered when applying transform
+    // can be fixed properly with new style engine
+    elem.attributes.style != null ||
+    Object.entries(elem.attributes).some(
+      ([name, value]) =>
+        referencesProps.includes(name) && value.includes('url(')
+    )
+  ) {
+    return;
+  }
+
+  const matrix = transformsMultiply(transform2js(elem.attributes.transform));
+  const stroke = elem.computedAttr('stroke');
+  const id = elem.computedAttr('id');
+  const transformPrecision = params.transformPrecision;
+
+  if (stroke && stroke != 'none') {
+    if (
+      !params.applyTransformsStroked ||
+      ((matrix.data[0] != matrix.data[3] ||
+        matrix.data[1] != -matrix.data[2]) &&
+        (matrix.data[0] != -matrix.data[3] || matrix.data[1] != matrix.data[2]))
+    )
+      return;
+
+    // "stroke-width" should be inside the part with ID, otherwise it can be overrided in <use>
+    if (id) {
+      let idElem = elem;
+      let hasStrokeWidth = false;
+
+      do {
+        if (idElem.attributes['stroke-width']) {
+          hasStrokeWidth = true;
+        }
+      } while (
+        idElem.attributes.id !== id &&
+        !hasStrokeWidth &&
+        (idElem = idElem.parentNode)
+      );
+
+      if (!hasStrokeWidth) return;
+    }
+
+    const scale = +Math.sqrt(
+      matrix.data[0] * matrix.data[0] + matrix.data[1] * matrix.data[1]
+    ).toFixed(transformPrecision);
+
+    if (scale !== 1) {
+      const strokeWidth =
+        elem.computedAttr('stroke-width') || defaultStrokeWidth;
+
+      if (
+        elem.attributes['vector-effect'] == null ||
+        elem.attributes['vector-effect'] !== 'non-scaling-stroke'
+      ) {
+        if (elem.attributes['stroke-width'] != null) {
+          elem.attributes['stroke-width'] = elem.attributes['stroke-width']
+            .trim()
+            .replace(regNumericValues, (num) => removeLeadingZero(num * scale));
+        } else {
+          elem.attributes[
+            'stroke-width'
+          ] = strokeWidth.replace(regNumericValues, (num) =>
+            removeLeadingZero(num * scale)
+          );
+        }
+
+        if (elem.attributes['stroke-dashoffset'] != null) {
+          elem.attributes['stroke-dashoffset'] = elem.attributes[
+            'stroke-dashoffset'
+          ]
+            .trim()
+            .replace(regNumericValues, (num) => removeLeadingZero(num * scale));
+        }
+
+        if (elem.attributes['stroke-dasharray'] != null) {
+          elem.attributes['stroke-dasharray'] = elem.attributes[
+            'stroke-dasharray'
+          ]
+            .trim()
+            .replace(regNumericValues, (num) => removeLeadingZero(num * scale));
+        }
+      }
+    }
+  } else if (id) {
+    // Stroke and stroke-width can be redefined with <use>
+    return;
+  }
+
+  applyMatrixToPathData(pathData, matrix.data);
+
+  // remove transform attr
+  delete elem.attributes.transform;
+
+  return;
+};
+exports.applyTransforms = applyTransforms;
+
+const transformAbsolutePoint = (matrix, x, y) => {
+  const newX = matrix[0] * x + matrix[2] * y + matrix[4];
+  const newY = matrix[1] * x + matrix[3] * y + matrix[5];
+  return [newX, newY];
+};
+
+const transformRelativePoint = (matrix, x, y) => {
+  const newX = matrix[0] * x + matrix[2] * y;
+  const newY = matrix[1] * x + matrix[3] * y;
+  return [newX, newY];
+};
+
+const applyMatrixToPathData = (pathData, matrix) => {
+  let start = [0, 0];
+  let cursor = [0, 0];
+
+  for (const pathItem of pathData) {
+    let { instruction: command, data: args } = pathItem;
+    // moveto (x y)
+    if (command === 'M') {
+      cursor[0] = args[0];
+      cursor[1] = args[1];
+      start[0] = cursor[0];
+      start[1] = cursor[1];
+      const [x, y] = transformAbsolutePoint(matrix, args[0], args[1]);
+      args[0] = x;
+      args[1] = y;
+    }
+    if (command === 'm') {
+      cursor[0] += args[0];
+      cursor[1] += args[1];
+      start[0] = cursor[0];
+      start[1] = cursor[1];
+      const [x, y] = transformRelativePoint(matrix, args[0], args[1]);
+      args[0] = x;
+      args[1] = y;
+    }
+
+    // horizontal lineto (x)
+    // convert to lineto to handle two-dimentional transforms
+    if (command === 'H') {
+      command = 'L';
+      args = [args[0], cursor[1]];
+    }
+    if (command === 'h') {
+      command = 'l';
+      args = [args[0], 0];
+    }
+
+    // vertical lineto (y)
+    // convert to lineto to handle two-dimentional transforms
+    if (command === 'V') {
+      command = 'L';
+      args = [cursor[0], args[0]];
+    }
+    if (command === 'v') {
+      command = 'l';
+      args = [0, args[0]];
+    }
+
+    // lineto (x y)
+    if (command === 'L') {
+      cursor[0] = args[0];
+      cursor[1] = args[1];
+      const [x, y] = transformAbsolutePoint(matrix, args[0], args[1]);
+      args[0] = x;
+      args[1] = y;
+    }
+    if (command === 'l') {
+      cursor[0] += args[0];
+      cursor[1] += args[1];
+      const [x, y] = transformRelativePoint(matrix, args[0], args[1]);
+      args[0] = x;
+      args[1] = y;
+    }
+
+    // curveto (x1 y1 x2 y2 x y)
+    if (command === 'C') {
+      cursor[0] = args[4];
+      cursor[1] = args[5];
+      const [x1, y1] = transformAbsolutePoint(matrix, args[0], args[1]);
+      const [x2, y2] = transformAbsolutePoint(matrix, args[2], args[3]);
+      const [x, y] = transformAbsolutePoint(matrix, args[4], args[5]);
+      args[0] = x1;
+      args[1] = y1;
+      args[2] = x2;
+      args[3] = y2;
+      args[4] = x;
+      args[5] = y;
+    }
+    if (command === 'c') {
+      cursor[0] += args[4];
+      cursor[1] += args[5];
+      const [x1, y1] = transformRelativePoint(matrix, args[0], args[1]);
+      const [x2, y2] = transformRelativePoint(matrix, args[2], args[3]);
+      const [x, y] = transformRelativePoint(matrix, args[4], args[5]);
+      args[0] = x1;
+      args[1] = y1;
+      args[2] = x2;
+      args[3] = y2;
+      args[4] = x;
+      args[5] = y;
+    }
+
+    // smooth curveto (x2 y2 x y)
+    if (command === 'S') {
+      cursor[0] = args[2];
+      cursor[1] = args[3];
+      const [x2, y2] = transformAbsolutePoint(matrix, args[0], args[1]);
+      const [x, y] = transformAbsolutePoint(matrix, args[2], args[3]);
+      args[0] = x2;
+      args[1] = y2;
+      args[2] = x;
+      args[3] = y;
+    }
+    if (command === 's') {
+      cursor[0] += args[2];
+      cursor[1] += args[3];
+      const [x2, y2] = transformRelativePoint(matrix, args[0], args[1]);
+      const [x, y] = transformRelativePoint(matrix, args[2], args[3]);
+      args[0] = x2;
+      args[1] = y2;
+      args[2] = x;
+      args[3] = y;
+    }
+
+    // quadratic Bézier curveto (x1 y1 x y)
+    if (command === 'Q') {
+      cursor[0] = args[2];
+      cursor[1] = args[3];
+      const [x1, y1] = transformAbsolutePoint(matrix, args[0], args[1]);
+      const [x, y] = transformAbsolutePoint(matrix, args[2], args[3]);
+      args[0] = x1;
+      args[1] = y1;
+      args[2] = x;
+      args[3] = y;
+    }
+    if (command === 'q') {
+      cursor[0] += args[2];
+      cursor[1] += args[3];
+      const [x1, y1] = transformRelativePoint(matrix, args[0], args[1]);
+      const [x, y] = transformRelativePoint(matrix, args[2], args[3]);
+      args[0] = x1;
+      args[1] = y1;
+      args[2] = x;
+      args[3] = y;
+    }
+
+    // smooth quadratic Bézier curveto (x y)
+    if (command === 'T') {
+      cursor[0] = args[0];
+      cursor[1] = args[1];
+      const [x, y] = transformAbsolutePoint(matrix, args[0], args[1]);
+      args[0] = x;
+      args[1] = y;
+    }
+    if (command === 't') {
+      cursor[0] += args[0];
+      cursor[1] += args[1];
+      const [x, y] = transformRelativePoint(matrix, args[0], args[1]);
+      args[0] = x;
+      args[1] = y;
+    }
+
+    // elliptical arc (rx ry x-axis-rotation large-arc-flag sweep-flag x y)
+    if (command === 'A') {
+      transformArc(cursor, args, matrix);
+      cursor[0] = args[5];
+      cursor[1] = args[6];
+      // reduce number of digits in rotation angle
+      if (Math.abs(args[2]) > 80) {
+        const a = args[0];
+        const rotation = args[2];
+        args[0] = args[1];
+        args[1] = a;
+        args[2] = rotation + (rotation > 0 ? -90 : 90);
+      }
+      const [x, y] = transformAbsolutePoint(matrix, args[5], args[6]);
+      args[5] = x;
+      args[6] = y;
+    }
+    if (command === 'a') {
+      transformArc([0, 0], args, matrix);
+      cursor[0] += args[5];
+      cursor[1] += args[6];
+      // reduce number of digits in rotation angle
+      if (Math.abs(args[2]) > 80) {
+        const a = args[0];
+        const rotation = args[2];
+        args[0] = args[1];
+        args[1] = a;
+        args[2] = rotation + (rotation > 0 ? -90 : 90);
+      }
+      const [x, y] = transformRelativePoint(matrix, args[5], args[6]);
+      args[5] = x;
+      args[6] = y;
+    }
+
+    pathItem.instruction = command;
+    pathItem.data = args;
+  }
+};
diff --git a/node_modules/svgo/plugins/_collections.js b/node_modules/svgo/plugins/_collections.js
new file mode 100644
index 0000000..5a7df8f
--- /dev/null
+++ b/node_modules/svgo/plugins/_collections.js
@@ -0,0 +1,2136 @@
+'use strict';
+
+// https://www.w3.org/TR/SVG11/intro.html#Definitions
+exports.elemsGroups = {
+  animation: [
+    'animate',
+    'animateColor',
+    'animateMotion',
+    'animateTransform',
+    'set',
+  ],
+  descriptive: ['desc', 'metadata', 'title'],
+  shape: ['circle', 'ellipse', 'line', 'path', 'polygon', 'polyline', 'rect'],
+  structural: ['defs', 'g', 'svg', 'symbol', 'use'],
+  paintServer: [
+    'solidColor',
+    'linearGradient',
+    'radialGradient',
+    'meshGradient',
+    'pattern',
+    'hatch',
+  ],
+  nonRendering: [
+    'linearGradient',
+    'radialGradient',
+    'pattern',
+    'clipPath',
+    'mask',
+    'marker',
+    'symbol',
+    'filter',
+    'solidColor',
+  ],
+  container: [
+    'a',
+    'defs',
+    'g',
+    'marker',
+    'mask',
+    'missing-glyph',
+    'pattern',
+    'svg',
+    'switch',
+    'symbol',
+    'foreignObject',
+  ],
+  textContent: [
+    'altGlyph',
+    'altGlyphDef',
+    'altGlyphItem',
+    'glyph',
+    'glyphRef',
+    'textPath',
+    'text',
+    'tref',
+    'tspan',
+  ],
+  textContentChild: ['altGlyph', 'textPath', 'tref', 'tspan'],
+  lightSource: [
+    'feDiffuseLighting',
+    'feSpecularLighting',
+    'feDistantLight',
+    'fePointLight',
+    'feSpotLight',
+  ],
+  filterPrimitive: [
+    'feBlend',
+    'feColorMatrix',
+    'feComponentTransfer',
+    'feComposite',
+    'feConvolveMatrix',
+    'feDiffuseLighting',
+    'feDisplacementMap',
+    'feFlood',
+    'feGaussianBlur',
+    'feImage',
+    'feMerge',
+    'feMorphology',
+    'feOffset',
+    'feSpecularLighting',
+    'feTile',
+    'feTurbulence',
+  ],
+};
+
+exports.textElems = exports.elemsGroups.textContent.concat('title');
+
+exports.pathElems = ['path', 'glyph', 'missing-glyph'];
+
+// https://www.w3.org/TR/SVG11/intro.html#Definitions
+exports.attrsGroups = {
+  animationAddition: ['additive', 'accumulate'],
+  animationAttributeTarget: ['attributeType', 'attributeName'],
+  animationEvent: ['onbegin', 'onend', 'onrepeat', 'onload'],
+  animationTiming: [
+    'begin',
+    'dur',
+    'end',
+    'min',
+    'max',
+    'restart',
+    'repeatCount',
+    'repeatDur',
+    'fill',
+  ],
+  animationValue: [
+    'calcMode',
+    'values',
+    'keyTimes',
+    'keySplines',
+    'from',
+    'to',
+    'by',
+  ],
+  conditionalProcessing: [
+    'requiredFeatures',
+    'requiredExtensions',
+    'systemLanguage',
+  ],
+  core: ['id', 'tabindex', 'xml:base', 'xml:lang', 'xml:space'],
+  graphicalEvent: [
+    'onfocusin',
+    'onfocusout',
+    'onactivate',
+    'onclick',
+    'onmousedown',
+    'onmouseup',
+    'onmouseover',
+    'onmousemove',
+    'onmouseout',
+    'onload',
+  ],
+  presentation: [
+    'alignment-baseline',
+    'baseline-shift',
+    'clip',
+    'clip-path',
+    'clip-rule',
+    'color',
+    'color-interpolation',
+    'color-interpolation-filters',
+    'color-profile',
+    'color-rendering',
+    'cursor',
+    'direction',
+    'display',
+    'dominant-baseline',
+    'enable-background',
+    'fill',
+    'fill-opacity',
+    'fill-rule',
+    'filter',
+    'flood-color',
+    'flood-opacity',
+    'font-family',
+    'font-size',
+    'font-size-adjust',
+    'font-stretch',
+    'font-style',
+    'font-variant',
+    'font-weight',
+    'glyph-orientation-horizontal',
+    'glyph-orientation-vertical',
+    'image-rendering',
+    'letter-spacing',
+    'lighting-color',
+    'marker-end',
+    'marker-mid',
+    'marker-start',
+    'mask',
+    'opacity',
+    'overflow',
+    'paint-order',
+    'pointer-events',
+    'shape-rendering',
+    'stop-color',
+    'stop-opacity',
+    'stroke',
+    'stroke-dasharray',
+    'stroke-dashoffset',
+    'stroke-linecap',
+    'stroke-linejoin',
+    'stroke-miterlimit',
+    'stroke-opacity',
+    'stroke-width',
+    'text-anchor',
+    'text-decoration',
+    'text-overflow',
+    'text-rendering',
+    'transform',
+    'unicode-bidi',
+    'vector-effect',
+    'visibility',
+    'word-spacing',
+    'writing-mode',
+  ],
+  xlink: [
+    'xlink:href',
+    'xlink:show',
+    'xlink:actuate',
+    'xlink:type',
+    'xlink:role',
+    'xlink:arcrole',
+    'xlink:title',
+  ],
+  documentEvent: [
+    'onunload',
+    'onabort',
+    'onerror',
+    'onresize',
+    'onscroll',
+    'onzoom',
+  ],
+  filterPrimitive: ['x', 'y', 'width', 'height', 'result'],
+  transferFunction: [
+    'type',
+    'tableValues',
+    'slope',
+    'intercept',
+    'amplitude',
+    'exponent',
+    'offset',
+  ],
+};
+
+exports.attrsGroupsDefaults = {
+  core: { 'xml:space': 'default' },
+  presentation: {
+    clip: 'auto',
+    'clip-path': 'none',
+    'clip-rule': 'nonzero',
+    mask: 'none',
+    opacity: '1',
+    'stop-color': '#000',
+    'stop-opacity': '1',
+    'fill-opacity': '1',
+    'fill-rule': 'nonzero',
+    fill: '#000',
+    stroke: 'none',
+    'stroke-width': '1',
+    'stroke-linecap': 'butt',
+    'stroke-linejoin': 'miter',
+    'stroke-miterlimit': '4',
+    'stroke-dasharray': 'none',
+    'stroke-dashoffset': '0',
+    'stroke-opacity': '1',
+    'paint-order': 'normal',
+    'vector-effect': 'none',
+    display: 'inline',
+    visibility: 'visible',
+    'marker-start': 'none',
+    'marker-mid': 'none',
+    'marker-end': 'none',
+    'color-interpolation': 'sRGB',
+    'color-interpolation-filters': 'linearRGB',
+    'color-rendering': 'auto',
+    'shape-rendering': 'auto',
+    'text-rendering': 'auto',
+    'image-rendering': 'auto',
+    'font-style': 'normal',
+    'font-variant': 'normal',
+    'font-weight': 'normal',
+    'font-stretch': 'normal',
+    'font-size': 'medium',
+    'font-size-adjust': 'none',
+    kerning: 'auto',
+    'letter-spacing': 'normal',
+    'word-spacing': 'normal',
+    'text-decoration': 'none',
+    'text-anchor': 'start',
+    'text-overflow': 'clip',
+    'writing-mode': 'lr-tb',
+    'glyph-orientation-vertical': 'auto',
+    'glyph-orientation-horizontal': '0deg',
+    direction: 'ltr',
+    'unicode-bidi': 'normal',
+    'dominant-baseline': 'auto',
+    'alignment-baseline': 'baseline',
+    'baseline-shift': 'baseline',
+  },
+  transferFunction: {
+    slope: '1',
+    intercept: '0',
+    amplitude: '1',
+    exponent: '1',
+    offset: '0',
+  },
+};
+
+// https://www.w3.org/TR/SVG11/eltindex.html
+exports.elems = {
+  a: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'graphicalEvent',
+      'presentation',
+      'xlink',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'transform',
+      'target',
+    ],
+    defaults: {
+      target: '_self',
+    },
+    contentGroups: [
+      'animation',
+      'descriptive',
+      'shape',
+      'structural',
+      'paintServer',
+    ],
+    content: [
+      'a',
+      'altGlyphDef',
+      'clipPath',
+      'color-profile',
+      'cursor',
+      'filter',
+      'font',
+      'font-face',
+      'foreignObject',
+      'image',
+      'marker',
+      'mask',
+      'pattern',
+      'script',
+      'style',
+      'switch',
+      'text',
+      'view',
+      // not spec compliant
+      'tspan',
+    ],
+  },
+  altGlyph: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'graphicalEvent',
+      'presentation',
+      'xlink',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'x',
+      'y',
+      'dx',
+      'dy',
+      'glyphRef',
+      'format',
+      'rotate',
+    ],
+  },
+  altGlyphDef: {
+    attrsGroups: ['core'],
+    content: ['glyphRef'],
+  },
+  altGlyphItem: {
+    attrsGroups: ['core'],
+    content: ['glyphRef', 'altGlyphItem'],
+  },
+  animate: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'animationAddition',
+      'animationAttributeTarget',
+      'animationEvent',
+      'animationTiming',
+      'animationValue',
+      'presentation',
+      'xlink',
+    ],
+    attrs: ['externalResourcesRequired'],
+    contentGroups: ['descriptive'],
+  },
+  animateColor: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'animationEvent',
+      'xlink',
+      'animationAttributeTarget',
+      'animationTiming',
+      'animationValue',
+      'animationAddition',
+      'presentation',
+    ],
+    attrs: ['externalResourcesRequired'],
+    contentGroups: ['descriptive'],
+  },
+  animateMotion: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'animationEvent',
+      'xlink',
+      'animationTiming',
+      'animationValue',
+      'animationAddition',
+    ],
+    attrs: [
+      'externalResourcesRequired',
+      'path',
+      'keyPoints',
+      'rotate',
+      'origin',
+    ],
+    defaults: {
+      rotate: '0',
+    },
+    contentGroups: ['descriptive'],
+    content: ['mpath'],
+  },
+  animateTransform: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'animationEvent',
+      'xlink',
+      'animationAttributeTarget',
+      'animationTiming',
+      'animationValue',
+      'animationAddition',
+    ],
+    attrs: ['externalResourcesRequired', 'type'],
+    contentGroups: ['descriptive'],
+  },
+  circle: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'graphicalEvent',
+      'presentation',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'transform',
+      'cx',
+      'cy',
+      'r',
+    ],
+    defaults: {
+      cx: '0',
+      cy: '0',
+    },
+    contentGroups: ['animation', 'descriptive'],
+  },
+  clipPath: {
+    attrsGroups: ['conditionalProcessing', 'core', 'presentation'],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'transform',
+      'clipPathUnits',
+    ],
+    defaults: {
+      clipPathUnits: 'userSpaceOnUse',
+    },
+    contentGroups: ['animation', 'descriptive', 'shape'],
+    content: ['text', 'use'],
+  },
+  'color-profile': {
+    attrsGroups: ['core', 'xlink'],
+    attrs: ['local', 'name', 'rendering-intent'],
+    defaults: {
+      name: 'sRGB',
+      'rendering-intent': 'auto',
+    },
+    contentGroups: ['descriptive'],
+  },
+  cursor: {
+    attrsGroups: ['core', 'conditionalProcessing', 'xlink'],
+    attrs: ['externalResourcesRequired', 'x', 'y'],
+    defaults: {
+      x: '0',
+      y: '0',
+    },
+    contentGroups: ['descriptive'],
+  },
+  defs: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'graphicalEvent',
+      'presentation',
+    ],
+    attrs: ['class', 'style', 'externalResourcesRequired', 'transform'],
+    contentGroups: [
+      'animation',
+      'descriptive',
+      'shape',
+      'structural',
+      'paintServer',
+    ],
+    content: [
+      'a',
+      'altGlyphDef',
+      'clipPath',
+      'color-profile',
+      'cursor',
+      'filter',
+      'font',
+      'font-face',
+      'foreignObject',
+      'image',
+      'marker',
+      'mask',
+      'pattern',
+      'script',
+      'style',
+      'switch',
+      'text',
+      'view',
+    ],
+  },
+  desc: {
+    attrsGroups: ['core'],
+    attrs: ['class', 'style'],
+  },
+  ellipse: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'graphicalEvent',
+      'presentation',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'transform',
+      'cx',
+      'cy',
+      'rx',
+      'ry',
+    ],
+    defaults: {
+      cx: '0',
+      cy: '0',
+    },
+    contentGroups: ['animation', 'descriptive'],
+  },
+  feBlend: {
+    attrsGroups: ['core', 'presentation', 'filterPrimitive'],
+    attrs: [
+      'class',
+      'style',
+      // TODO: in - 'If no value is provided and this is the first filter primitive,
+      // then this filter primitive will use SourceGraphic as its input'
+      'in',
+      'in2',
+      'mode',
+    ],
+    defaults: {
+      mode: 'normal',
+    },
+    content: ['animate', 'set'],
+  },
+  feColorMatrix: {
+    attrsGroups: ['core', 'presentation', 'filterPrimitive'],
+    attrs: ['class', 'style', 'in', 'type', 'values'],
+    defaults: {
+      type: 'matrix',
+    },
+    content: ['animate', 'set'],
+  },
+  feComponentTransfer: {
+    attrsGroups: ['core', 'presentation', 'filterPrimitive'],
+    attrs: ['class', 'style', 'in'],
+    content: ['feFuncA', 'feFuncB', 'feFuncG', 'feFuncR'],
+  },
+  feComposite: {
+    attrsGroups: ['core', 'presentation', 'filterPrimitive'],
+    attrs: ['class', 'style', 'in', 'in2', 'operator', 'k1', 'k2', 'k3', 'k4'],
+    defaults: {
+      operator: 'over',
+      k1: '0',
+      k2: '0',
+      k3: '0',
+      k4: '0',
+    },
+    content: ['animate', 'set'],
+  },
+  feConvolveMatrix: {
+    attrsGroups: ['core', 'presentation', 'filterPrimitive'],
+    attrs: [
+      'class',
+      'style',
+      'in',
+      'order',
+      'kernelMatrix',
+      // TODO: divisor - 'The default value is the sum of all values in kernelMatrix,
+      // with the exception that if the sum is zero, then the divisor is set to 1'
+      'divisor',
+      'bias',
+      // TODO: targetX - 'By default, the convolution matrix is centered in X over each
+      // pixel of the input image (i.e., targetX = floor ( orderX / 2 ))'
+      'targetX',
+      'targetY',
+      'edgeMode',
+      // TODO: kernelUnitLength - 'The first number is the <dx> value. The second number
+      // is the <dy> value. If the <dy> value is not specified, it defaults to the same value as <dx>'
+      'kernelUnitLength',
+      'preserveAlpha',
+    ],
+    defaults: {
+      order: '3',
+      bias: '0',
+      edgeMode: 'duplicate',
+      preserveAlpha: 'false',
+    },
+    content: ['animate', 'set'],
+  },
+  feDiffuseLighting: {
+    attrsGroups: ['core', 'presentation', 'filterPrimitive'],
+    attrs: [
+      'class',
+      'style',
+      'in',
+      'surfaceScale',
+      'diffuseConstant',
+      'kernelUnitLength',
+    ],
+    defaults: {
+      surfaceScale: '1',
+      diffuseConstant: '1',
+    },
+    contentGroups: ['descriptive'],
+    content: [
+      // TODO: 'exactly one light source element, in any order'
+      'feDistantLight',
+      'fePointLight',
+      'feSpotLight',
+    ],
+  },
+  feDisplacementMap: {
+    attrsGroups: ['core', 'presentation', 'filterPrimitive'],
+    attrs: [
+      'class',
+      'style',
+      'in',
+      'in2',
+      'scale',
+      'xChannelSelector',
+      'yChannelSelector',
+    ],
+    defaults: {
+      scale: '0',
+      xChannelSelector: 'A',
+      yChannelSelector: 'A',
+    },
+    content: ['animate', 'set'],
+  },
+  feDistantLight: {
+    attrsGroups: ['core'],
+    attrs: ['azimuth', 'elevation'],
+    defaults: {
+      azimuth: '0',
+      elevation: '0',
+    },
+    content: ['animate', 'set'],
+  },
+  feFlood: {
+    attrsGroups: ['core', 'presentation', 'filterPrimitive'],
+    attrs: ['class', 'style'],
+    content: ['animate', 'animateColor', 'set'],
+  },
+  feFuncA: {
+    attrsGroups: ['core', 'transferFunction'],
+    content: ['set', 'animate'],
+  },
+  feFuncB: {
+    attrsGroups: ['core', 'transferFunction'],
+    content: ['set', 'animate'],
+  },
+  feFuncG: {
+    attrsGroups: ['core', 'transferFunction'],
+    content: ['set', 'animate'],
+  },
+  feFuncR: {
+    attrsGroups: ['core', 'transferFunction'],
+    content: ['set', 'animate'],
+  },
+  feGaussianBlur: {
+    attrsGroups: ['core', 'presentation', 'filterPrimitive'],
+    attrs: ['class', 'style', 'in', 'stdDeviation'],
+    defaults: {
+      stdDeviation: '0',
+    },
+    content: ['set', 'animate'],
+  },
+  feImage: {
+    attrsGroups: ['core', 'presentation', 'filterPrimitive', 'xlink'],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'preserveAspectRatio',
+      'href',
+      'xlink:href',
+    ],
+    defaults: {
+      preserveAspectRatio: 'xMidYMid meet',
+    },
+    content: ['animate', 'animateTransform', 'set'],
+  },
+  feMerge: {
+    attrsGroups: ['core', 'presentation', 'filterPrimitive'],
+    attrs: ['class', 'style'],
+    content: ['feMergeNode'],
+  },
+  feMergeNode: {
+    attrsGroups: ['core'],
+    attrs: ['in'],
+    content: ['animate', 'set'],
+  },
+  feMorphology: {
+    attrsGroups: ['core', 'presentation', 'filterPrimitive'],
+    attrs: ['class', 'style', 'in', 'operator', 'radius'],
+    defaults: {
+      operator: 'erode',
+      radius: '0',
+    },
+    content: ['animate', 'set'],
+  },
+  feOffset: {
+    attrsGroups: ['core', 'presentation', 'filterPrimitive'],
+    attrs: ['class', 'style', 'in', 'dx', 'dy'],
+    defaults: {
+      dx: '0',
+      dy: '0',
+    },
+    content: ['animate', 'set'],
+  },
+  fePointLight: {
+    attrsGroups: ['core'],
+    attrs: ['x', 'y', 'z'],
+    defaults: {
+      x: '0',
+      y: '0',
+      z: '0',
+    },
+    content: ['animate', 'set'],
+  },
+  feSpecularLighting: {
+    attrsGroups: ['core', 'presentation', 'filterPrimitive'],
+    attrs: [
+      'class',
+      'style',
+      'in',
+      'surfaceScale',
+      'specularConstant',
+      'specularExponent',
+      'kernelUnitLength',
+    ],
+    defaults: {
+      surfaceScale: '1',
+      specularConstant: '1',
+      specularExponent: '1',
+    },
+    contentGroups: [
+      'descriptive',
+      // TODO: exactly one 'light source element'
+      'lightSource',
+    ],
+  },
+  feSpotLight: {
+    attrsGroups: ['core'],
+    attrs: [
+      'x',
+      'y',
+      'z',
+      'pointsAtX',
+      'pointsAtY',
+      'pointsAtZ',
+      'specularExponent',
+      'limitingConeAngle',
+    ],
+    defaults: {
+      x: '0',
+      y: '0',
+      z: '0',
+      pointsAtX: '0',
+      pointsAtY: '0',
+      pointsAtZ: '0',
+      specularExponent: '1',
+    },
+    content: ['animate', 'set'],
+  },
+  feTile: {
+    attrsGroups: ['core', 'presentation', 'filterPrimitive'],
+    attrs: ['class', 'style', 'in'],
+    content: ['animate', 'set'],
+  },
+  feTurbulence: {
+    attrsGroups: ['core', 'presentation', 'filterPrimitive'],
+    attrs: [
+      'class',
+      'style',
+      'baseFrequency',
+      'numOctaves',
+      'seed',
+      'stitchTiles',
+      'type',
+    ],
+    defaults: {
+      baseFrequency: '0',
+      numOctaves: '1',
+      seed: '0',
+      stitchTiles: 'noStitch',
+      type: 'turbulence',
+    },
+    content: ['animate', 'set'],
+  },
+  filter: {
+    attrsGroups: ['core', 'presentation', 'xlink'],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'x',
+      'y',
+      'width',
+      'height',
+      'filterRes',
+      'filterUnits',
+      'primitiveUnits',
+      'href',
+      'xlink:href',
+    ],
+    defaults: {
+      primitiveUnits: 'userSpaceOnUse',
+      x: '-10%',
+      y: '-10%',
+      width: '120%',
+      height: '120%',
+    },
+    contentGroups: ['descriptive', 'filterPrimitive'],
+    content: ['animate', 'set'],
+  },
+  font: {
+    attrsGroups: ['core', 'presentation'],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'horiz-origin-x',
+      'horiz-origin-y',
+      'horiz-adv-x',
+      'vert-origin-x',
+      'vert-origin-y',
+      'vert-adv-y',
+    ],
+    defaults: {
+      'horiz-origin-x': '0',
+      'horiz-origin-y': '0',
+    },
+    contentGroups: ['descriptive'],
+    content: ['font-face', 'glyph', 'hkern', 'missing-glyph', 'vkern'],
+  },
+  'font-face': {
+    attrsGroups: ['core'],
+    attrs: [
+      'font-family',
+      'font-style',
+      'font-variant',
+      'font-weight',
+      'font-stretch',
+      'font-size',
+      'unicode-range',
+      'units-per-em',
+      'panose-1',
+      'stemv',
+      'stemh',
+      'slope',
+      'cap-height',
+      'x-height',
+      'accent-height',
+      'ascent',
+      'descent',
+      'widths',
+      'bbox',
+      'ideographic',
+      'alphabetic',
+      'mathematical',
+      'hanging',
+      'v-ideographic',
+      'v-alphabetic',
+      'v-mathematical',
+      'v-hanging',
+      'underline-position',
+      'underline-thickness',
+      'strikethrough-position',
+      'strikethrough-thickness',
+      'overline-position',
+      'overline-thickness',
+    ],
+    defaults: {
+      'font-style': 'all',
+      'font-variant': 'normal',
+      'font-weight': 'all',
+      'font-stretch': 'normal',
+      'unicode-range': 'U+0-10FFFF',
+      'units-per-em': '1000',
+      'panose-1': '0 0 0 0 0 0 0 0 0 0',
+      slope: '0',
+    },
+    contentGroups: ['descriptive'],
+    content: [
+      // TODO: "at most one 'font-face-src' element"
+      'font-face-src',
+    ],
+  },
+  // TODO: empty content
+  'font-face-format': {
+    attrsGroups: ['core'],
+    attrs: ['string'],
+  },
+  'font-face-name': {
+    attrsGroups: ['core'],
+    attrs: ['name'],
+  },
+  'font-face-src': {
+    attrsGroups: ['core'],
+    content: ['font-face-name', 'font-face-uri'],
+  },
+  'font-face-uri': {
+    attrsGroups: ['core', 'xlink'],
+    attrs: ['href', 'xlink:href'],
+    content: ['font-face-format'],
+  },
+  foreignObject: {
+    attrsGroups: [
+      'core',
+      'conditionalProcessing',
+      'graphicalEvent',
+      'presentation',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'transform',
+      'x',
+      'y',
+      'width',
+      'height',
+    ],
+    defaults: {
+      x: 0,
+      y: 0,
+    },
+  },
+  g: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'graphicalEvent',
+      'presentation',
+    ],
+    attrs: ['class', 'style', 'externalResourcesRequired', 'transform'],
+    contentGroups: [
+      'animation',
+      'descriptive',
+      'shape',
+      'structural',
+      'paintServer',
+    ],
+    content: [
+      'a',
+      'altGlyphDef',
+      'clipPath',
+      'color-profile',
+      'cursor',
+      'filter',
+      'font',
+      'font-face',
+      'foreignObject',
+      'image',
+      'marker',
+      'mask',
+      'pattern',
+      'script',
+      'style',
+      'switch',
+      'text',
+      'view',
+    ],
+  },
+  glyph: {
+    attrsGroups: ['core', 'presentation'],
+    attrs: [
+      'class',
+      'style',
+      'd',
+      'horiz-adv-x',
+      'vert-origin-x',
+      'vert-origin-y',
+      'vert-adv-y',
+      'unicode',
+      'glyph-name',
+      'orientation',
+      'arabic-form',
+      'lang',
+    ],
+    defaults: {
+      'arabic-form': 'initial',
+    },
+    contentGroups: [
+      'animation',
+      'descriptive',
+      'shape',
+      'structural',
+      'paintServer',
+    ],
+    content: [
+      'a',
+      'altGlyphDef',
+      'clipPath',
+      'color-profile',
+      'cursor',
+      'filter',
+      'font',
+      'font-face',
+      'foreignObject',
+      'image',
+      'marker',
+      'mask',
+      'pattern',
+      'script',
+      'style',
+      'switch',
+      'text',
+      'view',
+    ],
+  },
+  glyphRef: {
+    attrsGroups: ['core', 'presentation'],
+    attrs: [
+      'class',
+      'style',
+      'd',
+      'horiz-adv-x',
+      'vert-origin-x',
+      'vert-origin-y',
+      'vert-adv-y',
+    ],
+    contentGroups: [
+      'animation',
+      'descriptive',
+      'shape',
+      'structural',
+      'paintServer',
+    ],
+    content: [
+      'a',
+      'altGlyphDef',
+      'clipPath',
+      'color-profile',
+      'cursor',
+      'filter',
+      'font',
+      'font-face',
+      'foreignObject',
+      'image',
+      'marker',
+      'mask',
+      'pattern',
+      'script',
+      'style',
+      'switch',
+      'text',
+      'view',
+    ],
+  },
+  hatch: {
+    attrsGroups: ['core', 'presentation', 'xlink'],
+    attrs: [
+      'class',
+      'style',
+      'x',
+      'y',
+      'pitch',
+      'rotate',
+      'hatchUnits',
+      'hatchContentUnits',
+      'transform',
+    ],
+    defaults: {
+      hatchUnits: 'objectBoundingBox',
+      hatchContentUnits: 'userSpaceOnUse',
+      x: '0',
+      y: '0',
+      pitch: '0',
+      rotate: '0',
+    },
+    contentGroups: ['animation', 'descriptive'],
+    content: ['hatchPath'],
+  },
+  hatchPath: {
+    attrsGroups: ['core', 'presentation', 'xlink'],
+    attrs: ['class', 'style', 'd', 'offset'],
+    defaults: {
+      offset: '0',
+    },
+    contentGroups: ['animation', 'descriptive'],
+  },
+  hkern: {
+    attrsGroups: ['core'],
+    attrs: ['u1', 'g1', 'u2', 'g2', 'k'],
+  },
+  image: {
+    attrsGroups: [
+      'core',
+      'conditionalProcessing',
+      'graphicalEvent',
+      'xlink',
+      'presentation',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'preserveAspectRatio',
+      'transform',
+      'x',
+      'y',
+      'width',
+      'height',
+      'href',
+      'xlink:href',
+    ],
+    defaults: {
+      x: '0',
+      y: '0',
+      preserveAspectRatio: 'xMidYMid meet',
+    },
+    contentGroups: ['animation', 'descriptive'],
+  },
+  line: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'graphicalEvent',
+      'presentation',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'transform',
+      'x1',
+      'y1',
+      'x2',
+      'y2',
+    ],
+    defaults: {
+      x1: '0',
+      y1: '0',
+      x2: '0',
+      y2: '0',
+    },
+    contentGroups: ['animation', 'descriptive'],
+  },
+  linearGradient: {
+    attrsGroups: ['core', 'presentation', 'xlink'],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'x1',
+      'y1',
+      'x2',
+      'y2',
+      'gradientUnits',
+      'gradientTransform',
+      'spreadMethod',
+      'href',
+      'xlink:href',
+    ],
+    defaults: {
+      x1: '0',
+      y1: '0',
+      x2: '100%',
+      y2: '0',
+      spreadMethod: 'pad',
+    },
+    contentGroups: ['descriptive'],
+    content: ['animate', 'animateTransform', 'set', 'stop'],
+  },
+  marker: {
+    attrsGroups: ['core', 'presentation'],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'viewBox',
+      'preserveAspectRatio',
+      'refX',
+      'refY',
+      'markerUnits',
+      'markerWidth',
+      'markerHeight',
+      'orient',
+    ],
+    defaults: {
+      markerUnits: 'strokeWidth',
+      refX: '0',
+      refY: '0',
+      markerWidth: '3',
+      markerHeight: '3',
+    },
+    contentGroups: [
+      'animation',
+      'descriptive',
+      'shape',
+      'structural',
+      'paintServer',
+    ],
+    content: [
+      'a',
+      'altGlyphDef',
+      'clipPath',
+      'color-profile',
+      'cursor',
+      'filter',
+      'font',
+      'font-face',
+      'foreignObject',
+      'image',
+      'marker',
+      'mask',
+      'pattern',
+      'script',
+      'style',
+      'switch',
+      'text',
+      'view',
+    ],
+  },
+  mask: {
+    attrsGroups: ['conditionalProcessing', 'core', 'presentation'],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'x',
+      'y',
+      'width',
+      'height',
+      'mask-type',
+      'maskUnits',
+      'maskContentUnits',
+    ],
+    defaults: {
+      maskUnits: 'objectBoundingBox',
+      maskContentUnits: 'userSpaceOnUse',
+      x: '-10%',
+      y: '-10%',
+      width: '120%',
+      height: '120%',
+    },
+    contentGroups: [
+      'animation',
+      'descriptive',
+      'shape',
+      'structural',
+      'paintServer',
+    ],
+    content: [
+      'a',
+      'altGlyphDef',
+      'clipPath',
+      'color-profile',
+      'cursor',
+      'filter',
+      'font',
+      'font-face',
+      'foreignObject',
+      'image',
+      'marker',
+      'mask',
+      'pattern',
+      'script',
+      'style',
+      'switch',
+      'text',
+      'view',
+    ],
+  },
+  metadata: {
+    attrsGroups: ['core'],
+  },
+  'missing-glyph': {
+    attrsGroups: ['core', 'presentation'],
+    attrs: [
+      'class',
+      'style',
+      'd',
+      'horiz-adv-x',
+      'vert-origin-x',
+      'vert-origin-y',
+      'vert-adv-y',
+    ],
+    contentGroups: [
+      'animation',
+      'descriptive',
+      'shape',
+      'structural',
+      'paintServer',
+    ],
+    content: [
+      'a',
+      'altGlyphDef',
+      'clipPath',
+      'color-profile',
+      'cursor',
+      'filter',
+      'font',
+      'font-face',
+      'foreignObject',
+      'image',
+      'marker',
+      'mask',
+      'pattern',
+      'script',
+      'style',
+      'switch',
+      'text',
+      'view',
+    ],
+  },
+  mpath: {
+    attrsGroups: ['core', 'xlink'],
+    attrs: ['externalResourcesRequired', 'href', 'xlink:href'],
+    contentGroups: ['descriptive'],
+  },
+  path: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'graphicalEvent',
+      'presentation',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'transform',
+      'd',
+      'pathLength',
+    ],
+    contentGroups: ['animation', 'descriptive'],
+  },
+  pattern: {
+    attrsGroups: ['conditionalProcessing', 'core', 'presentation', 'xlink'],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'viewBox',
+      'preserveAspectRatio',
+      'x',
+      'y',
+      'width',
+      'height',
+      'patternUnits',
+      'patternContentUnits',
+      'patternTransform',
+      'href',
+      'xlink:href',
+    ],
+    defaults: {
+      patternUnits: 'objectBoundingBox',
+      patternContentUnits: 'userSpaceOnUse',
+      x: '0',
+      y: '0',
+      width: '0',
+      height: '0',
+      preserveAspectRatio: 'xMidYMid meet',
+    },
+    contentGroups: [
+      'animation',
+      'descriptive',
+      'paintServer',
+      'shape',
+      'structural',
+    ],
+    content: [
+      'a',
+      'altGlyphDef',
+      'clipPath',
+      'color-profile',
+      'cursor',
+      'filter',
+      'font',
+      'font-face',
+      'foreignObject',
+      'image',
+      'marker',
+      'mask',
+      'pattern',
+      'script',
+      'style',
+      'switch',
+      'text',
+      'view',
+    ],
+  },
+  polygon: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'graphicalEvent',
+      'presentation',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'transform',
+      'points',
+    ],
+    contentGroups: ['animation', 'descriptive'],
+  },
+  polyline: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'graphicalEvent',
+      'presentation',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'transform',
+      'points',
+    ],
+    contentGroups: ['animation', 'descriptive'],
+  },
+  radialGradient: {
+    attrsGroups: ['core', 'presentation', 'xlink'],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'cx',
+      'cy',
+      'r',
+      'fx',
+      'fy',
+      'fr',
+      'gradientUnits',
+      'gradientTransform',
+      'spreadMethod',
+      'href',
+      'xlink:href',
+    ],
+    defaults: {
+      gradientUnits: 'objectBoundingBox',
+      cx: '50%',
+      cy: '50%',
+      r: '50%',
+    },
+    contentGroups: ['descriptive'],
+    content: ['animate', 'animateTransform', 'set', 'stop'],
+  },
+  meshGradient: {
+    attrsGroups: ['core', 'presentation', 'xlink'],
+    attrs: ['class', 'style', 'x', 'y', 'gradientUnits', 'transform'],
+    contentGroups: ['descriptive', 'paintServer', 'animation'],
+    content: ['meshRow'],
+  },
+  meshRow: {
+    attrsGroups: ['core', 'presentation'],
+    attrs: ['class', 'style'],
+    contentGroups: ['descriptive'],
+    content: ['meshPatch'],
+  },
+  meshPatch: {
+    attrsGroups: ['core', 'presentation'],
+    attrs: ['class', 'style'],
+    contentGroups: ['descriptive'],
+    content: ['stop'],
+  },
+  rect: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'graphicalEvent',
+      'presentation',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'transform',
+      'x',
+      'y',
+      'width',
+      'height',
+      'rx',
+      'ry',
+    ],
+    defaults: {
+      x: '0',
+      y: '0',
+    },
+    contentGroups: ['animation', 'descriptive'],
+  },
+  script: {
+    attrsGroups: ['core', 'xlink'],
+    attrs: ['externalResourcesRequired', 'type', 'href', 'xlink:href'],
+  },
+  set: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'animation',
+      'xlink',
+      'animationAttributeTarget',
+      'animationTiming',
+    ],
+    attrs: ['externalResourcesRequired', 'to'],
+    contentGroups: ['descriptive'],
+  },
+  solidColor: {
+    attrsGroups: ['core', 'presentation'],
+    attrs: ['class', 'style'],
+    contentGroups: ['paintServer'],
+  },
+  stop: {
+    attrsGroups: ['core', 'presentation'],
+    attrs: ['class', 'style', 'offset', 'path'],
+    content: ['animate', 'animateColor', 'set'],
+  },
+  style: {
+    attrsGroups: ['core'],
+    attrs: ['type', 'media', 'title'],
+    defaults: {
+      type: 'text/css',
+    },
+  },
+  svg: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'documentEvent',
+      'graphicalEvent',
+      'presentation',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'x',
+      'y',
+      'width',
+      'height',
+      'viewBox',
+      'preserveAspectRatio',
+      'zoomAndPan',
+      'version',
+      'baseProfile',
+      'contentScriptType',
+      'contentStyleType',
+    ],
+    defaults: {
+      x: '0',
+      y: '0',
+      width: '100%',
+      height: '100%',
+      preserveAspectRatio: 'xMidYMid meet',
+      zoomAndPan: 'magnify',
+      version: '1.1',
+      baseProfile: 'none',
+      contentScriptType: 'application/ecmascript',
+      contentStyleType: 'text/css',
+    },
+    contentGroups: [
+      'animation',
+      'descriptive',
+      'shape',
+      'structural',
+      'paintServer',
+    ],
+    content: [
+      'a',
+      'altGlyphDef',
+      'clipPath',
+      'color-profile',
+      'cursor',
+      'filter',
+      'font',
+      'font-face',
+      'foreignObject',
+      'image',
+      'marker',
+      'mask',
+      'pattern',
+      'script',
+      'style',
+      'switch',
+      'text',
+      'view',
+    ],
+  },
+  switch: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'graphicalEvent',
+      'presentation',
+    ],
+    attrs: ['class', 'style', 'externalResourcesRequired', 'transform'],
+    contentGroups: ['animation', 'descriptive', 'shape'],
+    content: [
+      'a',
+      'foreignObject',
+      'g',
+      'image',
+      'svg',
+      'switch',
+      'text',
+      'use',
+    ],
+  },
+  symbol: {
+    attrsGroups: ['core', 'graphicalEvent', 'presentation'],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'preserveAspectRatio',
+      'viewBox',
+      'refX',
+      'refY',
+    ],
+    defaults: {
+      refX: 0,
+      refY: 0,
+    },
+    contentGroups: [
+      'animation',
+      'descriptive',
+      'shape',
+      'structural',
+      'paintServer',
+    ],
+    content: [
+      'a',
+      'altGlyphDef',
+      'clipPath',
+      'color-profile',
+      'cursor',
+      'filter',
+      'font',
+      'font-face',
+      'foreignObject',
+      'image',
+      'marker',
+      'mask',
+      'pattern',
+      'script',
+      'style',
+      'switch',
+      'text',
+      'view',
+    ],
+  },
+  text: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'graphicalEvent',
+      'presentation',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'transform',
+      'lengthAdjust',
+      'x',
+      'y',
+      'dx',
+      'dy',
+      'rotate',
+      'textLength',
+    ],
+    defaults: {
+      x: '0',
+      y: '0',
+      lengthAdjust: 'spacing',
+    },
+    contentGroups: ['animation', 'descriptive', 'textContentChild'],
+    content: ['a'],
+  },
+  textPath: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'graphicalEvent',
+      'presentation',
+      'xlink',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'href',
+      'xlink:href',
+      'startOffset',
+      'method',
+      'spacing',
+      'd',
+    ],
+    defaults: {
+      startOffset: '0',
+      method: 'align',
+      spacing: 'exact',
+    },
+    contentGroups: ['descriptive'],
+    content: [
+      'a',
+      'altGlyph',
+      'animate',
+      'animateColor',
+      'set',
+      'tref',
+      'tspan',
+    ],
+  },
+  title: {
+    attrsGroups: ['core'],
+    attrs: ['class', 'style'],
+  },
+  tref: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'graphicalEvent',
+      'presentation',
+      'xlink',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'href',
+      'xlink:href',
+    ],
+    contentGroups: ['descriptive'],
+    content: ['animate', 'animateColor', 'set'],
+  },
+  tspan: {
+    attrsGroups: [
+      'conditionalProcessing',
+      'core',
+      'graphicalEvent',
+      'presentation',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'x',
+      'y',
+      'dx',
+      'dy',
+      'rotate',
+      'textLength',
+      'lengthAdjust',
+    ],
+    contentGroups: ['descriptive'],
+    content: [
+      'a',
+      'altGlyph',
+      'animate',
+      'animateColor',
+      'set',
+      'tref',
+      'tspan',
+    ],
+  },
+  use: {
+    attrsGroups: [
+      'core',
+      'conditionalProcessing',
+      'graphicalEvent',
+      'presentation',
+      'xlink',
+    ],
+    attrs: [
+      'class',
+      'style',
+      'externalResourcesRequired',
+      'transform',
+      'x',
+      'y',
+      'width',
+      'height',
+      'href',
+      'xlink:href',
+    ],
+    defaults: {
+      x: '0',
+      y: '0',
+    },
+    contentGroups: ['animation', 'descriptive'],
+  },
+  view: {
+    attrsGroups: ['core'],
+    attrs: [
+      'externalResourcesRequired',
+      'viewBox',
+      'preserveAspectRatio',
+      'zoomAndPan',
+      'viewTarget',
+    ],
+    contentGroups: ['descriptive'],
+  },
+  vkern: {
+    attrsGroups: ['core'],
+    attrs: ['u1', 'g1', 'u2', 'g2', 'k'],
+  },
+};
+
+// https://wiki.inkscape.org/wiki/index.php/Inkscape-specific_XML_attributes
+exports.editorNamespaces = [
+  'http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd',
+  'http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd',
+  'http://www.inkscape.org/namespaces/inkscape',
+  'http://www.bohemiancoding.com/sketch/ns',
+  'http://ns.adobe.com/AdobeIllustrator/10.0/',
+  'http://ns.adobe.com/Graphs/1.0/',
+  'http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/',
+  'http://ns.adobe.com/Variables/1.0/',
+  'http://ns.adobe.com/SaveForWeb/1.0/',
+  'http://ns.adobe.com/Extensibility/1.0/',
+  'http://ns.adobe.com/Flows/1.0/',
+  'http://ns.adobe.com/ImageReplacement/1.0/',
+  'http://ns.adobe.com/GenericCustomNamespace/1.0/',
+  'http://ns.adobe.com/XPath/1.0/',
+  'http://schemas.microsoft.com/visio/2003/SVGExtensions/',
+  'http://taptrix.com/vectorillustrator/svg_extensions',
+  'http://www.figma.com/figma/ns',
+  'http://purl.org/dc/elements/1.1/',
+  'http://creativecommons.org/ns#',
+  'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
+  'http://www.serif.com/',
+  'http://www.vector.evaxdesign.sk',
+];
+
+// https://www.w3.org/TR/SVG11/linking.html#processingIRI
+exports.referencesProps = [
+  'clip-path',
+  'color-profile',
+  'fill',
+  'filter',
+  'marker-start',
+  'marker-mid',
+  'marker-end',
+  'mask',
+  'stroke',
+  'style',
+];
+
+// https://www.w3.org/TR/SVG11/propidx.html
+exports.inheritableAttrs = [
+  'clip-rule',
+  'color',
+  'color-interpolation',
+  'color-interpolation-filters',
+  'color-profile',
+  'color-rendering',
+  'cursor',
+  'direction',
+  'dominant-baseline',
+  'fill',
+  'fill-opacity',
+  'fill-rule',
+  'font',
+  'font-family',
+  'font-size',
+  'font-size-adjust',
+  'font-stretch',
+  'font-style',
+  'font-variant',
+  'font-weight',
+  'glyph-orientation-horizontal',
+  'glyph-orientation-vertical',
+  'image-rendering',
+  'letter-spacing',
+  'marker',
+  'marker-end',
+  'marker-mid',
+  'marker-start',
+  'paint-order',
+  'pointer-events',
+  'shape-rendering',
+  'stroke',
+  'stroke-dasharray',
+  'stroke-dashoffset',
+  'stroke-linecap',
+  'stroke-linejoin',
+  'stroke-miterlimit',
+  'stroke-opacity',
+  'stroke-width',
+  'text-anchor',
+  'text-rendering',
+  'transform',
+  'visibility',
+  'word-spacing',
+  'writing-mode',
+];
+
+exports.presentationNonInheritableGroupAttrs = [
+  'display',
+  'clip-path',
+  'filter',
+  'mask',
+  'opacity',
+  'text-decoration',
+  'transform',
+  'unicode-bidi',
+  'visibility',
+];
+
+// https://www.w3.org/TR/SVG11/single-page.html#types-ColorKeywords
+exports.colorsNames = {
+  aliceblue: '#f0f8ff',
+  antiquewhite: '#faebd7',
+  aqua: '#0ff',
+  aquamarine: '#7fffd4',
+  azure: '#f0ffff',
+  beige: '#f5f5dc',
+  bisque: '#ffe4c4',
+  black: '#000',
+  blanchedalmond: '#ffebcd',
+  blue: '#00f',
+  blueviolet: '#8a2be2',
+  brown: '#a52a2a',
+  burlywood: '#deb887',
+  cadetblue: '#5f9ea0',
+  chartreuse: '#7fff00',
+  chocolate: '#d2691e',
+  coral: '#ff7f50',
+  cornflowerblue: '#6495ed',
+  cornsilk: '#fff8dc',
+  crimson: '#dc143c',
+  cyan: '#0ff',
+  darkblue: '#00008b',
+  darkcyan: '#008b8b',
+  darkgoldenrod: '#b8860b',
+  darkgray: '#a9a9a9',
+  darkgreen: '#006400',
+  darkgrey: '#a9a9a9',
+  darkkhaki: '#bdb76b',
+  darkmagenta: '#8b008b',
+  darkolivegreen: '#556b2f',
+  darkorange: '#ff8c00',
+  darkorchid: '#9932cc',
+  darkred: '#8b0000',
+  darksalmon: '#e9967a',
+  darkseagreen: '#8fbc8f',
+  darkslateblue: '#483d8b',
+  darkslategray: '#2f4f4f',
+  darkslategrey: '#2f4f4f',
+  darkturquoise: '#00ced1',
+  darkviolet: '#9400d3',
+  deeppink: '#ff1493',
+  deepskyblue: '#00bfff',
+  dimgray: '#696969',
+  dimgrey: '#696969',
+  dodgerblue: '#1e90ff',
+  firebrick: '#b22222',
+  floralwhite: '#fffaf0',
+  forestgreen: '#228b22',
+  fuchsia: '#f0f',
+  gainsboro: '#dcdcdc',
+  ghostwhite: '#f8f8ff',
+  gold: '#ffd700',
+  goldenrod: '#daa520',
+  gray: '#808080',
+  green: '#008000',
+  greenyellow: '#adff2f',
+  grey: '#808080',
+  honeydew: '#f0fff0',
+  hotpink: '#ff69b4',
+  indianred: '#cd5c5c',
+  indigo: '#4b0082',
+  ivory: '#fffff0',
+  khaki: '#f0e68c',
+  lavender: '#e6e6fa',
+  lavenderblush: '#fff0f5',
+  lawngreen: '#7cfc00',
+  lemonchiffon: '#fffacd',
+  lightblue: '#add8e6',
+  lightcoral: '#f08080',
+  lightcyan: '#e0ffff',
+  lightgoldenrodyellow: '#fafad2',
+  lightgray: '#d3d3d3',
+  lightgreen: '#90ee90',
+  lightgrey: '#d3d3d3',
+  lightpink: '#ffb6c1',
+  lightsalmon: '#ffa07a',
+  lightseagreen: '#20b2aa',
+  lightskyblue: '#87cefa',
+  lightslategray: '#789',
+  lightslategrey: '#789',
+  lightsteelblue: '#b0c4de',
+  lightyellow: '#ffffe0',
+  lime: '#0f0',
+  limegreen: '#32cd32',
+  linen: '#faf0e6',
+  magenta: '#f0f',
+  maroon: '#800000',
+  mediumaquamarine: '#66cdaa',
+  mediumblue: '#0000cd',
+  mediumorchid: '#ba55d3',
+  mediumpurple: '#9370db',
+  mediumseagreen: '#3cb371',
+  mediumslateblue: '#7b68ee',
+  mediumspringgreen: '#00fa9a',
+  mediumturquoise: '#48d1cc',
+  mediumvioletred: '#c71585',
+  midnightblue: '#191970',
+  mintcream: '#f5fffa',
+  mistyrose: '#ffe4e1',
+  moccasin: '#ffe4b5',
+  navajowhite: '#ffdead',
+  navy: '#000080',
+  oldlace: '#fdf5e6',
+  olive: '#808000',
+  olivedrab: '#6b8e23',
+  orange: '#ffa500',
+  orangered: '#ff4500',
+  orchid: '#da70d6',
+  palegoldenrod: '#eee8aa',
+  palegreen: '#98fb98',
+  paleturquoise: '#afeeee',
+  palevioletred: '#db7093',
+  papayawhip: '#ffefd5',
+  peachpuff: '#ffdab9',
+  peru: '#cd853f',
+  pink: '#ffc0cb',
+  plum: '#dda0dd',
+  powderblue: '#b0e0e6',
+  purple: '#800080',
+  rebeccapurple: '#639',
+  red: '#f00',
+  rosybrown: '#bc8f8f',
+  royalblue: '#4169e1',
+  saddlebrown: '#8b4513',
+  salmon: '#fa8072',
+  sandybrown: '#f4a460',
+  seagreen: '#2e8b57',
+  seashell: '#fff5ee',
+  sienna: '#a0522d',
+  silver: '#c0c0c0',
+  skyblue: '#87ceeb',
+  slateblue: '#6a5acd',
+  slategray: '#708090',
+  slategrey: '#708090',
+  snow: '#fffafa',
+  springgreen: '#00ff7f',
+  steelblue: '#4682b4',
+  tan: '#d2b48c',
+  teal: '#008080',
+  thistle: '#d8bfd8',
+  tomato: '#ff6347',
+  turquoise: '#40e0d0',
+  violet: '#ee82ee',
+  wheat: '#f5deb3',
+  white: '#fff',
+  whitesmoke: '#f5f5f5',
+  yellow: '#ff0',
+  yellowgreen: '#9acd32',
+};
+
+exports.colorsShortNames = {
+  '#f0ffff': 'azure',
+  '#f5f5dc': 'beige',
+  '#ffe4c4': 'bisque',
+  '#a52a2a': 'brown',
+  '#ff7f50': 'coral',
+  '#ffd700': 'gold',
+  '#808080': 'gray',
+  '#008000': 'green',
+  '#4b0082': 'indigo',
+  '#fffff0': 'ivory',
+  '#f0e68c': 'khaki',
+  '#faf0e6': 'linen',
+  '#800000': 'maroon',
+  '#000080': 'navy',
+  '#808000': 'olive',
+  '#ffa500': 'orange',
+  '#da70d6': 'orchid',
+  '#cd853f': 'peru',
+  '#ffc0cb': 'pink',
+  '#dda0dd': 'plum',
+  '#800080': 'purple',
+  '#f00': 'red',
+  '#ff0000': 'red',
+  '#fa8072': 'salmon',
+  '#a0522d': 'sienna',
+  '#c0c0c0': 'silver',
+  '#fffafa': 'snow',
+  '#d2b48c': 'tan',
+  '#008080': 'teal',
+  '#ff6347': 'tomato',
+  '#ee82ee': 'violet',
+  '#f5deb3': 'wheat',
+};
+
+// https://www.w3.org/TR/SVG11/single-page.html#types-DataTypeColor
+exports.colorsProps = [
+  'color',
+  'fill',
+  'stroke',
+  'stop-color',
+  'flood-color',
+  'lighting-color',
+];
diff --git a/node_modules/svgo/plugins/_path.js b/node_modules/svgo/plugins/_path.js
new file mode 100644
index 0000000..a431607
--- /dev/null
+++ b/node_modules/svgo/plugins/_path.js
@@ -0,0 +1,810 @@
+'use strict';
+
+const { parsePathData, stringifyPathData } = require('../lib/path.js');
+
+var prevCtrlPoint;
+
+/**
+ * Convert path string to JS representation.
+ *
+ * @param {String} pathString input string
+ * @param {Object} params plugin params
+ * @return {Array} output array
+ */
+exports.path2js = function (path) {
+  if (path.pathJS) return path.pathJS;
+  const pathData = []; // JS representation of the path data
+  const newPathData = parsePathData(path.attributes.d);
+  for (const { command, args } of newPathData) {
+    if (command === 'Z' || command === 'z') {
+      pathData.push({ instruction: 'z' });
+    } else {
+      pathData.push({ instruction: command, data: args });
+    }
+  }
+  // First moveto is actually absolute. Subsequent coordinates were separated above.
+  if (pathData.length && pathData[0].instruction == 'm') {
+    pathData[0].instruction = 'M';
+  }
+  path.pathJS = pathData;
+  return pathData;
+};
+
+/**
+ * Convert relative Path data to absolute.
+ *
+ * @param {Array} data input data
+ * @return {Array} output data
+ */
+var relative2absolute = (exports.relative2absolute = function (data) {
+  var currentPoint = [0, 0],
+    subpathPoint = [0, 0],
+    i;
+
+  return data.map(function (item) {
+    var instruction = item.instruction,
+      itemData = item.data && item.data.slice();
+
+    if (instruction == 'M') {
+      set(currentPoint, itemData);
+      set(subpathPoint, itemData);
+    } else if ('mlcsqt'.indexOf(instruction) > -1) {
+      for (i = 0; i < itemData.length; i++) {
+        itemData[i] += currentPoint[i % 2];
+      }
+      set(currentPoint, itemData);
+
+      if (instruction == 'm') {
+        set(subpathPoint, itemData);
+      }
+    } else if (instruction == 'a') {
+      itemData[5] += currentPoint[0];
+      itemData[6] += currentPoint[1];
+      set(currentPoint, itemData);
+    } else if (instruction == 'h') {
+      itemData[0] += currentPoint[0];
+      currentPoint[0] = itemData[0];
+    } else if (instruction == 'v') {
+      itemData[0] += currentPoint[1];
+      currentPoint[1] = itemData[0];
+    } else if ('MZLCSQTA'.indexOf(instruction) > -1) {
+      set(currentPoint, itemData);
+    } else if (instruction == 'H') {
+      currentPoint[0] = itemData[0];
+    } else if (instruction == 'V') {
+      currentPoint[1] = itemData[0];
+    } else if (instruction == 'z') {
+      set(currentPoint, subpathPoint);
+    }
+
+    return instruction == 'z'
+      ? { instruction: 'z' }
+      : {
+          instruction: instruction.toUpperCase(),
+          data: itemData,
+        };
+  });
+});
+
+/**
+ * Compute Cubic Bézie bounding box.
+ *
+ * @see https://pomax.github.io/bezierinfo/
+ *
+ * @param {Float} xa
+ * @param {Float} ya
+ * @param {Float} xb
+ * @param {Float} yb
+ * @param {Float} xc
+ * @param {Float} yc
+ * @param {Float} xd
+ * @param {Float} yd
+ *
+ * @return {Object}
+ */
+exports.computeCubicBoundingBox = function (xa, ya, xb, yb, xc, yc, xd, yd) {
+  var minx = Number.POSITIVE_INFINITY,
+    miny = Number.POSITIVE_INFINITY,
+    maxx = Number.NEGATIVE_INFINITY,
+    maxy = Number.NEGATIVE_INFINITY,
+    ts,
+    t,
+    x,
+    y,
+    i;
+
+  // X
+  if (xa < minx) {
+    minx = xa;
+  }
+  if (xa > maxx) {
+    maxx = xa;
+  }
+  if (xd < minx) {
+    minx = xd;
+  }
+  if (xd > maxx) {
+    maxx = xd;
+  }
+
+  ts = computeCubicFirstDerivativeRoots(xa, xb, xc, xd);
+
+  for (i = 0; i < ts.length; i++) {
+    t = ts[i];
+
+    if (t >= 0 && t <= 1) {
+      x = computeCubicBaseValue(t, xa, xb, xc, xd);
+      // y = computeCubicBaseValue(t, ya, yb, yc, yd);
+
+      if (x < minx) {
+        minx = x;
+      }
+      if (x > maxx) {
+        maxx = x;
+      }
+    }
+  }
+
+  // Y
+  if (ya < miny) {
+    miny = ya;
+  }
+  if (ya > maxy) {
+    maxy = ya;
+  }
+  if (yd < miny) {
+    miny = yd;
+  }
+  if (yd > maxy) {
+    maxy = yd;
+  }
+
+  ts = computeCubicFirstDerivativeRoots(ya, yb, yc, yd);
+
+  for (i = 0; i < ts.length; i++) {
+    t = ts[i];
+
+    if (t >= 0 && t <= 1) {
+      // x = computeCubicBaseValue(t, xa, xb, xc, xd);
+      y = computeCubicBaseValue(t, ya, yb, yc, yd);
+
+      if (y < miny) {
+        miny = y;
+      }
+      if (y > maxy) {
+        maxy = y;
+      }
+    }
+  }
+
+  return {
+    minx: minx,
+    miny: miny,
+    maxx: maxx,
+    maxy: maxy,
+  };
+};
+
+// compute the value for the cubic bezier function at time=t
+function computeCubicBaseValue(t, a, b, c, d) {
+  var mt = 1 - t;
+
+  return (
+    mt * mt * mt * a + 3 * mt * mt * t * b + 3 * mt * t * t * c + t * t * t * d
+  );
+}
+
+// compute the value for the first derivative of the cubic bezier function at time=t
+function computeCubicFirstDerivativeRoots(a, b, c, d) {
+  var result = [-1, -1],
+    tl = -a + 2 * b - c,
+    tr = -Math.sqrt(-a * (c - d) + b * b - b * (c + d) + c * c),
+    dn = -a + 3 * b - 3 * c + d;
+
+  if (dn !== 0) {
+    result[0] = (tl + tr) / dn;
+    result[1] = (tl - tr) / dn;
+  }
+
+  return result;
+}
+
+/**
+ * Compute Quadratic Bézier bounding box.
+ *
+ * @see https://pomax.github.io/bezierinfo/
+ *
+ * @param {Float} xa
+ * @param {Float} ya
+ * @param {Float} xb
+ * @param {Float} yb
+ * @param {Float} xc
+ * @param {Float} yc
+ *
+ * @return {Object}
+ */
+exports.computeQuadraticBoundingBox = function (xa, ya, xb, yb, xc, yc) {
+  var minx = Number.POSITIVE_INFINITY,
+    miny = Number.POSITIVE_INFINITY,
+    maxx = Number.NEGATIVE_INFINITY,
+    maxy = Number.NEGATIVE_INFINITY,
+    t,
+    x,
+    y;
+
+  // X
+  if (xa < minx) {
+    minx = xa;
+  }
+  if (xa > maxx) {
+    maxx = xa;
+  }
+  if (xc < minx) {
+    minx = xc;
+  }
+  if (xc > maxx) {
+    maxx = xc;
+  }
+
+  t = computeQuadraticFirstDerivativeRoot(xa, xb, xc);
+
+  if (t >= 0 && t <= 1) {
+    x = computeQuadraticBaseValue(t, xa, xb, xc);
+    // y = computeQuadraticBaseValue(t, ya, yb, yc);
+
+    if (x < minx) {
+      minx = x;
+    }
+    if (x > maxx) {
+      maxx = x;
+    }
+  }
+
+  // Y
+  if (ya < miny) {
+    miny = ya;
+  }
+  if (ya > maxy) {
+    maxy = ya;
+  }
+  if (yc < miny) {
+    miny = yc;
+  }
+  if (yc > maxy) {
+    maxy = yc;
+  }
+
+  t = computeQuadraticFirstDerivativeRoot(ya, yb, yc);
+
+  if (t >= 0 && t <= 1) {
+    // x = computeQuadraticBaseValue(t, xa, xb, xc);
+    y = computeQuadraticBaseValue(t, ya, yb, yc);
+
+    if (y < miny) {
+      miny = y;
+    }
+    if (y > maxy) {
+      maxy = y;
+    }
+  }
+
+  return {
+    minx: minx,
+    miny: miny,
+    maxx: maxx,
+    maxy: maxy,
+  };
+};
+
+// compute the value for the quadratic bezier function at time=t
+function computeQuadraticBaseValue(t, a, b, c) {
+  var mt = 1 - t;
+
+  return mt * mt * a + 2 * mt * t * b + t * t * c;
+}
+
+// compute the value for the first derivative of the quadratic bezier function at time=t
+function computeQuadraticFirstDerivativeRoot(a, b, c) {
+  var t = -1,
+    denominator = a - 2 * b + c;
+
+  if (denominator !== 0) {
+    t = (a - b) / denominator;
+  }
+
+  return t;
+}
+
+/**
+ * Convert path array to string.
+ *
+ * @param {Array} path input path data
+ * @param {Object} params plugin params
+ * @return {String} output path string
+ */
+exports.js2path = function (path, data, params) {
+  path.pathJS = data;
+
+  const pathData = [];
+  for (const item of data) {
+    // remove moveto commands which are followed by moveto commands
+    if (
+      pathData.length !== 0 &&
+      (item.instruction === 'M' || item.instruction === 'm')
+    ) {
+      const last = pathData[pathData.length - 1];
+      if (last.command === 'M' || last.command === 'm') {
+        pathData.pop();
+      }
+    }
+    pathData.push({
+      command: item.instruction,
+      args: item.data || [],
+    });
+  }
+
+  path.attributes.d = stringifyPathData({
+    pathData,
+    precision: params.floatPrecision,
+    disableSpaceAfterFlags: params.noSpaceAfterFlags,
+  });
+};
+
+function set(dest, source) {
+  dest[0] = source[source.length - 2];
+  dest[1] = source[source.length - 1];
+  return dest;
+}
+
+/**
+ * Checks if two paths have an intersection by checking convex hulls
+ * collision using Gilbert-Johnson-Keerthi distance algorithm
+ * https://web.archive.org/web/20180822200027/http://entropyinteractive.com/2011/04/gjk-algorithm/
+ *
+ * @param {Array} path1 JS path representation
+ * @param {Array} path2 JS path representation
+ * @return {Boolean}
+ */
+exports.intersects = function (path1, path2) {
+  // Collect points of every subpath.
+  var points1 = relative2absolute(path1).reduce(gatherPoints, []),
+    points2 = relative2absolute(path2).reduce(gatherPoints, []);
+
+  // Axis-aligned bounding box check.
+  if (
+    points1.maxX <= points2.minX ||
+    points2.maxX <= points1.minX ||
+    points1.maxY <= points2.minY ||
+    points2.maxY <= points1.minY ||
+    points1.every(function (set1) {
+      return points2.every(function (set2) {
+        return (
+          set1[set1.maxX][0] <= set2[set2.minX][0] ||
+          set2[set2.maxX][0] <= set1[set1.minX][0] ||
+          set1[set1.maxY][1] <= set2[set2.minY][1] ||
+          set2[set2.maxY][1] <= set1[set1.minY][1]
+        );
+      });
+    })
+  )
+    return false;
+
+  // Get a convex hull from points of each subpath. Has the most complexity O(n·log n).
+  var hullNest1 = points1.map(convexHull),
+    hullNest2 = points2.map(convexHull);
+
+  // Check intersection of every subpath of the first path with every subpath of the second.
+  return hullNest1.some(function (hull1) {
+    if (hull1.length < 3) return false;
+
+    return hullNest2.some(function (hull2) {
+      if (hull2.length < 3) return false;
+
+      var simplex = [getSupport(hull1, hull2, [1, 0])], // create the initial simplex
+        direction = minus(simplex[0]); // set the direction to point towards the origin
+
+      var iterations = 1e4; // infinite loop protection, 10 000 iterations is more than enough
+      // eslint-disable-next-line no-constant-condition
+      while (true) {
+        // eslint-disable-next-line no-constant-condition
+        if (iterations-- == 0) {
+          console.error(
+            'Error: infinite loop while processing mergePaths plugin.'
+          );
+          return true; // true is the safe value that means “do nothing with paths”
+        }
+        // add a new point
+        simplex.push(getSupport(hull1, hull2, direction));
+        // see if the new point was on the correct side of the origin
+        if (dot(direction, simplex[simplex.length - 1]) <= 0) return false;
+        // process the simplex
+        if (processSimplex(simplex, direction)) return true;
+      }
+    });
+  });
+
+  function getSupport(a, b, direction) {
+    return sub(supportPoint(a, direction), supportPoint(b, minus(direction)));
+  }
+
+  // Computes farthest polygon point in particular direction.
+  // Thanks to knowledge of min/max x and y coordinates we can choose a quadrant to search in.
+  // Since we're working on convex hull, the dot product is increasing until we find the farthest point.
+  function supportPoint(polygon, direction) {
+    var index =
+        direction[1] >= 0
+          ? direction[0] < 0
+            ? polygon.maxY
+            : polygon.maxX
+          : direction[0] < 0
+          ? polygon.minX
+          : polygon.minY,
+      max = -Infinity,
+      value;
+    while ((value = dot(polygon[index], direction)) > max) {
+      max = value;
+      index = ++index % polygon.length;
+    }
+    return polygon[(index || polygon.length) - 1];
+  }
+};
+
+function processSimplex(simplex, direction) {
+  // we only need to handle to 1-simplex and 2-simplex
+  if (simplex.length == 2) {
+    // 1-simplex
+    let a = simplex[1],
+      b = simplex[0],
+      AO = minus(simplex[1]),
+      AB = sub(b, a);
+    // AO is in the same direction as AB
+    if (dot(AO, AB) > 0) {
+      // get the vector perpendicular to AB facing O
+      set(direction, orth(AB, a));
+    } else {
+      set(direction, AO);
+      // only A remains in the simplex
+      simplex.shift();
+    }
+  } else {
+    // 2-simplex
+    let a = simplex[2], // [a, b, c] = simplex
+      b = simplex[1],
+      c = simplex[0],
+      AB = sub(b, a),
+      AC = sub(c, a),
+      AO = minus(a),
+      ACB = orth(AB, AC), // the vector perpendicular to AB facing away from C
+      ABC = orth(AC, AB); // the vector perpendicular to AC facing away from B
+
+    if (dot(ACB, AO) > 0) {
+      if (dot(AB, AO) > 0) {
+        // region 4
+        set(direction, ACB);
+        simplex.shift(); // simplex = [b, a]
+      } else {
+        // region 5
+        set(direction, AO);
+        simplex.splice(0, 2); // simplex = [a]
+      }
+    } else if (dot(ABC, AO) > 0) {
+      if (dot(AC, AO) > 0) {
+        // region 6
+        set(direction, ABC);
+        simplex.splice(1, 1); // simplex = [c, a]
+      } else {
+        // region 5 (again)
+        set(direction, AO);
+        simplex.splice(0, 2); // simplex = [a]
+      }
+    } // region 7
+    else return true;
+  }
+  return false;
+}
+
+function minus(v) {
+  return [-v[0], -v[1]];
+}
+
+function sub(v1, v2) {
+  return [v1[0] - v2[0], v1[1] - v2[1]];
+}
+
+function dot(v1, v2) {
+  return v1[0] * v2[0] + v1[1] * v2[1];
+}
+
+function orth(v, from) {
+  var o = [-v[1], v[0]];
+  return dot(o, minus(from)) < 0 ? minus(o) : o;
+}
+
+function gatherPoints(points, item, index, path) {
+  var subPath = points.length && points[points.length - 1],
+    prev = index && path[index - 1],
+    basePoint = subPath.length && subPath[subPath.length - 1],
+    data = item.data,
+    ctrlPoint = basePoint;
+
+  switch (item.instruction) {
+    case 'M':
+      points.push((subPath = []));
+      break;
+    case 'H':
+      addPoint(subPath, [data[0], basePoint[1]]);
+      break;
+    case 'V':
+      addPoint(subPath, [basePoint[0], data[0]]);
+      break;
+    case 'Q':
+      addPoint(subPath, data.slice(0, 2));
+      prevCtrlPoint = [data[2] - data[0], data[3] - data[1]]; // Save control point for shorthand
+      break;
+    case 'T':
+      if (prev.instruction == 'Q' || prev.instruction == 'T') {
+        ctrlPoint = [
+          basePoint[0] + prevCtrlPoint[0],
+          basePoint[1] + prevCtrlPoint[1],
+        ];
+        addPoint(subPath, ctrlPoint);
+        prevCtrlPoint = [data[0] - ctrlPoint[0], data[1] - ctrlPoint[1]];
+      }
+      break;
+    case 'C':
+      // Approximate quibic Bezier curve with middle points between control points
+      addPoint(subPath, [
+        0.5 * (basePoint[0] + data[0]),
+        0.5 * (basePoint[1] + data[1]),
+      ]);
+      addPoint(subPath, [0.5 * (data[0] + data[2]), 0.5 * (data[1] + data[3])]);
+      addPoint(subPath, [0.5 * (data[2] + data[4]), 0.5 * (data[3] + data[5])]);
+      prevCtrlPoint = [data[4] - data[2], data[5] - data[3]]; // Save control point for shorthand
+      break;
+    case 'S':
+      if (prev.instruction == 'C' || prev.instruction == 'S') {
+        addPoint(subPath, [
+          basePoint[0] + 0.5 * prevCtrlPoint[0],
+          basePoint[1] + 0.5 * prevCtrlPoint[1],
+        ]);
+        ctrlPoint = [
+          basePoint[0] + prevCtrlPoint[0],
+          basePoint[1] + prevCtrlPoint[1],
+        ];
+      }
+      addPoint(subPath, [
+        0.5 * (ctrlPoint[0] + data[0]),
+        0.5 * (ctrlPoint[1] + data[1]),
+      ]);
+      addPoint(subPath, [0.5 * (data[0] + data[2]), 0.5 * (data[1] + data[3])]);
+      prevCtrlPoint = [data[2] - data[0], data[3] - data[1]];
+      break;
+    case 'A':
+      // Convert the arc to bezier curves and use the same approximation
+      var curves = a2c.apply(0, basePoint.concat(data));
+      for (var cData; (cData = curves.splice(0, 6).map(toAbsolute)).length; ) {
+        addPoint(subPath, [
+          0.5 * (basePoint[0] + cData[0]),
+          0.5 * (basePoint[1] + cData[1]),
+        ]);
+        addPoint(subPath, [
+          0.5 * (cData[0] + cData[2]),
+          0.5 * (cData[1] + cData[3]),
+        ]);
+        addPoint(subPath, [
+          0.5 * (cData[2] + cData[4]),
+          0.5 * (cData[3] + cData[5]),
+        ]);
+        if (curves.length) addPoint(subPath, (basePoint = cData.slice(-2)));
+      }
+      break;
+  }
+  // Save final command coordinates
+  if (data && data.length >= 2) addPoint(subPath, data.slice(-2));
+  return points;
+
+  function toAbsolute(n, i) {
+    return n + basePoint[i % 2];
+  }
+
+  // Writes data about the extreme points on each axle
+  function addPoint(path, point) {
+    if (!path.length || point[1] > path[path.maxY][1]) {
+      path.maxY = path.length;
+      points.maxY = points.length ? Math.max(point[1], points.maxY) : point[1];
+    }
+    if (!path.length || point[0] > path[path.maxX][0]) {
+      path.maxX = path.length;
+      points.maxX = points.length ? Math.max(point[0], points.maxX) : point[0];
+    }
+    if (!path.length || point[1] < path[path.minY][1]) {
+      path.minY = path.length;
+      points.minY = points.length ? Math.min(point[1], points.minY) : point[1];
+    }
+    if (!path.length || point[0] < path[path.minX][0]) {
+      path.minX = path.length;
+      points.minX = points.length ? Math.min(point[0], points.minX) : point[0];
+    }
+    path.push(point);
+  }
+}
+
+/**
+ * Forms a convex hull from set of points of every subpath using monotone chain convex hull algorithm.
+ * https://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain
+ *
+ * @param points An array of [X, Y] coordinates
+ */
+function convexHull(points) {
+  points.sort(function (a, b) {
+    return a[0] == b[0] ? a[1] - b[1] : a[0] - b[0];
+  });
+
+  var lower = [],
+    minY = 0,
+    bottom = 0;
+  for (let i = 0; i < points.length; i++) {
+    while (
+      lower.length >= 2 &&
+      cross(lower[lower.length - 2], lower[lower.length - 1], points[i]) <= 0
+    ) {
+      lower.pop();
+    }
+    if (points[i][1] < points[minY][1]) {
+      minY = i;
+      bottom = lower.length;
+    }
+    lower.push(points[i]);
+  }
+
+  var upper = [],
+    maxY = points.length - 1,
+    top = 0;
+  for (let i = points.length; i--; ) {
+    while (
+      upper.length >= 2 &&
+      cross(upper[upper.length - 2], upper[upper.length - 1], points[i]) <= 0
+    ) {
+      upper.pop();
+    }
+    if (points[i][1] > points[maxY][1]) {
+      maxY = i;
+      top = upper.length;
+    }
+    upper.push(points[i]);
+  }
+
+  // last points are equal to starting points of the other part
+  upper.pop();
+  lower.pop();
+
+  var hull = lower.concat(upper);
+
+  hull.minX = 0; // by sorting
+  hull.maxX = lower.length;
+  hull.minY = bottom;
+  hull.maxY = (lower.length + top) % hull.length;
+
+  return hull;
+}
+
+function cross(o, a, b) {
+  return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);
+}
+
+/* Based on code from Snap.svg (Apache 2 license). http://snapsvg.io/
+ * Thanks to Dmitry Baranovskiy for his great work!
+ */
+
+function a2c(
+  x1,
+  y1,
+  rx,
+  ry,
+  angle,
+  large_arc_flag,
+  sweep_flag,
+  x2,
+  y2,
+  recursive
+) {
+  // for more information of where this Math came from visit:
+  // https://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes
+  var _120 = (Math.PI * 120) / 180,
+    rad = (Math.PI / 180) * (+angle || 0),
+    res = [],
+    rotateX = function (x, y, rad) {
+      return x * Math.cos(rad) - y * Math.sin(rad);
+    },
+    rotateY = function (x, y, rad) {
+      return x * Math.sin(rad) + y * Math.cos(rad);
+    };
+  if (!recursive) {
+    x1 = rotateX(x1, y1, -rad);
+    y1 = rotateY(x1, y1, -rad);
+    x2 = rotateX(x2, y2, -rad);
+    y2 = rotateY(x2, y2, -rad);
+    var x = (x1 - x2) / 2,
+      y = (y1 - y2) / 2;
+    var h = (x * x) / (rx * rx) + (y * y) / (ry * ry);
+    if (h > 1) {
+      h = Math.sqrt(h);
+      rx = h * rx;
+      ry = h * ry;
+    }
+    var rx2 = rx * rx,
+      ry2 = ry * ry,
+      k =
+        (large_arc_flag == sweep_flag ? -1 : 1) *
+        Math.sqrt(
+          Math.abs(
+            (rx2 * ry2 - rx2 * y * y - ry2 * x * x) /
+              (rx2 * y * y + ry2 * x * x)
+          )
+        ),
+      cx = (k * rx * y) / ry + (x1 + x2) / 2,
+      cy = (k * -ry * x) / rx + (y1 + y2) / 2,
+      f1 = Math.asin(((y1 - cy) / ry).toFixed(9)),
+      f2 = Math.asin(((y2 - cy) / ry).toFixed(9));
+
+    f1 = x1 < cx ? Math.PI - f1 : f1;
+    f2 = x2 < cx ? Math.PI - f2 : f2;
+    f1 < 0 && (f1 = Math.PI * 2 + f1);
+    f2 < 0 && (f2 = Math.PI * 2 + f2);
+    if (sweep_flag && f1 > f2) {
+      f1 = f1 - Math.PI * 2;
+    }
+    if (!sweep_flag && f2 > f1) {
+      f2 = f2 - Math.PI * 2;
+    }
+  } else {
+    f1 = recursive[0];
+    f2 = recursive[1];
+    cx = recursive[2];
+    cy = recursive[3];
+  }
+  var df = f2 - f1;
+  if (Math.abs(df) > _120) {
+    var f2old = f2,
+      x2old = x2,
+      y2old = y2;
+    f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);
+    x2 = cx + rx * Math.cos(f2);
+    y2 = cy + ry * Math.sin(f2);
+    res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [
+      f2,
+      f2old,
+      cx,
+      cy,
+    ]);
+  }
+  df = f2 - f1;
+  var c1 = Math.cos(f1),
+    s1 = Math.sin(f1),
+    c2 = Math.cos(f2),
+    s2 = Math.sin(f2),
+    t = Math.tan(df / 4),
+    hx = (4 / 3) * rx * t,
+    hy = (4 / 3) * ry * t,
+    m = [
+      -hx * s1,
+      hy * c1,
+      x2 + hx * s2 - x1,
+      y2 - hy * c2 - y1,
+      x2 - x1,
+      y2 - y1,
+    ];
+  if (recursive) {
+    return m.concat(res);
+  } else {
+    res = m.concat(res);
+    var newres = [];
+    for (var i = 0, n = res.length; i < n; i++) {
+      newres[i] =
+        i % 2
+          ? rotateY(res[i - 1], res[i], rad)
+          : rotateX(res[i], res[i + 1], rad);
+    }
+    return newres;
+  }
+}
diff --git a/node_modules/svgo/plugins/_transforms.js b/node_modules/svgo/plugins/_transforms.js
new file mode 100644
index 0000000..b615292
--- /dev/null
+++ b/node_modules/svgo/plugins/_transforms.js
@@ -0,0 +1,339 @@
+'use strict';
+
+var regTransformTypes = /matrix|translate|scale|rotate|skewX|skewY/,
+  regTransformSplit = /\s*(matrix|translate|scale|rotate|skewX|skewY)\s*\(\s*(.+?)\s*\)[\s,]*/,
+  regNumericValues = /[-+]?(?:\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?/g;
+
+/**
+ * Convert transform string to JS representation.
+ *
+ * @param {String} transformString input string
+ * @param {Object} params plugin params
+ * @return {Array} output array
+ */
+exports.transform2js = function (transformString) {
+  // JS representation of the transform data
+  var transforms = [],
+    // current transform context
+    current;
+
+  // split value into ['', 'translate', '10 50', '', 'scale', '2', '', 'rotate', '-45', '']
+  transformString.split(regTransformSplit).forEach(function (item) {
+    var num;
+
+    if (item) {
+      // if item is a translate function
+      if (regTransformTypes.test(item)) {
+        // then collect it and change current context
+        transforms.push((current = { name: item }));
+        // else if item is data
+      } else {
+        // then split it into [10, 50] and collect as context.data
+        // eslint-disable-next-line no-cond-assign
+        while ((num = regNumericValues.exec(item))) {
+          num = Number(num);
+          if (current.data) current.data.push(num);
+          else current.data = [num];
+        }
+      }
+    }
+  });
+
+  // return empty array if broken transform (no data)
+  return current && current.data ? transforms : [];
+};
+
+/**
+ * Multiply transforms into one.
+ *
+ * @param {Array} input transforms array
+ * @return {Array} output matrix array
+ */
+exports.transformsMultiply = function (transforms) {
+  // convert transforms objects to the matrices
+  transforms = transforms.map(function (transform) {
+    if (transform.name === 'matrix') {
+      return transform.data;
+    }
+    return transformToMatrix(transform);
+  });
+
+  // multiply all matrices into one
+  transforms = {
+    name: 'matrix',
+    data:
+      transforms.length > 0 ? transforms.reduce(multiplyTransformMatrices) : [],
+  };
+
+  return transforms;
+};
+
+/**
+ * Do math like a schoolgirl.
+ *
+ * @type {Object}
+ */
+var mth = (exports.mth = {
+  rad: function (deg) {
+    return (deg * Math.PI) / 180;
+  },
+
+  deg: function (rad) {
+    return (rad * 180) / Math.PI;
+  },
+
+  cos: function (deg) {
+    return Math.cos(this.rad(deg));
+  },
+
+  acos: function (val, floatPrecision) {
+    return +this.deg(Math.acos(val)).toFixed(floatPrecision);
+  },
+
+  sin: function (deg) {
+    return Math.sin(this.rad(deg));
+  },
+
+  asin: function (val, floatPrecision) {
+    return +this.deg(Math.asin(val)).toFixed(floatPrecision);
+  },
+
+  tan: function (deg) {
+    return Math.tan(this.rad(deg));
+  },
+
+  atan: function (val, floatPrecision) {
+    return +this.deg(Math.atan(val)).toFixed(floatPrecision);
+  },
+});
+
+/**
+ * Decompose matrix into simple transforms. See
+ * https://frederic-wang.fr/decomposition-of-2d-transform-matrices.html
+ *
+ * @param {Object} data matrix transform object
+ * @return {Object|Array} transforms array or original transform object
+ */
+exports.matrixToTransform = function (transform, params) {
+  var floatPrecision = params.floatPrecision,
+    data = transform.data,
+    transforms = [],
+    sx = +Math.hypot(data[0], data[1]).toFixed(params.transformPrecision),
+    sy = +((data[0] * data[3] - data[1] * data[2]) / sx).toFixed(
+      params.transformPrecision
+    ),
+    colsSum = data[0] * data[2] + data[1] * data[3],
+    rowsSum = data[0] * data[1] + data[2] * data[3],
+    scaleBefore = rowsSum != 0 || sx == sy;
+
+  // [..., ..., ..., ..., tx, ty] → translate(tx, ty)
+  if (data[4] || data[5]) {
+    transforms.push({
+      name: 'translate',
+      data: data.slice(4, data[5] ? 6 : 5),
+    });
+  }
+
+  // [sx, 0, tan(a)·sy, sy, 0, 0] → skewX(a)·scale(sx, sy)
+  if (!data[1] && data[2]) {
+    transforms.push({
+      name: 'skewX',
+      data: [mth.atan(data[2] / sy, floatPrecision)],
+    });
+
+    // [sx, sx·tan(a), 0, sy, 0, 0] → skewY(a)·scale(sx, sy)
+  } else if (data[1] && !data[2]) {
+    transforms.push({
+      name: 'skewY',
+      data: [mth.atan(data[1] / data[0], floatPrecision)],
+    });
+    sx = data[0];
+    sy = data[3];
+
+    // [sx·cos(a), sx·sin(a), sy·-sin(a), sy·cos(a), x, y] → rotate(a[, cx, cy])·(scale or skewX) or
+    // [sx·cos(a), sy·sin(a), sx·-sin(a), sy·cos(a), x, y] → scale(sx, sy)·rotate(a[, cx, cy]) (if !scaleBefore)
+  } else if (!colsSum || (sx == 1 && sy == 1) || !scaleBefore) {
+    if (!scaleBefore) {
+      sx = (data[0] < 0 ? -1 : 1) * Math.hypot(data[0], data[2]);
+      sy = (data[3] < 0 ? -1 : 1) * Math.hypot(data[1], data[3]);
+      transforms.push({ name: 'scale', data: [sx, sy] });
+    }
+    var angle = Math.min(Math.max(-1, data[0] / sx), 1),
+      rotate = [
+        mth.acos(angle, floatPrecision) *
+          ((scaleBefore ? 1 : sy) * data[1] < 0 ? -1 : 1),
+      ];
+
+    if (rotate[0]) transforms.push({ name: 'rotate', data: rotate });
+
+    if (rowsSum && colsSum)
+      transforms.push({
+        name: 'skewX',
+        data: [mth.atan(colsSum / (sx * sx), floatPrecision)],
+      });
+
+    // rotate(a, cx, cy) can consume translate() within optional arguments cx, cy (rotation point)
+    if (rotate[0] && (data[4] || data[5])) {
+      transforms.shift();
+      var cos = data[0] / sx,
+        sin = data[1] / (scaleBefore ? sx : sy),
+        x = data[4] * (scaleBefore || sy),
+        y = data[5] * (scaleBefore || sx),
+        denom =
+          (Math.pow(1 - cos, 2) + Math.pow(sin, 2)) * (scaleBefore || sx * sy);
+      rotate.push(((1 - cos) * x - sin * y) / denom);
+      rotate.push(((1 - cos) * y + sin * x) / denom);
+    }
+
+    // Too many transformations, return original matrix if it isn't just a scale/translate
+  } else if (data[1] || data[2]) {
+    return transform;
+  }
+
+  if ((scaleBefore && (sx != 1 || sy != 1)) || !transforms.length)
+    transforms.push({
+      name: 'scale',
+      data: sx == sy ? [sx] : [sx, sy],
+    });
+
+  return transforms;
+};
+
+/**
+ * Convert transform to the matrix data.
+ *
+ * @param {Object} transform transform object
+ * @return {Array} matrix data
+ */
+function transformToMatrix(transform) {
+  if (transform.name === 'matrix') return transform.data;
+
+  var matrix;
+
+  switch (transform.name) {
+    case 'translate':
+      // [1, 0, 0, 1, tx, ty]
+      matrix = [1, 0, 0, 1, transform.data[0], transform.data[1] || 0];
+      break;
+    case 'scale':
+      // [sx, 0, 0, sy, 0, 0]
+      matrix = [
+        transform.data[0],
+        0,
+        0,
+        transform.data[1] || transform.data[0],
+        0,
+        0,
+      ];
+      break;
+    case 'rotate':
+      // [cos(a), sin(a), -sin(a), cos(a), x, y]
+      var cos = mth.cos(transform.data[0]),
+        sin = mth.sin(transform.data[0]),
+        cx = transform.data[1] || 0,
+        cy = transform.data[2] || 0;
+
+      matrix = [
+        cos,
+        sin,
+        -sin,
+        cos,
+        (1 - cos) * cx + sin * cy,
+        (1 - cos) * cy - sin * cx,
+      ];
+      break;
+    case 'skewX':
+      // [1, 0, tan(a), 1, 0, 0]
+      matrix = [1, 0, mth.tan(transform.data[0]), 1, 0, 0];
+      break;
+    case 'skewY':
+      // [1, tan(a), 0, 1, 0, 0]
+      matrix = [1, mth.tan(transform.data[0]), 0, 1, 0, 0];
+      break;
+  }
+
+  return matrix;
+}
+
+/**
+ * Applies transformation to an arc. To do so, we represent ellipse as a matrix, multiply it
+ * by the transformation matrix and use a singular value decomposition to represent in a form
+ * rotate(θ)·scale(a b)·rotate(φ). This gives us new ellipse params a, b and θ.
+ * SVD is being done with the formulae provided by Wolffram|Alpha (svd {{m0, m2}, {m1, m3}})
+ *
+ * @param {Array} cursor [x, y]
+ * @param {Array} arc [a, b, rotation in deg]
+ * @param {Array} transform transformation matrix
+ * @return {Array} arc transformed input arc
+ */
+exports.transformArc = function (cursor, arc, transform) {
+  const x = arc[5] - cursor[0];
+  const y = arc[6] - cursor[1];
+  var a = arc[0],
+    b = arc[1],
+    rot = (arc[2] * Math.PI) / 180,
+    cos = Math.cos(rot),
+    sin = Math.sin(rot),
+    h =
+      Math.pow(x * cos + y * sin, 2) / (4 * a * a) +
+      Math.pow(y * cos - x * sin, 2) / (4 * b * b);
+  if (h > 1) {
+    h = Math.sqrt(h);
+    a *= h;
+    b *= h;
+  }
+  var ellipse = [a * cos, a * sin, -b * sin, b * cos, 0, 0],
+    m = multiplyTransformMatrices(transform, ellipse),
+    // Decompose the new ellipse matrix
+    lastCol = m[2] * m[2] + m[3] * m[3],
+    squareSum = m[0] * m[0] + m[1] * m[1] + lastCol,
+    root =
+      Math.hypot(m[0] - m[3], m[1] + m[2]) *
+      Math.hypot(m[0] + m[3], m[1] - m[2]);
+
+  if (!root) {
+    // circle
+    arc[0] = arc[1] = Math.sqrt(squareSum / 2);
+    arc[2] = 0;
+  } else {
+    var majorAxisSqr = (squareSum + root) / 2,
+      minorAxisSqr = (squareSum - root) / 2,
+      major = Math.abs(majorAxisSqr - lastCol) > 1e-6,
+      sub = (major ? majorAxisSqr : minorAxisSqr) - lastCol,
+      rowsSum = m[0] * m[2] + m[1] * m[3],
+      term1 = m[0] * sub + m[2] * rowsSum,
+      term2 = m[1] * sub + m[3] * rowsSum;
+    arc[0] = Math.sqrt(majorAxisSqr);
+    arc[1] = Math.sqrt(minorAxisSqr);
+    arc[2] =
+      (((major ? term2 < 0 : term1 > 0) ? -1 : 1) *
+        Math.acos((major ? term1 : term2) / Math.hypot(term1, term2)) *
+        180) /
+      Math.PI;
+  }
+
+  if (transform[0] < 0 !== transform[3] < 0) {
+    // Flip the sweep flag if coordinates are being flipped horizontally XOR vertically
+    arc[4] = 1 - arc[4];
+  }
+
+  return arc;
+};
+
+/**
+ * Multiply transformation matrices.
+ *
+ * @param {Array} a matrix A data
+ * @param {Array} b matrix B data
+ * @return {Array} result
+ */
+function multiplyTransformMatrices(a, b) {
+  return [
+    a[0] * b[0] + a[2] * b[1],
+    a[1] * b[0] + a[3] * b[1],
+    a[0] * b[2] + a[2] * b[3],
+    a[1] * b[2] + a[3] * b[3],
+    a[0] * b[4] + a[2] * b[5] + a[4],
+    a[1] * b[4] + a[3] * b[5] + a[5],
+  ];
+}
diff --git a/node_modules/svgo/plugins/addAttributesToSVGElement.js b/node_modules/svgo/plugins/addAttributesToSVGElement.js
new file mode 100644
index 0000000..3573fb9
--- /dev/null
+++ b/node_modules/svgo/plugins/addAttributesToSVGElement.js
@@ -0,0 +1,83 @@
+'use strict';
+
+const { closestByName } = require('../lib/xast.js');
+
+exports.type = 'perItem';
+
+exports.active = false;
+
+exports.description = 'adds attributes to an outer <svg> element';
+
+var ENOCLS = `Error in plugin "addAttributesToSVGElement": absent parameters.
+It should have a list of "attributes" or one "attribute".
+Config example:
+
+plugins: [
+  {
+    name: 'addAttributesToSVGElement',
+    params: {
+      attribute: "mySvg"
+    }
+  }
+]
+
+plugins: [
+  {
+    name: 'addAttributesToSVGElement',
+    params: {
+      attributes: ["mySvg", "size-big"]
+    }
+  }
+]
+
+plugins: [
+  {
+    name: 'addAttributesToSVGElement',
+    params: {
+      attributes: [
+        {
+          focusable: false
+        },
+        {
+          'data-image': icon
+        }
+      ]
+    }
+  }
+]
+`;
+
+/**
+ * Add attributes to an outer <svg> element. Example config:
+ *
+ * @author April Arcus
+ */
+exports.fn = (node, params) => {
+  if (
+    node.type === 'element' &&
+    node.name === 'svg' &&
+    closestByName(node.parentNode, 'svg') == null
+  ) {
+    if (!params || !(Array.isArray(params.attributes) || params.attribute)) {
+      console.error(ENOCLS);
+      return;
+    }
+
+    const attributes = params.attributes || [params.attribute];
+
+    for (const attribute of attributes) {
+      if (typeof attribute === 'string') {
+        if (node.attributes[attribute] == null) {
+          node.attributes[attribute] = undefined;
+        }
+      }
+      if (typeof attribute === 'object') {
+        for (const key of Object.keys(attribute)) {
+          if (node.attributes[key] == null) {
+            node.attributes[key] = attribute[key];
+          }
+        }
+      }
+    }
+  }
+};
diff --git a/node_modules/svgo/plugins/addClassesToSVGElement.js b/node_modules/svgo/plugins/addClassesToSVGElement.js
new file mode 100644
index 0000000..dcecadb
--- /dev/null
+++ b/node_modules/svgo/plugins/addClassesToSVGElement.js
@@ -0,0 +1,55 @@
+'use strict';
+
+exports.type = 'full';
+
+exports.active = false;
+
+exports.description = 'adds classnames to an outer <svg> element';
+
+var ENOCLS = `Error in plugin "addClassesToSVGElement": absent parameters.
+It should have a list of classes in "classNames" or one "className".
+Config example:
+
+plugins:
+- addClassesToSVGElement:
+    className: "mySvg"
+
+plugins:
+- addClassesToSVGElement:
+    classNames: ["mySvg", "size-big"]
+`;
+
+/**
+ * Add classnames to an outer <svg> element. Example config:
+ *
+ * plugins:
+ * - addClassesToSVGElement:
+ *     className: 'mySvg'
+ *
+ * plugins:
+ * - addClassesToSVGElement:
+ *     classNames: ['mySvg', 'size-big']
+ *
+ * @author April Arcus
+ */
+exports.fn = function (data, params) {
+  if (
+    !params ||
+    !(
+      (Array.isArray(params.classNames) && params.classNames.some(String)) ||
+      params.className
+    )
+  ) {
+    console.error(ENOCLS);
+    return data;
+  }
+
+  var classNames = params.classNames || [params.className],
+    svg = data.children[0];
+
+  if (svg.isElem('svg')) {
+    svg.class.add.apply(svg.class, classNames);
+  }
+
+  return data;
+};
diff --git a/node_modules/svgo/plugins/cleanupAttrs.js b/node_modules/svgo/plugins/cleanupAttrs.js
new file mode 100644
index 0000000..aa30369
--- /dev/null
+++ b/node_modules/svgo/plugins/cleanupAttrs.js
@@ -0,0 +1,52 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description =
+  'cleanups attributes from newlines, trailing and repeating spaces';
+
+exports.params = {
+  newlines: true,
+  trim: true,
+  spaces: true,
+};
+
+var regNewlinesNeedSpace = /(\S)\r?\n(\S)/g,
+  regNewlines = /\r?\n/g,
+  regSpaces = /\s{2,}/g;
+
+/**
+ * Cleanup attributes values from newlines, trailing and repeating spaces.
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item, params) {
+  if (item.type === 'element') {
+    for (const name of Object.keys(item.attributes)) {
+      if (params.newlines) {
+        // new line which requires a space instead of themselve
+        item.attributes[name] = item.attributes[name].replace(
+          regNewlinesNeedSpace,
+          (match, p1, p2) => p1 + ' ' + p2
+        );
+
+        // simple new line
+        item.attributes[name] = item.attributes[name].replace(regNewlines, '');
+      }
+
+      if (params.trim) {
+        item.attributes[name] = item.attributes[name].trim();
+      }
+
+      if (params.spaces) {
+        item.attributes[name] = item.attributes[name].replace(regSpaces, ' ');
+      }
+    }
+  }
+};
diff --git a/node_modules/svgo/plugins/cleanupEnableBackground.js b/node_modules/svgo/plugins/cleanupEnableBackground.js
new file mode 100644
index 0000000..3abae8b
--- /dev/null
+++ b/node_modules/svgo/plugins/cleanupEnableBackground.js
@@ -0,0 +1,73 @@
+'use strict';
+
+const { traverse } = require('../lib/xast.js');
+
+exports.type = 'full';
+
+exports.active = true;
+
+exports.description =
+  'remove or cleanup enable-background attribute when possible';
+
+/**
+ * Remove or cleanup enable-background attr which coincides with a width/height box.
+ *
+ * @see https://www.w3.org/TR/SVG11/filters.html#EnableBackgroundProperty
+ *
+ * @example
+ * <svg width="100" height="50" enable-background="new 0 0 100 50">
+ *             ⬇
+ * <svg width="100" height="50">
+ *
+ * @param {Object} root current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (root) {
+  const regEnableBackground = /^new\s0\s0\s([-+]?\d*\.?\d+([eE][-+]?\d+)?)\s([-+]?\d*\.?\d+([eE][-+]?\d+)?)$/;
+  let hasFilter = false;
+  const elems = ['svg', 'mask', 'pattern'];
+
+  traverse(root, (node) => {
+    if (node.type === 'element') {
+      if (
+        elems.includes(node.name) &&
+        node.attributes['enable-background'] != null &&
+        node.attributes.width != null &&
+        node.attributes.height != null
+      ) {
+        const match = node.attributes['enable-background'].match(
+          regEnableBackground
+        );
+
+        if (match) {
+          if (
+            node.attributes.width === match[1] &&
+            node.attributes.height === match[3]
+          ) {
+            if (node.name === 'svg') {
+              delete node.attributes['enable-background'];
+            } else {
+              node.attributes['enable-background'] = 'new';
+            }
+          }
+        }
+      }
+      if (node.name === 'filter') {
+        hasFilter = true;
+      }
+    }
+  });
+
+  if (hasFilter === false) {
+    traverse(root, (node) => {
+      if (node.type === 'element') {
+        //we don't need 'enable-background' if we have no filters
+        delete node.attributes['enable-background'];
+      }
+    });
+  }
+
+  return root;
+};
diff --git a/node_modules/svgo/plugins/cleanupIDs.js b/node_modules/svgo/plugins/cleanupIDs.js
new file mode 100644
index 0000000..08c9940
--- /dev/null
+++ b/node_modules/svgo/plugins/cleanupIDs.js
@@ -0,0 +1,276 @@
+'use strict';
+
+const { traverse, traverseBreak } = require('../lib/xast.js');
+const { parseName } = require('../lib/svgo/tools.js');
+
+exports.type = 'full';
+
+exports.active = true;
+
+exports.description = 'removes unused IDs and minifies used';
+
+exports.params = {
+  remove: true,
+  minify: true,
+  prefix: '',
+  preserve: [],
+  preservePrefixes: [],
+  force: false,
+};
+
+var referencesProps = new Set(require('./_collections').referencesProps),
+  regReferencesUrl = /\burl\(("|')?#(.+?)\1\)/,
+  regReferencesHref = /^#(.+?)$/,
+  regReferencesBegin = /(\w+)\./,
+  styleOrScript = ['style', 'script'],
+  generateIDchars = [
+    'a',
+    'b',
+    'c',
+    'd',
+    'e',
+    'f',
+    'g',
+    'h',
+    'i',
+    'j',
+    'k',
+    'l',
+    'm',
+    'n',
+    'o',
+    'p',
+    'q',
+    'r',
+    's',
+    't',
+    'u',
+    'v',
+    'w',
+    'x',
+    'y',
+    'z',
+    'A',
+    'B',
+    'C',
+    'D',
+    'E',
+    'F',
+    'G',
+    'H',
+    'I',
+    'J',
+    'K',
+    'L',
+    'M',
+    'N',
+    'O',
+    'P',
+    'Q',
+    'R',
+    'S',
+    'T',
+    'U',
+    'V',
+    'W',
+    'X',
+    'Y',
+    'Z',
+  ],
+  maxIDindex = generateIDchars.length - 1;
+
+/**
+ * Remove unused and minify used IDs
+ * (only if there are no any <style> or <script>).
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (root, params) {
+  var currentID,
+    currentIDstring,
+    IDs = new Map(),
+    referencesIDs = new Map(),
+    hasStyleOrScript = false,
+    preserveIDs = new Set(
+      Array.isArray(params.preserve)
+        ? params.preserve
+        : params.preserve
+        ? [params.preserve]
+        : []
+    ),
+    preserveIDPrefixes = new Set(
+      Array.isArray(params.preservePrefixes)
+        ? params.preservePrefixes
+        : params.preservePrefixes
+        ? [params.preservePrefixes]
+        : []
+    ),
+    idValuePrefix = '#',
+    idValuePostfix = '.';
+
+  traverse(root, (node) => {
+    if (hasStyleOrScript === true) {
+      return traverseBreak;
+    }
+
+    // quit if <style> or <script> present ('force' param prevents quitting)
+    if (!params.force) {
+      if (node.isElem(styleOrScript) && node.children.length !== 0) {
+        hasStyleOrScript = true;
+        return;
+      }
+
+      // Don't remove IDs if the whole SVG consists only of defs.
+      if (node.type === 'element' && node.name === 'svg') {
+        let hasDefsOnly = true;
+        for (const child of node.children) {
+          if (child.type !== 'element' || child.name !== 'defs') {
+            hasDefsOnly = false;
+            break;
+          }
+        }
+        if (hasDefsOnly) {
+          return traverseBreak;
+        }
+      }
+    }
+
+    // …and don't remove any ID if yes
+    if (node.type === 'element') {
+      for (const [name, value] of Object.entries(node.attributes)) {
+        let key;
+        let match;
+
+        // save IDs
+        if (name === 'id') {
+          key = value;
+          if (IDs.has(key)) {
+            delete node.attributes.id; // remove repeated id
+          } else {
+            IDs.set(key, node);
+          }
+        } else {
+          // save references
+          const { local } = parseName(name);
+          if (
+            referencesProps.has(name) &&
+            (match = value.match(regReferencesUrl))
+          ) {
+            key = match[2]; // url() reference
+          } else if (
+            (local === 'href' && (match = value.match(regReferencesHref))) ||
+            (name === 'begin' && (match = value.match(regReferencesBegin)))
+          ) {
+            key = match[1]; // href reference
+          }
+          if (key) {
+            const refs = referencesIDs.get(key) || [];
+            refs.push({ element: node, name, value });
+            referencesIDs.set(key, refs);
+          }
+        }
+      }
+    }
+  });
+
+  if (hasStyleOrScript) {
+    return root;
+  }
+
+  const idPreserved = (id) =>
+    preserveIDs.has(id) || idMatchesPrefix(preserveIDPrefixes, id);
+
+  for (const [key, refs] of referencesIDs) {
+    if (IDs.has(key)) {
+      // replace referenced IDs with the minified ones
+      if (params.minify && !idPreserved(key)) {
+        do {
+          currentIDstring = getIDstring(
+            (currentID = generateID(currentID)),
+            params
+          );
+        } while (idPreserved(currentIDstring));
+
+        IDs.get(key).attributes.id = currentIDstring;
+
+        for (const { element, name, value } of refs) {
+          element.attributes[name] = value.includes(idValuePrefix)
+            ? value.replace(
+                idValuePrefix + key,
+                idValuePrefix + currentIDstring
+              )
+            : value.replace(
+                key + idValuePostfix,
+                currentIDstring + idValuePostfix
+              );
+        }
+      }
+      // don't remove referenced IDs
+      IDs.delete(key);
+    }
+  }
+  // remove non-referenced IDs attributes from elements
+  if (params.remove) {
+    for (var keyElem of IDs) {
+      if (!idPreserved(keyElem[0])) {
+        delete keyElem[1].attributes.id;
+      }
+    }
+  }
+  return root;
+};
+
+/**
+ * Check if an ID starts with any one of a list of strings.
+ *
+ * @param {Array} of prefix strings
+ * @param {String} current ID
+ * @return {Boolean} if currentID starts with one of the strings in prefixArray
+ */
+function idMatchesPrefix(prefixArray, currentID) {
+  if (!currentID) return false;
+
+  for (var prefix of prefixArray) if (currentID.startsWith(prefix)) return true;
+  return false;
+}
+
+/**
+ * Generate unique minimal ID.
+ *
+ * @param {Array} [currentID] current ID
+ * @return {Array} generated ID array
+ */
+function generateID(currentID) {
+  if (!currentID) return [0];
+
+  currentID[currentID.length - 1]++;
+
+  for (var i = currentID.length - 1; i > 0; i--) {
+    if (currentID[i] > maxIDindex) {
+      currentID[i] = 0;
+
+      if (currentID[i - 1] !== undefined) {
+        currentID[i - 1]++;
+      }
+    }
+  }
+  if (currentID[0] > maxIDindex) {
+    currentID[0] = 0;
+    currentID.unshift(0);
+  }
+  return currentID;
+}
+
+/**
+ * Get string from generated ID array.
+ *
+ * @param {Array} arr input ID array
+ * @return {String} output ID string
+ */
+function getIDstring(arr, params) {
+  var str = params.prefix;
+  return str + arr.map((i) => generateIDchars[i]).join('');
+}
diff --git a/node_modules/svgo/plugins/cleanupListOfValues.js b/node_modules/svgo/plugins/cleanupListOfValues.js
new file mode 100644
index 0000000..5094225
--- /dev/null
+++ b/node_modules/svgo/plugins/cleanupListOfValues.js
@@ -0,0 +1,140 @@
+'use strict';
+
+const { removeLeadingZero } = require('../lib/svgo/tools.js');
+
+exports.type = 'perItem';
+
+exports.active = false;
+
+exports.description = 'rounds list of values to the fixed precision';
+
+exports.params = {
+  floatPrecision: 3,
+  leadingZero: true,
+  defaultPx: true,
+  convertToPx: true,
+};
+
+const regNumericValues = /^([-+]?\d*\.?\d+([eE][-+]?\d+)?)(px|pt|pc|mm|cm|m|in|ft|em|ex|%)?$/;
+const regSeparator = /\s+,?\s*|,\s*/;
+const absoluteLengths = {
+  // relative to px
+  cm: 96 / 2.54,
+  mm: 96 / 25.4,
+  in: 96,
+  pt: 4 / 3,
+  pc: 16,
+};
+
+/**
+ * Round list of values to the fixed precision.
+ *
+ * @example
+ * <svg viewBox="0 0 200.28423 200.28423" enable-background="new 0 0 200.28423 200.28423">
+ *         ⬇
+ * <svg viewBox="0 0 200.284 200.284" enable-background="new 0 0 200.284 200.284">
+ *
+ *
+ * <polygon points="208.250977 77.1308594 223.069336 ... "/>
+ *         ⬇
+ * <polygon points="208.251 77.131 223.069 ... "/>
+ *
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author kiyopikko
+ */
+exports.fn = function (item, params) {
+  if (item.type !== 'element') {
+    return;
+  }
+
+  if (item.attributes.points != null) {
+    item.attributes.points = roundValues(item.attributes.points);
+  }
+
+  if (item.attributes['enable-background'] != null) {
+    item.attributes['enable-background'] = roundValues(
+      item.attributes['enable-background']
+    );
+  }
+
+  if (item.attributes.viewBox != null) {
+    item.attributes.viewBox = roundValues(item.attributes.viewBox);
+  }
+
+  if (item.attributes['stroke-dasharray'] != null) {
+    item.attributes['stroke-dasharray'] = roundValues(
+      item.attributes['stroke-dasharray']
+    );
+  }
+
+  if (item.attributes.dx != null) {
+    item.attributes.dx = roundValues(item.attributes.dx);
+  }
+
+  if (item.attributes.dy != null) {
+    item.attributes.dy = roundValues(item.attributes.dy);
+  }
+
+  if (item.attributes.x != null) {
+    item.attributes.x = roundValues(item.attributes.x);
+  }
+
+  if (item.attributes.y != null) {
+    item.attributes.y = roundValues(item.attributes.y);
+  }
+
+  function roundValues(lists) {
+    var num,
+      units,
+      match,
+      matchNew,
+      listsArr = lists.split(regSeparator),
+      roundedList = [];
+
+    for (const elem of listsArr) {
+      match = elem.match(regNumericValues);
+      matchNew = elem.match(/new/);
+
+      // if attribute value matches regNumericValues
+      if (match) {
+        // round it to the fixed precision
+        (num = +(+match[1]).toFixed(params.floatPrecision)),
+          (units = match[3] || '');
+
+        // convert absolute values to pixels
+        if (params.convertToPx && units && units in absoluteLengths) {
+          var pxNum = +(absoluteLengths[units] * match[1]).toFixed(
+            params.floatPrecision
+          );
+
+          if (String(pxNum).length < match[0].length)
+            (num = pxNum), (units = 'px');
+        }
+
+        // and remove leading zero
+        if (params.leadingZero) {
+          num = removeLeadingZero(num);
+        }
+
+        // remove default 'px' units
+        if (params.defaultPx && units === 'px') {
+          units = '';
+        }
+
+        roundedList.push(num + units);
+      }
+      // if attribute value is "new"(only enable-background).
+      else if (matchNew) {
+        roundedList.push('new');
+      } else if (elem) {
+        roundedList.push(elem);
+      }
+    }
+
+    return roundedList.join(' ');
+  }
+};
diff --git a/node_modules/svgo/plugins/cleanupNumericValues.js b/node_modules/svgo/plugins/cleanupNumericValues.js
new file mode 100644
index 0000000..5fb7936
--- /dev/null
+++ b/node_modules/svgo/plugins/cleanupNumericValues.js
@@ -0,0 +1,92 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description =
+  'rounds numeric values to the fixed precision, removes default ‘px’ units';
+
+exports.params = {
+  floatPrecision: 3,
+  leadingZero: true,
+  defaultPx: true,
+  convertToPx: true,
+};
+
+var regNumericValues = /^([-+]?\d*\.?\d+([eE][-+]?\d+)?)(px|pt|pc|mm|cm|m|in|ft|em|ex|%)?$/,
+  removeLeadingZero = require('../lib/svgo/tools').removeLeadingZero,
+  absoluteLengths = {
+    // relative to px
+    cm: 96 / 2.54,
+    mm: 96 / 25.4,
+    in: 96,
+    pt: 4 / 3,
+    pc: 16,
+  };
+
+/**
+ * Round numeric values to the fixed precision,
+ * remove default 'px' units.
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item, params) {
+  if (item.type === 'element') {
+    var floatPrecision = params.floatPrecision;
+
+    if (item.attributes.viewBox != null) {
+      var nums = item.attributes.viewBox.split(/\s,?\s*|,\s*/g);
+      item.attributes.viewBox = nums
+        .map(function (value) {
+          var num = +value;
+          return isNaN(num) ? value : +num.toFixed(floatPrecision);
+        })
+        .join(' ');
+    }
+
+    for (const [name, value] of Object.entries(item.attributes)) {
+      // The `version` attribute is a text string and cannot be rounded
+      if (name === 'version') {
+        continue;
+      }
+
+      var match = value.match(regNumericValues);
+
+      // if attribute value matches regNumericValues
+      if (match) {
+        // round it to the fixed precision
+        var num = +(+match[1]).toFixed(floatPrecision),
+          units = match[3] || '';
+
+        // convert absolute values to pixels
+        if (params.convertToPx && units && units in absoluteLengths) {
+          var pxNum = +(absoluteLengths[units] * match[1]).toFixed(
+            floatPrecision
+          );
+
+          if (String(pxNum).length < match[0].length) {
+            num = pxNum;
+            units = 'px';
+          }
+        }
+
+        // and remove leading zero
+        if (params.leadingZero) {
+          num = removeLeadingZero(num);
+        }
+
+        // remove default 'px' units
+        if (params.defaultPx && units === 'px') {
+          units = '';
+        }
+
+        item.attributes[name] = num + units;
+      }
+    }
+  }
+};
diff --git a/node_modules/svgo/plugins/collapseGroups.js b/node_modules/svgo/plugins/collapseGroups.js
new file mode 100644
index 0000000..dfd602c
--- /dev/null
+++ b/node_modules/svgo/plugins/collapseGroups.js
@@ -0,0 +1,103 @@
+'use strict';
+
+const { inheritableAttrs, elemsGroups } = require('./_collections');
+
+exports.type = 'perItemReverse';
+
+exports.active = true;
+
+exports.description = 'collapses useless groups';
+
+function hasAnimatedAttr(item, name) {
+  if (item.type === 'element') {
+    return (
+      (elemsGroups.animation.includes(item.name) &&
+        item.attributes.attributeName === name) ||
+      (item.children.length !== 0 &&
+        item.children.some((child) => hasAnimatedAttr(child, name)))
+    );
+  }
+  return false;
+}
+
+/*
+ * Collapse useless groups.
+ *
+ * @example
+ * <g>
+ *     <g attr1="val1">
+ *         <path d="..."/>
+ *     </g>
+ * </g>
+ *         ⬇
+ * <g>
+ *     <g>
+ *         <path attr1="val1" d="..."/>
+ *     </g>
+ * </g>
+ *         ⬇
+ * <path attr1="val1" d="..."/>
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item) {
+  // non-empty elements
+  if (
+    item.type === 'element' &&
+    item.name !== 'switch' &&
+    item.children.length !== 0
+  ) {
+    item.children.forEach(function (g, i) {
+      // non-empty groups
+      if (g.type === 'element' && g.name === 'g' && g.children.length !== 0) {
+        // move group attibutes to the single child element
+        if (Object.keys(g.attributes).length !== 0 && g.children.length === 1) {
+          var inner = g.children[0];
+
+          if (
+            inner.type === 'element' &&
+            inner.attributes.id == null &&
+            g.attributes.filter == null &&
+            (g.attributes.class == null || inner.attributes.class == null) &&
+            ((g.attributes['clip-path'] == null && g.attributes.mask == null) ||
+              (inner.type === 'element' &&
+                inner.name === 'g' &&
+                g.attributes.transform == null &&
+                inner.attributes.transform == null))
+          ) {
+            for (const [name, value] of Object.entries(g.attributes)) {
+              if (g.children.some((item) => hasAnimatedAttr(item, name)))
+                return;
+
+              if (inner.attributes[name] == null) {
+                inner.attributes[name] = value;
+              } else if (name == 'transform') {
+                inner.attributes[name] = value + ' ' + inner.attributes[name];
+              } else if (inner.attributes[name] === 'inherit') {
+                inner.attributes[name] = value;
+              } else if (
+                inheritableAttrs.includes(name) === false &&
+                inner.attributes[name] !== value
+              ) {
+                return;
+              }
+
+              delete g.attributes[name];
+            }
+          }
+        }
+
+        // collapse groups without attributes
+        if (
+          Object.keys(g.attributes).length === 0 &&
+          !g.children.some((item) => item.isElem(elemsGroups.animation))
+        ) {
+          item.spliceContent(i, 1, g.children);
+        }
+      }
+    });
+  }
+};
diff --git a/node_modules/svgo/plugins/convertColors.js b/node_modules/svgo/plugins/convertColors.js
new file mode 100644
index 0000000..30426c1
--- /dev/null
+++ b/node_modules/svgo/plugins/convertColors.js
@@ -0,0 +1,128 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'converts colors: rgb() to #rrggbb and #rrggbb to #rgb';
+
+exports.params = {
+  currentColor: false,
+  names2hex: true,
+  rgb2hex: true,
+  shorthex: true,
+  shortname: true,
+};
+
+var collections = require('./_collections'),
+  rNumber = '([+-]?(?:\\d*\\.\\d+|\\d+\\.?)%?)',
+  rComma = '\\s*,\\s*',
+  regRGB = new RegExp(
+    '^rgb\\(\\s*' + rNumber + rComma + rNumber + rComma + rNumber + '\\s*\\)$'
+  ),
+  regHEX = /^#(([a-fA-F0-9])\2){3}$/,
+  none = /\bnone\b/i;
+
+/**
+ * Convert different colors formats in element attributes to hex.
+ *
+ * @see https://www.w3.org/TR/SVG11/types.html#DataTypeColor
+ * @see https://www.w3.org/TR/SVG11/single-page.html#types-ColorKeywords
+ *
+ * @example
+ * Convert color name keyword to long hex:
+ * fuchsia ➡ #ff00ff
+ *
+ * Convert rgb() to long hex:
+ * rgb(255, 0, 255) ➡ #ff00ff
+ * rgb(50%, 100, 100%) ➡ #7f64ff
+ *
+ * Convert long hex to short hex:
+ * #aabbcc ➡ #abc
+ *
+ * Convert hex to short name
+ * #000080 ➡ navy
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item, params) {
+  if (item.type === 'element') {
+    for (const [name, value] of Object.entries(item.attributes)) {
+      if (collections.colorsProps.includes(name)) {
+        let val = value;
+        let match;
+
+        // Convert colors to currentColor
+        if (params.currentColor) {
+          if (typeof params.currentColor === 'string') {
+            match = val === params.currentColor;
+          } else if (params.currentColor.exec) {
+            match = params.currentColor.exec(val);
+          } else {
+            match = !val.match(none);
+          }
+          if (match) {
+            val = 'currentColor';
+          }
+        }
+
+        // Convert color name keyword to long hex
+        if (params.names2hex && val.toLowerCase() in collections.colorsNames) {
+          val = collections.colorsNames[val.toLowerCase()];
+        }
+
+        // Convert rgb() to long hex
+        if (params.rgb2hex && (match = val.match(regRGB))) {
+          match = match.slice(1, 4).map(function (m) {
+            if (m.indexOf('%') > -1) m = Math.round(parseFloat(m) * 2.55);
+
+            return Math.max(0, Math.min(m, 255));
+          });
+
+          val = rgb2hex(match);
+        }
+
+        // Convert long hex to short hex
+        if (params.shorthex && (match = val.match(regHEX))) {
+          val = '#' + match[0][1] + match[0][3] + match[0][5];
+        }
+
+        // Convert hex to short name
+        if (params.shortname) {
+          var lowerVal = val.toLowerCase();
+          if (lowerVal in collections.colorsShortNames) {
+            val = collections.colorsShortNames[lowerVal];
+          }
+        }
+
+        item.attributes[name] = val;
+      }
+    }
+  }
+};
+
+/**
+ * Convert [r, g, b] to #rrggbb.
+ *
+ * @see https://gist.github.com/983535
+ *
+ * @example
+ * rgb2hex([255, 255, 255]) // '#ffffff'
+ *
+ * @param {Array} rgb [r, g, b]
+ * @return {String} #rrggbb
+ *
+ * @author Jed Schmidt
+ */
+function rgb2hex(rgb) {
+  return (
+    '#' +
+    ('00000' + ((rgb[0] << 16) | (rgb[1] << 8) | rgb[2]).toString(16))
+      .slice(-6)
+      .toUpperCase()
+  );
+}
diff --git a/node_modules/svgo/plugins/convertEllipseToCircle.js b/node_modules/svgo/plugins/convertEllipseToCircle.js
new file mode 100644
index 0000000..2560b3a
--- /dev/null
+++ b/node_modules/svgo/plugins/convertEllipseToCircle.js
@@ -0,0 +1,36 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'converts non-eccentric <ellipse>s to <circle>s';
+
+/**
+ * Converts non-eccentric <ellipse>s to <circle>s.
+ *
+ * @see https://www.w3.org/TR/SVG11/shapes.html
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Taylor Hunt
+ */
+exports.fn = function (item) {
+  if (item.isElem('ellipse')) {
+    const rx = item.attributes.rx || 0;
+    const ry = item.attributes.ry || 0;
+
+    if (
+      rx === ry ||
+      rx === 'auto' ||
+      ry === 'auto' // SVG2
+    ) {
+      var radius = rx !== 'auto' ? rx : ry;
+      item.renameElem('circle');
+      delete item.attributes.rx;
+      delete item.attributes.ry;
+      item.attributes.r = radius;
+    }
+  }
+};
diff --git a/node_modules/svgo/plugins/convertPathData.js b/node_modules/svgo/plugins/convertPathData.js
new file mode 100644
index 0000000..3b5ef63
--- /dev/null
+++ b/node_modules/svgo/plugins/convertPathData.js
@@ -0,0 +1,1000 @@
+'use strict';
+
+const { computeStyle } = require('../lib/style.js');
+const { pathElems } = require('./_collections.js');
+const { path2js, js2path } = require('./_path.js');
+const { applyTransforms } = require('./_applyTransforms.js');
+const { cleanupOutData } = require('../lib/svgo/tools');
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description =
+  'optimizes path data: writes in shorter form, applies transformations';
+
+exports.params = {
+  applyTransforms: true,
+  applyTransformsStroked: true,
+  makeArcs: {
+    threshold: 2.5, // coefficient of rounding error
+    tolerance: 0.5, // percentage of radius
+  },
+  straightCurves: true,
+  lineShorthands: true,
+  curveSmoothShorthands: true,
+  floatPrecision: 3,
+  transformPrecision: 5,
+  removeUseless: true,
+  collapseRepeated: true,
+  utilizeAbsolute: true,
+  leadingZero: true,
+  negativeExtraSpace: true,
+  noSpaceAfterFlags: false, // a20 60 45 0 1 30 20 → a20 60 45 0130 20
+  forceAbsolutePath: false,
+};
+
+let roundData;
+let precision;
+let error;
+let arcThreshold;
+let arcTolerance;
+
+/**
+ * Convert absolute Path to relative,
+ * collapse repeated instructions,
+ * detect and convert Lineto shorthands,
+ * remove useless instructions like "l0,0",
+ * trim useless delimiters and leading zeros,
+ * decrease accuracy of floating-point numbers.
+ *
+ * @see https://www.w3.org/TR/SVG11/paths.html#PathData
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item, params) {
+  if (
+    item.type === 'element' &&
+    pathElems.includes(item.name) &&
+    item.attributes.d != null
+  ) {
+    const computedStyle = computeStyle(item);
+    precision = params.floatPrecision;
+    error =
+      precision !== false ? +Math.pow(0.1, precision).toFixed(precision) : 1e-2;
+    roundData = precision > 0 && precision < 20 ? strongRound : round;
+    if (params.makeArcs) {
+      arcThreshold = params.makeArcs.threshold;
+      arcTolerance = params.makeArcs.tolerance;
+    }
+    const hasMarkerMid = computedStyle['marker-mid'] != null;
+
+    const maybeHasStroke =
+      computedStyle.stroke &&
+      (computedStyle.stroke.type === 'dynamic' ||
+        computedStyle.stroke.value !== 'none');
+    const maybeHasLinecap =
+      computedStyle['stroke-linecap'] &&
+      (computedStyle['stroke-linecap'].type === 'dynamic' ||
+        computedStyle['stroke-linecap'].value !== 'butt');
+    const maybeHasStrokeAndLinecap = maybeHasStroke && maybeHasLinecap;
+
+    var data = path2js(item);
+
+    // TODO: get rid of functions returns
+    if (data.length) {
+      if (params.applyTransforms) {
+        applyTransforms(item, data, params);
+      }
+
+      convertToRelative(data);
+
+      data = filters(data, params, {
+        maybeHasStrokeAndLinecap,
+        hasMarkerMid,
+      });
+
+      if (params.utilizeAbsolute) {
+        data = convertToMixed(data, params);
+      }
+
+      js2path(item, data, params);
+    }
+  }
+};
+
+/**
+ * Convert absolute path data coordinates to relative.
+ *
+ * @param {Array} path input path data
+ * @param {Object} params plugin params
+ * @return {Array} output path data
+ */
+const convertToRelative = (pathData) => {
+  let start = [0, 0];
+  let cursor = [0, 0];
+  let prevCoords = [0, 0];
+
+  for (let i = 0; i < pathData.length; i += 1) {
+    const pathItem = pathData[i];
+    let { instruction: command, data: args } = pathItem;
+
+    // moveto (x y)
+    if (command === 'm') {
+      // update start and cursor
+      cursor[0] += args[0];
+      cursor[1] += args[1];
+      start[0] = cursor[0];
+      start[1] = cursor[1];
+    }
+    if (command === 'M') {
+      // M → m
+      // skip first moveto
+      if (i !== 0) {
+        command = 'm';
+      }
+      args[0] -= cursor[0];
+      args[1] -= cursor[1];
+      // update start and cursor
+      cursor[0] += args[0];
+      cursor[1] += args[1];
+      start[0] = cursor[0];
+      start[1] = cursor[1];
+    }
+
+    // lineto (x y)
+    if (command === 'l') {
+      cursor[0] += args[0];
+      cursor[1] += args[1];
+    }
+    if (command === 'L') {
+      // L → l
+      command = 'l';
+      args[0] -= cursor[0];
+      args[1] -= cursor[1];
+      cursor[0] += args[0];
+      cursor[1] += args[1];
+    }
+
+    // horizontal lineto (x)
+    if (command === 'h') {
+      cursor[0] += args[0];
+    }
+    if (command === 'H') {
+      // H → h
+      command = 'h';
+      args[0] -= cursor[0];
+      cursor[0] += args[0];
+    }
+
+    // vertical lineto (y)
+    if (command === 'v') {
+      cursor[1] += args[0];
+    }
+    if (command === 'V') {
+      // V → v
+      command = 'v';
+      args[0] -= cursor[1];
+      cursor[1] += args[0];
+    }
+
+    // curveto (x1 y1 x2 y2 x y)
+    if (command === 'c') {
+      cursor[0] += args[4];
+      cursor[1] += args[5];
+    }
+    if (command === 'C') {
+      // C → c
+      command = 'c';
+      args[0] -= cursor[0];
+      args[1] -= cursor[1];
+      args[2] -= cursor[0];
+      args[3] -= cursor[1];
+      args[4] -= cursor[0];
+      args[5] -= cursor[1];
+      cursor[0] += args[4];
+      cursor[1] += args[5];
+    }
+
+    // smooth curveto (x2 y2 x y)
+    if (command === 's') {
+      cursor[0] += args[2];
+      cursor[1] += args[3];
+    }
+    if (command === 'S') {
+      // S → s
+      command = 's';
+      args[0] -= cursor[0];
+      args[1] -= cursor[1];
+      args[2] -= cursor[0];
+      args[3] -= cursor[1];
+      cursor[0] += args[2];
+      cursor[1] += args[3];
+    }
+
+    // quadratic Bézier curveto (x1 y1 x y)
+    if (command === 'q') {
+      cursor[0] += args[2];
+      cursor[1] += args[3];
+    }
+    if (command === 'Q') {
+      // Q → q
+      command = 'q';
+      args[0] -= cursor[0];
+      args[1] -= cursor[1];
+      args[2] -= cursor[0];
+      args[3] -= cursor[1];
+      cursor[0] += args[2];
+      cursor[1] += args[3];
+    }
+
+    // smooth quadratic Bézier curveto (x y)
+    if (command === 't') {
+      cursor[0] += args[0];
+      cursor[1] += args[1];
+    }
+    if (command === 'T') {
+      // T → t
+      command = 't';
+      args[0] -= cursor[0];
+      args[1] -= cursor[1];
+      cursor[0] += args[0];
+      cursor[1] += args[1];
+    }
+
+    // elliptical arc (rx ry x-axis-rotation large-arc-flag sweep-flag x y)
+    if (command === 'a') {
+      cursor[0] += args[5];
+      cursor[1] += args[6];
+    }
+    if (command === 'A') {
+      // A → a
+      command = 'a';
+      args[5] -= cursor[0];
+      args[6] -= cursor[1];
+      cursor[0] += args[5];
+      cursor[1] += args[6];
+    }
+
+    // closepath
+    if (command === 'Z' || command === 'z') {
+      // reset cursor
+      cursor[0] = start[0];
+      cursor[1] = start[1];
+    }
+
+    pathItem.instruction = command;
+    pathItem.data = args;
+    // store absolute coordinates for later use
+    // base should preserve reference from other element
+    pathItem.base = prevCoords;
+    pathItem.coords = [cursor[0], cursor[1]];
+    prevCoords = pathItem.coords;
+  }
+
+  return pathData;
+};
+
+/**
+ * Main filters loop.
+ *
+ * @param {Array} path input path data
+ * @param {Object} params plugin params
+ * @return {Array} output path data
+ */
+function filters(path, params, { maybeHasStrokeAndLinecap, hasMarkerMid }) {
+  var stringify = data2Path.bind(null, params),
+    relSubpoint = [0, 0],
+    pathBase = [0, 0],
+    prev = {};
+
+  path = path.filter(function (item, index, path) {
+    var instruction = item.instruction,
+      data = item.data,
+      next = path[index + 1];
+
+    if (data) {
+      var sdata = data,
+        circle;
+
+      if (instruction === 's') {
+        sdata = [0, 0].concat(data);
+
+        if ('cs'.indexOf(prev.instruction) > -1) {
+          var pdata = prev.data,
+            n = pdata.length;
+
+          // (-x, -y) of the prev tangent point relative to the current point
+          sdata[0] = pdata[n - 2] - pdata[n - 4];
+          sdata[1] = pdata[n - 1] - pdata[n - 3];
+        }
+      }
+
+      // convert curves to arcs if possible
+      if (
+        params.makeArcs &&
+        (instruction == 'c' || instruction == 's') &&
+        isConvex(sdata) &&
+        (circle = findCircle(sdata))
+      ) {
+        var r = roundData([circle.radius])[0],
+          angle = findArcAngle(sdata, circle),
+          sweep = sdata[5] * sdata[0] - sdata[4] * sdata[1] > 0 ? 1 : 0,
+          arc = {
+            instruction: 'a',
+            data: [r, r, 0, 0, sweep, sdata[4], sdata[5]],
+            coords: item.coords.slice(),
+            base: item.base,
+          },
+          output = [arc],
+          // relative coordinates to adjust the found circle
+          relCenter = [
+            circle.center[0] - sdata[4],
+            circle.center[1] - sdata[5],
+          ],
+          relCircle = { center: relCenter, radius: circle.radius },
+          arcCurves = [item],
+          hasPrev = 0,
+          suffix = '',
+          nextLonghand;
+
+        if (
+          (prev.instruction == 'c' &&
+            isConvex(prev.data) &&
+            isArcPrev(prev.data, circle)) ||
+          (prev.instruction == 'a' &&
+            prev.sdata &&
+            isArcPrev(prev.sdata, circle))
+        ) {
+          arcCurves.unshift(prev);
+          arc.base = prev.base;
+          arc.data[5] = arc.coords[0] - arc.base[0];
+          arc.data[6] = arc.coords[1] - arc.base[1];
+          var prevData = prev.instruction == 'a' ? prev.sdata : prev.data;
+          var prevAngle = findArcAngle(prevData, {
+            center: [
+              prevData[4] + circle.center[0],
+              prevData[5] + circle.center[1],
+            ],
+            radius: circle.radius,
+          });
+          angle += prevAngle;
+          if (angle > Math.PI) arc.data[3] = 1;
+          hasPrev = 1;
+        }
+
+        // check if next curves are fitting the arc
+        for (
+          var j = index;
+          (next = path[++j]) && ~'cs'.indexOf(next.instruction);
+
+        ) {
+          var nextData = next.data;
+          if (next.instruction == 's') {
+            nextLonghand = makeLonghand(
+              { instruction: 's', data: next.data.slice() },
+              path[j - 1].data
+            );
+            nextData = nextLonghand.data;
+            nextLonghand.data = nextData.slice(0, 2);
+            suffix = stringify([nextLonghand]);
+          }
+          if (isConvex(nextData) && isArc(nextData, relCircle)) {
+            angle += findArcAngle(nextData, relCircle);
+            if (angle - 2 * Math.PI > 1e-3) break; // more than 360°
+            if (angle > Math.PI) arc.data[3] = 1;
+            arcCurves.push(next);
+            if (2 * Math.PI - angle > 1e-3) {
+              // less than 360°
+              arc.coords = next.coords;
+              arc.data[5] = arc.coords[0] - arc.base[0];
+              arc.data[6] = arc.coords[1] - arc.base[1];
+            } else {
+              // full circle, make a half-circle arc and add a second one
+              arc.data[5] = 2 * (relCircle.center[0] - nextData[4]);
+              arc.data[6] = 2 * (relCircle.center[1] - nextData[5]);
+              arc.coords = [
+                arc.base[0] + arc.data[5],
+                arc.base[1] + arc.data[6],
+              ];
+              arc = {
+                instruction: 'a',
+                data: [
+                  r,
+                  r,
+                  0,
+                  0,
+                  sweep,
+                  next.coords[0] - arc.coords[0],
+                  next.coords[1] - arc.coords[1],
+                ],
+                coords: next.coords,
+                base: arc.coords,
+              };
+              output.push(arc);
+              j++;
+              break;
+            }
+            relCenter[0] -= nextData[4];
+            relCenter[1] -= nextData[5];
+          } else break;
+        }
+
+        if ((stringify(output) + suffix).length < stringify(arcCurves).length) {
+          if (path[j] && path[j].instruction == 's') {
+            makeLonghand(path[j], path[j - 1].data);
+          }
+          if (hasPrev) {
+            var prevArc = output.shift();
+            roundData(prevArc.data);
+            relSubpoint[0] += prevArc.data[5] - prev.data[prev.data.length - 2];
+            relSubpoint[1] += prevArc.data[6] - prev.data[prev.data.length - 1];
+            prev.instruction = 'a';
+            prev.data = prevArc.data;
+            item.base = prev.coords = prevArc.coords;
+          }
+          arc = output.shift();
+          if (arcCurves.length == 1) {
+            item.sdata = sdata.slice(); // preserve curve data for future checks
+          } else if (arcCurves.length - 1 - hasPrev > 0) {
+            // filter out consumed next items
+            path.splice.apply(
+              path,
+              [index + 1, arcCurves.length - 1 - hasPrev].concat(output)
+            );
+          }
+          if (!arc) return false;
+          instruction = 'a';
+          data = arc.data;
+          item.coords = arc.coords;
+        }
+      }
+
+      // Rounding relative coordinates, taking in account accummulating error
+      // to get closer to absolute coordinates. Sum of rounded value remains same:
+      // l .25 3 .25 2 .25 3 .25 2 -> l .3 3 .2 2 .3 3 .2 2
+      if (precision !== false) {
+        if ('mltqsc'.indexOf(instruction) > -1) {
+          for (var i = data.length; i--; ) {
+            data[i] += item.base[i % 2] - relSubpoint[i % 2];
+          }
+        } else if (instruction == 'h') {
+          data[0] += item.base[0] - relSubpoint[0];
+        } else if (instruction == 'v') {
+          data[0] += item.base[1] - relSubpoint[1];
+        } else if (instruction == 'a') {
+          data[5] += item.base[0] - relSubpoint[0];
+          data[6] += item.base[1] - relSubpoint[1];
+        }
+        roundData(data);
+
+        if (instruction == 'h') relSubpoint[0] += data[0];
+        else if (instruction == 'v') relSubpoint[1] += data[0];
+        else {
+          relSubpoint[0] += data[data.length - 2];
+          relSubpoint[1] += data[data.length - 1];
+        }
+        roundData(relSubpoint);
+
+        if (instruction.toLowerCase() == 'm') {
+          pathBase[0] = relSubpoint[0];
+          pathBase[1] = relSubpoint[1];
+        }
+      }
+
+      // convert straight curves into lines segments
+      if (params.straightCurves) {
+        if (
+          (instruction === 'c' && isCurveStraightLine(data)) ||
+          (instruction === 's' && isCurveStraightLine(sdata))
+        ) {
+          if (next && next.instruction == 's') makeLonghand(next, data); // fix up next curve
+          instruction = 'l';
+          data = data.slice(-2);
+        } else if (instruction === 'q' && isCurveStraightLine(data)) {
+          if (next && next.instruction == 't') makeLonghand(next, data); // fix up next curve
+          instruction = 'l';
+          data = data.slice(-2);
+        } else if (
+          instruction === 't' &&
+          prev.instruction !== 'q' &&
+          prev.instruction !== 't'
+        ) {
+          instruction = 'l';
+          data = data.slice(-2);
+        } else if (instruction === 'a' && (data[0] === 0 || data[1] === 0)) {
+          instruction = 'l';
+          data = data.slice(-2);
+        }
+      }
+
+      // horizontal and vertical line shorthands
+      // l 50 0 → h 50
+      // l 0 50 → v 50
+      if (params.lineShorthands && instruction === 'l') {
+        if (data[1] === 0) {
+          instruction = 'h';
+          data.pop();
+        } else if (data[0] === 0) {
+          instruction = 'v';
+          data.shift();
+        }
+      }
+
+      // collapse repeated commands
+      // h 20 h 30 -> h 50
+      if (
+        params.collapseRepeated &&
+        hasMarkerMid === false &&
+        'mhv'.indexOf(instruction) > -1 &&
+        prev.instruction &&
+        instruction == prev.instruction.toLowerCase() &&
+        ((instruction != 'h' && instruction != 'v') ||
+          prev.data[0] >= 0 == data[0] >= 0)
+      ) {
+        prev.data[0] += data[0];
+        if (instruction != 'h' && instruction != 'v') {
+          prev.data[1] += data[1];
+        }
+        prev.coords = item.coords;
+        path[index] = prev;
+        return false;
+      }
+
+      // convert curves into smooth shorthands
+      if (params.curveSmoothShorthands && prev.instruction) {
+        // curveto
+        if (instruction === 'c') {
+          // c + c → c + s
+          if (
+            prev.instruction === 'c' &&
+            data[0] === -(prev.data[2] - prev.data[4]) &&
+            data[1] === -(prev.data[3] - prev.data[5])
+          ) {
+            instruction = 's';
+            data = data.slice(2);
+          }
+
+          // s + c → s + s
+          else if (
+            prev.instruction === 's' &&
+            data[0] === -(prev.data[0] - prev.data[2]) &&
+            data[1] === -(prev.data[1] - prev.data[3])
+          ) {
+            instruction = 's';
+            data = data.slice(2);
+          }
+
+          // [^cs] + c → [^cs] + s
+          else if (
+            'cs'.indexOf(prev.instruction) === -1 &&
+            data[0] === 0 &&
+            data[1] === 0
+          ) {
+            instruction = 's';
+            data = data.slice(2);
+          }
+        }
+
+        // quadratic Bézier curveto
+        else if (instruction === 'q') {
+          // q + q → q + t
+          if (
+            prev.instruction === 'q' &&
+            data[0] === prev.data[2] - prev.data[0] &&
+            data[1] === prev.data[3] - prev.data[1]
+          ) {
+            instruction = 't';
+            data = data.slice(2);
+          }
+
+          // t + q → t + t
+          else if (
+            prev.instruction === 't' &&
+            data[2] === prev.data[0] &&
+            data[3] === prev.data[1]
+          ) {
+            instruction = 't';
+            data = data.slice(2);
+          }
+        }
+      }
+
+      // remove useless non-first path segments
+      if (params.removeUseless && !maybeHasStrokeAndLinecap) {
+        // l 0,0 / h 0 / v 0 / q 0,0 0,0 / t 0,0 / c 0,0 0,0 0,0 / s 0,0 0,0
+        if (
+          'lhvqtcs'.indexOf(instruction) > -1 &&
+          data.every(function (i) {
+            return i === 0;
+          })
+        ) {
+          path[index] = prev;
+          return false;
+        }
+
+        // a 25,25 -30 0,1 0,0
+        if (instruction === 'a' && data[5] === 0 && data[6] === 0) {
+          path[index] = prev;
+          return false;
+        }
+      }
+
+      item.instruction = instruction;
+      item.data = data;
+
+      prev = item;
+    } else {
+      // z resets coordinates
+      relSubpoint[0] = pathBase[0];
+      relSubpoint[1] = pathBase[1];
+      if (prev.instruction == 'z') return false;
+      prev = item;
+    }
+
+    return true;
+  });
+
+  return path;
+}
+
+/**
+ * Writes data in shortest form using absolute or relative coordinates.
+ *
+ * @param {Array} data input path data
+ * @return {Boolean} output
+ */
+function convertToMixed(path, params) {
+  var prev = path[0];
+
+  path = path.filter(function (item, index) {
+    if (index == 0) return true;
+    if (!item.data) {
+      prev = item;
+      return true;
+    }
+
+    var instruction = item.instruction,
+      data = item.data,
+      adata = data && data.slice(0);
+
+    if ('mltqsc'.indexOf(instruction) > -1) {
+      for (var i = adata.length; i--; ) {
+        adata[i] += item.base[i % 2];
+      }
+    } else if (instruction == 'h') {
+      adata[0] += item.base[0];
+    } else if (instruction == 'v') {
+      adata[0] += item.base[1];
+    } else if (instruction == 'a') {
+      adata[5] += item.base[0];
+      adata[6] += item.base[1];
+    }
+
+    roundData(adata);
+
+    var absoluteDataStr = cleanupOutData(adata, params),
+      relativeDataStr = cleanupOutData(data, params);
+
+    // Convert to absolute coordinates if it's shorter or forceAbsolutePath is true.
+    // v-20 -> V0
+    // Don't convert if it fits following previous instruction.
+    // l20 30-10-50 instead of l20 30L20 30
+    if (
+      params.forceAbsolutePath ||
+      (absoluteDataStr.length < relativeDataStr.length &&
+        !(
+          params.negativeExtraSpace &&
+          instruction == prev.instruction &&
+          prev.instruction.charCodeAt(0) > 96 &&
+          absoluteDataStr.length == relativeDataStr.length - 1 &&
+          (data[0] < 0 ||
+            (/^0\./.test(data[0]) && prev.data[prev.data.length - 1] % 1))
+        ))
+    ) {
+      item.instruction = instruction.toUpperCase();
+      item.data = adata;
+    }
+
+    prev = item;
+
+    return true;
+  });
+
+  return path;
+}
+
+/**
+ * Checks if curve is convex. Control points of such a curve must form
+ * a convex quadrilateral with diagonals crosspoint inside of it.
+ *
+ * @param {Array} data input path data
+ * @return {Boolean} output
+ */
+function isConvex(data) {
+  var center = getIntersection([
+    0,
+    0,
+    data[2],
+    data[3],
+    data[0],
+    data[1],
+    data[4],
+    data[5],
+  ]);
+
+  return (
+    center &&
+    data[2] < center[0] == center[0] < 0 &&
+    data[3] < center[1] == center[1] < 0 &&
+    data[4] < center[0] == center[0] < data[0] &&
+    data[5] < center[1] == center[1] < data[1]
+  );
+}
+
+/**
+ * Computes lines equations by two points and returns their intersection point.
+ *
+ * @param {Array} coords 8 numbers for 4 pairs of coordinates (x,y)
+ * @return {Array|undefined} output coordinate of lines' crosspoint
+ */
+function getIntersection(coords) {
+  // Prev line equation parameters.
+  var a1 = coords[1] - coords[3], // y1 - y2
+    b1 = coords[2] - coords[0], // x2 - x1
+    c1 = coords[0] * coords[3] - coords[2] * coords[1], // x1 * y2 - x2 * y1
+    // Next line equation parameters
+    a2 = coords[5] - coords[7], // y1 - y2
+    b2 = coords[6] - coords[4], // x2 - x1
+    c2 = coords[4] * coords[7] - coords[5] * coords[6], // x1 * y2 - x2 * y1
+    denom = a1 * b2 - a2 * b1;
+
+  if (!denom) return; // parallel lines havn't an intersection
+
+  var cross = [(b1 * c2 - b2 * c1) / denom, (a1 * c2 - a2 * c1) / -denom];
+  if (
+    !isNaN(cross[0]) &&
+    !isNaN(cross[1]) &&
+    isFinite(cross[0]) &&
+    isFinite(cross[1])
+  ) {
+    return cross;
+  }
+}
+
+/**
+ * Decrease accuracy of floating-point numbers
+ * in path data keeping a specified number of decimals.
+ * Smart rounds values like 2.3491 to 2.35 instead of 2.349.
+ * Doesn't apply "smartness" if the number precision fits already.
+ *
+ * @param {Array} data input data array
+ * @return {Array} output data array
+ */
+function strongRound(data) {
+  for (var i = data.length; i-- > 0; ) {
+    if (data[i].toFixed(precision) != data[i]) {
+      var rounded = +data[i].toFixed(precision - 1);
+      data[i] =
+        +Math.abs(rounded - data[i]).toFixed(precision + 1) >= error
+          ? +data[i].toFixed(precision)
+          : rounded;
+    }
+  }
+  return data;
+}
+
+/**
+ * Simple rounding function if precision is 0.
+ *
+ * @param {Array} data input data array
+ * @return {Array} output data array
+ */
+function round(data) {
+  for (var i = data.length; i-- > 0; ) {
+    data[i] = Math.round(data[i]);
+  }
+  return data;
+}
+
+/**
+ * Checks if a curve is a straight line by measuring distance
+ * from middle points to the line formed by end points.
+ *
+ * @param {Array} xs array of curve points x-coordinates
+ * @param {Array} ys array of curve points y-coordinates
+ * @return {Boolean}
+ */
+
+function isCurveStraightLine(data) {
+  // Get line equation a·x + b·y + c = 0 coefficients a, b (c = 0) by start and end points.
+  var i = data.length - 2,
+    a = -data[i + 1], // y1 − y2 (y1 = 0)
+    b = data[i], // x2 − x1 (x1 = 0)
+    d = 1 / (a * a + b * b); // same part for all points
+
+  if (i <= 1 || !isFinite(d)) return false; // curve that ends at start point isn't the case
+
+  // Distance from point (x0, y0) to the line is sqrt((c − a·x0 − b·y0)² / (a² + b²))
+  while ((i -= 2) >= 0) {
+    if (Math.sqrt(Math.pow(a * data[i] + b * data[i + 1], 2) * d) > error)
+      return false;
+  }
+
+  return true;
+}
+
+/**
+ * Converts next curve from shorthand to full form using the current curve data.
+ *
+ * @param {Object} item curve to convert
+ * @param {Array} data current curve data
+ */
+
+function makeLonghand(item, data) {
+  switch (item.instruction) {
+    case 's':
+      item.instruction = 'c';
+      break;
+    case 't':
+      item.instruction = 'q';
+      break;
+  }
+  item.data.unshift(
+    data[data.length - 2] - data[data.length - 4],
+    data[data.length - 1] - data[data.length - 3]
+  );
+  return item;
+}
+
+/**
+ * Returns distance between two points
+ *
+ * @param {Array} point1 first point coordinates
+ * @param {Array} point2 second point coordinates
+ * @return {Number} distance
+ */
+
+function getDistance(point1, point2) {
+  return Math.hypot(point1[0] - point2[0], point1[1] - point2[1]);
+}
+
+/**
+ * Returns coordinates of the curve point corresponding to the certain t
+ * a·(1 - t)³·p1 + b·(1 - t)²·t·p2 + c·(1 - t)·t²·p3 + d·t³·p4,
+ * where pN are control points and p1 is zero due to relative coordinates.
+ *
+ * @param {Array} curve array of curve points coordinates
+ * @param {Number} t parametric position from 0 to 1
+ * @return {Array} Point coordinates
+ */
+
+function getCubicBezierPoint(curve, t) {
+  var sqrT = t * t,
+    cubT = sqrT * t,
+    mt = 1 - t,
+    sqrMt = mt * mt;
+
+  return [
+    3 * sqrMt * t * curve[0] + 3 * mt * sqrT * curve[2] + cubT * curve[4],
+    3 * sqrMt * t * curve[1] + 3 * mt * sqrT * curve[3] + cubT * curve[5],
+  ];
+}
+
+/**
+ * Finds circle by 3 points of the curve and checks if the curve fits the found circle.
+ *
+ * @param {Array} curve
+ * @return {Object|undefined} circle
+ */
+
+function findCircle(curve) {
+  var midPoint = getCubicBezierPoint(curve, 1 / 2),
+    m1 = [midPoint[0] / 2, midPoint[1] / 2],
+    m2 = [(midPoint[0] + curve[4]) / 2, (midPoint[1] + curve[5]) / 2],
+    center = getIntersection([
+      m1[0],
+      m1[1],
+      m1[0] + m1[1],
+      m1[1] - m1[0],
+      m2[0],
+      m2[1],
+      m2[0] + (m2[1] - midPoint[1]),
+      m2[1] - (m2[0] - midPoint[0]),
+    ]),
+    radius = center && getDistance([0, 0], center),
+    tolerance = Math.min(arcThreshold * error, (arcTolerance * radius) / 100);
+
+  if (
+    center &&
+    radius < 1e15 &&
+    [1 / 4, 3 / 4].every(function (point) {
+      return (
+        Math.abs(
+          getDistance(getCubicBezierPoint(curve, point), center) - radius
+        ) <= tolerance
+      );
+    })
+  )
+    return { center: center, radius: radius };
+}
+
+/**
+ * Checks if a curve fits the given circle.
+ *
+ * @param {Object} circle
+ * @param {Array} curve
+ * @return {Boolean}
+ */
+
+function isArc(curve, circle) {
+  var tolerance = Math.min(
+    arcThreshold * error,
+    (arcTolerance * circle.radius) / 100
+  );
+
+  return [0, 1 / 4, 1 / 2, 3 / 4, 1].every(function (point) {
+    return (
+      Math.abs(
+        getDistance(getCubicBezierPoint(curve, point), circle.center) -
+          circle.radius
+      ) <= tolerance
+    );
+  });
+}
+
+/**
+ * Checks if a previous curve fits the given circle.
+ *
+ * @param {Object} circle
+ * @param {Array} curve
+ * @return {Boolean}
+ */
+
+function isArcPrev(curve, circle) {
+  return isArc(curve, {
+    center: [circle.center[0] + curve[4], circle.center[1] + curve[5]],
+    radius: circle.radius,
+  });
+}
+
+/**
+ * Finds angle of a curve fitting the given arc.
+
+ * @param {Array} curve
+ * @param {Object} relCircle
+ * @return {Number} angle
+ */
+
+function findArcAngle(curve, relCircle) {
+  var x1 = -relCircle.center[0],
+    y1 = -relCircle.center[1],
+    x2 = curve[4] - relCircle.center[0],
+    y2 = curve[5] - relCircle.center[1];
+
+  return Math.acos(
+    (x1 * x2 + y1 * y2) / Math.sqrt((x1 * x1 + y1 * y1) * (x2 * x2 + y2 * y2))
+  );
+}
+
+/**
+ * Converts given path data to string.
+ *
+ * @param {Object} params
+ * @param {Array} pathData
+ * @return {String}
+ */
+
+function data2Path(params, pathData) {
+  return pathData.reduce(function (pathString, item) {
+    var strData = '';
+    if (item.data) {
+      strData = cleanupOutData(roundData(item.data.slice()), params);
+    }
+    return pathString + item.instruction + strData;
+  }, '');
+}
diff --git a/node_modules/svgo/plugins/convertShapeToPath.js b/node_modules/svgo/plugins/convertShapeToPath.js
new file mode 100644
index 0000000..2b5e9bd
--- /dev/null
+++ b/node_modules/svgo/plugins/convertShapeToPath.js
@@ -0,0 +1,145 @@
+'use strict';
+
+const { stringifyPathData } = require('../lib/path.js');
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'converts basic shapes to more compact path form';
+
+exports.params = {
+  convertArcs: false,
+  floatPrecision: null,
+};
+
+const regNumber = /[-+]?(?:\d*\.\d+|\d+\.?)(?:[eE][-+]?\d+)?/g;
+
+/**
+ * Converts basic shape to more compact path.
+ * It also allows further optimizations like
+ * combining paths with similar attributes.
+ *
+ * @see https://www.w3.org/TR/SVG11/shapes.html
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Lev Solntsev
+ */
+exports.fn = function (item, params) {
+  const precision = params ? params.floatPrecision : null;
+  const convertArcs = params && params.convertArcs;
+
+  if (
+    item.isElem('rect') &&
+    item.attributes.width != null &&
+    item.attributes.height != null &&
+    item.attributes.rx == null &&
+    item.attributes.ry == null
+  ) {
+    const x = Number(item.attributes.x || '0');
+    const y = Number(item.attributes.y || '0');
+    const width = Number(item.attributes.width);
+    const height = Number(item.attributes.height);
+    // Values like '100%' compute to NaN, thus running after
+    // cleanupNumericValues when 'px' units has already been removed.
+    // TODO: Calculate sizes from % and non-px units if possible.
+    if (isNaN(x - y + width - height)) return;
+    const pathData = [
+      { command: 'M', args: [x, y] },
+      { command: 'H', args: [x + width] },
+      { command: 'V', args: [y + height] },
+      { command: 'H', args: [x] },
+      { command: 'z', args: [] },
+    ];
+    item.attributes.d = stringifyPathData({ pathData, precision });
+    item.renameElem('path');
+    delete item.attributes.x;
+    delete item.attributes.y;
+    delete item.attributes.width;
+    delete item.attributes.height;
+  }
+
+  if (item.isElem('line')) {
+    const x1 = Number(item.attributes.x1 || '0');
+    const y1 = Number(item.attributes.y1 || '0');
+    const x2 = Number(item.attributes.x2 || '0');
+    const y2 = Number(item.attributes.y2 || '0');
+    if (isNaN(x1 - y1 + x2 - y2)) return;
+    const pathData = [
+      { command: 'M', args: [x1, y1] },
+      { command: 'L', args: [x2, y2] },
+    ];
+    item.attributes.d = stringifyPathData({ pathData, precision });
+    item.renameElem('path');
+    delete item.attributes.x1;
+    delete item.attributes.y1;
+    delete item.attributes.x2;
+    delete item.attributes.y2;
+  }
+
+  if (
+    (item.isElem('polyline') || item.isElem('polygon')) &&
+    item.attributes.points != null
+  ) {
+    const coords = (item.attributes.points.match(regNumber) || []).map(Number);
+    if (coords.length < 4) return false;
+    const pathData = [];
+    for (let i = 0; i < coords.length; i += 2) {
+      pathData.push({
+        command: i === 0 ? 'M' : 'L',
+        args: coords.slice(i, i + 2),
+      });
+    }
+    if (item.isElem('polygon')) {
+      pathData.push({ command: 'z', args: [] });
+    }
+    item.attributes.d = stringifyPathData({ pathData, precision });
+    item.renameElem('path');
+    delete item.attributes.points;
+  }
+
+  if (item.isElem('circle') && convertArcs) {
+    const cx = Number(item.attributes.cx || '0');
+    const cy = Number(item.attributes.cy || '0');
+    const r = Number(item.attributes.r || '0');
+    if (isNaN(cx - cy + r)) {
+      return;
+    }
+    const pathData = [
+      { command: 'M', args: [cx, cy - r] },
+      { command: 'A', args: [r, r, 0, 1, 0, cx, cy + r] },
+      { command: 'A', args: [r, r, 0, 1, 0, cx, cy - r] },
+      { command: 'z', args: [] },
+    ];
+    item.attributes.d = stringifyPathData({ pathData, precision });
+    item.renameElem('path');
+    delete item.attributes.cx;
+    delete item.attributes.cy;
+    delete item.attributes.r;
+  }
+
+  if (item.isElem('ellipse') && convertArcs) {
+    const ecx = Number(item.attributes.cx || '0');
+    const ecy = Number(item.attributes.cy || '0');
+    const rx = Number(item.attributes.rx || '0');
+    const ry = Number(item.attributes.ry || '0');
+    if (isNaN(ecx - ecy + rx - ry)) {
+      return;
+    }
+    const pathData = [
+      { command: 'M', args: [ecx, ecy - ry] },
+      { command: 'A', args: [rx, ry, 0, 1, 0, ecx, ecy + ry] },
+      { command: 'A', args: [rx, ry, 0, 1, 0, ecx, ecy - ry] },
+      { command: 'z', args: [] },
+    ];
+    item.attributes.d = stringifyPathData({ pathData, precision });
+    item.renameElem('path');
+    delete item.attributes.cx;
+    delete item.attributes.cy;
+    delete item.attributes.rx;
+    delete item.attributes.ry;
+  }
+};
diff --git a/node_modules/svgo/plugins/convertStyleToAttrs.js b/node_modules/svgo/plugins/convertStyleToAttrs.js
new file mode 100644
index 0000000..66f706e
--- /dev/null
+++ b/node_modules/svgo/plugins/convertStyleToAttrs.js
@@ -0,0 +1,130 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = false;
+
+exports.description = 'converts style to attributes';
+
+exports.params = {
+  keepImportant: false,
+};
+
+var stylingProps = require('./_collections').attrsGroups.presentation,
+  rEscape = '\\\\(?:[0-9a-f]{1,6}\\s?|\\r\\n|.)', // Like \" or \2051. Code points consume one space.
+  rAttr = '\\s*(' + g('[^:;\\\\]', rEscape) + '*?)\\s*', // attribute name like ‘fill’
+  rSingleQuotes = "'(?:[^'\\n\\r\\\\]|" + rEscape + ")*?(?:'|$)", // string in single quotes: 'smth'
+  rQuotes = '"(?:[^"\\n\\r\\\\]|' + rEscape + ')*?(?:"|$)', // string in double quotes: "smth"
+  rQuotedString = new RegExp('^' + g(rSingleQuotes, rQuotes) + '$'),
+  // Parentheses, E.g.: url(data:image/png;base64,iVBO...).
+  // ':' and ';' inside of it should be threated as is. (Just like in strings.)
+  rParenthesis =
+    '\\(' + g('[^\'"()\\\\]+', rEscape, rSingleQuotes, rQuotes) + '*?' + '\\)',
+  // The value. It can have strings and parentheses (see above). Fallbacks to anything in case of unexpected input.
+  rValue =
+    '\\s*(' +
+    g(
+      '[^!\'"();\\\\]+?',
+      rEscape,
+      rSingleQuotes,
+      rQuotes,
+      rParenthesis,
+      '[^;]*?'
+    ) +
+    '*?' +
+    ')',
+  // End of declaration. Spaces outside of capturing groups help to do natural trimming.
+  rDeclEnd = '\\s*(?:;\\s*|$)',
+  // Important rule
+  rImportant = '(\\s*!important(?![-(\\w]))?',
+  // Final RegExp to parse CSS declarations.
+  regDeclarationBlock = new RegExp(
+    rAttr + ':' + rValue + rImportant + rDeclEnd,
+    'ig'
+  ),
+  // Comments expression. Honors escape sequences and strings.
+  regStripComments = new RegExp(
+    g(rEscape, rSingleQuotes, rQuotes, '/\\*[^]*?\\*/'),
+    'ig'
+  );
+
+/**
+ * Convert style in attributes. Cleanups comments and illegal declarations (without colon) as a side effect.
+ *
+ * @example
+ * <g style="fill:#000; color: #fff;">
+ *             ⬇
+ * <g fill="#000" color="#fff">
+ *
+ * @example
+ * <g style="fill:#000; color: #fff; -webkit-blah: blah">
+ *             ⬇
+ * <g fill="#000" color="#fff" style="-webkit-blah: blah">
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item, params) {
+  if (item.type === 'element' && item.attributes.style != null) {
+    // ['opacity: 1', 'color: #000']
+    let styles = [];
+    const newAttributes = {};
+
+    // Strip CSS comments preserving escape sequences and strings.
+    const styleValue = item.attributes.style.replace(
+      regStripComments,
+      (match) => {
+        return match[0] == '/'
+          ? ''
+          : match[0] == '\\' && /[-g-z]/i.test(match[1])
+          ? match[1]
+          : match;
+      }
+    );
+
+    regDeclarationBlock.lastIndex = 0;
+    // eslint-disable-next-line no-cond-assign
+    for (var rule; (rule = regDeclarationBlock.exec(styleValue)); ) {
+      if (!params.keepImportant || !rule[3]) {
+        styles.push([rule[1], rule[2]]);
+      }
+    }
+
+    if (styles.length) {
+      styles = styles.filter(function (style) {
+        if (style[0]) {
+          var prop = style[0].toLowerCase(),
+            val = style[1];
+
+          if (rQuotedString.test(val)) {
+            val = val.slice(1, -1);
+          }
+
+          if (stylingProps.includes(prop)) {
+            newAttributes[prop] = val;
+
+            return false;
+          }
+        }
+
+        return true;
+      });
+
+      Object.assign(item.attributes, newAttributes);
+
+      if (styles.length) {
+        item.attributes.style = styles
+          .map((declaration) => declaration.join(':'))
+          .join(';');
+      } else {
+        delete item.attributes.style;
+      }
+    }
+  }
+};
+
+function g() {
+  return '(?:' + Array.prototype.join.call(arguments, '|') + ')';
+}
diff --git a/node_modules/svgo/plugins/convertTransform.js b/node_modules/svgo/plugins/convertTransform.js
new file mode 100644
index 0000000..aa33e96
--- /dev/null
+++ b/node_modules/svgo/plugins/convertTransform.js
@@ -0,0 +1,374 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'collapses multiple transformations and optimizes it';
+
+exports.params = {
+  convertToShorts: true,
+  // degPrecision: 3, // transformPrecision (or matrix precision) - 2 by default
+  floatPrecision: 3,
+  transformPrecision: 5,
+  matrixToTransform: true,
+  shortTranslate: true,
+  shortScale: true,
+  shortRotate: true,
+  removeUseless: true,
+  collapseIntoOne: true,
+  leadingZero: true,
+  negativeExtraSpace: false,
+};
+
+var cleanupOutData = require('../lib/svgo/tools').cleanupOutData,
+  transform2js = require('./_transforms.js').transform2js,
+  transformsMultiply = require('./_transforms.js').transformsMultiply,
+  matrixToTransform = require('./_transforms.js').matrixToTransform,
+  degRound,
+  floatRound,
+  transformRound;
+
+/**
+ * Convert matrices to the short aliases,
+ * convert long translate, scale or rotate transform notations to the shorts ones,
+ * convert transforms to the matrices and multiply them all into one,
+ * remove useless transforms.
+ *
+ * @see https://www.w3.org/TR/SVG11/coords.html#TransformMatrixDefined
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item, params) {
+  if (item.type === 'element') {
+    // transform
+    if (item.attributes.transform != null) {
+      convertTransform(item, 'transform', params);
+    }
+
+    // gradientTransform
+    if (item.attributes.gradientTransform != null) {
+      convertTransform(item, 'gradientTransform', params);
+    }
+
+    // patternTransform
+    if (item.attributes.patternTransform != null) {
+      convertTransform(item, 'patternTransform', params);
+    }
+  }
+};
+
+/**
+ * Main function.
+ *
+ * @param {Object} item input item
+ * @param {String} attrName attribute name
+ * @param {Object} params plugin params
+ */
+function convertTransform(item, attrName, params) {
+  let data = transform2js(item.attributes[attrName]);
+  params = definePrecision(data, params);
+
+  if (params.collapseIntoOne && data.length > 1) {
+    data = [transformsMultiply(data)];
+  }
+
+  if (params.convertToShorts) {
+    data = convertToShorts(data, params);
+  } else {
+    data.forEach(roundTransform);
+  }
+
+  if (params.removeUseless) {
+    data = removeUseless(data);
+  }
+
+  if (data.length) {
+    item.attributes[attrName] = js2transform(data, params);
+  } else {
+    delete item.attributes[attrName];
+  }
+}
+
+/**
+ * Defines precision to work with certain parts.
+ * transformPrecision - for scale and four first matrix parameters (needs a better precision due to multiplying),
+ * floatPrecision - for translate including two last matrix and rotate parameters,
+ * degPrecision - for rotate and skew. By default it's equal to (rougly)
+ * transformPrecision - 2 or floatPrecision whichever is lower. Can be set in params.
+ *
+ * @param {Array} transforms input array
+ * @param {Object} params plugin params
+ * @return {Array} output array
+ */
+function definePrecision(data, params) {
+  var matrixData = data.reduce(getMatrixData, []),
+    significantDigits = params.transformPrecision;
+
+  // Clone params so it don't affect other elements transformations.
+  params = Object.assign({}, params);
+
+  // Limit transform precision with matrix one. Calculating with larger precision doesn't add any value.
+  if (matrixData.length) {
+    params.transformPrecision = Math.min(
+      params.transformPrecision,
+      Math.max.apply(Math, matrixData.map(floatDigits)) ||
+        params.transformPrecision
+    );
+
+    significantDigits = Math.max.apply(
+      Math,
+      matrixData.map(function (n) {
+        return String(n).replace(/\D+/g, '').length; // Number of digits in a number. 123.45 → 5
+      })
+    );
+  }
+  // No sense in angle precision more then number of significant digits in matrix.
+  if (!('degPrecision' in params)) {
+    params.degPrecision = Math.max(
+      0,
+      Math.min(params.floatPrecision, significantDigits - 2)
+    );
+  }
+
+  floatRound =
+    params.floatPrecision >= 1 && params.floatPrecision < 20
+      ? smartRound.bind(this, params.floatPrecision)
+      : round;
+  degRound =
+    params.degPrecision >= 1 && params.floatPrecision < 20
+      ? smartRound.bind(this, params.degPrecision)
+      : round;
+  transformRound =
+    params.transformPrecision >= 1 && params.floatPrecision < 20
+      ? smartRound.bind(this, params.transformPrecision)
+      : round;
+
+  return params;
+}
+
+/**
+ * Gathers four first matrix parameters.
+ *
+ * @param {Array} a array of data
+ * @param {Object} transform
+ * @return {Array} output array
+ */
+function getMatrixData(a, b) {
+  return b.name == 'matrix' ? a.concat(b.data.slice(0, 4)) : a;
+}
+
+/**
+ * Returns number of digits after the point. 0.125 → 3
+ */
+function floatDigits(n) {
+  return (n = String(n)).slice(n.indexOf('.')).length - 1;
+}
+
+/**
+ * Convert transforms to the shorthand alternatives.
+ *
+ * @param {Array} transforms input array
+ * @param {Object} params plugin params
+ * @return {Array} output array
+ */
+function convertToShorts(transforms, params) {
+  for (var i = 0; i < transforms.length; i++) {
+    var transform = transforms[i];
+
+    // convert matrix to the short aliases
+    if (params.matrixToTransform && transform.name === 'matrix') {
+      var decomposed = matrixToTransform(transform, params);
+      if (
+        decomposed != transform &&
+        js2transform(decomposed, params).length <=
+          js2transform([transform], params).length
+      ) {
+        transforms.splice.apply(transforms, [i, 1].concat(decomposed));
+      }
+      transform = transforms[i];
+    }
+
+    // fixed-point numbers
+    // 12.754997 → 12.755
+    roundTransform(transform);
+
+    // convert long translate transform notation to the shorts one
+    // translate(10 0) → translate(10)
+    if (
+      params.shortTranslate &&
+      transform.name === 'translate' &&
+      transform.data.length === 2 &&
+      !transform.data[1]
+    ) {
+      transform.data.pop();
+    }
+
+    // convert long scale transform notation to the shorts one
+    // scale(2 2) → scale(2)
+    if (
+      params.shortScale &&
+      transform.name === 'scale' &&
+      transform.data.length === 2 &&
+      transform.data[0] === transform.data[1]
+    ) {
+      transform.data.pop();
+    }
+
+    // convert long rotate transform notation to the short one
+    // translate(cx cy) rotate(a) translate(-cx -cy) → rotate(a cx cy)
+    if (
+      params.shortRotate &&
+      transforms[i - 2] &&
+      transforms[i - 2].name === 'translate' &&
+      transforms[i - 1].name === 'rotate' &&
+      transforms[i].name === 'translate' &&
+      transforms[i - 2].data[0] === -transforms[i].data[0] &&
+      transforms[i - 2].data[1] === -transforms[i].data[1]
+    ) {
+      transforms.splice(i - 2, 3, {
+        name: 'rotate',
+        data: [
+          transforms[i - 1].data[0],
+          transforms[i - 2].data[0],
+          transforms[i - 2].data[1],
+        ],
+      });
+
+      // splice compensation
+      i -= 2;
+    }
+  }
+
+  return transforms;
+}
+
+/**
+ * Remove useless transforms.
+ *
+ * @param {Array} transforms input array
+ * @return {Array} output array
+ */
+function removeUseless(transforms) {
+  return transforms.filter(function (transform) {
+    // translate(0), rotate(0[, cx, cy]), skewX(0), skewY(0)
+    if (
+      (['translate', 'rotate', 'skewX', 'skewY'].indexOf(transform.name) > -1 &&
+        (transform.data.length == 1 || transform.name == 'rotate') &&
+        !transform.data[0]) ||
+      // translate(0, 0)
+      (transform.name == 'translate' &&
+        !transform.data[0] &&
+        !transform.data[1]) ||
+      // scale(1)
+      (transform.name == 'scale' &&
+        transform.data[0] == 1 &&
+        (transform.data.length < 2 || transform.data[1] == 1)) ||
+      // matrix(1 0 0 1 0 0)
+      (transform.name == 'matrix' &&
+        transform.data[0] == 1 &&
+        transform.data[3] == 1 &&
+        !(
+          transform.data[1] ||
+          transform.data[2] ||
+          transform.data[4] ||
+          transform.data[5]
+        ))
+    ) {
+      return false;
+    }
+
+    return true;
+  });
+}
+
+/**
+ * Convert transforms JS representation to string.
+ *
+ * @param {Array} transformJS JS representation array
+ * @param {Object} params plugin params
+ * @return {String} output string
+ */
+function js2transform(transformJS, params) {
+  var transformString = '';
+
+  // collect output value string
+  transformJS.forEach(function (transform) {
+    roundTransform(transform);
+    transformString +=
+      (transformString && ' ') +
+      transform.name +
+      '(' +
+      cleanupOutData(transform.data, params) +
+      ')';
+  });
+
+  return transformString;
+}
+
+function roundTransform(transform) {
+  switch (transform.name) {
+    case 'translate':
+      transform.data = floatRound(transform.data);
+      break;
+    case 'rotate':
+      transform.data = degRound(transform.data.slice(0, 1)).concat(
+        floatRound(transform.data.slice(1))
+      );
+      break;
+    case 'skewX':
+    case 'skewY':
+      transform.data = degRound(transform.data);
+      break;
+    case 'scale':
+      transform.data = transformRound(transform.data);
+      break;
+    case 'matrix':
+      transform.data = transformRound(transform.data.slice(0, 4)).concat(
+        floatRound(transform.data.slice(4))
+      );
+      break;
+  }
+  return transform;
+}
+
+/**
+ * Rounds numbers in array.
+ *
+ * @param {Array} data input data array
+ * @return {Array} output data array
+ */
+function round(data) {
+  return data.map(Math.round);
+}
+
+/**
+ * Decrease accuracy of floating-point numbers
+ * in transforms keeping a specified number of decimals.
+ * Smart rounds values like 2.349 to 2.35.
+ *
+ * @param {Number} fixed number of decimals
+ * @param {Array} data input data array
+ * @return {Array} output data array
+ */
+function smartRound(precision, data) {
+  for (
+    var i = data.length,
+      tolerance = +Math.pow(0.1, precision).toFixed(precision);
+    i--;
+
+  ) {
+    if (data[i].toFixed(precision) != data[i]) {
+      var rounded = +data[i].toFixed(precision - 1);
+      data[i] =
+        +Math.abs(rounded - data[i]).toFixed(precision + 1) >= tolerance
+          ? +data[i].toFixed(precision)
+          : rounded;
+    }
+  }
+  return data;
+}
diff --git a/node_modules/svgo/plugins/inlineStyles.js b/node_modules/svgo/plugins/inlineStyles.js
new file mode 100644
index 0000000..bacf0b6
--- /dev/null
+++ b/node_modules/svgo/plugins/inlineStyles.js
@@ -0,0 +1,277 @@
+'use strict';
+
+const csstree = require('css-tree');
+const { querySelectorAll, closestByName } = require('../lib/xast.js');
+const cssTools = require('../lib/css-tools');
+
+exports.type = 'full';
+
+exports.active = true;
+
+exports.params = {
+  onlyMatchedOnce: true,
+  removeMatchedSelectors: true,
+  useMqs: ['', 'screen'],
+  usePseudos: [''],
+};
+
+exports.description = 'inline styles (additional options)';
+
+/**
+ * Moves + merges styles from style elements to element styles
+ *
+ * Options
+ *   onlyMatchedOnce (default: true)
+ *     inline only selectors that match once
+ *
+ *   removeMatchedSelectors (default: true)
+ *     clean up matched selectors,
+ *     leave selectors that hadn't matched
+ *
+ *   useMqs (default: ['', 'screen'])
+ *     what media queries to be used
+ *     empty string element for styles outside media queries
+ *
+ *   usePseudos (default: [''])
+ *     what pseudo-classes/-elements to be used
+ *     empty string element for all non-pseudo-classes and/or -elements
+ *
+ * @param {Object} root document element
+ * @param {Object} opts plugin params
+ *
+ * @author strarsis <strarsis@gmail.com>
+ */
+exports.fn = function (root, opts) {
+  // collect <style/>s
+  var styleEls = querySelectorAll(root, 'style');
+
+  //no <styles/>s, nothing to do
+  if (styleEls.length === 0) {
+    return root;
+  }
+
+  var styles = [],
+    selectors = [];
+
+  for (var styleEl of styleEls) {
+    // values other than the empty string or text/css are not used
+    if (
+      styleEl.attributes.type != null &&
+      styleEl.attributes.type !== '' &&
+      styleEl.attributes.type !== 'text/css'
+    ) {
+      continue;
+    }
+    // skip empty <style/>s or <foreignObject> content.
+    if (
+      styleEl.children.length === 0 ||
+      closestByName(styleEl, 'foreignObject')
+    ) {
+      continue;
+    }
+
+    var cssStr = cssTools.getCssStr(styleEl);
+
+    // collect <style/>s and their css ast
+    var cssAst = {};
+    try {
+      cssAst = csstree.parse(cssStr, {
+        parseValue: false,
+        parseCustomProperty: false,
+      });
+    } catch (parseError) {
+      // console.warn('Warning: Parse error of styles of <style/> element, skipped. Error details: ' + parseError);
+      continue;
+    }
+
+    styles.push({
+      styleEl: styleEl,
+      cssAst: cssAst,
+    });
+
+    selectors = selectors.concat(cssTools.flattenToSelectors(cssAst));
+  }
+
+  // filter for mediaqueries to be used or without any mediaquery
+  var selectorsMq = cssTools.filterByMqs(selectors, opts.useMqs);
+
+  // filter for pseudo elements to be used
+  var selectorsPseudo = cssTools.filterByPseudos(selectorsMq, opts.usePseudos);
+
+  // remove PseudoClass from its SimpleSelector for proper matching
+  cssTools.cleanPseudos(selectorsPseudo);
+
+  // stable sort selectors
+  var sortedSelectors = cssTools.sortSelectors(selectorsPseudo).reverse();
+
+  var selector, selectedEl;
+
+  // match selectors
+  for (selector of sortedSelectors) {
+    var selectorStr = csstree.generate(selector.item.data),
+      selectedEls = null;
+
+    try {
+      selectedEls = querySelectorAll(root, selectorStr);
+    } catch (selectError) {
+      // console.warn('Warning: Syntax error when trying to select \n\n' + selectorStr + '\n\n, skipped. Error details: ' + selectError);
+      continue;
+    }
+
+    if (selectedEls.length === 0) {
+      // nothing selected
+      continue;
+    }
+
+    selector.selectedEls = selectedEls;
+  }
+
+  // apply <style/> styles to matched elements
+  for (selector of sortedSelectors) {
+    if (!selector.selectedEls) {
+      continue;
+    }
+
+    if (
+      opts.onlyMatchedOnce &&
+      selector.selectedEls !== null &&
+      selector.selectedEls.length > 1
+    ) {
+      // skip selectors that match more than once if option onlyMatchedOnce is enabled
+      continue;
+    }
+
+    // apply <style/> to matched elements
+    for (selectedEl of selector.selectedEls) {
+      if (selector.rule === null) {
+        continue;
+      }
+
+      // merge declarations
+      csstree.walk(selector.rule, {
+        visit: 'Declaration',
+        enter: function (styleCsstreeDeclaration) {
+          // existing inline styles have higher priority
+          // no inline styles, external styles,                                    external styles used
+          // inline styles,    external styles same   priority as inline styles,   inline   styles used
+          // inline styles,    external styles higher priority than inline styles, external styles used
+          var styleDeclaration = cssTools.csstreeToStyleDeclaration(
+            styleCsstreeDeclaration
+          );
+          if (
+            selectedEl.style.getPropertyValue(styleDeclaration.name) !== null &&
+            selectedEl.style.getPropertyPriority(styleDeclaration.name) >=
+              styleDeclaration.priority
+          ) {
+            return;
+          }
+          selectedEl.style.setProperty(
+            styleDeclaration.name,
+            styleDeclaration.value,
+            styleDeclaration.priority
+          );
+        },
+      });
+    }
+
+    if (
+      opts.removeMatchedSelectors &&
+      selector.selectedEls !== null &&
+      selector.selectedEls.length > 0
+    ) {
+      // clean up matching simple selectors if option removeMatchedSelectors is enabled
+      selector.rule.prelude.children.remove(selector.item);
+    }
+  }
+
+  if (!opts.removeMatchedSelectors) {
+    return root; // no further processing required
+  }
+
+  // clean up matched class + ID attribute values
+  for (selector of sortedSelectors) {
+    if (!selector.selectedEls) {
+      continue;
+    }
+
+    if (
+      opts.onlyMatchedOnce &&
+      selector.selectedEls !== null &&
+      selector.selectedEls.length > 1
+    ) {
+      // skip selectors that match more than once if option onlyMatchedOnce is enabled
+      continue;
+    }
+
+    for (selectedEl of selector.selectedEls) {
+      // class
+      var firstSubSelector = selector.item.data.children.first();
+      if (firstSubSelector.type === 'ClassSelector') {
+        selectedEl.class.remove(firstSubSelector.name);
+      }
+      // clean up now empty class attributes
+      if (typeof selectedEl.class.item(0) === 'undefined') {
+        delete selectedEl.attributes.class;
+      }
+
+      // ID
+      if (firstSubSelector.type === 'IdSelector') {
+        if (selectedEl.attributes.id === firstSubSelector.name) {
+          delete selectedEl.attributes.id;
+        }
+      }
+    }
+  }
+
+  // clean up now empty elements
+  for (var style of styles) {
+    csstree.walk(style.cssAst, {
+      visit: 'Rule',
+      enter: function (node, item, list) {
+        // clean up <style/> atrules without any rulesets left
+        if (
+          node.type === 'Atrule' &&
+          // only Atrules containing rulesets
+          node.block !== null &&
+          node.block.children.isEmpty()
+        ) {
+          list.remove(item);
+          return;
+        }
+
+        // clean up <style/> rulesets without any css selectors left
+        if (node.type === 'Rule' && node.prelude.children.isEmpty()) {
+          list.remove(item);
+        }
+      },
+    });
+
+    if (style.cssAst.children.isEmpty()) {
+      // clean up now emtpy <style/>s
+      var styleParentEl = style.styleEl.parentNode;
+      styleParentEl.spliceContent(
+        styleParentEl.children.indexOf(style.styleEl),
+        1
+      );
+
+      if (
+        styleParentEl.name === 'defs' &&
+        styleParentEl.children.length === 0
+      ) {
+        // also clean up now empty <def/>s
+        var defsParentEl = styleParentEl.parentNode;
+        defsParentEl.spliceContent(
+          defsParentEl.children.indexOf(styleParentEl),
+          1
+        );
+      }
+
+      continue;
+    }
+
+    // update existing, left over <style>s
+    cssTools.setCssStr(style.styleEl, csstree.generate(style.cssAst));
+  }
+
+  return root;
+};
diff --git a/node_modules/svgo/plugins/mergePaths.js b/node_modules/svgo/plugins/mergePaths.js
new file mode 100644
index 0000000..db20501
--- /dev/null
+++ b/node_modules/svgo/plugins/mergePaths.js
@@ -0,0 +1,80 @@
+'use strict';
+
+const { computeStyle } = require('../lib/style.js');
+const { path2js, js2path, intersects } = require('./_path.js');
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'merges multiple paths in one if possible';
+
+exports.params = {
+  collapseRepeated: true,
+  force: false,
+  leadingZero: true,
+  negativeExtraSpace: true,
+  noSpaceAfterFlags: false, // a20 60 45 0 1 30 20 → a20 60 45 0130 20
+};
+
+/**
+ * Merge multiple Paths into one.
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich, Lev Solntsev
+ */
+exports.fn = function (item, params) {
+  if (item.type !== 'element' || item.children.length === 0) return;
+
+  let prevContentItem = null;
+  let prevContentItemKeys = null;
+
+  item.children = item.children.filter(function (contentItem) {
+    if (
+      prevContentItem &&
+      prevContentItem.isElem('path') &&
+      prevContentItem.children.length === 0 &&
+      prevContentItem.attributes.d != null &&
+      contentItem.isElem('path') &&
+      contentItem.children.length === 0 &&
+      contentItem.attributes.d != null
+    ) {
+      const computedStyle = computeStyle(contentItem);
+      // keep path to not break markers
+      if (
+        computedStyle['marker-start'] ||
+        computedStyle['marker-mid'] ||
+        computedStyle['marker-end']
+      ) {
+        return true;
+      }
+      if (!prevContentItemKeys) {
+        prevContentItemKeys = Object.keys(prevContentItem.attributes);
+      }
+
+      const contentItemAttrs = Object.keys(contentItem.attributes);
+      const equalData =
+        prevContentItemKeys.length == contentItemAttrs.length &&
+        contentItemAttrs.every(function (key) {
+          return (
+            key == 'd' ||
+            (prevContentItem.attributes[key] != null &&
+              prevContentItem.attributes[key] == contentItem.attributes[key])
+          );
+        });
+      const prevPathJS = path2js(prevContentItem);
+      const curPathJS = path2js(contentItem);
+
+      if (equalData && (params.force || !intersects(prevPathJS, curPathJS))) {
+        js2path(prevContentItem, prevPathJS.concat(curPathJS), params);
+        return false;
+      }
+    }
+
+    prevContentItem = contentItem;
+    prevContentItemKeys = null;
+    return true;
+  });
+};
diff --git a/node_modules/svgo/plugins/mergeStyles.js b/node_modules/svgo/plugins/mergeStyles.js
new file mode 100644
index 0000000..c57a502
--- /dev/null
+++ b/node_modules/svgo/plugins/mergeStyles.js
@@ -0,0 +1,85 @@
+'use strict';
+
+const { closestByName, detachNodeFromParent } = require('../lib/xast.js');
+const JSAPI = require('../lib/svgo/jsAPI.js');
+
+exports.type = 'visitor';
+exports.active = true;
+exports.description = 'merge multiple style elements into one';
+
+/**
+ * Merge multiple style elements into one.
+ *
+ * @author strarsis <strarsis@gmail.com>
+ */
+exports.fn = () => {
+  let firstStyleElement = null;
+  let collectedStyles = '';
+  let styleContentType = 'text';
+
+  const enterElement = (node) => {
+    // collect style elements
+    if (node.name !== 'style') {
+      return;
+    }
+
+    // skip <style> with invalid type attribute
+    if (
+      node.attributes.type != null &&
+      node.attributes.type !== '' &&
+      node.attributes.type !== 'text/css'
+    ) {
+      return;
+    }
+
+    // skip <foreignObject> content
+    if (closestByName(node, 'foreignObject')) {
+      return;
+    }
+
+    // extract style element content
+    let css = '';
+    for (const child of node.children) {
+      if (child.type === 'text') {
+        css += child.value;
+      }
+      if (child.type === 'cdata') {
+        styleContentType = 'cdata';
+        css += child.value;
+      }
+    }
+
+    // remove empty style elements
+    if (css.trim().length === 0) {
+      detachNodeFromParent(node);
+      return;
+    }
+
+    // collect css and wrap with media query if present in attribute
+    if (node.attributes.media == null) {
+      collectedStyles += css;
+    } else {
+      collectedStyles += `@media ${node.attributes.media}{${css}}`;
+      delete node.attributes.media;
+    }
+
+    // combine collected styles in the first style element
+    if (firstStyleElement == null) {
+      firstStyleElement = node;
+    } else {
+      detachNodeFromParent(node);
+      firstStyleElement.children = [
+        new JSAPI(
+          { type: styleContentType, value: collectedStyles },
+          firstStyleElement
+        ),
+      ];
+    }
+  };
+
+  return {
+    element: {
+      enter: enterElement,
+    },
+  };
+};
diff --git a/node_modules/svgo/plugins/minifyStyles.js b/node_modules/svgo/plugins/minifyStyles.js
new file mode 100644
index 0000000..a3aa588
--- /dev/null
+++ b/node_modules/svgo/plugins/minifyStyles.js
@@ -0,0 +1,151 @@
+'use strict';
+
+const csso = require('csso');
+const { traverse } = require('../lib/xast.js');
+
+exports.type = 'full';
+
+exports.active = true;
+
+exports.description =
+  'minifies styles and removes unused styles based on usage data';
+
+exports.params = {
+  // ... CSSO options goes here
+
+  // additional
+  usage: {
+    force: false, // force to use usage data even if it unsafe (document contains <script> or on* attributes)
+    ids: true,
+    classes: true,
+    tags: true,
+  },
+};
+
+/**
+ * Minifies styles (<style> element + style attribute) using CSSO
+ *
+ * @author strarsis <strarsis@gmail.com>
+ */
+exports.fn = function (ast, options) {
+  options = options || {};
+
+  var minifyOptionsForStylesheet = cloneObject(options);
+  var minifyOptionsForAttribute = cloneObject(options);
+  var elems = findStyleElems(ast);
+
+  minifyOptionsForStylesheet.usage = collectUsageData(ast, options);
+  minifyOptionsForAttribute.usage = null;
+
+  elems.forEach(function (elem) {
+    if (elem.isElem('style')) {
+      if (
+        elem.children[0].type === 'text' ||
+        elem.children[0].type === 'cdata'
+      ) {
+        const styleCss = elem.children[0].value;
+        const minified = csso.minify(styleCss, minifyOptionsForStylesheet).css;
+        // preserve cdata if necessary
+        // TODO split cdata -> text optimisation into separate plugin
+        if (styleCss.indexOf('>') >= 0 || styleCss.indexOf('<') >= 0) {
+          elem.children[0].type = 'cdata';
+          elem.children[0].value = minified;
+        } else {
+          elem.children[0].type = 'text';
+          elem.children[0].value = minified;
+        }
+      }
+    } else {
+      // style attribute
+      var elemStyle = elem.attributes.style;
+
+      elem.attributes.style = csso.minifyBlock(
+        elemStyle,
+        minifyOptionsForAttribute
+      ).css;
+    }
+  });
+
+  return ast;
+};
+
+function cloneObject(obj) {
+  return { ...obj };
+}
+
+function findStyleElems(ast) {
+  const nodesWithStyles = [];
+  traverse(ast, (node) => {
+    if (node.type === 'element') {
+      if (node.name === 'style' && node.children.length !== 0) {
+        nodesWithStyles.push(node);
+      } else if (node.attributes.style != null) {
+        nodesWithStyles.push(node);
+      }
+    }
+  });
+  return nodesWithStyles;
+}
+
+function shouldFilter(options, name) {
+  if ('usage' in options === false) {
+    return true;
+  }
+
+  if (options.usage && name in options.usage === false) {
+    return true;
+  }
+
+  return Boolean(options.usage && options.usage[name]);
+}
+
+function collectUsageData(ast, options) {
+  let safe = true;
+  const usageData = {};
+  let hasData = false;
+  const rawData = {
+    ids: Object.create(null),
+    classes: Object.create(null),
+    tags: Object.create(null),
+  };
+
+  traverse(ast, (node) => {
+    if (node.type === 'element') {
+      if (node.name === 'script') {
+        safe = false;
+      }
+
+      rawData.tags[node.name] = true;
+
+      if (node.attributes.id != null) {
+        rawData.ids[node.attributes.id] = true;
+      }
+
+      if (node.attributes.class != null) {
+        node.attributes.class
+          .replace(/^\s+|\s+$/g, '')
+          .split(/\s+/)
+          .forEach((className) => {
+            rawData.classes[className] = true;
+          });
+      }
+
+      if (Object.keys(node.attributes).some((name) => /^on/i.test(name))) {
+        safe = false;
+      }
+    }
+  });
+
+  if (!safe && options.usage && options.usage.force) {
+    safe = true;
+  }
+
+  for (const [key, data] of Object.entries(rawData)) {
+    if (shouldFilter(options, key)) {
+      usageData[key] = Object.keys(data);
+      hasData = true;
+    }
+  }
+
+  return safe && hasData ? usageData : null;
+}
diff --git a/node_modules/svgo/plugins/moveElemsAttrsToGroup.js b/node_modules/svgo/plugins/moveElemsAttrsToGroup.js
new file mode 100644
index 0000000..a2a0c42
--- /dev/null
+++ b/node_modules/svgo/plugins/moveElemsAttrsToGroup.js
@@ -0,0 +1,122 @@
+'use strict';
+
+const { inheritableAttrs, pathElems } = require('./_collections');
+
+exports.type = 'perItemReverse';
+
+exports.active = true;
+
+exports.description = 'moves elements attributes to the existing group wrapper';
+
+/**
+ * Collapse content's intersected and inheritable
+ * attributes to the existing group wrapper.
+ *
+ * @example
+ * <g attr1="val1">
+ *     <g attr2="val2">
+ *         text
+ *     </g>
+ *     <circle attr2="val2" attr3="val3"/>
+ * </g>
+ *              ⬇
+ * <g attr1="val1" attr2="val2">
+ *     <g>
+ *         text
+ *     </g>
+ *    <circle attr3="val3"/>
+ * </g>
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item) {
+  if (
+    item.type === 'element' &&
+    item.name === 'g' &&
+    item.children.length > 1
+  ) {
+    var intersection = {},
+      hasTransform = false,
+      hasClip =
+        item.attributes['clip-path'] != null || item.attributes.mask != null,
+      intersected = item.children.every(function (inner) {
+        if (
+          inner.type === 'element' &&
+          Object.keys(inner.attributes).length !== 0
+        ) {
+          // don't mess with possible styles (hack until CSS parsing is implemented)
+          if (inner.attributes.class) return false;
+          if (!Object.keys(intersection).length) {
+            intersection = inner.attributes;
+          } else {
+            intersection = intersectInheritableAttrs(
+              intersection,
+              inner.attributes
+            );
+
+            if (!intersection) return false;
+          }
+
+          return true;
+        }
+      }),
+      allPath = item.children.every(function (inner) {
+        return inner.isElem(pathElems);
+      });
+
+    if (intersected) {
+      item.children.forEach(function (g) {
+        for (const [name, value] of Object.entries(intersection)) {
+          if ((!allPath && !hasClip) || name !== 'transform') {
+            delete g.attributes[name];
+
+            if (name === 'transform') {
+              if (!hasTransform) {
+                if (item.attributes.transform != null) {
+                  item.attributes.transform =
+                    item.attributes.transform + ' ' + value;
+                } else {
+                  item.attributes.transform = value;
+                }
+
+                hasTransform = true;
+              }
+            } else {
+              item.attributes[name] = value;
+            }
+          }
+        }
+      });
+    }
+  }
+};
+
+/**
+ * Intersect inheritable attributes.
+ *
+ * @param {Object} a first attrs object
+ * @param {Object} b second attrs object
+ *
+ * @return {Object} intersected attrs object
+ */
+function intersectInheritableAttrs(a, b) {
+  var c = {};
+
+  for (const [name, value] of Object.entries(a)) {
+    if (
+      // eslint-disable-next-line no-prototype-builtins
+      b.hasOwnProperty(name) &&
+      inheritableAttrs.includes(name) &&
+      value === b[name]
+    ) {
+      c[name] = value;
+    }
+  }
+
+  if (!Object.keys(c).length) return false;
+
+  return c;
+}
diff --git a/node_modules/svgo/plugins/moveGroupAttrsToElems.js b/node_modules/svgo/plugins/moveGroupAttrsToElems.js
new file mode 100644
index 0000000..4d798f5
--- /dev/null
+++ b/node_modules/svgo/plugins/moveGroupAttrsToElems.js
@@ -0,0 +1,60 @@
+'use strict';
+
+const { pathElems, referencesProps } = require('./_collections.js');
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'moves some group attributes to the content elements';
+
+const pathElemsWithGroupsAndText = [...pathElems, 'g', 'text'];
+
+/**
+ * Move group attrs to the content elements.
+ *
+ * @example
+ * <g transform="scale(2)">
+ *     <path transform="rotate(45)" d="M0,0 L10,20"/>
+ *     <path transform="translate(10, 20)" d="M0,10 L20,30"/>
+ * </g>
+ *                          ⬇
+ * <g>
+ *     <path transform="scale(2) rotate(45)" d="M0,0 L10,20"/>
+ *     <path transform="scale(2) translate(10, 20)" d="M0,10 L20,30"/>
+ * </g>
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item) {
+  // move group transform attr to content's pathElems
+  if (
+    item.type === 'element' &&
+    item.name === 'g' &&
+    item.children.length !== 0 &&
+    item.attributes.transform != null &&
+    Object.entries(item.attributes).some(
+      ([name, value]) =>
+        referencesProps.includes(name) && value.includes('url(')
+    ) === false &&
+    item.children.every(
+      (inner) =>
+        pathElemsWithGroupsAndText.includes(inner.name) &&
+        inner.attributes.id == null
+    )
+  ) {
+    for (const inner of item.children) {
+      const value = item.attributes.transform;
+      if (inner.attributes.transform != null) {
+        inner.attributes.transform = value + ' ' + inner.attributes.transform;
+      } else {
+        inner.attributes.transform = value;
+      }
+    }
+
+    delete item.attributes.transform;
+  }
+};
diff --git a/node_modules/svgo/plugins/plugins.js b/node_modules/svgo/plugins/plugins.js
new file mode 100644
index 0000000..da8bc03
--- /dev/null
+++ b/node_modules/svgo/plugins/plugins.js
@@ -0,0 +1,52 @@
+'use strict';
+
+exports.addAttributesToSVGElement = require('./addAttributesToSVGElement.js');
+exports.addClassesToSVGElement = require('./addClassesToSVGElement.js');
+exports.cleanupAttrs = require('./cleanupAttrs.js');
+exports.cleanupEnableBackground = require('./cleanupEnableBackground.js');
+exports.cleanupIDs = require('./cleanupIDs.js');
+exports.cleanupListOfValues = require('./cleanupListOfValues.js');
+exports.cleanupNumericValues = require('./cleanupNumericValues.js');
+exports.collapseGroups = require('./collapseGroups.js');
+exports.convertColors = require('./convertColors.js');
+exports.convertEllipseToCircle = require('./convertEllipseToCircle.js');
+exports.convertPathData = require('./convertPathData.js');
+exports.convertShapeToPath = require('./convertShapeToPath.js');
+exports.convertStyleToAttrs = require('./convertStyleToAttrs.js');
+exports.convertTransform = require('./convertTransform.js');
+exports.mergeStyles = require('./mergeStyles.js');
+exports.inlineStyles = require('./inlineStyles.js');
+exports.mergePaths = require('./mergePaths.js');
+exports.minifyStyles = require('./minifyStyles.js');
+exports.moveElemsAttrsToGroup = require('./moveElemsAttrsToGroup.js');
+exports.moveGroupAttrsToElems = require('./moveGroupAttrsToElems.js');
+exports.prefixIds = require('./prefixIds.js');
+exports.removeAttributesBySelector = require('./removeAttributesBySelector.js');
+exports.removeAttrs = require('./removeAttrs.js');
+exports.removeComments = require('./removeComments.js');
+exports.removeDesc = require('./removeDesc.js');
+exports.removeDimensions = require('./removeDimensions.js');
+exports.removeDoctype = require('./removeDoctype.js');
+exports.removeEditorsNSData = require('./removeEditorsNSData.js');
+exports.removeElementsByAttr = require('./removeElementsByAttr.js');
+exports.removeEmptyAttrs = require('./removeEmptyAttrs.js');
+exports.removeEmptyContainers = require('./removeEmptyContainers.js');
+exports.removeEmptyText = require('./removeEmptyText.js');
+exports.removeHiddenElems = require('./removeHiddenElems.js');
+exports.removeMetadata = require('./removeMetadata.js');
+exports.removeNonInheritableGroupAttrs = require('./removeNonInheritableGroupAttrs.js');
+exports.removeOffCanvasPaths = require('./removeOffCanvasPaths.js');
+exports.removeRasterImages = require('./removeRasterImages.js');
+exports.removeScriptElement = require('./removeScriptElement.js');
+exports.removeStyleElement = require('./removeStyleElement.js');
+exports.removeTitle = require('./removeTitle.js');
+exports.removeUnknownsAndDefaults = require('./removeUnknownsAndDefaults.js');
+exports.removeUnusedNS = require('./removeUnusedNS.js');
+exports.removeUselessDefs = require('./removeUselessDefs.js');
+exports.removeUselessStrokeAndFill = require('./removeUselessStrokeAndFill.js');
+exports.removeViewBox = require('./removeViewBox.js');
+exports.removeXMLNS = require('./removeXMLNS.js');
+exports.removeXMLProcInst = require('./removeXMLProcInst.js');
+exports.reusePaths = require('./reusePaths.js');
+exports.sortAttrs = require('./sortAttrs.js');
+exports.sortDefsChildren = require('./sortDefsChildren.js');
diff --git a/node_modules/svgo/plugins/prefixIds.js b/node_modules/svgo/plugins/prefixIds.js
new file mode 100644
index 0000000..42ea528
--- /dev/null
+++ b/node_modules/svgo/plugins/prefixIds.js
@@ -0,0 +1,298 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = false;
+
+exports.params = {
+  delim: '__',
+  prefixIds: true,
+  prefixClassNames: true,
+};
+
+exports.description = 'prefix IDs';
+
+var csstree = require('css-tree'),
+  collections = require('./_collections.js'),
+  referencesProps = collections.referencesProps,
+  rxId = /^#(.*)$/, // regular expression for matching an ID + extracing its name
+  addPrefix = null;
+
+const unquote = (string) => {
+  const first = string.charAt(0);
+  if (first === "'" || first === '"') {
+    if (first === string.charAt(string.length - 1)) {
+      return string.slice(1, -1);
+    }
+  }
+  return string;
+};
+
+// Escapes a string for being used as ID
+var escapeIdentifierName = function (str) {
+  return str.replace(/[. ]/g, '_');
+};
+
+// Matches an #ID value, captures the ID name
+var matchId = function (urlVal) {
+  var idUrlMatches = urlVal.match(rxId);
+  if (idUrlMatches === null) {
+    return false;
+  }
+  return idUrlMatches[1];
+};
+
+// Matches an url(...) value, captures the URL
+var matchUrl = function (val) {
+  var urlMatches = /url\((.*?)\)/gi.exec(val);
+  if (urlMatches === null) {
+    return false;
+  }
+  return urlMatches[1];
+};
+
+// prefixes an #ID
+var prefixId = function (val) {
+  var idName = matchId(val);
+  if (!idName) {
+    return false;
+  }
+  return '#' + addPrefix(idName);
+};
+
+// prefixes a class attribute value
+const addPrefixToClassAttr = (element, name) => {
+  if (
+    element.attributes[name] == null ||
+    element.attributes[name].length === 0
+  ) {
+    return;
+  }
+
+  element.attributes[name] = element.attributes[name]
+    .split(/\s+/)
+    .map(addPrefix)
+    .join(' ');
+};
+
+// prefixes an ID attribute value
+const addPrefixToIdAttr = (element, name) => {
+  if (
+    element.attributes[name] == null ||
+    element.attributes[name].length === 0
+  ) {
+    return;
+  }
+
+  element.attributes[name] = addPrefix(element.attributes[name]);
+};
+
+// prefixes a href attribute value
+const addPrefixToHrefAttr = (element, name) => {
+  if (
+    element.attributes[name] == null ||
+    element.attributes[name].length === 0
+  ) {
+    return;
+  }
+
+  const idPrefixed = prefixId(element.attributes[name]);
+  if (!idPrefixed) {
+    return;
+  }
+  element.attributes[name] = idPrefixed;
+};
+
+// prefixes an URL attribute value
+const addPrefixToUrlAttr = (element, name) => {
+  if (
+    element.attributes[name] == null ||
+    element.attributes[name].length === 0
+  ) {
+    return;
+  }
+
+  // url(...) in value
+  const urlVal = matchUrl(element.attributes[name]);
+  if (!urlVal) {
+    return;
+  }
+
+  const idPrefixed = prefixId(urlVal);
+  if (!idPrefixed) {
+    return;
+  }
+
+  element.attributes[name] = 'url(' + idPrefixed + ')';
+};
+
+// prefixes begin/end attribute value
+const addPrefixToBeginEndAttr = (element, name) => {
+  if (
+    element.attributes[name] == null ||
+    element.attributes[name].length === 0
+  ) {
+    return;
+  }
+
+  const parts = element.attributes[name].split('; ').map((val) => {
+    val = val.trim();
+
+    if (val.endsWith('.end') || val.endsWith('.start')) {
+      const [id, postfix] = val.split('.');
+
+      let idPrefixed = prefixId(`#${id}`);
+
+      if (!idPrefixed) {
+        return val;
+      }
+
+      idPrefixed = idPrefixed.slice(1);
+      return `${idPrefixed}.${postfix}`;
+    } else {
+      return val;
+    }
+  });
+
+  element.attributes[name] = parts.join('; ');
+};
+
+const getBasename = (path) => {
+  // extract everything after latest slash or backslash
+  const matched = path.match(/[/\\]([^/\\]+)$/);
+  if (matched) {
+    return matched[1];
+  }
+  return '';
+};
+
+/**
+ * Prefixes identifiers
+ *
+ * @param {Object} node node
+ * @param {Object} opts plugin params
+ * @param {Object} extra plugin extra information
+ *
+ * @author strarsis <strarsis@gmail.com>
+ */
+exports.fn = function (node, opts, extra) {
+  // skip subsequent passes when multipass is used
+  if (extra.multipassCount && extra.multipassCount > 0) {
+    return;
+  }
+
+  // prefix, from file name or option
+  var prefix = 'prefix';
+  if (opts.prefix) {
+    if (typeof opts.prefix === 'function') {
+      prefix = opts.prefix(node, extra);
+    } else {
+      prefix = opts.prefix;
+    }
+  } else if (opts.prefix === false) {
+    prefix = false;
+  } else if (extra && extra.path && extra.path.length > 0) {
+    var filename = getBasename(extra.path);
+    prefix = filename;
+  }
+
+  // prefixes a normal value
+  addPrefix = function (name) {
+    if (prefix === false) {
+      return escapeIdentifierName(name);
+    }
+    return escapeIdentifierName(prefix + opts.delim + name);
+  };
+
+  // <style/> property values
+
+  if (node.type === 'element' && node.name === 'style') {
+    if (node.children.length === 0) {
+      // skip empty <style/>s
+      return;
+    }
+
+    var cssStr = '';
+    if (node.children[0].type === 'text' || node.children[0].type === 'cdata') {
+      cssStr = node.children[0].value;
+    }
+
+    var cssAst = {};
+    try {
+      cssAst = csstree.parse(cssStr, {
+        parseValue: true,
+        parseCustomProperty: false,
+      });
+    } catch (parseError) {
+      console.warn(
+        'Warning: Parse error of styles of <style/> element, skipped. Error details: ' +
+          parseError
+      );
+      return;
+    }
+
+    var idPrefixed = '';
+    csstree.walk(cssAst, function (node) {
+      // #ID, .class
+      if (
+        ((opts.prefixIds && node.type === 'IdSelector') ||
+          (opts.prefixClassNames && node.type === 'ClassSelector')) &&
+        node.name
+      ) {
+        node.name = addPrefix(node.name);
+        return;
+      }
+
+      // url(...) in value
+      if (
+        node.type === 'Url' &&
+        node.value.value &&
+        node.value.value.length > 0
+      ) {
+        idPrefixed = prefixId(unquote(node.value.value));
+        if (!idPrefixed) {
+          return;
+        }
+        node.value.value = idPrefixed;
+      }
+    });
+
+    // update <style>s
+    node.children[0].value = csstree.generate(cssAst);
+    return;
+  }
+
+  // element attributes
+
+  if (node.type !== 'element') {
+    return;
+  }
+
+  // Nodes
+
+  if (opts.prefixIds) {
+    // ID
+    addPrefixToIdAttr(node, 'id');
+  }
+
+  if (opts.prefixClassNames) {
+    // Class
+    addPrefixToClassAttr(node, 'class');
+  }
+
+  // References
+
+  // href
+  addPrefixToHrefAttr(node, 'href');
+
+  // (xlink:)href (deprecated, must be still supported)
+  addPrefixToHrefAttr(node, 'xlink:href');
+
+  // (referenceable) properties
+  for (var referencesProp of referencesProps) {
+    addPrefixToUrlAttr(node, referencesProp);
+  }
+
+  addPrefixToBeginEndAttr(node, 'begin');
+  addPrefixToBeginEndAttr(node, 'end');
+};
diff --git a/node_modules/svgo/plugins/removeAttributesBySelector.js b/node_modules/svgo/plugins/removeAttributesBySelector.js
new file mode 100644
index 0000000..1f51e73
--- /dev/null
+++ b/node_modules/svgo/plugins/removeAttributesBySelector.js
@@ -0,0 +1,74 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = false;
+
+exports.description =
+  'removes attributes of elements that match a css selector';
+
+/**
+ * Removes attributes of elements that match a css selector.
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @example
+ * <caption>A selector removing a single attribute</caption>
+ * plugins:
+ *   - removeAttributesBySelector:
+ *       selector: "[fill='#00ff00']"
+ *       attributes: "fill"
+ *
+ * <rect x="0" y="0" width="100" height="100" fill="#00ff00" stroke="#00ff00"/>
+ *   ↓
+ * <rect x="0" y="0" width="100" height="100" stroke="#00ff00"/>
+ *
+ * <caption>A selector removing multiple attributes</caption>
+ * plugins:
+ *   - removeAttributesBySelector:
+ *       selector: "[fill='#00ff00']"
+ *       attributes:
+ *         - fill
+ *         - stroke
+ *
+ * <rect x="0" y="0" width="100" height="100" fill="#00ff00" stroke="#00ff00"/>
+ *   ↓
+ * <rect x="0" y="0" width="100" height="100"/>
+ *
+ * <caption>Multiple selectors removing attributes</caption>
+ * plugins:
+ *   - removeAttributesBySelector:
+ *       selectors:
+ *         - selector: "[fill='#00ff00']"
+ *           attributes: "fill"
+ *
+ *         - selector: "#remove"
+ *           attributes:
+ *             - stroke
+ *             - id
+ *
+ * <rect x="0" y="0" width="100" height="100" fill="#00ff00" stroke="#00ff00"/>
+ *   ↓
+ * <rect x="0" y="0" width="100" height="100"/>
+ *
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors|MDN CSS Selectors}
+ *
+ * @author Bradley Mease
+ */
+exports.fn = function (item, params) {
+  var selectors = Array.isArray(params.selectors) ? params.selectors : [params];
+
+  selectors.map(({ selector, attributes }) => {
+    if (item.matches(selector)) {
+      if (Array.isArray(attributes)) {
+        for (const name of attributes) {
+          delete item.attributes[name];
+        }
+      } else {
+        delete item.attributes[attributes];
+      }
+    }
+  });
+};
diff --git a/node_modules/svgo/plugins/removeAttrs.js b/node_modules/svgo/plugins/removeAttrs.js
new file mode 100644
index 0000000..c54d666
--- /dev/null
+++ b/node_modules/svgo/plugins/removeAttrs.js
@@ -0,0 +1,146 @@
+'use strict';
+
+var DEFAULT_SEPARATOR = ':';
+
+exports.type = 'perItem';
+
+exports.active = false;
+
+exports.description = 'removes specified attributes';
+
+exports.params = {
+  elemSeparator: DEFAULT_SEPARATOR,
+  preserveCurrentColor: false,
+  attrs: [],
+};
+
+/**
+ * Remove attributes
+ *
+ * @param elemSeparator
+ *   format: string
+ *
+ * @param preserveCurrentColor
+ *   format: boolean
+ *
+ * @param attrs:
+ *
+ *   format: [ element* : attribute* : value* ]
+ *
+ *   element   : regexp (wrapped into ^...$), single * or omitted > all elements (must be present when value is used)
+ *   attribute : regexp (wrapped into ^...$)
+ *   value     : regexp (wrapped into ^...$), single * or omitted > all values
+ *
+ *   examples:
+ *
+ *     > basic: remove fill attribute
+ *     ---
+ *     removeAttrs:
+ *       attrs: 'fill'
+ *
+ *     > remove fill attribute on path element
+ *     ---
+ *       attrs: 'path:fill'
+ *
+ *     > remove fill attribute on path element where value is none
+ *     ---
+ *       attrs: 'path:fill:none'
+ *
+ *
+ *     > remove all fill and stroke attribute
+ *     ---
+ *       attrs:
+ *         - 'fill'
+ *         - 'stroke'
+ *
+ *     [is same as]
+ *
+ *       attrs: '(fill|stroke)'
+ *
+ *     [is same as]
+ *
+ *       attrs: '*:(fill|stroke)'
+ *
+ *     [is same as]
+ *
+ *       attrs: '.*:(fill|stroke)'
+ *
+ *     [is same as]
+ *
+ *       attrs: '.*:(fill|stroke):.*'
+ *
+ *
+ *     > remove all stroke related attributes
+ *     ----
+ *     attrs: 'stroke.*'
+ *
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Benny Schudel
+ */
+exports.fn = function (item, params) {
+  // wrap into an array if params is not
+  if (!Array.isArray(params.attrs)) {
+    params.attrs = [params.attrs];
+  }
+
+  if (item.type === 'element') {
+    var elemSeparator =
+      typeof params.elemSeparator == 'string'
+        ? params.elemSeparator
+        : DEFAULT_SEPARATOR;
+    var preserveCurrentColor =
+      typeof params.preserveCurrentColor == 'boolean'
+        ? params.preserveCurrentColor
+        : false;
+
+    // prepare patterns
+    var patterns = params.attrs.map(function (pattern) {
+      // if no element separators (:), assume it's attribute name, and apply to all elements *regardless of value*
+      if (pattern.indexOf(elemSeparator) === -1) {
+        pattern = ['.*', elemSeparator, pattern, elemSeparator, '.*'].join('');
+
+        // if only 1 separator, assume it's element and attribute name, and apply regardless of attribute value
+      } else if (pattern.split(elemSeparator).length < 3) {
+        pattern = [pattern, elemSeparator, '.*'].join('');
+      }
+
+      // create regexps for element, attribute name, and attribute value
+      return pattern.split(elemSeparator).map(function (value) {
+        // adjust single * to match anything
+        if (value === '*') {
+          value = '.*';
+        }
+
+        return new RegExp(['^', value, '$'].join(''), 'i');
+      });
+    });
+
+    // loop patterns
+    patterns.forEach(function (pattern) {
+      // matches element
+      if (pattern[0].test(item.name)) {
+        // loop attributes
+        for (const [name, value] of Object.entries(item.attributes)) {
+          var isFillCurrentColor =
+            preserveCurrentColor && name == 'fill' && value == 'currentColor';
+          var isStrokeCurrentColor =
+            preserveCurrentColor && name == 'stroke' && value == 'currentColor';
+
+          if (!(isFillCurrentColor || isStrokeCurrentColor)) {
+            // matches attribute name
+            if (pattern[1].test(name)) {
+              // matches attribute value
+              if (pattern[2].test(value)) {
+                delete item.attributes[name];
+              }
+            }
+          }
+        }
+      }
+    });
+  }
+};
diff --git a/node_modules/svgo/plugins/removeComments.js b/node_modules/svgo/plugins/removeComments.js
new file mode 100644
index 0000000..191618f
--- /dev/null
+++ b/node_modules/svgo/plugins/removeComments.js
@@ -0,0 +1,25 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'removes comments';
+
+/**
+ * Remove comments.
+ *
+ * @example
+ * <!-- Generator: Adobe Illustrator 15.0.0, SVG Export
+ * Plug-In . SVG Version: 6.00 Build 0)  -->
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item) {
+  if (item.type === 'comment' && item.value.charAt(0) !== '!') {
+    return false;
+  }
+};
diff --git a/node_modules/svgo/plugins/removeDesc.js b/node_modules/svgo/plugins/removeDesc.js
new file mode 100644
index 0000000..4616109
--- /dev/null
+++ b/node_modules/svgo/plugins/removeDesc.js
@@ -0,0 +1,37 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.params = {
+  removeAny: true,
+};
+
+exports.description = 'removes <desc>';
+
+var standardDescs = /^(Created with|Created using)/;
+
+/**
+ * Removes <desc>.
+ * Removes only standard editors content or empty elements 'cause it can be used for accessibility.
+ * Enable parameter 'removeAny' to remove any description.
+ *
+ * https://developer.mozilla.org/en-US/docs/Web/SVG/Element/desc
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Daniel Wabyick
+ */
+exports.fn = function (item, params) {
+  return (
+    !item.isElem('desc') ||
+    !(
+      params.removeAny ||
+      item.children.length === 0 ||
+      (item.children[0].type === 'text' &&
+        standardDescs.test(item.children[0].value))
+    )
+  );
+};
diff --git a/node_modules/svgo/plugins/removeDimensions.js b/node_modules/svgo/plugins/removeDimensions.js
new file mode 100644
index 0000000..0de6c1b
--- /dev/null
+++ b/node_modules/svgo/plugins/removeDimensions.js
@@ -0,0 +1,41 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = false;
+
+exports.description =
+  'removes width and height in presence of viewBox (opposite to removeViewBox, disable it first)';
+
+/**
+ * Remove width/height attributes and add the viewBox attribute if it's missing
+ *
+ * @example
+ * <svg width="100" height="50" />
+ *   ↓
+ * <svg viewBox="0 0 100 50" />
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if true, with and height will be filtered out
+ *
+ * @author Benny Schudel
+ */
+exports.fn = function (item) {
+  if (item.type === 'element' && item.name === 'svg') {
+    if (item.attributes.viewBox != null) {
+      delete item.attributes.width;
+      delete item.attributes.height;
+    } else if (
+      item.attributes.width != null &&
+      item.attributes.height != null &&
+      Number.isNaN(Number(item.attributes.width)) === false &&
+      Number.isNaN(Number(item.attributes.height)) === false
+    ) {
+      const width = Number(item.attributes.width);
+      const height = Number(item.attributes.height);
+      item.attributes.viewBox = `0 0 ${width} ${height}`;
+      delete item.attributes.width;
+      delete item.attributes.height;
+    }
+  }
+};
diff --git a/node_modules/svgo/plugins/removeDoctype.js b/node_modules/svgo/plugins/removeDoctype.js
new file mode 100644
index 0000000..6e17bd8
--- /dev/null
+++ b/node_modules/svgo/plugins/removeDoctype.js
@@ -0,0 +1,38 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'removes doctype declaration';
+
+/**
+ * Remove DOCTYPE declaration.
+ *
+ * "Unfortunately the SVG DTDs are a source of so many
+ * issues that the SVG WG has decided not to write one
+ * for the upcoming SVG 1.2 standard. In fact SVG WG
+ * members are even telling people not to use a DOCTYPE
+ * declaration in SVG 1.0 and 1.1 documents"
+ * https://jwatt.org/svg/authoring/#doctype-declaration
+ *
+ * @example
+ * <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ * q"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+ *
+ * @example
+ * <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ * "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+ *     <!-- an internal subset can be embedded here -->
+ * ]>
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item) {
+  if (item.type === 'doctype') {
+    return false;
+  }
+};
diff --git a/node_modules/svgo/plugins/removeEditorsNSData.js b/node_modules/svgo/plugins/removeEditorsNSData.js
new file mode 100644
index 0000000..f966b45
--- /dev/null
+++ b/node_modules/svgo/plugins/removeEditorsNSData.js
@@ -0,0 +1,65 @@
+'use strict';
+
+const { parseName } = require('../lib/svgo/tools.js');
+const { editorNamespaces } = require('./_collections');
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'removes editors namespaces, elements and attributes';
+
+const prefixes = [];
+
+exports.params = {
+  additionalNamespaces: [],
+};
+
+/**
+ * Remove editors namespaces, elements and attributes.
+ *
+ * @example
+ * <svg xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd">
+ * <sodipodi:namedview/>
+ * <path sodipodi:nodetypes="cccc"/>
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item, params) {
+  let namespaces = editorNamespaces;
+  if (Array.isArray(params.additionalNamespaces)) {
+    namespaces = [...editorNamespaces, ...params.additionalNamespaces];
+  }
+
+  if (item.type === 'element') {
+    if (item.isElem('svg')) {
+      for (const [name, value] of Object.entries(item.attributes)) {
+        const { prefix, local } = parseName(name);
+        if (prefix === 'xmlns' && namespaces.includes(value)) {
+          prefixes.push(local);
+
+          // <svg xmlns:sodipodi="">
+          delete item.attributes[name];
+        }
+      }
+    }
+
+    // <* sodipodi:*="">
+    for (const name of Object.keys(item.attributes)) {
+      const { prefix } = parseName(name);
+      if (prefixes.includes(prefix)) {
+        delete item.attributes[name];
+      }
+    }
+
+    // <sodipodi:*>
+    const { prefix } = parseName(item.name);
+    if (prefixes.includes(prefix)) {
+      return false;
+    }
+  }
+};
diff --git a/node_modules/svgo/plugins/removeElementsByAttr.js b/node_modules/svgo/plugins/removeElementsByAttr.js
new file mode 100644
index 0000000..dcc3110
--- /dev/null
+++ b/node_modules/svgo/plugins/removeElementsByAttr.js
@@ -0,0 +1,77 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = false;
+
+exports.description =
+  'removes arbitrary elements by ID or className (disabled by default)';
+
+exports.params = {
+  id: [],
+  class: [],
+};
+
+/**
+ * Remove arbitrary SVG elements by ID or className.
+ *
+ * @param id
+ *   examples:
+ *
+ *     > single: remove element with ID of `elementID`
+ *     ---
+ *     removeElementsByAttr:
+ *       id: 'elementID'
+ *
+ *     > list: remove multiple elements by ID
+ *     ---
+ *     removeElementsByAttr:
+ *       id:
+ *         - 'elementID'
+ *         - 'anotherID'
+ *
+ * @param class
+ *   examples:
+ *
+ *     > single: remove all elements with class of `elementClass`
+ *     ---
+ *     removeElementsByAttr:
+ *       class: 'elementClass'
+ *
+ *     > list: remove all elements with class of `elementClass` or `anotherClass`
+ *     ---
+ *     removeElementsByAttr:
+ *       class:
+ *         - 'elementClass'
+ *         - 'anotherClass'
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Eli Dupuis (@elidupuis)
+ */
+exports.fn = function (item, params) {
+  // wrap params in an array if not already
+  ['id', 'class'].forEach(function (key) {
+    if (!Array.isArray(params[key])) {
+      params[key] = [params[key]];
+    }
+  });
+
+  // abort if current item is no an element
+  if (item.type !== 'element') {
+    return;
+  }
+
+  // remove element if it's `id` matches configured `id` params
+  if (item.attributes.id != null && params.id.length !== 0) {
+    return params.id.includes(item.attributes.id) === false;
+  }
+
+  // remove element if it's `class` contains any of the configured `class` params
+  if (item.attributes.class && params.class.length !== 0) {
+    const classList = item.attributes.class.split(' ');
+    return params.class.some((item) => classList.includes(item)) === false;
+  }
+};
diff --git a/node_modules/svgo/plugins/removeEmptyAttrs.js b/node_modules/svgo/plugins/removeEmptyAttrs.js
new file mode 100644
index 0000000..9d4e32a
--- /dev/null
+++ b/node_modules/svgo/plugins/removeEmptyAttrs.js
@@ -0,0 +1,31 @@
+'use strict';
+
+const { attrsGroups } = require('./_collections.js');
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'removes empty attributes';
+
+/**
+ * Remove attributes with empty values.
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item) {
+  if (item.type === 'element') {
+    for (const [name, value] of Object.entries(item.attributes)) {
+      if (
+        value === '' &&
+        // empty conditional processing attributes prevents elements from rendering
+        attrsGroups.conditionalProcessing.includes(name) === false
+      ) {
+        delete item.attributes[name];
+      }
+    }
+  }
+};
diff --git a/node_modules/svgo/plugins/removeEmptyContainers.js b/node_modules/svgo/plugins/removeEmptyContainers.js
new file mode 100644
index 0000000..230a126
--- /dev/null
+++ b/node_modules/svgo/plugins/removeEmptyContainers.js
@@ -0,0 +1,43 @@
+'use strict';
+
+const { elemsGroups } = require('./_collections');
+
+exports.type = 'perItemReverse';
+
+exports.active = true;
+
+exports.description = 'removes empty container elements';
+
+/**
+ * Remove empty containers.
+ *
+ * @see https://www.w3.org/TR/SVG11/intro.html#TermContainerElement
+ *
+ * @example
+ * <defs/>
+ *
+ * @example
+ * <g><marker><a/></marker></g>
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item) {
+  if (item.type === 'element') {
+    return (
+      item.children.length !== 0 ||
+      elemsGroups.container.includes(item.name) === false ||
+      item.name === 'svg' ||
+      // empty patterns may contain reusable configuration
+      (item.name === 'pattern' && Object.keys(item.attributes).length !== 0) ||
+      // The 'g' may not have content, but the filter may cause a rectangle
+      // to be created and filled with pattern.
+      (item.name === 'g' && item.attributes.filter != null) ||
+      // empty <mask> hides masked element
+      (item.name === 'mask' && item.attributes.id != null)
+    );
+  }
+  return true;
+};
diff --git a/node_modules/svgo/plugins/removeEmptyText.js b/node_modules/svgo/plugins/removeEmptyText.js
new file mode 100644
index 0000000..30d3e7c
--- /dev/null
+++ b/node_modules/svgo/plugins/removeEmptyText.js
@@ -0,0 +1,57 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'removes empty <text> elements';
+
+exports.params = {
+  text: true,
+  tspan: true,
+  tref: true,
+};
+
+/**
+ * Remove empty Text elements.
+ *
+ * @see https://www.w3.org/TR/SVG11/text.html
+ *
+ * @example
+ * Remove empty text element:
+ * <text/>
+ *
+ * Remove empty tspan element:
+ * <tspan/>
+ *
+ * Remove tref with empty xlink:href attribute:
+ * <tref xlink:href=""/>
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item, params) {
+  if (item.type === 'element') {
+    // Remove empty text element
+    if (params.text && item.name === 'text' && item.children.length === 0) {
+      return false;
+    }
+
+    // Remove empty tspan element
+    if (params.tspan && item.name === 'tspan' && item.children.length === 0) {
+      return false;
+    }
+
+    // Remove tref with empty xlink:href attribute
+    if (
+      params.tref &&
+      item.name === 'tref' &&
+      item.attributes['xlink:href'] == null
+    ) {
+      return false;
+    }
+  }
+};
diff --git a/node_modules/svgo/plugins/removeHiddenElems.js b/node_modules/svgo/plugins/removeHiddenElems.js
new file mode 100644
index 0000000..3277e04
--- /dev/null
+++ b/node_modules/svgo/plugins/removeHiddenElems.js
@@ -0,0 +1,279 @@
+'use strict';
+
+const { querySelector, closestByName } = require('../lib/xast.js');
+const { computeStyle } = require('../lib/style.js');
+const { parsePathData } = require('../lib/path.js');
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description =
+  'removes hidden elements (zero sized, with absent attributes)';
+
+exports.params = {
+  isHidden: true,
+  displayNone: true,
+  opacity0: true,
+  circleR0: true,
+  ellipseRX0: true,
+  ellipseRY0: true,
+  rectWidth0: true,
+  rectHeight0: true,
+  patternWidth0: true,
+  patternHeight0: true,
+  imageWidth0: true,
+  imageHeight0: true,
+  pathEmptyD: true,
+  polylineEmptyPoints: true,
+  polygonEmptyPoints: true,
+};
+
+/**
+ * Remove hidden elements with disabled rendering:
+ * - display="none"
+ * - opacity="0"
+ * - circle with zero radius
+ * - ellipse with zero x-axis or y-axis radius
+ * - rectangle with zero width or height
+ * - pattern with zero width or height
+ * - image with zero width or height
+ * - path with empty data
+ * - polyline with empty points
+ * - polygon with empty points
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item, params) {
+  if (item.type === 'element') {
+    // Removes hidden elements
+    // https://www.w3schools.com/cssref/pr_class_visibility.asp
+    const computedStyle = computeStyle(item);
+    if (
+      params.isHidden &&
+      computedStyle.visibility &&
+      computedStyle.visibility.type === 'static' &&
+      computedStyle.visibility.value === 'hidden' &&
+      // keep if any descendant enables visibility
+      querySelector(item, '[visibility=visible]') == null
+    ) {
+      return false;
+    }
+
+    // display="none"
+    //
+    // https://www.w3.org/TR/SVG11/painting.html#DisplayProperty
+    // "A value of display: none indicates that the given element
+    // and its children shall not be rendered directly"
+    if (
+      params.displayNone &&
+      computedStyle.display &&
+      computedStyle.display.type === 'static' &&
+      computedStyle.display.value === 'none' &&
+      // markers with display: none still rendered
+      item.isElem('marker') === false
+    ) {
+      return false;
+    }
+
+    // opacity="0"
+    //
+    // https://www.w3.org/TR/SVG11/masking.html#ObjectAndGroupOpacityProperties
+    if (
+      params.opacity0 &&
+      computedStyle.opacity &&
+      computedStyle.opacity.type === 'static' &&
+      computedStyle.opacity.value === '0' &&
+      // transparent element inside clipPath still affect clipped elements
+      closestByName(item, 'clipPath') == null
+    ) {
+      return false;
+    }
+
+    // Circles with zero radius
+    //
+    // https://www.w3.org/TR/SVG11/shapes.html#CircleElementRAttribute
+    // "A value of zero disables rendering of the element"
+    //
+    // <circle r="0">
+    if (
+      params.circleR0 &&
+      item.isElem('circle') &&
+      item.children.length === 0 &&
+      item.attributes.r === '0'
+    ) {
+      return false;
+    }
+
+    // Ellipse with zero x-axis radius
+    //
+    // https://www.w3.org/TR/SVG11/shapes.html#EllipseElementRXAttribute
+    // "A value of zero disables rendering of the element"
+    //
+    // <ellipse rx="0">
+    if (
+      params.ellipseRX0 &&
+      item.isElem('ellipse') &&
+      item.children.length === 0 &&
+      item.attributes.rx === '0'
+    ) {
+      return false;
+    }
+
+    // Ellipse with zero y-axis radius
+    //
+    // https://www.w3.org/TR/SVG11/shapes.html#EllipseElementRYAttribute
+    // "A value of zero disables rendering of the element"
+    //
+    // <ellipse ry="0">
+    if (
+      params.ellipseRY0 &&
+      item.isElem('ellipse') &&
+      item.children.length === 0 &&
+      item.attributes.ry === '0'
+    ) {
+      return false;
+    }
+
+    // Rectangle with zero width
+    //
+    // https://www.w3.org/TR/SVG11/shapes.html#RectElementWidthAttribute
+    // "A value of zero disables rendering of the element"
+    //
+    // <rect width="0">
+    if (
+      params.rectWidth0 &&
+      item.isElem('rect') &&
+      item.children.length === 0 &&
+      item.attributes.width === '0'
+    ) {
+      return false;
+    }
+
+    // Rectangle with zero height
+    //
+    // https://www.w3.org/TR/SVG11/shapes.html#RectElementHeightAttribute
+    // "A value of zero disables rendering of the element"
+    //
+    // <rect height="0">
+    if (
+      params.rectHeight0 &&
+      params.rectWidth0 &&
+      item.isElem('rect') &&
+      item.children.length === 0 &&
+      item.attributes.height === '0'
+    ) {
+      return false;
+    }
+
+    // Pattern with zero width
+    //
+    // https://www.w3.org/TR/SVG11/pservers.html#PatternElementWidthAttribute
+    // "A value of zero disables rendering of the element (i.e., no paint is applied)"
+    //
+    // <pattern width="0">
+    if (
+      params.patternWidth0 &&
+      item.isElem('pattern') &&
+      item.attributes.width === '0'
+    ) {
+      return false;
+    }
+
+    // Pattern with zero height
+    //
+    // https://www.w3.org/TR/SVG11/pservers.html#PatternElementHeightAttribute
+    // "A value of zero disables rendering of the element (i.e., no paint is applied)"
+    //
+    // <pattern height="0">
+    if (
+      params.patternHeight0 &&
+      item.isElem('pattern') &&
+      item.attributes.height === '0'
+    ) {
+      return false;
+    }
+
+    // Image with zero width
+    //
+    // https://www.w3.org/TR/SVG11/struct.html#ImageElementWidthAttribute
+    // "A value of zero disables rendering of the element"
+    //
+    // <image width="0">
+    if (
+      params.imageWidth0 &&
+      item.isElem('image') &&
+      item.attributes.width === '0'
+    ) {
+      return false;
+    }
+
+    // Image with zero height
+    //
+    // https://www.w3.org/TR/SVG11/struct.html#ImageElementHeightAttribute
+    // "A value of zero disables rendering of the element"
+    //
+    // <image height="0">
+    if (
+      params.imageHeight0 &&
+      item.isElem('image') &&
+      item.attributes.height === '0'
+    ) {
+      return false;
+    }
+
+    // Path with empty data
+    //
+    // https://www.w3.org/TR/SVG11/paths.html#DAttribute
+    //
+    // <path d=""/>
+    if (params.pathEmptyD && item.isElem('path')) {
+      if (item.attributes.d == null) {
+        return false;
+      }
+      const pathData = parsePathData(item.attributes.d);
+      if (pathData.length === 0) {
+        return false;
+      }
+      // keep single point paths for markers
+      if (
+        pathData.length === 1 &&
+        computedStyle['marker-start'] == null &&
+        computedStyle['marker-end'] == null
+      ) {
+        return false;
+      }
+      return true;
+    }
+
+    // Polyline with empty points
+    //
+    // https://www.w3.org/TR/SVG11/shapes.html#PolylineElementPointsAttribute
+    //
+    // <polyline points="">
+    if (
+      params.polylineEmptyPoints &&
+      item.isElem('polyline') &&
+      item.attributes.points == null
+    ) {
+      return false;
+    }
+
+    // Polygon with empty points
+    //
+    // https://www.w3.org/TR/SVG11/shapes.html#PolygonElementPointsAttribute
+    //
+    // <polygon points="">
+    if (
+      params.polygonEmptyPoints &&
+      item.isElem('polygon') &&
+      item.attributes.points == null
+    ) {
+      return false;
+    }
+  }
+};
diff --git a/node_modules/svgo/plugins/removeMetadata.js b/node_modules/svgo/plugins/removeMetadata.js
new file mode 100644
index 0000000..451af5f
--- /dev/null
+++ b/node_modules/svgo/plugins/removeMetadata.js
@@ -0,0 +1,21 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'removes <metadata>';
+
+/**
+ * Remove <metadata>.
+ *
+ * https://www.w3.org/TR/SVG11/metadata.html
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item) {
+  return !item.isElem('metadata');
+};
diff --git a/node_modules/svgo/plugins/removeNonInheritableGroupAttrs.js b/node_modules/svgo/plugins/removeNonInheritableGroupAttrs.js
new file mode 100644
index 0000000..d99045f
--- /dev/null
+++ b/node_modules/svgo/plugins/removeNonInheritableGroupAttrs.js
@@ -0,0 +1,36 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description =
+  'removes non-inheritable group’s presentational attributes';
+
+const {
+  inheritableAttrs,
+  attrsGroups,
+  presentationNonInheritableGroupAttrs,
+} = require('./_collections');
+
+/**
+ * Remove non-inheritable group's "presentation" attributes.
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item) {
+  if (item.type === 'element' && item.name === 'g') {
+    for (const name of Object.keys(item.attributes)) {
+      if (
+        attrsGroups.presentation.includes(name) === true &&
+        inheritableAttrs.includes(name) === false &&
+        presentationNonInheritableGroupAttrs.includes(name) === false
+      ) {
+        delete item.attributes[name];
+      }
+    }
+  }
+};
diff --git a/node_modules/svgo/plugins/removeOffCanvasPaths.js b/node_modules/svgo/plugins/removeOffCanvasPaths.js
new file mode 100644
index 0000000..be363ad
--- /dev/null
+++ b/node_modules/svgo/plugins/removeOffCanvasPaths.js
@@ -0,0 +1,139 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = false;
+
+exports.description =
+  'removes elements that are drawn outside of the viewbox (disabled by default)';
+
+const JSAPI = require('../lib/svgo/jsAPI.js');
+
+var _path = require('./_path.js'),
+  intersects = _path.intersects,
+  path2js = _path.path2js,
+  viewBox,
+  viewBoxJS;
+
+/**
+ * Remove elements that are drawn outside of the viewbox.
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author JoshyPHP
+ */
+exports.fn = function (item) {
+  if (
+    item.type === 'element' &&
+    item.name === 'path' &&
+    item.attributes.d != null &&
+    typeof viewBox !== 'undefined'
+  ) {
+    // Consider that any item with a transform attribute or a M instruction
+    // within the viewBox is visible
+    if (hasTransform(item) || pathMovesWithinViewBox(item.attributes.d)) {
+      return true;
+    }
+
+    var pathJS = path2js(item);
+    if (pathJS.length === 2) {
+      // Use a closed clone of the path if it's too short for intersects()
+      pathJS = JSON.parse(JSON.stringify(pathJS));
+      pathJS.push({ instruction: 'z' });
+    }
+
+    return intersects(viewBoxJS, pathJS);
+  }
+  if (item.type === 'element' && item.name === 'svg') {
+    parseViewBox(item);
+  }
+
+  return true;
+};
+
+/**
+ * Test whether given item or any of its ancestors has a transform attribute.
+ *
+ * @param {String} path
+ * @return {Boolean}
+ */
+function hasTransform(item) {
+  return (
+    item.attributes.transform != null ||
+    (item.parentNode &&
+      item.parentNode.type === 'element' &&
+      hasTransform(item.parentNode))
+  );
+}
+
+/**
+ * Parse the viewBox coordinates and compute the JS representation of its path.
+ *
+ * @param {Object} svg svg element item
+ */
+function parseViewBox(svg) {
+  var viewBoxData = '';
+  if (svg.attributes.viewBox != null) {
+    // Remove commas and plus signs, normalize and trim whitespace
+    viewBoxData = svg.attributes.viewBox;
+  } else if (svg.attributes.height != null && svg.attributes.width != null) {
+    viewBoxData = `0 0 ${svg.attributes.width} ${svg.attributes.height}`;
+  }
+
+  // Remove commas and plus signs, normalize and trim whitespace
+  viewBoxData = viewBoxData
+    .replace(/[,+]|px/g, ' ')
+    .replace(/\s+/g, ' ')
+    .replace(/^\s*|\s*$/g, '');
+
+  // Ensure that the dimensions are 4 values separated by space
+  var m = /^(-?\d*\.?\d+) (-?\d*\.?\d+) (\d*\.?\d+) (\d*\.?\d+)$/.exec(
+    viewBoxData
+  );
+  if (!m) {
+    return;
+  }
+
+  // Store the viewBox boundaries
+  viewBox = {
+    left: parseFloat(m[1]),
+    top: parseFloat(m[2]),
+    right: parseFloat(m[1]) + parseFloat(m[3]),
+    bottom: parseFloat(m[2]) + parseFloat(m[4]),
+  };
+
+  var path = new JSAPI({
+    type: 'element',
+    name: 'path',
+    attributes: {
+      d: 'M' + m[1] + ' ' + m[2] + 'h' + m[3] + 'v' + m[4] + 'H' + m[1] + 'z',
+    },
+    content: [],
+  });
+
+  viewBoxJS = path2js(path);
+}
+
+/**
+ * Test whether given path has a M instruction with coordinates within the viewBox.
+ *
+ * @param {String} path
+ * @return {Boolean}
+ */
+function pathMovesWithinViewBox(path) {
+  var regexp = /M\s*(-?\d*\.?\d+)(?!\d)\s*(-?\d*\.?\d+)/g,
+    m;
+  while (null !== (m = regexp.exec(path))) {
+    if (
+      m[1] >= viewBox.left &&
+      m[1] <= viewBox.right &&
+      m[2] >= viewBox.top &&
+      m[2] <= viewBox.bottom
+    ) {
+      return true;
+    }
+  }
+
+  return false;
+}
diff --git a/node_modules/svgo/plugins/removeRasterImages.js b/node_modules/svgo/plugins/removeRasterImages.js
new file mode 100644
index 0000000..ec87f8b
--- /dev/null
+++ b/node_modules/svgo/plugins/removeRasterImages.js
@@ -0,0 +1,28 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = false;
+
+exports.description = 'removes raster images (disabled by default)';
+
+/**
+ * Remove raster images references in <image>.
+ *
+ * @see https://bugs.webkit.org/show_bug.cgi?id=63548
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item) {
+  if (
+    item.type === 'element' &&
+    item.name === 'image' &&
+    item.attributes['xlink:href'] != null &&
+    /(\.|image\/)(jpg|png|gif)/.test(item.attributes['xlink:href'])
+  ) {
+    return false;
+  }
+};
diff --git a/node_modules/svgo/plugins/removeScriptElement.js b/node_modules/svgo/plugins/removeScriptElement.js
new file mode 100644
index 0000000..7ae4d3d
--- /dev/null
+++ b/node_modules/svgo/plugins/removeScriptElement.js
@@ -0,0 +1,21 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = false;
+
+exports.description = 'removes <script> elements (disabled by default)';
+
+/**
+ * Remove <script>.
+ *
+ * https://www.w3.org/TR/SVG11/script.html
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Patrick Klingemann
+ */
+exports.fn = function (item) {
+  return !item.isElem('script');
+};
diff --git a/node_modules/svgo/plugins/removeStyleElement.js b/node_modules/svgo/plugins/removeStyleElement.js
new file mode 100644
index 0000000..72c7636
--- /dev/null
+++ b/node_modules/svgo/plugins/removeStyleElement.js
@@ -0,0 +1,21 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = false;
+
+exports.description = 'removes <style> element (disabled by default)';
+
+/**
+ * Remove <style>.
+ *
+ * https://www.w3.org/TR/SVG11/styling.html#StyleElement
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Betsy Dupuis
+ */
+exports.fn = function (item) {
+  return !item.isElem('style');
+};
diff --git a/node_modules/svgo/plugins/removeTitle.js b/node_modules/svgo/plugins/removeTitle.js
new file mode 100644
index 0000000..e23198a
--- /dev/null
+++ b/node_modules/svgo/plugins/removeTitle.js
@@ -0,0 +1,21 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'removes <title>';
+
+/**
+ * Remove <title>.
+ *
+ * https://developer.mozilla.org/en-US/docs/Web/SVG/Element/title
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Igor Kalashnikov
+ */
+exports.fn = function (item) {
+  return !item.isElem('title');
+};
diff --git a/node_modules/svgo/plugins/removeUnknownsAndDefaults.js b/node_modules/svgo/plugins/removeUnknownsAndDefaults.js
new file mode 100644
index 0000000..e97d554
--- /dev/null
+++ b/node_modules/svgo/plugins/removeUnknownsAndDefaults.js
@@ -0,0 +1,128 @@
+'use strict';
+
+const { parseName } = require('../lib/svgo/tools.js');
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description =
+  'removes unknown elements content and attributes, removes attrs with default values';
+
+exports.params = {
+  unknownContent: true,
+  unknownAttrs: true,
+  defaultAttrs: true,
+  uselessOverrides: true,
+  keepDataAttrs: true,
+  keepAriaAttrs: true,
+  keepRoleAttr: false,
+};
+
+var collections = require('./_collections'),
+  elems = collections.elems,
+  attrsGroups = collections.attrsGroups,
+  elemsGroups = collections.elemsGroups,
+  attrsGroupsDefaults = collections.attrsGroupsDefaults,
+  attrsInheritable = collections.inheritableAttrs,
+  applyGroups = collections.presentationNonInheritableGroupAttrs;
+
+// collect and extend all references
+for (const elem of Object.values(elems)) {
+  if (elem.attrsGroups) {
+    elem.attrs = elem.attrs || [];
+
+    elem.attrsGroups.forEach(function (attrsGroupName) {
+      elem.attrs = elem.attrs.concat(attrsGroups[attrsGroupName]);
+
+      var groupDefaults = attrsGroupsDefaults[attrsGroupName];
+
+      if (groupDefaults) {
+        elem.defaults = elem.defaults || {};
+
+        for (const [attrName, attr] of Object.entries(groupDefaults)) {
+          elem.defaults[attrName] = attr;
+        }
+      }
+    });
+  }
+
+  if (elem.contentGroups) {
+    elem.content = elem.content || [];
+
+    elem.contentGroups.forEach(function (contentGroupName) {
+      elem.content = elem.content.concat(elemsGroups[contentGroupName]);
+    });
+  }
+}
+
+/**
+ * Remove unknown elements content and attributes,
+ * remove attributes with default values.
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item, params) {
+  // elems w/o namespace prefix
+  if (item.type === 'element' && !parseName(item.name).prefix) {
+    var elem = item.name;
+
+    // remove unknown element's content
+    if (
+      params.unknownContent &&
+      elems[elem] && // make sure we know of this element before checking its children
+      elem !== 'foreignObject' // Don't check foreignObject
+    ) {
+      item.children.forEach(function (content, i) {
+        if (
+          content.type === 'element' &&
+          !parseName(content.name).prefix &&
+          ((elems[elem].content && // Do we have a record of its permitted content?
+            elems[elem].content.indexOf(content.name) === -1) ||
+            (!elems[elem].content && // we dont know about its permitted content
+              !elems[content.name])) // check that we know about the element at all
+        ) {
+          item.children.splice(i, 1);
+        }
+      });
+    }
+
+    // remove element's unknown attrs and attrs with default values
+    if (elems[elem] && elems[elem].attrs) {
+      for (const [name, value] of Object.entries(item.attributes)) {
+        const { prefix } = parseName(name);
+        if (
+          name !== 'xmlns' &&
+          (prefix === 'xml' || !prefix) &&
+          (!params.keepDataAttrs || name.indexOf('data-') != 0) &&
+          (!params.keepAriaAttrs || name.indexOf('aria-') != 0) &&
+          (!params.keepRoleAttr || name != 'role')
+        ) {
+          if (
+            // unknown attrs
+            (params.unknownAttrs && elems[elem].attrs.indexOf(name) === -1) ||
+            // attrs with default values
+            (params.defaultAttrs &&
+              item.attributes.id == null &&
+              elems[elem].defaults &&
+              elems[elem].defaults[name] === value &&
+              (attrsInheritable.includes(name) === false ||
+                !item.parentNode.computedAttr(name))) ||
+            // useless overrides
+            (params.uselessOverrides &&
+              item.attributes.id == null &&
+              applyGroups.includes(name) === false &&
+              attrsInheritable.includes(name) === true &&
+              item.parentNode.computedAttr(name, value))
+          ) {
+            delete item.attributes[name];
+          }
+        }
+      }
+    }
+  }
+};
diff --git a/node_modules/svgo/plugins/removeUnusedNS.js b/node_modules/svgo/plugins/removeUnusedNS.js
new file mode 100644
index 0000000..80c0c27
--- /dev/null
+++ b/node_modules/svgo/plugins/removeUnusedNS.js
@@ -0,0 +1,80 @@
+'use strict';
+
+const { traverse } = require('../lib/xast.js');
+const { parseName } = require('../lib/svgo/tools.js');
+
+exports.type = 'full';
+
+exports.active = true;
+
+exports.description = 'removes unused namespaces declaration';
+
+/**
+ * Remove unused namespaces declaration.
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (root) {
+  let svgElem;
+  const xmlnsCollection = [];
+
+  /**
+   * Remove namespace from collection.
+   *
+   * @param {String} ns namescape name
+   */
+  function removeNSfromCollection(ns) {
+    const pos = xmlnsCollection.indexOf(ns);
+
+    // if found - remove ns from the namespaces collection
+    if (pos > -1) {
+      xmlnsCollection.splice(pos, 1);
+    }
+  }
+
+  traverse(root, (node) => {
+    if (node.type === 'element') {
+      if (node.name === 'svg') {
+        for (const name of Object.keys(node.attributes)) {
+          const { prefix, local } = parseName(name);
+          // collect namespaces
+          if (prefix === 'xmlns' && local) {
+            xmlnsCollection.push(local);
+          }
+        }
+
+        // if svg element has ns-attr
+        if (xmlnsCollection.length) {
+          // save svg element
+          svgElem = node;
+        }
+      }
+
+      if (xmlnsCollection.length) {
+        const { prefix } = parseName(node.name);
+        // check node for the ns-attrs
+        if (prefix) {
+          removeNSfromCollection(prefix);
+        }
+
+        // check each attr for the ns-attrs
+        for (const name of Object.keys(node.attributes)) {
+          const { prefix } = parseName(name);
+          removeNSfromCollection(prefix);
+        }
+      }
+    }
+  });
+
+  // remove svg element ns-attributes if they are not used even once
+  if (xmlnsCollection.length) {
+    for (const name of xmlnsCollection) {
+      delete svgElem.attributes['xmlns:' + name];
+    }
+  }
+
+  return root;
+};
diff --git a/node_modules/svgo/plugins/removeUselessDefs.js b/node_modules/svgo/plugins/removeUselessDefs.js
new file mode 100644
index 0000000..4beb627
--- /dev/null
+++ b/node_modules/svgo/plugins/removeUselessDefs.js
@@ -0,0 +1,48 @@
+'use strict';
+
+const { elemsGroups } = require('./_collections');
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'removes elements in <defs> without id';
+
+/**
+ * Removes content of defs and properties that aren't rendered directly without ids.
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Lev Solntsev
+ */
+exports.fn = function (item) {
+  if (item.type === 'element') {
+    if (item.name === 'defs') {
+      item.children = getUsefulItems(item, []);
+      if (item.children.length === 0) {
+        return false;
+      }
+    } else if (
+      elemsGroups.nonRendering.includes(item.name) &&
+      item.attributes.id == null
+    ) {
+      return false;
+    }
+  }
+};
+
+function getUsefulItems(item, usefulItems) {
+  for (const child of item.children) {
+    if (child.type === 'element') {
+      if (child.attributes.id != null || child.name === 'style') {
+        usefulItems.push(child);
+        child.parentNode = item;
+      } else {
+        child.children = getUsefulItems(child, usefulItems);
+      }
+    }
+  }
+
+  return usefulItems;
+}
diff --git a/node_modules/svgo/plugins/removeUselessStrokeAndFill.js b/node_modules/svgo/plugins/removeUselessStrokeAndFill.js
new file mode 100644
index 0000000..ef932eb
--- /dev/null
+++ b/node_modules/svgo/plugins/removeUselessStrokeAndFill.js
@@ -0,0 +1,92 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'removes useless stroke and fill attributes';
+
+exports.params = {
+  stroke: true,
+  fill: true,
+  removeNone: false,
+  hasStyleOrScript: false,
+};
+
+var shape = require('./_collections').elemsGroups.shape,
+  regStrokeProps = /^stroke/,
+  regFillProps = /^fill-/,
+  styleOrScript = ['style', 'script'];
+
+/**
+ * Remove useless stroke and fill attrs.
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item, params) {
+  if (item.isElem(styleOrScript)) {
+    params.hasStyleOrScript = true;
+  }
+
+  if (
+    !params.hasStyleOrScript &&
+    item.isElem(shape) &&
+    !item.computedAttr('id')
+  ) {
+    var stroke = params.stroke && item.computedAttr('stroke'),
+      fill = params.fill && !item.computedAttr('fill', 'none');
+
+    // remove stroke*
+    if (
+      params.stroke &&
+      (!stroke ||
+        stroke == 'none' ||
+        item.computedAttr('stroke-opacity', '0') ||
+        item.computedAttr('stroke-width', '0'))
+    ) {
+      // stroke-width may affect the size of marker-end
+      if (
+        item.computedAttr('stroke-width', '0') === true ||
+        item.computedAttr('marker-end') == null
+      ) {
+        var parentStroke = item.parentNode.computedAttr('stroke'),
+          declineStroke = parentStroke && parentStroke != 'none';
+
+        for (const name of Object.keys(item.attributes)) {
+          if (regStrokeProps.test(name)) {
+            delete item.attributes[name];
+          }
+        }
+
+        if (declineStroke) {
+          item.attributes.stroke = 'none';
+        }
+      }
+    }
+
+    // remove fill*
+    if (params.fill && (!fill || item.computedAttr('fill-opacity', '0'))) {
+      for (const name of Object.keys(item.attributes)) {
+        if (regFillProps.test(name)) {
+          delete item.attributes[name];
+        }
+      }
+
+      if (fill) {
+        item.attributes.fill = 'none';
+      }
+    }
+
+    if (
+      params.removeNone &&
+      (!stroke || item.attributes.stroke == 'none') &&
+      (!fill || item.attributes.fill == 'none')
+    ) {
+      return false;
+    }
+  }
+};
diff --git a/node_modules/svgo/plugins/removeViewBox.js b/node_modules/svgo/plugins/removeViewBox.js
new file mode 100644
index 0000000..ffcfb5c
--- /dev/null
+++ b/node_modules/svgo/plugins/removeViewBox.js
@@ -0,0 +1,52 @@
+'use strict';
+
+const { closestByName } = require('../lib/xast.js');
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'removes viewBox attribute when possible';
+
+const viewBoxElems = ['svg', 'pattern', 'symbol'];
+
+/**
+ * Remove viewBox attr which coincides with a width/height box.
+ *
+ * @see https://www.w3.org/TR/SVG11/coords.html#ViewBoxAttribute
+ *
+ * @example
+ * <svg width="100" height="50" viewBox="0 0 100 50">
+ *             ⬇
+ * <svg width="100" height="50">
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item) {
+  if (
+    item.type === 'element' &&
+    viewBoxElems.includes(item.name) &&
+    item.attributes.viewBox != null &&
+    item.attributes.width != null &&
+    item.attributes.height != null
+  ) {
+    // TODO remove width/height for such case instead
+    if (item.name === 'svg' && closestByName(item.parentNode, 'svg')) {
+      return;
+    }
+
+    const nums = item.attributes.viewBox.split(/[ ,]+/g);
+
+    if (
+      nums[0] === '0' &&
+      nums[1] === '0' &&
+      item.attributes.width.replace(/px$/, '') === nums[2] && // could use parseFloat too
+      item.attributes.height.replace(/px$/, '') === nums[3]
+    ) {
+      delete item.attributes.viewBox;
+    }
+  }
+};
diff --git a/node_modules/svgo/plugins/removeXMLNS.js b/node_modules/svgo/plugins/removeXMLNS.js
new file mode 100644
index 0000000..c4da3ef
--- /dev/null
+++ b/node_modules/svgo/plugins/removeXMLNS.js
@@ -0,0 +1,27 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = false;
+
+exports.description =
+  'removes xmlns attribute (for inline svg, disabled by default)';
+
+/**
+ * Remove the xmlns attribute when present.
+ *
+ * @example
+ * <svg viewBox="0 0 100 50" xmlns="http://www.w3.org/2000/svg">
+ *   ↓
+ * <svg viewBox="0 0 100 50">
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if true, xmlns will be filtered out
+ *
+ * @author Ricardo Tomasi
+ */
+exports.fn = function (item) {
+  if (item.type === 'element' && item.name === 'svg') {
+    delete item.attributes.xmlns;
+  }
+};
diff --git a/node_modules/svgo/plugins/removeXMLProcInst.js b/node_modules/svgo/plugins/removeXMLProcInst.js
new file mode 100644
index 0000000..9267369
--- /dev/null
+++ b/node_modules/svgo/plugins/removeXMLProcInst.js
@@ -0,0 +1,25 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'removes XML processing instructions';
+
+/**
+ * Remove XML Processing Instruction.
+ *
+ * @example
+ * <?xml version="1.0" encoding="utf-8"?>
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function (item) {
+  if (item.type === 'instruction' && item.name === 'xml') {
+    return false;
+  }
+  return true;
+};
diff --git a/node_modules/svgo/plugins/reusePaths.js b/node_modules/svgo/plugins/reusePaths.js
new file mode 100644
index 0000000..f3eb6b6
--- /dev/null
+++ b/node_modules/svgo/plugins/reusePaths.js
@@ -0,0 +1,92 @@
+'use strict';
+
+const { traverse } = require('../lib/xast.js');
+const JSAPI = require('../lib/svgo/jsAPI');
+
+exports.type = 'full';
+
+exports.active = false;
+
+exports.description =
+  'Finds <path> elements with the same d, fill, and ' +
+  'stroke, and converts them to <use> elements ' +
+  'referencing a single <path> def.';
+
+/**
+ * Finds <path> elements with the same d, fill, and stroke, and converts them to
+ * <use> elements referencing a single <path> def.
+ *
+ * @author Jacob Howcroft
+ */
+exports.fn = function (root) {
+  const seen = new Map();
+  let count = 0;
+  const defs = [];
+  traverse(root, (node) => {
+    if (
+      node.type !== 'element' ||
+      node.name !== 'path' ||
+      node.attributes.d == null
+    ) {
+      return;
+    }
+    const d = node.attributes.d;
+    const fill = node.attributes.fill || '';
+    const stroke = node.attributes.stroke || '';
+    const key = d + ';s:' + stroke + ';f:' + fill;
+    const hasSeen = seen.get(key);
+    if (!hasSeen) {
+      seen.set(key, { elem: node, reused: false });
+      return;
+    }
+    if (!hasSeen.reused) {
+      hasSeen.reused = true;
+      if (hasSeen.elem.attributes.id == null) {
+        hasSeen.elem.attributes.id = 'reuse-' + count++;
+      }
+      defs.push(hasSeen.elem);
+    }
+    convertToUse(node, hasSeen.elem.attributes.id);
+  });
+  if (defs.length > 0) {
+    const defsTag = new JSAPI(
+      {
+        type: 'element',
+        name: 'defs',
+        attributes: {},
+        children: [],
+      },
+      root
+    );
+    root.children[0].spliceContent(0, 0, defsTag);
+    for (let def of defs) {
+      // Remove class and style before copying to avoid circular refs in
+      // JSON.stringify. This is fine because we don't actually want class or
+      // style information to be copied.
+      const style = def.style;
+      const defClass = def.class;
+      delete def.style;
+      delete def.class;
+      const defClone = def.clone();
+      def.style = style;
+      def.class = defClass;
+      delete defClone.attributes.transform;
+      defsTag.spliceContent(0, 0, defClone);
+      // Convert the original def to a use so the first usage isn't duplicated.
+      def = convertToUse(def, defClone.attributes.id);
+      delete def.attributes.id;
+    }
+  }
+  return root;
+};
+
+/** */
+function convertToUse(item, href) {
+  item.renameElem('use');
+  delete item.attributes.d;
+  delete item.attributes.stroke;
+  delete item.attributes.fill;
+  item.attributes['xlink:href'] = '#' + href;
+  delete item.pathJS;
+  return item;
+}
diff --git a/node_modules/svgo/plugins/sortAttrs.js b/node_modules/svgo/plugins/sortAttrs.js
new file mode 100644
index 0000000..b965c20
--- /dev/null
+++ b/node_modules/svgo/plugins/sortAttrs.js
@@ -0,0 +1,88 @@
+'use strict';
+
+const { parseName } = require('../lib/svgo/tools.js');
+
+exports.type = 'perItem';
+
+exports.active = false;
+
+exports.description = 'sorts element attributes (disabled by default)';
+
+exports.params = {
+  order: [
+    'id',
+    'width',
+    'height',
+    'x',
+    'x1',
+    'x2',
+    'y',
+    'y1',
+    'y2',
+    'cx',
+    'cy',
+    'r',
+    'fill',
+    'stroke',
+    'marker',
+    'd',
+    'points',
+  ],
+};
+
+/**
+ * Sort element attributes for epic readability.
+ *
+ * @param {Object} item current iteration item
+ * @param {Object} params plugin params
+ *
+ * @author Nikolay Frantsev
+ */
+exports.fn = function (item, params) {
+  const orderlen = params.order.length + 1;
+  const xmlnsOrder = params.xmlnsOrder || 'front';
+
+  if (item.type === 'element') {
+    const attrs = Object.entries(item.attributes);
+
+    attrs.sort(([aName], [bName]) => {
+      const { prefix: aPrefix } = parseName(aName);
+      const { prefix: bPrefix } = parseName(bName);
+      if (aPrefix != bPrefix) {
+        // xmlns attributes implicitly have the prefix xmlns
+        if (xmlnsOrder == 'front') {
+          if (aPrefix === 'xmlns') return -1;
+          if (bPrefix === 'xmlns') return 1;
+        }
+        return aPrefix < bPrefix ? -1 : 1;
+      }
+
+      let aindex = orderlen;
+      let bindex = orderlen;
+
+      for (let i = 0; i < params.order.length; i++) {
+        if (aName == params.order[i]) {
+          aindex = i;
+        } else if (aName.indexOf(params.order[i] + '-') === 0) {
+          aindex = i + 0.5;
+        }
+        if (bName == params.order[i]) {
+          bindex = i;
+        } else if (bName.indexOf(params.order[i] + '-') === 0) {
+          bindex = i + 0.5;
+        }
+      }
+
+      if (aindex != bindex) {
+        return aindex - bindex;
+      }
+      return aName < bName ? -1 : 1;
+    });
+
+    const sorted = {};
+    for (const [name, value] of attrs) {
+      sorted[name] = value;
+    }
+    item.attributes = sorted;
+  }
+};
diff --git a/node_modules/svgo/plugins/sortDefsChildren.js b/node_modules/svgo/plugins/sortDefsChildren.js
new file mode 100644
index 0000000..3306a9a
--- /dev/null
+++ b/node_modules/svgo/plugins/sortDefsChildren.js
@@ -0,0 +1,41 @@
+'use strict';
+
+exports.type = 'perItem';
+
+exports.active = true;
+
+exports.description = 'Sorts children of <defs> to improve compression';
+
+/**
+ * Sorts children of defs in order to improve compression.
+ * Sorted first by frequency then by element name length then by element name (to ensure grouping).
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author David Leston
+ */
+exports.fn = function (item) {
+  if (item.isElem('defs')) {
+    var frequency = item.children.reduce(function (frequency, child) {
+      if (child.name in frequency) {
+        frequency[child.name]++;
+      } else {
+        frequency[child.name] = 1;
+      }
+      return frequency;
+    }, {});
+    item.children.sort(function (a, b) {
+      var frequencyComparison = frequency[b.name] - frequency[a.name];
+      if (frequencyComparison !== 0) {
+        return frequencyComparison;
+      }
+      var lengthComparison = b.name.length - a.name.length;
+      if (lengthComparison !== 0) {
+        return lengthComparison;
+      }
+      return a.name != b.name ? (a.name > b.name ? -1 : 1) : 0;
+    });
+    return true;
+  }
+};