{"version":3,"file":"index.mjs","names":["EOF","String","Number","code","code","N","F","R","code","balancePair","FunctionToken","tokenType","tokenize","EOF","balanceStart","code","tokenNames","tokenize","getCharCode","offset","TYPE.Dimension","TYPE.Percentage","TYPE.Number","TYPE.Function","TYPE.Ident","TYPE.String","code","TYPE.BadString","TYPE.Url","TYPE.BadUrl","TYPE.WhiteSpace","TYPE.Hash","TYPE.Delim","TYPE.LeftParenthesis","TYPE.RightParenthesis","TYPE.Comma","TYPE.CDC","TYPE.Comment","TYPE.Colon","TYPE.Semicolon","TYPE.CDO","TYPE.AtKeyword","TYPE.LeftSquareBracket","TYPE.RightSquareBracket","TYPE.LeftCurlyBracket","TYPE.RightCurlyBracket","name","line","SyntaxError","EXCLAMATIONMARK","NUMBERSIGN","LEFTCURLYBRACKET","name","code","tokenType","FunctionToken","number","tokenNames","NumberToken","SyntaxError","parse","tokenize","number","zero","length","name","sourceFile","SourceMapGenerator","PLUSSIGN","HYPHENMINUS","FunctionToken","NumberToken","StringToken","node","name","tokenBefore.safe","tokenBefore","noop","ensureFunction","structure","hasOwnProperty","name","walk","noop","generate","css","generate","HYPHENMINUS","keyword","name","property","descriptor","PLUSSIGN","HYPHENMINUS","N","DISALLOW_SIGN","ALLOW_SIGN","isDelim","code","checkInteger","consumeB","NumberToken","PLUSSIGN","HYPHENMINUS","QUESTIONMARK","U","code","startsWith","length","NumberToken","FunctionToken","length","name","NumberToken","StringToken","angle","decibel","frequency","flex","resolution","semitones","time","SyntaxError","TAB","N","F","R","SPACE","code","SyntaxError","N","SPACE","EXCLAMATIONMARK","NUMBERSIGN","AMPERSAND","APOSTROPHE","LEFTPARENTHESIS","RIGHTPARENTHESIS","ASTERISK","PLUSSIGN","LESSTHANSIGN","GREATERTHANSIGN","QUESTIONMARK","VERTICALLINE","readProperty","name","code","parse","walk","node","LEFTPARENTHESIS","RIGHTPARENTHESIS","name","parse","TYPE.Delim","TYPE.Comma","TYPE.Function","TYPE.LeftParenthesis","TYPE.LeftSquareBracket","TYPE.LeftCurlyBracket","TYPE.RightParenthesis","TYPE.RightSquareBracket","TYPE.RightCurlyBracket","TYPE.WhiteSpace","TYPE.Comment","name","hasOwnProperty","lastTokenIndex","TYPE.Ident","property","name","hasOwnProperty","structure","name","name","generate","trace","prepareTokens","lexer","units","structure","property","parse","syntax","names.keyword","names.property","isType","name","patch","parse","walk","generate","config","PLUSSIGN","HYPHENMINUS","code","Number","name","structure","parse","generate","consumeRaw","name","walkContext","structure","parse","generate","name","walkContext","structure","parse","generate","DOLLARSIGN","ASTERISK","EQUALSSIGN","VERTICALLINE","TILDE","code","name","structure","parse","StringToken","generate","AMPERSAND","consumeRaw","name","walkContext","structure","parse","generate","name","structure","parse","readSequence","generate","name","structure","parse","generate","name","structure","parse","generate","FULLSTOP","name","structure","parse","generate","PLUSSIGN","SOLIDUS","GREATERTHANSIGN","TILDE","name","structure","parse","generate","ASTERISK","SOLIDUS","name","structure","parse","generate","EOF","name","structure","parse","FunctionToken","generate","EXCLAMATIONMARK","NUMBERSIGN","AMPERSAND","ASTERISK","PLUSSIGN","SOLIDUS","name","walkContext","structure","parse","property","consumeRaw","generate","AMPERSAND","consumeRaw","name","structure","parse","generate","name","structure","parse","generate","SOLIDUS","name","structure","parse","Number","FunctionToken","generate","name","structure","parse","value","generate","FunctionToken","SOLIDUS","GREATERTHANSIGN","name","structure","Number","FunctionToken","parse","generate","name","walkContext","structure","parse","readSequence","generate","FunctionToken","name","structure","parse","FunctionToken","children","generate","name","structure","parse","generate","name","structure","parse","generate","name","structure","parse","generate","FULLSTOP","name","structure","parse","generate","name","structure","parse","generate","name","structure","parse","EOF","FunctionToken","generate","name","structure","parse","generate","AMPERSAND","name","structure","parse","generate","name","structure","parse","selector","nth","generate","name","structure","parse","NumberToken","generate","name","structure","parse","generate","name","structure","parse","readSequence","generate","name","structure","parse","generate","name","walkContext","structure","parse","FunctionToken","generate","name","walkContext","structure","parse","FunctionToken","generate","SOLIDUS","NumberToken","FunctionToken","name","structure","parse","generate","name","structure","parse","generate","consumeRaw","name","walkContext","structure","parse","generate","name","structure","parse","generate","name","structure","parse","generate","name","walkContext","structure","parse","generate","REVERSE_SOLIDUS","QUOTATION_MARK","APOSTROPHE","decode","code","encode","name","structure","parse","decode","StringToken","generate","encode","name","structure","parse","generate","name","structure","parse","generate","ASTERISK","VERTICALLINE","name","structure","parse","generate","PLUSSIGN","HYPHENMINUS","code","Number","name","structure","parse","generate","SPACE","code","name","structure","parse","url.decode","FunctionToken","string.decode","StringToken","generate","url.encode","name","structure","parse","generate","parse","generate","definitions","NUMBERSIGN","ASTERISK","PLUSSIGN","SOLIDUS","StringToken","NumberToken","FunctionToken","code","NumberToken","expressionFn","varFn","name","parse","StringToken","FunctionToken","fontFace","importAtrule","startingStyle","StringToken","createSyntax","lexerConfig","parserConfig","walkerConfig","syntax","string.decode","node","name","node","string.decode","css","css","css","indexCss","preflightCss","themeCss","utilitiesCss","css","React"],"sources":["../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/tokenizer/types.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/tokenizer/char-code-definitions.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/tokenizer/utils.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/tokenizer/names.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/tokenizer/adopt-buffer.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/tokenizer/OffsetToLocation.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/tokenizer/TokenStream.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/tokenizer/index.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/utils/List.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/utils/create-custom-error.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/parser/SyntaxError.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/parser/sequence.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/parser/create.js","../../../node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/base64.js","../../../node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/base64-vlq.js","../../../node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/util.js","../../../node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/array-set.js","../../../node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/mapping-list.js","../../../node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/lib/source-map-generator.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/generator/sourceMap.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/generator/token-before.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/generator/create.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/convertor/create.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/walker/create.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/definition-syntax/generate.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/lexer/error.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/utils/names.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/lexer/generic-const.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/lexer/generic-an-plus-b.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/lexer/generic-urange.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/lexer/generic.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/lexer/units.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/definition-syntax/SyntaxError.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/definition-syntax/scanner.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/definition-syntax/parse.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/definition-syntax/walk.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/lexer/prepare-tokens.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/lexer/match-graph.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/lexer/match.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/lexer/trace.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/lexer/search.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/lexer/structure.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/lexer/Lexer.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/config/mix.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/create.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/data-patch.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/data.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/AnPlusB.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Atrule.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/AtrulePrelude.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/AttributeSelector.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Block.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Brackets.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/CDC.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/CDO.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/ClassSelector.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Combinator.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Comment.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Condition.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Declaration.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/DeclarationList.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Dimension.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Feature.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/FeatureFunction.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/FeatureRange.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Function.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/GeneralEnclosed.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Hash.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Identifier.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/IdSelector.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Layer.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/LayerList.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/MediaQuery.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/MediaQueryList.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/NestingSelector.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Nth.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Number.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Operator.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Parentheses.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Percentage.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/PseudoClassSelector.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/PseudoElementSelector.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Ratio.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Raw.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Rule.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Scope.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Selector.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/SelectorList.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/utils/string.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/String.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/StyleSheet.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/SupportsDeclaration.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/TypeSelector.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/UnicodeRange.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/utils/url.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Url.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/Value.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/WhiteSpace.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/index.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/config/lexer.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/scope/default.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/scope/atrulePrelude.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/scope/selector.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/function/expression.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/function/var.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/scope/value.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/scope/index.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/atrule/container.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/atrule/font-face.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/atrule/import.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/atrule/layer.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/atrule/media.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/atrule/nest.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/atrule/page.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/atrule/scope.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/atrule/starting-style.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/atrule/supports.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/atrule/index.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/pseudo/lang.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/pseudo/index.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/node/index-parse.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/config/parser.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/config/walker.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/syntax/index.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/version.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/utils/clone.js","../../../node_modules/.pnpm/css-tree@3.1.0/node_modules/css-tree/lib/index.js","../src/utils/css/is-rule-inlinable.ts","../src/utils/css/is-part-inlinable.ts","../src/utils/css/split-mixed-rule.ts","../src/utils/css/extract-rules-per-class.ts","../src/utils/css/get-custom-properties.ts","../src/utils/text/from-dash-case-to-camel-case.ts","../src/utils/compatibility/get-react-property.ts","../src/utils/css/unwrap-value.ts","../src/utils/css/make-inline-styles-for.ts","../src/inline-styles.ts","../src/utils/css/resolve-all-css-variables.ts","../src/utils/css/resolve-calc-expressions.ts","../src/utils/css/sanitize-declarations.ts","../src/sanitize-stylesheet.ts","../src/hooks/use-suspended-promise.ts","../src/utils/compatibility/sanitize-class-name.ts","../src/utils/css/sanitize-non-inlinable-rules.ts","../src/utils/react/is-component.ts","../src/utils/react/map-react-tree.ts","../src/utils/tailwindcss/clone-element-with-inlined-styles.ts","../src/utils/tailwindcss/tailwind-stylesheets/index.ts","../src/utils/tailwindcss/tailwind-stylesheets/preflight.ts","../src/utils/tailwindcss/tailwind-stylesheets/theme.ts","../src/utils/tailwindcss/tailwind-stylesheets/utilities.ts","../src/utils/tailwindcss/setup-tailwind.ts","../src/tailwind.tsx"],"sourcesContent":["// CSS Syntax Module Level 3\n// https://www.w3.org/TR/css-syntax-3/\nexport const EOF = 0;                 // <EOF-token>\nexport const Ident = 1;               // <ident-token>\nexport const Function = 2;            // <function-token>\nexport const AtKeyword = 3;           // <at-keyword-token>\nexport const Hash = 4;                // <hash-token>\nexport const String = 5;              // <string-token>\nexport const BadString = 6;           // <bad-string-token>\nexport const Url = 7;                 // <url-token>\nexport const BadUrl = 8;              // <bad-url-token>\nexport const Delim = 9;               // <delim-token>\nexport const Number = 10;             // <number-token>\nexport const Percentage = 11;         // <percentage-token>\nexport const Dimension = 12;          // <dimension-token>\nexport const WhiteSpace = 13;         // <whitespace-token>\nexport const CDO = 14;                // <CDO-token>\nexport const CDC = 15;                // <CDC-token>\nexport const Colon = 16;              // <colon-token>     :\nexport const Semicolon = 17;          // <semicolon-token> ;\nexport const Comma = 18;              // <comma-token>     ,\nexport const LeftSquareBracket = 19;  // <[-token>\nexport const RightSquareBracket = 20; // <]-token>\nexport const LeftParenthesis = 21;    // <(-token>\nexport const RightParenthesis = 22;   // <)-token>\nexport const LeftCurlyBracket = 23;   // <{-token>\nexport const RightCurlyBracket = 24;  // <}-token>\nexport const Comment = 25;\n","const EOF = 0;\n\n// https://drafts.csswg.org/css-syntax-3/\n// § 4.2. Definitions\n\n// digit\n// A code point between U+0030 DIGIT ZERO (0) and U+0039 DIGIT NINE (9).\nexport function isDigit(code) {\n    return code >= 0x0030 && code <= 0x0039;\n}\n\n// hex digit\n// A digit, or a code point between U+0041 LATIN CAPITAL LETTER A (A) and U+0046 LATIN CAPITAL LETTER F (F),\n// or a code point between U+0061 LATIN SMALL LETTER A (a) and U+0066 LATIN SMALL LETTER F (f).\nexport function isHexDigit(code) {\n    return (\n        isDigit(code) || // 0 .. 9\n        (code >= 0x0041 && code <= 0x0046) || // A .. F\n        (code >= 0x0061 && code <= 0x0066)    // a .. f\n    );\n}\n\n// uppercase letter\n// A code point between U+0041 LATIN CAPITAL LETTER A (A) and U+005A LATIN CAPITAL LETTER Z (Z).\nexport function isUppercaseLetter(code) {\n    return code >= 0x0041 && code <= 0x005A;\n}\n\n// lowercase letter\n// A code point between U+0061 LATIN SMALL LETTER A (a) and U+007A LATIN SMALL LETTER Z (z).\nexport function isLowercaseLetter(code) {\n    return code >= 0x0061 && code <= 0x007A;\n}\n\n// letter\n// An uppercase letter or a lowercase letter.\nexport function isLetter(code) {\n    return isUppercaseLetter(code) || isLowercaseLetter(code);\n}\n\n// non-ASCII code point\n// A code point with a value equal to or greater than U+0080 <control>.\n//\n// 2024-09-02: The latest spec narrows the range for non-ASCII characters (see https://github.com/csstree/csstree/issues/188).\n// However, all modern browsers support a wider range, and strictly following the latest spec could result\n// in some CSS being parsed incorrectly, even though it works in the browser. Therefore, this function adheres\n// to the previous, broader definition of non-ASCII characters.\nexport function isNonAscii(code) {\n    return code >= 0x0080;\n}\n\n// name-start code point\n// A letter, a non-ASCII code point, or U+005F LOW LINE (_).\nexport function isNameStart(code) {\n    return isLetter(code) || isNonAscii(code) || code === 0x005F;\n}\n\n// name code point\n// A name-start code point, a digit, or U+002D HYPHEN-MINUS (-).\nexport function isName(code) {\n    return isNameStart(code) || isDigit(code) || code === 0x002D;\n}\n\n// non-printable code point\n// A code point between U+0000 NULL and U+0008 BACKSPACE, or U+000B LINE TABULATION,\n// or a code point between U+000E SHIFT OUT and U+001F INFORMATION SEPARATOR ONE, or U+007F DELETE.\nexport function isNonPrintable(code) {\n    return (\n        (code >= 0x0000 && code <= 0x0008) ||\n        (code === 0x000B) ||\n        (code >= 0x000E && code <= 0x001F) ||\n        (code === 0x007F)\n    );\n}\n\n// newline\n// U+000A LINE FEED. Note that U+000D CARRIAGE RETURN and U+000C FORM FEED are not included in this definition,\n// as they are converted to U+000A LINE FEED during preprocessing.\n// TODO: we doesn't do a preprocessing, so check a code point for U+000D CARRIAGE RETURN and U+000C FORM FEED\nexport function isNewline(code) {\n    return code === 0x000A || code === 0x000D || code === 0x000C;\n}\n\n// whitespace\n// A newline, U+0009 CHARACTER TABULATION, or U+0020 SPACE.\nexport function isWhiteSpace(code) {\n    return isNewline(code) || code === 0x0020 || code === 0x0009;\n}\n\n// § 4.3.8. Check if two code points are a valid escape\nexport function isValidEscape(first, second) {\n    // If the first code point is not U+005C REVERSE SOLIDUS (\\), return false.\n    if (first !== 0x005C) {\n        return false;\n    }\n\n    // Otherwise, if the second code point is a newline or EOF, return false.\n    if (isNewline(second) || second === EOF) {\n        return false;\n    }\n\n    // Otherwise, return true.\n    return true;\n}\n\n// § 4.3.9. Check if three code points would start an identifier\nexport function isIdentifierStart(first, second, third) {\n    // Look at the first code point:\n\n    // U+002D HYPHEN-MINUS\n    if (first === 0x002D) {\n        // If the second code point is a name-start code point or a U+002D HYPHEN-MINUS,\n        // or the second and third code points are a valid escape, return true. Otherwise, return false.\n        return (\n            isNameStart(second) ||\n            second === 0x002D ||\n            isValidEscape(second, third)\n        );\n    }\n\n    // name-start code point\n    if (isNameStart(first)) {\n        // Return true.\n        return true;\n    }\n\n    // U+005C REVERSE SOLIDUS (\\)\n    if (first === 0x005C) {\n        // If the first and second code points are a valid escape, return true. Otherwise, return false.\n        return isValidEscape(first, second);\n    }\n\n    // anything else\n    // Return false.\n    return false;\n}\n\n// § 4.3.10. Check if three code points would start a number\nexport function isNumberStart(first, second, third) {\n    // Look at the first code point:\n\n    // U+002B PLUS SIGN (+)\n    // U+002D HYPHEN-MINUS (-)\n    if (first === 0x002B || first === 0x002D) {\n        // If the second code point is a digit, return true.\n        if (isDigit(second)) {\n            return 2;\n        }\n\n        // Otherwise, if the second code point is a U+002E FULL STOP (.)\n        // and the third code point is a digit, return true.\n        // Otherwise, return false.\n        return second === 0x002E && isDigit(third) ? 3 : 0;\n    }\n\n    // U+002E FULL STOP (.)\n    if (first === 0x002E) {\n        // If the second code point is a digit, return true. Otherwise, return false.\n        return isDigit(second) ? 2 : 0;\n    }\n\n    // digit\n    if (isDigit(first)) {\n        // Return true.\n        return 1;\n    }\n\n    // anything else\n    // Return false.\n    return 0;\n}\n\n//\n// Misc\n//\n\n// detect BOM (https://en.wikipedia.org/wiki/Byte_order_mark)\nexport function isBOM(code) {\n    // UTF-16BE\n    if (code === 0xFEFF) {\n        return 1;\n    }\n\n    // UTF-16LE\n    if (code === 0xFFFE) {\n        return 1;\n    }\n\n    return 0;\n}\n\n// Fast code category\n// Only ASCII code points has a special meaning, that's why we define a maps for 0..127 codes only\nconst CATEGORY = new Array(0x80);\nexport const EofCategory = 0x80;\nexport const WhiteSpaceCategory = 0x82;\nexport const DigitCategory = 0x83;\nexport const NameStartCategory = 0x84;\nexport const NonPrintableCategory = 0x85;\n\nfor (let i = 0; i < CATEGORY.length; i++) {\n    CATEGORY[i] =\n        isWhiteSpace(i) && WhiteSpaceCategory ||\n        isDigit(i) && DigitCategory ||\n        isNameStart(i) && NameStartCategory ||\n        isNonPrintable(i) && NonPrintableCategory ||\n        i || EofCategory;\n}\n\nexport function charCodeCategory(code) {\n    return code < 0x80 ? CATEGORY[code] : NameStartCategory;\n}\n","import {\n    isDigit,\n    isHexDigit,\n    isUppercaseLetter,\n    isName,\n    isWhiteSpace,\n    isValidEscape\n} from './char-code-definitions.js';\n\nfunction getCharCode(source, offset) {\n    return offset < source.length ? source.charCodeAt(offset) : 0;\n}\n\nexport function getNewlineLength(source, offset, code) {\n    if (code === 13 /* \\r */ && getCharCode(source, offset + 1) === 10 /* \\n */) {\n        return 2;\n    }\n\n    return 1;\n}\n\nexport function cmpChar(testStr, offset, referenceCode) {\n    let code = testStr.charCodeAt(offset);\n\n    // code.toLowerCase() for A..Z\n    if (isUppercaseLetter(code)) {\n        code = code | 32;\n    }\n\n    return code === referenceCode;\n}\n\nexport function cmpStr(testStr, start, end, referenceStr) {\n    if (end - start !== referenceStr.length) {\n        return false;\n    }\n\n    if (start < 0 || end > testStr.length) {\n        return false;\n    }\n\n    for (let i = start; i < end; i++) {\n        const referenceCode = referenceStr.charCodeAt(i - start);\n        let testCode = testStr.charCodeAt(i);\n\n        // testCode.toLowerCase() for A..Z\n        if (isUppercaseLetter(testCode)) {\n            testCode = testCode | 32;\n        }\n\n        if (testCode !== referenceCode) {\n            return false;\n        }\n    }\n\n    return true;\n}\n\nexport function findWhiteSpaceStart(source, offset) {\n    for (; offset >= 0; offset--) {\n        if (!isWhiteSpace(source.charCodeAt(offset))) {\n            break;\n        }\n    }\n\n    return offset + 1;\n}\n\nexport function findWhiteSpaceEnd(source, offset) {\n    for (; offset < source.length; offset++) {\n        if (!isWhiteSpace(source.charCodeAt(offset))) {\n            break;\n        }\n    }\n\n    return offset;\n}\n\nexport function findDecimalNumberEnd(source, offset) {\n    for (; offset < source.length; offset++) {\n        if (!isDigit(source.charCodeAt(offset))) {\n            break;\n        }\n    }\n\n    return offset;\n}\n\n// § 4.3.7. Consume an escaped code point\nexport function consumeEscaped(source, offset) {\n    // It assumes that the U+005C REVERSE SOLIDUS (\\) has already been consumed and\n    // that the next input code point has already been verified to be part of a valid escape.\n    offset += 2;\n\n    // hex digit\n    if (isHexDigit(getCharCode(source, offset - 1))) {\n        // Consume as many hex digits as possible, but no more than 5.\n        // Note that this means 1-6 hex digits have been consumed in total.\n        for (const maxOffset = Math.min(source.length, offset + 5); offset < maxOffset; offset++) {\n            if (!isHexDigit(getCharCode(source, offset))) {\n                break;\n            }\n        }\n\n        // If the next input code point is whitespace, consume it as well.\n        const code = getCharCode(source, offset);\n        if (isWhiteSpace(code)) {\n            offset += getNewlineLength(source, offset, code);\n        }\n    }\n\n    return offset;\n}\n\n// §4.3.11. Consume a name\n// Note: This algorithm does not do the verification of the first few code points that are necessary\n// to ensure the returned code points would constitute an <ident-token>. If that is the intended use,\n// ensure that the stream starts with an identifier before calling this algorithm.\nexport function consumeName(source, offset) {\n    // Let result initially be an empty string.\n    // Repeatedly consume the next input code point from the stream:\n    for (; offset < source.length; offset++) {\n        const code = source.charCodeAt(offset);\n\n        // name code point\n        if (isName(code)) {\n            // Append the code point to result.\n            continue;\n        }\n\n        // the stream starts with a valid escape\n        if (isValidEscape(code, getCharCode(source, offset + 1))) {\n            // Consume an escaped code point. Append the returned code point to result.\n            offset = consumeEscaped(source, offset) - 1;\n            continue;\n        }\n\n        // anything else\n        // Reconsume the current input code point. Return result.\n        break;\n    }\n\n    return offset;\n}\n\n// §4.3.12. Consume a number\nexport function consumeNumber(source, offset) {\n    let code = source.charCodeAt(offset);\n\n    // 2. If the next input code point is U+002B PLUS SIGN (+) or U+002D HYPHEN-MINUS (-),\n    // consume it and append it to repr.\n    if (code === 0x002B || code === 0x002D) {\n        code = source.charCodeAt(offset += 1);\n    }\n\n    // 3. While the next input code point is a digit, consume it and append it to repr.\n    if (isDigit(code)) {\n        offset = findDecimalNumberEnd(source, offset + 1);\n        code = source.charCodeAt(offset);\n    }\n\n    // 4. If the next 2 input code points are U+002E FULL STOP (.) followed by a digit, then:\n    if (code === 0x002E && isDigit(source.charCodeAt(offset + 1))) {\n        // 4.1 Consume them.\n        // 4.2 Append them to repr.\n        offset += 2;\n\n        // 4.3 Set type to \"number\".\n        // TODO\n\n        // 4.4 While the next input code point is a digit, consume it and append it to repr.\n\n        offset = findDecimalNumberEnd(source, offset);\n    }\n\n    // 5. If the next 2 or 3 input code points are U+0045 LATIN CAPITAL LETTER E (E)\n    // or U+0065 LATIN SMALL LETTER E (e), ... , followed by a digit, then:\n    if (cmpChar(source, offset, 101 /* e */)) {\n        let sign = 0;\n        code = source.charCodeAt(offset + 1);\n\n        // ... optionally followed by U+002D HYPHEN-MINUS (-) or U+002B PLUS SIGN (+) ...\n        if (code === 0x002D || code === 0x002B) {\n            sign = 1;\n            code = source.charCodeAt(offset + 2);\n        }\n\n        // ... followed by a digit\n        if (isDigit(code)) {\n            // 5.1 Consume them.\n            // 5.2 Append them to repr.\n\n            // 5.3 Set type to \"number\".\n            // TODO\n\n            // 5.4 While the next input code point is a digit, consume it and append it to repr.\n            offset = findDecimalNumberEnd(source, offset + 1 + sign + 1);\n        }\n    }\n\n    return offset;\n}\n\n// § 4.3.14. Consume the remnants of a bad url\n// ... its sole use is to consume enough of the input stream to reach a recovery point\n// where normal tokenizing can resume.\nexport function consumeBadUrlRemnants(source, offset) {\n    // Repeatedly consume the next input code point from the stream:\n    for (; offset < source.length; offset++) {\n        const code = source.charCodeAt(offset);\n\n        // U+0029 RIGHT PARENTHESIS ())\n        // EOF\n        if (code === 0x0029) {\n            // Return.\n            offset++;\n            break;\n        }\n\n        if (isValidEscape(code, getCharCode(source, offset + 1))) {\n            // Consume an escaped code point.\n            // Note: This allows an escaped right parenthesis (\"\\)\") to be encountered\n            // without ending the <bad-url-token>. This is otherwise identical to\n            // the \"anything else\" clause.\n            offset = consumeEscaped(source, offset);\n        }\n    }\n\n    return offset;\n}\n\n// § 4.3.7. Consume an escaped code point\n// Note: This algorithm assumes that escaped is valid without leading U+005C REVERSE SOLIDUS (\\)\nexport function decodeEscaped(escaped) {\n    // Single char escaped that's not a hex digit\n    if (escaped.length === 1 && !isHexDigit(escaped.charCodeAt(0))) {\n        return escaped[0];\n    }\n\n    // Interpret the hex digits as a hexadecimal number.\n    let code = parseInt(escaped, 16);\n\n    if (\n        (code === 0) ||                       // If this number is zero,\n        (code >= 0xD800 && code <= 0xDFFF) || // or is for a surrogate,\n        (code > 0x10FFFF)                     // or is greater than the maximum allowed code point\n    ) {\n        // ... return U+FFFD REPLACEMENT CHARACTER\n        code = 0xFFFD;\n    }\n\n    // Otherwise, return the code point with that value.\n    return String.fromCodePoint(code);\n}\n","export default [\n    'EOF-token',\n    'ident-token',\n    'function-token',\n    'at-keyword-token',\n    'hash-token',\n    'string-token',\n    'bad-string-token',\n    'url-token',\n    'bad-url-token',\n    'delim-token',\n    'number-token',\n    'percentage-token',\n    'dimension-token',\n    'whitespace-token',\n    'CDO-token',\n    'CDC-token',\n    'colon-token',\n    'semicolon-token',\n    'comma-token',\n    '[-token',\n    ']-token',\n    '(-token',\n    ')-token',\n    '{-token',\n    '}-token',\n    'comment-token'\n];\n","const MIN_SIZE = 16 * 1024;\n\nexport function adoptBuffer(buffer = null, size) {\n    if (buffer === null || buffer.length < size) {\n        return new Uint32Array(Math.max(size + 1024, MIN_SIZE));\n    }\n\n    return buffer;\n};\n","import { adoptBuffer } from './adopt-buffer.js';\nimport { isBOM } from './char-code-definitions.js';\n\nconst N = 10;\nconst F = 12;\nconst R = 13;\n\nfunction computeLinesAndColumns(host) {\n    const source = host.source;\n    const sourceLength = source.length;\n    const startOffset = source.length > 0 ? isBOM(source.charCodeAt(0)) : 0;\n    const lines = adoptBuffer(host.lines, sourceLength);\n    const columns = adoptBuffer(host.columns, sourceLength);\n    let line = host.startLine;\n    let column = host.startColumn;\n\n    for (let i = startOffset; i < sourceLength; i++) {\n        const code = source.charCodeAt(i);\n\n        lines[i] = line;\n        columns[i] = column++;\n\n        if (code === N || code === R || code === F) {\n            if (code === R && i + 1 < sourceLength && source.charCodeAt(i + 1) === N) {\n                i++;\n                lines[i] = line;\n                columns[i] = column;\n            }\n\n            line++;\n            column = 1;\n        }\n    }\n\n    lines[sourceLength] = line;\n    columns[sourceLength] = column;\n\n    host.lines = lines;\n    host.columns = columns;\n    host.computed = true;\n}\n\nexport class OffsetToLocation {\n    constructor(source, startOffset, startLine, startColumn) {\n        this.setSource(source, startOffset, startLine, startColumn);\n        this.lines = null;\n        this.columns = null;\n    }\n    setSource(source = '', startOffset = 0, startLine = 1, startColumn = 1) {\n        this.source = source;\n        this.startOffset = startOffset;\n        this.startLine = startLine;\n        this.startColumn = startColumn;\n        this.computed = false;\n    }\n    getLocation(offset, filename) {\n        if (!this.computed) {\n            computeLinesAndColumns(this);\n        }\n\n        return {\n            source: filename,\n            offset: this.startOffset + offset,\n            line: this.lines[offset],\n            column: this.columns[offset]\n        };\n    }\n    getLocationRange(start, end, filename) {\n        if (!this.computed) {\n            computeLinesAndColumns(this);\n        }\n\n        return {\n            source: filename,\n            start: {\n                offset: this.startOffset + start,\n                line: this.lines[start],\n                column: this.columns[start]\n            },\n            end: {\n                offset: this.startOffset + end,\n                line: this.lines[end],\n                column: this.columns[end]\n            }\n        };\n    }\n};\n","import { adoptBuffer } from './adopt-buffer.js';\nimport { cmpStr } from './utils.js';\nimport tokenNames from './names.js';\nimport {\n    WhiteSpace,\n    Comment,\n    Delim,\n    EOF,\n    Function as FunctionToken,\n    LeftParenthesis,\n    RightParenthesis,\n    LeftSquareBracket,\n    RightSquareBracket,\n    LeftCurlyBracket,\n    RightCurlyBracket\n} from './types.js';\n\nconst OFFSET_MASK = 0x00FFFFFF;\nconst TYPE_SHIFT = 24;\nconst balancePair = new Uint8Array(32); // 32b of memory ought to be enough for anyone (any number of tokens)\nbalancePair[FunctionToken] = RightParenthesis;\nbalancePair[LeftParenthesis] = RightParenthesis;\nbalancePair[LeftSquareBracket] = RightSquareBracket;\nbalancePair[LeftCurlyBracket] = RightCurlyBracket;\n\nfunction isBlockOpenerToken(tokenType) {\n    return balancePair[tokenType] !== 0;\n}\n\nexport class TokenStream {\n    constructor(source, tokenize) {\n        this.setSource(source, tokenize);\n    }\n    reset() {\n        this.eof = false;\n        this.tokenIndex = -1;\n        this.tokenType = 0;\n        this.tokenStart = this.firstCharOffset;\n        this.tokenEnd = this.firstCharOffset;\n    }\n    setSource(source = '', tokenize = () => {}) {\n        source = String(source || '');\n\n        const sourceLength = source.length;\n        const offsetAndType = adoptBuffer(this.offsetAndType, source.length + 1); // +1 because of eof-token\n        const balance = adoptBuffer(this.balance, source.length + 1);\n        let tokenCount = 0;\n        let firstCharOffset = -1;\n        let balanceCloseType = 0;\n        let balanceStart = source.length;\n\n        // capture buffers\n        this.offsetAndType = null;\n        this.balance = null;\n        balance.fill(0);\n\n        tokenize(source, (type, start, end) => {\n            const index = tokenCount++;\n\n            // type & offset\n            offsetAndType[index] = (type << TYPE_SHIFT) | end;\n\n            if (firstCharOffset === -1) {\n                firstCharOffset = start;\n            }\n\n            // balance\n            balance[index] = balanceStart;\n\n            if (type === balanceCloseType) {\n                const prevBalanceStart = balance[balanceStart];\n\n                // set reference to balance end for a block opener\n                balance[balanceStart] = index;\n\n                // pop state\n                balanceStart = prevBalanceStart;\n                balanceCloseType = balancePair[offsetAndType[prevBalanceStart] >> TYPE_SHIFT];\n            } else if (isBlockOpenerToken(type)) { // check for FunctionToken, <(-token>, <[-token> and <{-token>\n                // push state\n                balanceStart = index;\n                balanceCloseType = balancePair[type];\n            }\n        });\n\n        // finalize buffers\n        offsetAndType[tokenCount] = (EOF << TYPE_SHIFT) | sourceLength; // <EOF-token>\n        balance[tokenCount] = tokenCount; // prevents false positive balance match with any token\n\n        // reverse references from balance start to end\n        // tokens\n        //   token:   a ( [ b c ] d e ) {\n        //   index:   0 1 2 3 4 5 6 7 8 9\n        // before\n        //   balance: 0 8 5 2 2 2 1 1 1 0\n        //            - > > < < < < < < -\n        // after\n        //   balance: 9 8 5 5 5 2 8 8 1 9\n        //            > > > > > < > > < >\n        for (let i = 0; i < tokenCount; i++) {\n            const balanceStart = balance[i];\n\n            if (balanceStart <= i) {\n                const balanceEnd = balance[balanceStart];\n\n                if (balanceEnd !== i) {\n                    balance[i] = balanceEnd;\n                }\n            } else if (balanceStart > tokenCount) {\n                balance[i] = tokenCount;\n            }\n        }\n\n        // balance[0] = tokenCount;\n\n        this.source = source;\n        this.firstCharOffset = firstCharOffset === -1 ? 0 : firstCharOffset;\n        this.tokenCount = tokenCount;\n        this.offsetAndType = offsetAndType;\n        this.balance = balance;\n\n        this.reset();\n        this.next();\n    }\n\n    lookupType(offset) {\n        offset += this.tokenIndex;\n\n        if (offset < this.tokenCount) {\n            return this.offsetAndType[offset] >> TYPE_SHIFT;\n        }\n\n        return EOF;\n    }\n    lookupTypeNonSC(idx) {\n        for (let offset = this.tokenIndex; offset < this.tokenCount; offset++) {\n            const tokenType = this.offsetAndType[offset] >> TYPE_SHIFT;\n\n            if (tokenType !== WhiteSpace && tokenType !== Comment) {\n                if (idx-- === 0) {\n                    return tokenType;\n                }\n            }\n        }\n\n        return EOF;\n    }\n    lookupOffset(offset) {\n        offset += this.tokenIndex;\n\n        if (offset < this.tokenCount) {\n            return this.offsetAndType[offset - 1] & OFFSET_MASK;\n        }\n\n        return this.source.length;\n    }\n    lookupOffsetNonSC(idx) {\n        for (let offset = this.tokenIndex; offset < this.tokenCount; offset++) {\n            const tokenType = this.offsetAndType[offset] >> TYPE_SHIFT;\n\n            if (tokenType !== WhiteSpace && tokenType !== Comment) {\n                if (idx-- === 0) {\n                    return offset - this.tokenIndex;\n                }\n            }\n        }\n\n        return EOF;\n    }\n    lookupValue(offset, referenceStr) {\n        offset += this.tokenIndex;\n\n        if (offset < this.tokenCount) {\n            return cmpStr(\n                this.source,\n                this.offsetAndType[offset - 1] & OFFSET_MASK,\n                this.offsetAndType[offset] & OFFSET_MASK,\n                referenceStr\n            );\n        }\n\n        return false;\n    }\n    getTokenStart(tokenIndex) {\n        if (tokenIndex === this.tokenIndex) {\n            return this.tokenStart;\n        }\n\n        if (tokenIndex > 0) {\n            return tokenIndex < this.tokenCount\n                ? this.offsetAndType[tokenIndex - 1] & OFFSET_MASK\n                : this.offsetAndType[this.tokenCount] & OFFSET_MASK;\n        }\n\n        return this.firstCharOffset;\n    }\n    substrToCursor(start) {\n        return this.source.substring(start, this.tokenStart);\n    }\n\n    isBalanceEdge(pos) {\n        return this.balance[this.tokenIndex] < pos;\n        // return this.balance[this.balance[pos]] !== this.tokenIndex;\n    }\n    isDelim(code, offset) {\n        if (offset) {\n            return (\n                this.lookupType(offset) === Delim &&\n                this.source.charCodeAt(this.lookupOffset(offset)) === code\n            );\n        }\n\n        return (\n            this.tokenType === Delim &&\n            this.source.charCodeAt(this.tokenStart) === code\n        );\n    }\n\n    skip(tokenCount) {\n        let next = this.tokenIndex + tokenCount;\n\n        if (next < this.tokenCount) {\n            this.tokenIndex = next;\n            this.tokenStart = this.offsetAndType[next - 1] & OFFSET_MASK;\n            next = this.offsetAndType[next];\n            this.tokenType = next >> TYPE_SHIFT;\n            this.tokenEnd = next & OFFSET_MASK;\n        } else {\n            this.tokenIndex = this.tokenCount;\n            this.next();\n        }\n    }\n    next() {\n        let next = this.tokenIndex + 1;\n\n        if (next < this.tokenCount) {\n            this.tokenIndex = next;\n            this.tokenStart = this.tokenEnd;\n            next = this.offsetAndType[next];\n            this.tokenType = next >> TYPE_SHIFT;\n            this.tokenEnd = next & OFFSET_MASK;\n        } else {\n            this.eof = true;\n            this.tokenIndex = this.tokenCount;\n            this.tokenType = EOF;\n            this.tokenStart = this.tokenEnd = this.source.length;\n        }\n    }\n    skipSC() {\n        while (this.tokenType === WhiteSpace || this.tokenType === Comment) {\n            this.next();\n        }\n    }\n    skipUntilBalanced(startToken, stopConsume) {\n        let cursor = startToken;\n        let balanceEnd = 0;\n        let offset = 0;\n\n        loop:\n        for (; cursor < this.tokenCount; cursor++) {\n            balanceEnd = this.balance[cursor];\n\n            // stop scanning on balance edge that points to offset before start token\n            if (balanceEnd < startToken) {\n                break loop;\n            }\n\n            offset = cursor > 0 ? this.offsetAndType[cursor - 1] & OFFSET_MASK : this.firstCharOffset;\n\n            // check stop condition\n            switch (stopConsume(this.source.charCodeAt(offset))) {\n                case 1: // just stop\n                    break loop;\n\n                case 2: // stop & included\n                    cursor++;\n                    break loop;\n\n                default:\n                    // fast forward to the end of balanced block for an open block tokens\n                    if (isBlockOpenerToken(this.offsetAndType[cursor] >> TYPE_SHIFT)) {\n                        cursor = balanceEnd;\n                    }\n            }\n        }\n\n        this.skip(cursor - this.tokenIndex);\n    }\n\n    forEachToken(fn) {\n        for (let i = 0, offset = this.firstCharOffset; i < this.tokenCount; i++) {\n            const start = offset;\n            const item = this.offsetAndType[i];\n            const end = item & OFFSET_MASK;\n            const type = item >> TYPE_SHIFT;\n\n            offset = end;\n\n            fn(type, start, end, i);\n        }\n    }\n    dump() {\n        const tokens = new Array(this.tokenCount);\n\n        this.forEachToken((type, start, end, index) => {\n            tokens[index] = {\n                idx: index,\n                type: tokenNames[type],\n                chunk: this.source.substring(start, end),\n                balance: this.balance[index]\n            };\n        });\n\n        return tokens;\n    }\n};\n","import * as TYPE from './types.js';\nimport {\n    isNewline,\n    isName,\n    isValidEscape,\n    isNumberStart,\n    isIdentifierStart,\n    isBOM,\n    charCodeCategory,\n    WhiteSpaceCategory,\n    DigitCategory,\n    NameStartCategory,\n    NonPrintableCategory\n} from './char-code-definitions.js';\nimport {\n    cmpStr,\n    getNewlineLength,\n    findWhiteSpaceEnd,\n    consumeEscaped,\n    consumeName,\n    consumeNumber,\n    consumeBadUrlRemnants\n} from './utils.js';\n\nexport function tokenize(source, onToken) {\n    function getCharCode(offset) {\n        return offset < sourceLength ? source.charCodeAt(offset) : 0;\n    }\n\n    // § 4.3.3. Consume a numeric token\n    function consumeNumericToken() {\n        // Consume a number and let number be the result.\n        offset = consumeNumber(source, offset);\n\n        // If the next 3 input code points would start an identifier, then:\n        if (isIdentifierStart(getCharCode(offset), getCharCode(offset + 1), getCharCode(offset + 2))) {\n            // Create a <dimension-token> with the same value and type flag as number, and a unit set initially to the empty string.\n            // Consume a name. Set the <dimension-token>’s unit to the returned value.\n            // Return the <dimension-token>.\n            type = TYPE.Dimension;\n            offset = consumeName(source, offset);\n            return;\n        }\n\n        // Otherwise, if the next input code point is U+0025 PERCENTAGE SIGN (%), consume it.\n        if (getCharCode(offset) === 0x0025) {\n            // Create a <percentage-token> with the same value as number, and return it.\n            type = TYPE.Percentage;\n            offset++;\n            return;\n        }\n\n        // Otherwise, create a <number-token> with the same value and type flag as number, and return it.\n        type = TYPE.Number;\n    }\n\n    // § 4.3.4. Consume an ident-like token\n    function consumeIdentLikeToken() {\n        const nameStartOffset = offset;\n\n        // Consume a name, and let string be the result.\n        offset = consumeName(source, offset);\n\n        // If string’s value is an ASCII case-insensitive match for \"url\",\n        // and the next input code point is U+0028 LEFT PARENTHESIS ((), consume it.\n        if (cmpStr(source, nameStartOffset, offset, 'url') && getCharCode(offset) === 0x0028) {\n            // While the next two input code points are whitespace, consume the next input code point.\n            offset = findWhiteSpaceEnd(source, offset + 1);\n\n            // If the next one or two input code points are U+0022 QUOTATION MARK (\"), U+0027 APOSTROPHE ('),\n            // or whitespace followed by U+0022 QUOTATION MARK (\") or U+0027 APOSTROPHE ('),\n            // then create a <function-token> with its value set to string and return it.\n            if (getCharCode(offset) === 0x0022 ||\n                getCharCode(offset) === 0x0027) {\n                type = TYPE.Function;\n                offset = nameStartOffset + 4;\n                return;\n            }\n\n            // Otherwise, consume a url token, and return it.\n            consumeUrlToken();\n            return;\n        }\n\n        // Otherwise, if the next input code point is U+0028 LEFT PARENTHESIS ((), consume it.\n        // Create a <function-token> with its value set to string and return it.\n        if (getCharCode(offset) === 0x0028) {\n            type = TYPE.Function;\n            offset++;\n            return;\n        }\n\n        // Otherwise, create an <ident-token> with its value set to string and return it.\n        type = TYPE.Ident;\n    }\n\n    // § 4.3.5. Consume a string token\n    function consumeStringToken(endingCodePoint) {\n        // This algorithm may be called with an ending code point, which denotes the code point\n        // that ends the string. If an ending code point is not specified,\n        // the current input code point is used.\n        if (!endingCodePoint) {\n            endingCodePoint = getCharCode(offset++);\n        }\n\n        // Initially create a <string-token> with its value set to the empty string.\n        type = TYPE.String;\n\n        // Repeatedly consume the next input code point from the stream:\n        for (; offset < source.length; offset++) {\n            const code = source.charCodeAt(offset);\n\n            switch (charCodeCategory(code)) {\n                // ending code point\n                case endingCodePoint:\n                    // Return the <string-token>.\n                    offset++;\n                    return;\n\n                    // EOF\n                    // case EofCategory:\n                    // This is a parse error. Return the <string-token>.\n                    // return;\n\n                // newline\n                case WhiteSpaceCategory:\n                    if (isNewline(code)) {\n                        // This is a parse error. Reconsume the current input code point,\n                        // create a <bad-string-token>, and return it.\n                        offset += getNewlineLength(source, offset, code);\n                        type = TYPE.BadString;\n                        return;\n                    }\n                    break;\n\n                // U+005C REVERSE SOLIDUS (\\)\n                case 0x005C:\n                    // If the next input code point is EOF, do nothing.\n                    if (offset === source.length - 1) {\n                        break;\n                    }\n\n                    const nextCode = getCharCode(offset + 1);\n\n                    // Otherwise, if the next input code point is a newline, consume it.\n                    if (isNewline(nextCode)) {\n                        offset += getNewlineLength(source, offset + 1, nextCode);\n                    } else if (isValidEscape(code, nextCode)) {\n                        // Otherwise, (the stream starts with a valid escape) consume\n                        // an escaped code point and append the returned code point to\n                        // the <string-token>’s value.\n                        offset = consumeEscaped(source, offset) - 1;\n                    }\n                    break;\n\n                // anything else\n                // Append the current input code point to the <string-token>’s value.\n            }\n        }\n    }\n\n    // § 4.3.6. Consume a url token\n    // Note: This algorithm assumes that the initial \"url(\" has already been consumed.\n    // This algorithm also assumes that it’s being called to consume an \"unquoted\" value, like url(foo).\n    // A quoted value, like url(\"foo\"), is parsed as a <function-token>. Consume an ident-like token\n    // automatically handles this distinction; this algorithm shouldn’t be called directly otherwise.\n    function consumeUrlToken() {\n        // Initially create a <url-token> with its value set to the empty string.\n        type = TYPE.Url;\n\n        // Consume as much whitespace as possible.\n        offset = findWhiteSpaceEnd(source, offset);\n\n        // Repeatedly consume the next input code point from the stream:\n        for (; offset < source.length; offset++) {\n            const code = source.charCodeAt(offset);\n\n            switch (charCodeCategory(code)) {\n                // U+0029 RIGHT PARENTHESIS ())\n                case 0x0029:\n                    // Return the <url-token>.\n                    offset++;\n                    return;\n\n                    // EOF\n                    // case EofCategory:\n                    // This is a parse error. Return the <url-token>.\n                    // return;\n\n                // whitespace\n                case WhiteSpaceCategory:\n                    // Consume as much whitespace as possible.\n                    offset = findWhiteSpaceEnd(source, offset);\n\n                    // If the next input code point is U+0029 RIGHT PARENTHESIS ()) or EOF,\n                    // consume it and return the <url-token>\n                    // (if EOF was encountered, this is a parse error);\n                    if (getCharCode(offset) === 0x0029 || offset >= source.length) {\n                        if (offset < source.length) {\n                            offset++;\n                        }\n                        return;\n                    }\n\n                    // otherwise, consume the remnants of a bad url, create a <bad-url-token>,\n                    // and return it.\n                    offset = consumeBadUrlRemnants(source, offset);\n                    type = TYPE.BadUrl;\n                    return;\n\n                // U+0022 QUOTATION MARK (\")\n                // U+0027 APOSTROPHE (')\n                // U+0028 LEFT PARENTHESIS (()\n                // non-printable code point\n                case 0x0022:\n                case 0x0027:\n                case 0x0028:\n                case NonPrintableCategory:\n                    // This is a parse error. Consume the remnants of a bad url,\n                    // create a <bad-url-token>, and return it.\n                    offset = consumeBadUrlRemnants(source, offset);\n                    type = TYPE.BadUrl;\n                    return;\n\n                // U+005C REVERSE SOLIDUS (\\)\n                case 0x005C:\n                    // If the stream starts with a valid escape, consume an escaped code point and\n                    // append the returned code point to the <url-token>’s value.\n                    if (isValidEscape(code, getCharCode(offset + 1))) {\n                        offset = consumeEscaped(source, offset) - 1;\n                        break;\n                    }\n\n                    // Otherwise, this is a parse error. Consume the remnants of a bad url,\n                    // create a <bad-url-token>, and return it.\n                    offset = consumeBadUrlRemnants(source, offset);\n                    type = TYPE.BadUrl;\n                    return;\n\n                // anything else\n                // Append the current input code point to the <url-token>’s value.\n            }\n        }\n    }\n\n    // ensure source is a string\n    source = String(source || '');\n\n    const sourceLength = source.length;\n    let start = isBOM(getCharCode(0));\n    let offset = start;\n    let type;\n\n    // https://drafts.csswg.org/css-syntax-3/#consume-token\n    // § 4.3.1. Consume a token\n    while (offset < sourceLength) {\n        const code = source.charCodeAt(offset);\n\n        switch (charCodeCategory(code)) {\n            // whitespace\n            case WhiteSpaceCategory:\n                // Consume as much whitespace as possible. Return a <whitespace-token>.\n                type = TYPE.WhiteSpace;\n                offset = findWhiteSpaceEnd(source, offset + 1);\n                break;\n\n            // U+0022 QUOTATION MARK (\")\n            case 0x0022:\n                // Consume a string token and return it.\n                consumeStringToken();\n                break;\n\n            // U+0023 NUMBER SIGN (#)\n            case 0x0023:\n                // If the next input code point is a name code point or the next two input code points are a valid escape, then:\n                if (isName(getCharCode(offset + 1)) || isValidEscape(getCharCode(offset + 1), getCharCode(offset + 2))) {\n                    // Create a <hash-token>.\n                    type = TYPE.Hash;\n\n                    // If the next 3 input code points would start an identifier, set the <hash-token>’s type flag to \"id\".\n                    // if (isIdentifierStart(getCharCode(offset + 1), getCharCode(offset + 2), getCharCode(offset + 3))) {\n                    //     // TODO: set id flag\n                    // }\n\n                    // Consume a name, and set the <hash-token>’s value to the returned string.\n                    offset = consumeName(source, offset + 1);\n\n                    // Return the <hash-token>.\n                } else {\n                    // Otherwise, return a <delim-token> with its value set to the current input code point.\n                    type = TYPE.Delim;\n                    offset++;\n                }\n\n                break;\n\n            // U+0027 APOSTROPHE (')\n            case 0x0027:\n                // Consume a string token and return it.\n                consumeStringToken();\n                break;\n\n            // U+0028 LEFT PARENTHESIS (()\n            case 0x0028:\n                // Return a <(-token>.\n                type = TYPE.LeftParenthesis;\n                offset++;\n                break;\n\n            // U+0029 RIGHT PARENTHESIS ())\n            case 0x0029:\n                // Return a <)-token>.\n                type = TYPE.RightParenthesis;\n                offset++;\n                break;\n\n            // U+002B PLUS SIGN (+)\n            case 0x002B:\n                // If the input stream starts with a number, ...\n                if (isNumberStart(code, getCharCode(offset + 1), getCharCode(offset + 2))) {\n                    // ... reconsume the current input code point, consume a numeric token, and return it.\n                    consumeNumericToken();\n                } else {\n                    // Otherwise, return a <delim-token> with its value set to the current input code point.\n                    type = TYPE.Delim;\n                    offset++;\n                }\n                break;\n\n            // U+002C COMMA (,)\n            case 0x002C:\n                // Return a <comma-token>.\n                type = TYPE.Comma;\n                offset++;\n                break;\n\n            // U+002D HYPHEN-MINUS (-)\n            case 0x002D:\n                // If the input stream starts with a number, reconsume the current input code point, consume a numeric token, and return it.\n                if (isNumberStart(code, getCharCode(offset + 1), getCharCode(offset + 2))) {\n                    consumeNumericToken();\n                } else {\n                    // 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>.\n                    if (getCharCode(offset + 1) === 0x002D &&\n                        getCharCode(offset + 2) === 0x003E) {\n                        type = TYPE.CDC;\n                        offset = offset + 3;\n                    } else {\n                        // Otherwise, if the input stream starts with an identifier, ...\n                        if (isIdentifierStart(code, getCharCode(offset + 1), getCharCode(offset + 2))) {\n                            // ... reconsume the current input code point, consume an ident-like token, and return it.\n                            consumeIdentLikeToken();\n                        } else {\n                            // Otherwise, return a <delim-token> with its value set to the current input code point.\n                            type = TYPE.Delim;\n                            offset++;\n                        }\n                    }\n                }\n                break;\n\n            // U+002E FULL STOP (.)\n            case 0x002E:\n                // If the input stream starts with a number, ...\n                if (isNumberStart(code, getCharCode(offset + 1), getCharCode(offset + 2))) {\n                    // ... reconsume the current input code point, consume a numeric token, and return it.\n                    consumeNumericToken();\n                } else {\n                    // Otherwise, return a <delim-token> with its value set to the current input code point.\n                    type = TYPE.Delim;\n                    offset++;\n                }\n\n                break;\n\n            // U+002F SOLIDUS (/)\n            case 0x002F:\n                // If the next two input code point are U+002F SOLIDUS (/) followed by a U+002A ASTERISK (*),\n                if (getCharCode(offset + 1) === 0x002A) {\n                    // ... consume them and all following code points up to and including the first U+002A ASTERISK (*)\n                    // followed by a U+002F SOLIDUS (/), or up to an EOF code point.\n                    type = TYPE.Comment;\n                    offset = source.indexOf('*/', offset + 2);\n                    offset = offset === -1 ? source.length : offset + 2;\n                } else {\n                    type = TYPE.Delim;\n                    offset++;\n                }\n                break;\n\n            // U+003A COLON (:)\n            case 0x003A:\n                // Return a <colon-token>.\n                type = TYPE.Colon;\n                offset++;\n                break;\n\n            // U+003B SEMICOLON (;)\n            case 0x003B:\n                // Return a <semicolon-token>.\n                type = TYPE.Semicolon;\n                offset++;\n                break;\n\n            // U+003C LESS-THAN SIGN (<)\n            case 0x003C:\n                // If the next 3 input code points are U+0021 EXCLAMATION MARK U+002D HYPHEN-MINUS U+002D HYPHEN-MINUS (!--), ...\n                if (getCharCode(offset + 1) === 0x0021 &&\n                    getCharCode(offset + 2) === 0x002D &&\n                    getCharCode(offset + 3) === 0x002D) {\n                    // ... consume them and return a <CDO-token>.\n                    type = TYPE.CDO;\n                    offset = offset + 4;\n                } else {\n                    // Otherwise, return a <delim-token> with its value set to the current input code point.\n                    type = TYPE.Delim;\n                    offset++;\n                }\n\n                break;\n\n            // U+0040 COMMERCIAL AT (@)\n            case 0x0040:\n                // If the next 3 input code points would start an identifier, ...\n                if (isIdentifierStart(getCharCode(offset + 1), getCharCode(offset + 2), getCharCode(offset + 3))) {\n                    // ... consume a name, create an <at-keyword-token> with its value set to the returned value, and return it.\n                    type = TYPE.AtKeyword;\n                    offset = consumeName(source, offset + 1);\n                } else {\n                    // Otherwise, return a <delim-token> with its value set to the current input code point.\n                    type = TYPE.Delim;\n                    offset++;\n                }\n\n                break;\n\n            // U+005B LEFT SQUARE BRACKET ([)\n            case 0x005B:\n                // Return a <[-token>.\n                type = TYPE.LeftSquareBracket;\n                offset++;\n                break;\n\n            // U+005C REVERSE SOLIDUS (\\)\n            case 0x005C:\n                // If the input stream starts with a valid escape, ...\n                if (isValidEscape(code, getCharCode(offset + 1))) {\n                    // ... reconsume the current input code point, consume an ident-like token, and return it.\n                    consumeIdentLikeToken();\n                } else {\n                    // Otherwise, this is a parse error. Return a <delim-token> with its value set to the current input code point.\n                    type = TYPE.Delim;\n                    offset++;\n                }\n                break;\n\n            // U+005D RIGHT SQUARE BRACKET (])\n            case 0x005D:\n                // Return a <]-token>.\n                type = TYPE.RightSquareBracket;\n                offset++;\n                break;\n\n            // U+007B LEFT CURLY BRACKET ({)\n            case 0x007B:\n                // Return a <{-token>.\n                type = TYPE.LeftCurlyBracket;\n                offset++;\n                break;\n\n            // U+007D RIGHT CURLY BRACKET (})\n            case 0x007D:\n                // Return a <}-token>.\n                type = TYPE.RightCurlyBracket;\n                offset++;\n                break;\n\n            // digit\n            case DigitCategory:\n                // Reconsume the current input code point, consume a numeric token, and return it.\n                consumeNumericToken();\n                break;\n\n            // name-start code point\n            case NameStartCategory:\n                // Reconsume the current input code point, consume an ident-like token, and return it.\n                consumeIdentLikeToken();\n                break;\n\n                // EOF\n                // case EofCategory:\n                // Return an <EOF-token>.\n                // break;\n\n            // anything else\n            default:\n                // Return a <delim-token> with its value set to the current input code point.\n                type = TYPE.Delim;\n                offset++;\n        }\n\n        // put token to stream\n        onToken(type, start, start = offset);\n    }\n}\n\nexport * from './types.js';\nexport * as tokenTypes from './types.js';\nexport { default as tokenNames } from './names.js';\nexport * from './char-code-definitions.js';\nexport * from './utils.js';\nexport * from './OffsetToLocation.js';\nexport * from './TokenStream.js';\n","//\n//                              list\n//                            ┌──────┐\n//             ┌──────────────┼─head │\n//             │              │ tail─┼──────────────┐\n//             │              └──────┘              │\n//             ▼                                    ▼\n//            item        item        item        item\n//          ┌──────┐    ┌──────┐    ┌──────┐    ┌──────┐\n//  null ◀──┼─prev │◀───┼─prev │◀───┼─prev │◀───┼─prev │\n//          │ next─┼───▶│ next─┼───▶│ next─┼───▶│ next─┼──▶ null\n//          ├──────┤    ├──────┤    ├──────┤    ├──────┤\n//          │ data │    │ data │    │ data │    │ data │\n//          └──────┘    └──────┘    └──────┘    └──────┘\n//\n\nlet releasedCursors = null;\n\nexport class List {\n    static createItem(data) {\n        return {\n            prev: null,\n            next: null,\n            data\n        };\n    }\n\n    constructor() {\n        this.head = null;\n        this.tail = null;\n        this.cursor = null;\n    }\n    createItem(data) {\n        return List.createItem(data);\n    }\n\n    // cursor helpers\n    allocateCursor(prev, next) {\n        let cursor;\n\n        if (releasedCursors !== null) {\n            cursor = releasedCursors;\n            releasedCursors = releasedCursors.cursor;\n            cursor.prev = prev;\n            cursor.next = next;\n            cursor.cursor = this.cursor;\n        } else {\n            cursor = {\n                prev,\n                next,\n                cursor: this.cursor\n            };\n        }\n\n        this.cursor = cursor;\n\n        return cursor;\n    }\n    releaseCursor() {\n        const { cursor } = this;\n\n        this.cursor = cursor.cursor;\n        cursor.prev = null;\n        cursor.next = null;\n        cursor.cursor = releasedCursors;\n        releasedCursors = cursor;\n    }\n    updateCursors(prevOld, prevNew, nextOld, nextNew) {\n        let { cursor } = this;\n\n        while (cursor !== null) {\n            if (cursor.prev === prevOld) {\n                cursor.prev = prevNew;\n            }\n\n            if (cursor.next === nextOld) {\n                cursor.next = nextNew;\n            }\n\n            cursor = cursor.cursor;\n        }\n    }\n    *[Symbol.iterator]() {\n        for (let cursor = this.head; cursor !== null; cursor = cursor.next) {\n            yield cursor.data;\n        }\n    }\n\n    // getters\n    get size() {\n        let size = 0;\n\n        for (let cursor = this.head; cursor !== null; cursor = cursor.next) {\n            size++;\n        }\n\n        return size;\n    }\n    get isEmpty() {\n        return this.head === null;\n    }\n    get first() {\n        return this.head && this.head.data;\n    }\n    get last() {\n        return this.tail && this.tail.data;\n    }\n\n    // convertors\n    fromArray(array) {\n        let cursor = null;\n        this.head = null;\n\n        for (let data of array) {\n            const item = List.createItem(data);\n\n            if (cursor !== null) {\n                cursor.next = item;\n            } else {\n                this.head = item;\n            }\n\n            item.prev = cursor;\n            cursor = item;\n        }\n\n        this.tail = cursor;\n        return this;\n    }\n    toArray() {\n        return [...this];\n    }\n    toJSON() {\n        return [...this];\n    }\n\n    // array-like methods\n    forEach(fn, thisArg = this) {\n        // push cursor\n        const cursor = this.allocateCursor(null, this.head);\n\n        while (cursor.next !== null) {\n            const item = cursor.next;\n            cursor.next = item.next;\n            fn.call(thisArg, item.data, item, this);\n        }\n\n        // pop cursor\n        this.releaseCursor();\n    }\n    forEachRight(fn, thisArg = this) {\n        // push cursor\n        const cursor = this.allocateCursor(this.tail, null);\n\n        while (cursor.prev !== null) {\n            const item = cursor.prev;\n            cursor.prev = item.prev;\n            fn.call(thisArg, item.data, item, this);\n        }\n\n        // pop cursor\n        this.releaseCursor();\n    }\n    reduce(fn, initialValue, thisArg = this) {\n        // push cursor\n        let cursor = this.allocateCursor(null, this.head);\n        let acc = initialValue;\n        let item;\n\n        while (cursor.next !== null) {\n            item = cursor.next;\n            cursor.next = item.next;\n\n            acc = fn.call(thisArg, acc, item.data, item, this);\n        }\n\n        // pop cursor\n        this.releaseCursor();\n\n        return acc;\n    }\n    reduceRight(fn, initialValue, thisArg = this) {\n        // push cursor\n        let cursor = this.allocateCursor(this.tail, null);\n        let acc = initialValue;\n        let item;\n\n        while (cursor.prev !== null) {\n            item = cursor.prev;\n            cursor.prev = item.prev;\n\n            acc = fn.call(thisArg, acc, item.data, item, this);\n        }\n\n        // pop cursor\n        this.releaseCursor();\n\n        return acc;\n    }\n    some(fn, thisArg = this) {\n        for (let cursor = this.head; cursor !== null; cursor = cursor.next) {\n            if (fn.call(thisArg, cursor.data, cursor, this)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n    map(fn, thisArg = this) {\n        const result = new List();\n\n        for (let cursor = this.head; cursor !== null; cursor = cursor.next) {\n            result.appendData(fn.call(thisArg, cursor.data, cursor, this));\n        }\n\n        return result;\n    }\n    filter(fn, thisArg = this) {\n        const result = new List();\n\n        for (let cursor = this.head; cursor !== null; cursor = cursor.next) {\n            if (fn.call(thisArg, cursor.data, cursor, this)) {\n                result.appendData(cursor.data);\n            }\n        }\n\n        return result;\n    }\n\n    nextUntil(start, fn, thisArg = this) {\n        if (start === null) {\n            return;\n        }\n\n        // push cursor\n        const cursor = this.allocateCursor(null, start);\n\n        while (cursor.next !== null) {\n            const item = cursor.next;\n            cursor.next = item.next;\n            if (fn.call(thisArg, item.data, item, this)) {\n                break;\n            }\n        }\n\n        // pop cursor\n        this.releaseCursor();\n    }\n    prevUntil(start, fn, thisArg = this) {\n        if (start === null) {\n            return;\n        }\n\n        // push cursor\n        const cursor = this.allocateCursor(start, null);\n\n        while (cursor.prev !== null) {\n            const item = cursor.prev;\n            cursor.prev = item.prev;\n            if (fn.call(thisArg, item.data, item, this)) {\n                break;\n            }\n        }\n\n        // pop cursor\n        this.releaseCursor();\n    }\n\n    // mutation\n    clear() {\n        this.head = null;\n        this.tail = null;\n    }\n    copy() {\n        const result = new List();\n\n        for (let data of this) {\n            result.appendData(data);\n        }\n\n        return result;\n    }\n    prepend(item) {\n        //      head\n        //    ^\n        // item\n        this.updateCursors(null, item, this.head, item);\n\n        // insert to the beginning of the list\n        if (this.head !== null) {\n            // new item <- first item\n            this.head.prev = item;\n            // new item -> first item\n            item.next = this.head;\n        } else {\n            // if list has no head, then it also has no tail\n            // in this case tail points to the new item\n            this.tail = item;\n        }\n\n        // head always points to new item\n        this.head = item;\n        return this;\n    }\n    prependData(data) {\n        return this.prepend(List.createItem(data));\n    }\n    append(item) {\n        return this.insert(item);\n    }\n    appendData(data) {\n        return this.insert(List.createItem(data));\n    }\n    insert(item, before = null) {\n        if (before !== null) {\n            // prev   before\n            //      ^\n            //     item\n            this.updateCursors(before.prev, item, before, item);\n\n            if (before.prev === null) {\n                // insert to the beginning of list\n                if (this.head !== before) {\n                    throw new Error('before doesn\\'t belong to list');\n                }\n                // since head points to before therefore list doesn't empty\n                // no need to check tail\n                this.head = item;\n                before.prev = item;\n                item.next = before;\n                this.updateCursors(null, item);\n            } else {\n                // insert between two items\n                before.prev.next = item;\n                item.prev = before.prev;\n                before.prev = item;\n                item.next = before;\n            }\n        } else {\n            // tail\n            //      ^\n            //      item\n            this.updateCursors(this.tail, item, null, item);\n\n            // insert to the ending of the list\n            if (this.tail !== null) {\n                // last item -> new item\n                this.tail.next = item;\n                // last item <- new item\n                item.prev = this.tail;\n            } else {\n                // if list has no tail, then it also has no head\n                // in this case head points to new item\n                this.head = item;\n            }\n\n            // tail always points to new item\n            this.tail = item;\n        }\n\n        return this;\n    }\n    insertData(data, before) {\n        return this.insert(List.createItem(data), before);\n    }\n    remove(item) {\n        //      item\n        //       ^\n        // prev     next\n        this.updateCursors(item, item.prev, item, item.next);\n\n        if (item.prev !== null) {\n            item.prev.next = item.next;\n        } else {\n            if (this.head !== item) {\n                throw new Error('item doesn\\'t belong to list');\n            }\n\n            this.head = item.next;\n        }\n\n        if (item.next !== null) {\n            item.next.prev = item.prev;\n        } else {\n            if (this.tail !== item) {\n                throw new Error('item doesn\\'t belong to list');\n            }\n\n            this.tail = item.prev;\n        }\n\n        item.prev = null;\n        item.next = null;\n\n        return item;\n    }\n    push(data) {\n        this.insert(List.createItem(data));\n    }\n    pop() {\n        return this.tail !== null ? this.remove(this.tail) : null;\n    }\n    unshift(data) {\n        this.prepend(List.createItem(data));\n    }\n    shift() {\n        return this.head !== null ? this.remove(this.head) : null;\n    }\n    prependList(list) {\n        return this.insertList(list, this.head);\n    }\n    appendList(list) {\n        return this.insertList(list);\n    }\n    insertList(list, before) {\n        // ignore empty lists\n        if (list.head === null) {\n            return this;\n        }\n\n        if (before !== undefined && before !== null) {\n            this.updateCursors(before.prev, list.tail, before, list.head);\n\n            // insert in the middle of dist list\n            if (before.prev !== null) {\n                // before.prev <-> list.head\n                before.prev.next = list.head;\n                list.head.prev = before.prev;\n            } else {\n                this.head = list.head;\n            }\n\n            before.prev = list.tail;\n            list.tail.next = before;\n        } else {\n            this.updateCursors(this.tail, list.tail, null, list.head);\n\n            // insert to end of the list\n            if (this.tail !== null) {\n                // if destination list has a tail, then it also has a head,\n                // but head doesn't change\n                // dest tail -> source head\n                this.tail.next = list.head;\n                // dest tail <- source head\n                list.head.prev = this.tail;\n            } else {\n                // if list has no a tail, then it also has no a head\n                // in this case points head to new item\n                this.head = list.head;\n            }\n\n            // tail always start point to new item\n            this.tail = list.tail;\n        }\n\n        list.head = null;\n        list.tail = null;\n        return this;\n    }\n    replace(oldItem, newItemOrList) {\n        if ('head' in newItemOrList) {\n            this.insertList(newItemOrList, oldItem);\n        } else {\n            this.insert(newItemOrList, oldItem);\n        }\n\n        this.remove(oldItem);\n    }\n}\n","export function createCustomError(name, message) {\n    // use Object.create(), because some VMs prevent setting line/column otherwise\n    // (iOS Safari 10 even throws an exception)\n    const error = Object.create(SyntaxError.prototype);\n    const errorStack = new Error();\n\n    return Object.assign(error, {\n        name,\n        message,\n        get stack() {\n            return (errorStack.stack || '').replace(/^(.+\\n){1,3}/, `${name}: ${message}\\n`);\n        }\n    });\n};\n","import { createCustomError } from '../utils/create-custom-error.js';\n\nconst MAX_LINE_LENGTH = 100;\nconst OFFSET_CORRECTION = 60;\nconst TAB_REPLACEMENT = '    ';\n\nfunction sourceFragment({ source, line, column, baseLine, baseColumn }, extraLines) {\n    function processLines(start, end) {\n        return lines\n            .slice(start, end)\n            .map((line, idx) =>\n                String(start + idx + 1).padStart(maxNumLength) + ' |' + line\n            ).join('\\n');\n    }\n\n    const prelines = '\\n'.repeat(Math.max(baseLine - 1, 0));\n    const precolumns = ' '.repeat(Math.max(baseColumn - 1, 0));\n    const lines = (prelines + precolumns + source).split(/\\r\\n?|\\n|\\f/);\n    const startLine = Math.max(1, line - extraLines) - 1;\n    const endLine = Math.min(line + extraLines, lines.length + 1);\n    const maxNumLength = Math.max(4, String(endLine).length) + 1;\n    let cutLeft = 0;\n\n    // column correction according to replaced tab before column\n    column += (TAB_REPLACEMENT.length - 1) * (lines[line - 1].substr(0, column - 1).match(/\\t/g) || []).length;\n\n    if (column > MAX_LINE_LENGTH) {\n        cutLeft = column - OFFSET_CORRECTION + 3;\n        column = OFFSET_CORRECTION - 2;\n    }\n\n    for (let i = startLine; i <= endLine; i++) {\n        if (i >= 0 && i < lines.length) {\n            lines[i] = lines[i].replace(/\\t/g, TAB_REPLACEMENT);\n            lines[i] =\n                (cutLeft > 0 && lines[i].length > cutLeft ? '\\u2026' : '') +\n                lines[i].substr(cutLeft, MAX_LINE_LENGTH - 2) +\n                (lines[i].length > cutLeft + MAX_LINE_LENGTH - 1 ? '\\u2026' : '');\n        }\n    }\n\n    return [\n        processLines(startLine, line),\n        new Array(column + maxNumLength + 2).join('-') + '^',\n        processLines(line, endLine)\n    ].filter(Boolean)\n        .join('\\n')\n        .replace(/^(\\s+\\d+\\s+\\|\\n)+/, '')\n        .replace(/\\n(\\s+\\d+\\s+\\|)+$/, '');\n}\n\nexport function SyntaxError(message, source, offset, line, column, baseLine = 1, baseColumn = 1) {\n    const error = Object.assign(createCustomError('SyntaxError', message), {\n        source,\n        offset,\n        line,\n        column,\n        sourceFragment(extraLines) {\n            return sourceFragment({ source, line, column, baseLine, baseColumn }, isNaN(extraLines) ? 0 : extraLines);\n        },\n        get formattedMessage() {\n            return (\n                `Parse error: ${message}\\n` +\n                sourceFragment({ source, line, column, baseLine, baseColumn }, 2)\n            );\n        }\n    });\n\n    return error;\n}\n","import { WhiteSpace, Comment } from '../tokenizer/index.js';\n\nexport function readSequence(recognizer) {\n    const children = this.createList();\n    let space = false;\n    const context = {\n        recognizer\n    };\n\n    while (!this.eof) {\n        switch (this.tokenType) {\n            case Comment:\n                this.next();\n                continue;\n\n            case WhiteSpace:\n                space = true;\n                this.next();\n                continue;\n        }\n\n        let child = recognizer.getNode.call(this, context);\n\n        if (child === undefined) {\n            break;\n        }\n\n        if (space) {\n            if (recognizer.onWhiteSpace) {\n                recognizer.onWhiteSpace.call(this, child, children, context);\n            }\n            space = false;\n        }\n\n        children.push(child);\n    }\n\n    if (space && recognizer.onWhiteSpace) {\n        recognizer.onWhiteSpace.call(this, null, children, context);\n    }\n\n    return children;\n};\n","import { List } from '../utils/List.js';\nimport { SyntaxError } from './SyntaxError.js';\nimport {\n    tokenize,\n    OffsetToLocation,\n    TokenStream,\n    tokenNames,\n\n    consumeNumber,\n    findWhiteSpaceStart,\n    cmpChar,\n    cmpStr,\n\n    WhiteSpace,\n    Comment,\n    Ident,\n    Function as FunctionToken,\n    Url,\n    Hash,\n    Percentage,\n    Number as NumberToken\n} from '../tokenizer/index.js';\nimport { readSequence } from './sequence.js';\n\nconst NOOP = () => {};\nconst EXCLAMATIONMARK = 0x0021;  // U+0021 EXCLAMATION MARK (!)\nconst NUMBERSIGN = 0x0023;       // U+0023 NUMBER SIGN (#)\nconst SEMICOLON = 0x003B;        // U+003B SEMICOLON (;)\nconst LEFTCURLYBRACKET = 0x007B; // U+007B LEFT CURLY BRACKET ({)\nconst NULL = 0;\n\nfunction createParseContext(name) {\n    return function() {\n        return this[name]();\n    };\n}\n\nfunction fetchParseValues(dict) {\n    const result = Object.create(null);\n\n    for (const name of Object.keys(dict)) {\n        const item = dict[name];\n        const fn = item.parse || item;\n\n        if (fn) {\n            result[name] = fn;\n        }\n    }\n\n    return result;\n}\n\nfunction processConfig(config) {\n    const parseConfig = {\n        context: Object.create(null),\n        features: Object.assign(Object.create(null), config.features),\n        scope: Object.assign(Object.create(null), config.scope),\n        atrule: fetchParseValues(config.atrule),\n        pseudo: fetchParseValues(config.pseudo),\n        node: fetchParseValues(config.node)\n    };\n\n    for (const [name, context] of Object.entries(config.parseContext)) {\n        switch (typeof context) {\n            case 'function':\n                parseConfig.context[name] = context;\n                break;\n\n            case 'string':\n                parseConfig.context[name] = createParseContext(context);\n                break;\n        }\n    }\n\n    return {\n        config: parseConfig,\n        ...parseConfig,\n        ...parseConfig.node\n    };\n}\n\nexport function createParser(config) {\n    let source = '';\n    let filename = '<unknown>';\n    let needPositions = false;\n    let onParseError = NOOP;\n    let onParseErrorThrow = false;\n\n    const locationMap = new OffsetToLocation();\n    const parser = Object.assign(new TokenStream(), processConfig(config || {}), {\n        parseAtrulePrelude: true,\n        parseRulePrelude: true,\n        parseValue: true,\n        parseCustomProperty: false,\n\n        readSequence,\n\n        consumeUntilBalanceEnd: () => 0,\n        consumeUntilLeftCurlyBracket(code) {\n            return code === LEFTCURLYBRACKET ? 1 : 0;\n        },\n        consumeUntilLeftCurlyBracketOrSemicolon(code) {\n            return code === LEFTCURLYBRACKET || code === SEMICOLON ? 1 : 0;\n        },\n        consumeUntilExclamationMarkOrSemicolon(code) {\n            return code === EXCLAMATIONMARK || code === SEMICOLON ? 1 : 0;\n        },\n        consumeUntilSemicolonIncluded(code) {\n            return code === SEMICOLON ? 2 : 0;\n        },\n\n        createList() {\n            return new List();\n        },\n        createSingleNodeList(node) {\n            return new List().appendData(node);\n        },\n        getFirstListNode(list) {\n            return list && list.first;\n        },\n        getLastListNode(list) {\n            return list && list.last;\n        },\n\n        parseWithFallback(consumer, fallback) {\n            const startIndex = this.tokenIndex;\n\n            try {\n                return consumer.call(this);\n            } catch (e) {\n                if (onParseErrorThrow) {\n                    throw e;\n                }\n\n                this.skip(startIndex - this.tokenIndex);\n                const fallbackNode = fallback.call(this);\n\n                onParseErrorThrow = true;\n                onParseError(e, fallbackNode);\n                onParseErrorThrow = false;\n\n                return fallbackNode;\n            }\n        },\n\n        lookupNonWSType(offset) {\n            let type;\n\n            do {\n                type = this.lookupType(offset++);\n                if (type !== WhiteSpace && type !== Comment) {\n                    return type;\n                }\n            } while (type !== NULL);\n\n            return NULL;\n        },\n\n        charCodeAt(offset) {\n            return offset >= 0 && offset < source.length ? source.charCodeAt(offset) : 0;\n        },\n        substring(offsetStart, offsetEnd) {\n            return source.substring(offsetStart, offsetEnd);\n        },\n        substrToCursor(start) {\n            return this.source.substring(start, this.tokenStart);\n        },\n\n        cmpChar(offset, charCode) {\n            return cmpChar(source, offset, charCode);\n        },\n        cmpStr(offsetStart, offsetEnd, str) {\n            return cmpStr(source, offsetStart, offsetEnd, str);\n        },\n\n        consume(tokenType) {\n            const start = this.tokenStart;\n\n            this.eat(tokenType);\n\n            return this.substrToCursor(start);\n        },\n        consumeFunctionName() {\n            const name = source.substring(this.tokenStart, this.tokenEnd - 1);\n\n            this.eat(FunctionToken);\n\n            return name;\n        },\n        consumeNumber(type) {\n            const number = source.substring(this.tokenStart, consumeNumber(source, this.tokenStart));\n\n            this.eat(type);\n\n            return number;\n        },\n\n        eat(tokenType) {\n            if (this.tokenType !== tokenType) {\n                const tokenName = tokenNames[tokenType].slice(0, -6).replace(/-/g, ' ').replace(/^./, m => m.toUpperCase());\n                let message = `${/[[\\](){}]/.test(tokenName) ? `\"${tokenName}\"` : tokenName} is expected`;\n                let offset = this.tokenStart;\n\n                // tweak message and offset\n                switch (tokenType) {\n                    case Ident:\n                        // when identifier is expected but there is a function or url\n                        if (this.tokenType === FunctionToken || this.tokenType === Url) {\n                            offset = this.tokenEnd - 1;\n                            message = 'Identifier is expected but function found';\n                        } else {\n                            message = 'Identifier is expected';\n                        }\n                        break;\n\n                    case Hash:\n                        if (this.isDelim(NUMBERSIGN)) {\n                            this.next();\n                            offset++;\n                            message = 'Name is expected';\n                        }\n                        break;\n\n                    case Percentage:\n                        if (this.tokenType === NumberToken) {\n                            offset = this.tokenEnd;\n                            message = 'Percent sign is expected';\n                        }\n                        break;\n                }\n\n                this.error(message, offset);\n            }\n\n            this.next();\n        },\n        eatIdent(name) {\n            if (this.tokenType !== Ident || this.lookupValue(0, name) === false) {\n                this.error(`Identifier \"${name}\" is expected`);\n            }\n\n            this.next();\n        },\n        eatDelim(code) {\n            if (!this.isDelim(code)) {\n                this.error(`Delim \"${String.fromCharCode(code)}\" is expected`);\n            }\n\n            this.next();\n        },\n\n        getLocation(start, end) {\n            if (needPositions) {\n                return locationMap.getLocationRange(\n                    start,\n                    end,\n                    filename\n                );\n            }\n\n            return null;\n        },\n        getLocationFromList(list) {\n            if (needPositions) {\n                const head = this.getFirstListNode(list);\n                const tail = this.getLastListNode(list);\n                return locationMap.getLocationRange(\n                    head !== null ? head.loc.start.offset - locationMap.startOffset : this.tokenStart,\n                    tail !== null ? tail.loc.end.offset - locationMap.startOffset : this.tokenStart,\n                    filename\n                );\n            }\n\n            return null;\n        },\n\n        error(message, offset) {\n            const location = typeof offset !== 'undefined' && offset < source.length\n                ? locationMap.getLocation(offset)\n                : this.eof\n                    ? locationMap.getLocation(findWhiteSpaceStart(source, source.length - 1))\n                    : locationMap.getLocation(this.tokenStart);\n\n            throw new SyntaxError(\n                message || 'Unexpected input',\n                source,\n                location.offset,\n                location.line,\n                location.column,\n                locationMap.startLine,\n                locationMap.startColumn\n            );\n        }\n    });\n\n    const parse = function(source_, options) {\n        source = source_;\n        options = options || {};\n\n        parser.setSource(source, tokenize);\n        locationMap.setSource(\n            source,\n            options.offset,\n            options.line,\n            options.column\n        );\n\n        filename = options.filename || '<unknown>';\n        needPositions = Boolean(options.positions);\n        onParseError = typeof options.onParseError === 'function' ? options.onParseError : NOOP;\n        onParseErrorThrow = false;\n\n        parser.parseAtrulePrelude = 'parseAtrulePrelude' in options ? Boolean(options.parseAtrulePrelude) : true;\n        parser.parseRulePrelude = 'parseRulePrelude' in options ? Boolean(options.parseRulePrelude) : true;\n        parser.parseValue = 'parseValue' in options ? Boolean(options.parseValue) : true;\n        parser.parseCustomProperty = 'parseCustomProperty' in options ? Boolean(options.parseCustomProperty) : false;\n\n        const { context = 'default', onComment } = options;\n\n        if (context in parser.context === false) {\n            throw new Error('Unknown context `' + context + '`');\n        }\n\n        if (typeof onComment === 'function') {\n            parser.forEachToken((type, start, end) => {\n                if (type === Comment) {\n                    const loc = parser.getLocation(start, end);\n                    const value = cmpStr(source, end - 2, end, '*/')\n                        ? source.slice(start + 2, end - 2)\n                        : source.slice(start + 2, end);\n\n                    onComment(value, loc);\n                }\n            });\n        }\n\n        const ast = parser.context[context].call(parser, options);\n\n        if (!parser.eof) {\n            parser.error();\n        }\n\n        return ast;\n    };\n\n    return Object.assign(parse, {\n        SyntaxError,\n        config: parser.config\n    });\n};\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n/**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\nexports.encode = function (number) {\n  if (0 <= number && number < intToCharMap.length) {\n    return intToCharMap[number];\n  }\n  throw new TypeError(\"Must be between 0 and 63: \" + number);\n};\n\n/**\n * Decode a single base 64 character code digit to an integer. Returns -1 on\n * failure.\n */\nexports.decode = function (charCode) {\n  var bigA = 65;     // 'A'\n  var bigZ = 90;     // 'Z'\n\n  var littleA = 97;  // 'a'\n  var littleZ = 122; // 'z'\n\n  var zero = 48;     // '0'\n  var nine = 57;     // '9'\n\n  var plus = 43;     // '+'\n  var slash = 47;    // '/'\n\n  var littleOffset = 26;\n  var numberOffset = 52;\n\n  // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n  if (bigA <= charCode && charCode <= bigZ) {\n    return (charCode - bigA);\n  }\n\n  // 26 - 51: abcdefghijklmnopqrstuvwxyz\n  if (littleA <= charCode && charCode <= littleZ) {\n    return (charCode - littleA + littleOffset);\n  }\n\n  // 52 - 61: 0123456789\n  if (zero <= charCode && charCode <= nine) {\n    return (charCode - zero + numberOffset);\n  }\n\n  // 62: +\n  if (charCode == plus) {\n    return 62;\n  }\n\n  // 63: /\n  if (charCode == slash) {\n    return 63;\n  }\n\n  // Invalid base64 digit.\n  return -1;\n};\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *  * Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *  * Redistributions in binary form must reproduce the above\n *    copyright notice, this list of conditions and the following\n *    disclaimer in the documentation and/or other materials provided\n *    with the distribution.\n *  * Neither the name of Google Inc. nor the names of its\n *    contributors may be used to endorse or promote products derived\n *    from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar base64 = require('./base64');\n\n// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n// length quantities we use in the source map spec, the first bit is the sign,\n// the next four bits are the actual value, and the 6th bit is the\n// continuation bit. The continuation bit tells us whether there are more\n// digits in this value following this digit.\n//\n//   Continuation\n//   |    Sign\n//   |    |\n//   V    V\n//   101011\n\nvar VLQ_BASE_SHIFT = 5;\n\n// binary: 100000\nvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n// binary: 011111\nvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\n// binary: 100000\nvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n/**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit.  For example, as decimals:\n *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\nfunction toVLQSigned(aValue) {\n  return aValue < 0\n    ? ((-aValue) << 1) + 1\n    : (aValue << 1) + 0;\n}\n\n/**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit.  For example, as decimals:\n *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\nfunction fromVLQSigned(aValue) {\n  var isNegative = (aValue & 1) === 1;\n  var shifted = aValue >> 1;\n  return isNegative\n    ? -shifted\n    : shifted;\n}\n\n/**\n * Returns the base 64 VLQ encoded value.\n */\nexports.encode = function base64VLQ_encode(aValue) {\n  var encoded = \"\";\n  var digit;\n\n  var vlq = toVLQSigned(aValue);\n\n  do {\n    digit = vlq & VLQ_BASE_MASK;\n    vlq >>>= VLQ_BASE_SHIFT;\n    if (vlq > 0) {\n      // There are still more digits in this value, so we must make sure the\n      // continuation bit is marked.\n      digit |= VLQ_CONTINUATION_BIT;\n    }\n    encoded += base64.encode(digit);\n  } while (vlq > 0);\n\n  return encoded;\n};\n\n/**\n * Decodes the next base 64 VLQ value from the given string and returns the\n * value and the rest of the string via the out parameter.\n */\nexports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n  var strLen = aStr.length;\n  var result = 0;\n  var shift = 0;\n  var continuation, digit;\n\n  do {\n    if (aIndex >= strLen) {\n      throw new Error(\"Expected more digits in base 64 VLQ value.\");\n    }\n\n    digit = base64.decode(aStr.charCodeAt(aIndex++));\n    if (digit === -1) {\n      throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n    }\n\n    continuation = !!(digit & VLQ_CONTINUATION_BIT);\n    digit &= VLQ_BASE_MASK;\n    result = result + (digit << shift);\n    shift += VLQ_BASE_SHIFT;\n  } while (continuation);\n\n  aOutParam.value = fromVLQSigned(result);\n  aOutParam.rest = aIndex;\n};\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n/**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\nfunction getArg(aArgs, aName, aDefaultValue) {\n  if (aName in aArgs) {\n    return aArgs[aName];\n  } else if (arguments.length === 3) {\n    return aDefaultValue;\n  } else {\n    throw new Error('\"' + aName + '\" is a required argument.');\n  }\n}\nexports.getArg = getArg;\n\nvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/;\nvar dataUrlRegexp = /^data:.+\\,.+$/;\n\nfunction urlParse(aUrl) {\n  var match = aUrl.match(urlRegexp);\n  if (!match) {\n    return null;\n  }\n  return {\n    scheme: match[1],\n    auth: match[2],\n    host: match[3],\n    port: match[4],\n    path: match[5]\n  };\n}\nexports.urlParse = urlParse;\n\nfunction urlGenerate(aParsedUrl) {\n  var url = '';\n  if (aParsedUrl.scheme) {\n    url += aParsedUrl.scheme + ':';\n  }\n  url += '//';\n  if (aParsedUrl.auth) {\n    url += aParsedUrl.auth + '@';\n  }\n  if (aParsedUrl.host) {\n    url += aParsedUrl.host;\n  }\n  if (aParsedUrl.port) {\n    url += \":\" + aParsedUrl.port\n  }\n  if (aParsedUrl.path) {\n    url += aParsedUrl.path;\n  }\n  return url;\n}\nexports.urlGenerate = urlGenerate;\n\nvar MAX_CACHED_INPUTS = 32;\n\n/**\n * Takes some function `f(input) -> result` and returns a memoized version of\n * `f`.\n *\n * We keep at most `MAX_CACHED_INPUTS` memoized results of `f` alive. The\n * memoization is a dumb-simple, linear least-recently-used cache.\n */\nfunction lruMemoize(f) {\n  var cache = [];\n\n  return function(input) {\n    for (var i = 0; i < cache.length; i++) {\n      if (cache[i].input === input) {\n        var temp = cache[0];\n        cache[0] = cache[i];\n        cache[i] = temp;\n        return cache[0].result;\n      }\n    }\n\n    var result = f(input);\n\n    cache.unshift({\n      input,\n      result,\n    });\n\n    if (cache.length > MAX_CACHED_INPUTS) {\n      cache.pop();\n    }\n\n    return result;\n  };\n}\n\n/**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consecutive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '<dir>/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\nvar normalize = lruMemoize(function normalize(aPath) {\n  var path = aPath;\n  var url = urlParse(aPath);\n  if (url) {\n    if (!url.path) {\n      return aPath;\n    }\n    path = url.path;\n  }\n  var isAbsolute = exports.isAbsolute(path);\n  // Split the path into parts between `/` characters. This is much faster than\n  // using `.split(/\\/+/g)`.\n  var parts = [];\n  var start = 0;\n  var i = 0;\n  while (true) {\n    start = i;\n    i = path.indexOf(\"/\", start);\n    if (i === -1) {\n      parts.push(path.slice(start));\n      break;\n    } else {\n      parts.push(path.slice(start, i));\n      while (i < path.length && path[i] === \"/\") {\n        i++;\n      }\n    }\n  }\n\n  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n    part = parts[i];\n    if (part === '.') {\n      parts.splice(i, 1);\n    } else if (part === '..') {\n      up++;\n    } else if (up > 0) {\n      if (part === '') {\n        // The first part is blank if the path is absolute. Trying to go\n        // above the root is a no-op. Therefore we can remove all '..' parts\n        // directly after the root.\n        parts.splice(i + 1, up);\n        up = 0;\n      } else {\n        parts.splice(i, 2);\n        up--;\n      }\n    }\n  }\n  path = parts.join('/');\n\n  if (path === '') {\n    path = isAbsolute ? '/' : '.';\n  }\n\n  if (url) {\n    url.path = path;\n    return urlGenerate(url);\n  }\n  return path;\n});\nexports.normalize = normalize;\n\n/**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n *   scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n *   first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n *   is updated with the result and aRoot is returned. Otherwise the result\n *   is returned.\n *   - If aPath is absolute, the result is aPath.\n *   - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\nfunction join(aRoot, aPath) {\n  if (aRoot === \"\") {\n    aRoot = \".\";\n  }\n  if (aPath === \"\") {\n    aPath = \".\";\n  }\n  var aPathUrl = urlParse(aPath);\n  var aRootUrl = urlParse(aRoot);\n  if (aRootUrl) {\n    aRoot = aRootUrl.path || '/';\n  }\n\n  // `join(foo, '//www.example.org')`\n  if (aPathUrl && !aPathUrl.scheme) {\n    if (aRootUrl) {\n      aPathUrl.scheme = aRootUrl.scheme;\n    }\n    return urlGenerate(aPathUrl);\n  }\n\n  if (aPathUrl || aPath.match(dataUrlRegexp)) {\n    return aPath;\n  }\n\n  // `join('http://', 'www.example.com')`\n  if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n    aRootUrl.host = aPath;\n    return urlGenerate(aRootUrl);\n  }\n\n  var joined = aPath.charAt(0) === '/'\n    ? aPath\n    : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n  if (aRootUrl) {\n    aRootUrl.path = joined;\n    return urlGenerate(aRootUrl);\n  }\n  return joined;\n}\nexports.join = join;\n\nexports.isAbsolute = function (aPath) {\n  return aPath.charAt(0) === '/' || urlRegexp.test(aPath);\n};\n\n/**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\nfunction relative(aRoot, aPath) {\n  if (aRoot === \"\") {\n    aRoot = \".\";\n  }\n\n  aRoot = aRoot.replace(/\\/$/, '');\n\n  // It is possible for the path to be above the root. In this case, simply\n  // checking whether the root is a prefix of the path won't work. Instead, we\n  // need to remove components from the root one by one, until either we find\n  // a prefix that fits, or we run out of components to remove.\n  var level = 0;\n  while (aPath.indexOf(aRoot + '/') !== 0) {\n    var index = aRoot.lastIndexOf(\"/\");\n    if (index < 0) {\n      return aPath;\n    }\n\n    // If the only part of the root that is left is the scheme (i.e. http://,\n    // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n    // have exhausted all components, so the path is not relative to the root.\n    aRoot = aRoot.slice(0, index);\n    if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n      return aPath;\n    }\n\n    ++level;\n  }\n\n  // Make sure we add a \"../\" for each component we removed from the root.\n  return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n}\nexports.relative = relative;\n\nvar supportsNullProto = (function () {\n  var obj = Object.create(null);\n  return !('__proto__' in obj);\n}());\n\nfunction identity (s) {\n  return s;\n}\n\n/**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\nfunction toSetString(aStr) {\n  if (isProtoString(aStr)) {\n    return '$' + aStr;\n  }\n\n  return aStr;\n}\nexports.toSetString = supportsNullProto ? identity : toSetString;\n\nfunction fromSetString(aStr) {\n  if (isProtoString(aStr)) {\n    return aStr.slice(1);\n  }\n\n  return aStr;\n}\nexports.fromSetString = supportsNullProto ? identity : fromSetString;\n\nfunction isProtoString(s) {\n  if (!s) {\n    return false;\n  }\n\n  var length = s.length;\n\n  if (length < 9 /* \"__proto__\".length */) {\n    return false;\n  }\n\n  if (s.charCodeAt(length - 1) !== 95  /* '_' */ ||\n      s.charCodeAt(length - 2) !== 95  /* '_' */ ||\n      s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n      s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n      s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n      s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n      s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n      s.charCodeAt(length - 8) !== 95  /* '_' */ ||\n      s.charCodeAt(length - 9) !== 95  /* '_' */) {\n    return false;\n  }\n\n  for (var i = length - 10; i >= 0; i--) {\n    if (s.charCodeAt(i) !== 36 /* '$' */) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\nfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n  var cmp = strcmp(mappingA.source, mappingB.source);\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalLine - mappingB.originalLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\n  if (cmp !== 0 || onlyCompareOriginal) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedLine - mappingB.generatedLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByOriginalPositions = compareByOriginalPositions;\n\nfunction compareByOriginalPositionsNoSource(mappingA, mappingB, onlyCompareOriginal) {\n  var cmp\n\n  cmp = mappingA.originalLine - mappingB.originalLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\n  if (cmp !== 0 || onlyCompareOriginal) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedLine - mappingB.generatedLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByOriginalPositionsNoSource = compareByOriginalPositionsNoSource;\n\n/**\n * Comparator between two mappings with deflated source and name indices where\n * the generated positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\nfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n  var cmp = mappingA.generatedLine - mappingB.generatedLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n  if (cmp !== 0 || onlyCompareGenerated) {\n    return cmp;\n  }\n\n  cmp = strcmp(mappingA.source, mappingB.source);\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalLine - mappingB.originalLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\nfunction compareByGeneratedPositionsDeflatedNoLine(mappingA, mappingB, onlyCompareGenerated) {\n  var cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n  if (cmp !== 0 || onlyCompareGenerated) {\n    return cmp;\n  }\n\n  cmp = strcmp(mappingA.source, mappingB.source);\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalLine - mappingB.originalLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsDeflatedNoLine = compareByGeneratedPositionsDeflatedNoLine;\n\nfunction strcmp(aStr1, aStr2) {\n  if (aStr1 === aStr2) {\n    return 0;\n  }\n\n  if (aStr1 === null) {\n    return 1; // aStr2 !== null\n  }\n\n  if (aStr2 === null) {\n    return -1; // aStr1 !== null\n  }\n\n  if (aStr1 > aStr2) {\n    return 1;\n  }\n\n  return -1;\n}\n\n/**\n * Comparator between two mappings with inflated source and name strings where\n * the generated positions are compared.\n */\nfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n  var cmp = mappingA.generatedLine - mappingB.generatedLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = strcmp(mappingA.source, mappingB.source);\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalLine - mappingB.originalLine;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  cmp = mappingA.originalColumn - mappingB.originalColumn;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\n/**\n * Strip any JSON XSSI avoidance prefix from the string (as documented\n * in the source maps specification), and then parse the string as\n * JSON.\n */\nfunction parseSourceMapInput(str) {\n  return JSON.parse(str.replace(/^\\)]}'[^\\n]*\\n/, ''));\n}\nexports.parseSourceMapInput = parseSourceMapInput;\n\n/**\n * Compute the URL of a source given the the source root, the source's\n * URL, and the source map's URL.\n */\nfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\n  sourceURL = sourceURL || '';\n\n  if (sourceRoot) {\n    // This follows what Chrome does.\n    if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\n      sourceRoot += '/';\n    }\n    // The spec says:\n    //   Line 4: An optional source root, useful for relocating source\n    //   files on a server or removing repeated values in the\n    //   “sources” entry.  This value is prepended to the individual\n    //   entries in the “source” field.\n    sourceURL = sourceRoot + sourceURL;\n  }\n\n  // Historically, SourceMapConsumer did not take the sourceMapURL as\n  // a parameter.  This mode is still somewhat supported, which is why\n  // this code block is conditional.  However, it's preferable to pass\n  // the source map URL to SourceMapConsumer, so that this function\n  // can implement the source URL resolution algorithm as outlined in\n  // the spec.  This block is basically the equivalent of:\n  //    new URL(sourceURL, sourceMapURL).toString()\n  // ... except it avoids using URL, which wasn't available in the\n  // older releases of node still supported by this library.\n  //\n  // The spec says:\n  //   If the sources are not absolute URLs after prepending of the\n  //   “sourceRoot”, the sources are resolved relative to the\n  //   SourceMap (like resolving script src in a html document).\n  if (sourceMapURL) {\n    var parsed = urlParse(sourceMapURL);\n    if (!parsed) {\n      throw new Error(\"sourceMapURL could not be parsed\");\n    }\n    if (parsed.path) {\n      // Strip the last path component, but keep the \"/\".\n      var index = parsed.path.lastIndexOf('/');\n      if (index >= 0) {\n        parsed.path = parsed.path.substring(0, index + 1);\n      }\n    }\n    sourceURL = join(urlGenerate(parsed), sourceURL);\n  }\n\n  return normalize(sourceURL);\n}\nexports.computeSourceURL = computeSourceURL;\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar has = Object.prototype.hasOwnProperty;\nvar hasNativeMap = typeof Map !== \"undefined\";\n\n/**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\nfunction ArraySet() {\n  this._array = [];\n  this._set = hasNativeMap ? new Map() : Object.create(null);\n}\n\n/**\n * Static method for creating ArraySet instances from an existing array.\n */\nArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n  var set = new ArraySet();\n  for (var i = 0, len = aArray.length; i < len; i++) {\n    set.add(aArray[i], aAllowDuplicates);\n  }\n  return set;\n};\n\n/**\n * Return how many unique items are in this ArraySet. If duplicates have been\n * added, than those do not count towards the size.\n *\n * @returns Number\n */\nArraySet.prototype.size = function ArraySet_size() {\n  return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n};\n\n/**\n * Add the given string to this set.\n *\n * @param String aStr\n */\nArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n  var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n  var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n  var idx = this._array.length;\n  if (!isDuplicate || aAllowDuplicates) {\n    this._array.push(aStr);\n  }\n  if (!isDuplicate) {\n    if (hasNativeMap) {\n      this._set.set(aStr, idx);\n    } else {\n      this._set[sStr] = idx;\n    }\n  }\n};\n\n/**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\nArraySet.prototype.has = function ArraySet_has(aStr) {\n  if (hasNativeMap) {\n    return this._set.has(aStr);\n  } else {\n    var sStr = util.toSetString(aStr);\n    return has.call(this._set, sStr);\n  }\n};\n\n/**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\nArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n  if (hasNativeMap) {\n    var idx = this._set.get(aStr);\n    if (idx >= 0) {\n        return idx;\n    }\n  } else {\n    var sStr = util.toSetString(aStr);\n    if (has.call(this._set, sStr)) {\n      return this._set[sStr];\n    }\n  }\n\n  throw new Error('\"' + aStr + '\" is not in the set.');\n};\n\n/**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\nArraySet.prototype.at = function ArraySet_at(aIdx) {\n  if (aIdx >= 0 && aIdx < this._array.length) {\n    return this._array[aIdx];\n  }\n  throw new Error('No element indexed by ' + aIdx);\n};\n\n/**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\nArraySet.prototype.toArray = function ArraySet_toArray() {\n  return this._array.slice();\n};\n\nexports.ArraySet = ArraySet;\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\n\n/**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\nfunction generatedPositionAfter(mappingA, mappingB) {\n  // Optimized for most common case\n  var lineA = mappingA.generatedLine;\n  var lineB = mappingB.generatedLine;\n  var columnA = mappingA.generatedColumn;\n  var columnB = mappingB.generatedColumn;\n  return lineB > lineA || lineB == lineA && columnB >= columnA ||\n         util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n}\n\n/**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a neglibable overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\nfunction MappingList() {\n  this._array = [];\n  this._sorted = true;\n  // Serves as infimum\n  this._last = {generatedLine: -1, generatedColumn: 0};\n}\n\n/**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\nMappingList.prototype.unsortedForEach =\n  function MappingList_forEach(aCallback, aThisArg) {\n    this._array.forEach(aCallback, aThisArg);\n  };\n\n/**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\nMappingList.prototype.add = function MappingList_add(aMapping) {\n  if (generatedPositionAfter(this._last, aMapping)) {\n    this._last = aMapping;\n    this._array.push(aMapping);\n  } else {\n    this._sorted = false;\n    this._array.push(aMapping);\n  }\n};\n\n/**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\nMappingList.prototype.toArray = function MappingList_toArray() {\n  if (!this._sorted) {\n    this._array.sort(util.compareByGeneratedPositionsInflated);\n    this._sorted = true;\n  }\n  return this._array;\n};\n\nexports.MappingList = MappingList;\n","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar base64VLQ = require('./base64-vlq');\nvar util = require('./util');\nvar ArraySet = require('./array-set').ArraySet;\nvar MappingList = require('./mapping-list').MappingList;\n\n/**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n *   - file: The filename of the generated source.\n *   - sourceRoot: A root for all relative URLs in this source map.\n */\nfunction SourceMapGenerator(aArgs) {\n  if (!aArgs) {\n    aArgs = {};\n  }\n  this._file = util.getArg(aArgs, 'file', null);\n  this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n  this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n  this._ignoreInvalidMapping = util.getArg(aArgs, 'ignoreInvalidMapping', false);\n  this._sources = new ArraySet();\n  this._names = new ArraySet();\n  this._mappings = new MappingList();\n  this._sourcesContents = null;\n}\n\nSourceMapGenerator.prototype._version = 3;\n\n/**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\nSourceMapGenerator.fromSourceMap =\n  function SourceMapGenerator_fromSourceMap(aSourceMapConsumer, generatorOps) {\n    var sourceRoot = aSourceMapConsumer.sourceRoot;\n    var generator = new SourceMapGenerator(Object.assign(generatorOps || {}, {\n      file: aSourceMapConsumer.file,\n      sourceRoot: sourceRoot\n    }));\n    aSourceMapConsumer.eachMapping(function (mapping) {\n      var newMapping = {\n        generated: {\n          line: mapping.generatedLine,\n          column: mapping.generatedColumn\n        }\n      };\n\n      if (mapping.source != null) {\n        newMapping.source = mapping.source;\n        if (sourceRoot != null) {\n          newMapping.source = util.relative(sourceRoot, newMapping.source);\n        }\n\n        newMapping.original = {\n          line: mapping.originalLine,\n          column: mapping.originalColumn\n        };\n\n        if (mapping.name != null) {\n          newMapping.name = mapping.name;\n        }\n      }\n\n      generator.addMapping(newMapping);\n    });\n    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n      var sourceRelative = sourceFile;\n      if (sourceRoot !== null) {\n        sourceRelative = util.relative(sourceRoot, sourceFile);\n      }\n\n      if (!generator._sources.has(sourceRelative)) {\n        generator._sources.add(sourceRelative);\n      }\n\n      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n      if (content != null) {\n        generator.setSourceContent(sourceFile, content);\n      }\n    });\n    return generator;\n  };\n\n/**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n *   - generated: An object with the generated line and column positions.\n *   - original: An object with the original line and column positions.\n *   - source: The original source file (relative to the sourceRoot).\n *   - name: An optional original token name for this mapping.\n */\nSourceMapGenerator.prototype.addMapping =\n  function SourceMapGenerator_addMapping(aArgs) {\n    var generated = util.getArg(aArgs, 'generated');\n    var original = util.getArg(aArgs, 'original', null);\n    var source = util.getArg(aArgs, 'source', null);\n    var name = util.getArg(aArgs, 'name', null);\n\n    if (!this._skipValidation) {\n      if (this._validateMapping(generated, original, source, name) === false) {\n        return;\n      }\n    }\n\n    if (source != null) {\n      source = String(source);\n      if (!this._sources.has(source)) {\n        this._sources.add(source);\n      }\n    }\n\n    if (name != null) {\n      name = String(name);\n      if (!this._names.has(name)) {\n        this._names.add(name);\n      }\n    }\n\n    this._mappings.add({\n      generatedLine: generated.line,\n      generatedColumn: generated.column,\n      originalLine: original != null && original.line,\n      originalColumn: original != null && original.column,\n      source: source,\n      name: name\n    });\n  };\n\n/**\n * Set the source content for a source file.\n */\nSourceMapGenerator.prototype.setSourceContent =\n  function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n    var source = aSourceFile;\n    if (this._sourceRoot != null) {\n      source = util.relative(this._sourceRoot, source);\n    }\n\n    if (aSourceContent != null) {\n      // Add the source content to the _sourcesContents map.\n      // Create a new _sourcesContents map if the property is null.\n      if (!this._sourcesContents) {\n        this._sourcesContents = Object.create(null);\n      }\n      this._sourcesContents[util.toSetString(source)] = aSourceContent;\n    } else if (this._sourcesContents) {\n      // Remove the source file from the _sourcesContents map.\n      // If the _sourcesContents map is empty, set the property to null.\n      delete this._sourcesContents[util.toSetString(source)];\n      if (Object.keys(this._sourcesContents).length === 0) {\n        this._sourcesContents = null;\n      }\n    }\n  };\n\n/**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n *        If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n *        to be applied. If relative, it is relative to the SourceMapConsumer.\n *        This parameter is needed when the two source maps aren't in the same\n *        directory, and the source map to be applied contains relative source\n *        paths. If so, those relative source paths need to be rewritten\n *        relative to the SourceMapGenerator.\n */\nSourceMapGenerator.prototype.applySourceMap =\n  function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n    var sourceFile = aSourceFile;\n    // If aSourceFile is omitted, we will use the file property of the SourceMap\n    if (aSourceFile == null) {\n      if (aSourceMapConsumer.file == null) {\n        throw new Error(\n          'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n          'or the source map\\'s \"file\" property. Both were omitted.'\n        );\n      }\n      sourceFile = aSourceMapConsumer.file;\n    }\n    var sourceRoot = this._sourceRoot;\n    // Make \"sourceFile\" relative if an absolute Url is passed.\n    if (sourceRoot != null) {\n      sourceFile = util.relative(sourceRoot, sourceFile);\n    }\n    // Applying the SourceMap can add and remove items from the sources and\n    // the names array.\n    var newSources = new ArraySet();\n    var newNames = new ArraySet();\n\n    // Find mappings for the \"sourceFile\"\n    this._mappings.unsortedForEach(function (mapping) {\n      if (mapping.source === sourceFile && mapping.originalLine != null) {\n        // Check if it can be mapped by the source map, then update the mapping.\n        var original = aSourceMapConsumer.originalPositionFor({\n          line: mapping.originalLine,\n          column: mapping.originalColumn\n        });\n        if (original.source != null) {\n          // Copy mapping\n          mapping.source = original.source;\n          if (aSourceMapPath != null) {\n            mapping.source = util.join(aSourceMapPath, mapping.source)\n          }\n          if (sourceRoot != null) {\n            mapping.source = util.relative(sourceRoot, mapping.source);\n          }\n          mapping.originalLine = original.line;\n          mapping.originalColumn = original.column;\n          if (original.name != null) {\n            mapping.name = original.name;\n          }\n        }\n      }\n\n      var source = mapping.source;\n      if (source != null && !newSources.has(source)) {\n        newSources.add(source);\n      }\n\n      var name = mapping.name;\n      if (name != null && !newNames.has(name)) {\n        newNames.add(name);\n      }\n\n    }, this);\n    this._sources = newSources;\n    this._names = newNames;\n\n    // Copy sourcesContents of applied map.\n    aSourceMapConsumer.sources.forEach(function (sourceFile) {\n      var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n      if (content != null) {\n        if (aSourceMapPath != null) {\n          sourceFile = util.join(aSourceMapPath, sourceFile);\n        }\n        if (sourceRoot != null) {\n          sourceFile = util.relative(sourceRoot, sourceFile);\n        }\n        this.setSourceContent(sourceFile, content);\n      }\n    }, this);\n  };\n\n/**\n * A mapping can have one of the three levels of data:\n *\n *   1. Just the generated position.\n *   2. The Generated position, original position, and original source.\n *   3. Generated and original position, original source, as well as a name\n *      token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\nSourceMapGenerator.prototype._validateMapping =\n  function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n                                              aName) {\n    // When aOriginal is truthy but has empty values for .line and .column,\n    // it is most likely a programmer error. In this case we throw a very\n    // specific error message to try to guide them the right way.\n    // For example: https://github.com/Polymer/polymer-bundler/pull/519\n    if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n      var message = 'original.line and original.column are not numbers -- you probably meant to omit ' +\n      'the original mapping entirely and only map the generated position. If so, pass ' +\n      'null for the original mapping instead of an object with empty or null values.'\n\n      if (this._ignoreInvalidMapping) {\n        if (typeof console !== 'undefined' && console.warn) {\n          console.warn(message);\n        }\n        return false;\n      } else {\n        throw new Error(message);\n      }\n    }\n\n    if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n        && aGenerated.line > 0 && aGenerated.column >= 0\n        && !aOriginal && !aSource && !aName) {\n      // Case 1.\n      return;\n    }\n    else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n             && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n             && aGenerated.line > 0 && aGenerated.column >= 0\n             && aOriginal.line > 0 && aOriginal.column >= 0\n             && aSource) {\n      // Cases 2 and 3.\n      return;\n    }\n    else {\n      var message = 'Invalid mapping: ' + JSON.stringify({\n        generated: aGenerated,\n        source: aSource,\n        original: aOriginal,\n        name: aName\n      });\n\n      if (this._ignoreInvalidMapping) {\n        if (typeof console !== 'undefined' && console.warn) {\n          console.warn(message);\n        }\n        return false;\n      } else {\n        throw new Error(message)\n      }\n    }\n  };\n\n/**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\nSourceMapGenerator.prototype._serializeMappings =\n  function SourceMapGenerator_serializeMappings() {\n    var previousGeneratedColumn = 0;\n    var previousGeneratedLine = 1;\n    var previousOriginalColumn = 0;\n    var previousOriginalLine = 0;\n    var previousName = 0;\n    var previousSource = 0;\n    var result = '';\n    var next;\n    var mapping;\n    var nameIdx;\n    var sourceIdx;\n\n    var mappings = this._mappings.toArray();\n    for (var i = 0, len = mappings.length; i < len; i++) {\n      mapping = mappings[i];\n      next = ''\n\n      if (mapping.generatedLine !== previousGeneratedLine) {\n        previousGeneratedColumn = 0;\n        while (mapping.generatedLine !== previousGeneratedLine) {\n          next += ';';\n          previousGeneratedLine++;\n        }\n      }\n      else {\n        if (i > 0) {\n          if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n            continue;\n          }\n          next += ',';\n        }\n      }\n\n      next += base64VLQ.encode(mapping.generatedColumn\n                                 - previousGeneratedColumn);\n      previousGeneratedColumn = mapping.generatedColumn;\n\n      if (mapping.source != null) {\n        sourceIdx = this._sources.indexOf(mapping.source);\n        next += base64VLQ.encode(sourceIdx - previousSource);\n        previousSource = sourceIdx;\n\n        // lines are stored 0-based in SourceMap spec version 3\n        next += base64VLQ.encode(mapping.originalLine - 1\n                                   - previousOriginalLine);\n        previousOriginalLine = mapping.originalLine - 1;\n\n        next += base64VLQ.encode(mapping.originalColumn\n                                   - previousOriginalColumn);\n        previousOriginalColumn = mapping.originalColumn;\n\n        if (mapping.name != null) {\n          nameIdx = this._names.indexOf(mapping.name);\n          next += base64VLQ.encode(nameIdx - previousName);\n          previousName = nameIdx;\n        }\n      }\n\n      result += next;\n    }\n\n    return result;\n  };\n\nSourceMapGenerator.prototype._generateSourcesContent =\n  function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n    return aSources.map(function (source) {\n      if (!this._sourcesContents) {\n        return null;\n      }\n      if (aSourceRoot != null) {\n        source = util.relative(aSourceRoot, source);\n      }\n      var key = util.toSetString(source);\n      return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n        ? this._sourcesContents[key]\n        : null;\n    }, this);\n  };\n\n/**\n * Externalize the source map.\n */\nSourceMapGenerator.prototype.toJSON =\n  function SourceMapGenerator_toJSON() {\n    var map = {\n      version: this._version,\n      sources: this._sources.toArray(),\n      names: this._names.toArray(),\n      mappings: this._serializeMappings()\n    };\n    if (this._file != null) {\n      map.file = this._file;\n    }\n    if (this._sourceRoot != null) {\n      map.sourceRoot = this._sourceRoot;\n    }\n    if (this._sourcesContents) {\n      map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n    }\n\n    return map;\n  };\n\n/**\n * Render the source map being generated to a string.\n */\nSourceMapGenerator.prototype.toString =\n  function SourceMapGenerator_toString() {\n    return JSON.stringify(this.toJSON());\n  };\n\nexports.SourceMapGenerator = SourceMapGenerator;\n","import { SourceMapGenerator } from 'source-map-js/lib/source-map-generator.js';\n\nconst trackNodes = new Set(['Atrule', 'Selector', 'Declaration']);\n\nexport function generateSourceMap(handlers) {\n    const map = new SourceMapGenerator();\n    const generated = {\n        line: 1,\n        column: 0\n    };\n    const original = {\n        line: 0, // should be zero to add first mapping\n        column: 0\n    };\n    const activatedGenerated = {\n        line: 1,\n        column: 0\n    };\n    const activatedMapping = {\n        generated: activatedGenerated\n    };\n    let line = 1;\n    let column = 0;\n    let sourceMappingActive = false;\n\n    const origHandlersNode = handlers.node;\n    handlers.node = function(node) {\n        if (node.loc && node.loc.start && trackNodes.has(node.type)) {\n            const nodeLine = node.loc.start.line;\n            const nodeColumn = node.loc.start.column - 1;\n\n            if (original.line !== nodeLine ||\n                original.column !== nodeColumn) {\n                original.line = nodeLine;\n                original.column = nodeColumn;\n\n                generated.line = line;\n                generated.column = column;\n\n                if (sourceMappingActive) {\n                    sourceMappingActive = false;\n                    if (generated.line !== activatedGenerated.line ||\n                        generated.column !== activatedGenerated.column) {\n                        map.addMapping(activatedMapping);\n                    }\n                }\n\n                sourceMappingActive = true;\n                map.addMapping({\n                    source: node.loc.source,\n                    original,\n                    generated\n                });\n            }\n        }\n\n        origHandlersNode.call(this, node);\n\n        if (sourceMappingActive && trackNodes.has(node.type)) {\n            activatedGenerated.line = line;\n            activatedGenerated.column = column;\n        }\n    };\n\n    const origHandlersEmit = handlers.emit;\n    handlers.emit = function(value, type, auto) {\n        for (let i = 0; i < value.length; i++) {\n            if (value.charCodeAt(i) === 10) { // \\n\n                line++;\n                column = 0;\n            } else {\n                column++;\n            }\n        }\n\n        origHandlersEmit(value, type, auto);\n    };\n\n    const origHandlersResult = handlers.result;\n    handlers.result = function() {\n        if (sourceMappingActive) {\n            map.addMapping(activatedMapping);\n        }\n\n        return {\n            css: origHandlersResult(),\n            map\n        };\n    };\n\n    return handlers;\n};\n","import {\n    WhiteSpace,\n    Delim,\n    Ident,\n    Function as FunctionToken,\n    Url,\n    BadUrl,\n    AtKeyword,\n    Hash,\n    Percentage,\n    Dimension,\n    Number as NumberToken,\n    String as StringToken,\n    Colon,\n    LeftParenthesis,\n    RightParenthesis,\n    CDC\n} from '../tokenizer/index.js';\n\nconst PLUSSIGN = 0x002B;    // U+002B PLUS SIGN (+)\nconst HYPHENMINUS = 0x002D; // U+002D HYPHEN-MINUS (-)\n\nconst code = (type, value) => {\n    if (type === Delim) {\n        type = value;\n    }\n\n    if (typeof type === 'string') {\n        const charCode = type.charCodeAt(0);\n        return charCode > 0x7F ? 0x8000 : charCode << 8;\n    }\n\n    return type;\n};\n\n// https://www.w3.org/TR/css-syntax-3/#serialization\n// The only requirement for serialization is that it must \"round-trip\" with parsing,\n// that is, parsing the stylesheet must produce the same data structures as parsing,\n// serializing, and parsing again, except for consecutive <whitespace-token>s,\n// which may be collapsed into a single token.\n\nconst specPairs = [\n    [Ident, Ident],\n    [Ident, FunctionToken],\n    [Ident, Url],\n    [Ident, BadUrl],\n    [Ident, '-'],\n    [Ident, NumberToken],\n    [Ident, Percentage],\n    [Ident, Dimension],\n    [Ident, CDC],\n    [Ident, LeftParenthesis],\n\n    [AtKeyword, Ident],\n    [AtKeyword, FunctionToken],\n    [AtKeyword, Url],\n    [AtKeyword, BadUrl],\n    [AtKeyword, '-'],\n    [AtKeyword, NumberToken],\n    [AtKeyword, Percentage],\n    [AtKeyword, Dimension],\n    [AtKeyword, CDC],\n\n    [Hash, Ident],\n    [Hash, FunctionToken],\n    [Hash, Url],\n    [Hash, BadUrl],\n    [Hash, '-'],\n    [Hash, NumberToken],\n    [Hash, Percentage],\n    [Hash, Dimension],\n    [Hash, CDC],\n\n    [Dimension, Ident],\n    [Dimension, FunctionToken],\n    [Dimension, Url],\n    [Dimension, BadUrl],\n    [Dimension, '-'],\n    [Dimension, NumberToken],\n    [Dimension, Percentage],\n    [Dimension, Dimension],\n    [Dimension, CDC],\n\n    ['#', Ident],\n    ['#', FunctionToken],\n    ['#', Url],\n    ['#', BadUrl],\n    ['#', '-'],\n    ['#', NumberToken],\n    ['#', Percentage],\n    ['#', Dimension],\n    ['#', CDC], // https://github.com/w3c/csswg-drafts/pull/6874\n\n    ['-', Ident],\n    ['-', FunctionToken],\n    ['-', Url],\n    ['-', BadUrl],\n    ['-', '-'],\n    ['-', NumberToken],\n    ['-', Percentage],\n    ['-', Dimension],\n    ['-', CDC], // https://github.com/w3c/csswg-drafts/pull/6874\n\n    [NumberToken, Ident],\n    [NumberToken, FunctionToken],\n    [NumberToken, Url],\n    [NumberToken, BadUrl],\n    [NumberToken, NumberToken],\n    [NumberToken, Percentage],\n    [NumberToken, Dimension],\n    [NumberToken, '%'],\n    [NumberToken, CDC], // https://github.com/w3c/csswg-drafts/pull/6874\n\n    ['@', Ident],\n    ['@', FunctionToken],\n    ['@', Url],\n    ['@', BadUrl],\n    ['@', '-'],\n    ['@', CDC], // https://github.com/w3c/csswg-drafts/pull/6874\n\n    ['.', NumberToken],\n    ['.', Percentage],\n    ['.', Dimension],\n\n    ['+', NumberToken],\n    ['+', Percentage],\n    ['+', Dimension],\n\n    ['/', '*']\n];\n// validate with scripts/generate-safe\nconst safePairs = specPairs.concat([\n    [Ident, Hash],\n\n    [Dimension, Hash],\n\n    [Hash, Hash],\n\n    [AtKeyword, LeftParenthesis],\n    [AtKeyword, StringToken],\n    [AtKeyword, Colon],\n\n    [Percentage, Percentage],\n    [Percentage, Dimension],\n    [Percentage, FunctionToken],\n    [Percentage, '-'],\n\n    [RightParenthesis, Ident],\n    [RightParenthesis, FunctionToken],\n    [RightParenthesis, Percentage],\n    [RightParenthesis, Dimension],\n    [RightParenthesis, Hash],\n    [RightParenthesis, '-']\n]);\n\nfunction createMap(pairs) {\n    const isWhiteSpaceRequired = new Set(\n        pairs.map(([prev, next]) => (code(prev) << 16 | code(next)))\n    );\n\n    return function(prevCode, type, value) {\n        const nextCode = code(type, value);\n        const nextCharCode = value.charCodeAt(0);\n        const emitWs =\n            (nextCharCode === HYPHENMINUS &&\n                type !== Ident &&\n                type !== FunctionToken &&\n                type !== CDC) ||\n            (nextCharCode === PLUSSIGN)\n                ? isWhiteSpaceRequired.has(prevCode << 16 | nextCharCode << 8)\n                : isWhiteSpaceRequired.has(prevCode << 16 | nextCode);\n\n        if (emitWs) {\n            this.emit(' ', WhiteSpace, true);\n        }\n\n        return nextCode;\n    };\n}\n\nexport const spec = createMap(specPairs);\nexport const safe = createMap(safePairs);\n","import { tokenize, Delim, WhiteSpace } from '../tokenizer/index.js';\nimport { generateSourceMap } from './sourceMap.js';\nimport * as tokenBefore from './token-before.js';\n\nconst REVERSESOLIDUS = 0x005c; // U+005C REVERSE SOLIDUS (\\)\n\nfunction processChildren(node, delimeter) {\n    if (typeof delimeter === 'function') {\n        let prev = null;\n\n        node.children.forEach(node => {\n            if (prev !== null) {\n                delimeter.call(this, prev);\n            }\n\n            this.node(node);\n            prev = node;\n        });\n\n        return;\n    }\n\n    node.children.forEach(this.node, this);\n}\n\nfunction processChunk(chunk) {\n    tokenize(chunk, (type, start, end) => {\n        this.token(type, chunk.slice(start, end));\n    });\n}\n\nexport function createGenerator(config) {\n    const types = new Map();\n\n    for (let [name, item] of Object.entries(config.node)) {\n        const fn = item.generate || item;\n\n        if (typeof fn === 'function') {\n            types.set(name, item.generate || item);\n        }\n    }\n\n    return function(node, options) {\n        let buffer = '';\n        let prevCode = 0;\n        let handlers = {\n            node(node) {\n                if (types.has(node.type)) {\n                    types.get(node.type).call(publicApi, node);\n                } else {\n                    throw new Error('Unknown node type: ' + node.type);\n                }\n            },\n            tokenBefore: tokenBefore.safe,\n            token(type, value) {\n                prevCode = this.tokenBefore(prevCode, type, value);\n\n                this.emit(value, type, false);\n\n                if (type === Delim && value.charCodeAt(0) === REVERSESOLIDUS) {\n                    this.emit('\\n', WhiteSpace, true);\n                }\n            },\n            emit(value) {\n                buffer += value;\n            },\n            result() {\n                return buffer;\n            }\n        };\n\n        if (options) {\n            if (typeof options.decorator === 'function') {\n                handlers = options.decorator(handlers);\n            }\n\n            if (options.sourceMap) {\n                handlers = generateSourceMap(handlers);\n            }\n\n            if (options.mode in tokenBefore) {\n                handlers.tokenBefore = tokenBefore[options.mode];\n            }\n        }\n\n        const publicApi = {\n            node: (node) => handlers.node(node),\n            children: processChildren,\n            token: (type, value) => handlers.token(type, value),\n            tokenize: processChunk\n        };\n\n        handlers.node(node);\n\n        return handlers.result();\n    };\n};\n","import { List } from '../utils/List.js';\n\nexport function createConvertor(walk) {\n    return {\n        fromPlainObject(ast) {\n            walk(ast, {\n                enter(node) {\n                    if (node.children && node.children instanceof List === false) {\n                        node.children = new List().fromArray(node.children);\n                    }\n                }\n            });\n\n            return ast;\n        },\n        toPlainObject(ast) {\n            walk(ast, {\n                leave(node) {\n                    if (node.children && node.children instanceof List) {\n                        node.children = node.children.toArray();\n                    }\n                }\n            });\n\n            return ast;\n        }\n    };\n};\n","const { hasOwnProperty } = Object.prototype;\nconst noop = function() {};\n\nfunction ensureFunction(value) {\n    return typeof value === 'function' ? value : noop;\n}\n\nfunction invokeForType(fn, type) {\n    return function(node, item, list) {\n        if (node.type === type) {\n            fn.call(this, node, item, list);\n        }\n    };\n}\n\nfunction getWalkersFromStructure(name, nodeType) {\n    const structure = nodeType.structure;\n    const walkers = [];\n\n    for (const key in structure) {\n        if (hasOwnProperty.call(structure, key) === false) {\n            continue;\n        }\n\n        let fieldTypes = structure[key];\n        const walker = {\n            name: key,\n            type: false,\n            nullable: false\n        };\n\n        if (!Array.isArray(fieldTypes)) {\n            fieldTypes = [fieldTypes];\n        }\n\n        for (const fieldType of fieldTypes) {\n            if (fieldType === null) {\n                walker.nullable = true;\n            } else if (typeof fieldType === 'string') {\n                walker.type = 'node';\n            } else if (Array.isArray(fieldType)) {\n                walker.type = 'list';\n            }\n        }\n\n        if (walker.type) {\n            walkers.push(walker);\n        }\n    }\n\n    if (walkers.length) {\n        return {\n            context: nodeType.walkContext,\n            fields: walkers\n        };\n    }\n\n    return null;\n}\n\nfunction getTypesFromConfig(config) {\n    const types = {};\n\n    for (const name in config.node) {\n        if (hasOwnProperty.call(config.node, name)) {\n            const nodeType = config.node[name];\n\n            if (!nodeType.structure) {\n                throw new Error('Missed `structure` field in `' + name + '` node type definition');\n            }\n\n            types[name] = getWalkersFromStructure(name, nodeType);\n        }\n    }\n\n    return types;\n}\n\nfunction createTypeIterator(config, reverse) {\n    const fields = config.fields.slice();\n    const contextName = config.context;\n    const useContext = typeof contextName === 'string';\n\n    if (reverse) {\n        fields.reverse();\n    }\n\n    return function(node, context, walk, walkReducer) {\n        let prevContextValue;\n\n        if (useContext) {\n            prevContextValue = context[contextName];\n            context[contextName] = node;\n        }\n\n        for (const field of fields) {\n            const ref = node[field.name];\n\n            if (!field.nullable || ref) {\n                if (field.type === 'list') {\n                    const breakWalk = reverse\n                        ? ref.reduceRight(walkReducer, false)\n                        : ref.reduce(walkReducer, false);\n\n                    if (breakWalk) {\n                        return true;\n                    }\n                } else if (walk(ref)) {\n                    return true;\n                }\n            }\n        }\n\n        if (useContext) {\n            context[contextName] = prevContextValue;\n        }\n    };\n}\n\nfunction createFastTraveralMap({\n    StyleSheet,\n    Atrule,\n    Rule,\n    Block,\n    DeclarationList\n}) {\n    return {\n        Atrule: {\n            StyleSheet,\n            Atrule,\n            Rule,\n            Block\n        },\n        Rule: {\n            StyleSheet,\n            Atrule,\n            Rule,\n            Block\n        },\n        Declaration: {\n            StyleSheet,\n            Atrule,\n            Rule,\n            Block,\n            DeclarationList\n        }\n    };\n}\n\nexport function createWalker(config) {\n    const types = getTypesFromConfig(config);\n    const iteratorsNatural = {};\n    const iteratorsReverse = {};\n    const breakWalk = Symbol('break-walk');\n    const skipNode = Symbol('skip-node');\n\n    for (const name in types) {\n        if (hasOwnProperty.call(types, name) && types[name] !== null) {\n            iteratorsNatural[name] = createTypeIterator(types[name], false);\n            iteratorsReverse[name] = createTypeIterator(types[name], true);\n        }\n    }\n\n    const fastTraversalIteratorsNatural = createFastTraveralMap(iteratorsNatural);\n    const fastTraversalIteratorsReverse = createFastTraveralMap(iteratorsReverse);\n\n    const walk = function(root, options) {\n        function walkNode(node, item, list) {\n            const enterRet = enter.call(context, node, item, list);\n\n            if (enterRet === breakWalk) {\n                return true;\n            }\n\n            if (enterRet === skipNode) {\n                return false;\n            }\n\n            if (iterators.hasOwnProperty(node.type)) {\n                if (iterators[node.type](node, context, walkNode, walkReducer)) {\n                    return true;\n                }\n            }\n\n            if (leave.call(context, node, item, list) === breakWalk) {\n                return true;\n            }\n\n            return false;\n        }\n\n        let enter = noop;\n        let leave = noop;\n        let iterators = iteratorsNatural;\n        let walkReducer = (ret, data, item, list) => ret || walkNode(data, item, list);\n        const context = {\n            break: breakWalk,\n            skip: skipNode,\n\n            root,\n            stylesheet: null,\n            atrule: null,\n            atrulePrelude: null,\n            rule: null,\n            selector: null,\n            block: null,\n            declaration: null,\n            function: null\n        };\n\n        if (typeof options === 'function') {\n            enter = options;\n        } else if (options) {\n            enter = ensureFunction(options.enter);\n            leave = ensureFunction(options.leave);\n\n            if (options.reverse) {\n                iterators = iteratorsReverse;\n            }\n\n            if (options.visit) {\n                if (fastTraversalIteratorsNatural.hasOwnProperty(options.visit)) {\n                    iterators = options.reverse\n                        ? fastTraversalIteratorsReverse[options.visit]\n                        : fastTraversalIteratorsNatural[options.visit];\n                } else if (!types.hasOwnProperty(options.visit)) {\n                    throw new Error('Bad value `' + options.visit + '` for `visit` option (should be: ' + Object.keys(types).sort().join(', ') + ')');\n                }\n\n                enter = invokeForType(enter, options.visit);\n                leave = invokeForType(leave, options.visit);\n            }\n        }\n\n        if (enter === noop && leave === noop) {\n            throw new Error('Neither `enter` nor `leave` walker handler is set or both aren\\'t a function');\n        }\n\n        walkNode(root);\n    };\n\n    walk.break = breakWalk;\n    walk.skip = skipNode;\n\n    walk.find = function(ast, fn) {\n        let found = null;\n\n        walk(ast, function(node, item, list) {\n            if (fn.call(this, node, item, list)) {\n                found = node;\n                return breakWalk;\n            }\n        });\n\n        return found;\n    };\n\n    walk.findLast = function(ast, fn) {\n        let found = null;\n\n        walk(ast, {\n            reverse: true,\n            enter(node, item, list) {\n                if (fn.call(this, node, item, list)) {\n                    found = node;\n                    return breakWalk;\n                }\n            }\n        });\n\n        return found;\n    };\n\n    walk.findAll = function(ast, fn) {\n        const found = [];\n\n        walk(ast, function(node, item, list) {\n            if (fn.call(this, node, item, list)) {\n                found.push(node);\n            }\n        });\n\n        return found;\n    };\n\n    return walk;\n};\n","function noop(value) {\n    return value;\n}\n\nfunction generateMultiplier(multiplier) {\n    const { min, max, comma } = multiplier;\n\n    if (min === 0 && max === 0) {\n        return comma ? '#?' : '*';\n    }\n\n    if (min === 0 && max === 1) {\n        return '?';\n    }\n\n    if (min === 1 && max === 0) {\n        return comma ? '#' : '+';\n    }\n\n    if (min === 1 && max === 1) {\n        return '';\n    }\n\n    return (\n        (comma ? '#' : '') +\n        (min === max\n            ? '{' + min + '}'\n            : '{' + min + ',' + (max !== 0 ? max : '') + '}'\n        )\n    );\n}\n\nfunction generateTypeOpts(node) {\n    switch (node.type) {\n        case 'Range':\n            return (\n                ' [' +\n                (node.min === null ? '-∞' : node.min) +\n                ',' +\n                (node.max === null ? '∞' : node.max) +\n                ']'\n            );\n\n        default:\n            throw new Error('Unknown node type `' + node.type + '`');\n    }\n}\n\nfunction generateSequence(node, decorate, forceBraces, compact) {\n    const combinator = node.combinator === ' ' || compact ? node.combinator : ' ' + node.combinator + ' ';\n    const result = node.terms\n        .map(term => internalGenerate(term, decorate, forceBraces, compact))\n        .join(combinator);\n\n    if (node.explicit || forceBraces) {\n        return (compact || result[0] === ',' ? '[' : '[ ') + result + (compact ? ']' : ' ]');\n    }\n\n    return result;\n}\n\nfunction internalGenerate(node, decorate, forceBraces, compact) {\n    let result;\n\n    switch (node.type) {\n        case 'Group':\n            result =\n                generateSequence(node, decorate, forceBraces, compact) +\n                (node.disallowEmpty ? '!' : '');\n            break;\n\n        case 'Multiplier':\n            // return since node is a composition\n            return (\n                internalGenerate(node.term, decorate, forceBraces, compact) +\n                decorate(generateMultiplier(node), node)\n            );\n\n        case 'Boolean':\n            result = '<boolean-expr[' + internalGenerate(node.term, decorate, forceBraces, compact) + ']>';\n            break;\n\n        case 'Type':\n            result = '<' + node.name + (node.opts ? decorate(generateTypeOpts(node.opts), node.opts) : '') + '>';\n            break;\n\n        case 'Property':\n            result = '<\\'' + node.name + '\\'>';\n            break;\n\n        case 'Keyword':\n            result = node.name;\n            break;\n\n        case 'AtKeyword':\n            result = '@' + node.name;\n            break;\n\n        case 'Function':\n            result = node.name + '(';\n            break;\n\n        case 'String':\n        case 'Token':\n            result = node.value;\n            break;\n\n        case 'Comma':\n            result = ',';\n            break;\n\n        default:\n            throw new Error('Unknown node type `' + node.type + '`');\n    }\n\n    return decorate(result, node);\n}\n\nexport function generate(node, options) {\n    let decorate = noop;\n    let forceBraces = false;\n    let compact = false;\n\n    if (typeof options === 'function') {\n        decorate = options;\n    } else if (options) {\n        forceBraces = Boolean(options.forceBraces);\n        compact = Boolean(options.compact);\n        if (typeof options.decorate === 'function') {\n            decorate = options.decorate;\n        }\n    }\n\n    return internalGenerate(node, decorate, forceBraces, compact);\n};\n","import { createCustomError } from '../utils/create-custom-error.js';\nimport { generate } from '../definition-syntax/generate.js';\n\nconst defaultLoc = { offset: 0, line: 1, column: 1 };\n\nfunction locateMismatch(matchResult, node) {\n    const tokens = matchResult.tokens;\n    const longestMatch = matchResult.longestMatch;\n    const mismatchNode = longestMatch < tokens.length ? tokens[longestMatch].node || null : null;\n    const badNode = mismatchNode !== node ? mismatchNode : null;\n    let mismatchOffset = 0;\n    let mismatchLength = 0;\n    let entries = 0;\n    let css = '';\n    let start;\n    let end;\n\n    for (let i = 0; i < tokens.length; i++) {\n        const token = tokens[i].value;\n\n        if (i === longestMatch) {\n            mismatchLength = token.length;\n            mismatchOffset = css.length;\n        }\n\n        if (badNode !== null && tokens[i].node === badNode) {\n            if (i <= longestMatch) {\n                entries++;\n            } else {\n                entries = 0;\n            }\n        }\n\n        css += token;\n    }\n\n    if (longestMatch === tokens.length || entries > 1) { // last\n        start = fromLoc(badNode || node, 'end') || buildLoc(defaultLoc, css);\n        end = buildLoc(start);\n    } else {\n        start = fromLoc(badNode, 'start') ||\n            buildLoc(fromLoc(node, 'start') || defaultLoc, css.slice(0, mismatchOffset));\n        end = fromLoc(badNode, 'end') ||\n            buildLoc(start, css.substr(mismatchOffset, mismatchLength));\n    }\n\n    return {\n        css,\n        mismatchOffset,\n        mismatchLength,\n        start,\n        end\n    };\n}\n\nfunction fromLoc(node, point) {\n    const value = node && node.loc && node.loc[point];\n\n    if (value) {\n        return 'line' in value ? buildLoc(value) : value;\n    }\n\n    return null;\n}\n\nfunction buildLoc({ offset, line, column }, extra) {\n    const loc = {\n        offset,\n        line,\n        column\n    };\n\n    if (extra) {\n        const lines = extra.split(/\\n|\\r\\n?|\\f/);\n\n        loc.offset += extra.length;\n        loc.line += lines.length - 1;\n        loc.column = lines.length === 1 ? loc.column + extra.length : lines.pop().length + 1;\n    }\n\n    return loc;\n}\n\nexport const SyntaxReferenceError = function(type, referenceName) {\n    const error = createCustomError(\n        'SyntaxReferenceError',\n        type + (referenceName ? ' `' + referenceName + '`' : '')\n    );\n\n    error.reference = referenceName;\n\n    return error;\n};\n\nexport const SyntaxMatchError = function(message, syntax, node, matchResult) {\n    const error = createCustomError('SyntaxMatchError', message);\n    const {\n        css,\n        mismatchOffset,\n        mismatchLength,\n        start,\n        end\n    } = locateMismatch(matchResult, node);\n\n    error.rawMessage = message;\n    error.syntax = syntax ? generate(syntax) : '<generic>';\n    error.css = css;\n    error.mismatchOffset = mismatchOffset;\n    error.mismatchLength = mismatchLength;\n    error.message = message + '\\n' +\n        '  syntax: ' + error.syntax + '\\n' +\n        '   value: ' + (css || '<empty string>') + '\\n' +\n        '  --------' + new Array(error.mismatchOffset + 1).join('-') + '^';\n\n    Object.assign(error, start);\n    error.loc = {\n        source: (node && node.loc && node.loc.source) || '<unknown>',\n        start,\n        end\n    };\n\n    return error;\n};\n","const keywords = new Map();\nconst properties = new Map();\nconst HYPHENMINUS = 45; // '-'.charCodeAt()\n\nexport const keyword = getKeywordDescriptor;\nexport const property = getPropertyDescriptor;\nexport const vendorPrefix = getVendorPrefix;\nexport function isCustomProperty(str, offset) {\n    offset = offset || 0;\n\n    return str.length - offset >= 2 &&\n           str.charCodeAt(offset) === HYPHENMINUS &&\n           str.charCodeAt(offset + 1) === HYPHENMINUS;\n}\n\nfunction getVendorPrefix(str, offset) {\n    offset = offset || 0;\n\n    // verdor prefix should be at least 3 chars length\n    if (str.length - offset >= 3) {\n        // vendor prefix starts with hyper minus following non-hyper minus\n        if (str.charCodeAt(offset) === HYPHENMINUS &&\n            str.charCodeAt(offset + 1) !== HYPHENMINUS) {\n            // vendor prefix should contain a hyper minus at the ending\n            const secondDashIndex = str.indexOf('-', offset + 2);\n\n            if (secondDashIndex !== -1) {\n                return str.substring(offset, secondDashIndex + 1);\n            }\n        }\n    }\n\n    return '';\n}\n\nfunction getKeywordDescriptor(keyword) {\n    if (keywords.has(keyword)) {\n        return keywords.get(keyword);\n    }\n\n    const name = keyword.toLowerCase();\n    let descriptor = keywords.get(name);\n\n    if (descriptor === undefined) {\n        const custom = isCustomProperty(name, 0);\n        const vendor = !custom ? getVendorPrefix(name, 0) : '';\n        descriptor = Object.freeze({\n            basename: name.substr(vendor.length),\n            name,\n            prefix: vendor,\n            vendor,\n            custom\n        });\n    }\n\n    keywords.set(keyword, descriptor);\n\n    return descriptor;\n}\n\nfunction getPropertyDescriptor(property) {\n    if (properties.has(property)) {\n        return properties.get(property);\n    }\n\n    let name = property;\n    let hack = property[0];\n\n    if (hack === '/') {\n        hack = property[1] === '/' ? '//' : '/';\n    } else if (hack !== '_' &&\n               hack !== '*' &&\n               hack !== '$' &&\n               hack !== '#' &&\n               hack !== '+' &&\n               hack !== '&') {\n        hack = '';\n    }\n\n    const custom = isCustomProperty(name, hack.length);\n\n    // re-use result when possible (the same as for lower case)\n    if (!custom) {\n        name = name.toLowerCase();\n        if (properties.has(name)) {\n            const descriptor = properties.get(name);\n            properties.set(property, descriptor);\n            return descriptor;\n        }\n    }\n\n    const vendor = !custom ? getVendorPrefix(name, hack.length) : '';\n    const prefix = name.substr(0, hack.length + vendor.length);\n    const descriptor = Object.freeze({\n        basename: name.substr(prefix.length),\n        name: name.substr(hack.length),\n        hack,\n        vendor,\n        prefix,\n        custom\n    });\n\n    properties.set(property, descriptor);\n\n    return descriptor;\n}\n","// https://drafts.csswg.org/css-cascade-5/\nexport const cssWideKeywords = [\n    'initial',\n    'inherit',\n    'unset',\n    'revert',\n    'revert-layer'\n];\n","import {\n    isDigit,\n    cmpChar,\n    Delim,\n    WhiteSpace,\n    Comment,\n    Ident,\n    Number as NumberToken,\n    Dimension\n} from '../tokenizer/index.js';\n\nconst PLUSSIGN = 0x002B;    // U+002B PLUS SIGN (+)\nconst HYPHENMINUS = 0x002D; // U+002D HYPHEN-MINUS (-)\nconst N = 0x006E;           // U+006E LATIN SMALL LETTER N (n)\nconst DISALLOW_SIGN = true;\nconst ALLOW_SIGN = false;\n\nfunction isDelim(token, code) {\n    return token !== null && token.type === Delim && token.value.charCodeAt(0) === code;\n}\n\nfunction skipSC(token, offset, getNextToken) {\n    while (token !== null && (token.type === WhiteSpace || token.type === Comment)) {\n        token = getNextToken(++offset);\n    }\n\n    return offset;\n}\n\nfunction checkInteger(token, valueOffset, disallowSign, offset) {\n    if (!token) {\n        return 0;\n    }\n\n    const code = token.value.charCodeAt(valueOffset);\n\n    if (code === PLUSSIGN || code === HYPHENMINUS) {\n        if (disallowSign) {\n            // Number sign is not allowed\n            return 0;\n        }\n        valueOffset++;\n    }\n\n    for (; valueOffset < token.value.length; valueOffset++) {\n        if (!isDigit(token.value.charCodeAt(valueOffset))) {\n            // Integer is expected\n            return 0;\n        }\n    }\n\n    return offset + 1;\n}\n\n// ... <signed-integer>\n// ... ['+' | '-'] <signless-integer>\nfunction consumeB(token, offset_, getNextToken) {\n    let sign = false;\n    let offset = skipSC(token, offset_, getNextToken);\n\n    token = getNextToken(offset);\n\n    if (token === null) {\n        return offset_;\n    }\n\n    if (token.type !== NumberToken) {\n        if (isDelim(token, PLUSSIGN) || isDelim(token, HYPHENMINUS)) {\n            sign = true;\n            offset = skipSC(getNextToken(++offset), offset, getNextToken);\n            token = getNextToken(offset);\n\n            if (token === null || token.type !== NumberToken) {\n                return 0;\n            }\n        } else {\n            return offset_;\n        }\n    }\n\n    if (!sign) {\n        const code = token.value.charCodeAt(0);\n        if (code !== PLUSSIGN && code !== HYPHENMINUS) {\n            // Number sign is expected\n            return 0;\n        }\n    }\n\n    return checkInteger(token, sign ? 0 : 1, sign, offset);\n}\n\n// An+B microsyntax https://www.w3.org/TR/css-syntax-3/#anb\nexport default function anPlusB(token, getNextToken) {\n    /* eslint-disable brace-style*/\n    let offset = 0;\n\n    if (!token) {\n        return 0;\n    }\n\n    // <integer>\n    if (token.type === NumberToken) {\n        return checkInteger(token, 0, ALLOW_SIGN, offset); // b\n    }\n\n    // -n\n    // -n <signed-integer>\n    // -n ['+' | '-'] <signless-integer>\n    // -n- <signless-integer>\n    // <dashndashdigit-ident>\n    else if (token.type === Ident && token.value.charCodeAt(0) === HYPHENMINUS) {\n        // expect 1st char is N\n        if (!cmpChar(token.value, 1, N)) {\n            return 0;\n        }\n\n        switch (token.value.length) {\n            // -n\n            // -n <signed-integer>\n            // -n ['+' | '-'] <signless-integer>\n            case 2:\n                return consumeB(getNextToken(++offset), offset, getNextToken);\n\n            // -n- <signless-integer>\n            case 3:\n                if (token.value.charCodeAt(2) !== HYPHENMINUS) {\n                    return 0;\n                }\n\n                offset = skipSC(getNextToken(++offset), offset, getNextToken);\n                token = getNextToken(offset);\n\n                return checkInteger(token, 0, DISALLOW_SIGN, offset);\n\n            // <dashndashdigit-ident>\n            default:\n                if (token.value.charCodeAt(2) !== HYPHENMINUS) {\n                    return 0;\n                }\n\n                return checkInteger(token, 3, DISALLOW_SIGN, offset);\n        }\n    }\n\n    // '+'? n\n    // '+'? n <signed-integer>\n    // '+'? n ['+' | '-'] <signless-integer>\n    // '+'? n- <signless-integer>\n    // '+'? <ndashdigit-ident>\n    else if (token.type === Ident || (isDelim(token, PLUSSIGN) && getNextToken(offset + 1).type === Ident)) {\n        // just ignore a plus\n        if (token.type !== Ident) {\n            token = getNextToken(++offset);\n        }\n\n        if (token === null || !cmpChar(token.value, 0, N)) {\n            return 0;\n        }\n\n        switch (token.value.length) {\n            // '+'? n\n            // '+'? n <signed-integer>\n            // '+'? n ['+' | '-'] <signless-integer>\n            case 1:\n                return consumeB(getNextToken(++offset), offset, getNextToken);\n\n            // '+'? n- <signless-integer>\n            case 2:\n                if (token.value.charCodeAt(1) !== HYPHENMINUS) {\n                    return 0;\n                }\n\n                offset = skipSC(getNextToken(++offset), offset, getNextToken);\n                token = getNextToken(offset);\n\n                return checkInteger(token, 0, DISALLOW_SIGN, offset);\n\n            // '+'? <ndashdigit-ident>\n            default:\n                if (token.value.charCodeAt(1) !== HYPHENMINUS) {\n                    return 0;\n                }\n\n                return checkInteger(token, 2, DISALLOW_SIGN, offset);\n        }\n    }\n\n    // <ndashdigit-dimension>\n    // <ndash-dimension> <signless-integer>\n    // <n-dimension>\n    // <n-dimension> <signed-integer>\n    // <n-dimension> ['+' | '-'] <signless-integer>\n    else if (token.type === Dimension) {\n        let code = token.value.charCodeAt(0);\n        let sign = code === PLUSSIGN || code === HYPHENMINUS ? 1 : 0;\n        let i = sign;\n\n        for (; i < token.value.length; i++) {\n            if (!isDigit(token.value.charCodeAt(i))) {\n                break;\n            }\n        }\n\n        if (i === sign) {\n            // Integer is expected\n            return 0;\n        }\n\n        if (!cmpChar(token.value, i, N)) {\n            return 0;\n        }\n\n        // <n-dimension>\n        // <n-dimension> <signed-integer>\n        // <n-dimension> ['+' | '-'] <signless-integer>\n        if (i + 1 === token.value.length) {\n            return consumeB(getNextToken(++offset), offset, getNextToken);\n        } else {\n            if (token.value.charCodeAt(i + 1) !== HYPHENMINUS) {\n                return 0;\n            }\n\n            // <ndash-dimension> <signless-integer>\n            if (i + 2 === token.value.length) {\n                offset = skipSC(getNextToken(++offset), offset, getNextToken);\n                token = getNextToken(offset);\n\n                return checkInteger(token, 0, DISALLOW_SIGN, offset);\n            }\n            // <ndashdigit-dimension>\n            else {\n                return checkInteger(token, i + 2, DISALLOW_SIGN, offset);\n            }\n        }\n    }\n\n    return 0;\n};\n","import {\n    isHexDigit,\n    cmpChar,\n    Ident,\n    Delim,\n    Number as NumberToken,\n    Dimension\n} from '../tokenizer/index.js';\n\nconst PLUSSIGN = 0x002B;     // U+002B PLUS SIGN (+)\nconst HYPHENMINUS = 0x002D;  // U+002D HYPHEN-MINUS (-)\nconst QUESTIONMARK = 0x003F; // U+003F QUESTION MARK (?)\nconst U = 0x0075;            // U+0075 LATIN SMALL LETTER U (u)\n\nfunction isDelim(token, code) {\n    return token !== null && token.type === Delim && token.value.charCodeAt(0) === code;\n}\n\nfunction startsWith(token, code) {\n    return token.value.charCodeAt(0) === code;\n}\n\nfunction hexSequence(token, offset, allowDash) {\n    let hexlen = 0;\n\n    for (let pos = offset; pos < token.value.length; pos++) {\n        const code = token.value.charCodeAt(pos);\n\n        if (code === HYPHENMINUS && allowDash && hexlen !== 0) {\n            hexSequence(token, offset + hexlen + 1, false);\n            return 6; // dissallow following question marks\n        }\n\n        if (!isHexDigit(code)) {\n            return 0; // not a hex digit\n        }\n\n        if (++hexlen > 6) {\n            return 0; // too many hex digits\n        };\n    }\n\n    return hexlen;\n}\n\nfunction withQuestionMarkSequence(consumed, length, getNextToken) {\n    if (!consumed) {\n        return 0; // nothing consumed\n    }\n\n    while (isDelim(getNextToken(length), QUESTIONMARK)) {\n        if (++consumed > 6) {\n            return 0; // too many question marks\n        }\n\n        length++;\n    }\n\n    return length;\n}\n\n// https://drafts.csswg.org/css-syntax/#urange\n// Informally, the <urange> production has three forms:\n// U+0001\n//      Defines a range consisting of a single code point, in this case the code point \"1\".\n// U+0001-00ff\n//      Defines a range of codepoints between the first and the second value, in this case\n//      the range between \"1\" and \"ff\" (255 in decimal) inclusive.\n// U+00??\n//      Defines a range of codepoints where the \"?\" characters range over all hex digits,\n//      in this case defining the same as the value U+0000-00ff.\n// In each form, a maximum of 6 digits is allowed for each hexadecimal number (if you treat \"?\" as a hexadecimal digit).\n//\n// <urange> =\n//   u '+' <ident-token> '?'* |\n//   u <dimension-token> '?'* |\n//   u <number-token> '?'* |\n//   u <number-token> <dimension-token> |\n//   u <number-token> <number-token> |\n//   u '+' '?'+\nexport default function urange(token, getNextToken) {\n    let length = 0;\n\n    // should start with `u` or `U`\n    if (token === null || token.type !== Ident || !cmpChar(token.value, 0, U)) {\n        return 0;\n    }\n\n    token = getNextToken(++length);\n    if (token === null) {\n        return 0;\n    }\n\n    // u '+' <ident-token> '?'*\n    // u '+' '?'+\n    if (isDelim(token, PLUSSIGN)) {\n        token = getNextToken(++length);\n        if (token === null) {\n            return 0;\n        }\n\n        if (token.type === Ident) {\n            // u '+' <ident-token> '?'*\n            return withQuestionMarkSequence(hexSequence(token, 0, true), ++length, getNextToken);\n        }\n\n        if (isDelim(token, QUESTIONMARK)) {\n            // u '+' '?'+\n            return withQuestionMarkSequence(1, ++length, getNextToken);\n        }\n\n        // Hex digit or question mark is expected\n        return 0;\n    }\n\n    // u <number-token> '?'*\n    // u <number-token> <dimension-token>\n    // u <number-token> <number-token>\n    if (token.type === NumberToken) {\n        const consumedHexLength = hexSequence(token, 1, true);\n        if (consumedHexLength === 0) {\n            return 0;\n        }\n\n        token = getNextToken(++length);\n        if (token === null) {\n            // u <number-token> <eof>\n            return length;\n        }\n\n        if (token.type === Dimension || token.type === NumberToken) {\n            // u <number-token> <dimension-token>\n            // u <number-token> <number-token>\n            if (!startsWith(token, HYPHENMINUS) || !hexSequence(token, 1, false)) {\n                return 0;\n            }\n\n            return length + 1;\n        }\n\n        // u <number-token> '?'*\n        return withQuestionMarkSequence(consumedHexLength, length, getNextToken);\n    }\n\n    // u <dimension-token> '?'*\n    if (token.type === Dimension) {\n        return withQuestionMarkSequence(hexSequence(token, 1, true), ++length, getNextToken);\n    }\n\n    return 0;\n};\n","import { cssWideKeywords } from './generic-const.js';\nimport anPlusB from './generic-an-plus-b.js';\nimport urange from './generic-urange.js';\nimport {\n    isIdentifierStart,\n    isHexDigit,\n    isDigit,\n    cmpStr,\n    consumeNumber,\n\n    Ident,\n    Function as FunctionToken,\n    AtKeyword,\n    Hash,\n    String as StringToken,\n    BadString,\n    Url,\n    BadUrl,\n    Delim,\n    Number as NumberToken,\n    Percentage,\n    Dimension,\n    WhiteSpace,\n    CDO,\n    CDC,\n    Colon,\n    Semicolon,\n    Comma,\n    LeftSquareBracket,\n    RightSquareBracket,\n    LeftParenthesis,\n    RightParenthesis,\n    LeftCurlyBracket,\n    RightCurlyBracket\n} from '../tokenizer/index.js';\n\nconst calcFunctionNames = ['calc(', '-moz-calc(', '-webkit-calc('];\nconst balancePair = new Map([\n    [FunctionToken, RightParenthesis],\n    [LeftParenthesis, RightParenthesis],\n    [LeftSquareBracket, RightSquareBracket],\n    [LeftCurlyBracket, RightCurlyBracket]\n]);\n\n// safe char code getter\nfunction charCodeAt(str, index) {\n    return index < str.length ? str.charCodeAt(index) : 0;\n}\n\nfunction eqStr(actual, expected) {\n    return cmpStr(actual, 0, actual.length, expected);\n}\n\nfunction eqStrAny(actual, expected) {\n    for (let i = 0; i < expected.length; i++) {\n        if (eqStr(actual, expected[i])) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\n// IE postfix hack, i.e. 123\\0 or 123px\\9\nfunction isPostfixIeHack(str, offset) {\n    if (offset !== str.length - 2) {\n        return false;\n    }\n\n    return (\n        charCodeAt(str, offset) === 0x005C &&  // U+005C REVERSE SOLIDUS (\\)\n        isDigit(charCodeAt(str, offset + 1))\n    );\n}\n\nfunction outOfRange(opts, value, numEnd) {\n    if (opts && opts.type === 'Range') {\n        const num = Number(\n            numEnd !== undefined && numEnd !== value.length\n                ? value.substr(0, numEnd)\n                : value\n        );\n\n        if (isNaN(num)) {\n            return true;\n        }\n\n        // FIXME: when opts.min is a string it's a dimension, skip a range validation\n        // for now since it requires a type covertation which is not implmented yet\n        if (opts.min !== null && num < opts.min && typeof opts.min !== 'string') {\n            return true;\n        }\n\n        // FIXME: when opts.max is a string it's a dimension, skip a range validation\n        // for now since it requires a type covertation which is not implmented yet\n        if (opts.max !== null && num > opts.max && typeof opts.max !== 'string') {\n            return true;\n        }\n    }\n\n    return false;\n}\n\nfunction consumeFunction(token, getNextToken) {\n    let balanceCloseType = 0;\n    let balanceStash = [];\n    let length = 0;\n\n    // balanced token consuming\n    scan:\n    do {\n        switch (token.type) {\n            case RightCurlyBracket:\n            case RightParenthesis:\n            case RightSquareBracket:\n                if (token.type !== balanceCloseType) {\n                    break scan;\n                }\n\n                balanceCloseType = balanceStash.pop();\n\n                if (balanceStash.length === 0) {\n                    length++;\n                    break scan;\n                }\n\n                break;\n\n            case FunctionToken:\n            case LeftParenthesis:\n            case LeftSquareBracket:\n            case LeftCurlyBracket:\n                balanceStash.push(balanceCloseType);\n                balanceCloseType = balancePair.get(token.type);\n                break;\n        }\n\n        length++;\n    } while (token = getNextToken(length));\n\n    return length;\n}\n\n// TODO: implement\n// can be used wherever <length>, <frequency>, <angle>, <time>, <percentage>, <number>, or <integer> values are allowed\n// https://drafts.csswg.org/css-values/#calc-notation\nfunction calc(next) {\n    return function(token, getNextToken, opts) {\n        if (token === null) {\n            return 0;\n        }\n\n        if (token.type === FunctionToken && eqStrAny(token.value, calcFunctionNames)) {\n            return consumeFunction(token, getNextToken);\n        }\n\n        return next(token, getNextToken, opts);\n    };\n}\n\nfunction tokenType(expectedTokenType) {\n    return function(token) {\n        if (token === null || token.type !== expectedTokenType) {\n            return 0;\n        }\n\n        return 1;\n    };\n}\n\n// =========================\n// Complex types\n//\n\n// https://drafts.csswg.org/css-values-4/#custom-idents\n// 4.2. Author-defined Identifiers: the <custom-ident> type\n// Some properties accept arbitrary author-defined identifiers as a component value.\n// This generic data type is denoted by <custom-ident>, and represents any valid CSS identifier\n// that would not be misinterpreted as a pre-defined keyword in that property’s value definition.\n//\n// See also: https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident\nfunction customIdent(token) {\n    if (token === null || token.type !== Ident) {\n        return 0;\n    }\n\n    const name = token.value.toLowerCase();\n\n    // The CSS-wide keywords are not valid <custom-ident>s\n    if (eqStrAny(name, cssWideKeywords)) {\n        return 0;\n    }\n\n    // The default keyword is reserved and is also not a valid <custom-ident>\n    if (eqStr(name, 'default')) {\n        return 0;\n    }\n\n    // TODO: ignore property specific keywords (as described https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident)\n    // Specifications using <custom-ident> must specify clearly what other keywords\n    // are excluded from <custom-ident>, if any—for example by saying that any pre-defined keywords\n    // in that property’s value definition are excluded. Excluded keywords are excluded\n    // in all ASCII case permutations.\n\n    return 1;\n}\n\n// https://drafts.csswg.org/css-values-4/#dashed-idents\n// The <dashed-ident> production is a <custom-ident>, with all the case-sensitivity that implies,\n// with the additional restriction that it must start with two dashes (U+002D HYPHEN-MINUS).\nfunction dashedIdent(token) {\n    if (token === null || token.type !== Ident) {\n        return 0;\n    }\n\n    // ... must start with two dashes (U+002D HYPHEN-MINUS)\n    if (charCodeAt(token.value, 0) !== 0x002D || charCodeAt(token.value, 1) !== 0x002D) {\n        return 0;\n    }\n\n    return 1;\n}\n\n// https://drafts.csswg.org/css-variables/#typedef-custom-property-name\n// A custom property is any property whose name starts with two dashes (U+002D HYPHEN-MINUS), like --foo.\n// The <custom-property-name> production corresponds to this: it’s defined as any <dashed-ident>\n// (a valid identifier that starts with two dashes), except -- itself, which is reserved for future use by CSS.\nfunction customPropertyName(token) {\n    // ... it’s defined as any <dashed-ident>\n    if (!dashedIdent(token)) {\n        return 0;\n    }\n\n    // ... except -- itself, which is reserved for future use by CSS\n    if (token.value === '--') {\n        return 0;\n    }\n\n    return 1;\n}\n\n// https://drafts.csswg.org/css-color-4/#hex-notation\n// The syntax of a <hex-color> is a <hash-token> token whose value consists of 3, 4, 6, or 8 hexadecimal digits.\n// In other words, a hex color is written as a hash character, \"#\", followed by some number of digits 0-9 or\n// letters a-f (the case of the letters doesn’t matter - #00ff00 is identical to #00FF00).\nfunction hexColor(token) {\n    if (token === null || token.type !== Hash) {\n        return 0;\n    }\n\n    const length = token.value.length;\n\n    // valid values (length): #rgb (4), #rgba (5), #rrggbb (7), #rrggbbaa (9)\n    if (length !== 4 && length !== 5 && length !== 7 && length !== 9) {\n        return 0;\n    }\n\n    for (let i = 1; i < length; i++) {\n        if (!isHexDigit(charCodeAt(token.value, i))) {\n            return 0;\n        }\n    }\n\n    return 1;\n}\n\nfunction idSelector(token) {\n    if (token === null || token.type !== Hash) {\n        return 0;\n    }\n\n    if (!isIdentifierStart(charCodeAt(token.value, 1), charCodeAt(token.value, 2), charCodeAt(token.value, 3))) {\n        return 0;\n    }\n\n    return 1;\n}\n\n// https://drafts.csswg.org/css-syntax/#any-value\n// It represents the entirety of what a valid declaration can have as its value.\nfunction declarationValue(token, getNextToken) {\n    if (!token) {\n        return 0;\n    }\n\n    let balanceCloseType = 0;\n    let balanceStash = [];\n    let length = 0;\n\n    // The <declaration-value> production matches any sequence of one or more tokens,\n    // so long as the sequence does not contain ...\n    scan:\n    do {\n        switch (token.type) {\n            // ... <bad-string-token>, <bad-url-token>,\n            case BadString:\n            case BadUrl:\n                break scan;\n\n            // ... unmatched <)-token>, <]-token>, or <}-token>,\n            case RightCurlyBracket:\n            case RightParenthesis:\n            case RightSquareBracket:\n                if (token.type !== balanceCloseType) {\n                    break scan;\n                }\n\n                balanceCloseType = balanceStash.pop();\n                break;\n\n            // ... or top-level <semicolon-token> tokens\n            case Semicolon:\n                if (balanceCloseType === 0) {\n                    break scan;\n                }\n\n                break;\n\n            // ... or <delim-token> tokens with a value of \"!\"\n            case Delim:\n                if (balanceCloseType === 0 && token.value === '!') {\n                    break scan;\n                }\n\n                break;\n\n            case FunctionToken:\n            case LeftParenthesis:\n            case LeftSquareBracket:\n            case LeftCurlyBracket:\n                balanceStash.push(balanceCloseType);\n                balanceCloseType = balancePair.get(token.type);\n                break;\n        }\n\n        length++;\n    } while (token = getNextToken(length));\n\n    return length;\n}\n\n// https://drafts.csswg.org/css-syntax/#any-value\n// The <any-value> production is identical to <declaration-value>, but also\n// allows top-level <semicolon-token> tokens and <delim-token> tokens\n// with a value of \"!\". It represents the entirety of what valid CSS can be in any context.\nfunction anyValue(token, getNextToken) {\n    if (!token) {\n        return 0;\n    }\n\n    let balanceCloseType = 0;\n    let balanceStash = [];\n    let length = 0;\n\n    // The <any-value> production matches any sequence of one or more tokens,\n    // so long as the sequence ...\n    scan:\n    do {\n        switch (token.type) {\n            // ... does not contain <bad-string-token>, <bad-url-token>,\n            case BadString:\n            case BadUrl:\n                break scan;\n\n            // ... unmatched <)-token>, <]-token>, or <}-token>,\n            case RightCurlyBracket:\n            case RightParenthesis:\n            case RightSquareBracket:\n                if (token.type !== balanceCloseType) {\n                    break scan;\n                }\n\n                balanceCloseType = balanceStash.pop();\n                break;\n\n            case FunctionToken:\n            case LeftParenthesis:\n            case LeftSquareBracket:\n            case LeftCurlyBracket:\n                balanceStash.push(balanceCloseType);\n                balanceCloseType = balancePair.get(token.type);\n                break;\n        }\n\n        length++;\n    } while (token = getNextToken(length));\n\n    return length;\n}\n\n// =========================\n// Dimensions\n//\n\nfunction dimension(type) {\n    if (type) {\n        type = new Set(type);\n    }\n\n    return function(token, getNextToken, opts) {\n        if (token === null || token.type !== Dimension) {\n            return 0;\n        }\n\n        const numberEnd = consumeNumber(token.value, 0);\n\n        // check unit\n        if (type !== null) {\n            // check for IE postfix hack, i.e. 123px\\0 or 123px\\9\n            const reverseSolidusOffset = token.value.indexOf('\\\\', numberEnd);\n            const unit = reverseSolidusOffset === -1 || !isPostfixIeHack(token.value, reverseSolidusOffset)\n                ? token.value.substr(numberEnd)\n                : token.value.substring(numberEnd, reverseSolidusOffset);\n\n            if (type.has(unit.toLowerCase()) === false) {\n                return 0;\n            }\n        }\n\n        // check range if specified\n        if (outOfRange(opts, token.value, numberEnd)) {\n            return 0;\n        }\n\n        return 1;\n    };\n}\n\n// =========================\n// Percentage\n//\n\n// §5.5. Percentages: the <percentage> type\n// https://drafts.csswg.org/css-values-4/#percentages\nfunction percentage(token, getNextToken, opts) {\n    // ... corresponds to the <percentage-token> production\n    if (token === null || token.type !== Percentage) {\n        return 0;\n    }\n\n    // check range if specified\n    if (outOfRange(opts, token.value, token.value.length - 1)) {\n        return 0;\n    }\n\n    return 1;\n}\n\n// =========================\n// Numeric\n//\n\n// https://drafts.csswg.org/css-values-4/#numbers\n// The value <zero> represents a literal number with the value 0. Expressions that merely\n// evaluate to a <number> with the value 0 (for example, calc(0)) do not match <zero>;\n// only literal <number-token>s do.\nfunction zero(next) {\n    if (typeof next !== 'function') {\n        next = function() {\n            return 0;\n        };\n    }\n\n    return function(token, getNextToken, opts) {\n        if (token !== null && token.type === NumberToken) {\n            if (Number(token.value) === 0) {\n                return 1;\n            }\n        }\n\n        return next(token, getNextToken, opts);\n    };\n}\n\n// § 5.3. Real Numbers: the <number> type\n// https://drafts.csswg.org/css-values-4/#numbers\n// Number values are denoted by <number>, and represent real numbers, possibly with a fractional component.\n// ... It corresponds to the <number-token> production\nfunction number(token, getNextToken, opts) {\n    if (token === null) {\n        return 0;\n    }\n\n    const numberEnd = consumeNumber(token.value, 0);\n    const isNumber = numberEnd === token.value.length;\n    if (!isNumber && !isPostfixIeHack(token.value, numberEnd)) {\n        return 0;\n    }\n\n    // check range if specified\n    if (outOfRange(opts, token.value, numberEnd)) {\n        return 0;\n    }\n\n    return 1;\n}\n\n// §5.2. Integers: the <integer> type\n// https://drafts.csswg.org/css-values-4/#integers\nfunction integer(token, getNextToken, opts) {\n    // ... corresponds to a subset of the <number-token> production\n    if (token === null || token.type !== NumberToken) {\n        return 0;\n    }\n\n    // The first digit of an integer may be immediately preceded by `-` or `+` to indicate the integer’s sign.\n    let i = charCodeAt(token.value, 0) === 0x002B ||       // U+002B PLUS SIGN (+)\n            charCodeAt(token.value, 0) === 0x002D ? 1 : 0; // U+002D HYPHEN-MINUS (-)\n\n    // When written literally, an integer is one or more decimal digits 0 through 9 ...\n    for (; i < token.value.length; i++) {\n        if (!isDigit(charCodeAt(token.value, i))) {\n            return 0;\n        }\n    }\n\n    // check range if specified\n    if (outOfRange(opts, token.value, i)) {\n        return 0;\n    }\n\n    return 1;\n}\n\n// token types\nexport const tokenTypes = {\n    'ident-token': tokenType(Ident),\n    'function-token': tokenType(FunctionToken),\n    'at-keyword-token': tokenType(AtKeyword),\n    'hash-token': tokenType(Hash),\n    'string-token': tokenType(StringToken),\n    'bad-string-token': tokenType(BadString),\n    'url-token': tokenType(Url),\n    'bad-url-token': tokenType(BadUrl),\n    'delim-token': tokenType(Delim),\n    'number-token': tokenType(NumberToken),\n    'percentage-token': tokenType(Percentage),\n    'dimension-token': tokenType(Dimension),\n    'whitespace-token': tokenType(WhiteSpace),\n    'CDO-token': tokenType(CDO),\n    'CDC-token': tokenType(CDC),\n    'colon-token': tokenType(Colon),\n    'semicolon-token': tokenType(Semicolon),\n    'comma-token': tokenType(Comma),\n    '[-token': tokenType(LeftSquareBracket),\n    ']-token': tokenType(RightSquareBracket),\n    '(-token': tokenType(LeftParenthesis),\n    ')-token': tokenType(RightParenthesis),\n    '{-token': tokenType(LeftCurlyBracket),\n    '}-token': tokenType(RightCurlyBracket)\n};\n\n// token production types\nexport const productionTypes = {\n    // token type aliases\n    'string': tokenType(StringToken),\n    'ident': tokenType(Ident),\n\n    // percentage\n    'percentage': calc(percentage),\n\n    // numeric\n    'zero': zero(),\n    'number': calc(number),\n    'integer': calc(integer),\n\n    // complex types\n    'custom-ident': customIdent,\n    'dashed-ident': dashedIdent,\n    'custom-property-name': customPropertyName,\n    'hex-color': hexColor,\n    'id-selector': idSelector, // element( <id-selector> )\n    'an-plus-b': anPlusB,\n    'urange': urange,\n    'declaration-value': declarationValue,\n    'any-value': anyValue\n};\n\nexport const unitGroups = [\n    'length',\n    'angle',\n    'time',\n    'frequency',\n    'resolution',\n    'flex',\n    'decibel',\n    'semitones'\n];\n\n// dimensions types depend on units set\nexport function createDemensionTypes(units) {\n    const {\n        angle,\n        decibel,\n        frequency,\n        flex,\n        length,\n        resolution,\n        semitones,\n        time\n    } = units || {};\n\n    return {\n        'dimension': calc(dimension(null)),\n        'angle': calc(dimension(angle)),\n        'decibel': calc(dimension(decibel)),\n        'frequency': calc(dimension(frequency)),\n        'flex': calc(dimension(flex)),\n        'length': calc(zero(dimension(length))),\n        'resolution': calc(dimension(resolution)),\n        'semitones': calc(dimension(semitones)),\n        'time': calc(dimension(time))\n    };\n}\n\nexport function createGenericTypes(units) {\n    return {\n        ...tokenTypes,\n        ...productionTypes,\n        ...createDemensionTypes(units)\n    };\n};\n","export const length = [\n    // absolute length units https://www.w3.org/TR/css-values-3/#lengths\n    'cm', 'mm', 'q', 'in', 'pt', 'pc', 'px',\n    // font-relative length units https://drafts.csswg.org/css-values-4/#font-relative-lengths\n    'em', 'rem',\n    'ex', 'rex',\n    'cap', 'rcap',\n    'ch', 'rch',\n    'ic', 'ric',\n    'lh', 'rlh',\n    // viewport-percentage lengths https://drafts.csswg.org/css-values-4/#viewport-relative-lengths\n    'vw', 'svw', 'lvw', 'dvw',\n    'vh', 'svh', 'lvh', 'dvh',\n    'vi', 'svi', 'lvi', 'dvi',\n    'vb', 'svb', 'lvb', 'dvb',\n    'vmin', 'svmin', 'lvmin', 'dvmin',\n    'vmax', 'svmax', 'lvmax', 'dvmax',\n    // container relative lengths https://drafts.csswg.org/css-contain-3/#container-lengths\n    'cqw', 'cqh', 'cqi', 'cqb', 'cqmin', 'cqmax'\n];\nexport const angle = ['deg', 'grad', 'rad', 'turn'];    // https://www.w3.org/TR/css-values-3/#angles\nexport const time = ['s', 'ms'];                        // https://www.w3.org/TR/css-values-3/#time\nexport const frequency = ['hz', 'khz'];                 // https://www.w3.org/TR/css-values-3/#frequency\nexport const resolution = ['dpi', 'dpcm', 'dppx', 'x']; // https://www.w3.org/TR/css-values-3/#resolution\nexport const flex = ['fr'];                             // https://drafts.csswg.org/css-grid/#fr-unit\nexport const decibel = ['db'];                          // https://www.w3.org/TR/css3-speech/#mixing-props-voice-volume\nexport const semitones = ['st'];                        // https://www.w3.org/TR/css3-speech/#voice-props-voice-pitch\n","import { createCustomError } from '../utils/create-custom-error.js';\n\nexport function SyntaxError(message, input, offset) {\n    return Object.assign(createCustomError('SyntaxError', message), {\n        input,\n        offset,\n        rawMessage: message,\n        message: message + '\\n' +\n            '  ' + input + '\\n' +\n            '--' + new Array((offset || input.length) + 1).join('-') + '^'\n    });\n};\n","import { SyntaxError } from './SyntaxError.js';\n\nconst TAB = 9;\nconst N = 10;\nconst F = 12;\nconst R = 13;\nconst SPACE = 32;\nconst NAME_CHAR = new Uint8Array(128).map((_, idx) =>\n    /[a-zA-Z0-9\\-]/.test(String.fromCharCode(idx)) ? 1 : 0\n);\n\nexport class Scanner {\n    constructor(str) {\n        this.str = str;\n        this.pos = 0;\n    }\n\n    charCodeAt(pos) {\n        return pos < this.str.length ? this.str.charCodeAt(pos) : 0;\n    }\n    charCode() {\n        return this.charCodeAt(this.pos);\n    }\n    isNameCharCode(code = this.charCode()) {\n        return code < 128 && NAME_CHAR[code] === 1;\n    }\n    nextCharCode() {\n        return this.charCodeAt(this.pos + 1);\n    }\n    nextNonWsCode(pos) {\n        return this.charCodeAt(this.findWsEnd(pos));\n    }\n    skipWs() {\n        this.pos = this.findWsEnd(this.pos);\n    }\n    findWsEnd(pos) {\n        for (; pos < this.str.length; pos++) {\n            const code = this.str.charCodeAt(pos);\n            if (code !== R && code !== N && code !== F && code !== SPACE && code !== TAB) {\n                break;\n            }\n        }\n\n        return pos;\n    }\n    substringToPos(end) {\n        return this.str.substring(this.pos, this.pos = end);\n    }\n    eat(code) {\n        if (this.charCode() !== code) {\n            this.error('Expect `' + String.fromCharCode(code) + '`');\n        }\n\n        this.pos++;\n    }\n    peek() {\n        return this.pos < this.str.length ? this.str.charAt(this.pos++) : '';\n    }\n    error(message) {\n        throw new SyntaxError(message, this.str, this.pos);\n    }\n\n    scanSpaces() {\n        return this.substringToPos(this.findWsEnd(this.pos));\n    }\n    scanWord() {\n        let end = this.pos;\n\n        for (; end < this.str.length; end++) {\n            const code = this.str.charCodeAt(end);\n            if (code >= 128 || NAME_CHAR[code] === 0) {\n                break;\n            }\n        }\n\n        if (this.pos === end) {\n            this.error('Expect a keyword');\n        }\n\n        return this.substringToPos(end);\n    }\n    scanNumber() {\n        let end = this.pos;\n\n        for (; end < this.str.length; end++) {\n            const code = this.str.charCodeAt(end);\n\n            if (code < 48 || code > 57) {\n                break;\n            }\n        }\n\n        if (this.pos === end) {\n            this.error('Expect a number');\n        }\n\n        return this.substringToPos(end);\n    }\n    scanString() {\n        const end = this.str.indexOf('\\'', this.pos + 1);\n\n        if (end === -1) {\n            this.pos = this.str.length;\n            this.error('Expect an apostrophe');\n        }\n\n        return this.substringToPos(end + 1);\n    }\n};\n","import { Scanner } from './scanner.js';\n\nconst TAB = 9;\nconst N = 10;\nconst F = 12;\nconst R = 13;\nconst SPACE = 32;\nconst EXCLAMATIONMARK = 33;    // !\nconst NUMBERSIGN = 35;         // #\nconst AMPERSAND = 38;          // &\nconst APOSTROPHE = 39;         // '\nconst LEFTPARENTHESIS = 40;    // (\nconst RIGHTPARENTHESIS = 41;   // )\nconst ASTERISK = 42;           // *\nconst PLUSSIGN = 43;           // +\nconst COMMA = 44;              // ,\nconst HYPERMINUS = 45;         // -\nconst LESSTHANSIGN = 60;       // <\nconst GREATERTHANSIGN = 62;    // >\nconst QUESTIONMARK = 63;       // ?\nconst COMMERCIALAT = 64;       // @\nconst LEFTSQUAREBRACKET = 91;  // [\nconst RIGHTSQUAREBRACKET = 93; // ]\nconst LEFTCURLYBRACKET = 123;  // {\nconst VERTICALLINE = 124;      // |\nconst RIGHTCURLYBRACKET = 125; // }\nconst INFINITY = 8734;         // ∞\nconst COMBINATOR_PRECEDENCE = {\n    ' ': 1,\n    '&&': 2,\n    '||': 3,\n    '|': 4\n};\n\nfunction readMultiplierRange(scanner) {\n    let min = null;\n    let max = null;\n\n    scanner.eat(LEFTCURLYBRACKET);\n    scanner.skipWs();\n\n    min = scanner.scanNumber(scanner);\n    scanner.skipWs();\n\n    if (scanner.charCode() === COMMA) {\n        scanner.pos++;\n        scanner.skipWs();\n\n        if (scanner.charCode() !== RIGHTCURLYBRACKET) {\n            max = scanner.scanNumber(scanner);\n            scanner.skipWs();\n        }\n    } else {\n        max = min;\n    }\n\n    scanner.eat(RIGHTCURLYBRACKET);\n\n    return {\n        min: Number(min),\n        max: max ? Number(max) : 0\n    };\n}\n\nfunction readMultiplier(scanner) {\n    let range = null;\n    let comma = false;\n\n    switch (scanner.charCode()) {\n        case ASTERISK:\n            scanner.pos++;\n\n            range = {\n                min: 0,\n                max: 0\n            };\n\n            break;\n\n        case PLUSSIGN:\n            scanner.pos++;\n\n            range = {\n                min: 1,\n                max: 0\n            };\n\n            break;\n\n        case QUESTIONMARK:\n            scanner.pos++;\n\n            range = {\n                min: 0,\n                max: 1\n            };\n\n            break;\n\n        case NUMBERSIGN:\n            scanner.pos++;\n\n            comma = true;\n\n            if (scanner.charCode() === LEFTCURLYBRACKET) {\n                range = readMultiplierRange(scanner);\n            } else if (scanner.charCode() === QUESTIONMARK) {\n                // https://www.w3.org/TR/css-values-4/#component-multipliers\n                // > the # and ? multipliers may be stacked as #?\n                // In this case just treat \"#?\" as a single multiplier\n                // { min: 0, max: 0, comma: true }\n                scanner.pos++;\n                range = {\n                    min: 0,\n                    max: 0\n                };\n            } else {\n                range = {\n                    min: 1,\n                    max: 0\n                };\n            }\n\n            break;\n\n        case LEFTCURLYBRACKET:\n            range = readMultiplierRange(scanner);\n            break;\n\n        default:\n            return null;\n    }\n\n    return {\n        type: 'Multiplier',\n        comma,\n        min: range.min,\n        max: range.max,\n        term: null\n    };\n}\n\nfunction maybeMultiplied(scanner, node) {\n    const multiplier = readMultiplier(scanner);\n\n    if (multiplier !== null) {\n        multiplier.term = node;\n\n        // https://www.w3.org/TR/css-values-4/#component-multipliers\n        // > The + and # multipliers may be stacked as +#;\n        // Represent \"+#\" as nested multipliers:\n        // { ...<multiplier #>,\n        //   term: {\n        //     ...<multipler +>,\n        //     term: node\n        //   }\n        // }\n        if (scanner.charCode() === NUMBERSIGN &&\n            scanner.charCodeAt(scanner.pos - 1) === PLUSSIGN) {\n            return maybeMultiplied(scanner, multiplier);\n        }\n\n        return multiplier;\n    }\n\n    return node;\n}\n\nfunction maybeToken(scanner) {\n    const ch = scanner.peek();\n\n    if (ch === '') {\n        return null;\n    }\n\n    return maybeMultiplied(scanner, {\n        type: 'Token',\n        value: ch\n    });\n}\n\nfunction readProperty(scanner) {\n    let name;\n\n    scanner.eat(LESSTHANSIGN);\n    scanner.eat(APOSTROPHE);\n\n    name = scanner.scanWord();\n\n    scanner.eat(APOSTROPHE);\n    scanner.eat(GREATERTHANSIGN);\n\n    return maybeMultiplied(scanner, {\n        type: 'Property',\n        name\n    });\n}\n\n// https://drafts.csswg.org/css-values-3/#numeric-ranges\n// 4.1. Range Restrictions and Range Definition Notation\n//\n// Range restrictions can be annotated in the numeric type notation using CSS bracketed\n// range notation—[min,max]—within the angle brackets, after the identifying keyword,\n// indicating a closed range between (and including) min and max.\n// For example, <integer [0, 10]> indicates an integer between 0 and 10, inclusive.\nfunction readTypeRange(scanner) {\n    // use null for Infinity to make AST format JSON serializable/deserializable\n    let min = null; // -Infinity\n    let max = null; // Infinity\n    let sign = 1;\n\n    scanner.eat(LEFTSQUAREBRACKET);\n\n    if (scanner.charCode() === HYPERMINUS) {\n        scanner.peek();\n        sign = -1;\n    }\n\n    if (sign == -1 && scanner.charCode() === INFINITY) {\n        scanner.peek();\n    } else {\n        min = sign * Number(scanner.scanNumber(scanner));\n\n        if (scanner.isNameCharCode()) {\n            min += scanner.scanWord();\n        }\n    }\n\n    scanner.skipWs();\n    scanner.eat(COMMA);\n    scanner.skipWs();\n\n    if (scanner.charCode() === INFINITY) {\n        scanner.peek();\n    } else {\n        sign = 1;\n\n        if (scanner.charCode() === HYPERMINUS) {\n            scanner.peek();\n            sign = -1;\n        }\n\n        max = sign * Number(scanner.scanNumber(scanner));\n\n        if (scanner.isNameCharCode()) {\n            max += scanner.scanWord();\n        }\n    }\n\n    scanner.eat(RIGHTSQUAREBRACKET);\n\n    return {\n        type: 'Range',\n        min,\n        max\n    };\n}\n\nfunction readType(scanner) {\n    let name;\n    let opts = null;\n\n    scanner.eat(LESSTHANSIGN);\n    name = scanner.scanWord();\n\n    // https://drafts.csswg.org/css-values-5/#boolean\n    if (name === 'boolean-expr') {\n        scanner.eat(LEFTSQUAREBRACKET);\n\n        const implicitGroup = readImplicitGroup(scanner, RIGHTSQUAREBRACKET);\n\n        scanner.eat(RIGHTSQUAREBRACKET);\n        scanner.eat(GREATERTHANSIGN);\n\n        return maybeMultiplied(scanner, {\n            type: 'Boolean',\n            term: implicitGroup.terms.length === 1\n                ? implicitGroup.terms[0]\n                : implicitGroup\n        });\n    }\n\n    if (scanner.charCode() === LEFTPARENTHESIS &&\n        scanner.nextCharCode() === RIGHTPARENTHESIS) {\n        scanner.pos += 2;\n        name += '()';\n    }\n\n    if (scanner.charCodeAt(scanner.findWsEnd(scanner.pos)) === LEFTSQUAREBRACKET) {\n        scanner.skipWs();\n        opts = readTypeRange(scanner);\n    }\n\n    scanner.eat(GREATERTHANSIGN);\n\n    return maybeMultiplied(scanner, {\n        type: 'Type',\n        name,\n        opts\n    });\n}\n\nfunction readKeywordOrFunction(scanner) {\n    const name = scanner.scanWord();\n\n    if (scanner.charCode() === LEFTPARENTHESIS) {\n        scanner.pos++;\n\n        return {\n            type: 'Function',\n            name\n        };\n    }\n\n    return maybeMultiplied(scanner, {\n        type: 'Keyword',\n        name\n    });\n}\n\nfunction regroupTerms(terms, combinators) {\n    function createGroup(terms, combinator) {\n        return {\n            type: 'Group',\n            terms,\n            combinator,\n            disallowEmpty: false,\n            explicit: false\n        };\n    }\n\n    let combinator;\n\n    combinators = Object.keys(combinators)\n        .sort((a, b) => COMBINATOR_PRECEDENCE[a] - COMBINATOR_PRECEDENCE[b]);\n\n    while (combinators.length > 0) {\n        combinator = combinators.shift();\n\n        let i = 0;\n        let subgroupStart = 0;\n\n        for (; i < terms.length; i++) {\n            const term = terms[i];\n\n            if (term.type === 'Combinator') {\n                if (term.value === combinator) {\n                    if (subgroupStart === -1) {\n                        subgroupStart = i - 1;\n                    }\n                    terms.splice(i, 1);\n                    i--;\n                } else {\n                    if (subgroupStart !== -1 && i - subgroupStart > 1) {\n                        terms.splice(\n                            subgroupStart,\n                            i - subgroupStart,\n                            createGroup(terms.slice(subgroupStart, i), combinator)\n                        );\n                        i = subgroupStart + 1;\n                    }\n                    subgroupStart = -1;\n                }\n            }\n        }\n\n        if (subgroupStart !== -1 && combinators.length) {\n            terms.splice(\n                subgroupStart,\n                i - subgroupStart,\n                createGroup(terms.slice(subgroupStart, i), combinator)\n            );\n        }\n    }\n\n    return combinator;\n}\n\nfunction readImplicitGroup(scanner, stopCharCode) {\n    const combinators = Object.create(null);\n    const terms = [];\n    let token;\n    let prevToken = null;\n    let prevTokenPos = scanner.pos;\n\n    while (scanner.charCode() !== stopCharCode && (token = peek(scanner, stopCharCode))) {\n        if (token.type !== 'Spaces') {\n            if (token.type === 'Combinator') {\n                // check for combinator in group beginning and double combinator sequence\n                if (prevToken === null || prevToken.type === 'Combinator') {\n                    scanner.pos = prevTokenPos;\n                    scanner.error('Unexpected combinator');\n                }\n\n                combinators[token.value] = true;\n            } else if (prevToken !== null && prevToken.type !== 'Combinator') {\n                combinators[' '] = true;  // a b\n                terms.push({\n                    type: 'Combinator',\n                    value: ' '\n                });\n            }\n\n            terms.push(token);\n            prevToken = token;\n            prevTokenPos = scanner.pos;\n        }\n    }\n\n    // check for combinator in group ending\n    if (prevToken !== null && prevToken.type === 'Combinator') {\n        scanner.pos -= prevTokenPos;\n        scanner.error('Unexpected combinator');\n    }\n\n    return {\n        type: 'Group',\n        terms,\n        combinator: regroupTerms(terms, combinators) || ' ',\n        disallowEmpty: false,\n        explicit: false\n    };\n}\n\nfunction readGroup(scanner, stopCharCode) {\n    let result;\n\n    scanner.eat(LEFTSQUAREBRACKET);\n    result = readImplicitGroup(scanner, stopCharCode);\n    scanner.eat(RIGHTSQUAREBRACKET);\n\n    result.explicit = true;\n\n    if (scanner.charCode() === EXCLAMATIONMARK) {\n        scanner.pos++;\n        result.disallowEmpty = true;\n    }\n\n    return result;\n}\n\nfunction peek(scanner, stopCharCode) {\n    let code = scanner.charCode();\n\n    switch (code) {\n        case RIGHTSQUAREBRACKET:\n            // don't eat, stop scan a group\n            break;\n\n        case LEFTSQUAREBRACKET:\n            return maybeMultiplied(scanner, readGroup(scanner, stopCharCode));\n\n        case LESSTHANSIGN:\n            return scanner.nextCharCode() === APOSTROPHE\n                ? readProperty(scanner)\n                : readType(scanner);\n\n        case VERTICALLINE:\n            return {\n                type: 'Combinator',\n                value: scanner.substringToPos(\n                    scanner.pos + (scanner.nextCharCode() === VERTICALLINE ? 2 : 1)\n                )\n            };\n\n        case AMPERSAND:\n            scanner.pos++;\n            scanner.eat(AMPERSAND);\n\n            return {\n                type: 'Combinator',\n                value: '&&'\n            };\n\n        case COMMA:\n            scanner.pos++;\n            return {\n                type: 'Comma'\n            };\n\n        case APOSTROPHE:\n            return maybeMultiplied(scanner, {\n                type: 'String',\n                value: scanner.scanString()\n            });\n\n        case SPACE:\n        case TAB:\n        case N:\n        case R:\n        case F:\n            return {\n                type: 'Spaces',\n                value: scanner.scanSpaces()\n            };\n\n        case COMMERCIALAT:\n            code = scanner.nextCharCode();\n\n            if (scanner.isNameCharCode(code)) {\n                scanner.pos++;\n                return {\n                    type: 'AtKeyword',\n                    name: scanner.scanWord()\n                };\n            }\n\n            return maybeToken(scanner);\n\n        case ASTERISK:\n        case PLUSSIGN:\n        case QUESTIONMARK:\n        case NUMBERSIGN:\n        case EXCLAMATIONMARK:\n            // prohibited tokens (used as a multiplier start)\n            break;\n\n        case LEFTCURLYBRACKET:\n            // LEFTCURLYBRACKET is allowed since mdn/data uses it w/o quoting\n            // check next char isn't a number, because it's likely a disjoined multiplier\n            code = scanner.nextCharCode();\n\n            if (code < 48 || code > 57) {\n                return maybeToken(scanner);\n            }\n\n            break;\n\n        default:\n            if (scanner.isNameCharCode(code)) {\n                return readKeywordOrFunction(scanner);\n            }\n\n            return maybeToken(scanner);\n    }\n}\n\nexport function parse(source) {\n    const scanner = new Scanner(source);\n    const result = readImplicitGroup(scanner);\n\n    if (scanner.pos !== source.length) {\n        scanner.error('Unexpected input');\n    }\n\n    // reduce redundant groups with single group term\n    if (result.terms.length === 1 && result.terms[0].type === 'Group') {\n        return result.terms[0];\n    }\n\n    return result;\n};\n","const noop = function() {};\n\nfunction ensureFunction(value) {\n    return typeof value === 'function' ? value : noop;\n}\n\nexport function walk(node, options, context) {\n    function walk(node) {\n        enter.call(context, node);\n\n        switch (node.type) {\n            case 'Group':\n                node.terms.forEach(walk);\n                break;\n\n            case 'Multiplier':\n            case 'Boolean':\n                walk(node.term);\n                break;\n\n            case 'Type':\n            case 'Property':\n            case 'Keyword':\n            case 'AtKeyword':\n            case 'Function':\n            case 'String':\n            case 'Token':\n            case 'Comma':\n                break;\n\n            default:\n                throw new Error('Unknown type: ' + node.type);\n        }\n\n        leave.call(context, node);\n    }\n\n    let enter = noop;\n    let leave = noop;\n\n    if (typeof options === 'function') {\n        enter = options;\n    } else if (options) {\n        enter = ensureFunction(options.enter);\n        leave = ensureFunction(options.leave);\n    }\n\n    if (enter === noop && leave === noop) {\n        throw new Error('Neither `enter` nor `leave` walker handler is set or both aren\\'t a function');\n    }\n\n    walk(node, context);\n};\n","import { tokenize } from '../tokenizer/index.js';\n\nconst astToTokens = {\n    decorator(handlers) {\n        const tokens = [];\n        let curNode = null;\n\n        return {\n            ...handlers,\n            node(node) {\n                const tmp = curNode;\n                curNode = node;\n                handlers.node.call(this, node);\n                curNode = tmp;\n            },\n            emit(value, type, auto) {\n                tokens.push({\n                    type,\n                    value,\n                    node: auto ? null : curNode\n                });\n            },\n            result() {\n                return tokens;\n            }\n        };\n    }\n};\n\nfunction stringToTokens(str) {\n    const tokens = [];\n\n    tokenize(str, (type, start, end) =>\n        tokens.push({\n            type,\n            value: str.slice(start, end),\n            node: null\n        })\n    );\n\n    return tokens;\n}\n\nexport default function(value, syntax) {\n    if (typeof value === 'string') {\n        return stringToTokens(value);\n    }\n\n    return syntax.generate(value, astToTokens);\n};\n","import { parse } from '../definition-syntax/parse.js';\n\nexport const MATCH = { type: 'Match' };\nexport const MISMATCH = { type: 'Mismatch' };\nexport const DISALLOW_EMPTY = { type: 'DisallowEmpty' };\n\nconst LEFTPARENTHESIS = 40;  // (\nconst RIGHTPARENTHESIS = 41; // )\n\nfunction createCondition(match, thenBranch, elseBranch) {\n    // reduce node count\n    if (thenBranch === MATCH && elseBranch === MISMATCH) {\n        return match;\n    }\n\n    if (match === MATCH && thenBranch === MATCH && elseBranch === MATCH) {\n        return match;\n    }\n\n    if (match.type === 'If' && match.else === MISMATCH && thenBranch === MATCH) {\n        thenBranch = match.then;\n        match = match.match;\n    }\n\n    return {\n        type: 'If',\n        match,\n        then: thenBranch,\n        else: elseBranch\n    };\n}\n\nfunction isFunctionType(name) {\n    return (\n        name.length > 2 &&\n        name.charCodeAt(name.length - 2) === LEFTPARENTHESIS &&\n        name.charCodeAt(name.length - 1) === RIGHTPARENTHESIS\n    );\n}\n\nfunction isEnumCapatible(term) {\n    return (\n        term.type === 'Keyword' ||\n        term.type === 'AtKeyword' ||\n        term.type === 'Function' ||\n        term.type === 'Type' && isFunctionType(term.name)\n    );\n}\n\nfunction groupNode(terms, combinator = ' ', explicit = false) {\n    return {\n        type: 'Group',\n        terms,\n        combinator,\n        disallowEmpty: false,\n        explicit\n    };\n}\n\nfunction replaceTypeInGraph(node, replacements, visited = new Set()) {\n    if (!visited.has(node)) {\n        visited.add(node);\n\n        switch (node.type) {\n            case 'If':\n                node.match = replaceTypeInGraph(node.match, replacements, visited);\n                node.then = replaceTypeInGraph(node.then, replacements, visited);\n                node.else = replaceTypeInGraph(node.else, replacements, visited);\n                break;\n\n            case 'Type':\n                return replacements[node.name] || node;\n        }\n    }\n\n    return node;\n}\n\nfunction buildGroupMatchGraph(combinator, terms, atLeastOneTermMatched) {\n    switch (combinator) {\n        case ' ': {\n            // Juxtaposing components means that all of them must occur, in the given order.\n            //\n            // a b c\n            // =\n            // match a\n            //   then match b\n            //     then match c\n            //       then MATCH\n            //       else MISMATCH\n            //     else MISMATCH\n            //   else MISMATCH\n            let result = MATCH;\n\n            for (let i = terms.length - 1; i >= 0; i--) {\n                const term = terms[i];\n\n                result = createCondition(\n                    term,\n                    result,\n                    MISMATCH\n                );\n            };\n\n            return result;\n        }\n\n        case '|': {\n            // A bar (|) separates two or more alternatives: exactly one of them must occur.\n            //\n            // a | b | c\n            // =\n            // match a\n            //   then MATCH\n            //   else match b\n            //     then MATCH\n            //     else match c\n            //       then MATCH\n            //       else MISMATCH\n\n            let result = MISMATCH;\n            let map = null;\n\n            for (let i = terms.length - 1; i >= 0; i--) {\n                let term = terms[i];\n\n                // reduce sequence of keywords into a Enum\n                if (isEnumCapatible(term)) {\n                    if (map === null && i > 0 && isEnumCapatible(terms[i - 1])) {\n                        map = Object.create(null);\n                        result = createCondition(\n                            {\n                                type: 'Enum',\n                                map\n                            },\n                            MATCH,\n                            result\n                        );\n                    }\n\n                    if (map !== null) {\n                        const key = (isFunctionType(term.name) ? term.name.slice(0, -1) : term.name).toLowerCase();\n                        if (key in map === false) {\n                            map[key] = term;\n                            continue;\n                        }\n                    }\n                }\n\n                map = null;\n\n                // create a new conditonal node\n                result = createCondition(\n                    term,\n                    MATCH,\n                    result\n                );\n            };\n\n            return result;\n        }\n\n        case '&&': {\n            // A double ampersand (&&) separates two or more components,\n            // all of which must occur, in any order.\n\n            // Use MatchOnce for groups with a large number of terms,\n            // since &&-groups produces at least N!-node trees\n            if (terms.length > 5) {\n                return {\n                    type: 'MatchOnce',\n                    terms,\n                    all: true\n                };\n            }\n\n            // Use a combination tree for groups with small number of terms\n            //\n            // a && b && c\n            // =\n            // match a\n            //   then [b && c]\n            //   else match b\n            //     then [a && c]\n            //     else match c\n            //       then [a && b]\n            //       else MISMATCH\n            //\n            // a && b\n            // =\n            // match a\n            //   then match b\n            //     then MATCH\n            //     else MISMATCH\n            //   else match b\n            //     then match a\n            //       then MATCH\n            //       else MISMATCH\n            //     else MISMATCH\n            let result = MISMATCH;\n\n            for (let i = terms.length - 1; i >= 0; i--) {\n                const term = terms[i];\n                let thenClause;\n\n                if (terms.length > 1) {\n                    thenClause = buildGroupMatchGraph(\n                        combinator,\n                        terms.filter(function(newGroupTerm) {\n                            return newGroupTerm !== term;\n                        }),\n                        false\n                    );\n                } else {\n                    thenClause = MATCH;\n                }\n\n                result = createCondition(\n                    term,\n                    thenClause,\n                    result\n                );\n            };\n\n            return result;\n        }\n\n        case '||': {\n            // A double bar (||) separates two or more options:\n            // one or more of them must occur, in any order.\n\n            // Use MatchOnce for groups with a large number of terms,\n            // since ||-groups produces at least N!-node trees\n            if (terms.length > 5) {\n                return {\n                    type: 'MatchOnce',\n                    terms,\n                    all: false\n                };\n            }\n\n            // Use a combination tree for groups with small number of terms\n            //\n            // a || b || c\n            // =\n            // match a\n            //   then [b || c]\n            //   else match b\n            //     then [a || c]\n            //     else match c\n            //       then [a || b]\n            //       else MISMATCH\n            //\n            // a || b\n            // =\n            // match a\n            //   then match b\n            //     then MATCH\n            //     else MATCH\n            //   else match b\n            //     then match a\n            //       then MATCH\n            //       else MATCH\n            //     else MISMATCH\n            let result = atLeastOneTermMatched ? MATCH : MISMATCH;\n\n            for (let i = terms.length - 1; i >= 0; i--) {\n                const term = terms[i];\n                let thenClause;\n\n                if (terms.length > 1) {\n                    thenClause = buildGroupMatchGraph(\n                        combinator,\n                        terms.filter(function(newGroupTerm) {\n                            return newGroupTerm !== term;\n                        }),\n                        true\n                    );\n                } else {\n                    thenClause = MATCH;\n                }\n\n                result = createCondition(\n                    term,\n                    thenClause,\n                    result\n                );\n            };\n\n            return result;\n        }\n    }\n}\n\nfunction buildMultiplierMatchGraph(node) {\n    let result = MATCH;\n    let matchTerm = buildMatchGraphInternal(node.term);\n\n    if (node.max === 0) {\n        // disable repeating of empty match to prevent infinite loop\n        matchTerm = createCondition(\n            matchTerm,\n            DISALLOW_EMPTY,\n            MISMATCH\n        );\n\n        // an occurrence count is not limited, make a cycle;\n        // to collect more terms on each following matching mismatch\n        result = createCondition(\n            matchTerm,\n            null, // will be a loop\n            MISMATCH\n        );\n\n        result.then = createCondition(\n            MATCH,\n            MATCH,\n            result // make a loop\n        );\n\n        if (node.comma) {\n            result.then.else = createCondition(\n                { type: 'Comma', syntax: node },\n                result,\n                MISMATCH\n            );\n        }\n    } else {\n        // create a match node chain for [min .. max] interval with optional matches\n        for (let i = node.min || 1; i <= node.max; i++) {\n            if (node.comma && result !== MATCH) {\n                result = createCondition(\n                    { type: 'Comma', syntax: node },\n                    result,\n                    MISMATCH\n                );\n            }\n\n            result = createCondition(\n                matchTerm,\n                createCondition(\n                    MATCH,\n                    MATCH,\n                    result\n                ),\n                MISMATCH\n            );\n        }\n    }\n\n    if (node.min === 0) {\n        // allow zero match\n        result = createCondition(\n            MATCH,\n            MATCH,\n            result\n        );\n    } else {\n        // create a match node chain to collect [0 ... min - 1] required matches\n        for (let i = 0; i < node.min - 1; i++) {\n            if (node.comma && result !== MATCH) {\n                result = createCondition(\n                    { type: 'Comma', syntax: node },\n                    result,\n                    MISMATCH\n                );\n            }\n\n            result = createCondition(\n                matchTerm,\n                result,\n                MISMATCH\n            );\n        }\n    }\n\n    return result;\n}\n\nfunction buildMatchGraphInternal(node) {\n    if (typeof node === 'function') {\n        return {\n            type: 'Generic',\n            fn: node\n        };\n    }\n\n    switch (node.type) {\n        case 'Group': {\n            let result = buildGroupMatchGraph(\n                node.combinator,\n                node.terms.map(buildMatchGraphInternal),\n                false\n            );\n\n            if (node.disallowEmpty) {\n                result = createCondition(\n                    result,\n                    DISALLOW_EMPTY,\n                    MISMATCH\n                );\n            }\n\n            return result;\n        }\n\n        case 'Multiplier':\n            return buildMultiplierMatchGraph(node);\n\n        // https://drafts.csswg.org/css-values-5/#boolean\n        case 'Boolean': {\n            const term = buildMatchGraphInternal(node.term);\n            // <boolean-expr[ <test> ]> = not <boolean-expr-group> | <boolean-expr-group> [ [ and <boolean-expr-group> ]* | [ or <boolean-expr-group> ]* ]\n            const matchNode = buildMatchGraphInternal(groupNode([\n                groupNode([\n                    { type: 'Keyword', name: 'not' },\n                    { type: 'Type', name: '!boolean-group' }\n                ]),\n                groupNode([\n                    { type: 'Type', name: '!boolean-group' },\n                    groupNode([\n                        { type: 'Multiplier', comma: false, min: 0, max: 0, term: groupNode([\n                            { type: 'Keyword', name: 'and' },\n                            { type: 'Type', name: '!boolean-group' }\n                        ]) },\n                        { type: 'Multiplier', comma: false, min: 0, max: 0, term: groupNode([\n                            { type: 'Keyword', name: 'or' },\n                            { type: 'Type', name: '!boolean-group' }\n                        ]) }\n                    ], '|')\n                ])\n            ], '|'));\n            // <boolean-expr-group> = <test> | ( <boolean-expr[ <test> ]> ) | <general-enclosed>\n            const booleanGroup = buildMatchGraphInternal(\n                groupNode([\n                    { type: 'Type', name: '!term' },\n                    groupNode([\n                        { type: 'Token', value: '(' },\n                        { type: 'Type', name: '!self' },\n                        { type: 'Token', value: ')' }\n                    ]),\n                    { type: 'Type', name: 'general-enclosed' }\n                ], '|')\n            );\n\n            replaceTypeInGraph(booleanGroup, { '!term': term, '!self': matchNode });\n            replaceTypeInGraph(matchNode, { '!boolean-group': booleanGroup });\n\n            return matchNode;\n        }\n\n        case 'Type':\n        case 'Property':\n            return {\n                type: node.type,\n                name: node.name,\n                syntax: node\n            };\n\n        case 'Keyword':\n            return {\n                type: node.type,\n                name: node.name.toLowerCase(),\n                syntax: node\n            };\n\n        case 'AtKeyword':\n            return {\n                type: node.type,\n                name: '@' + node.name.toLowerCase(),\n                syntax: node\n            };\n\n        case 'Function':\n            return {\n                type: node.type,\n                name: node.name.toLowerCase() + '(',\n                syntax: node\n            };\n\n        case 'String':\n            // convert a one char length String to a Token\n            if (node.value.length === 3) {\n                return {\n                    type: 'Token',\n                    value: node.value.charAt(1),\n                    syntax: node\n                };\n            }\n\n            // otherwise use it as is\n            return {\n                type: node.type,\n                value: node.value.substr(1, node.value.length - 2).replace(/\\\\'/g, '\\''),\n                syntax: node\n            };\n\n        case 'Token':\n            return {\n                type: node.type,\n                value: node.value,\n                syntax: node\n            };\n\n        case 'Comma':\n            return {\n                type: node.type,\n                syntax: node\n            };\n\n        default:\n            throw new Error('Unknown node type:', node.type);\n    }\n}\n\nexport function buildMatchGraph(syntaxTree, ref) {\n    if (typeof syntaxTree === 'string') {\n        syntaxTree = parse(syntaxTree);\n    }\n\n    return {\n        type: 'MatchGraph',\n        match: buildMatchGraphInternal(syntaxTree),\n        syntax: ref || null,\n        source: syntaxTree\n    };\n}\n","import { MATCH, MISMATCH, DISALLOW_EMPTY } from './match-graph.js';\nimport * as TYPE from '../tokenizer/types.js';\n\nconst { hasOwnProperty } = Object.prototype;\nconst STUB = 0;\nconst TOKEN = 1;\nconst OPEN_SYNTAX = 2;\nconst CLOSE_SYNTAX = 3;\n\nconst EXIT_REASON_MATCH = 'Match';\nconst EXIT_REASON_MISMATCH = 'Mismatch';\nconst EXIT_REASON_ITERATION_LIMIT = 'Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)';\n\nconst ITERATION_LIMIT = 15000;\nexport let totalIterationCount = 0;\n\nfunction reverseList(list) {\n    let prev = null;\n    let next = null;\n    let item = list;\n\n    while (item !== null) {\n        next = item.prev;\n        item.prev = prev;\n        prev = item;\n        item = next;\n    }\n\n    return prev;\n}\n\nfunction areStringsEqualCaseInsensitive(testStr, referenceStr) {\n    if (testStr.length !== referenceStr.length) {\n        return false;\n    }\n\n    for (let i = 0; i < testStr.length; i++) {\n        const referenceCode = referenceStr.charCodeAt(i);\n        let testCode = testStr.charCodeAt(i);\n\n        // testCode.toLowerCase() for U+0041 LATIN CAPITAL LETTER A (A) .. U+005A LATIN CAPITAL LETTER Z (Z).\n        if (testCode >= 0x0041 && testCode <= 0x005A) {\n            testCode = testCode | 32;\n        }\n\n        if (testCode !== referenceCode) {\n            return false;\n        }\n    }\n\n    return true;\n}\n\nfunction isContextEdgeDelim(token) {\n    if (token.type !== TYPE.Delim) {\n        return false;\n    }\n\n    // Fix matching for unicode-range: U+30??, U+FF00-FF9F\n    // Probably we need to check out previous match instead\n    return token.value !== '?';\n}\n\nfunction isCommaContextStart(token) {\n    if (token === null) {\n        return true;\n    }\n\n    return (\n        token.type === TYPE.Comma ||\n        token.type === TYPE.Function ||\n        token.type === TYPE.LeftParenthesis ||\n        token.type === TYPE.LeftSquareBracket ||\n        token.type === TYPE.LeftCurlyBracket ||\n        isContextEdgeDelim(token)\n    );\n}\n\nfunction isCommaContextEnd(token) {\n    if (token === null) {\n        return true;\n    }\n\n    return (\n        token.type === TYPE.RightParenthesis ||\n        token.type === TYPE.RightSquareBracket ||\n        token.type === TYPE.RightCurlyBracket ||\n        (token.type === TYPE.Delim && token.value === '/')\n    );\n}\n\nfunction internalMatch(tokens, state, syntaxes) {\n    function moveToNextToken() {\n        do {\n            tokenIndex++;\n            token = tokenIndex < tokens.length ? tokens[tokenIndex] : null;\n        } while (token !== null && (token.type === TYPE.WhiteSpace || token.type === TYPE.Comment));\n    }\n\n    function getNextToken(offset) {\n        const nextIndex = tokenIndex + offset;\n\n        return nextIndex < tokens.length ? tokens[nextIndex] : null;\n    }\n\n    function stateSnapshotFromSyntax(nextState, prev) {\n        return {\n            nextState,\n            matchStack,\n            syntaxStack,\n            thenStack,\n            tokenIndex,\n            prev\n        };\n    }\n\n    function pushThenStack(nextState) {\n        thenStack = {\n            nextState,\n            matchStack,\n            syntaxStack,\n            prev: thenStack\n        };\n    }\n\n    function pushElseStack(nextState) {\n        elseStack = stateSnapshotFromSyntax(nextState, elseStack);\n    }\n\n    function addTokenToMatch() {\n        matchStack = {\n            type: TOKEN,\n            syntax: state.syntax,\n            token,\n            prev: matchStack\n        };\n\n        moveToNextToken();\n        syntaxStash = null;\n\n        if (tokenIndex > longestMatch) {\n            longestMatch = tokenIndex;\n        }\n    }\n\n    function openSyntax() {\n        syntaxStack = {\n            syntax: state.syntax,\n            opts: state.syntax.opts || (syntaxStack !== null && syntaxStack.opts) || null,\n            prev: syntaxStack\n        };\n\n        matchStack = {\n            type: OPEN_SYNTAX,\n            syntax: state.syntax,\n            token: matchStack.token,\n            prev: matchStack\n        };\n    }\n\n    function closeSyntax() {\n        if (matchStack.type === OPEN_SYNTAX) {\n            matchStack = matchStack.prev;\n        } else {\n            matchStack = {\n                type: CLOSE_SYNTAX,\n                syntax: syntaxStack.syntax,\n                token: matchStack.token,\n                prev: matchStack\n            };\n        }\n\n        syntaxStack = syntaxStack.prev;\n    }\n\n    let syntaxStack = null;\n    let thenStack = null;\n    let elseStack = null;\n\n    // null – stashing allowed, nothing stashed\n    // false – stashing disabled, nothing stashed\n    // anithing else – fail stashable syntaxes, some syntax stashed\n    let syntaxStash = null;\n\n    let iterationCount = 0; // count iterations and prevent infinite loop\n    let exitReason = null;\n\n    let token = null;\n    let tokenIndex = -1;\n    let longestMatch = 0;\n    let matchStack = {\n        type: STUB,\n        syntax: null,\n        token: null,\n        prev: null\n    };\n\n    moveToNextToken();\n\n    while (exitReason === null && ++iterationCount < ITERATION_LIMIT) {\n        // function mapList(list, fn) {\n        //     const result = [];\n        //     while (list) {\n        //         result.unshift(fn(list));\n        //         list = list.prev;\n        //     }\n        //     return result;\n        // }\n        // console.log('--\\n',\n        //     '#' + iterationCount,\n        //     require('util').inspect({\n        //         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),\n        //         token: token && token.value,\n        //         tokenIndex,\n        //         syntax: syntax.type + (syntax.id ? ' #' + syntax.id : '')\n        //     }, { depth: null })\n        // );\n        switch (state.type) {\n            case 'Match':\n                if (thenStack === null) {\n                    // turn to MISMATCH when some tokens left unmatched\n                    if (token !== null) {\n                        // doesn't mismatch if just one token left and it's an IE hack\n                        if (tokenIndex !== tokens.length - 1 || (token.value !== '\\\\0' && token.value !== '\\\\9')) {\n                            state = MISMATCH;\n                            break;\n                        }\n                    }\n\n                    // break the main loop, return a result - MATCH\n                    exitReason = EXIT_REASON_MATCH;\n                    break;\n                }\n\n                // go to next syntax (`then` branch)\n                state = thenStack.nextState;\n\n                // check match is not empty\n                if (state === DISALLOW_EMPTY) {\n                    if (thenStack.matchStack === matchStack) {\n                        state = MISMATCH;\n                        break;\n                    } else {\n                        state = MATCH;\n                    }\n                }\n\n                // close syntax if needed\n                while (thenStack.syntaxStack !== syntaxStack) {\n                    closeSyntax();\n                }\n\n                // pop stack\n                thenStack = thenStack.prev;\n                break;\n\n            case 'Mismatch':\n                // when some syntax is stashed\n                if (syntaxStash !== null && syntaxStash !== false) {\n                    // there is no else branches or a branch reduce match stack\n                    if (elseStack === null || tokenIndex > elseStack.tokenIndex) {\n                        // restore state from the stash\n                        elseStack = syntaxStash;\n                        syntaxStash = false; // disable stashing\n                    }\n                } else if (elseStack === null) {\n                    // no else branches -> break the main loop\n                    // return a result - MISMATCH\n                    exitReason = EXIT_REASON_MISMATCH;\n                    break;\n                }\n\n                // go to next syntax (`else` branch)\n                state = elseStack.nextState;\n\n                // restore all the rest stack states\n                thenStack = elseStack.thenStack;\n                syntaxStack = elseStack.syntaxStack;\n                matchStack = elseStack.matchStack;\n                tokenIndex = elseStack.tokenIndex;\n                token = tokenIndex < tokens.length ? tokens[tokenIndex] : null;\n\n                // pop stack\n                elseStack = elseStack.prev;\n                break;\n\n            case 'MatchGraph':\n                state = state.match;\n                break;\n\n            case 'If':\n                // IMPORTANT: else stack push must go first,\n                // since it stores the state of thenStack before changes\n                if (state.else !== MISMATCH) {\n                    pushElseStack(state.else);\n                }\n\n                if (state.then !== MATCH) {\n                    pushThenStack(state.then);\n                }\n\n                state = state.match;\n                break;\n\n            case 'MatchOnce':\n                state = {\n                    type: 'MatchOnceBuffer',\n                    syntax: state,\n                    index: 0,\n                    mask: 0\n                };\n                break;\n\n            case 'MatchOnceBuffer': {\n                const terms = state.syntax.terms;\n\n                if (state.index === terms.length) {\n                    // no matches at all or it's required all terms to be matched\n                    if (state.mask === 0 || state.syntax.all) {\n                        state = MISMATCH;\n                        break;\n                    }\n\n                    // a partial match is ok\n                    state = MATCH;\n                    break;\n                }\n\n                // all terms are matched\n                if (state.mask === (1 << terms.length) - 1) {\n                    state = MATCH;\n                    break;\n                }\n\n                for (; state.index < terms.length; state.index++) {\n                    const matchFlag = 1 << state.index;\n\n                    if ((state.mask & matchFlag) === 0) {\n                        // IMPORTANT: else stack push must go first,\n                        // since it stores the state of thenStack before changes\n                        pushElseStack(state);\n                        pushThenStack({\n                            type: 'AddMatchOnce',\n                            syntax: state.syntax,\n                            mask: state.mask | matchFlag\n                        });\n\n                        // match\n                        state = terms[state.index++];\n                        break;\n                    }\n                }\n                break;\n            }\n\n            case 'AddMatchOnce':\n                state = {\n                    type: 'MatchOnceBuffer',\n                    syntax: state.syntax,\n                    index: 0,\n                    mask: state.mask\n                };\n                break;\n\n            case 'Enum':\n                if (token !== null) {\n                    let name = token.value.toLowerCase();\n\n                    // drop \\0 and \\9 hack from keyword name\n                    if (name.indexOf('\\\\') !== -1) {\n                        name = name.replace(/\\\\[09].*$/, '');\n                    }\n\n                    if (hasOwnProperty.call(state.map, name)) {\n                        state = state.map[name];\n                        break;\n                    }\n                }\n\n                state = MISMATCH;\n                break;\n\n            case 'Generic': {\n                const opts = syntaxStack !== null ? syntaxStack.opts : null;\n                const lastTokenIndex = tokenIndex + Math.floor(state.fn(token, getNextToken, opts));\n\n                if (!isNaN(lastTokenIndex) && lastTokenIndex > tokenIndex) {\n                    while (tokenIndex < lastTokenIndex) {\n                        addTokenToMatch();\n                    }\n\n                    state = MATCH;\n                } else {\n                    state = MISMATCH;\n                }\n\n                break;\n            }\n\n            case 'Type':\n            case 'Property': {\n                const syntaxDict = state.type === 'Type' ? 'types' : 'properties';\n                const dictSyntax = hasOwnProperty.call(syntaxes, syntaxDict) ? syntaxes[syntaxDict][state.name] : null;\n\n                if (!dictSyntax || !dictSyntax.match) {\n                    throw new Error(\n                        'Bad syntax reference: ' +\n                        (state.type === 'Type'\n                            ? '<' + state.name + '>'\n                            : '<\\'' + state.name + '\\'>')\n                    );\n                }\n\n                // stash a syntax for types with low priority\n                if (syntaxStash !== false && token !== null && state.type === 'Type') {\n                    const lowPriorityMatching =\n                        // https://drafts.csswg.org/css-values-4/#custom-idents\n                        // When parsing positionally-ambiguous keywords in a property value, a <custom-ident> production\n                        // can only claim the keyword if no other unfulfilled production can claim it.\n                        (state.name === 'custom-ident' && token.type === TYPE.Ident) ||\n\n                        // https://drafts.csswg.org/css-values-4/#lengths\n                        // ... if a `0` could be parsed as either a <number> or a <length> in a property (such as line-height),\n                        // it must parse as a <number>\n                        (state.name === 'length' && token.value === '0');\n\n                    if (lowPriorityMatching) {\n                        if (syntaxStash === null) {\n                            syntaxStash = stateSnapshotFromSyntax(state, elseStack);\n                        }\n\n                        state = MISMATCH;\n                        break;\n                    }\n                }\n\n                openSyntax();\n                state = dictSyntax.matchRef || dictSyntax.match;\n                break;\n            }\n\n            case 'Keyword': {\n                const name = state.name;\n\n                if (token !== null) {\n                    let keywordName = token.value;\n\n                    // drop \\0 and \\9 hack from keyword name\n                    if (keywordName.indexOf('\\\\') !== -1) {\n                        keywordName = keywordName.replace(/\\\\[09].*$/, '');\n                    }\n\n                    if (areStringsEqualCaseInsensitive(keywordName, name)) {\n                        addTokenToMatch();\n                        state = MATCH;\n                        break;\n                    }\n                }\n\n                state = MISMATCH;\n                break;\n            }\n\n            case 'AtKeyword':\n            case 'Function':\n                if (token !== null && areStringsEqualCaseInsensitive(token.value, state.name)) {\n                    addTokenToMatch();\n                    state = MATCH;\n                    break;\n                }\n\n                state = MISMATCH;\n                break;\n\n            case 'Token':\n                if (token !== null && token.value === state.value) {\n                    addTokenToMatch();\n                    state = MATCH;\n                    break;\n                }\n\n                state = MISMATCH;\n                break;\n\n            case 'Comma':\n                if (token !== null && token.type === TYPE.Comma) {\n                    if (isCommaContextStart(matchStack.token)) {\n                        state = MISMATCH;\n                    } else {\n                        addTokenToMatch();\n                        state = isCommaContextEnd(token) ? MISMATCH : MATCH;\n                    }\n                } else {\n                    state = isCommaContextStart(matchStack.token) || isCommaContextEnd(token) ? MATCH : MISMATCH;\n                }\n\n                break;\n\n            case 'String':\n                let string = '';\n                let lastTokenIndex = tokenIndex;\n\n                for (; lastTokenIndex < tokens.length && string.length < state.value.length; lastTokenIndex++) {\n                    string += tokens[lastTokenIndex].value;\n                }\n\n                if (areStringsEqualCaseInsensitive(string, state.value)) {\n                    while (tokenIndex < lastTokenIndex) {\n                        addTokenToMatch();\n                    }\n\n                    state = MATCH;\n                } else {\n                    state = MISMATCH;\n                }\n\n                break;\n\n            default:\n                throw new Error('Unknown node type: ' + state.type);\n        }\n    }\n\n    totalIterationCount += iterationCount;\n\n    switch (exitReason) {\n        case null:\n            console.warn('[csstree-match] BREAK after ' + ITERATION_LIMIT + ' iterations');\n            exitReason = EXIT_REASON_ITERATION_LIMIT;\n            matchStack = null;\n            break;\n\n        case EXIT_REASON_MATCH:\n            while (syntaxStack !== null) {\n                closeSyntax();\n            }\n            break;\n\n        default:\n            matchStack = null;\n    }\n\n    return {\n        tokens,\n        reason: exitReason,\n        iterations: iterationCount,\n        match: matchStack,\n        longestMatch\n    };\n}\n\nexport function matchAsList(tokens, matchGraph, syntaxes) {\n    const matchResult = internalMatch(tokens, matchGraph, syntaxes || {});\n\n    if (matchResult.match !== null) {\n        let item = reverseList(matchResult.match).prev;\n\n        matchResult.match = [];\n\n        while (item !== null) {\n            switch (item.type) {\n                case OPEN_SYNTAX:\n                case CLOSE_SYNTAX:\n                    matchResult.match.push({\n                        type: item.type,\n                        syntax: item.syntax\n                    });\n                    break;\n\n                default:\n                    matchResult.match.push({\n                        token: item.token.value,\n                        node: item.token.node\n                    });\n                    break;\n            }\n\n            item = item.prev;\n        }\n    }\n\n    return matchResult;\n}\n\nexport function matchAsTree(tokens, matchGraph, syntaxes) {\n    const matchResult = internalMatch(tokens, matchGraph, syntaxes || {});\n\n    if (matchResult.match === null) {\n        return matchResult;\n    }\n\n    let item = matchResult.match;\n    let host = matchResult.match = {\n        syntax: matchGraph.syntax || null,\n        match: []\n    };\n    const hostStack = [host];\n\n    // revert a list and start with 2nd item since 1st is a stub item\n    item = reverseList(item).prev;\n\n    // build a tree\n    while (item !== null) {\n        switch (item.type) {\n            case OPEN_SYNTAX:\n                host.match.push(host = {\n                    syntax: item.syntax,\n                    match: []\n                });\n                hostStack.push(host);\n                break;\n\n            case CLOSE_SYNTAX:\n                hostStack.pop();\n                host = hostStack[hostStack.length - 1];\n                break;\n\n            default:\n                host.match.push({\n                    syntax: item.syntax || null,\n                    token: item.token.value,\n                    node: item.token.node\n                });\n        }\n\n        item = item.prev;\n    }\n\n    return matchResult;\n}\n","export function getTrace(node) {\n    function shouldPutToTrace(syntax) {\n        if (syntax === null) {\n            return false;\n        }\n\n        return (\n            syntax.type === 'Type' ||\n            syntax.type === 'Property' ||\n            syntax.type === 'Keyword'\n        );\n    }\n\n    function hasMatch(matchNode) {\n        if (Array.isArray(matchNode.match)) {\n            // use for-loop for better perfomance\n            for (let i = 0; i < matchNode.match.length; i++) {\n                if (hasMatch(matchNode.match[i])) {\n                    if (shouldPutToTrace(matchNode.syntax)) {\n                        result.unshift(matchNode.syntax);\n                    }\n\n                    return true;\n                }\n            }\n        } else if (matchNode.node === node) {\n            result = shouldPutToTrace(matchNode.syntax)\n                ? [matchNode.syntax]\n                : [];\n\n            return true;\n        }\n\n        return false;\n    }\n\n    let result = null;\n\n    if (this.matched !== null) {\n        hasMatch(this.matched);\n    }\n\n    return result;\n}\n\nexport function isType(node, type) {\n    return testNode(this, node, match => match.type === 'Type' && match.name === type);\n}\n\nexport function isProperty(node, property) {\n    return testNode(this, node, match => match.type === 'Property' && match.name === property);\n}\n\nexport function isKeyword(node) {\n    return testNode(this, node, match => match.type === 'Keyword');\n}\n\nfunction testNode(match, node, fn) {\n    const trace = getTrace.call(match, node);\n\n    if (trace === null) {\n        return false;\n    }\n\n    return trace.some(fn);\n}\n","import { List } from '../utils/List.js';\n\nfunction getFirstMatchNode(matchNode) {\n    if ('node' in matchNode) {\n        return matchNode.node;\n    }\n\n    return getFirstMatchNode(matchNode.match[0]);\n}\n\nfunction getLastMatchNode(matchNode) {\n    if ('node' in matchNode) {\n        return matchNode.node;\n    }\n\n    return getLastMatchNode(matchNode.match[matchNode.match.length - 1]);\n}\n\nexport function matchFragments(lexer, ast, match, type, name) {\n    function findFragments(matchNode) {\n        if (matchNode.syntax !== null &&\n            matchNode.syntax.type === type &&\n            matchNode.syntax.name === name) {\n            const start = getFirstMatchNode(matchNode);\n            const end = getLastMatchNode(matchNode);\n\n            lexer.syntax.walk(ast, function(node, item, list) {\n                if (node === start) {\n                    const nodes = new List();\n\n                    do {\n                        nodes.appendData(item.data);\n\n                        if (item.data === end) {\n                            break;\n                        }\n\n                        item = item.next;\n                    } while (item !== null);\n\n                    fragments.push({\n                        parent: list,\n                        nodes\n                    });\n                }\n            });\n        }\n\n        if (Array.isArray(matchNode.match)) {\n            matchNode.match.forEach(findFragments);\n        }\n    }\n\n    const fragments = [];\n\n    if (match.matched !== null) {\n        findFragments(match.matched);\n    }\n\n    return fragments;\n}\n","import { List } from '../utils/List.js';\n\nconst { hasOwnProperty } = Object.prototype;\n\nfunction isValidNumber(value) {\n    // Number.isInteger(value) && value >= 0\n    return (\n        typeof value === 'number' &&\n        isFinite(value) &&\n        Math.floor(value) === value &&\n        value >= 0\n    );\n}\n\nfunction isValidLocation(loc) {\n    return (\n        Boolean(loc) &&\n        isValidNumber(loc.offset) &&\n        isValidNumber(loc.line) &&\n        isValidNumber(loc.column)\n    );\n}\n\nfunction createNodeStructureChecker(type, fields) {\n    return function checkNode(node, warn) {\n        if (!node || node.constructor !== Object) {\n            return warn(node, 'Type of node should be an Object');\n        }\n\n        for (let key in node) {\n            let valid = true;\n\n            if (hasOwnProperty.call(node, key) === false) {\n                continue;\n            }\n\n            if (key === 'type') {\n                if (node.type !== type) {\n                    warn(node, 'Wrong node type `' + node.type + '`, expected `' + type + '`');\n                }\n            } else if (key === 'loc') {\n                if (node.loc === null) {\n                    continue;\n                } else if (node.loc && node.loc.constructor === Object) {\n                    if (typeof node.loc.source !== 'string') {\n                        key += '.source';\n                    } else if (!isValidLocation(node.loc.start)) {\n                        key += '.start';\n                    } else if (!isValidLocation(node.loc.end)) {\n                        key += '.end';\n                    } else {\n                        continue;\n                    }\n                }\n\n                valid = false;\n            } else if (fields.hasOwnProperty(key)) {\n                valid = false;\n\n                for (let i = 0; !valid && i < fields[key].length; i++) {\n                    const fieldType = fields[key][i];\n\n                    switch (fieldType) {\n                        case String:\n                            valid = typeof node[key] === 'string';\n                            break;\n\n                        case Boolean:\n                            valid = typeof node[key] === 'boolean';\n                            break;\n\n                        case null:\n                            valid = node[key] === null;\n                            break;\n\n                        default:\n                            if (typeof fieldType === 'string') {\n                                valid = node[key] && node[key].type === fieldType;\n                            } else if (Array.isArray(fieldType)) {\n                                valid = node[key] instanceof List;\n                            }\n                    }\n                }\n            } else {\n                warn(node, 'Unknown field `' + key + '` for ' + type + ' node type');\n            }\n\n            if (!valid) {\n                warn(node, 'Bad value for `' + type + '.' + key + '`');\n            }\n        }\n\n        for (const key in fields) {\n            if (hasOwnProperty.call(fields, key) &&\n                hasOwnProperty.call(node, key) === false) {\n                warn(node, 'Field `' + type + '.' + key + '` is missed');\n            }\n        }\n    };\n}\n\nfunction genTypesList(fieldTypes, path) {\n    const docsTypes = [];\n\n    for (let i = 0; i < fieldTypes.length; i++) {\n        const fieldType = fieldTypes[i];\n        if (fieldType === String || fieldType === Boolean) {\n            docsTypes.push(fieldType.name.toLowerCase());\n        } else if (fieldType === null) {\n            docsTypes.push('null');\n        } else if (typeof fieldType === 'string') {\n            docsTypes.push(fieldType);\n        } else if (Array.isArray(fieldType)) {\n            docsTypes.push('List<' + (genTypesList(fieldType, path) || 'any') + '>'); // TODO: use type enum\n        } else {\n            throw new Error('Wrong value `' + fieldType + '` in `' + path + '` structure definition');\n        }\n    }\n\n    return docsTypes.join(' | ');\n}\n\nfunction processStructure(name, nodeType) {\n    const structure = nodeType.structure;\n    const fields = {\n        type: String,\n        loc: true\n    };\n    const docs = {\n        type: '\"' + name + '\"'\n    };\n\n    for (const key in structure) {\n        if (hasOwnProperty.call(structure, key) === false) {\n            continue;\n        }\n\n        const fieldTypes = fields[key] = Array.isArray(structure[key])\n            ? structure[key].slice()\n            : [structure[key]];\n\n        docs[key] = genTypesList(fieldTypes, name + '.' + key);\n    }\n\n    return {\n        docs,\n        check: createNodeStructureChecker(name, fields)\n    };\n}\n\nexport function getStructureFromConfig(config) {\n    const structure = {};\n\n    if (config.node) {\n        for (const name in config.node) {\n            if (hasOwnProperty.call(config.node, name)) {\n                const nodeType = config.node[name];\n\n                if (nodeType.structure) {\n                    structure[name] = processStructure(name, nodeType);\n                } else {\n                    throw new Error('Missed `structure` field in `' + name + '` node type definition');\n                }\n            }\n        }\n    }\n\n    return structure;\n};\n","import { SyntaxReferenceError, SyntaxMatchError } from './error.js';\nimport * as names from '../utils/names.js';\nimport { cssWideKeywords } from './generic-const.js';\nimport { createGenericTypes } from './generic.js';\nimport * as units from './units.js';\nimport { parse, generate, walk } from '../definition-syntax/index.js';\nimport prepareTokens from './prepare-tokens.js';\nimport { buildMatchGraph } from './match-graph.js';\nimport { matchAsTree } from './match.js';\nimport * as trace from './trace.js';\nimport { matchFragments } from './search.js';\nimport { getStructureFromConfig } from './structure.js';\n\nfunction dumpMapSyntax(map, compact, syntaxAsAst) {\n    const result = {};\n\n    for (const name in map) {\n        if (map[name].syntax) {\n            result[name] = syntaxAsAst\n                ? map[name].syntax\n                : generate(map[name].syntax, { compact });\n        }\n    }\n\n    return result;\n}\n\nfunction dumpAtruleMapSyntax(map, compact, syntaxAsAst) {\n    const result = {};\n\n    for (const [name, atrule] of Object.entries(map)) {\n        result[name] = {\n            prelude: atrule.prelude && (\n                syntaxAsAst\n                    ? atrule.prelude.syntax\n                    : generate(atrule.prelude.syntax, { compact })\n            ),\n            descriptors: atrule.descriptors && dumpMapSyntax(atrule.descriptors, compact, syntaxAsAst)\n        };\n    }\n\n    return result;\n}\n\nfunction valueHasVar(tokens) {\n    for (let i = 0; i < tokens.length; i++) {\n        if (tokens[i].value.toLowerCase() === 'var(') {\n            return true;\n        }\n    }\n\n    return false;\n}\n\nfunction syntaxHasTopLevelCommaMultiplier(syntax) {\n    const singleTerm = syntax.terms[0];\n\n    return (\n        syntax.explicit === false &&\n        syntax.terms.length === 1 &&\n        singleTerm.type === 'Multiplier' &&\n        singleTerm.comma === true\n    );\n}\n\nfunction buildMatchResult(matched, error, iterations) {\n    return {\n        matched,\n        iterations,\n        error,\n        ...trace\n    };\n}\n\nfunction matchSyntax(lexer, syntax, value, useCssWideKeywords) {\n    const tokens = prepareTokens(value, lexer.syntax);\n    let result;\n\n    if (valueHasVar(tokens)) {\n        return buildMatchResult(null, new Error('Matching for a tree with var() is not supported'));\n    }\n\n    if (useCssWideKeywords) {\n        result = matchAsTree(tokens, lexer.cssWideKeywordsSyntax, lexer);\n    }\n\n    if (!useCssWideKeywords || !result.match) {\n        result = matchAsTree(tokens, syntax.match, lexer);\n        if (!result.match) {\n            return buildMatchResult(\n                null,\n                new SyntaxMatchError(result.reason, syntax.syntax, value, result),\n                result.iterations\n            );\n        }\n    }\n\n    return buildMatchResult(result.match, null, result.iterations);\n}\n\nexport class Lexer {\n    constructor(config, syntax, structure) {\n        this.cssWideKeywords = cssWideKeywords;\n        this.syntax = syntax;\n        this.generic = false;\n        this.units = { ...units };\n        this.atrules = Object.create(null);\n        this.properties = Object.create(null);\n        this.types = Object.create(null);\n        this.structure = structure || getStructureFromConfig(config);\n\n        if (config) {\n            if (config.cssWideKeywords) {\n                this.cssWideKeywords = config.cssWideKeywords;\n            }\n\n            if (config.units) {\n                for (const group of Object.keys(units)) {\n                    if (Array.isArray(config.units[group])) {\n                        this.units[group] = config.units[group];\n                    }\n                }\n            }\n\n            if (config.types) {\n                for (const [name, type] of Object.entries(config.types)) {\n                    this.addType_(name, type);\n                }\n            }\n\n            if (config.generic) {\n                this.generic = true;\n                for (const [name, value] of Object.entries(createGenericTypes(this.units))) {\n                    this.addType_(name, value);\n                }\n            }\n\n            if (config.atrules) {\n                for (const [name, atrule] of Object.entries(config.atrules)) {\n                    this.addAtrule_(name, atrule);\n                }\n            }\n\n            if (config.properties) {\n                for (const [name, property] of Object.entries(config.properties)) {\n                    this.addProperty_(name, property);\n                }\n            }\n        }\n\n        this.cssWideKeywordsSyntax = buildMatchGraph(this.cssWideKeywords.join(' |  '));\n    }\n\n    checkStructure(ast) {\n        function collectWarning(node, message) {\n            warns.push({ node, message });\n        }\n\n        const structure = this.structure;\n        const warns = [];\n\n        this.syntax.walk(ast, function(node) {\n            if (structure.hasOwnProperty(node.type)) {\n                structure[node.type].check(node, collectWarning);\n            } else {\n                collectWarning(node, 'Unknown node type `' + node.type + '`');\n            }\n        });\n\n        return warns.length ? warns : false;\n    }\n\n    createDescriptor(syntax, type, name, parent = null) {\n        const ref = {\n            type,\n            name\n        };\n        const descriptor = {\n            type,\n            name,\n            parent,\n            serializable: typeof syntax === 'string' || (syntax && typeof syntax.type === 'string'),\n            syntax: null,\n            match: null,\n            matchRef: null // used for properties when a syntax referenced as <'property'> in other syntax definitions\n        };\n\n        if (typeof syntax === 'function') {\n            descriptor.match = buildMatchGraph(syntax, ref);\n        } else {\n            if (typeof syntax === 'string') {\n                // lazy parsing on first access\n                Object.defineProperty(descriptor, 'syntax', {\n                    get() {\n                        Object.defineProperty(descriptor, 'syntax', {\n                            value: parse(syntax)\n                        });\n\n                        return descriptor.syntax;\n                    }\n                });\n            } else {\n                descriptor.syntax = syntax;\n            }\n\n            // lazy graph build on first access\n            Object.defineProperty(descriptor, 'match', {\n                get() {\n                    Object.defineProperty(descriptor, 'match', {\n                        value: buildMatchGraph(descriptor.syntax, ref)\n                    });\n\n                    return descriptor.match;\n                }\n            });\n\n            if (type === 'Property') {\n                Object.defineProperty(descriptor, 'matchRef', {\n                    get() {\n                        const syntax = descriptor.syntax;\n                        const value = syntaxHasTopLevelCommaMultiplier(syntax)\n                            ? buildMatchGraph({\n                                ...syntax,\n                                terms: [syntax.terms[0].term]\n                            }, ref)\n                            : null;\n\n                        Object.defineProperty(descriptor, 'matchRef', {\n                            value\n                        });\n\n                        return value;\n                    }\n                });\n            }\n        }\n\n        return descriptor;\n    }\n    addAtrule_(name, syntax) {\n        if (!syntax) {\n            return;\n        }\n\n        this.atrules[name] = {\n            type: 'Atrule',\n            name: name,\n            prelude: syntax.prelude ? this.createDescriptor(syntax.prelude, 'AtrulePrelude', name) : null,\n            descriptors: syntax.descriptors\n                ? Object.keys(syntax.descriptors).reduce(\n                    (map, descName) => {\n                        map[descName] = this.createDescriptor(syntax.descriptors[descName], 'AtruleDescriptor', descName, name);\n                        return map;\n                    },\n                    Object.create(null)\n                )\n                : null\n        };\n    }\n    addProperty_(name, syntax) {\n        if (!syntax) {\n            return;\n        }\n\n        this.properties[name] = this.createDescriptor(syntax, 'Property', name);\n    }\n    addType_(name, syntax) {\n        if (!syntax) {\n            return;\n        }\n\n        this.types[name] = this.createDescriptor(syntax, 'Type', name);\n    }\n\n    checkAtruleName(atruleName) {\n        if (!this.getAtrule(atruleName)) {\n            return new SyntaxReferenceError('Unknown at-rule', '@' + atruleName);\n        }\n    }\n    checkAtrulePrelude(atruleName, prelude) {\n        const error = this.checkAtruleName(atruleName);\n\n        if (error) {\n            return error;\n        }\n\n        const atrule = this.getAtrule(atruleName);\n\n        if (!atrule.prelude && prelude) {\n            return new SyntaxError('At-rule `@' + atruleName + '` should not contain a prelude');\n        }\n\n        if (atrule.prelude && !prelude) {\n            if (!matchSyntax(this, atrule.prelude, '', false).matched) {\n                return new SyntaxError('At-rule `@' + atruleName + '` should contain a prelude');\n            }\n        }\n    }\n    checkAtruleDescriptorName(atruleName, descriptorName) {\n        const error = this.checkAtruleName(atruleName);\n\n        if (error) {\n            return error;\n        }\n\n        const atrule = this.getAtrule(atruleName);\n        const descriptor = names.keyword(descriptorName);\n\n        if (!atrule.descriptors) {\n            return new SyntaxError('At-rule `@' + atruleName + '` has no known descriptors');\n        }\n\n        if (!atrule.descriptors[descriptor.name] &&\n            !atrule.descriptors[descriptor.basename]) {\n            return new SyntaxReferenceError('Unknown at-rule descriptor', descriptorName);\n        }\n    }\n    checkPropertyName(propertyName) {\n        if (!this.getProperty(propertyName)) {\n            return new SyntaxReferenceError('Unknown property', propertyName);\n        }\n    }\n\n    matchAtrulePrelude(atruleName, prelude) {\n        const error = this.checkAtrulePrelude(atruleName, prelude);\n\n        if (error) {\n            return buildMatchResult(null, error);\n        }\n\n        const atrule = this.getAtrule(atruleName);\n\n        if (!atrule.prelude) {\n            return buildMatchResult(null, null);\n        }\n\n        return matchSyntax(this, atrule.prelude, prelude || '', false);\n    }\n    matchAtruleDescriptor(atruleName, descriptorName, value) {\n        const error = this.checkAtruleDescriptorName(atruleName, descriptorName);\n\n        if (error) {\n            return buildMatchResult(null, error);\n        }\n\n        const atrule = this.getAtrule(atruleName);\n        const descriptor = names.keyword(descriptorName);\n\n        return matchSyntax(this, atrule.descriptors[descriptor.name] || atrule.descriptors[descriptor.basename], value, false);\n    }\n    matchDeclaration(node) {\n        if (node.type !== 'Declaration') {\n            return buildMatchResult(null, new Error('Not a Declaration node'));\n        }\n\n        return this.matchProperty(node.property, node.value);\n    }\n    matchProperty(propertyName, value) {\n        // don't match syntax for a custom property at the moment\n        if (names.property(propertyName).custom) {\n            return buildMatchResult(null, new Error('Lexer matching doesn\\'t applicable for custom properties'));\n        }\n\n        const error = this.checkPropertyName(propertyName);\n\n        if (error) {\n            return buildMatchResult(null, error);\n        }\n\n        return matchSyntax(this, this.getProperty(propertyName), value, true);\n    }\n    matchType(typeName, value) {\n        const typeSyntax = this.getType(typeName);\n\n        if (!typeSyntax) {\n            return buildMatchResult(null, new SyntaxReferenceError('Unknown type', typeName));\n        }\n\n        return matchSyntax(this, typeSyntax, value, false);\n    }\n    match(syntax, value) {\n        if (typeof syntax !== 'string' && (!syntax || !syntax.type)) {\n            return buildMatchResult(null, new SyntaxReferenceError('Bad syntax'));\n        }\n\n        if (typeof syntax === 'string' || !syntax.match) {\n            syntax = this.createDescriptor(syntax, 'Type', 'anonymous');\n        }\n\n        return matchSyntax(this, syntax, value, false);\n    }\n\n    findValueFragments(propertyName, value, type, name) {\n        return matchFragments(this, value, this.matchProperty(propertyName, value), type, name);\n    }\n    findDeclarationValueFragments(declaration, type, name) {\n        return matchFragments(this, declaration.value, this.matchDeclaration(declaration), type, name);\n    }\n    findAllFragments(ast, type, name) {\n        const result = [];\n\n        this.syntax.walk(ast, {\n            visit: 'Declaration',\n            enter: (declaration) => {\n                result.push.apply(result, this.findDeclarationValueFragments(declaration, type, name));\n            }\n        });\n\n        return result;\n    }\n\n    getAtrule(atruleName, fallbackBasename = true) {\n        const atrule = names.keyword(atruleName);\n        const atruleEntry = atrule.vendor && fallbackBasename\n            ? this.atrules[atrule.name] || this.atrules[atrule.basename]\n            : this.atrules[atrule.name];\n\n        return atruleEntry || null;\n    }\n    getAtrulePrelude(atruleName, fallbackBasename = true) {\n        const atrule = this.getAtrule(atruleName, fallbackBasename);\n\n        return atrule && atrule.prelude || null;\n    }\n    getAtruleDescriptor(atruleName, name) {\n        return this.atrules.hasOwnProperty(atruleName) && this.atrules.declarators\n            ? this.atrules[atruleName].declarators[name] || null\n            : null;\n    }\n    getProperty(propertyName, fallbackBasename = true) {\n        const property = names.property(propertyName);\n        const propertyEntry = property.vendor && fallbackBasename\n            ? this.properties[property.name] || this.properties[property.basename]\n            : this.properties[property.name];\n\n        return propertyEntry || null;\n    }\n    getType(name) {\n        return hasOwnProperty.call(this.types, name) ? this.types[name] : null;\n    }\n\n    validate() {\n        function syntaxRef(name, isType) {\n            return isType ? `<${name}>` : `<'${name}'>`;\n        }\n\n        function validate(syntax, name, broken, descriptor) {\n            if (broken.has(name)) {\n                return broken.get(name);\n            }\n\n            broken.set(name, false);\n            if (descriptor.syntax !== null) {\n                walk(descriptor.syntax, function(node) {\n                    if (node.type !== 'Type' && node.type !== 'Property') {\n                        return;\n                    }\n\n                    const map = node.type === 'Type' ? syntax.types : syntax.properties;\n                    const brokenMap = node.type === 'Type' ? brokenTypes : brokenProperties;\n\n                    if (!hasOwnProperty.call(map, node.name)) {\n                        errors.push(`${syntaxRef(name, broken === brokenTypes)} used missed syntax definition ${syntaxRef(node.name, node.type === 'Type')}`);\n                        broken.set(name, true);\n                    } else if (validate(syntax, node.name, brokenMap, map[node.name])) {\n                        errors.push(`${syntaxRef(name, broken === brokenTypes)} used broken syntax definition ${syntaxRef(node.name, node.type === 'Type')}`);\n                        broken.set(name, true);\n                    }\n                }, this);\n            }\n        }\n\n        const errors = [];\n        let brokenTypes = new Map();\n        let brokenProperties = new Map();\n\n        for (const key in this.types) {\n            validate(this, key, brokenTypes, this.types[key]);\n        }\n\n        for (const key in this.properties) {\n            validate(this, key, brokenProperties, this.properties[key]);\n        }\n\n        const brokenTypesArray = [...brokenTypes.keys()].filter(name => brokenTypes.get(name));\n        const brokenPropertiesArray = [...brokenProperties.keys()].filter(name => brokenProperties.get(name));\n\n        if (brokenTypesArray.length || brokenPropertiesArray.length) {\n            return {\n                errors,\n                types: brokenTypesArray,\n                properties: brokenPropertiesArray\n            };\n        }\n\n        return null;\n    }\n    dump(syntaxAsAst, pretty) {\n        return {\n            generic: this.generic,\n            cssWideKeywords: this.cssWideKeywords,\n            units: this.units,\n            types: dumpMapSyntax(this.types, !pretty, syntaxAsAst),\n            properties: dumpMapSyntax(this.properties, !pretty, syntaxAsAst),\n            atrules: dumpAtruleMapSyntax(this.atrules, !pretty, syntaxAsAst)\n        };\n    }\n    toString() {\n        return JSON.stringify(this.dump());\n    }\n};\n","function appendOrSet(a, b) {\n    if (typeof b === 'string' && /^\\s*\\|/.test(b)) {\n        return typeof a === 'string'\n            ? a + b\n            : b.replace(/^\\s*\\|\\s*/, '');\n    }\n\n    return b || null;\n}\n\nfunction sliceProps(obj, props) {\n    const result = Object.create(null);\n\n    for (const [key, value] of Object.entries(obj)) {\n        if (value) {\n            result[key] = {};\n            for (const prop of Object.keys(value)) {\n                if (props.includes(prop)) {\n                    result[key][prop] = value[prop];\n                }\n            }\n        }\n    }\n\n    return result;\n}\n\nexport default function mix(dest, src) {\n    const result = { ...dest };\n\n    for (const [prop, value] of Object.entries(src)) {\n        switch (prop) {\n            case 'generic':\n                result[prop] = Boolean(value);\n                break;\n\n            case 'cssWideKeywords':\n                result[prop] = dest[prop]\n                    ? [...dest[prop], ...value]\n                    : value || [];\n                break;\n\n            case 'units':\n                result[prop] = { ...dest[prop] };\n                for (const [name, patch] of Object.entries(value)) {\n                    result[prop][name] = Array.isArray(patch) ? patch : [];\n                }\n                break;\n\n            case 'atrules':\n                result[prop] = { ...dest[prop] };\n\n                for (const [name, atrule] of Object.entries(value)) {\n                    const exists = result[prop][name] || {};\n                    const current = result[prop][name] = {\n                        prelude: exists.prelude || null,\n                        descriptors: {\n                            ...exists.descriptors\n                        }\n                    };\n\n                    if (!atrule) {\n                        continue;\n                    }\n\n                    current.prelude = atrule.prelude\n                        ? appendOrSet(current.prelude, atrule.prelude)\n                        : current.prelude || null;\n\n                    for (const [descriptorName, descriptorValue] of Object.entries(atrule.descriptors || {})) {\n                        current.descriptors[descriptorName] = descriptorValue\n                            ? appendOrSet(current.descriptors[descriptorName], descriptorValue)\n                            : null;\n                    }\n\n                    if (!Object.keys(current.descriptors).length) {\n                        current.descriptors = null;\n                    }\n                }\n                break;\n\n            case 'types':\n            case 'properties':\n                result[prop] = { ...dest[prop] };\n                for (const [name, syntax] of Object.entries(value)) {\n                    result[prop][name] = appendOrSet(result[prop][name], syntax);\n                }\n                break;\n\n            case 'scope':\n            case 'features':\n                result[prop] = { ...dest[prop] };\n                for (const [name, props] of Object.entries(value)) {\n                    result[prop][name] = { ...result[prop][name], ...props };\n                }\n                break;\n\n            case 'parseContext':\n                result[prop] = {\n                    ...dest[prop],\n                    ...value\n                };\n                break;\n\n            case 'atrule':\n            case 'pseudo':\n                result[prop] = {\n                    ...dest[prop],\n                    ...sliceProps(value, ['parse'])\n                };\n                break;\n\n            case 'node':\n                result[prop] = {\n                    ...dest[prop],\n                    ...sliceProps(value, ['name', 'structure', 'parse', 'generate', 'walkContext'])\n                };\n                break;\n        }\n    }\n\n    return result;\n}\n","import { tokenize } from '../tokenizer/index.js';\nimport { createParser } from '../parser/create.js';\nimport { createGenerator } from '../generator/create.js';\nimport { createConvertor } from '../convertor/create.js';\nimport { createWalker } from '../walker/create.js';\nimport { Lexer } from '../lexer/Lexer.js';\nimport mix from './config/mix.js';\n\nfunction createSyntax(config) {\n    const parse = createParser(config);\n    const walk = createWalker(config);\n    const generate = createGenerator(config);\n    const { fromPlainObject, toPlainObject } = createConvertor(walk);\n\n    const syntax = {\n        lexer: null,\n        createLexer: config => new Lexer(config, syntax, syntax.lexer.structure),\n\n        tokenize,\n        parse,\n        generate,\n\n        walk,\n        find: walk.find,\n        findLast: walk.findLast,\n        findAll: walk.findAll,\n\n        fromPlainObject,\n        toPlainObject,\n\n        fork(extension) {\n            const base = mix({}, config); // copy of config\n\n            return createSyntax(\n                typeof extension === 'function'\n                    ? extension(base) // TODO: remove Object.assign as second parameter\n                    : mix(base, extension)\n            );\n        }\n    };\n\n    syntax.lexer = new Lexer({\n        generic: config.generic,\n        cssWideKeywords: config.cssWideKeywords,\n        units: config.units,\n        types: config.types,\n        atrules: config.atrules,\n        properties: config.properties,\n        node: config.node\n    }, syntax);\n\n    return syntax;\n};\n\nexport default config => createSyntax(mix({}, config));\n","import { createRequire } from 'module';\n\nconst require = createRequire(import.meta.url);\nconst patch = require('../data/patch.json');\n\nexport default patch;\n","import { createRequire } from 'module';\nimport patch from './data-patch.js';\n\nconst require = createRequire(import.meta.url);\nconst mdnAtrules = require('mdn-data/css/at-rules.json');\nconst mdnProperties = require('mdn-data/css/properties.json');\nconst mdnSyntaxes = require('mdn-data/css/syntaxes.json');\n\nconst hasOwn = Object.hasOwn || ((object, property) => Object.prototype.hasOwnProperty.call(object, property));\nconst extendSyntax = /^\\s*\\|\\s*/;\n\nfunction preprocessAtrules(dict) {\n    const result = Object.create(null);\n\n    for (const [atruleName, atrule] of Object.entries(dict)) {\n        let descriptors = null;\n\n        if (atrule.descriptors) {\n            descriptors = Object.create(null);\n\n            for (const [name, descriptor] of Object.entries(atrule.descriptors)) {\n                descriptors[name] = descriptor.syntax;\n            }\n        }\n\n        result[atruleName.substr(1)] = {\n            prelude: atrule.syntax.trim().replace(/\\{(.|\\s)+\\}/, '').match(/^@\\S+\\s+([^;\\{]*)/)[1].trim() || null,\n            descriptors\n        };\n    }\n\n    return result;\n}\n\nfunction patchDictionary(dict, patchDict) {\n    const result = Object.create(null);\n\n    // copy all syntaxes for an original dict\n    for (const [key, value] of Object.entries(dict)) {\n        if (value) {\n            result[key] = value.syntax || value;\n        }\n    }\n\n    // apply a patch\n    for (const key of Object.keys(patchDict)) {\n        if (hasOwn(dict, key)) {\n            if (patchDict[key].syntax) {\n                result[key] = extendSyntax.test(patchDict[key].syntax)\n                    ? result[key] + ' ' + patchDict[key].syntax.trim()\n                    : patchDict[key].syntax;\n            } else {\n                delete result[key];\n            }\n        } else {\n            if (patchDict[key].syntax) {\n                result[key] = patchDict[key].syntax.replace(extendSyntax, '');\n            }\n        }\n    }\n\n    return result;\n}\n\nfunction preprocessPatchAtrulesDescritors(declarations) {\n    const result = {};\n\n    for (const [key, value] of Object.entries(declarations || {})) {\n        result[key] = typeof value === 'string'\n            ? { syntax: value }\n            : value;\n    }\n\n    return result;\n}\n\nfunction patchAtrules(dict, patchDict) {\n    const result = {};\n\n    // copy all syntaxes for an original dict\n    for (const key in dict) {\n        if (patchDict[key] === null) {\n            continue;\n        }\n\n        const atrulePatch = patchDict[key] || {};\n\n        result[key] = {\n            prelude: key in patchDict && 'prelude' in atrulePatch\n                ? atrulePatch.prelude\n                : dict[key].prelude || null,\n            descriptors: patchDictionary(\n                dict[key].descriptors || {},\n                preprocessPatchAtrulesDescritors(atrulePatch.descriptors)\n            )\n        };\n    }\n\n    // apply a patch\n    for (const [key, atrulePatch] of Object.entries(patchDict)) {\n        if (atrulePatch && !hasOwn(dict, key)) {\n            result[key] = {\n                prelude: atrulePatch.prelude || null,\n                descriptors: atrulePatch.descriptors\n                    ? patchDictionary({}, preprocessPatchAtrulesDescritors(atrulePatch.descriptors))\n                    : null\n            };\n        }\n    }\n\n    return result;\n}\n\nexport default {\n    types: patchDictionary(mdnSyntaxes, patch.types),\n    atrules: patchAtrules(preprocessAtrules(mdnAtrules), patch.atrules),\n    properties: patchDictionary(mdnProperties, patch.properties)\n};\n","import {\n    isDigit,\n    WhiteSpace,\n    Comment,\n    Ident,\n    Number,\n    Dimension\n} from '../../tokenizer/index.js';\n\nconst PLUSSIGN = 0x002B;    // U+002B PLUS SIGN (+)\nconst HYPHENMINUS = 0x002D; // U+002D HYPHEN-MINUS (-)\nconst N = 0x006E;           // U+006E LATIN SMALL LETTER N (n)\nconst DISALLOW_SIGN = true;\nconst ALLOW_SIGN = false;\n\nfunction checkInteger(offset, disallowSign) {\n    let pos = this.tokenStart + offset;\n    const code = this.charCodeAt(pos);\n\n    if (code === PLUSSIGN || code === HYPHENMINUS) {\n        if (disallowSign) {\n            this.error('Number sign is not allowed');\n        }\n        pos++;\n    }\n\n    for (; pos < this.tokenEnd; pos++) {\n        if (!isDigit(this.charCodeAt(pos))) {\n            this.error('Integer is expected', pos);\n        }\n    }\n}\n\nfunction checkTokenIsInteger(disallowSign) {\n    return checkInteger.call(this, 0, disallowSign);\n}\n\nfunction expectCharCode(offset, code) {\n    if (!this.cmpChar(this.tokenStart + offset, code)) {\n        let msg = '';\n\n        switch (code) {\n            case N:\n                msg = 'N is expected';\n                break;\n            case HYPHENMINUS:\n                msg = 'HyphenMinus is expected';\n                break;\n        }\n\n        this.error(msg, this.tokenStart + offset);\n    }\n}\n\n// ... <signed-integer>\n// ... ['+' | '-'] <signless-integer>\nfunction consumeB() {\n    let offset = 0;\n    let sign = 0;\n    let type = this.tokenType;\n\n    while (type === WhiteSpace || type === Comment) {\n        type = this.lookupType(++offset);\n    }\n\n    if (type !== Number) {\n        if (this.isDelim(PLUSSIGN, offset) ||\n            this.isDelim(HYPHENMINUS, offset)) {\n            sign = this.isDelim(PLUSSIGN, offset) ? PLUSSIGN : HYPHENMINUS;\n\n            do {\n                type = this.lookupType(++offset);\n            } while (type === WhiteSpace || type === Comment);\n\n            if (type !== Number) {\n                this.skip(offset);\n                checkTokenIsInteger.call(this, DISALLOW_SIGN);\n            }\n        } else {\n            return null;\n        }\n    }\n\n    if (offset > 0) {\n        this.skip(offset);\n    }\n\n    if (sign === 0) {\n        type = this.charCodeAt(this.tokenStart);\n        if (type !== PLUSSIGN && type !== HYPHENMINUS) {\n            this.error('Number sign is expected');\n        }\n    }\n\n    checkTokenIsInteger.call(this, sign !== 0);\n    return sign === HYPHENMINUS ? '-' + this.consume(Number) : this.consume(Number);\n}\n\n// An+B microsyntax https://www.w3.org/TR/css-syntax-3/#anb\nexport const name = 'AnPlusB';\nexport const structure = {\n    a: [String, null],\n    b: [String, null]\n};\n\nexport function parse() {\n    /* eslint-disable brace-style*/\n    const start = this.tokenStart;\n    let a = null;\n    let b = null;\n\n    // <integer>\n    if (this.tokenType === Number) {\n        checkTokenIsInteger.call(this, ALLOW_SIGN);\n        b = this.consume(Number);\n    }\n\n    // -n\n    // -n <signed-integer>\n    // -n ['+' | '-'] <signless-integer>\n    // -n- <signless-integer>\n    // <dashndashdigit-ident>\n    else if (this.tokenType === Ident && this.cmpChar(this.tokenStart, HYPHENMINUS)) {\n        a = '-1';\n\n        expectCharCode.call(this, 1, N);\n\n        switch (this.tokenEnd - this.tokenStart) {\n            // -n\n            // -n <signed-integer>\n            // -n ['+' | '-'] <signless-integer>\n            case 2:\n                this.next();\n                b = consumeB.call(this);\n                break;\n\n            // -n- <signless-integer>\n            case 3:\n                expectCharCode.call(this, 2, HYPHENMINUS);\n\n                this.next();\n                this.skipSC();\n\n                checkTokenIsInteger.call(this, DISALLOW_SIGN);\n\n                b = '-' + this.consume(Number);\n                break;\n\n            // <dashndashdigit-ident>\n            default:\n                expectCharCode.call(this, 2, HYPHENMINUS);\n                checkInteger.call(this, 3, DISALLOW_SIGN);\n                this.next();\n\n                b = this.substrToCursor(start + 2);\n        }\n    }\n\n    // '+'? n\n    // '+'? n <signed-integer>\n    // '+'? n ['+' | '-'] <signless-integer>\n    // '+'? n- <signless-integer>\n    // '+'? <ndashdigit-ident>\n    else if (this.tokenType === Ident || (this.isDelim(PLUSSIGN) && this.lookupType(1) === Ident)) {\n        let sign = 0;\n        a = '1';\n\n        // just ignore a plus\n        if (this.isDelim(PLUSSIGN)) {\n            sign = 1;\n            this.next();\n        }\n\n        expectCharCode.call(this, 0, N);\n\n        switch (this.tokenEnd - this.tokenStart) {\n            // '+'? n\n            // '+'? n <signed-integer>\n            // '+'? n ['+' | '-'] <signless-integer>\n            case 1:\n                this.next();\n                b = consumeB.call(this);\n                break;\n\n            // '+'? n- <signless-integer>\n            case 2:\n                expectCharCode.call(this, 1, HYPHENMINUS);\n\n                this.next();\n                this.skipSC();\n\n                checkTokenIsInteger.call(this, DISALLOW_SIGN);\n\n                b = '-' + this.consume(Number);\n                break;\n\n            // '+'? <ndashdigit-ident>\n            default:\n                expectCharCode.call(this, 1, HYPHENMINUS);\n                checkInteger.call(this, 2, DISALLOW_SIGN);\n                this.next();\n\n                b = this.substrToCursor(start + sign + 1);\n        }\n    }\n\n    // <ndashdigit-dimension>\n    // <ndash-dimension> <signless-integer>\n    // <n-dimension>\n    // <n-dimension> <signed-integer>\n    // <n-dimension> ['+' | '-'] <signless-integer>\n    else if (this.tokenType === Dimension) {\n        const code = this.charCodeAt(this.tokenStart);\n        const sign = code === PLUSSIGN || code === HYPHENMINUS;\n        let i = this.tokenStart + sign;\n\n        for (; i < this.tokenEnd; i++) {\n            if (!isDigit(this.charCodeAt(i))) {\n                break;\n            }\n        }\n\n        if (i === this.tokenStart + sign) {\n            this.error('Integer is expected', this.tokenStart + sign);\n        }\n\n        expectCharCode.call(this, i - this.tokenStart, N);\n        a = this.substring(start, i);\n\n        // <n-dimension>\n        // <n-dimension> <signed-integer>\n        // <n-dimension> ['+' | '-'] <signless-integer>\n        if (i + 1 === this.tokenEnd) {\n            this.next();\n            b = consumeB.call(this);\n        } else {\n            expectCharCode.call(this, i - this.tokenStart + 1, HYPHENMINUS);\n\n            // <ndash-dimension> <signless-integer>\n            if (i + 2 === this.tokenEnd) {\n                this.next();\n                this.skipSC();\n                checkTokenIsInteger.call(this, DISALLOW_SIGN);\n                b = '-' + this.consume(Number);\n            }\n            // <ndashdigit-dimension>\n            else {\n                checkInteger.call(this, i - this.tokenStart + 2, DISALLOW_SIGN);\n                this.next();\n                b = this.substrToCursor(i + 1);\n            }\n        }\n    } else {\n        this.error();\n    }\n\n    if (a !== null && a.charCodeAt(0) === PLUSSIGN) {\n        a = a.substr(1);\n    }\n\n    if (b !== null && b.charCodeAt(0) === PLUSSIGN) {\n        b = b.substr(1);\n    }\n\n    return {\n        type: 'AnPlusB',\n        loc: this.getLocation(start, this.tokenStart),\n        a,\n        b\n    };\n}\n\nexport function generate(node) {\n    if (node.a) {\n        const a =\n            node.a === '+1' && 'n' ||\n            node.a ===  '1' && 'n' ||\n            node.a === '-1' && '-n' ||\n            node.a + 'n';\n\n        if (node.b) {\n            const b = node.b[0] === '-' || node.b[0] === '+'\n                ? node.b\n                : '+' + node.b;\n            this.tokenize(a + b);\n        } else {\n            this.tokenize(a);\n        }\n    } else {\n        this.tokenize(node.b);\n    }\n}\n","import {\n    AtKeyword,\n    Semicolon,\n    LeftCurlyBracket,\n    RightCurlyBracket\n} from '../../tokenizer/index.js';\n\nfunction consumeRaw() {\n    return this.Raw(this.consumeUntilLeftCurlyBracketOrSemicolon, true);\n}\n\nfunction isDeclarationBlockAtrule() {\n    for (let offset = 1, type; type = this.lookupType(offset); offset++) {\n        if (type === RightCurlyBracket) {\n            return true;\n        }\n\n        if (type === LeftCurlyBracket ||\n            type === AtKeyword) {\n            return false;\n        }\n    }\n\n    return false;\n}\n\n\nexport const name = 'Atrule';\nexport const walkContext = 'atrule';\nexport const structure = {\n    name: String,\n    prelude: ['AtrulePrelude', 'Raw', null],\n    block: ['Block', null]\n};\n\nexport function parse(isDeclaration = false) {\n    const start = this.tokenStart;\n    let name;\n    let nameLowerCase;\n    let prelude = null;\n    let block = null;\n\n    this.eat(AtKeyword);\n\n    name = this.substrToCursor(start + 1);\n    nameLowerCase = name.toLowerCase();\n    this.skipSC();\n\n    // parse prelude\n    if (this.eof === false &&\n        this.tokenType !== LeftCurlyBracket &&\n        this.tokenType !== Semicolon) {\n        if (this.parseAtrulePrelude) {\n            prelude = this.parseWithFallback(this.AtrulePrelude.bind(this, name, isDeclaration), consumeRaw);\n        } else {\n            prelude = consumeRaw.call(this, this.tokenIndex);\n        }\n\n        this.skipSC();\n    }\n\n    switch (this.tokenType) {\n        case Semicolon:\n            this.next();\n            break;\n\n        case LeftCurlyBracket:\n            if (hasOwnProperty.call(this.atrule, nameLowerCase) &&\n                typeof this.atrule[nameLowerCase].block === 'function') {\n                block = this.atrule[nameLowerCase].block.call(this, isDeclaration);\n            } else {\n                // TODO: should consume block content as Raw?\n                block = this.Block(isDeclarationBlockAtrule.call(this));\n            }\n\n            break;\n    }\n\n    return {\n        type: 'Atrule',\n        loc: this.getLocation(start, this.tokenStart),\n        name,\n        prelude,\n        block\n    };\n}\n\nexport function generate(node) {\n    this.token(AtKeyword, '@' + node.name);\n\n    if (node.prelude !== null) {\n        this.node(node.prelude);\n    }\n\n    if (node.block) {\n        this.node(node.block);\n    } else {\n        this.token(Semicolon, ';');\n    }\n}\n","import {\n    Semicolon,\n    LeftCurlyBracket\n} from '../../tokenizer/index.js';\n\nexport const name = 'AtrulePrelude';\nexport const walkContext = 'atrulePrelude';\nexport const structure = {\n    children: [[]]\n};\n\nexport function parse(name) {\n    let children = null;\n\n    if (name !== null) {\n        name = name.toLowerCase();\n    }\n\n    this.skipSC();\n\n    if (hasOwnProperty.call(this.atrule, name) &&\n        typeof this.atrule[name].prelude === 'function') {\n        // custom consumer\n        children = this.atrule[name].prelude.call(this);\n    } else {\n        // default consumer\n        children = this.readSequence(this.scope.AtrulePrelude);\n    }\n\n    this.skipSC();\n\n    if (this.eof !== true &&\n        this.tokenType !== LeftCurlyBracket &&\n        this.tokenType !== Semicolon) {\n        this.error('Semicolon or block is expected');\n    }\n\n    return {\n        type: 'AtrulePrelude',\n        loc: this.getLocationFromList(children),\n        children\n    };\n}\n\nexport function generate(node) {\n    this.children(node);\n}\n","import {\n    Ident,\n    String as StringToken,\n    Delim,\n    LeftSquareBracket,\n    RightSquareBracket\n} from '../../tokenizer/index.js';\n\nconst DOLLARSIGN = 0x0024;       // U+0024 DOLLAR SIGN ($)\nconst ASTERISK = 0x002A;         // U+002A ASTERISK (*)\nconst EQUALSSIGN = 0x003D;       // U+003D EQUALS SIGN (=)\nconst CIRCUMFLEXACCENT = 0x005E; // U+005E (^)\nconst VERTICALLINE = 0x007C;     // U+007C VERTICAL LINE (|)\nconst TILDE = 0x007E;            // U+007E TILDE (~)\n\nfunction getAttributeName() {\n    if (this.eof) {\n        this.error('Unexpected end of input');\n    }\n\n    const start = this.tokenStart;\n    let expectIdent = false;\n\n    if (this.isDelim(ASTERISK)) {\n        expectIdent = true;\n        this.next();\n    } else if (!this.isDelim(VERTICALLINE)) {\n        this.eat(Ident);\n    }\n\n    if (this.isDelim(VERTICALLINE)) {\n        if (this.charCodeAt(this.tokenStart + 1) !== EQUALSSIGN) {\n            this.next();\n            this.eat(Ident);\n        } else if (expectIdent) {\n            this.error('Identifier is expected', this.tokenEnd);\n        }\n    } else if (expectIdent) {\n        this.error('Vertical line is expected');\n    }\n\n    return {\n        type: 'Identifier',\n        loc: this.getLocation(start, this.tokenStart),\n        name: this.substrToCursor(start)\n    };\n}\n\nfunction getOperator() {\n    const start = this.tokenStart;\n    const code = this.charCodeAt(start);\n\n    if (code !== EQUALSSIGN &&        // =\n        code !== TILDE &&             // ~=\n        code !== CIRCUMFLEXACCENT &&  // ^=\n        code !== DOLLARSIGN &&        // $=\n        code !== ASTERISK &&          // *=\n        code !== VERTICALLINE         // |=\n    ) {\n        this.error('Attribute selector (=, ~=, ^=, $=, *=, |=) is expected');\n    }\n\n    this.next();\n\n    if (code !== EQUALSSIGN) {\n        if (!this.isDelim(EQUALSSIGN)) {\n            this.error('Equal sign is expected');\n        }\n\n        this.next();\n    }\n\n    return this.substrToCursor(start);\n}\n\n// '[' <wq-name> ']'\n// '[' <wq-name> <attr-matcher> [ <string-token> | <ident-token> ] <attr-modifier>? ']'\nexport const name = 'AttributeSelector';\nexport const structure = {\n    name: 'Identifier',\n    matcher: [String, null],\n    value: ['String', 'Identifier', null],\n    flags: [String, null]\n};\n\nexport function parse() {\n    const start = this.tokenStart;\n    let name;\n    let matcher = null;\n    let value = null;\n    let flags = null;\n\n    this.eat(LeftSquareBracket);\n    this.skipSC();\n\n    name = getAttributeName.call(this);\n    this.skipSC();\n\n    if (this.tokenType !== RightSquareBracket) {\n        // avoid case `[name i]`\n        if (this.tokenType !== Ident) {\n            matcher = getOperator.call(this);\n\n            this.skipSC();\n\n            value = this.tokenType === StringToken\n                ? this.String()\n                : this.Identifier();\n\n            this.skipSC();\n        }\n\n        // attribute flags\n        if (this.tokenType === Ident) {\n            flags = this.consume(Ident);\n\n            this.skipSC();\n        }\n    }\n\n    this.eat(RightSquareBracket);\n\n    return {\n        type: 'AttributeSelector',\n        loc: this.getLocation(start, this.tokenStart),\n        name,\n        matcher,\n        value,\n        flags\n    };\n}\n\nexport function generate(node) {\n    this.token(Delim, '[');\n    this.node(node.name);\n\n    if (node.matcher !== null) {\n        this.tokenize(node.matcher);\n        this.node(node.value);\n    }\n\n    if (node.flags !== null) {\n        this.token(Ident, node.flags);\n    }\n\n    this.token(Delim, ']');\n}\n","import {\n    WhiteSpace,\n    Comment,\n    Semicolon,\n    AtKeyword,\n    LeftCurlyBracket,\n    RightCurlyBracket\n} from '../../tokenizer/index.js';\n\nconst AMPERSAND = 0x0026;       // U+0026 AMPERSAND (&)\n\nfunction consumeRaw() {\n    return this.Raw(null, true);\n}\nfunction consumeRule() {\n    return this.parseWithFallback(this.Rule, consumeRaw);\n}\nfunction consumeRawDeclaration() {\n    return this.Raw(this.consumeUntilSemicolonIncluded, true);\n}\nfunction consumeDeclaration() {\n    if (this.tokenType === Semicolon) {\n        return consumeRawDeclaration.call(this, this.tokenIndex);\n    }\n\n    const node = this.parseWithFallback(this.Declaration, consumeRawDeclaration);\n\n    if (this.tokenType === Semicolon) {\n        this.next();\n    }\n\n    return node;\n}\n\nexport const name = 'Block';\nexport const walkContext = 'block';\nexport const structure = {\n    children: [[\n        'Atrule',\n        'Rule',\n        'Declaration'\n    ]]\n};\n\nexport function parse(isStyleBlock) {\n    const consumer = isStyleBlock ? consumeDeclaration : consumeRule;\n    const start = this.tokenStart;\n    let children = this.createList();\n\n    this.eat(LeftCurlyBracket);\n\n    scan:\n    while (!this.eof) {\n        switch (this.tokenType) {\n            case RightCurlyBracket:\n                break scan;\n\n            case WhiteSpace:\n            case Comment:\n                this.next();\n                break;\n\n            case AtKeyword:\n                children.push(this.parseWithFallback(this.Atrule.bind(this, isStyleBlock), consumeRaw));\n                break;\n\n            default:\n                if (isStyleBlock && this.isDelim(AMPERSAND))  {\n                    children.push(consumeRule.call(this));\n                } else {\n                    children.push(consumer.call(this));\n                }\n        }\n    }\n\n    if (!this.eof) {\n        this.eat(RightCurlyBracket);\n    }\n\n    return {\n        type: 'Block',\n        loc: this.getLocation(start, this.tokenStart),\n        children\n    };\n}\n\nexport function generate(node) {\n    this.token(LeftCurlyBracket, '{');\n    this.children(node, prev => {\n        if (prev.type === 'Declaration') {\n            this.token(Semicolon, ';');\n        }\n    });\n    this.token(RightCurlyBracket, '}');\n}\n","import {\n    Delim,\n    LeftSquareBracket,\n    RightSquareBracket\n} from '../../tokenizer/index.js';\n\nexport const name = 'Brackets';\nexport const structure = {\n    children: [[]]\n};\n\nexport function parse(readSequence, recognizer) {\n    const start = this.tokenStart;\n    let children = null;\n\n    this.eat(LeftSquareBracket);\n\n    children = readSequence.call(this, recognizer);\n\n    if (!this.eof) {\n        this.eat(RightSquareBracket);\n    }\n\n    return {\n        type: 'Brackets',\n        loc: this.getLocation(start, this.tokenStart),\n        children\n    };\n}\n\nexport function generate(node) {\n    this.token(Delim, '[');\n    this.children(node);\n    this.token(Delim, ']');\n}\n","import { CDC } from '../../tokenizer/index.js';\n\nexport const name = 'CDC';\nexport const structure = [];\n\nexport function parse() {\n    const start = this.tokenStart;\n\n    this.eat(CDC); // -->\n\n    return {\n        type: 'CDC',\n        loc: this.getLocation(start, this.tokenStart)\n    };\n}\n\nexport function generate() {\n    this.token(CDC, '-->');\n}\n","import { CDO } from '../../tokenizer/index.js';\n\nexport const name = 'CDO';\nexport const structure = [];\n\nexport function parse() {\n    const start = this.tokenStart;\n\n    this.eat(CDO); // <!--\n\n    return {\n        type: 'CDO',\n        loc: this.getLocation(start, this.tokenStart)\n    };\n}\n\nexport function generate() {\n    this.token(CDO, '<!--');\n}\n","import { Delim, Ident } from '../../tokenizer/index.js';\n\nconst FULLSTOP = 0x002E; // U+002E FULL STOP (.)\n\n// '.' ident\nexport const name = 'ClassSelector';\nexport const structure = {\n    name: String\n};\n\nexport function parse() {\n    this.eatDelim(FULLSTOP);\n\n    return {\n        type: 'ClassSelector',\n        loc: this.getLocation(this.tokenStart - 1, this.tokenEnd),\n        name: this.consume(Ident)\n    };\n}\n\nexport function generate(node) {\n    this.token(Delim, '.');\n    this.token(Ident, node.name);\n}\n","import { WhiteSpace, Delim } from '../../tokenizer/index.js';\n\nconst PLUSSIGN = 0x002B;        // U+002B PLUS SIGN (+)\nconst SOLIDUS = 0x002F;         // U+002F SOLIDUS (/)\nconst GREATERTHANSIGN = 0x003E; // U+003E GREATER-THAN SIGN (>)\nconst TILDE = 0x007E;           // U+007E TILDE (~)\n\nexport const name = 'Combinator';\nexport const structure = {\n    name: String\n};\n\n// + | > | ~ | /deep/\nexport function parse() {\n    const start = this.tokenStart;\n    let name;\n\n    switch (this.tokenType) {\n        case WhiteSpace:\n            name = ' ';\n            break;\n\n        case Delim:\n            switch (this.charCodeAt(this.tokenStart)) {\n                case GREATERTHANSIGN:\n                case PLUSSIGN:\n                case TILDE:\n                    this.next();\n                    break;\n\n                case SOLIDUS:\n                    this.next();\n                    this.eatIdent('deep');\n                    this.eatDelim(SOLIDUS);\n                    break;\n\n                default:\n                    this.error('Combinator is expected');\n            }\n\n            name = this.substrToCursor(start);\n            break;\n    }\n\n    return {\n        type: 'Combinator',\n        loc: this.getLocation(start, this.tokenStart),\n        name\n    };\n}\n\nexport function generate(node) {\n    this.tokenize(node.name);\n}\n","import { Comment } from '../../tokenizer/index.js';\n\nconst ASTERISK = 0x002A;        // U+002A ASTERISK (*)\nconst SOLIDUS = 0x002F;         // U+002F SOLIDUS (/)\n\n\nexport const name = 'Comment';\nexport const structure = {\n    value: String\n};\n\nexport function parse() {\n    const start = this.tokenStart;\n    let end = this.tokenEnd;\n\n    this.eat(Comment);\n\n    if ((end - start + 2) >= 2 &&\n        this.charCodeAt(end - 2) === ASTERISK &&\n        this.charCodeAt(end - 1) === SOLIDUS) {\n        end -= 2;\n    }\n\n    return {\n        type: 'Comment',\n        loc: this.getLocation(start, this.tokenStart),\n        value: this.substring(start + 2, end)\n    };\n}\n\nexport function generate(node) {\n    this.token(Comment, '/*' + node.value + '*/');\n}\n","import {\n    WhiteSpace,\n    Comment,\n    Ident,\n    LeftParenthesis,\n    RightParenthesis,\n    Function as FunctionToken,\n    Colon,\n    EOF\n} from '../../tokenizer/index.js';\n\nconst likelyFeatureToken = new Set([Colon, RightParenthesis, EOF]);\n\nexport const name = 'Condition';\nexport const structure = {\n    kind: String,\n    children: [[\n        'Identifier',\n        'Feature',\n        'FeatureFunction',\n        'FeatureRange',\n        'SupportsDeclaration'\n    ]]\n};\n\nfunction featureOrRange(kind) {\n    if (this.lookupTypeNonSC(1) === Ident &&\n        likelyFeatureToken.has(this.lookupTypeNonSC(2))) {\n        return this.Feature(kind);\n    }\n\n    return this.FeatureRange(kind);\n}\n\nconst parentheses = {\n    media: featureOrRange,\n    container: featureOrRange,\n    supports() {\n        return this.SupportsDeclaration();\n    }\n};\n\nexport function parse(kind = 'media') {\n    const children = this.createList();\n\n    scan: while (!this.eof) {\n        switch (this.tokenType) {\n            case Comment:\n            case WhiteSpace:\n                this.next();\n                continue;\n\n            case Ident:\n                children.push(this.Identifier());\n                break;\n\n            case LeftParenthesis: {\n                let term = this.parseWithFallback(\n                    () => parentheses[kind].call(this, kind),\n                    () => null\n                );\n\n                if (!term) {\n                    term = this.parseWithFallback(\n                        () => {\n                            this.eat(LeftParenthesis);\n                            const res = this.Condition(kind);\n                            this.eat(RightParenthesis);\n                            return res;\n                        },\n                        () => {\n                            return this.GeneralEnclosed(kind);\n                        }\n                    );\n                }\n\n                children.push(term);\n                break;\n            }\n\n            case FunctionToken: {\n                let term = this.parseWithFallback(\n                    () => this.FeatureFunction(kind),\n                    () => null\n                );\n\n                if (!term) {\n                    term = this.GeneralEnclosed(kind);\n                }\n\n                children.push(term);\n                break;\n            }\n\n            default:\n                break scan;\n        }\n    }\n\n    if (children.isEmpty) {\n        this.error('Condition is expected');\n    }\n\n    return {\n        type: 'Condition',\n        loc: this.getLocationFromList(children),\n        kind,\n        children\n    };\n}\n\nexport function generate(node) {\n    node.children.forEach(child => {\n        if (child.type === 'Condition') {\n            this.token(LeftParenthesis, '(');\n            this.node(child);\n            this.token(RightParenthesis, ')');\n        } else {\n            this.node(child);\n        }\n    });\n}\n\n","import { isCustomProperty } from '../../utils/names.js';\nimport {\n    Ident,\n    Hash,\n    Colon,\n    Semicolon,\n    Delim,\n    WhiteSpace\n} from '../../tokenizer/index.js';\n\nconst EXCLAMATIONMARK = 0x0021; // U+0021 EXCLAMATION MARK (!)\nconst NUMBERSIGN = 0x0023;      // U+0023 NUMBER SIGN (#)\nconst DOLLARSIGN = 0x0024;      // U+0024 DOLLAR SIGN ($)\nconst AMPERSAND = 0x0026;       // U+0026 AMPERSAND (&)\nconst ASTERISK = 0x002A;        // U+002A ASTERISK (*)\nconst PLUSSIGN = 0x002B;        // U+002B PLUS SIGN (+)\nconst SOLIDUS = 0x002F;         // U+002F SOLIDUS (/)\n\nfunction consumeValueRaw() {\n    return this.Raw(this.consumeUntilExclamationMarkOrSemicolon, true);\n}\n\nfunction consumeCustomPropertyRaw() {\n    return this.Raw(this.consumeUntilExclamationMarkOrSemicolon, false);\n}\n\nfunction consumeValue() {\n    const startValueToken = this.tokenIndex;\n    const value = this.Value();\n\n    if (value.type !== 'Raw' &&\n        this.eof === false &&\n        this.tokenType !== Semicolon &&\n        this.isDelim(EXCLAMATIONMARK) === false &&\n        this.isBalanceEdge(startValueToken) === false) {\n        this.error();\n    }\n\n    return value;\n}\n\nexport const name = 'Declaration';\nexport const walkContext = 'declaration';\nexport const structure = {\n    important: [Boolean, String],\n    property: String,\n    value: ['Value', 'Raw']\n};\n\nexport function parse() {\n    const start = this.tokenStart;\n    const startToken = this.tokenIndex;\n    const property = readProperty.call(this);\n    const customProperty = isCustomProperty(property);\n    const parseValue = customProperty ? this.parseCustomProperty : this.parseValue;\n    const consumeRaw = customProperty ? consumeCustomPropertyRaw : consumeValueRaw;\n    let important = false;\n    let value;\n\n    this.skipSC();\n    this.eat(Colon);\n\n    const valueStart = this.tokenIndex;\n\n    if (!customProperty) {\n        this.skipSC();\n    }\n\n    if (parseValue) {\n        value = this.parseWithFallback(consumeValue, consumeRaw);\n    } else {\n        value = consumeRaw.call(this, this.tokenIndex);\n    }\n\n    if (customProperty && value.type === 'Value' && value.children.isEmpty) {\n        for (let offset = valueStart - this.tokenIndex; offset <= 0; offset++) {\n            if (this.lookupType(offset) === WhiteSpace) {\n                value.children.appendData({\n                    type: 'WhiteSpace',\n                    loc: null,\n                    value: ' '\n                });\n                break;\n            }\n        }\n    }\n\n    if (this.isDelim(EXCLAMATIONMARK)) {\n        important = getImportant.call(this);\n        this.skipSC();\n    }\n\n    // Do not include semicolon to range per spec\n    // https://drafts.csswg.org/css-syntax/#declaration-diagram\n\n    if (this.eof === false &&\n        this.tokenType !== Semicolon &&\n        this.isBalanceEdge(startToken) === false) {\n        this.error();\n    }\n\n    return {\n        type: 'Declaration',\n        loc: this.getLocation(start, this.tokenStart),\n        important,\n        property,\n        value\n    };\n}\n\nexport function generate(node) {\n    this.token(Ident, node.property);\n    this.token(Colon, ':');\n    this.node(node.value);\n\n    if (node.important) {\n        this.token(Delim, '!');\n        this.token(Ident, node.important === true ? 'important' : node.important);\n    }\n}\n\nfunction readProperty() {\n    const start = this.tokenStart;\n\n    // hacks\n    if (this.tokenType === Delim) {\n        switch (this.charCodeAt(this.tokenStart)) {\n            case ASTERISK:\n            case DOLLARSIGN:\n            case PLUSSIGN:\n            case NUMBERSIGN:\n            case AMPERSAND:\n                this.next();\n                break;\n\n            // TODO: not sure we should support this hack\n            case SOLIDUS:\n                this.next();\n                if (this.isDelim(SOLIDUS)) {\n                    this.next();\n                }\n                break;\n        }\n    }\n\n    if (this.tokenType === Hash) {\n        this.eat(Hash);\n    } else {\n        this.eat(Ident);\n    }\n\n    return this.substrToCursor(start);\n}\n\n// ! ws* important\nfunction getImportant() {\n    this.eat(Delim);\n    this.skipSC();\n\n    const important = this.consume(Ident);\n\n    // store original value in case it differ from `important`\n    // for better original source restoring and hacks like `!ie` support\n    return important === 'important' ? true : important;\n}\n","import {\n    WhiteSpace,\n    Comment,\n    Semicolon,\n    AtKeyword\n} from '../../tokenizer/index.js';\n\nconst AMPERSAND = 0x0026;       // U+0026 AMPERSAND (&)\n\nfunction consumeRaw() {\n    return this.Raw(this.consumeUntilSemicolonIncluded, true);\n}\n\nexport const name = 'DeclarationList';\nexport const structure = {\n    children: [[\n        'Declaration',\n        'Atrule',\n        'Rule'\n    ]]\n};\n\nexport function parse() {\n    const children = this.createList();\n\n    scan:\n    while (!this.eof) {\n        switch (this.tokenType) {\n            case WhiteSpace:\n            case Comment:\n            case Semicolon:\n                this.next();\n                break;\n\n            case AtKeyword:\n                children.push(this.parseWithFallback(this.Atrule.bind(this, true), consumeRaw));\n                break;\n\n            default:\n                if (this.isDelim(AMPERSAND))  {\n                    children.push(this.parseWithFallback(this.Rule, consumeRaw));\n                } else {\n                    children.push(this.parseWithFallback(this.Declaration, consumeRaw));\n                }\n        }\n    }\n\n    return {\n        type: 'DeclarationList',\n        loc: this.getLocationFromList(children),\n        children\n    };\n}\n\nexport function generate(node) {\n    this.children(node, prev => {\n        if (prev.type === 'Declaration') {\n            this.token(Semicolon, ';');\n        }\n    });\n}\n\n","import { Dimension } from '../../tokenizer/index.js';\n\nexport const name = 'Dimension';\nexport const structure = {\n    value: String,\n    unit: String\n};\n\nexport function parse() {\n    const start = this.tokenStart;\n    const value = this.consumeNumber(Dimension);\n\n    return {\n        type: 'Dimension',\n        loc: this.getLocation(start, this.tokenStart),\n        value,\n        unit: this.substring(start + value.length, this.tokenStart)\n    };\n}\n\nexport function generate(node) {\n    this.token(Dimension, node.value + node.unit);\n}\n","import {\n    Ident,\n    Number,\n    Dimension,\n    Function as FunctionToken,\n    LeftParenthesis,\n    RightParenthesis,\n    Colon,\n    Delim\n} from '../../tokenizer/index.js';\n\nconst SOLIDUS = 0x002F;  // U+002F SOLIDUS (/)\n\nexport const name = 'Feature';\nexport const structure = {\n    kind: String,\n    name: String,\n    value: ['Identifier', 'Number', 'Dimension', 'Ratio', 'Function', null]\n};\n\nexport function parse(kind) {\n    const start = this.tokenStart;\n    let name;\n    let value = null;\n\n    this.eat(LeftParenthesis);\n    this.skipSC();\n\n    name = this.consume(Ident);\n    this.skipSC();\n\n    if (this.tokenType !== RightParenthesis) {\n        this.eat(Colon);\n        this.skipSC();\n\n        switch (this.tokenType) {\n            case Number:\n                if (this.lookupNonWSType(1) === Delim) {\n                    value = this.Ratio();\n                } else {\n                    value = this.Number();\n                }\n\n                break;\n\n            case Dimension:\n                value = this.Dimension();\n                break;\n\n            case Ident:\n                value = this.Identifier();\n                break;\n\n            case FunctionToken:\n                value = this.parseWithFallback(\n                    () => {\n                        const res = this.Function(this.readSequence, this.scope.Value);\n\n                        this.skipSC();\n\n                        if (this.isDelim(SOLIDUS)) {\n                            this.error();\n                        }\n\n                        return res;\n                    },\n                    () => {\n                        return this.Ratio();\n                    }\n                );\n                break;\n\n            default:\n                this.error('Number, dimension, ratio or identifier is expected');\n        }\n\n        this.skipSC();\n    }\n\n    if (!this.eof) {\n        this.eat(RightParenthesis);\n    }\n\n    return {\n        type: 'Feature',\n        loc: this.getLocation(start, this.tokenStart),\n        kind,\n        name,\n        value\n    };\n}\n\nexport function generate(node) {\n    this.token(LeftParenthesis, '(');\n    this.token(Ident, node.name);\n\n    if (node.value !== null) {\n        this.token(Colon, ':');\n        this.node(node.value);\n    }\n\n    this.token(RightParenthesis, ')');\n}\n","import {\n    Function as FunctionToken,\n    RightParenthesis\n} from '../../tokenizer/index.js';\n\nexport const name = 'FeatureFunction';\nexport const structure = {\n    kind: String,\n    feature: String,\n    value: ['Declaration', 'Selector']\n};\n\nfunction getFeatureParser(kind, name) {\n    const featuresOfKind = this.features[kind] || {};\n    const parser = featuresOfKind[name];\n\n    if (typeof parser !== 'function') {\n        this.error(`Unknown feature ${name}()`);\n    }\n\n    return parser;\n}\n\nexport function parse(kind = 'unknown') {\n    const start = this.tokenStart;\n    const functionName = this.consumeFunctionName();\n    const valueParser = getFeatureParser.call(this, kind, functionName.toLowerCase());\n\n    this.skipSC();\n\n    const value = this.parseWithFallback(\n        () => {\n            const startValueToken = this.tokenIndex;\n            const value = valueParser.call(this);\n\n            if (this.eof === false &&\n                this.isBalanceEdge(startValueToken) === false) {\n                this.error();\n            }\n\n            return value;\n        },\n        () => this.Raw(null, false)\n    );\n\n    if (!this.eof) {\n        this.eat(RightParenthesis);\n    }\n\n    return {\n        type: 'FeatureFunction',\n        loc: this.getLocation(start, this.tokenStart),\n        kind,\n        feature: functionName,\n        value\n    };\n}\n\nexport function generate(node) {\n    this.token(FunctionToken, node.feature + '(');\n    this.node(node.value);\n    this.token(RightParenthesis, ')');\n}\n","import {\n    Ident,\n    Number,\n    Dimension,\n    Function as FunctionToken,\n    LeftParenthesis,\n    RightParenthesis\n} from '../../tokenizer/index.js';\n\nconst SOLIDUS = 0x002F;         // U+002F SOLIDUS (/)\nconst LESSTHANSIGN = 0x003C;    // U+003C LESS-THAN SIGN (<)\nconst EQUALSSIGN = 0x003D;      // U+003D EQUALS SIGN (=)\nconst GREATERTHANSIGN = 0x003E; // U+003E GREATER-THAN SIGN (>)\n\nexport const name = 'FeatureRange';\nexport const structure = {\n    kind: String,\n    left: ['Identifier', 'Number', 'Dimension', 'Ratio', 'Function'],\n    leftComparison: String,\n    middle: ['Identifier', 'Number', 'Dimension', 'Ratio', 'Function'],\n    rightComparison: [String, null],\n    right: ['Identifier', 'Number', 'Dimension', 'Ratio', 'Function', null]\n};\n\nfunction readTerm() {\n    this.skipSC();\n\n    switch (this.tokenType) {\n        case Number:\n            if (this.isDelim(SOLIDUS, this.lookupOffsetNonSC(1))) {\n                return this.Ratio();\n            } else {\n                return this.Number();\n            }\n\n        case Dimension:\n            return this.Dimension();\n\n        case Ident:\n            return this.Identifier();\n\n        case FunctionToken:\n            return this.parseWithFallback(\n                () => {\n                    const res = this.Function(this.readSequence, this.scope.Value);\n\n                    this.skipSC();\n\n                    if (this.isDelim(SOLIDUS)) {\n                        this.error();\n                    }\n\n                    return res;\n                },\n                () => {\n                    return this.Ratio();\n                }\n            );\n\n        default:\n            this.error('Number, dimension, ratio or identifier is expected');\n    }\n}\n\nfunction readComparison(expectColon) {\n    this.skipSC();\n\n    if (this.isDelim(LESSTHANSIGN) ||\n        this.isDelim(GREATERTHANSIGN)) {\n        const value = this.source[this.tokenStart];\n\n        this.next();\n\n        if (this.isDelim(EQUALSSIGN)) {\n            this.next();\n            return value + '=';\n        }\n\n        return value;\n    }\n\n    if (this.isDelim(EQUALSSIGN)) {\n        return '=';\n    }\n\n    this.error(`Expected ${expectColon ? '\":\", ' : ''}\"<\", \">\", \"=\" or \")\"`);\n}\n\nexport function parse(kind = 'unknown') {\n    const start = this.tokenStart;\n\n    this.skipSC();\n    this.eat(LeftParenthesis);\n\n    const left = readTerm.call(this);\n    const leftComparison = readComparison.call(this, left.type === 'Identifier');\n    const middle = readTerm.call(this);\n    let rightComparison = null;\n    let right = null;\n\n    if (this.lookupNonWSType(0) !== RightParenthesis) {\n        rightComparison = readComparison.call(this);\n        right = readTerm.call(this);\n    }\n\n    this.skipSC();\n    this.eat(RightParenthesis);\n\n    return {\n        type: 'FeatureRange',\n        loc: this.getLocation(start, this.tokenStart),\n        kind,\n        left,\n        leftComparison,\n        middle,\n        rightComparison,\n        right\n    };\n}\n\nexport function generate(node) {\n    this.token(LeftParenthesis, '(');\n    this.node(node.left);\n    this.tokenize(node.leftComparison);\n    this.node(node.middle);\n\n    if (node.right) {\n        this.tokenize(node.rightComparison);\n        this.node(node.right);\n    }\n\n    this.token(RightParenthesis, ')');\n}\n","import {\n    Function as FunctionToken,\n    RightParenthesis\n} from '../../tokenizer/index.js';\n\n\nexport const name = 'Function';\nexport const walkContext = 'function';\nexport const structure = {\n    name: String,\n    children: [[]]\n};\n\n// <function-token> <sequence> )\nexport function parse(readSequence, recognizer) {\n    const start = this.tokenStart;\n    const name = this.consumeFunctionName();\n    const nameLowerCase = name.toLowerCase();\n    let children;\n\n    children = recognizer.hasOwnProperty(nameLowerCase)\n        ? recognizer[nameLowerCase].call(this, recognizer)\n        : readSequence.call(this, recognizer);\n\n    if (!this.eof) {\n        this.eat(RightParenthesis);\n    }\n\n    return {\n        type: 'Function',\n        loc: this.getLocation(start, this.tokenStart),\n        name,\n        children\n    };\n}\n\nexport function generate(node) {\n    this.token(FunctionToken, node.name + '(');\n    this.children(node);\n    this.token(RightParenthesis, ')');\n}\n","import {\n    Function as FunctionToken,\n    LeftParenthesis,\n    RightParenthesis\n} from '../../tokenizer/index.js';\n\n\nexport const name = 'GeneralEnclosed';\nexport const structure = {\n    kind: String,\n    function: [String, null],\n    children: [[]]\n};\n\n// <function-token> <any-value> )\n// ( <any-value> )\nexport function parse(kind) {\n    const start = this.tokenStart;\n    let functionName = null;\n\n    if (this.tokenType === FunctionToken) {\n        functionName = this.consumeFunctionName();\n    } else {\n        this.eat(LeftParenthesis);\n    }\n\n    const children = this.parseWithFallback(\n        () => {\n            const startValueToken = this.tokenIndex;\n            const children = this.readSequence(this.scope.Value);\n\n            if (this.eof === false &&\n                this.isBalanceEdge(startValueToken) === false) {\n                this.error();\n            }\n\n            return children;\n        },\n        () => this.createSingleNodeList(\n            this.Raw(null, false)\n        )\n    );\n\n    if (!this.eof) {\n        this.eat(RightParenthesis);\n    }\n\n    return {\n        type: 'GeneralEnclosed',\n        loc: this.getLocation(start, this.tokenStart),\n        kind,\n        function: functionName,\n        children\n    };\n}\n\nexport function generate(node) {\n    if (node.function) {\n        this.token(FunctionToken, node.function + '(');\n    } else {\n        this.token(LeftParenthesis, '(');\n    }\n\n    this.children(node);\n    this.token(RightParenthesis, ')');\n}\n","import { Hash } from '../../tokenizer/index.js';\n\n// '#' ident\nexport const xxx = 'XXX';\nexport const name = 'Hash';\nexport const structure = {\n    value: String\n};\nexport function parse() {\n    const start = this.tokenStart;\n\n    this.eat(Hash);\n\n    return {\n        type: 'Hash',\n        loc: this.getLocation(start, this.tokenStart),\n        value: this.substrToCursor(start + 1)\n    };\n}\nexport function generate(node) {\n    this.token(Hash, '#' + node.value);\n}\n\n","import { Ident } from '../../tokenizer/index.js';\n\nexport const name = 'Identifier';\nexport const structure = {\n    name: String\n};\n\nexport function parse() {\n    return {\n        type: 'Identifier',\n        loc: this.getLocation(this.tokenStart, this.tokenEnd),\n        name: this.consume(Ident)\n    };\n}\n\nexport function generate(node) {\n    this.token(Ident, node.name);\n}\n","import { Hash, Delim } from '../../tokenizer/index.js';\n\nexport const name = 'IdSelector';\nexport const structure = {\n    name: String\n};\n\nexport function parse() {\n    const start = this.tokenStart;\n\n    // TODO: check value is an ident\n    this.eat(Hash);\n\n    return {\n        type: 'IdSelector',\n        loc: this.getLocation(start, this.tokenStart),\n        name: this.substrToCursor(start + 1)\n    };\n}\n\nexport function generate(node) {\n    // Using Delim instead of Hash is a hack to avoid for a whitespace between ident and id-selector\n    // in safe mode (e.g. \"a#id\"), because IE11 doesn't allow a sequence <ident-token> <hash-token>\n    // without a whitespace in values (e.g. \"1px solid#000\")\n    this.token(Delim, '#' + node.name);\n}\n","import { Ident, Delim } from '../../tokenizer/index.js';\n\nconst FULLSTOP = 0x002E; // U+002E FULL STOP (.)\n\nexport const name = 'Layer';\nexport const structure = {\n    name: String\n};\n\nexport function parse() {\n    let tokenStart = this.tokenStart;\n    let name = this.consume(Ident);\n\n    while (this.isDelim(FULLSTOP)) {\n        this.eat(Delim);\n        name += '.' + this.consume(Ident);\n    }\n\n    return {\n        type: 'Layer',\n        loc: this.getLocation(tokenStart, this.tokenStart),\n        name\n    };\n}\n\nexport function generate(node) {\n    this.tokenize(node.name);\n}\n","import { Comma } from '../../tokenizer/index.js';\n\nexport const name = 'LayerList';\nexport const structure = {\n    children: [[\n        'Layer'\n    ]]\n};\n\nexport function parse() {\n    const children = this.createList();\n\n    this.skipSC();\n\n    while (!this.eof) {\n        children.push(this.Layer());\n\n        if (this.lookupTypeNonSC(0) !== Comma) {\n            break;\n        }\n\n        this.skipSC();\n        this.next();\n        this.skipSC();\n    }\n\n    return {\n        type: 'LayerList',\n        loc: this.getLocationFromList(children),\n        children\n    };\n}\n\nexport function generate(node) {\n    this.children(node, () => this.token(Comma, ','));\n}\n","import {\n    Comma,\n    EOF,\n    Ident,\n    LeftCurlyBracket,\n    LeftParenthesis,\n    Function as FunctionToken,\n    Semicolon\n} from '../../tokenizer/index.js';\n\nexport const name = 'MediaQuery';\nexport const structure = {\n    modifier: [String, null],\n    mediaType: [String, null],\n    condition: ['Condition', null]\n};\n\nexport function parse() {\n    const start = this.tokenStart;\n    let modifier = null;\n    let mediaType = null;\n    let condition = null;\n\n    this.skipSC();\n\n    if (this.tokenType === Ident && this.lookupTypeNonSC(1) !== LeftParenthesis) {\n        // [ not | only ]? <media-type>\n        const ident = this.consume(Ident);\n        const identLowerCase = ident.toLowerCase();\n\n        if (identLowerCase === 'not' || identLowerCase === 'only') {\n            this.skipSC();\n            modifier = identLowerCase;\n            mediaType = this.consume(Ident);\n        } else {\n            mediaType = ident;\n        }\n\n        switch (this.lookupTypeNonSC(0)) {\n            case Ident: {\n                // and <media-condition-without-or>\n                this.skipSC();\n                this.eatIdent('and');\n                condition = this.Condition('media');\n                break;\n            }\n\n            case LeftCurlyBracket:\n            case Semicolon:\n            case Comma:\n            case EOF:\n                break;\n\n            default:\n                this.error('Identifier or parenthesis is expected');\n        }\n    } else {\n        switch (this.tokenType) {\n            case Ident:\n            case LeftParenthesis:\n            case FunctionToken: {\n                // <media-condition>\n                condition = this.Condition('media');\n                break;\n            }\n\n            case LeftCurlyBracket:\n            case Semicolon:\n            case EOF:\n                break;\n\n            default:\n                this.error('Identifier or parenthesis is expected');\n        }\n    }\n\n    return {\n        type: 'MediaQuery',\n        loc: this.getLocation(start, this.tokenStart),\n        modifier,\n        mediaType,\n        condition\n    };\n}\n\nexport function generate(node) {\n    if (node.mediaType) {\n        if (node.modifier) {\n            this.token(Ident, node.modifier);\n        }\n\n        this.token(Ident, node.mediaType);\n\n        if (node.condition) {\n            this.token(Ident, 'and');\n            this.node(node.condition);\n        }\n    } else if (node.condition) {\n        this.node(node.condition);\n    }\n}\n\n","import { Comma } from '../../tokenizer/index.js';\n\nexport const name = 'MediaQueryList';\nexport const structure = {\n    children: [[\n        'MediaQuery'\n    ]]\n};\n\nexport function parse() {\n    const children = this.createList();\n\n    this.skipSC();\n\n    while (!this.eof) {\n        children.push(this.MediaQuery());\n\n        if (this.tokenType !== Comma) {\n            break;\n        }\n\n        this.next();\n    }\n\n    return {\n        type: 'MediaQueryList',\n        loc: this.getLocationFromList(children),\n        children\n    };\n}\n\nexport function generate(node) {\n    this.children(node, () => this.token(Comma, ','));\n}\n","import { Delim } from '../../tokenizer/index.js';\n\nconst AMPERSAND = 0x0026;       // U+0026 AMPERSAND (&)\n\nexport const name = 'NestingSelector';\nexport const structure = {\n};\n\nexport function parse() {\n    const start = this.tokenStart;\n\n    this.eatDelim(AMPERSAND);\n\n    return {\n        type: 'NestingSelector',\n        loc: this.getLocation(start, this.tokenStart)\n    };\n}\n\nexport function generate() {\n    this.token(Delim, '&');\n}\n","import { Ident } from '../../tokenizer/index.js';\n\nexport const name = 'Nth';\nexport const structure = {\n    nth: ['AnPlusB', 'Identifier'],\n    selector: ['SelectorList', null]\n};\n\nexport function parse() {\n    this.skipSC();\n\n    const start = this.tokenStart;\n    let end = start;\n    let selector = null;\n    let nth;\n\n    if (this.lookupValue(0, 'odd') || this.lookupValue(0, 'even')) {\n        nth = this.Identifier();\n    } else {\n        nth = this.AnPlusB();\n    }\n\n    end = this.tokenStart;\n    this.skipSC();\n\n    if (this.lookupValue(0, 'of')) {\n        this.next();\n\n        selector = this.SelectorList();\n        end = this.tokenStart;\n    }\n\n    return {\n        type: 'Nth',\n        loc: this.getLocation(start, end),\n        nth,\n        selector\n    };\n}\n\nexport function generate(node) {\n    this.node(node.nth);\n    if (node.selector !== null) {\n        this.token(Ident, 'of');\n        this.node(node.selector);\n    }\n}\n","import { Number as NumberToken } from '../../tokenizer/index.js';\n\nexport const name = 'Number';\nexport const structure = {\n    value: String\n};\n\nexport function parse() {\n    return {\n        type: 'Number',\n        loc: this.getLocation(this.tokenStart, this.tokenEnd),\n        value: this.consume(NumberToken)\n    };\n}\n\nexport function generate(node) {\n    this.token(NumberToken, node.value);\n}\n","// '/' | '*' | ',' | ':' | '+' | '-'\nexport const name = 'Operator';\nexport const structure = {\n    value: String\n};\n\nexport function parse() {\n    const start = this.tokenStart;\n\n    this.next();\n\n    return {\n        type: 'Operator',\n        loc: this.getLocation(start, this.tokenStart),\n        value: this.substrToCursor(start)\n    };\n}\n\nexport function generate(node) {\n    this.tokenize(node.value);\n}\n","import {\n    LeftParenthesis,\n    RightParenthesis\n} from '../../tokenizer/index.js';\n\nexport const name = 'Parentheses';\nexport const structure = {\n    children: [[]]\n};\n\nexport function parse(readSequence, recognizer) {\n    const start = this.tokenStart;\n    let children = null;\n\n    this.eat(LeftParenthesis);\n\n    children = readSequence.call(this, recognizer);\n\n    if (!this.eof) {\n        this.eat(RightParenthesis);\n    }\n\n    return {\n        type: 'Parentheses',\n        loc: this.getLocation(start, this.tokenStart),\n        children\n    };\n}\n\nexport function generate(node) {\n    this.token(LeftParenthesis, '(');\n    this.children(node);\n    this.token(RightParenthesis, ')');\n}\n","import { Percentage } from '../../tokenizer/index.js';\n\nexport const name = 'Percentage';\nexport const structure = {\n    value: String\n};\n\nexport function parse() {\n    return {\n        type: 'Percentage',\n        loc: this.getLocation(this.tokenStart, this.tokenEnd),\n        value: this.consumeNumber(Percentage)\n    };\n}\n\nexport function generate(node) {\n    this.token(Percentage, node.value + '%');\n}\n","import {\n    Ident,\n    Function as FunctionToken,\n    Colon,\n    RightParenthesis\n} from '../../tokenizer/index.js';\n\n\nexport const name = 'PseudoClassSelector';\nexport const walkContext = 'function';\nexport const structure = {\n    name: String,\n    children: [['Raw'], null]\n};\n\n// : [ <ident> | <function-token> <any-value>? ) ]\nexport function parse() {\n    const start = this.tokenStart;\n    let children = null;\n    let name;\n    let nameLowerCase;\n\n    this.eat(Colon);\n\n    if (this.tokenType === FunctionToken) {\n        name = this.consumeFunctionName();\n        nameLowerCase = name.toLowerCase();\n\n        if (this.lookupNonWSType(0) == RightParenthesis) {\n            children = this.createList();\n        } else if (hasOwnProperty.call(this.pseudo, nameLowerCase)) {\n            this.skipSC();\n            children = this.pseudo[nameLowerCase].call(this);\n            this.skipSC();\n        } else {\n            children = this.createList();\n            children.push(\n                this.Raw(null, false)\n            );\n        }\n\n        this.eat(RightParenthesis);\n    } else {\n        name = this.consume(Ident);\n    }\n\n    return {\n        type: 'PseudoClassSelector',\n        loc: this.getLocation(start, this.tokenStart),\n        name,\n        children\n    };\n}\n\nexport function generate(node) {\n    this.token(Colon, ':');\n\n    if (node.children === null) {\n        this.token(Ident, node.name);\n    } else {\n        this.token(FunctionToken, node.name + '(');\n        this.children(node);\n        this.token(RightParenthesis, ')');\n    }\n}\n","import {\n    Ident,\n    Function as FunctionToken,\n    Colon,\n    RightParenthesis\n} from '../../tokenizer/index.js';\n\nexport const name = 'PseudoElementSelector';\nexport const walkContext = 'function';\nexport const structure = {\n    name: String,\n    children: [['Raw'], null]\n};\n\n// :: [ <ident> | <function-token> <any-value>? ) ]\nexport function parse() {\n    const start = this.tokenStart;\n    let children = null;\n    let name;\n    let nameLowerCase;\n\n    this.eat(Colon);\n    this.eat(Colon);\n\n    if (this.tokenType === FunctionToken) {\n        name = this.consumeFunctionName();\n        nameLowerCase = name.toLowerCase();\n\n        if (this.lookupNonWSType(0) == RightParenthesis) {\n            children = this.createList();\n        } else if (hasOwnProperty.call(this.pseudo, nameLowerCase)) {\n            this.skipSC();\n            children = this.pseudo[nameLowerCase].call(this);\n            this.skipSC();\n        } else {\n            children = this.createList();\n            children.push(\n                this.Raw(null, false)\n            );\n        }\n\n        this.eat(RightParenthesis);\n    } else {\n        name = this.consume(Ident);\n    }\n\n    return {\n        type: 'PseudoElementSelector',\n        loc: this.getLocation(start, this.tokenStart),\n        name,\n        children\n    };\n}\n\nexport function generate(node) {\n    this.token(Colon, ':');\n    this.token(Colon, ':');\n\n    if (node.children === null) {\n        this.token(Ident, node.name);\n    } else {\n        this.token(FunctionToken, node.name + '(');\n        this.children(node);\n        this.token(RightParenthesis, ')');\n    }\n}\n","import {\n    Delim,\n    Number as NumberToken,\n    Function as FunctionToken\n} from '../../tokenizer/index.js';\n\nconst SOLIDUS = 0x002F;  // U+002F SOLIDUS (/)\n\n// Media Queries Level 3 defines terms of <ratio> as a positive (not zero or negative)\n// integers (see https://drafts.csswg.org/mediaqueries-3/#values)\n// However, Media Queries Level 4 removes any definition of values\n// (see https://drafts.csswg.org/mediaqueries-4/#values) and refers to\n// CSS Values and Units for detail. In CSS Values and Units Level 4 a <ratio>\n// definition was added (see https://drafts.csswg.org/css-values-4/#ratios) which\n// defines ratio as \"<number [0,∞]> [ / <number [0,∞]> ]?\" and based on it\n// any constrains on terms were removed. Parser also doesn't test numbers\n// in any way to make possible for linting and fixing them by the tools using CSSTree.\n// An additional syntax examination may be applied by a lexer.\nfunction consumeTerm() {\n    this.skipSC();\n\n    switch (this.tokenType) {\n        case NumberToken:\n            return this.Number();\n\n        case FunctionToken:\n            return this.Function(this.readSequence, this.scope.Value);\n\n        default:\n            this.error('Number of function is expected');\n    }\n}\n\nexport const name = 'Ratio';\nexport const structure = {\n    left: ['Number', 'Function'],\n    right: ['Number', 'Function', null]\n};\n\n// <number [0,∞]> [ / <number [0,∞]> ]?\nexport function parse() {\n    const start = this.tokenStart;\n    const left = consumeTerm.call(this);\n    let right = null;\n\n    this.skipSC();\n    if (this.isDelim(SOLIDUS)) {\n        this.eatDelim(SOLIDUS);\n        right = consumeTerm.call(this);\n    }\n\n    return {\n        type: 'Ratio',\n        loc: this.getLocation(start, this.tokenStart),\n        left,\n        right\n    };\n}\n\nexport function generate(node) {\n    this.node(node.left);\n    this.token(Delim, '/');\n    if (node.right) {\n        this.node(node.right);\n    } else {\n        this.node(NumberToken, 1);\n    }\n}\n","import { WhiteSpace } from '../../tokenizer/index.js';\n\nfunction getOffsetExcludeWS() {\n    if (this.tokenIndex > 0) {\n        if (this.lookupType(-1) === WhiteSpace) {\n            return this.tokenIndex > 1\n                ? this.getTokenStart(this.tokenIndex - 1)\n                : this.firstCharOffset;\n        }\n    }\n\n    return this.tokenStart;\n}\n\nexport const name = 'Raw';\nexport const structure = {\n    value: String\n};\n\nexport function parse(consumeUntil, excludeWhiteSpace) {\n    const startOffset = this.getTokenStart(this.tokenIndex);\n    let endOffset;\n\n    this.skipUntilBalanced(this.tokenIndex, consumeUntil || this.consumeUntilBalanceEnd);\n\n    if (excludeWhiteSpace && this.tokenStart > startOffset) {\n        endOffset = getOffsetExcludeWS.call(this);\n    } else {\n        endOffset = this.tokenStart;\n    }\n\n    return {\n        type: 'Raw',\n        loc: this.getLocation(startOffset, endOffset),\n        value: this.substring(startOffset, endOffset)\n    };\n}\n\nexport function generate(node) {\n    this.tokenize(node.value);\n}\n","import { LeftCurlyBracket } from '../../tokenizer/index.js';\n\nfunction consumeRaw() {\n    return this.Raw(this.consumeUntilLeftCurlyBracket, true);\n}\n\nfunction consumePrelude() {\n    const prelude = this.SelectorList();\n\n    if (prelude.type !== 'Raw' &&\n        this.eof === false &&\n        this.tokenType !== LeftCurlyBracket) {\n        this.error();\n    }\n\n    return prelude;\n}\n\nexport const name = 'Rule';\nexport const walkContext = 'rule';\nexport const structure = {\n    prelude: ['SelectorList', 'Raw'],\n    block: ['Block']\n};\n\nexport function parse() {\n    const startToken = this.tokenIndex;\n    const startOffset = this.tokenStart;\n    let prelude;\n    let block;\n\n    if (this.parseRulePrelude) {\n        prelude = this.parseWithFallback(consumePrelude, consumeRaw);\n    } else {\n        prelude = consumeRaw.call(this, startToken);\n    }\n\n    block = this.Block(true);\n\n    return {\n        type: 'Rule',\n        loc: this.getLocation(startOffset, this.tokenStart),\n        prelude,\n        block\n    };\n}\nexport function generate(node) {\n    this.node(node.prelude);\n    this.node(node.block);\n}\n\n","import {\n    Ident,\n    LeftParenthesis,\n    RightParenthesis\n} from '../../tokenizer/index.js';\n\nexport const name = 'Scope';\nexport const structure = {\n    root: ['SelectorList', 'Raw', null],\n    limit: ['SelectorList', 'Raw', null]\n};\n\nexport function parse() {\n    let root = null;\n    let limit = null;\n\n    this.skipSC();\n\n    const startOffset = this.tokenStart;\n    if (this.tokenType === LeftParenthesis) {\n        this.next();\n        this.skipSC();\n        root = this.parseWithFallback(\n            this.SelectorList,\n            () => this.Raw(false, true)\n        );\n        this.skipSC();\n        this.eat(RightParenthesis);\n    }\n\n    if (this.lookupNonWSType(0) === Ident) {\n        this.skipSC();\n        this.eatIdent('to');\n        this.skipSC();\n        this.eat(LeftParenthesis);\n        this.skipSC();\n        limit = this.parseWithFallback(\n            this.SelectorList,\n            () => this.Raw(false, true)\n        );\n        this.skipSC();\n        this.eat(RightParenthesis);\n    }\n\n    return {\n        type: 'Scope',\n        loc: this.getLocation(startOffset, this.tokenStart),\n        root,\n        limit\n    };\n}\n\nexport function generate(node) {\n    if (node.root) {\n        this.token(LeftParenthesis, '(');\n        this.node(node.root);\n        this.token(RightParenthesis, ')');\n    }\n\n    if (node.limit) {\n        this.token(Ident, 'to');\n        this.token(LeftParenthesis, '(');\n        this.node(node.limit);\n        this.token(RightParenthesis, ')');\n    }\n}\n","export const name = 'Selector';\nexport const structure = {\n    children: [[\n        'TypeSelector',\n        'IdSelector',\n        'ClassSelector',\n        'AttributeSelector',\n        'PseudoClassSelector',\n        'PseudoElementSelector',\n        'Combinator'\n    ]]\n};\n\nexport function parse() {\n    const children = this.readSequence(this.scope.Selector);\n\n    // nothing were consumed\n    if (this.getFirstListNode(children) === null) {\n        this.error('Selector is expected');\n    }\n\n    return {\n        type: 'Selector',\n        loc: this.getLocationFromList(children),\n        children\n    };\n}\n\nexport function generate(node) {\n    this.children(node);\n}\n","import { Comma } from '../../tokenizer/index.js';\n\nexport const name = 'SelectorList';\nexport const walkContext = 'selector';\nexport const structure = {\n    children: [[\n        'Selector',\n        'Raw'\n    ]]\n};\n\nexport function parse() {\n    const children = this.createList();\n\n    while (!this.eof) {\n        children.push(this.Selector());\n\n        if (this.tokenType === Comma) {\n            this.next();\n            continue;\n        }\n\n        break;\n    }\n\n    return {\n        type: 'SelectorList',\n        loc: this.getLocationFromList(children),\n        children\n    };\n}\n\nexport function generate(node) {\n    this.children(node, () => this.token(Comma, ','));\n}\n","import {\n    isHexDigit,\n    isWhiteSpace,\n    isValidEscape,\n    consumeEscaped,\n    decodeEscaped\n} from '../tokenizer/index.js';\n\nconst REVERSE_SOLIDUS = 0x005c; // U+005C REVERSE SOLIDUS (\\)\nconst QUOTATION_MARK = 0x0022;  // \"\nconst APOSTROPHE = 0x0027;      // '\n\nexport function decode(str) {\n    const len = str.length;\n    const firstChar = str.charCodeAt(0);\n    const start = firstChar === QUOTATION_MARK || firstChar === APOSTROPHE ? 1 : 0;\n    const end = start === 1 && len > 1 && str.charCodeAt(len - 1) === firstChar ? len - 2 : len - 1;\n    let decoded = '';\n\n    for (let i = start; i <= end; i++) {\n        let code = str.charCodeAt(i);\n\n        if (code === REVERSE_SOLIDUS) {\n            // special case at the ending\n            if (i === end) {\n                // if the next input code point is EOF, do nothing\n                // otherwise include last quote as escaped\n                if (i !== len - 1) {\n                    decoded = str.substr(i + 1);\n                }\n                break;\n            }\n\n            code = str.charCodeAt(++i);\n\n            // consume escaped\n            if (isValidEscape(REVERSE_SOLIDUS, code)) {\n                const escapeStart = i - 1;\n                const escapeEnd = consumeEscaped(str, escapeStart);\n\n                i = escapeEnd - 1;\n                decoded += decodeEscaped(str.substring(escapeStart + 1, escapeEnd));\n            } else {\n                // \\r\\n\n                if (code === 0x000d && str.charCodeAt(i + 1) === 0x000a) {\n                    i++;\n                }\n            }\n        } else {\n            decoded += str[i];\n        }\n    }\n\n    return decoded;\n}\n\n// https://drafts.csswg.org/cssom/#serialize-a-string\n// § 2.1. Common Serializing Idioms\nexport function encode(str, apostrophe) {\n    const quote = apostrophe ? '\\'' : '\"';\n    const quoteCode = apostrophe ? APOSTROPHE : QUOTATION_MARK;\n    let encoded = '';\n    let wsBeforeHexIsNeeded = false;\n\n    for (let i = 0; i < str.length; i++) {\n        const code = str.charCodeAt(i);\n\n        // If the character is NULL (U+0000), then the REPLACEMENT CHARACTER (U+FFFD).\n        if (code === 0x0000) {\n            encoded += '\\uFFFD';\n            continue;\n        }\n\n        // If the character is in the range [\\1-\\1f] (U+0001 to U+001F) or is U+007F,\n        // the character escaped as code point.\n        // Note: Do not compare with 0x0001 since 0x0000 is precessed before\n        if (code <= 0x001f || code === 0x007F) {\n            encoded += '\\\\' + code.toString(16);\n            wsBeforeHexIsNeeded = true;\n            continue;\n        }\n\n        // If the character is '\"' (U+0022) or \"\\\" (U+005C), the escaped character.\n        if (code === quoteCode || code === REVERSE_SOLIDUS) {\n            encoded += '\\\\' + str.charAt(i);\n            wsBeforeHexIsNeeded = false;\n        } else {\n            if (wsBeforeHexIsNeeded && (isHexDigit(code) || isWhiteSpace(code))) {\n                encoded += ' ';\n            }\n\n            // Otherwise, the character itself.\n            encoded += str.charAt(i);\n            wsBeforeHexIsNeeded = false;\n        }\n    }\n\n    return quote + encoded + quote;\n}\n","import { String as StringToken } from '../../tokenizer/index.js';\nimport { decode, encode } from '../../utils/string.js';\n\nexport const name = 'String';\nexport const structure = {\n    value: String\n};\n\nexport function parse() {\n    return {\n        type: 'String',\n        loc: this.getLocation(this.tokenStart, this.tokenEnd),\n        value: decode(this.consume(StringToken))\n    };\n}\n\nexport function generate(node) {\n    this.token(StringToken, encode(node.value));\n}\n","import {\n    WhiteSpace,\n    Comment,\n    AtKeyword,\n    CDO,\n    CDC\n} from '../../tokenizer/index.js';\n\nconst EXCLAMATIONMARK = 0x0021; // U+0021 EXCLAMATION MARK (!)\n\nfunction consumeRaw() {\n    return this.Raw(null, false);\n}\n\nexport const name = 'StyleSheet';\nexport const walkContext = 'stylesheet';\nexport const structure = {\n    children: [[\n        'Comment',\n        'CDO',\n        'CDC',\n        'Atrule',\n        'Rule',\n        'Raw'\n    ]]\n};\n\nexport function parse() {\n    const start = this.tokenStart;\n    const children = this.createList();\n    let child;\n\n    scan:\n    while (!this.eof) {\n        switch (this.tokenType) {\n            case WhiteSpace:\n                this.next();\n                continue;\n\n            case Comment:\n                // ignore comments except exclamation comments (i.e. /*! .. */) on top level\n                if (this.charCodeAt(this.tokenStart + 2) !== EXCLAMATIONMARK) {\n                    this.next();\n                    continue;\n                }\n\n                child = this.Comment();\n                break;\n\n            case CDO: // <!--\n                child = this.CDO();\n                break;\n\n            case CDC: // -->\n                child = this.CDC();\n                break;\n\n            // CSS Syntax Module Level 3\n            // §2.2 Error handling\n            // At the \"top level\" of a stylesheet, an <at-keyword-token> starts an at-rule.\n            case AtKeyword:\n                child = this.parseWithFallback(this.Atrule, consumeRaw);\n                break;\n\n            // Anything else starts a qualified rule ...\n            default:\n                child = this.parseWithFallback(this.Rule, consumeRaw);\n        }\n\n        children.push(child);\n    }\n\n    return {\n        type: 'StyleSheet',\n        loc: this.getLocation(start, this.tokenStart),\n        children\n    };\n}\n\nexport function generate(node) {\n    this.children(node);\n}\n","import {\n    LeftParenthesis,\n    RightParenthesis\n} from '../../tokenizer/index.js';\n\nexport const name = 'SupportsDeclaration';\nexport const structure = {\n    declaration: 'Declaration'\n};\n\nexport function parse() {\n    const start = this.tokenStart;\n\n    this.eat(LeftParenthesis);\n    this.skipSC();\n\n    const declaration = this.Declaration();\n\n    if (!this.eof) {\n        this.eat(RightParenthesis);\n    }\n\n    return {\n        type: 'SupportsDeclaration',\n        loc: this.getLocation(start, this.tokenStart),\n        declaration\n    };\n}\n\nexport function generate(node) {\n    this.token(LeftParenthesis, '(');\n    this.node(node.declaration);\n    this.token(RightParenthesis, ')');\n}\n","import { Ident } from '../../tokenizer/index.js';\n\nconst ASTERISK = 0x002A;     // U+002A ASTERISK (*)\nconst VERTICALLINE = 0x007C; // U+007C VERTICAL LINE (|)\n\nfunction eatIdentifierOrAsterisk() {\n    if (this.tokenType !== Ident &&\n        this.isDelim(ASTERISK) === false) {\n        this.error('Identifier or asterisk is expected');\n    }\n\n    this.next();\n}\n\nexport const name = 'TypeSelector';\nexport const structure = {\n    name: String\n};\n\n// ident\n// ident|ident\n// ident|*\n// *\n// *|ident\n// *|*\n// |ident\n// |*\nexport function parse() {\n    const start = this.tokenStart;\n\n    if (this.isDelim(VERTICALLINE)) {\n        this.next();\n        eatIdentifierOrAsterisk.call(this);\n    } else {\n        eatIdentifierOrAsterisk.call(this);\n\n        if (this.isDelim(VERTICALLINE)) {\n            this.next();\n            eatIdentifierOrAsterisk.call(this);\n        }\n    }\n\n    return {\n        type: 'TypeSelector',\n        loc: this.getLocation(start, this.tokenStart),\n        name: this.substrToCursor(start)\n    };\n}\n\nexport function generate(node) {\n    this.tokenize(node.name);\n}\n","import {\n    isHexDigit,\n    Ident,\n    Number,\n    Dimension\n} from '../../tokenizer/index.js';\n\nconst PLUSSIGN = 0x002B;     // U+002B PLUS SIGN (+)\nconst HYPHENMINUS = 0x002D;  // U+002D HYPHEN-MINUS (-)\nconst QUESTIONMARK = 0x003F; // U+003F QUESTION MARK (?)\n\nfunction eatHexSequence(offset, allowDash) {\n    let len = 0;\n\n    for (let pos = this.tokenStart + offset; pos < this.tokenEnd; pos++) {\n        const code = this.charCodeAt(pos);\n\n        if (code === HYPHENMINUS && allowDash && len !== 0) {\n            eatHexSequence.call(this, offset + len + 1, false);\n            return -1;\n        }\n\n        if (!isHexDigit(code)) {\n            this.error(\n                allowDash && len !== 0\n                    ? 'Hyphen minus' + (len < 6 ? ' or hex digit' : '') + ' is expected'\n                    : (len < 6 ? 'Hex digit is expected' : 'Unexpected input'),\n                pos\n            );\n        }\n\n        if (++len > 6) {\n            this.error('Too many hex digits', pos);\n        };\n    }\n\n    this.next();\n    return len;\n}\n\nfunction eatQuestionMarkSequence(max) {\n    let count = 0;\n\n    while (this.isDelim(QUESTIONMARK)) {\n        if (++count > max) {\n            this.error('Too many question marks');\n        }\n\n        this.next();\n    }\n}\n\nfunction startsWith(code) {\n    if (this.charCodeAt(this.tokenStart) !== code) {\n        this.error((code === PLUSSIGN ? 'Plus sign' : 'Hyphen minus') + ' is expected');\n    }\n}\n\n// https://drafts.csswg.org/css-syntax/#urange\n// Informally, the <urange> production has three forms:\n// U+0001\n//      Defines a range consisting of a single code point, in this case the code point \"1\".\n// U+0001-00ff\n//      Defines a range of codepoints between the first and the second value, in this case\n//      the range between \"1\" and \"ff\" (255 in decimal) inclusive.\n// U+00??\n//      Defines a range of codepoints where the \"?\" characters range over all hex digits,\n//      in this case defining the same as the value U+0000-00ff.\n// In each form, a maximum of 6 digits is allowed for each hexadecimal number (if you treat \"?\" as a hexadecimal digit).\n//\n// <urange> =\n//   u '+' <ident-token> '?'* |\n//   u <dimension-token> '?'* |\n//   u <number-token> '?'* |\n//   u <number-token> <dimension-token> |\n//   u <number-token> <number-token> |\n//   u '+' '?'+\nfunction scanUnicodeRange() {\n    let hexLength = 0;\n\n    switch (this.tokenType) {\n        case Number:\n            // u <number-token> '?'*\n            // u <number-token> <dimension-token>\n            // u <number-token> <number-token>\n            hexLength = eatHexSequence.call(this, 1, true);\n\n            if (this.isDelim(QUESTIONMARK)) {\n                eatQuestionMarkSequence.call(this, 6 - hexLength);\n                break;\n            }\n\n            if (this.tokenType === Dimension ||\n                this.tokenType === Number) {\n                startsWith.call(this, HYPHENMINUS);\n                eatHexSequence.call(this, 1, false);\n                break;\n            }\n\n            break;\n\n        case Dimension:\n            // u <dimension-token> '?'*\n            hexLength = eatHexSequence.call(this, 1, true);\n\n            if (hexLength > 0) {\n                eatQuestionMarkSequence.call(this, 6 - hexLength);\n            }\n\n            break;\n\n        default:\n            // u '+' <ident-token> '?'*\n            // u '+' '?'+\n            this.eatDelim(PLUSSIGN);\n\n            if (this.tokenType === Ident) {\n                hexLength = eatHexSequence.call(this, 0, true);\n                if (hexLength > 0) {\n                    eatQuestionMarkSequence.call(this, 6 - hexLength);\n                }\n                break;\n            }\n\n            if (this.isDelim(QUESTIONMARK)) {\n                this.next();\n                eatQuestionMarkSequence.call(this, 5);\n                break;\n            }\n\n            this.error('Hex digit or question mark is expected');\n    }\n}\n\nexport const name = 'UnicodeRange';\nexport const structure = {\n    value: String\n};\n\nexport function parse() {\n    const start = this.tokenStart;\n\n    // U or u\n    this.eatIdent('u');\n    scanUnicodeRange.call(this);\n\n    return {\n        type: 'UnicodeRange',\n        loc: this.getLocation(start, this.tokenStart),\n        value: this.substrToCursor(start)\n    };\n}\n\nexport function generate(node) {\n    this.tokenize(node.value);\n}\n","import {\n    isHexDigit,\n    isWhiteSpace,\n    isValidEscape,\n    consumeEscaped,\n    decodeEscaped\n} from '../tokenizer/index.js';\n\nconst SPACE = 0x0020;            // U+0020 SPACE\nconst REVERSE_SOLIDUS = 0x005c;  // U+005C REVERSE SOLIDUS (\\)\nconst QUOTATION_MARK = 0x0022;   // \"\nconst APOSTROPHE = 0x0027;       // '\nconst LEFTPARENTHESIS = 0x0028;  // U+0028 LEFT PARENTHESIS (()\nconst RIGHTPARENTHESIS = 0x0029; // U+0029 RIGHT PARENTHESIS ())\n\nexport function decode(str) {\n    const len = str.length;\n    let start = 4; // length of \"url(\"\n    let end = str.charCodeAt(len - 1) === RIGHTPARENTHESIS ? len - 2 : len - 1;\n    let decoded = '';\n\n    while (start < end && isWhiteSpace(str.charCodeAt(start))) {\n        start++;\n    }\n\n    while (start < end && isWhiteSpace(str.charCodeAt(end))) {\n        end--;\n    }\n\n    for (let i = start; i <= end; i++) {\n        let code = str.charCodeAt(i);\n\n        if (code === REVERSE_SOLIDUS) {\n            // special case at the ending\n            if (i === end) {\n                // if the next input code point is EOF, do nothing\n                // otherwise include last left parenthesis as escaped\n                if (i !== len - 1) {\n                    decoded = str.substr(i + 1);\n                }\n                break;\n            }\n\n            code = str.charCodeAt(++i);\n\n            // consume escaped\n            if (isValidEscape(REVERSE_SOLIDUS, code)) {\n                const escapeStart = i - 1;\n                const escapeEnd = consumeEscaped(str, escapeStart);\n\n                i = escapeEnd - 1;\n                decoded += decodeEscaped(str.substring(escapeStart + 1, escapeEnd));\n            } else {\n                // \\r\\n\n                if (code === 0x000d && str.charCodeAt(i + 1) === 0x000a) {\n                    i++;\n                }\n            }\n        } else {\n            decoded += str[i];\n        }\n    }\n\n    return decoded;\n}\n\nexport function encode(str) {\n    let encoded = '';\n    let wsBeforeHexIsNeeded = false;\n\n    for (let i = 0; i < str.length; i++) {\n        const code = str.charCodeAt(i);\n\n        // If the character is NULL (U+0000), then the REPLACEMENT CHARACTER (U+FFFD).\n        if (code === 0x0000) {\n            encoded += '\\uFFFD';\n            continue;\n        }\n\n        // If the character is in the range [\\1-\\1f] (U+0001 to U+001F) or is U+007F,\n        // the character escaped as code point.\n        // Note: Do not compare with 0x0001 since 0x0000 is precessed before\n        if (code <= 0x001f || code === 0x007F) {\n            encoded += '\\\\' + code.toString(16);\n            wsBeforeHexIsNeeded = true;\n            continue;\n        }\n\n        if (code === SPACE ||\n            code === REVERSE_SOLIDUS ||\n            code === QUOTATION_MARK ||\n            code === APOSTROPHE ||\n            code === LEFTPARENTHESIS ||\n            code === RIGHTPARENTHESIS) {\n            encoded += '\\\\' + str.charAt(i);\n            wsBeforeHexIsNeeded = false;\n        } else {\n            if (wsBeforeHexIsNeeded && isHexDigit(code)) {\n                encoded += ' ';\n            }\n\n            encoded += str.charAt(i);\n            wsBeforeHexIsNeeded = false;\n        }\n    }\n\n    return 'url(' + encoded + ')';\n}\n","import * as url from '../../utils/url.js';\nimport * as string from '../../utils/string.js';\nimport {\n    Function as FunctionToken,\n    String as StringToken,\n    Url,\n    RightParenthesis\n} from '../../tokenizer/index.js';\n\nexport const name = 'Url';\nexport const structure = {\n    value: String\n};\n\n// <url-token> | <function-token> <string> )\nexport function parse() {\n    const start = this.tokenStart;\n    let value;\n\n    switch (this.tokenType) {\n        case Url:\n            value = url.decode(this.consume(Url));\n            break;\n\n        case FunctionToken:\n            if (!this.cmpStr(this.tokenStart, this.tokenEnd, 'url(')) {\n                this.error('Function name must be `url`');\n            }\n\n            this.eat(FunctionToken);\n            this.skipSC();\n            value = string.decode(this.consume(StringToken));\n            this.skipSC();\n            if (!this.eof) {\n                this.eat(RightParenthesis);\n            }\n            break;\n\n        default:\n            this.error('Url or Function is expected');\n    }\n\n    return {\n        type: 'Url',\n        loc: this.getLocation(start, this.tokenStart),\n        value\n    };\n}\n\nexport function generate(node) {\n    this.token(Url, url.encode(node.value));\n}\n","export const name = 'Value';\nexport const structure = {\n    children: [[]]\n};\n\nexport function parse() {\n    const start = this.tokenStart;\n    const children = this.readSequence(this.scope.Value);\n\n    return {\n        type: 'Value',\n        loc: this.getLocation(start, this.tokenStart),\n        children\n    };\n}\n\nexport function generate(node) {\n    this.children(node);\n}\n","import { WhiteSpace } from '../../tokenizer/index.js';\n\nconst SPACE = Object.freeze({\n    type: 'WhiteSpace',\n    loc: null,\n    value: ' '\n});\n\nexport const name = 'WhiteSpace';\nexport const structure = {\n    value: String\n};\n\nexport function parse() {\n    this.eat(WhiteSpace);\n    return SPACE;\n\n    // return {\n    //     type: 'WhiteSpace',\n    //     loc: this.getLocation(this.tokenStart, this.tokenEnd),\n    //     value: this.consume(WHITESPACE)\n    // };\n}\n\nexport function generate(node) {\n    this.token(WhiteSpace, node.value);\n}\n","export * as AnPlusB from './AnPlusB.js';\nexport * as Atrule from './Atrule.js';\nexport * as AtrulePrelude from './AtrulePrelude.js';\nexport * as AttributeSelector from './AttributeSelector.js';\nexport * as Block from './Block.js';\nexport * as Brackets from './Brackets.js';\nexport * as CDC from './CDC.js';\nexport * as CDO from './CDO.js';\nexport * as ClassSelector from './ClassSelector.js';\nexport * as Combinator from './Combinator.js';\nexport * as Comment from './Comment.js';\nexport * as Condition from './Condition.js';\nexport * as Declaration from './Declaration.js';\nexport * as DeclarationList from './DeclarationList.js';\nexport * as Dimension from './Dimension.js';\nexport * as Feature from './Feature.js';\nexport * as FeatureFunction from './FeatureFunction.js';\nexport * as FeatureRange from './FeatureRange.js';\nexport * as Function from './Function.js';\nexport * as GeneralEnclosed from './GeneralEnclosed.js';\nexport * as Hash from './Hash.js';\nexport * as Identifier from './Identifier.js';\nexport * as IdSelector from './IdSelector.js';\nexport * as Layer from './Layer.js';\nexport * as LayerList from './LayerList.js';\nexport * as MediaQuery from './MediaQuery.js';\nexport * as MediaQueryList from './MediaQueryList.js';\nexport * as NestingSelector from './NestingSelector.js';\nexport * as Nth from './Nth.js';\nexport * as Number from './Number.js';\nexport * as Operator from './Operator.js';\nexport * as Parentheses from './Parentheses.js';\nexport * as Percentage from './Percentage.js';\nexport * as PseudoClassSelector from './PseudoClassSelector.js';\nexport * as PseudoElementSelector from './PseudoElementSelector.js';\nexport * as Ratio from './Ratio.js';\nexport * as Raw from './Raw.js';\nexport * as Rule from './Rule.js';\nexport * as Scope from './Scope.js';\nexport * as Selector from './Selector.js';\nexport * as SelectorList from './SelectorList.js';\nexport * as String from './String.js';\nexport * as StyleSheet from './StyleSheet.js';\nexport * as SupportsDeclaration from './SupportsDeclaration.js';\nexport * as TypeSelector from './TypeSelector.js';\nexport * as UnicodeRange from './UnicodeRange.js';\nexport * as Url from './Url.js';\nexport * as Value from './Value.js';\nexport * as WhiteSpace from './WhiteSpace.js';\n","import { cssWideKeywords } from '../../lexer/generic-const.js';\nimport definitions from '../../data.js';\nimport * as node from '../node/index.js';\n\nexport default {\n    generic: true,\n    cssWideKeywords,\n    ...definitions,\n    node\n};\n","import {\n    Ident,\n    String as StringToken,\n    Number as NumberToken,\n    Function as FunctionToken,\n    Url,\n    Hash,\n    Dimension,\n    Percentage,\n    LeftParenthesis,\n    LeftSquareBracket,\n    Comma,\n    Delim\n} from '../../tokenizer/index.js';\n\nconst NUMBERSIGN = 0x0023;  // U+0023 NUMBER SIGN (#)\nconst ASTERISK = 0x002A;    // U+002A ASTERISK (*)\nconst PLUSSIGN = 0x002B;    // U+002B PLUS SIGN (+)\nconst HYPHENMINUS = 0x002D; // U+002D HYPHEN-MINUS (-)\nconst SOLIDUS = 0x002F;     // U+002F SOLIDUS (/)\nconst U = 0x0075;           // U+0075 LATIN SMALL LETTER U (u)\n\nexport default function defaultRecognizer(context) {\n    switch (this.tokenType) {\n        case Hash:\n            return this.Hash();\n\n        case Comma:\n            return this.Operator();\n\n        case LeftParenthesis:\n            return this.Parentheses(this.readSequence, context.recognizer);\n\n        case LeftSquareBracket:\n            return this.Brackets(this.readSequence, context.recognizer);\n\n        case StringToken:\n            return this.String();\n\n        case Dimension:\n            return this.Dimension();\n\n        case Percentage:\n            return this.Percentage();\n\n        case NumberToken:\n            return this.Number();\n\n        case FunctionToken:\n            return this.cmpStr(this.tokenStart, this.tokenEnd, 'url(')\n                ? this.Url()\n                : this.Function(this.readSequence, context.recognizer);\n\n        case Url:\n            return this.Url();\n\n        case Ident:\n            // check for unicode range, it should start with u+ or U+\n            if (this.cmpChar(this.tokenStart, U) &&\n                this.cmpChar(this.tokenStart + 1, PLUSSIGN)) {\n                return this.UnicodeRange();\n            } else {\n                return this.Identifier();\n            }\n\n        case Delim: {\n            const code = this.charCodeAt(this.tokenStart);\n\n            if (code === SOLIDUS ||\n                code === ASTERISK ||\n                code === PLUSSIGN ||\n                code === HYPHENMINUS) {\n                return this.Operator(); // TODO: replace with Delim\n            }\n\n            // TODO: produce a node with Delim node type\n\n            if (code === NUMBERSIGN) {\n                this.error('Hex or identifier is expected', this.tokenStart + 1);\n            }\n\n            break;\n        }\n    }\n};\n","import getNode from './default.js';\n\nexport default {\n    getNode\n};\n","import {\n    Delim,\n    Ident,\n    Dimension,\n    Percentage,\n    Number as NumberToken,\n    Hash,\n    Colon,\n    LeftSquareBracket\n} from '../../tokenizer/index.js';\n\nconst NUMBERSIGN = 0x0023;      // U+0023 NUMBER SIGN (#)\nconst AMPERSAND = 0x0026;       // U+0026 AMPERSAND (&)\nconst ASTERISK = 0x002A;        // U+002A ASTERISK (*)\nconst PLUSSIGN = 0x002B;        // U+002B PLUS SIGN (+)\nconst SOLIDUS = 0x002F;         // U+002F SOLIDUS (/)\nconst FULLSTOP = 0x002E;        // U+002E FULL STOP (.)\nconst GREATERTHANSIGN = 0x003E; // U+003E GREATER-THAN SIGN (>)\nconst VERTICALLINE = 0x007C;    // U+007C VERTICAL LINE (|)\nconst TILDE = 0x007E;           // U+007E TILDE (~)\n\nfunction onWhiteSpace(next, children) {\n    if (children.last !== null && children.last.type !== 'Combinator' &&\n        next !== null && next.type !== 'Combinator') {\n        children.push({  // FIXME: this.Combinator() should be used instead\n            type: 'Combinator',\n            loc: null,\n            name: ' '\n        });\n    }\n}\n\nfunction getNode() {\n    switch (this.tokenType) {\n        case LeftSquareBracket:\n            return this.AttributeSelector();\n\n        case Hash:\n            return this.IdSelector();\n\n        case Colon:\n            if (this.lookupType(1) === Colon) {\n                return this.PseudoElementSelector();\n            } else {\n                return this.PseudoClassSelector();\n            }\n\n        case Ident:\n            return this.TypeSelector();\n\n        case NumberToken:\n        case Percentage:\n            return this.Percentage();\n\n        case Dimension:\n            // throws when .123ident\n            if (this.charCodeAt(this.tokenStart) === FULLSTOP) {\n                this.error('Identifier is expected', this.tokenStart + 1);\n            }\n            break;\n\n        case Delim: {\n            const code = this.charCodeAt(this.tokenStart);\n\n            switch (code) {\n                case PLUSSIGN:\n                case GREATERTHANSIGN:\n                case TILDE:\n                case SOLIDUS:  // /deep/\n                    return this.Combinator();\n\n                case FULLSTOP:\n                    return this.ClassSelector();\n\n                case ASTERISK:\n                case VERTICALLINE:\n                    return this.TypeSelector();\n\n                case NUMBERSIGN:\n                    return this.IdSelector();\n\n                case AMPERSAND:\n                    return this.NestingSelector();\n            }\n\n            break;\n        }\n    }\n};\n\nexport default {\n    onWhiteSpace,\n    getNode\n};\n","// legacy IE function\n// expression( <any-value> )\nexport default function() {\n    return this.createSingleNodeList(\n        this.Raw(null, false)\n    );\n}\n","import { Comma, WhiteSpace } from '../../tokenizer/index.js';\n\n// var( <ident> , <value>? )\nexport default function() {\n    const children = this.createList();\n\n    this.skipSC();\n\n    // NOTE: Don't check more than a first argument is an ident, rest checks are for lexer\n    children.push(this.Identifier());\n\n    this.skipSC();\n\n    if (this.tokenType === Comma) {\n        children.push(this.Operator());\n\n        const startIndex = this.tokenIndex;\n        const value = this.parseCustomProperty\n            ? this.Value(null)\n            : this.Raw(this.consumeUntilExclamationMarkOrSemicolon, false);\n\n        if (value.type === 'Value' && value.children.isEmpty) {\n            for (let offset = startIndex - this.tokenIndex; offset <= 0; offset++) {\n                if (this.lookupType(offset) === WhiteSpace) {\n                    value.children.appendData({\n                        type: 'WhiteSpace',\n                        loc: null,\n                        value: ' '\n                    });\n                    break;\n                }\n            }\n        }\n\n        children.push(value);\n    }\n\n    return children;\n};\n","import getNode from './default.js';\nimport expressionFn from '../function/expression.js';\nimport varFn from '../function/var.js';\n\nfunction isPlusMinusOperator(node) {\n    return (\n        node !== null &&\n        node.type === 'Operator' &&\n        (node.value[node.value.length - 1] === '-' || node.value[node.value.length - 1] === '+')\n    );\n}\n\nexport default {\n    getNode,\n    onWhiteSpace(next, children) {\n        if (isPlusMinusOperator(next)) {\n            next.value = ' ' + next.value;\n        }\n        if (isPlusMinusOperator(children.last)) {\n            children.last.value += ' ';\n        }\n    },\n    'expression': expressionFn,\n    'var': varFn\n};\n","export { default as AtrulePrelude } from './atrulePrelude.js';\nexport { default as Selector } from './selector.js';\nexport { default as Value } from './value.js';\n","import { Ident } from '../../tokenizer/index.js';\n\n// https://drafts.csswg.org/css-contain-3/#container-rule\n// The keywords `none`, `and`, `not`, and `or` are excluded from the <custom-ident> above.\nconst nonContainerNameKeywords = new Set(['none', 'and', 'not', 'or']);\n\nexport default {\n    parse: {\n        prelude() {\n            const children = this.createList();\n\n            if (this.tokenType === Ident) {\n                const name = this.substring(this.tokenStart, this.tokenEnd);\n\n                if (!nonContainerNameKeywords.has(name.toLowerCase())) {\n                    children.push(this.Identifier());\n                }\n            }\n\n            children.push(this.Condition('container'));\n\n            return children;\n        },\n        block(nested = false) {\n            return this.Block(nested);\n        }\n    }\n};\n","export default {\n    parse: {\n        prelude: null,\n        block() {\n            return this.Block(true);\n        }\n    }\n};\n","import {\n    String as StringToken,\n    Ident,\n    Url,\n    Function as FunctionToken,\n    LeftParenthesis,\n    RightParenthesis\n} from '../../tokenizer/index.js';\n\nfunction parseWithFallback(parse, fallback) {\n    return this.parseWithFallback(\n        () => {\n            try {\n                return parse.call(this);\n            } finally {\n                this.skipSC();\n                if (this.lookupNonWSType(0) !== RightParenthesis) {\n                    this.error();\n                }\n            }\n        },\n        fallback || (() => this.Raw(null, true))\n    );\n}\n\nconst parseFunctions = {\n    layer() {\n        this.skipSC();\n\n        const children = this.createList();\n        const node = parseWithFallback.call(this, this.Layer);\n\n        if (node.type !== 'Raw' || node.value !== '') {\n            children.push(node);\n        }\n\n        return children;\n    },\n    supports() {\n        this.skipSC();\n\n        const children = this.createList();\n        const node = parseWithFallback.call(\n            this,\n            this.Declaration,\n            () => parseWithFallback.call(this, () => this.Condition('supports'))\n        );\n\n        if (node.type !== 'Raw' || node.value !== '') {\n            children.push(node);\n        }\n\n        return children;\n    }\n};\n\nexport default {\n    parse: {\n        prelude() {\n            const children = this.createList();\n\n            switch (this.tokenType) {\n                case StringToken:\n                    children.push(this.String());\n                    break;\n\n                case Url:\n                case FunctionToken:\n                    children.push(this.Url());\n                    break;\n\n                default:\n                    this.error('String or url() is expected');\n            }\n\n            this.skipSC();\n\n            if (this.tokenType === Ident &&\n                this.cmpStr(this.tokenStart, this.tokenEnd, 'layer')) {\n                children.push(this.Identifier());\n            } else if (\n                this.tokenType === FunctionToken &&\n                this.cmpStr(this.tokenStart, this.tokenEnd, 'layer(')\n            ) {\n                children.push(this.Function(null, parseFunctions));\n            }\n\n            this.skipSC();\n\n            if (this.tokenType === FunctionToken &&\n                this.cmpStr(this.tokenStart, this.tokenEnd, 'supports(')) {\n                children.push(this.Function(null, parseFunctions));\n            }\n\n            if (this.lookupNonWSType(0) === Ident ||\n                this.lookupNonWSType(0) === LeftParenthesis) {\n                children.push(this.MediaQueryList());\n            }\n\n            return children;\n        },\n        block: null\n    }\n};\n","export default {\n    parse: {\n        prelude() {\n            return this.createSingleNodeList(\n                this.LayerList()\n            );\n        },\n        block() {\n            return this.Block(false);\n        }\n    }\n};\n","export default {\n    parse: {\n        prelude() {\n            return this.createSingleNodeList(\n                this.MediaQueryList()\n            );\n        },\n        block(nested = false) {\n            return this.Block(nested);\n        }\n    }\n};\n","export default {\n    parse: {\n        prelude() {\n            return this.createSingleNodeList(\n                this.SelectorList()\n            );\n        },\n        block() {\n            return this.Block(true);\n        }\n    }\n};\n","export default {\n    parse: {\n        prelude() {\n            return this.createSingleNodeList(\n                this.SelectorList()\n            );\n        },\n        block() {\n            return this.Block(true);\n        }\n    }\n};\n","export default {\n    parse: {\n        prelude() {\n            return this.createSingleNodeList(\n                this.Scope()\n            );\n        },\n        block(nested = false) {\n            return this.Block(nested);\n        }\n    }\n};\n","export default {\n    parse: {\n        prelude: null,\n        block(nested = false) {\n            return this.Block(nested);\n        }\n    }\n};\n","export default {\n    parse: {\n        prelude() {\n            return this.createSingleNodeList(\n                this.Condition('supports')\n            );\n        },\n        block(nested = false) {\n            return this.Block(nested);\n        }\n    }\n};\n","import container from './container.js';\nimport fontFace from './font-face.js';\nimport importAtrule from './import.js';\nimport layer from './layer.js';\nimport media from './media.js';\nimport nest from './nest.js';\nimport page from './page.js';\nimport scope from './scope.js';\nimport startingStyle from './starting-style.js';\nimport supports from './supports.js';\n\nexport default {\n    container,\n    'font-face': fontFace,\n    import: importAtrule,\n    layer,\n    media,\n    nest,\n    page,\n    scope,\n    'starting-style': startingStyle,\n    supports\n};\n","import { Comma, String as StringToken, Ident, RightParenthesis } from '../../tokenizer/index.js';\n\nexport function parseLanguageRangeList() {\n    const children = this.createList();\n\n    this.skipSC();\n\n    loop: while (!this.eof) {\n        switch (this.tokenType) {\n            case Ident:\n                children.push(this.Identifier());\n                break;\n\n            case StringToken:\n                children.push(this.String());\n                break;\n\n            case Comma:\n                children.push(this.Operator());\n                break;\n\n            case RightParenthesis:\n                break loop;\n\n            default:\n                this.error('Identifier, string or comma is expected');\n        }\n\n        this.skipSC();\n    }\n\n    return children;\n}\n","import { parseLanguageRangeList } from './lang.js';\n\nconst selectorList = {\n    parse() {\n        return this.createSingleNodeList(\n            this.SelectorList()\n        );\n    }\n};\n\nconst selector = {\n    parse() {\n        return this.createSingleNodeList(\n            this.Selector()\n        );\n    }\n};\n\nconst identList = {\n    parse() {\n        return this.createSingleNodeList(\n            this.Identifier()\n        );\n    }\n};\n\nconst langList = {\n    parse: parseLanguageRangeList\n};\n\nconst nth = {\n    parse() {\n        return this.createSingleNodeList(\n            this.Nth()\n        );\n    }\n};\n\nexport default {\n    'dir': identList,\n    'has': selectorList,\n    'lang': langList,\n    'matches': selectorList,\n    'is': selectorList,\n    '-moz-any': selectorList,\n    '-webkit-any': selectorList,\n    'where': selectorList,\n    'not': selectorList,\n    'nth-child': nth,\n    'nth-last-child': nth,\n    'nth-last-of-type': nth,\n    'nth-of-type': nth,\n    'slotted': selector,\n    'host': selector,\n    'host-context': selector\n};\n","export { parse as AnPlusB } from './AnPlusB.js';\nexport { parse as Atrule } from './Atrule.js';\nexport { parse as AtrulePrelude } from './AtrulePrelude.js';\nexport { parse as AttributeSelector } from './AttributeSelector.js';\nexport { parse as Block } from './Block.js';\nexport { parse as Brackets } from './Brackets.js';\nexport { parse as CDC } from './CDC.js';\nexport { parse as CDO } from './CDO.js';\nexport { parse as ClassSelector } from './ClassSelector.js';\nexport { parse as Combinator } from './Combinator.js';\nexport { parse as Comment } from './Comment.js';\nexport { parse as Condition } from './Condition.js';\nexport { parse as Declaration } from './Declaration.js';\nexport { parse as DeclarationList } from './DeclarationList.js';\nexport { parse as Dimension } from './Dimension.js';\nexport { parse as Feature } from './Feature.js';\nexport { parse as FeatureFunction } from './FeatureFunction.js';\nexport { parse as FeatureRange } from './FeatureRange.js';\nexport { parse as Function } from './Function.js';\nexport { parse as GeneralEnclosed } from './GeneralEnclosed.js';\nexport { parse as Hash } from './Hash.js';\nexport { parse as Identifier } from './Identifier.js';\nexport { parse as IdSelector } from './IdSelector.js';\nexport { parse as Layer } from './Layer.js';\nexport { parse as LayerList } from './LayerList.js';\nexport { parse as MediaQuery } from './MediaQuery.js';\nexport { parse as MediaQueryList } from './MediaQueryList.js';\nexport { parse as NestingSelector } from './NestingSelector.js';\nexport { parse as Nth } from './Nth.js';\nexport { parse as Number } from './Number.js';\nexport { parse as Operator } from './Operator.js';\nexport { parse as Parentheses } from './Parentheses.js';\nexport { parse as Percentage } from './Percentage.js';\nexport { parse as PseudoClassSelector } from './PseudoClassSelector.js';\nexport { parse as PseudoElementSelector } from './PseudoElementSelector.js';\nexport { parse as Ratio } from './Ratio.js';\nexport { parse as Raw } from './Raw.js';\nexport { parse as Rule } from './Rule.js';\nexport { parse as Scope } from './Scope.js';\nexport { parse as Selector } from './Selector.js';\nexport { parse as SelectorList } from './SelectorList.js';\nexport { parse as String } from './String.js';\nexport { parse as StyleSheet } from './StyleSheet.js';\nexport { parse as SupportsDeclaration } from './SupportsDeclaration.js';\nexport { parse as TypeSelector } from './TypeSelector.js';\nexport { parse as UnicodeRange } from './UnicodeRange.js';\nexport { parse as Url } from './Url.js';\nexport { parse as Value } from './Value.js';\nexport { parse as WhiteSpace } from './WhiteSpace.js';\n","import * as scope from '../scope/index.js';\nimport atrule from '../atrule/index.js';\nimport pseudo from '../pseudo/index.js';\nimport * as node from '../node/index-parse.js';\n\nexport default {\n    parseContext: {\n        default: 'StyleSheet',\n        stylesheet: 'StyleSheet',\n        atrule: 'Atrule',\n        atrulePrelude(options) {\n            return this.AtrulePrelude(options.atrule ? String(options.atrule) : null);\n        },\n        mediaQueryList: 'MediaQueryList',\n        mediaQuery: 'MediaQuery',\n        condition(options) {\n            return this.Condition(options.kind);\n        },\n        rule: 'Rule',\n        selectorList: 'SelectorList',\n        selector: 'Selector',\n        block() {\n            return this.Block(true);\n        },\n        declarationList: 'DeclarationList',\n        declaration: 'Declaration',\n        value: 'Value'\n    },\n    features: {\n        supports: {\n            selector() {\n                return this.Selector();\n            }\n        },\n        container: {\n            style() {\n                return this.Declaration();\n            }\n        }\n    },\n    scope,\n    atrule,\n    pseudo,\n    node\n};\n","import * as node from '../node/index.js';\n\nexport default {\n    node\n};\n","import createSyntax from './create.js';\nimport lexerConfig from './config/lexer.js';\nimport parserConfig from './config/parser.js';\nimport walkerConfig from './config/walker.js';\n\nexport default createSyntax({\n    ...lexerConfig,\n    ...parserConfig,\n    ...walkerConfig\n});\n","import { createRequire } from 'module';\n\nconst require = createRequire(import.meta.url);\n\nexport const { version } = require('../package.json');\n","import { List } from './List.js';\n\nexport function clone(node) {\n    const result = {};\n\n    for (const key of Object.keys(node)) {\n        let value = node[key];\n\n        if (value) {\n            if (Array.isArray(value) || value instanceof List) {\n                value = value.map(clone);\n            } else if (value.constructor === Object) {\n                value = clone(value);\n            }\n        }\n\n        result[key] = value;\n    }\n\n    return result;\n}\n","import syntax from './syntax/index.js';\n\nexport * from './version.js';\nexport { default as createSyntax } from './syntax/create.js';\nexport { List } from './utils/List.js';\nexport { Lexer } from './lexer/Lexer.js';\nexport { tokenTypes, tokenNames, TokenStream, OffsetToLocation } from './tokenizer/index.js';\nexport * as definitionSyntax from './definition-syntax/index.js';\nexport { clone } from './utils/clone.js';\nexport * from './utils/names.js';\nexport * as ident from './utils/ident.js';\nexport * as string from './utils/string.js';\nexport * as url from './utils/url.js';\nexport const {\n    tokenize,\n    parse,\n    generate,\n    lexer,\n    createLexer,\n\n    walk,\n    find,\n    findLast,\n    findAll,\n\n    toPlainObject,\n    fromPlainObject,\n\n    fork\n} = syntax;\n","import { find, type Rule } from 'css-tree';\n\nexport function isRuleInlinable(rule: Rule): boolean {\n  const hasAtRuleInside = find(rule, (node) => node.type === 'Atrule') !== null;\n\n  const hasPseudoSelector =\n    find(\n      rule,\n      (node) =>\n        node.type === 'PseudoClassSelector' ||\n        node.type === 'PseudoElementSelector',\n    ) !== null;\n\n  return !hasAtRuleInside && !hasPseudoSelector;\n}\n","import { type CssNode, find } from 'css-tree';\n\nexport function isPartInlinable(part: CssNode): boolean {\n  const hasAtRuleInside = find(part, (node) => node.type === 'Atrule') !== null;\n\n  const hasPseudoSelector =\n    find(\n      part,\n      (node) =>\n        node.type === 'PseudoClassSelector' ||\n        node.type === 'PseudoElementSelector',\n    ) !== null;\n\n  return !hasAtRuleInside && !hasPseudoSelector;\n}\n","import { type CssNode, clone, find, List, type Rule } from 'css-tree';\nimport { isPartInlinable } from './is-part-inlinable';\n\n/**\n * Split a rule into inlinable and non-inlinable parts. Caller must only pass rules\n * for which isRuleInlinable(rule) is false. Returns clones so the original stylesheet is never mutated.\n *\n * @returns inlinablePart: rule with only inlinable block children, or null if none.\n *          nonInlinablePart: rule with only non-inlinable block children, or null if none.\n */\nexport function splitMixedRule(rule: Rule): {\n  inlinablePart: Rule | null;\n  nonInlinablePart: Rule | null;\n} {\n  // If the selector itself contains pseudo-selectors, every declaration in the\n  // block only applies in that pseudo context — splitting would incorrectly\n  // inline them as base styles. Return the whole rule as non-inlinable.\n  const selectorHasPseudo =\n    rule.prelude !== null &&\n    find(\n      rule.prelude,\n      (node) =>\n        node.type === 'PseudoClassSelector' ||\n        node.type === 'PseudoElementSelector',\n    ) !== null;\n\n  if (selectorHasPseudo) {\n    return { inlinablePart: null, nonInlinablePart: clone(rule) as Rule };\n  }\n\n  const ruleCloneInlinable = clone(rule) as Rule;\n  const ruleCloneNonInlinable = clone(rule) as Rule;\n\n  const inlinableParts: CssNode[] = [];\n  const nonInlinableParts: CssNode[] = [];\n\n  for (const part of ruleCloneInlinable.block.children.toArray()) {\n    if (isPartInlinable(part)) {\n      inlinableParts.push(part);\n    } else {\n      nonInlinableParts.push(part);\n    }\n  }\n\n  const inlinablePart =\n    inlinableParts.length > 0\n      ? {\n          ...ruleCloneInlinable,\n          block: {\n            type: 'Block' as const,\n            children: new List<CssNode>().fromArray(inlinableParts),\n          },\n        }\n      : null;\n\n  const nonInlinablePart =\n    nonInlinableParts.length > 0\n      ? {\n          ...ruleCloneNonInlinable,\n          block: {\n            type: 'Block' as const,\n            children: new List<CssNode>().fromArray(nonInlinableParts),\n          },\n        }\n      : null;\n\n  return { inlinablePart, nonInlinablePart };\n}\n","import { type CssNode, type Rule, string, walk } from 'css-tree';\nimport { isRuleInlinable } from './is-rule-inlinable';\nimport { splitMixedRule } from './split-mixed-rule';\n\nexport function extractRulesPerClass(root: CssNode, classes: string[]) {\n  const classSet = new Set(classes);\n\n  const inlinableRules = new Map<string, Rule>();\n  const nonInlinableRules = new Map<string, Rule>();\n  walk(root, {\n    visit: 'Rule',\n    enter(rule) {\n      const selectorClasses: string[] = [];\n      walk(rule, {\n        visit: 'ClassSelector',\n        enter(classSelector) {\n          selectorClasses.push(string.decode(classSelector.name));\n        },\n      });\n      if (isRuleInlinable(rule)) {\n        for (const className of selectorClasses) {\n          if (classSet.has(className)) {\n            inlinableRules.set(className, rule);\n          }\n        }\n      } else {\n        const { inlinablePart, nonInlinablePart } = splitMixedRule(rule);\n        for (const className of selectorClasses) {\n          if (!classSet.has(className)) continue;\n          if (inlinablePart) {\n            inlinableRules.set(className, inlinablePart);\n          }\n          if (nonInlinablePart) {\n            nonInlinableRules.set(className, nonInlinablePart);\n          }\n        }\n      }\n    },\n  });\n  return {\n    inlinable: inlinableRules,\n    nonInlinable: nonInlinableRules,\n  };\n}\n","import { type CssNode, type Declaration, generate, walk } from 'css-tree';\n\nexport interface CustomProperty {\n  syntax?: Declaration;\n  inherits?: Declaration;\n  initialValue?: Declaration;\n}\n\nexport type CustomProperties = Map<string, CustomProperty>;\n\nexport function getCustomProperties(node: CssNode) {\n  const customProperties = new Map<string, CustomProperty>();\n\n  walk(node, {\n    visit: 'Atrule',\n    enter(atrule) {\n      if (atrule.name === 'property' && atrule.prelude) {\n        const prelude = generate(atrule.prelude);\n        if (prelude.startsWith('--')) {\n          let syntax: Declaration | undefined;\n          let inherits: Declaration | undefined;\n          let initialValue: Declaration | undefined;\n          walk(atrule, {\n            visit: 'Declaration',\n            enter(declaration) {\n              if (declaration.property === 'syntax') {\n                syntax = declaration;\n              }\n              if (declaration.property === 'inherits') {\n                inherits = declaration;\n              }\n              if (declaration.property === 'initial-value') {\n                initialValue = declaration;\n              }\n            },\n          });\n\n          customProperties.set(prelude, {\n            syntax,\n            inherits,\n            initialValue,\n          });\n        }\n      }\n    },\n  });\n\n  return customProperties;\n}\n","export const fromDashCaseToCamelCase = (text: string) => {\n  return text.replace(/-(\\w|$)/g, (_, p1: string) => p1.toUpperCase());\n};\n","import { fromDashCaseToCamelCase } from '../text/from-dash-case-to-camel-case';\n\nexport function getReactProperty(prop: string) {\n  const modifiedProp = prop.toLowerCase();\n\n  if (modifiedProp.startsWith('--')) {\n    return modifiedProp;\n  }\n\n  if (modifiedProp.startsWith('-ms-')) {\n    return fromDashCaseToCamelCase(modifiedProp.slice(1));\n  }\n\n  return fromDashCaseToCamelCase(modifiedProp);\n}\n","import type { Raw, Value } from 'css-tree';\n\nexport function unwrapValue(value: Value | Raw) {\n  if (value.type === 'Value' && value.children.size === 1) {\n    return value.children.first ?? value;\n  }\n\n  return value;\n}\n","import { type CssNode, type Declaration, generate, walk } from 'css-tree';\nimport { getReactProperty } from '../compatibility/get-react-property';\nimport type { CustomProperties } from './get-custom-properties';\nimport { unwrapValue } from './unwrap-value';\n\nexport function makeInlineStylesFor(\n  inlinableRules: CssNode[],\n  customProperties: CustomProperties,\n) {\n  const styles: Record<string, string> = {};\n\n  const localVariableDeclarations = new Map<string, Declaration>();\n  for (const rule of inlinableRules) {\n    walk(rule, {\n      visit: 'Declaration',\n      enter(declaration) {\n        if (declaration.property.startsWith('--')) {\n          localVariableDeclarations.set(declaration.property, declaration);\n        }\n      },\n    });\n  }\n\n  for (const rule of inlinableRules) {\n    walk(rule, {\n      visit: 'Function',\n      enter(func, funcParentListItem) {\n        if (func.name === 'var') {\n          let variableName: string | undefined;\n          walk(func, {\n            visit: 'Identifier',\n            enter(identifier) {\n              variableName = identifier.name;\n              return this.break;\n            },\n          });\n          if (variableName) {\n            const definition = localVariableDeclarations.get(variableName);\n            if (definition) {\n              funcParentListItem.data = unwrapValue(definition.value);\n            } else {\n              // For most variables tailwindcss defines, they also define a custom\n              // property for them with an initial value that we can inline here\n              const customProperty = customProperties.get(variableName);\n              if (customProperty?.initialValue) {\n                funcParentListItem.data = unwrapValue(\n                  customProperty.initialValue.value,\n                );\n              }\n            }\n          }\n        }\n      },\n    });\n\n    walk(rule, {\n      visit: 'Declaration',\n      enter(declaration) {\n        if (declaration.property.startsWith('--')) {\n          return;\n        }\n        styles[getReactProperty(declaration.property)] =\n          generate(declaration.value) +\n          (declaration.important ? '!important' : '');\n      },\n    });\n  }\n\n  return styles;\n}\n","import type { StyleSheet } from 'css-tree';\nimport { extractRulesPerClass } from './utils/css/extract-rules-per-class';\nimport { getCustomProperties } from './utils/css/get-custom-properties';\nimport { makeInlineStylesFor } from './utils/css/make-inline-styles-for';\n\nexport function inlineStyles(\n  styleSheet: StyleSheet,\n  classes: string[],\n): Record<string, string> {\n  const { inlinable: inlinableRules } = extractRulesPerClass(\n    styleSheet,\n    classes,\n  );\n\n  const customProperties = getCustomProperties(styleSheet);\n\n  return makeInlineStylesFor(\n    Array.from(inlinableRules.values()),\n    customProperties,\n  );\n}\n","import {\n  type CssNode,\n  type Declaration,\n  generate,\n  type List,\n  type ListItem,\n  parse,\n  type Raw,\n  type SelectorList,\n  type Value,\n  walk,\n} from 'css-tree';\n\ninterface VariableUse {\n  declaration: Declaration;\n  path: CssNode[];\n  fallback?: string;\n  variableName: string;\n  raw: string;\n}\n\nexport interface VariableDefinition {\n  declaration: Declaration;\n  path: CssNode[];\n  variableName: string;\n  definition: string;\n}\n\nfunction doSelectorsIntersect(\n  first: SelectorList | Raw,\n  second: SelectorList | Raw,\n): boolean {\n  const firstStringified = generate(first);\n  const secondStringified = generate(second);\n  if (firstStringified === secondStringified) {\n    return true;\n  }\n\n  let hasSomeUniversal = false;\n  const walker = (\n    node: CssNode,\n    _parentListItem: ListItem<CssNode>,\n    parentList: List<CssNode>,\n  ) => {\n    if (hasSomeUniversal) return;\n    if (node.type === 'PseudoClassSelector' && node.name === 'root') {\n      hasSomeUniversal = true;\n    }\n    if (\n      node.type === 'TypeSelector' &&\n      node.name === '*' &&\n      parentList.size === 1\n    ) {\n      hasSomeUniversal = true;\n    }\n  };\n  walk(first, walker);\n  walk(second, walker);\n\n  if (hasSomeUniversal) {\n    return true;\n  }\n\n  return false;\n}\n\nexport function resolveAllCssVariables(node: CssNode) {\n  const variableDefinitions = new Set<VariableDefinition>();\n  const variableUses = new Set<VariableUse>();\n\n  const path: CssNode[] = [];\n\n  walk(node, {\n    leave() {\n      path.shift();\n    },\n    enter(node: CssNode) {\n      if (node.type === 'Declaration') {\n        const declaration = node;\n        // Ignores @layer (properties) { ... } to avoid variable resolution conflicts\n        if (\n          path.some(\n            (ancestor) =>\n              ancestor.type === 'Atrule' &&\n              ancestor.name === 'layer' &&\n              ancestor.prelude !== null &&\n              generate(ancestor.prelude).includes('properties'),\n          )\n        ) {\n          path.unshift(node);\n          return;\n        }\n\n        if (/--[\\S]+/.test(declaration.property)) {\n          variableDefinitions.add({\n            declaration,\n            path: [...path],\n            variableName: declaration.property,\n            definition: generate(declaration.value),\n          });\n        } else {\n          function parseVariableUsesFrom(node: CssNode) {\n            walk(node, {\n              visit: 'Function',\n              enter(funcNode) {\n                if (funcNode.name === 'var') {\n                  const children = funcNode.children.toArray();\n                  const name = generate(children[0]);\n                  const fallback =\n                    // The second argument should be an \",\" Operator Node,\n                    // such that the actual fallback is only in the third argument\n                    children[2] ? generate(children[2]) : undefined;\n\n                  variableUses.add({\n                    declaration,\n                    path: [...path],\n                    fallback,\n                    variableName: name,\n                    raw: generate(funcNode),\n                  });\n\n                  if (fallback?.includes('var(')) {\n                    const parsedFallback = parse(fallback, {\n                      context: 'value',\n                    });\n\n                    parseVariableUsesFrom(parsedFallback);\n                  }\n                }\n              },\n            });\n          }\n\n          parseVariableUsesFrom(declaration.value);\n        }\n      }\n      path.unshift(node);\n    },\n  });\n\n  for (const use of variableUses) {\n    let hasReplaced = false;\n\n    for (const definition of variableDefinitions) {\n      if (use.variableName !== definition.variableName) {\n        continue;\n      }\n\n      if (\n        use.path[0]?.type === 'Block' &&\n        use.path[1]?.type === 'Atrule' &&\n        use.path[2]?.type === 'Block' &&\n        use.path[3]?.type === 'Rule' &&\n        definition.path[0].type === 'Block' &&\n        definition.path[1].type === 'Rule' &&\n        doSelectorsIntersect(use.path[3].prelude, definition.path[1].prelude)\n      ) {\n        use.declaration.value = parse(\n          generate(use.declaration.value).replaceAll(\n            use.raw,\n            definition.definition,\n          ),\n          {\n            context: 'value',\n          },\n        ) as Raw | Value;\n        hasReplaced = true;\n        break;\n      }\n\n      if (\n        use.path[0]?.type === 'Block' &&\n        use.path[1]?.type === 'Rule' &&\n        definition.path[0]?.type === 'Block' &&\n        definition.path[1]?.type === 'Rule' &&\n        doSelectorsIntersect(use.path[1].prelude, definition.path[1].prelude)\n      ) {\n        use.declaration.value = parse(\n          generate(use.declaration.value).replaceAll(\n            use.raw,\n            definition.definition,\n          ),\n          {\n            context: 'value',\n          },\n        ) as Raw | Value;\n        hasReplaced = true;\n        break;\n      }\n    }\n\n    if (!hasReplaced && use.fallback) {\n      use.declaration.value = parse(\n        generate(use.declaration.value).replaceAll(use.raw, use.fallback),\n        { context: 'value' },\n      ) as Raw | Value;\n    }\n  }\n}\n","import { type CssNode, walk } from 'css-tree';\n\n/**\n * Intentionally only resolves `*` and `/` operations without dealing with parenthesis, because this is the only thing required to run Tailwind v4\n */\nexport function resolveCalcExpressions(node: CssNode) {\n  walk(node, {\n    visit: 'Function',\n    enter(func, funcListItem) {\n      if (func.name === 'calc') {\n        /*\n          [\n            { type: 'Dimension', loc: null, value: '0.25', unit: 'rem' },\n            { type: 'Operator', loc: null, value: '*' },\n            { type: 'Number', loc: null, value: '2' }\n            { type: 'Percentage', loc: null, value: '2' }\n          ]\n        */\n        func.children.forEach((child, item) => {\n          const left = item.prev;\n          const right = item.next;\n          if (\n            left &&\n            right &&\n            child.type === 'Operator' &&\n            (left.data.type === 'Dimension' ||\n              left.data.type === 'Number' ||\n              left.data.type === 'Percentage') &&\n            (right.data.type === 'Dimension' ||\n              right.data.type === 'Number' ||\n              right.data.type === 'Percentage')\n          ) {\n            if (child.value === '*' || child.value === '/') {\n              const value = (() => {\n                if (child.value === '*') {\n                  return String(\n                    Number.parseFloat(left.data.value) *\n                      Number.parseFloat(right.data.value),\n                  );\n                }\n                if (right.data.value === '0') {\n                  return '0';\n                }\n                return String(\n                  Number.parseFloat(left.data.value) /\n                    Number.parseFloat(right.data.value),\n                );\n              })();\n              if (\n                left.data.type === 'Dimension' &&\n                right.data.type === 'Number'\n              ) {\n                item.data = {\n                  type: 'Dimension',\n                  unit: left.data.unit,\n                  value,\n                };\n                func.children.remove(left);\n                func.children.remove(right);\n              } else if (\n                left.data.type === 'Number' &&\n                right.data.type === 'Dimension'\n              ) {\n                item.data = {\n                  type: 'Dimension',\n                  unit: right.data.unit,\n                  value,\n                };\n                func.children.remove(left);\n                func.children.remove(right);\n              } else if (\n                left.data.type === 'Number' &&\n                right.data.type === 'Number'\n              ) {\n                item.data = {\n                  type: 'Number',\n                  value,\n                };\n                func.children.remove(left);\n                func.children.remove(right);\n              } else if (\n                left.data.type === 'Dimension' &&\n                right.data.type === 'Dimension' &&\n                left.data.unit === right.data.unit\n              ) {\n                if (child.value === '/') {\n                  item.data = {\n                    type: 'Number',\n                    value,\n                  };\n                } else {\n                  item.data = {\n                    type: 'Dimension',\n                    unit: left.data.unit,\n                    value,\n                  };\n                }\n                func.children.remove(left);\n                func.children.remove(right);\n              } else if (\n                left.data.type === 'Percentage' &&\n                right.data.type === 'Number'\n              ) {\n                item.data = {\n                  type: 'Percentage',\n                  value,\n                };\n                func.children.remove(left);\n                func.children.remove(right);\n              } else if (\n                left.data.type === 'Number' &&\n                right.data.type === 'Percentage'\n              ) {\n                item.data = {\n                  type: 'Percentage',\n                  value,\n                };\n                func.children.remove(left);\n                func.children.remove(right);\n              } else if (\n                left.data.type === 'Percentage' &&\n                right.data.type === 'Percentage'\n              ) {\n                if (child.value === '/') {\n                  item.data = {\n                    type: 'Number',\n                    value,\n                  };\n                } else {\n                  item.data = {\n                    type: 'Percentage',\n                    value,\n                  };\n                }\n                func.children.remove(left);\n                func.children.remove(right);\n              }\n            }\n          }\n        });\n        if (func.children.size === 1 && func.children.first) {\n          funcListItem.data = func.children.first;\n        }\n      }\n    },\n  });\n}\n","import {\n  type CssNode,\n  type Declaration,\n  type FunctionNode,\n  generate,\n  List,\n  parse,\n  type Raw,\n  type Value,\n  walk,\n} from 'css-tree';\n\nfunction rgbNode(\n  r: number,\n  g: number,\n  b: number,\n  alpha?: number,\n): FunctionNode {\n  const children = new List<CssNode>();\n  children.appendData({\n    type: 'Number',\n    value: r.toFixed(0),\n  });\n  children.appendData({\n    type: 'Operator',\n    value: ',',\n  });\n  children.appendData({\n    type: 'Number',\n    value: g.toFixed(0),\n  });\n  children.appendData({\n    type: 'Operator',\n    value: ',',\n  });\n  children.appendData({\n    type: 'Number',\n    value: b.toFixed(0),\n  });\n  if (alpha !== 1 && alpha !== undefined) {\n    children.appendData({\n      type: 'Operator',\n      value: ',',\n    });\n    children.appendData({\n      type: 'Number',\n      value: alpha.toString(),\n    });\n  }\n\n  return {\n    type: 'Function',\n    name: 'rgb',\n    children,\n  };\n}\n\nconst LAB_TO_LMS = {\n  l: [0.3963377773761749, 0.2158037573099136],\n  m: [-0.1055613458156586, -0.0638541728258133],\n  s: [-0.0894841775298119, -1.2914855480194092],\n};\nconst LSM_TO_RGB = {\n  r: [4.0767416360759583, -3.3077115392580629, 0.2309699031821043],\n  g: [-1.2684379732850315, 2.6097573492876882, -0.341319376002657],\n  b: [-0.0041960761386756, -0.7034186179359362, 1.7076146940746117],\n};\n\nfunction lrgbToRgb(input: number) {\n  const absoluteNumber = Math.abs(input);\n  const sign = input < 0 ? -1 : 1;\n\n  if (absoluteNumber > 0.0031308) {\n    return sign * (absoluteNumber ** (1 / 2.4) * 1.055 - 0.055);\n  }\n\n  return input * 12.92;\n}\n\nfunction clamp(value: number, min: number, max: number) {\n  return Math.min(Math.max(value, min), max);\n}\n\nfunction oklchToOklab(oklch: { l: number; c: number; h: number }) {\n  return {\n    l: oklch.l,\n    a: oklch.c * Math.cos((oklch.h / 180) * Math.PI),\n    b: oklch.c * Math.sin((oklch.h / 180) * Math.PI),\n  };\n}\n\n/** Convert oklab to RGB */\nfunction oklchToRgb(oklch: { l: number; c: number; h: number }) {\n  const oklab = oklchToOklab(oklch);\n\n  const l =\n    (oklab.l + LAB_TO_LMS.l[0] * oklab.a + LAB_TO_LMS.l[1] * oklab.b) ** 3;\n  const m =\n    (oklab.l + LAB_TO_LMS.m[0] * oklab.a + LAB_TO_LMS.m[1] * oklab.b) ** 3;\n  const s =\n    (oklab.l + LAB_TO_LMS.s[0] * oklab.a + LAB_TO_LMS.s[1] * oklab.b) ** 3;\n\n  const r =\n    255 *\n    lrgbToRgb(LSM_TO_RGB.r[0] * l + LSM_TO_RGB.r[1] * m + LSM_TO_RGB.r[2] * s);\n  const g =\n    255 *\n    lrgbToRgb(LSM_TO_RGB.g[0] * l + LSM_TO_RGB.g[1] * m + LSM_TO_RGB.g[2] * s);\n  const b =\n    255 *\n    lrgbToRgb(LSM_TO_RGB.b[0] * l + LSM_TO_RGB.b[1] * m + LSM_TO_RGB.b[2] * s);\n\n  return {\n    r: clamp(r, 0, 255),\n    g: clamp(g, 0, 255),\n    b: clamp(b, 0, 255),\n  };\n}\n\nfunction separteShorthandDeclaration(\n  shorthandToReplace: Declaration,\n  [start, end]: [string, string],\n): Declaration {\n  shorthandToReplace.property = start;\n\n  const values =\n    shorthandToReplace.value.type === 'Value'\n      ? shorthandToReplace.value.children\n          .toArray()\n          .filter(\n            (child) =>\n              child.type === 'Dimension' ||\n              child.type === 'Number' ||\n              child.type === 'Percentage',\n          )\n      : [shorthandToReplace.value];\n  let endValue = shorthandToReplace.value;\n  if (values.length === 2) {\n    endValue = {\n      type: 'Value',\n      children: new List<CssNode>().fromArray([values[1]]),\n    };\n    shorthandToReplace.value = {\n      type: 'Value',\n      children: new List<CssNode>().fromArray([values[0]]),\n    };\n  }\n\n  return {\n    type: 'Declaration',\n    property: end,\n    value: endValue,\n    important: shorthandToReplace.important,\n  };\n}\n\n/**\n * Meant to do all the things necessary, in a per-declaration basis, to have the best email client\n * support possible.\n *\n * Here's the transformations it does so far:\n * - convert all `rgb` with space-based syntax into a comma based one;\n * - convert all `oklch` values into `rgb`;\n * - convert all hex values into `rgb`;\n * - convert `padding-inline` into `padding-left` and `padding-right`;\n * - convert `padding-block` into `padding-top` and `padding-bottom`;\n * - convert `margin-inline` into `margin-left` and `margin-right`;\n * - convert `margin-block` into `margin-top` and `margin-bottom`.\n */\nexport function sanitizeDeclarations(nodeContainingDeclarations: CssNode) {\n  walk(nodeContainingDeclarations, {\n    visit: 'Declaration',\n    enter(declaration, item, list) {\n      if (declaration.value.type === 'Raw') {\n        declaration.value = parse(declaration.value.value, {\n          context: 'value',\n        }) as Value | Raw;\n      }\n      if (\n        /border-radius\\s*:\\s*calc\\s*\\(\\s*infinity\\s*\\*\\s*1px\\s*\\)/i.test(\n          generate(declaration),\n        )\n      ) {\n        declaration.value = parse('9999px', { context: 'value' }) as Value;\n      }\n      walk(declaration, {\n        visit: 'Function',\n        enter(func, funcParentListItem) {\n          const children = func.children.toArray();\n          if (func.name === 'oklch') {\n            let l: number | undefined;\n            let c: number | undefined;\n            let h: number | undefined;\n            let a: number | undefined;\n            for (const child of children) {\n              if (child.type === 'Number') {\n                if (l === undefined) {\n                  l = Number.parseFloat(child.value);\n                  continue;\n                }\n                if (c === undefined) {\n                  c = Number.parseFloat(child.value);\n                  continue;\n                }\n                if (h === undefined) {\n                  h = Number.parseFloat(child.value);\n                  continue;\n                }\n                if (a === undefined) {\n                  a = Number.parseFloat(child.value);\n                  continue;\n                }\n              }\n              if (child.type === 'Dimension' && child.unit === 'deg') {\n                if (h === undefined) {\n                  h = Number.parseFloat(child.value);\n                  continue;\n                }\n              }\n              if (child.type === 'Percentage') {\n                if (l === undefined) {\n                  l = Number.parseFloat(child.value) / 100;\n                  continue;\n                }\n                if (a === undefined) {\n                  a = Number.parseFloat(child.value) / 100;\n                }\n              }\n            }\n\n            if (l === undefined || c === undefined || h === undefined) {\n              throw new Error(\n                'Could not determine the parameters of an oklch() function.',\n                {\n                  cause: declaration,\n                },\n              );\n            }\n\n            const rgb = oklchToRgb({\n              l,\n              c,\n              h,\n            });\n\n            funcParentListItem.data = rgbNode(rgb.r, rgb.g, rgb.b, a);\n          }\n\n          if (func.name === 'rgb') {\n            let r: number | undefined;\n            let g: number | undefined;\n            let b: number | undefined;\n            let a: number | undefined;\n            for (const child of children) {\n              if (child.type === 'Number') {\n                if (r === undefined) {\n                  r = Number.parseFloat(child.value);\n                  continue;\n                }\n                if (g === undefined) {\n                  g = Number.parseFloat(child.value);\n                  continue;\n                }\n                if (b === undefined) {\n                  b = Number.parseFloat(child.value);\n                  continue;\n                }\n                if (a === undefined) {\n                  a = Number.parseFloat(child.value);\n                  continue;\n                }\n              }\n              if (child.type === 'Percentage') {\n                if (r === undefined) {\n                  r = (Number.parseFloat(child.value) * 255) / 100;\n                  continue;\n                }\n                if (g === undefined) {\n                  g = (Number.parseFloat(child.value) * 255) / 100;\n                  continue;\n                }\n                if (b === undefined) {\n                  b = (Number.parseFloat(child.value) * 255) / 100;\n                  continue;\n                }\n                if (a === undefined) {\n                  a = Number.parseFloat(child.value) / 100;\n                }\n              }\n            }\n\n            if (r === undefined || g === undefined || b === undefined) {\n              throw new Error(\n                'Could not determine the parameters of an rgb() function.',\n                {\n                  cause: declaration,\n                },\n              );\n            }\n\n            if (a === undefined || a === 1) {\n              funcParentListItem.data = rgbNode(r, g, b);\n            } else {\n              funcParentListItem.data = rgbNode(r, g, b, a);\n            }\n          }\n        },\n      });\n      walk(declaration, {\n        visit: 'Hash',\n        enter(hash, hashParentListItem) {\n          const hex = hash.value.trim();\n          if (hex.length === 3) {\n            const r = Number.parseInt(hex.charAt(0) + hex.charAt(0), 16);\n            const g = Number.parseInt(hex.charAt(1) + hex.charAt(1), 16);\n            const b = Number.parseInt(hex.charAt(2) + hex.charAt(2), 16);\n            hashParentListItem.data = rgbNode(r, g, b);\n            return;\n          }\n          if (hex.length === 4) {\n            const r = Number.parseInt(hex.charAt(0) + hex.charAt(0), 16);\n            const g = Number.parseInt(hex.charAt(1) + hex.charAt(1), 16);\n            const b = Number.parseInt(hex.charAt(2) + hex.charAt(2), 16);\n            const a = Number.parseInt(hex.charAt(3) + hex.charAt(3), 16) / 255;\n            hashParentListItem.data = rgbNode(r, g, b, a);\n            return;\n          }\n          if (hex.length === 5) {\n            const r = Number.parseInt(hex.slice(0, 2), 16);\n            const g = Number.parseInt(hex.charAt(2) + hex.charAt(2), 16);\n            const b = Number.parseInt(hex.charAt(3) + hex.charAt(3), 16);\n            const a = Number.parseInt(hex.charAt(4) + hex.charAt(4), 16) / 255;\n            hashParentListItem.data = rgbNode(r, g, b, a);\n            return;\n          }\n          if (hex.length === 6) {\n            const r = Number.parseInt(hex.slice(0, 2), 16);\n            const g = Number.parseInt(hex.slice(2, 4), 16);\n            const b = Number.parseInt(hex.slice(4, 6), 16);\n            hashParentListItem.data = rgbNode(r, g, b);\n            return;\n          }\n          if (hex.length === 7) {\n            const r = Number.parseInt(hex.slice(0, 2), 16);\n            const g = Number.parseInt(hex.slice(2, 4), 16);\n            const b = Number.parseInt(hex.slice(4, 6), 16);\n            const a = Number.parseInt(hex.charAt(6) + hex.charAt(6), 16) / 255;\n            hashParentListItem.data = rgbNode(r, g, b, a);\n            return;\n          }\n          const r = Number.parseInt(hex.slice(0, 2), 16);\n          const g = Number.parseInt(hex.slice(2, 4), 16);\n          const b = Number.parseInt(hex.slice(4, 6), 16);\n          const a = Number.parseInt(hex.slice(6, 8), 16) / 255;\n          hashParentListItem.data = rgbNode(r, g, b, a);\n        },\n      });\n\n      walk(declaration, {\n        visit: 'Function',\n        enter(func, parentListItem) {\n          if (func.name === 'color-mix') {\n            const children = func.children.toArray();\n            // We're expecting the children here to be something like:\n            // Identifier (in)\n            // Identifier (oklab)\n            // Operator (,)\n            // FunctionNode (rgb(...))\n            // Node (opacity)\n            // Operator (,)\n            // Identifier (transparent)\n            const color: CssNode | undefined = children[3];\n            const opacity: CssNode | undefined = children[4];\n            if (\n              func.children.last?.type === 'Identifier' &&\n              func.children.last.name === 'transparent' &&\n              color?.type === 'Function' &&\n              color?.name === 'rgb' &&\n              opacity\n            ) {\n              color.children.appendData({\n                type: 'Operator',\n                value: ',',\n              });\n              color.children.appendData(opacity);\n              parentListItem.data = color;\n            }\n          }\n        },\n      });\n\n      if (declaration.property === 'padding-inline') {\n        const paddingRight = separteShorthandDeclaration(declaration, [\n          'padding-left',\n          'padding-right',\n        ]);\n        list.insertData(paddingRight, item);\n      }\n      if (declaration.property === 'padding-block') {\n        const paddingBottom = separteShorthandDeclaration(declaration, [\n          'padding-top',\n          'padding-bottom',\n        ]);\n        list.insertData(paddingBottom, item);\n      }\n      if (declaration.property === 'margin-inline') {\n        const marginRight = separteShorthandDeclaration(declaration, [\n          'margin-left',\n          'margin-right',\n        ]);\n        list.insertData(marginRight, item);\n      }\n      if (declaration.property === 'margin-block') {\n        const paddingBottom = separteShorthandDeclaration(declaration, [\n          'margin-top',\n          'margin-bottom',\n        ]);\n\n        list.insertData(paddingBottom, item);\n      }\n    },\n  });\n}\n","import type { StyleSheet } from 'css-tree';\nimport { resolveAllCssVariables } from './utils/css/resolve-all-css-variables';\nimport { resolveCalcExpressions } from './utils/css/resolve-calc-expressions';\nimport { sanitizeDeclarations } from './utils/css/sanitize-declarations';\n\nexport function sanitizeStyleSheet(styleSheet: StyleSheet) {\n  resolveAllCssVariables(styleSheet);\n  resolveCalcExpressions(styleSheet);\n  sanitizeDeclarations(styleSheet);\n}\n","interface PromiseState {\n  promise: Promise<unknown>;\n  error?: unknown;\n  result?: unknown;\n}\n\nconst promiseStates = new Map<string, PromiseState>();\n\nexport function useSuspensedPromise<Result>(\n  promiseFn: () => Promise<Result>,\n  key: string,\n) {\n  const previousState = promiseStates.get(key);\n  if (previousState) {\n    if ('error' in previousState) {\n      throw previousState.error;\n    }\n\n    if ('result' in previousState) {\n      return previousState.result as Result;\n    }\n\n    throw previousState.promise;\n  }\n\n  const state: PromiseState = {\n    promise: promiseFn()\n      .then((result) => (state.result = result))\n      .catch((error) => (state.error = error as unknown)),\n  };\n  promiseStates.set(key, state);\n\n  throw state.promise;\n}\n","const digitToNameMap = {\n  '0': 'zero',\n  '1': 'one',\n  '2': 'two',\n  '3': 'three',\n  '4': 'four',\n  '5': 'five',\n  '6': 'six',\n  '7': 'seven',\n  '8': 'eight',\n  '9': 'nine',\n} as const;\n\n/**\n * Replaces special characters to avoid problems on email clients.\n *\n * @param className - This should not come with any escaped charcters, it should come the same\n * as is on the `className` attribute on React elements.\n */\nexport function sanitizeClassName(className: string) {\n  return className\n    .replaceAll('+', 'plus')\n    .replaceAll('[', '')\n    .replaceAll('%', 'pc')\n    .replaceAll(']', '')\n    .replaceAll('(', '')\n    .replaceAll(')', '')\n    .replaceAll('!', 'imprtnt')\n    .replaceAll('>', 'gt')\n    .replaceAll('<', 'lt')\n    .replaceAll('=', 'eq')\n    .replace(/^[0-9]/, (digit) => {\n      return digitToNameMap[digit as keyof typeof digitToNameMap];\n    })\n    .replace(/[^a-zA-Z0-9\\-_]/g, '_');\n}\n","import { type CssNode, string, walk } from 'css-tree';\nimport { sanitizeClassName } from '../compatibility/sanitize-class-name';\nimport { isRuleInlinable } from './is-rule-inlinable';\n\n/**\n * This function goes through a few steps to ensure the best email client support and\n * to ensure that media queries and pseudo classes are applied correctly alongside\n * the inline styles.\n *\n * What it does:\n * 1. Converts all declarations in all rules into important ones\n * 2. Sanitizes class selectors of all non-inlinable rules\n */\nexport function sanitizeNonInlinableRules(node: CssNode) {\n  walk(node, {\n    visit: 'Rule',\n    enter(rule) {\n      if (!isRuleInlinable(rule)) {\n        walk(rule.prelude, (node) => {\n          if (node.type === 'ClassSelector') {\n            const unescapedClassName = string.decode(node.name);\n            node.name = sanitizeClassName(unescapedClassName);\n          }\n        });\n\n        walk(rule, {\n          visit: 'Declaration',\n          enter(declaration) {\n            declaration.important = true;\n          },\n        });\n      }\n    },\n  });\n}\n","import { Body } from '@react-email/body';\nimport { Button } from '@react-email/button';\nimport { CodeBlock } from '@react-email/code-block';\nimport { CodeInline } from '@react-email/code-inline';\nimport { Container } from '@react-email/container';\nimport { Heading } from '@react-email/heading';\nimport { Hr } from '@react-email/hr';\nimport { Img } from '@react-email/img';\nimport { Link } from '@react-email/link';\nimport { Preview } from '@react-email/preview';\nimport { Text } from '@react-email/text';\n\nconst componentsToTreatAsElements: React.ReactElement['type'][] = [\n  Body,\n  Button,\n  CodeBlock,\n  CodeInline,\n  Container,\n  Heading,\n  Hr,\n  Img,\n  Link,\n  Preview,\n  Text,\n];\n\nexport const isComponent = (\n  element: React.ReactElement,\n): element is React.ReactElement<unknown, React.FC<unknown>> => {\n  return (\n    (typeof element.type === 'function' ||\n      // @ts-expect-error - we know this is a component that may have a render function\n      element.type.render !== undefined) &&\n    !componentsToTreatAsElements.includes(element.type)\n  );\n};\n","import React from 'react';\nimport { isComponent } from './is-component';\n\n/**\n * A function made for deep mapping a React tree from a node, even through its components.\n * For all the components it finds, it renders them by directly calling them. This has a few issues\n * with hooks, and the only solution is `renderAsync` here, which will probably be done in the future.\n *\n * @param process - The callback that will be called every time a new element has been reached.\n *\n * For components, this is going to be called, most of the time, two times. This is because the best\n * approach is to process *both* before rendering the components (i.e. on the props.children of a component element)\n * and after rendering them because the children themselves might have been modified in the component's\n * rendering.\n */\nexport function mapReactTree(\n  value: React.ReactNode,\n  process: (node: React.ReactNode) => React.ReactNode,\n): React.ReactNode {\n  const mapped = React.Children.map(value, (node) => {\n    if (React.isValidElement<{ children?: React.ReactNode }>(node)) {\n      const newProps = { ...node.props };\n\n      if (node.props.children && !isComponent(node)) {\n        newProps.children = mapReactTree(node.props.children, process);\n      }\n\n      const processed = process(\n        React.cloneElement(node, newProps, newProps.children),\n      );\n\n      if (\n        React.isValidElement<{ children?: React.ReactNode }>(processed) &&\n        isComponent(processed)\n      ) {\n        const OriginalComponent =\n          typeof processed.type === 'object'\n            ? // @ts-expect-error - we know this is a component with a render function\n              (processed.type.render as React.FC)\n            : (processed.type as React.FC);\n\n        const rendered = OriginalComponent(processed.props);\n        const mappedRenderedNode = mapReactTree(rendered, process);\n\n        return mappedRenderedNode;\n      }\n\n      return processed;\n    }\n\n    return process(node);\n  });\n\n  return mapped && mapped.length === 1 ? mapped[0] : mapped;\n}\n","import type { Rule } from 'css-tree';\nimport React from 'react';\nimport type { EmailElementProps } from '../../tailwind';\nimport { sanitizeClassName } from '../compatibility/sanitize-class-name';\nimport type { CustomProperties } from '../css/get-custom-properties';\nimport { makeInlineStylesFor } from '../css/make-inline-styles-for';\nimport { isComponent } from '../react/is-component';\n\nexport function cloneElementWithInlinedStyles(\n  element: React.ReactElement<EmailElementProps>,\n  inlinableRules: Map<string, Rule>,\n  nonInlinableRules: Map<string, Rule>,\n  customProperties: CustomProperties,\n) {\n  const propsToOverwrite: Partial<EmailElementProps> = {};\n\n  if (element.props.className && !isComponent(element)) {\n    const classes = element.props.className.trim().split(/\\s+/);\n\n    const residualClasses: string[] = [];\n\n    const rules: Rule[] = [];\n    for (const className of classes) {\n      const rule = inlinableRules.get(className);\n      if (rule) {\n        rules.push(rule);\n      }\n      if (nonInlinableRules.has(className)) {\n        residualClasses.push(className);\n      } else if (!rule) {\n        residualClasses.push(className);\n      }\n    }\n\n    const styles = makeInlineStylesFor(rules, customProperties);\n    propsToOverwrite.style = {\n      ...styles,\n      ...element.props.style,\n    };\n\n    if (residualClasses.length > 0) {\n      propsToOverwrite.className = residualClasses\n        .map((className) => {\n          if (nonInlinableRules.has(className)) {\n            return sanitizeClassName(className);\n          }\n          return className;\n        })\n        .join(' ');\n    } else {\n      propsToOverwrite.className = undefined;\n    }\n  }\n\n  const newProps = {\n    ...element.props,\n    ...propsToOverwrite,\n  };\n\n  return React.cloneElement(element, newProps, newProps.children);\n}\n","const css = `\n@layer theme, base, components, utilities;\n\n@layer theme {\n  @theme default {\n    --font-sans:\n      ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\",\n      \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n    --font-serif: ui-serif, Georgia, Cambria, \"Times New Roman\", Times, serif;\n    --font-mono:\n      ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\",\n      \"Courier New\", monospace;\n\n    --color-red-50: oklch(97.1% 0.013 17.38);\n    --color-red-100: oklch(93.6% 0.032 17.717);\n    --color-red-200: oklch(88.5% 0.062 18.334);\n    --color-red-300: oklch(80.8% 0.114 19.571);\n    --color-red-400: oklch(70.4% 0.191 22.216);\n    --color-red-500: oklch(63.7% 0.237 25.331);\n    --color-red-600: oklch(57.7% 0.245 27.325);\n    --color-red-700: oklch(50.5% 0.213 27.518);\n    --color-red-800: oklch(44.4% 0.177 26.899);\n    --color-red-900: oklch(39.6% 0.141 25.723);\n    --color-red-950: oklch(25.8% 0.092 26.042);\n\n    --color-orange-50: oklch(98% 0.016 73.684);\n    --color-orange-100: oklch(95.4% 0.038 75.164);\n    --color-orange-200: oklch(90.1% 0.076 70.697);\n    --color-orange-300: oklch(83.7% 0.128 66.29);\n    --color-orange-400: oklch(75% 0.183 55.934);\n    --color-orange-500: oklch(70.5% 0.213 47.604);\n    --color-orange-600: oklch(64.6% 0.222 41.116);\n    --color-orange-700: oklch(55.3% 0.195 38.402);\n    --color-orange-800: oklch(47% 0.157 37.304);\n    --color-orange-900: oklch(40.8% 0.123 38.172);\n    --color-orange-950: oklch(26.6% 0.079 36.259);\n\n    --color-amber-50: oklch(98.7% 0.022 95.277);\n    --color-amber-100: oklch(96.2% 0.059 95.617);\n    --color-amber-200: oklch(92.4% 0.12 95.746);\n    --color-amber-300: oklch(87.9% 0.169 91.605);\n    --color-amber-400: oklch(82.8% 0.189 84.429);\n    --color-amber-500: oklch(76.9% 0.188 70.08);\n    --color-amber-600: oklch(66.6% 0.179 58.318);\n    --color-amber-700: oklch(55.5% 0.163 48.998);\n    --color-amber-800: oklch(47.3% 0.137 46.201);\n    --color-amber-900: oklch(41.4% 0.112 45.904);\n    --color-amber-950: oklch(27.9% 0.077 45.635);\n\n    --color-yellow-50: oklch(98.7% 0.026 102.212);\n    --color-yellow-100: oklch(97.3% 0.071 103.193);\n    --color-yellow-200: oklch(94.5% 0.129 101.54);\n    --color-yellow-300: oklch(90.5% 0.182 98.111);\n    --color-yellow-400: oklch(85.2% 0.199 91.936);\n    --color-yellow-500: oklch(79.5% 0.184 86.047);\n    --color-yellow-600: oklch(68.1% 0.162 75.834);\n    --color-yellow-700: oklch(55.4% 0.135 66.442);\n    --color-yellow-800: oklch(47.6% 0.114 61.907);\n    --color-yellow-900: oklch(42.1% 0.095 57.708);\n    --color-yellow-950: oklch(28.6% 0.066 53.813);\n\n    --color-lime-50: oklch(98.6% 0.031 120.757);\n    --color-lime-100: oklch(96.7% 0.067 122.328);\n    --color-lime-200: oklch(93.8% 0.127 124.321);\n    --color-lime-300: oklch(89.7% 0.196 126.665);\n    --color-lime-400: oklch(84.1% 0.238 128.85);\n    --color-lime-500: oklch(76.8% 0.233 130.85);\n    --color-lime-600: oklch(64.8% 0.2 131.684);\n    --color-lime-700: oklch(53.2% 0.157 131.589);\n    --color-lime-800: oklch(45.3% 0.124 130.933);\n    --color-lime-900: oklch(40.5% 0.101 131.063);\n    --color-lime-950: oklch(27.4% 0.072 132.109);\n\n    --color-green-50: oklch(98.2% 0.018 155.826);\n    --color-green-100: oklch(96.2% 0.044 156.743);\n    --color-green-200: oklch(92.5% 0.084 155.995);\n    --color-green-300: oklch(87.1% 0.15 154.449);\n    --color-green-400: oklch(79.2% 0.209 151.711);\n    --color-green-500: oklch(72.3% 0.219 149.579);\n    --color-green-600: oklch(62.7% 0.194 149.214);\n    --color-green-700: oklch(52.7% 0.154 150.069);\n    --color-green-800: oklch(44.8% 0.119 151.328);\n    --color-green-900: oklch(39.3% 0.095 152.535);\n    --color-green-950: oklch(26.6% 0.065 152.934);\n\n    --color-emerald-50: oklch(97.9% 0.021 166.113);\n    --color-emerald-100: oklch(95% 0.052 163.051);\n    --color-emerald-200: oklch(90.5% 0.093 164.15);\n    --color-emerald-300: oklch(84.5% 0.143 164.978);\n    --color-emerald-400: oklch(76.5% 0.177 163.223);\n    --color-emerald-500: oklch(69.6% 0.17 162.48);\n    --color-emerald-600: oklch(59.6% 0.145 163.225);\n    --color-emerald-700: oklch(50.8% 0.118 165.612);\n    --color-emerald-800: oklch(43.2% 0.095 166.913);\n    --color-emerald-900: oklch(37.8% 0.077 168.94);\n    --color-emerald-950: oklch(26.2% 0.051 172.552);\n\n    --color-teal-50: oklch(98.4% 0.014 180.72);\n    --color-teal-100: oklch(95.3% 0.051 180.801);\n    --color-teal-200: oklch(91% 0.096 180.426);\n    --color-teal-300: oklch(85.5% 0.138 181.071);\n    --color-teal-400: oklch(77.7% 0.152 181.912);\n    --color-teal-500: oklch(70.4% 0.14 182.503);\n    --color-teal-600: oklch(60% 0.118 184.704);\n    --color-teal-700: oklch(51.1% 0.096 186.391);\n    --color-teal-800: oklch(43.7% 0.078 188.216);\n    --color-teal-900: oklch(38.6% 0.063 188.416);\n    --color-teal-950: oklch(27.7% 0.046 192.524);\n\n    --color-cyan-50: oklch(98.4% 0.019 200.873);\n    --color-cyan-100: oklch(95.6% 0.045 203.388);\n    --color-cyan-200: oklch(91.7% 0.08 205.041);\n    --color-cyan-300: oklch(86.5% 0.127 207.078);\n    --color-cyan-400: oklch(78.9% 0.154 211.53);\n    --color-cyan-500: oklch(71.5% 0.143 215.221);\n    --color-cyan-600: oklch(60.9% 0.126 221.723);\n    --color-cyan-700: oklch(52% 0.105 223.128);\n    --color-cyan-800: oklch(45% 0.085 224.283);\n    --color-cyan-900: oklch(39.8% 0.07 227.392);\n    --color-cyan-950: oklch(30.2% 0.056 229.695);\n\n    --color-sky-50: oklch(97.7% 0.013 236.62);\n    --color-sky-100: oklch(95.1% 0.026 236.824);\n    --color-sky-200: oklch(90.1% 0.058 230.902);\n    --color-sky-300: oklch(82.8% 0.111 230.318);\n    --color-sky-400: oklch(74.6% 0.16 232.661);\n    --color-sky-500: oklch(68.5% 0.169 237.323);\n    --color-sky-600: oklch(58.8% 0.158 241.966);\n    --color-sky-700: oklch(50% 0.134 242.749);\n    --color-sky-800: oklch(44.3% 0.11 240.79);\n    --color-sky-900: oklch(39.1% 0.09 240.876);\n    --color-sky-950: oklch(29.3% 0.066 243.157);\n\n    --color-blue-50: oklch(97% 0.014 254.604);\n    --color-blue-100: oklch(93.2% 0.032 255.585);\n    --color-blue-200: oklch(88.2% 0.059 254.128);\n    --color-blue-300: oklch(80.9% 0.105 251.813);\n    --color-blue-400: oklch(70.7% 0.165 254.624);\n    --color-blue-500: oklch(62.3% 0.214 259.815);\n    --color-blue-600: oklch(54.6% 0.245 262.881);\n    --color-blue-700: oklch(48.8% 0.243 264.376);\n    --color-blue-800: oklch(42.4% 0.199 265.638);\n    --color-blue-900: oklch(37.9% 0.146 265.522);\n    --color-blue-950: oklch(28.2% 0.091 267.935);\n\n    --color-indigo-50: oklch(96.2% 0.018 272.314);\n    --color-indigo-100: oklch(93% 0.034 272.788);\n    --color-indigo-200: oklch(87% 0.065 274.039);\n    --color-indigo-300: oklch(78.5% 0.115 274.713);\n    --color-indigo-400: oklch(67.3% 0.182 276.935);\n    --color-indigo-500: oklch(58.5% 0.233 277.117);\n    --color-indigo-600: oklch(51.1% 0.262 276.966);\n    --color-indigo-700: oklch(45.7% 0.24 277.023);\n    --color-indigo-800: oklch(39.8% 0.195 277.366);\n    --color-indigo-900: oklch(35.9% 0.144 278.697);\n    --color-indigo-950: oklch(25.7% 0.09 281.288);\n\n    --color-violet-50: oklch(96.9% 0.016 293.756);\n    --color-violet-100: oklch(94.3% 0.029 294.588);\n    --color-violet-200: oklch(89.4% 0.057 293.283);\n    --color-violet-300: oklch(81.1% 0.111 293.571);\n    --color-violet-400: oklch(70.2% 0.183 293.541);\n    --color-violet-500: oklch(60.6% 0.25 292.717);\n    --color-violet-600: oklch(54.1% 0.281 293.009);\n    --color-violet-700: oklch(49.1% 0.27 292.581);\n    --color-violet-800: oklch(43.2% 0.232 292.759);\n    --color-violet-900: oklch(38% 0.189 293.745);\n    --color-violet-950: oklch(28.3% 0.141 291.089);\n\n    --color-purple-50: oklch(97.7% 0.014 308.299);\n    --color-purple-100: oklch(94.6% 0.033 307.174);\n    --color-purple-200: oklch(90.2% 0.063 306.703);\n    --color-purple-300: oklch(82.7% 0.119 306.383);\n    --color-purple-400: oklch(71.4% 0.203 305.504);\n    --color-purple-500: oklch(62.7% 0.265 303.9);\n    --color-purple-600: oklch(55.8% 0.288 302.321);\n    --color-purple-700: oklch(49.6% 0.265 301.924);\n    --color-purple-800: oklch(43.8% 0.218 303.724);\n    --color-purple-900: oklch(38.1% 0.176 304.987);\n    --color-purple-950: oklch(29.1% 0.149 302.717);\n\n    --color-fuchsia-50: oklch(97.7% 0.017 320.058);\n    --color-fuchsia-100: oklch(95.2% 0.037 318.852);\n    --color-fuchsia-200: oklch(90.3% 0.076 319.62);\n    --color-fuchsia-300: oklch(83.3% 0.145 321.434);\n    --color-fuchsia-400: oklch(74% 0.238 322.16);\n    --color-fuchsia-500: oklch(66.7% 0.295 322.15);\n    --color-fuchsia-600: oklch(59.1% 0.293 322.896);\n    --color-fuchsia-700: oklch(51.8% 0.253 323.949);\n    --color-fuchsia-800: oklch(45.2% 0.211 324.591);\n    --color-fuchsia-900: oklch(40.1% 0.17 325.612);\n    --color-fuchsia-950: oklch(29.3% 0.136 325.661);\n\n    --color-pink-50: oklch(97.1% 0.014 343.198);\n    --color-pink-100: oklch(94.8% 0.028 342.258);\n    --color-pink-200: oklch(89.9% 0.061 343.231);\n    --color-pink-300: oklch(82.3% 0.12 346.018);\n    --color-pink-400: oklch(71.8% 0.202 349.761);\n    --color-pink-500: oklch(65.6% 0.241 354.308);\n    --color-pink-600: oklch(59.2% 0.249 0.584);\n    --color-pink-700: oklch(52.5% 0.223 3.958);\n    --color-pink-800: oklch(45.9% 0.187 3.815);\n    --color-pink-900: oklch(40.8% 0.153 2.432);\n    --color-pink-950: oklch(28.4% 0.109 3.907);\n\n    --color-rose-50: oklch(96.9% 0.015 12.422);\n    --color-rose-100: oklch(94.1% 0.03 12.58);\n    --color-rose-200: oklch(89.2% 0.058 10.001);\n    --color-rose-300: oklch(81% 0.117 11.638);\n    --color-rose-400: oklch(71.2% 0.194 13.428);\n    --color-rose-500: oklch(64.5% 0.246 16.439);\n    --color-rose-600: oklch(58.6% 0.253 17.585);\n    --color-rose-700: oklch(51.4% 0.222 16.935);\n    --color-rose-800: oklch(45.5% 0.188 13.697);\n    --color-rose-900: oklch(41% 0.159 10.272);\n    --color-rose-950: oklch(27.1% 0.105 12.094);\n\n    --color-slate-50: oklch(98.4% 0.003 247.858);\n    --color-slate-100: oklch(96.8% 0.007 247.896);\n    --color-slate-200: oklch(92.9% 0.013 255.508);\n    --color-slate-300: oklch(86.9% 0.022 252.894);\n    --color-slate-400: oklch(70.4% 0.04 256.788);\n    --color-slate-500: oklch(55.4% 0.046 257.417);\n    --color-slate-600: oklch(44.6% 0.043 257.281);\n    --color-slate-700: oklch(37.2% 0.044 257.287);\n    --color-slate-800: oklch(27.9% 0.041 260.031);\n    --color-slate-900: oklch(20.8% 0.042 265.755);\n    --color-slate-950: oklch(12.9% 0.042 264.695);\n\n    --color-gray-50: oklch(98.5% 0.002 247.839);\n    --color-gray-100: oklch(96.7% 0.003 264.542);\n    --color-gray-200: oklch(92.8% 0.006 264.531);\n    --color-gray-300: oklch(87.2% 0.01 258.338);\n    --color-gray-400: oklch(70.7% 0.022 261.325);\n    --color-gray-500: oklch(55.1% 0.027 264.364);\n    --color-gray-600: oklch(44.6% 0.03 256.802);\n    --color-gray-700: oklch(37.3% 0.034 259.733);\n    --color-gray-800: oklch(27.8% 0.033 256.848);\n    --color-gray-900: oklch(21% 0.034 264.665);\n    --color-gray-950: oklch(13% 0.028 261.692);\n\n    --color-zinc-50: oklch(98.5% 0 0);\n    --color-zinc-100: oklch(96.7% 0.001 286.375);\n    --color-zinc-200: oklch(92% 0.004 286.32);\n    --color-zinc-300: oklch(87.1% 0.006 286.286);\n    --color-zinc-400: oklch(70.5% 0.015 286.067);\n    --color-zinc-500: oklch(55.2% 0.016 285.938);\n    --color-zinc-600: oklch(44.2% 0.017 285.786);\n    --color-zinc-700: oklch(37% 0.013 285.805);\n    --color-zinc-800: oklch(27.4% 0.006 286.033);\n    --color-zinc-900: oklch(21% 0.006 285.885);\n    --color-zinc-950: oklch(14.1% 0.005 285.823);\n\n    --color-neutral-50: oklch(98.5% 0 0);\n    --color-neutral-100: oklch(97% 0 0);\n    --color-neutral-200: oklch(92.2% 0 0);\n    --color-neutral-300: oklch(87% 0 0);\n    --color-neutral-400: oklch(70.8% 0 0);\n    --color-neutral-500: oklch(55.6% 0 0);\n    --color-neutral-600: oklch(43.9% 0 0);\n    --color-neutral-700: oklch(37.1% 0 0);\n    --color-neutral-800: oklch(26.9% 0 0);\n    --color-neutral-900: oklch(20.5% 0 0);\n    --color-neutral-950: oklch(14.5% 0 0);\n\n    --color-stone-50: oklch(98.5% 0.001 106.423);\n    --color-stone-100: oklch(97% 0.001 106.424);\n    --color-stone-200: oklch(92.3% 0.003 48.717);\n    --color-stone-300: oklch(86.9% 0.005 56.366);\n    --color-stone-400: oklch(70.9% 0.01 56.259);\n    --color-stone-500: oklch(55.3% 0.013 58.071);\n    --color-stone-600: oklch(44.4% 0.011 73.639);\n    --color-stone-700: oklch(37.4% 0.01 67.558);\n    --color-stone-800: oklch(26.8% 0.007 34.298);\n    --color-stone-900: oklch(21.6% 0.006 56.043);\n    --color-stone-950: oklch(14.7% 0.004 49.25);\n\n    --color-black: #000;\n    --color-white: #fff;\n\n    --spacing: 0.25rem;\n\n    --breakpoint-sm: 40rem;\n    --breakpoint-md: 48rem;\n    --breakpoint-lg: 64rem;\n    --breakpoint-xl: 80rem;\n    --breakpoint-2xl: 96rem;\n\n    --container-3xs: 16rem;\n    --container-2xs: 18rem;\n    --container-xs: 20rem;\n    --container-sm: 24rem;\n    --container-md: 28rem;\n    --container-lg: 32rem;\n    --container-xl: 36rem;\n    --container-2xl: 42rem;\n    --container-3xl: 48rem;\n    --container-4xl: 56rem;\n    --container-5xl: 64rem;\n    --container-6xl: 72rem;\n    --container-7xl: 80rem;\n\n    --text-xs: 0.75rem;\n    --text-xs--line-height: calc(1 / 0.75);\n    --text-sm: 0.875rem;\n    --text-sm--line-height: calc(1.25 / 0.875);\n    --text-base: 1rem;\n    --text-base--line-height: calc(1.5 / 1);\n    --text-lg: 1.125rem;\n    --text-lg--line-height: calc(1.75 / 1.125);\n    --text-xl: 1.25rem;\n    --text-xl--line-height: calc(1.75 / 1.25);\n    --text-2xl: 1.5rem;\n    --text-2xl--line-height: calc(2 / 1.5);\n    --text-3xl: 1.875rem;\n    --text-3xl--line-height: calc(2.25 / 1.875);\n    --text-4xl: 2.25rem;\n    --text-4xl--line-height: calc(2.5 / 2.25);\n    --text-5xl: 3rem;\n    --text-5xl--line-height: 1;\n    --text-6xl: 3.75rem;\n    --text-6xl--line-height: 1;\n    --text-7xl: 4.5rem;\n    --text-7xl--line-height: 1;\n    --text-8xl: 6rem;\n    --text-8xl--line-height: 1;\n    --text-9xl: 8rem;\n    --text-9xl--line-height: 1;\n\n    --font-weight-thin: 100;\n    --font-weight-extralight: 200;\n    --font-weight-light: 300;\n    --font-weight-normal: 400;\n    --font-weight-medium: 500;\n    --font-weight-semibold: 600;\n    --font-weight-bold: 700;\n    --font-weight-extrabold: 800;\n    --font-weight-black: 900;\n\n    --tracking-tighter: -0.05em;\n    --tracking-tight: -0.025em;\n    --tracking-normal: 0em;\n    --tracking-wide: 0.025em;\n    --tracking-wider: 0.05em;\n    --tracking-widest: 0.1em;\n\n    --leading-tight: 1.25;\n    --leading-snug: 1.375;\n    --leading-normal: 1.5;\n    --leading-relaxed: 1.625;\n    --leading-loose: 2;\n\n    --radius-xs: 0.125rem;\n    --radius-sm: 0.25rem;\n    --radius-md: 0.375rem;\n    --radius-lg: 0.5rem;\n    --radius-xl: 0.75rem;\n    --radius-2xl: 1rem;\n    --radius-3xl: 1.5rem;\n    --radius-4xl: 2rem;\n\n    --shadow-2xs: 0 1px rgb(0 0 0 / 0.05);\n    --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n    --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n    --shadow-md:\n      0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n    --shadow-lg:\n      0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n    --shadow-xl:\n      0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n    --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n\n    --inset-shadow-2xs: inset 0 1px rgb(0 0 0 / 0.05);\n    --inset-shadow-xs: inset 0 1px 1px rgb(0 0 0 / 0.05);\n    --inset-shadow-sm: inset 0 2px 4px rgb(0 0 0 / 0.05);\n\n    --drop-shadow-xs: 0 1px 1px rgb(0 0 0 / 0.05);\n    --drop-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.15);\n    --drop-shadow-md: 0 3px 3px rgb(0 0 0 / 0.12);\n    --drop-shadow-lg: 0 4px 4px rgb(0 0 0 / 0.15);\n    --drop-shadow-xl: 0 9px 7px rgb(0 0 0 / 0.1);\n    --drop-shadow-2xl: 0 25px 25px rgb(0 0 0 / 0.15);\n\n    --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / 0.15);\n    --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / 0.2);\n    --text-shadow-sm:\n      0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075),\n      0px 2px 2px rgb(0 0 0 / 0.075);\n    --text-shadow-md:\n      0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1),\n      0px 2px 4px rgb(0 0 0 / 0.1);\n    --text-shadow-lg:\n      0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1),\n      0px 4px 8px rgb(0 0 0 / 0.1);\n\n    --ease-in: cubic-bezier(0.4, 0, 1, 1);\n    --ease-out: cubic-bezier(0, 0, 0.2, 1);\n    --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n\n    --animate-spin: spin 1s linear infinite;\n    --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\n    --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n    --animate-bounce: bounce 1s infinite;\n\n    @keyframes spin {\n      to {\n        transform: rotate(360deg);\n      }\n    }\n\n    @keyframes ping {\n      75%,\n      100% {\n        transform: scale(2);\n        opacity: 0;\n      }\n    }\n\n    @keyframes pulse {\n      50% {\n        opacity: 0.5;\n      }\n    }\n\n    @keyframes bounce {\n      0%,\n      100% {\n        transform: translateY(-25%);\n        animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n      }\n\n      50% {\n        transform: none;\n        animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n      }\n    }\n\n    --blur-xs: 4px;\n    --blur-sm: 8px;\n    --blur-md: 12px;\n    --blur-lg: 16px;\n    --blur-xl: 24px;\n    --blur-2xl: 40px;\n    --blur-3xl: 64px;\n\n    --perspective-dramatic: 100px;\n    --perspective-near: 300px;\n    --perspective-normal: 500px;\n    --perspective-midrange: 800px;\n    --perspective-distant: 1200px;\n\n    --aspect-video: 16 / 9;\n\n    --default-transition-duration: 150ms;\n    --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n    --default-font-family: --theme(--font-sans, initial);\n    --default-font-feature-settings: --theme(\n      --font-sans--font-feature-settings,\n      initial\n    );\n    --default-font-variation-settings: --theme(\n      --font-sans--font-variation-settings,\n      initial\n    );\n    --default-mono-font-family: --theme(--font-mono, initial);\n    --default-mono-font-feature-settings: --theme(\n      --font-mono--font-feature-settings,\n      initial\n    );\n    --default-mono-font-variation-settings: --theme(\n      --font-mono--font-variation-settings,\n      initial\n    );\n  }\n\n  /* Deprecated */\n  @theme default inline reference {\n    --blur: 8px;\n    --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n    --shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);\n    --drop-shadow: 0 1px 2px rgb(0 0 0 / 0.1), 0 1px 1px rgb(0 0 0 / 0.06);\n    --radius: 0.25rem;\n    --max-width-prose: 65ch;\n  }\n}\n\n@layer base {\n  /*\n  1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n  2. Remove default margins and padding\n  3. Reset all borders.\n*/\n\n  *,\n  ::after,\n  ::before,\n  ::backdrop,\n  ::file-selector-button {\n    box-sizing: border-box; /* 1 */\n    margin: 0; /* 2 */\n    padding: 0; /* 2 */\n    border: 0 solid; /* 3 */\n  }\n\n  /*\n  1. Use a consistent sensible line-height in all browsers.\n  2. Prevent adjustments of font size after orientation changes in iOS.\n  3. Use a more readable tab size.\n  4. Use the user's configured \\`sans\\` font-family by default.\n  5. Use the user's configured \\`sans\\` font-feature-settings by default.\n  6. Use the user's configured \\`sans\\` font-variation-settings by default.\n  7. Disable tap highlights on iOS.\n*/\n\n  html,\n  :host {\n    line-height: 1.5; /* 1 */\n    -webkit-text-size-adjust: 100%; /* 2 */\n    tab-size: 4; /* 3 */\n    font-family: --theme(\n      --default-font-family,\n      ui-sans-serif,\n      system-ui,\n      sans-serif,\n      \"Apple Color Emoji\",\n      \"Segoe UI Emoji\",\n      \"Segoe UI Symbol\",\n      \"Noto Color Emoji\"\n    ); /* 4 */\n    font-feature-settings: --theme(\n      --default-font-feature-settings,\n      normal\n    ); /* 5 */\n    font-variation-settings: --theme(\n      --default-font-variation-settings,\n      normal\n    ); /* 6 */\n    -webkit-tap-highlight-color: transparent; /* 7 */\n  }\n\n  /*\n  1. Add the correct height in Firefox.\n  2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n  3. Reset the default border style to a 1px solid border.\n*/\n\n  hr {\n    height: 0; /* 1 */\n    color: inherit; /* 2 */\n    border-top-width: 1px; /* 3 */\n  }\n\n  /*\n  Add the correct text decoration in Chrome, Edge, and Safari.\n*/\n\n  abbr:where([title]) {\n    -webkit-text-decoration: underline dotted;\n    text-decoration: underline dotted;\n  }\n\n  /*\n  Remove the default font size and weight for headings.\n*/\n\n  h1,\n  h2,\n  h3,\n  h4,\n  h5,\n  h6 {\n    font-size: inherit;\n    font-weight: inherit;\n  }\n\n  /*\n  Reset links to optimize for opt-in styling instead of opt-out.\n*/\n\n  a {\n    color: inherit;\n    -webkit-text-decoration: inherit;\n    text-decoration: inherit;\n  }\n\n  /*\n  Add the correct font weight in Edge and Safari.\n*/\n\n  b,\n  strong {\n    font-weight: bolder;\n  }\n\n  /*\n  1. Use the user's configured \\`mono\\` font-family by default.\n  2. Use the user's configured \\`mono\\` font-feature-settings by default.\n  3. Use the user's configured \\`mono\\` font-variation-settings by default.\n  4. Correct the odd \\`em\\` font sizing in all browsers.\n*/\n\n  code,\n  kbd,\n  samp,\n  pre {\n    font-family: --theme(\n      --default-mono-font-family,\n      ui-monospace,\n      SFMono-Regular,\n      Menlo,\n      Monaco,\n      Consolas,\n      \"Liberation Mono\",\n      \"Courier New\",\n      monospace\n    ); /* 1 */\n    font-feature-settings: --theme(\n      --default-mono-font-feature-settings,\n      normal\n    ); /* 2 */\n    font-variation-settings: --theme(\n      --default-mono-font-variation-settings,\n      normal\n    ); /* 3 */\n    font-size: 1em; /* 4 */\n  }\n\n  /*\n  Add the correct font size in all browsers.\n*/\n\n  small {\n    font-size: 80%;\n  }\n\n  /*\n  Prevent \\`sub\\` and \\`sup\\` elements from affecting the line height in all browsers.\n*/\n\n  sub,\n  sup {\n    font-size: 75%;\n    line-height: 0;\n    position: relative;\n    vertical-align: baseline;\n  }\n\n  sub {\n    bottom: -0.25em;\n  }\n\n  sup {\n    top: -0.5em;\n  }\n\n  /*\n  1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n  2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n  3. Remove gaps between table borders by default.\n*/\n\n  table {\n    text-indent: 0; /* 1 */\n    border-color: inherit; /* 2 */\n    border-collapse: collapse; /* 3 */\n  }\n\n  /*\n  Use the modern Firefox focus style for all focusable elements.\n*/\n\n  :-moz-focusring {\n    outline: auto;\n  }\n\n  /*\n  Add the correct vertical alignment in Chrome and Firefox.\n*/\n\n  progress {\n    vertical-align: baseline;\n  }\n\n  /*\n  Add the correct display in Chrome and Safari.\n*/\n\n  summary {\n    display: list-item;\n  }\n\n  /*\n  Make lists unstyled by default.\n*/\n\n  ol,\n  ul,\n  menu {\n    list-style: none;\n  }\n\n  /*\n  1. Make replaced elements \\`display: block\\` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n  2. Add \\`vertical - align: middle\\` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n      This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\n  img,\n  svg,\n  video,\n  canvas,\n  audio,\n  iframe,\n  embed,\n  object {\n    display: block; /* 1 */\n    vertical-align: middle; /* 2 */\n  }\n\n  /*\n  Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\n  img,\n  video {\n    max-width: 100%;\n    height: auto;\n  }\n\n  /*\n  1. Inherit font styles in all browsers.\n  2. Remove border radius in all browsers.\n  3. Remove background color in all browsers.\n  4. Ensure consistent opacity for disabled states in all browsers.\n*/\n\n  button,\n  input,\n  select,\n  optgroup,\n  textarea,\n  ::file-selector-button {\n    font: inherit; /* 1 */\n    font-feature-settings: inherit; /* 1 */\n    font-variation-settings: inherit; /* 1 */\n    letter-spacing: inherit; /* 1 */\n    color: inherit; /* 1 */\n    border-radius: 0; /* 2 */\n    background-color: transparent; /* 3 */\n    opacity: 1; /* 4 */\n  }\n\n  /*\n  Restore default font weight.\n*/\n\n  :where(select:is([multiple], [size])) optgroup {\n    font-weight: bolder;\n  }\n\n  /*\n  Restore indentation.\n*/\n\n  :where(select:is([multiple], [size])) optgroup option {\n    padding-inline-start: 20px;\n  }\n\n  /*\n  Restore space after button.\n*/\n\n  ::file-selector-button {\n    margin-inline-end: 4px;\n  }\n\n  /*\n  Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n*/\n\n  ::placeholder {\n    opacity: 1;\n  }\n\n  /*\n  Set the default placeholder color to a semi-transparent version of the current text color in browsers that do not\n  crash when using \\`color - mix(…)\\` with \\`currentcolor\\`. (https://github.com/tailwindlabs/tailwindcss/issues/17194)\n*/\n\n  @supports (not (-webkit-appearance: -apple-pay-button)) /* Not Safari */ or\n    (contain-intrinsic-size: 1px) /* Safari 17+ */ {\n    ::placeholder {\n      color: color-mix(in oklab, currentcolor 50%, transparent);\n    }\n  }\n\n  /*\n  Prevent resizing textareas horizontally by default.\n*/\n\n  textarea {\n    resize: vertical;\n  }\n\n  /*\n  Remove the inner padding in Chrome and Safari on macOS.\n*/\n\n  ::-webkit-search-decoration {\n    -webkit-appearance: none;\n  }\n\n  /*\n  1. Ensure date/time inputs have the same height when empty in iOS Safari.\n  2. Ensure text alignment can be changed on date/time inputs in iOS Safari.\n*/\n\n  ::-webkit-date-and-time-value {\n    min-height: 1lh; /* 1 */\n    text-align: inherit; /* 2 */\n  }\n\n  /*\n  Prevent height from changing on date/time inputs in macOS Safari when the input is set to \\`display: block\\`.\n*/\n\n  ::-webkit-datetime-edit {\n    display: inline-flex;\n  }\n\n  /*\n  Remove excess padding from pseudo-elements in date/time inputs to ensure consistent height across browsers.\n*/\n\n  ::-webkit-datetime-edit-fields-wrapper {\n    padding: 0;\n  }\n\n  ::-webkit-datetime-edit,\n  ::-webkit-datetime-edit-year-field,\n  ::-webkit-datetime-edit-month-field,\n  ::-webkit-datetime-edit-day-field,\n  ::-webkit-datetime-edit-hour-field,\n  ::-webkit-datetime-edit-minute-field,\n  ::-webkit-datetime-edit-second-field,\n  ::-webkit-datetime-edit-millisecond-field,\n  ::-webkit-datetime-edit-meridiem-field {\n    padding-block: 0;\n  }\n\n  /*\n  Center dropdown marker shown on inputs with paired \\`<datalist>\\`s in Chrome. (https://github.com/tailwindlabs/tailwindcss/issues/18499)\n*/\n\n  ::-webkit-calendar-picker-indicator {\n    line-height: 1;\n  }\n\n  /*\n  Remove the additional \\`: invalid\\` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n  :-moz-ui-invalid {\n    box-shadow: none;\n  }\n\n  /*\n  Correct the inability to style the border radius in iOS Safari.\n*/\n\n  button,\n  input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]),\n  ::file-selector-button {\n    appearance: button;\n  }\n\n  /*\n  Correct the cursor style of increment and decrement buttons in Safari.\n*/\n\n  ::-webkit-inner-spin-button,\n  ::-webkit-outer-spin-button {\n    height: auto;\n  }\n\n  /*\n  Make elements with the HTML hidden attribute stay hidden by default.\n*/\n\n  [hidden]:where(:not([hidden=\"until-found\"])) {\n    display: none !important;\n  }\n}\n\n@layer utilities {\n  @tailwind utilities;\n}\n`;\n\nexport default css;\n","const css = `\n/*\n  1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n  2. Remove default margins and padding\n  3. Reset all borders.\n*/\n\n*,\n::after,\n::before,\n::backdrop,\n::file-selector-button {\n  box-sizing: border-box; /* 1 */\n  margin: 0; /* 2 */\n  padding: 0; /* 2 */\n  border: 0 solid; /* 3 */\n}\n\n/*\n  1. Use a consistent sensible line-height in all browsers.\n  2. Prevent adjustments of font size after orientation changes in iOS.\n  3. Use a more readable tab size.\n  4. Use the user's configured \\`sans\\` font-family by default.\n  5. Use the user's configured \\`sans\\` font-feature-settings by default.\n  6. Use the user's configured \\`sans\\` font-variation-settings by default.\n  7. Disable tap highlights on iOS.\n*/\n\nhtml,\n:host {\n  line-height: 1.5; /* 1 */\n  -webkit-text-size-adjust: 100%; /* 2 */\n  tab-size: 4; /* 3 */\n  font-family: --theme(\n    --default-font-family,\n    ui-sans-serif,\n    system-ui,\n    sans-serif,\n    'Apple Color Emoji',\n    'Segoe UI Emoji',\n    'Segoe UI Symbol',\n    'Noto Color Emoji'\n  ); /* 4 */\n  font-feature-settings: --theme(--default-font-feature-settings, normal); /* 5 */\n  font-variation-settings: --theme(--default-font-variation-settings, normal); /* 6 */\n  -webkit-tap-highlight-color: transparent; /* 7 */\n}\n\n/*\n  1. Add the correct height in Firefox.\n  2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n  3. Reset the default border style to a 1px solid border.\n*/\n\nhr {\n  height: 0; /* 1 */\n  color: inherit; /* 2 */\n  border-top-width: 1px; /* 3 */\n}\n\n/*\n  Add the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n}\n\n/*\n  Remove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  font-size: inherit;\n  font-weight: inherit;\n}\n\n/*\n  Reset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n  color: inherit;\n  -webkit-text-decoration: inherit;\n  text-decoration: inherit;\n}\n\n/*\n  Add the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\n/*\n  1. Use the user's configured \\`mono\\` font-family by default.\n  2. Use the user's configured \\`mono\\` font-feature-settings by default.\n  3. Use the user's configured \\`mono\\` font-variation-settings by default.\n  4. Correct the odd \\`em\\` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n  font-family: --theme(\n    --default-mono-font-family,\n    ui-monospace,\n    SFMono-Regular,\n    Menlo,\n    Monaco,\n    Consolas,\n    'Liberation Mono',\n    'Courier New',\n    monospace\n  ); /* 1 */\n  font-feature-settings: --theme(--default-mono-font-feature-settings, normal); /* 2 */\n  font-variation-settings: --theme(--default-mono-font-variation-settings, normal); /* 3 */\n  font-size: 1em; /* 4 */\n}\n\n/*\n  Add the correct font size in all browsers.\n*/\n\nsmall {\n  font-size: 80%;\n}\n\n/*\n  Prevent \\`sub\\` and \\`sup\\` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\n/*\n  1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n  2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n  3. Remove gaps between table borders by default.\n*/\n\ntable {\n  text-indent: 0; /* 1 */\n  border-color: inherit; /* 2 */\n  border-collapse: collapse; /* 3 */\n}\n\n/*\n  Use the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n  outline: auto;\n}\n\n/*\n  Add the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n  vertical-align: baseline;\n}\n\n/*\n  Add the correct display in Chrome and Safari.\n*/\n\nsummary {\n  display: list-item;\n}\n\n/*\n  Make lists unstyled by default.\n*/\n\nol,\nul,\nmenu {\n  list-style: none;\n}\n\n/*\n  1. Make replaced elements \\`display: block\\` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n  2. Add \\`vertical-align: middle\\` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n      This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n  display: block; /* 1 */\n  vertical-align: middle; /* 2 */\n}\n\n/*\n  Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n  max-width: 100%;\n  height: auto;\n}\n\n/*\n  1. Inherit font styles in all browsers.\n  2. Remove border radius in all browsers.\n  3. Remove background color in all browsers.\n  4. Ensure consistent opacity for disabled states in all browsers.\n*/\n\nbutton,\ninput,\nselect,\noptgroup,\ntextarea,\n::file-selector-button {\n  font: inherit; /* 1 */\n  font-feature-settings: inherit; /* 1 */\n  font-variation-settings: inherit; /* 1 */\n  letter-spacing: inherit; /* 1 */\n  color: inherit; /* 1 */\n  border-radius: 0; /* 2 */\n  background-color: transparent; /* 3 */\n  opacity: 1; /* 4 */\n}\n\n/*\n  Restore default font weight.\n*/\n\n:where(select:is([multiple], [size])) optgroup {\n  font-weight: bolder;\n}\n\n/*\n  Restore indentation.\n*/\n\n:where(select:is([multiple], [size])) optgroup option {\n  padding-inline-start: 20px;\n}\n\n/*\n  Restore space after button.\n*/\n\n::file-selector-button {\n  margin-inline-end: 4px;\n}\n\n/*\n  Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n*/\n\n::placeholder {\n  opacity: 1;\n}\n\n/*\n  Set the default placeholder color to a semi-transparent version of the current text color in browsers that do not\n  crash when using \\`color-mix(…)\\` with \\`currentcolor\\`. (https://github.com/tailwindlabs/tailwindcss/issues/17194)\n*/\n\n@supports (not (-webkit-appearance: -apple-pay-button)) /* Not Safari */ or\n  (contain-intrinsic-size: 1px) /* Safari 17+ */ {\n  ::placeholder {\n    color: color-mix(in oklab, currentcolor 50%, transparent);\n  }\n}\n\n/*\n  Prevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n  resize: vertical;\n}\n\n/*\n  Remove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n/*\n  1. Ensure date/time inputs have the same height when empty in iOS Safari.\n  2. Ensure text alignment can be changed on date/time inputs in iOS Safari.\n*/\n\n::-webkit-date-and-time-value {\n  min-height: 1lh; /* 1 */\n  text-align: inherit; /* 2 */\n}\n\n/*\n  Prevent height from changing on date/time inputs in macOS Safari when the input is set to \\`display: block\\`.\n*/\n\n::-webkit-datetime-edit {\n  display: inline-flex;\n}\n\n/*\n  Remove excess padding from pseudo-elements in date/time inputs to ensure consistent height across browsers.\n*/\n\n::-webkit-datetime-edit-fields-wrapper {\n  padding: 0;\n}\n\n::-webkit-datetime-edit,\n::-webkit-datetime-edit-year-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-minute-field,\n::-webkit-datetime-edit-second-field,\n::-webkit-datetime-edit-millisecond-field,\n::-webkit-datetime-edit-meridiem-field {\n  padding-block: 0;\n}\n\n/*\n  Center dropdown marker shown on inputs with paired \\`<datalist>\\`s in Chrome. (https://github.com/tailwindlabs/tailwindcss/issues/18499)\n*/\n\n::-webkit-calendar-picker-indicator {\n  line-height: 1;\n}\n\n/*\n  Remove the additional \\`:invalid\\` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n  box-shadow: none;\n}\n\n/*\n  Correct the inability to style the border radius in iOS Safari.\n*/\n\nbutton,\ninput:where([type='button'], [type='reset'], [type='submit']),\n::file-selector-button {\n  appearance: button;\n}\n\n/*\n  Correct the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/*\n  Make elements with the HTML hidden attribute stay hidden by default.\n*/\n\n[hidden]:where(:not([hidden='until-found'])) {\n  display: none !important;\n}\n`;\n\nexport default css;\n","const css = `\n@theme default {\n  --font-sans:\n    ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',\n    'Noto Color Emoji';\n  --font-serif: ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif;\n  --font-mono:\n    ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',\n    monospace;\n\n  --color-red-50: oklch(97.1% 0.013 17.38);\n  --color-red-100: oklch(93.6% 0.032 17.717);\n  --color-red-200: oklch(88.5% 0.062 18.334);\n  --color-red-300: oklch(80.8% 0.114 19.571);\n  --color-red-400: oklch(70.4% 0.191 22.216);\n  --color-red-500: oklch(63.7% 0.237 25.331);\n  --color-red-600: oklch(57.7% 0.245 27.325);\n  --color-red-700: oklch(50.5% 0.213 27.518);\n  --color-red-800: oklch(44.4% 0.177 26.899);\n  --color-red-900: oklch(39.6% 0.141 25.723);\n  --color-red-950: oklch(25.8% 0.092 26.042);\n\n  --color-orange-50: oklch(98% 0.016 73.684);\n  --color-orange-100: oklch(95.4% 0.038 75.164);\n  --color-orange-200: oklch(90.1% 0.076 70.697);\n  --color-orange-300: oklch(83.7% 0.128 66.29);\n  --color-orange-400: oklch(75% 0.183 55.934);\n  --color-orange-500: oklch(70.5% 0.213 47.604);\n  --color-orange-600: oklch(64.6% 0.222 41.116);\n  --color-orange-700: oklch(55.3% 0.195 38.402);\n  --color-orange-800: oklch(47% 0.157 37.304);\n  --color-orange-900: oklch(40.8% 0.123 38.172);\n  --color-orange-950: oklch(26.6% 0.079 36.259);\n\n  --color-amber-50: oklch(98.7% 0.022 95.277);\n  --color-amber-100: oklch(96.2% 0.059 95.617);\n  --color-amber-200: oklch(92.4% 0.12 95.746);\n  --color-amber-300: oklch(87.9% 0.169 91.605);\n  --color-amber-400: oklch(82.8% 0.189 84.429);\n  --color-amber-500: oklch(76.9% 0.188 70.08);\n  --color-amber-600: oklch(66.6% 0.179 58.318);\n  --color-amber-700: oklch(55.5% 0.163 48.998);\n  --color-amber-800: oklch(47.3% 0.137 46.201);\n  --color-amber-900: oklch(41.4% 0.112 45.904);\n  --color-amber-950: oklch(27.9% 0.077 45.635);\n\n  --color-yellow-50: oklch(98.7% 0.026 102.212);\n  --color-yellow-100: oklch(97.3% 0.071 103.193);\n  --color-yellow-200: oklch(94.5% 0.129 101.54);\n  --color-yellow-300: oklch(90.5% 0.182 98.111);\n  --color-yellow-400: oklch(85.2% 0.199 91.936);\n  --color-yellow-500: oklch(79.5% 0.184 86.047);\n  --color-yellow-600: oklch(68.1% 0.162 75.834);\n  --color-yellow-700: oklch(55.4% 0.135 66.442);\n  --color-yellow-800: oklch(47.6% 0.114 61.907);\n  --color-yellow-900: oklch(42.1% 0.095 57.708);\n  --color-yellow-950: oklch(28.6% 0.066 53.813);\n\n  --color-lime-50: oklch(98.6% 0.031 120.757);\n  --color-lime-100: oklch(96.7% 0.067 122.328);\n  --color-lime-200: oklch(93.8% 0.127 124.321);\n  --color-lime-300: oklch(89.7% 0.196 126.665);\n  --color-lime-400: oklch(84.1% 0.238 128.85);\n  --color-lime-500: oklch(76.8% 0.233 130.85);\n  --color-lime-600: oklch(64.8% 0.2 131.684);\n  --color-lime-700: oklch(53.2% 0.157 131.589);\n  --color-lime-800: oklch(45.3% 0.124 130.933);\n  --color-lime-900: oklch(40.5% 0.101 131.063);\n  --color-lime-950: oklch(27.4% 0.072 132.109);\n\n  --color-green-50: oklch(98.2% 0.018 155.826);\n  --color-green-100: oklch(96.2% 0.044 156.743);\n  --color-green-200: oklch(92.5% 0.084 155.995);\n  --color-green-300: oklch(87.1% 0.15 154.449);\n  --color-green-400: oklch(79.2% 0.209 151.711);\n  --color-green-500: oklch(72.3% 0.219 149.579);\n  --color-green-600: oklch(62.7% 0.194 149.214);\n  --color-green-700: oklch(52.7% 0.154 150.069);\n  --color-green-800: oklch(44.8% 0.119 151.328);\n  --color-green-900: oklch(39.3% 0.095 152.535);\n  --color-green-950: oklch(26.6% 0.065 152.934);\n\n  --color-emerald-50: oklch(97.9% 0.021 166.113);\n  --color-emerald-100: oklch(95% 0.052 163.051);\n  --color-emerald-200: oklch(90.5% 0.093 164.15);\n  --color-emerald-300: oklch(84.5% 0.143 164.978);\n  --color-emerald-400: oklch(76.5% 0.177 163.223);\n  --color-emerald-500: oklch(69.6% 0.17 162.48);\n  --color-emerald-600: oklch(59.6% 0.145 163.225);\n  --color-emerald-700: oklch(50.8% 0.118 165.612);\n  --color-emerald-800: oklch(43.2% 0.095 166.913);\n  --color-emerald-900: oklch(37.8% 0.077 168.94);\n  --color-emerald-950: oklch(26.2% 0.051 172.552);\n\n  --color-teal-50: oklch(98.4% 0.014 180.72);\n  --color-teal-100: oklch(95.3% 0.051 180.801);\n  --color-teal-200: oklch(91% 0.096 180.426);\n  --color-teal-300: oklch(85.5% 0.138 181.071);\n  --color-teal-400: oklch(77.7% 0.152 181.912);\n  --color-teal-500: oklch(70.4% 0.14 182.503);\n  --color-teal-600: oklch(60% 0.118 184.704);\n  --color-teal-700: oklch(51.1% 0.096 186.391);\n  --color-teal-800: oklch(43.7% 0.078 188.216);\n  --color-teal-900: oklch(38.6% 0.063 188.416);\n  --color-teal-950: oklch(27.7% 0.046 192.524);\n\n  --color-cyan-50: oklch(98.4% 0.019 200.873);\n  --color-cyan-100: oklch(95.6% 0.045 203.388);\n  --color-cyan-200: oklch(91.7% 0.08 205.041);\n  --color-cyan-300: oklch(86.5% 0.127 207.078);\n  --color-cyan-400: oklch(78.9% 0.154 211.53);\n  --color-cyan-500: oklch(71.5% 0.143 215.221);\n  --color-cyan-600: oklch(60.9% 0.126 221.723);\n  --color-cyan-700: oklch(52% 0.105 223.128);\n  --color-cyan-800: oklch(45% 0.085 224.283);\n  --color-cyan-900: oklch(39.8% 0.07 227.392);\n  --color-cyan-950: oklch(30.2% 0.056 229.695);\n\n  --color-sky-50: oklch(97.7% 0.013 236.62);\n  --color-sky-100: oklch(95.1% 0.026 236.824);\n  --color-sky-200: oklch(90.1% 0.058 230.902);\n  --color-sky-300: oklch(82.8% 0.111 230.318);\n  --color-sky-400: oklch(74.6% 0.16 232.661);\n  --color-sky-500: oklch(68.5% 0.169 237.323);\n  --color-sky-600: oklch(58.8% 0.158 241.966);\n  --color-sky-700: oklch(50% 0.134 242.749);\n  --color-sky-800: oklch(44.3% 0.11 240.79);\n  --color-sky-900: oklch(39.1% 0.09 240.876);\n  --color-sky-950: oklch(29.3% 0.066 243.157);\n\n  --color-blue-50: oklch(97% 0.014 254.604);\n  --color-blue-100: oklch(93.2% 0.032 255.585);\n  --color-blue-200: oklch(88.2% 0.059 254.128);\n  --color-blue-300: oklch(80.9% 0.105 251.813);\n  --color-blue-400: oklch(70.7% 0.165 254.624);\n  --color-blue-500: oklch(62.3% 0.214 259.815);\n  --color-blue-600: oklch(54.6% 0.245 262.881);\n  --color-blue-700: oklch(48.8% 0.243 264.376);\n  --color-blue-800: oklch(42.4% 0.199 265.638);\n  --color-blue-900: oklch(37.9% 0.146 265.522);\n  --color-blue-950: oklch(28.2% 0.091 267.935);\n\n  --color-indigo-50: oklch(96.2% 0.018 272.314);\n  --color-indigo-100: oklch(93% 0.034 272.788);\n  --color-indigo-200: oklch(87% 0.065 274.039);\n  --color-indigo-300: oklch(78.5% 0.115 274.713);\n  --color-indigo-400: oklch(67.3% 0.182 276.935);\n  --color-indigo-500: oklch(58.5% 0.233 277.117);\n  --color-indigo-600: oklch(51.1% 0.262 276.966);\n  --color-indigo-700: oklch(45.7% 0.24 277.023);\n  --color-indigo-800: oklch(39.8% 0.195 277.366);\n  --color-indigo-900: oklch(35.9% 0.144 278.697);\n  --color-indigo-950: oklch(25.7% 0.09 281.288);\n\n  --color-violet-50: oklch(96.9% 0.016 293.756);\n  --color-violet-100: oklch(94.3% 0.029 294.588);\n  --color-violet-200: oklch(89.4% 0.057 293.283);\n  --color-violet-300: oklch(81.1% 0.111 293.571);\n  --color-violet-400: oklch(70.2% 0.183 293.541);\n  --color-violet-500: oklch(60.6% 0.25 292.717);\n  --color-violet-600: oklch(54.1% 0.281 293.009);\n  --color-violet-700: oklch(49.1% 0.27 292.581);\n  --color-violet-800: oklch(43.2% 0.232 292.759);\n  --color-violet-900: oklch(38% 0.189 293.745);\n  --color-violet-950: oklch(28.3% 0.141 291.089);\n\n  --color-purple-50: oklch(97.7% 0.014 308.299);\n  --color-purple-100: oklch(94.6% 0.033 307.174);\n  --color-purple-200: oklch(90.2% 0.063 306.703);\n  --color-purple-300: oklch(82.7% 0.119 306.383);\n  --color-purple-400: oklch(71.4% 0.203 305.504);\n  --color-purple-500: oklch(62.7% 0.265 303.9);\n  --color-purple-600: oklch(55.8% 0.288 302.321);\n  --color-purple-700: oklch(49.6% 0.265 301.924);\n  --color-purple-800: oklch(43.8% 0.218 303.724);\n  --color-purple-900: oklch(38.1% 0.176 304.987);\n  --color-purple-950: oklch(29.1% 0.149 302.717);\n\n  --color-fuchsia-50: oklch(97.7% 0.017 320.058);\n  --color-fuchsia-100: oklch(95.2% 0.037 318.852);\n  --color-fuchsia-200: oklch(90.3% 0.076 319.62);\n  --color-fuchsia-300: oklch(83.3% 0.145 321.434);\n  --color-fuchsia-400: oklch(74% 0.238 322.16);\n  --color-fuchsia-500: oklch(66.7% 0.295 322.15);\n  --color-fuchsia-600: oklch(59.1% 0.293 322.896);\n  --color-fuchsia-700: oklch(51.8% 0.253 323.949);\n  --color-fuchsia-800: oklch(45.2% 0.211 324.591);\n  --color-fuchsia-900: oklch(40.1% 0.17 325.612);\n  --color-fuchsia-950: oklch(29.3% 0.136 325.661);\n\n  --color-pink-50: oklch(97.1% 0.014 343.198);\n  --color-pink-100: oklch(94.8% 0.028 342.258);\n  --color-pink-200: oklch(89.9% 0.061 343.231);\n  --color-pink-300: oklch(82.3% 0.12 346.018);\n  --color-pink-400: oklch(71.8% 0.202 349.761);\n  --color-pink-500: oklch(65.6% 0.241 354.308);\n  --color-pink-600: oklch(59.2% 0.249 0.584);\n  --color-pink-700: oklch(52.5% 0.223 3.958);\n  --color-pink-800: oklch(45.9% 0.187 3.815);\n  --color-pink-900: oklch(40.8% 0.153 2.432);\n  --color-pink-950: oklch(28.4% 0.109 3.907);\n\n  --color-rose-50: oklch(96.9% 0.015 12.422);\n  --color-rose-100: oklch(94.1% 0.03 12.58);\n  --color-rose-200: oklch(89.2% 0.058 10.001);\n  --color-rose-300: oklch(81% 0.117 11.638);\n  --color-rose-400: oklch(71.2% 0.194 13.428);\n  --color-rose-500: oklch(64.5% 0.246 16.439);\n  --color-rose-600: oklch(58.6% 0.253 17.585);\n  --color-rose-700: oklch(51.4% 0.222 16.935);\n  --color-rose-800: oklch(45.5% 0.188 13.697);\n  --color-rose-900: oklch(41% 0.159 10.272);\n  --color-rose-950: oklch(27.1% 0.105 12.094);\n\n  --color-slate-50: oklch(98.4% 0.003 247.858);\n  --color-slate-100: oklch(96.8% 0.007 247.896);\n  --color-slate-200: oklch(92.9% 0.013 255.508);\n  --color-slate-300: oklch(86.9% 0.022 252.894);\n  --color-slate-400: oklch(70.4% 0.04 256.788);\n  --color-slate-500: oklch(55.4% 0.046 257.417);\n  --color-slate-600: oklch(44.6% 0.043 257.281);\n  --color-slate-700: oklch(37.2% 0.044 257.287);\n  --color-slate-800: oklch(27.9% 0.041 260.031);\n  --color-slate-900: oklch(20.8% 0.042 265.755);\n  --color-slate-950: oklch(12.9% 0.042 264.695);\n\n  --color-gray-50: oklch(98.5% 0.002 247.839);\n  --color-gray-100: oklch(96.7% 0.003 264.542);\n  --color-gray-200: oklch(92.8% 0.006 264.531);\n  --color-gray-300: oklch(87.2% 0.01 258.338);\n  --color-gray-400: oklch(70.7% 0.022 261.325);\n  --color-gray-500: oklch(55.1% 0.027 264.364);\n  --color-gray-600: oklch(44.6% 0.03 256.802);\n  --color-gray-700: oklch(37.3% 0.034 259.733);\n  --color-gray-800: oklch(27.8% 0.033 256.848);\n  --color-gray-900: oklch(21% 0.034 264.665);\n  --color-gray-950: oklch(13% 0.028 261.692);\n\n  --color-zinc-50: oklch(98.5% 0 0);\n  --color-zinc-100: oklch(96.7% 0.001 286.375);\n  --color-zinc-200: oklch(92% 0.004 286.32);\n  --color-zinc-300: oklch(87.1% 0.006 286.286);\n  --color-zinc-400: oklch(70.5% 0.015 286.067);\n  --color-zinc-500: oklch(55.2% 0.016 285.938);\n  --color-zinc-600: oklch(44.2% 0.017 285.786);\n  --color-zinc-700: oklch(37% 0.013 285.805);\n  --color-zinc-800: oklch(27.4% 0.006 286.033);\n  --color-zinc-900: oklch(21% 0.006 285.885);\n  --color-zinc-950: oklch(14.1% 0.005 285.823);\n\n  --color-neutral-50: oklch(98.5% 0 0);\n  --color-neutral-100: oklch(97% 0 0);\n  --color-neutral-200: oklch(92.2% 0 0);\n  --color-neutral-300: oklch(87% 0 0);\n  --color-neutral-400: oklch(70.8% 0 0);\n  --color-neutral-500: oklch(55.6% 0 0);\n  --color-neutral-600: oklch(43.9% 0 0);\n  --color-neutral-700: oklch(37.1% 0 0);\n  --color-neutral-800: oklch(26.9% 0 0);\n  --color-neutral-900: oklch(20.5% 0 0);\n  --color-neutral-950: oklch(14.5% 0 0);\n\n  --color-stone-50: oklch(98.5% 0.001 106.423);\n  --color-stone-100: oklch(97% 0.001 106.424);\n  --color-stone-200: oklch(92.3% 0.003 48.717);\n  --color-stone-300: oklch(86.9% 0.005 56.366);\n  --color-stone-400: oklch(70.9% 0.01 56.259);\n  --color-stone-500: oklch(55.3% 0.013 58.071);\n  --color-stone-600: oklch(44.4% 0.011 73.639);\n  --color-stone-700: oklch(37.4% 0.01 67.558);\n  --color-stone-800: oklch(26.8% 0.007 34.298);\n  --color-stone-900: oklch(21.6% 0.006 56.043);\n  --color-stone-950: oklch(14.7% 0.004 49.25);\n\n  --color-black: #000;\n  --color-white: #fff;\n\n  --spacing: 0.25rem;\n\n  --breakpoint-sm: 40rem;\n  --breakpoint-md: 48rem;\n  --breakpoint-lg: 64rem;\n  --breakpoint-xl: 80rem;\n  --breakpoint-2xl: 96rem;\n\n  --container-3xs: 16rem;\n  --container-2xs: 18rem;\n  --container-xs: 20rem;\n  --container-sm: 24rem;\n  --container-md: 28rem;\n  --container-lg: 32rem;\n  --container-xl: 36rem;\n  --container-2xl: 42rem;\n  --container-3xl: 48rem;\n  --container-4xl: 56rem;\n  --container-5xl: 64rem;\n  --container-6xl: 72rem;\n  --container-7xl: 80rem;\n\n  --text-xs: 0.75rem;\n  --text-xs--line-height: calc(1 / 0.75);\n  --text-sm: 0.875rem;\n  --text-sm--line-height: calc(1.25 / 0.875);\n  --text-base: 1rem;\n  --text-base--line-height: calc(1.5 / 1);\n  --text-lg: 1.125rem;\n  --text-lg--line-height: calc(1.75 / 1.125);\n  --text-xl: 1.25rem;\n  --text-xl--line-height: calc(1.75 / 1.25);\n  --text-2xl: 1.5rem;\n  --text-2xl--line-height: calc(2 / 1.5);\n  --text-3xl: 1.875rem;\n  --text-3xl--line-height: calc(2.25 / 1.875);\n  --text-4xl: 2.25rem;\n  --text-4xl--line-height: calc(2.5 / 2.25);\n  --text-5xl: 3rem;\n  --text-5xl--line-height: 1;\n  --text-6xl: 3.75rem;\n  --text-6xl--line-height: 1;\n  --text-7xl: 4.5rem;\n  --text-7xl--line-height: 1;\n  --text-8xl: 6rem;\n  --text-8xl--line-height: 1;\n  --text-9xl: 8rem;\n  --text-9xl--line-height: 1;\n\n  --font-weight-thin: 100;\n  --font-weight-extralight: 200;\n  --font-weight-light: 300;\n  --font-weight-normal: 400;\n  --font-weight-medium: 500;\n  --font-weight-semibold: 600;\n  --font-weight-bold: 700;\n  --font-weight-extrabold: 800;\n  --font-weight-black: 900;\n\n  --tracking-tighter: -0.05em;\n  --tracking-tight: -0.025em;\n  --tracking-normal: 0em;\n  --tracking-wide: 0.025em;\n  --tracking-wider: 0.05em;\n  --tracking-widest: 0.1em;\n\n  --leading-tight: 1.25;\n  --leading-snug: 1.375;\n  --leading-normal: 1.5;\n  --leading-relaxed: 1.625;\n  --leading-loose: 2;\n\n  --radius-xs: 0.125rem;\n  --radius-sm: 0.25rem;\n  --radius-md: 0.375rem;\n  --radius-lg: 0.5rem;\n  --radius-xl: 0.75rem;\n  --radius-2xl: 1rem;\n  --radius-3xl: 1.5rem;\n  --radius-4xl: 2rem;\n\n  --shadow-2xs: 0 1px rgb(0 0 0 / 0.05);\n  --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n  --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n  --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n  --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n  --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n  --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n\n  --inset-shadow-2xs: inset 0 1px rgb(0 0 0 / 0.05);\n  --inset-shadow-xs: inset 0 1px 1px rgb(0 0 0 / 0.05);\n  --inset-shadow-sm: inset 0 2px 4px rgb(0 0 0 / 0.05);\n\n  --drop-shadow-xs: 0 1px 1px rgb(0 0 0 / 0.05);\n  --drop-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.15);\n  --drop-shadow-md: 0 3px 3px rgb(0 0 0 / 0.12);\n  --drop-shadow-lg: 0 4px 4px rgb(0 0 0 / 0.15);\n  --drop-shadow-xl: 0 9px 7px rgb(0 0 0 / 0.1);\n  --drop-shadow-2xl: 0 25px 25px rgb(0 0 0 / 0.15);\n\n  --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / 0.15);\n  --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / 0.2);\n  --text-shadow-sm:\n    0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075), 0px 2px 2px rgb(0 0 0 / 0.075);\n  --text-shadow-md:\n    0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1), 0px 2px 4px rgb(0 0 0 / 0.1);\n  --text-shadow-lg:\n    0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1), 0px 4px 8px rgb(0 0 0 / 0.1);\n\n  --ease-in: cubic-bezier(0.4, 0, 1, 1);\n  --ease-out: cubic-bezier(0, 0, 0.2, 1);\n  --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n\n  --animate-spin: spin 1s linear infinite;\n  --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\n  --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n  --animate-bounce: bounce 1s infinite;\n\n  @keyframes spin {\n    to {\n      transform: rotate(360deg);\n    }\n  }\n\n  @keyframes ping {\n    75%,\n    100% {\n      transform: scale(2);\n      opacity: 0;\n    }\n  }\n\n  @keyframes pulse {\n    50% {\n      opacity: 0.5;\n    }\n  }\n\n  @keyframes bounce {\n    0%,\n    100% {\n      transform: translateY(-25%);\n      animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n    }\n\n    50% {\n      transform: none;\n      animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n    }\n  }\n\n  --blur-xs: 4px;\n  --blur-sm: 8px;\n  --blur-md: 12px;\n  --blur-lg: 16px;\n  --blur-xl: 24px;\n  --blur-2xl: 40px;\n  --blur-3xl: 64px;\n\n  --perspective-dramatic: 100px;\n  --perspective-near: 300px;\n  --perspective-normal: 500px;\n  --perspective-midrange: 800px;\n  --perspective-distant: 1200px;\n\n  --aspect-video: 16 / 9;\n\n  --default-transition-duration: 150ms;\n  --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n  --default-font-family: --theme(--font-sans, initial);\n  --default-font-feature-settings: --theme(--font-sans--font-feature-settings, initial);\n  --default-font-variation-settings: --theme(--font-sans--font-variation-settings, initial);\n  --default-mono-font-family: --theme(--font-mono, initial);\n  --default-mono-font-feature-settings: --theme(--font-mono--font-feature-settings, initial);\n  --default-mono-font-variation-settings: --theme(--font-mono--font-variation-settings, initial);\n}\n\n/* Deprecated */\n@theme default inline reference {\n  --blur: 8px;\n  --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n  --shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);\n  --drop-shadow: 0 1px 2px rgb(0 0 0 / 0.1), 0 1px 1px rgb(0 0 0 / 0.06);\n  --radius: 0.25rem;\n  --max-width-prose: 65ch;\n}\n`;\n\nexport default css;\n","const css = `\n@tailwind utilities;\n`;\n\nexport default css;\n","import { parse, type StyleSheet } from 'css-tree';\nimport { compile } from 'tailwindcss';\nimport type { TailwindConfig } from '../../tailwind';\nimport indexCss from './tailwind-stylesheets/index';\nimport preflightCss from './tailwind-stylesheets/preflight';\nimport themeCss from './tailwind-stylesheets/theme';\nimport utilitiesCss from './tailwind-stylesheets/utilities';\n\nexport type TailwindSetup = Awaited<ReturnType<typeof setupTailwind>>;\n\nexport async function setupTailwind(config: TailwindConfig) {\n  const baseCss = `\n@layer theme, base, components, utilities;\n@import \"tailwindcss/theme.css\" layer(theme);\n@import \"tailwindcss/utilities.css\" layer(utilities);\n@config;\n`;\n  const compiler = await compile(baseCss, {\n    async loadModule(id, base, resourceHint) {\n      if (resourceHint === 'config') {\n        return {\n          path: id,\n          base: base,\n          module: config,\n        };\n      }\n\n      throw new Error(\n        `NO-OP: should we implement support for ${resourceHint}?`,\n      );\n    },\n    polyfills: 0, // All\n    async loadStylesheet(id, base) {\n      if (id === 'tailwindcss') {\n        return {\n          base,\n          path: 'tailwindcss/index.css',\n          content: indexCss,\n        };\n      }\n\n      if (id === 'tailwindcss/preflight.css') {\n        return {\n          base,\n          path: id,\n          content: preflightCss,\n        };\n      }\n\n      if (id === 'tailwindcss/theme.css') {\n        return {\n          base,\n          path: id,\n          content: themeCss,\n        };\n      }\n\n      if (id === 'tailwindcss/utilities.css') {\n        return {\n          base,\n          path: id,\n          content: utilitiesCss,\n        };\n      }\n\n      throw new Error(\n        'stylesheet not supported, you can only import the ones from tailwindcss',\n      );\n    },\n  });\n\n  let css: string = baseCss;\n\n  return {\n    addUtilities: function addUtilities(candidates: string[]): void {\n      css = compiler.build(candidates);\n    },\n    getStyleSheet: function getCss() {\n      return parse(css) as StyleSheet;\n    },\n  };\n}\n","import { type CssNode, generate, List, type StyleSheet } from 'css-tree';\nimport * as React from 'react';\nimport type { Config } from 'tailwindcss';\nimport { useSuspensedPromise } from './hooks/use-suspended-promise';\nimport { sanitizeStyleSheet } from './sanitize-stylesheet';\nimport { extractRulesPerClass } from './utils/css/extract-rules-per-class';\nimport { getCustomProperties } from './utils/css/get-custom-properties';\nimport { sanitizeNonInlinableRules } from './utils/css/sanitize-non-inlinable-rules';\nimport { mapReactTree } from './utils/react/map-react-tree';\nimport { cloneElementWithInlinedStyles } from './utils/tailwindcss/clone-element-with-inlined-styles';\nimport { setupTailwind } from './utils/tailwindcss/setup-tailwind';\n\nexport type TailwindConfig = Omit<Config, 'content'>;\n\nexport interface TailwindProps {\n  children: React.ReactNode;\n  config?: TailwindConfig;\n}\n\nexport interface EmailElementProps {\n  children?: React.ReactNode;\n  className?: string;\n  style?: React.CSSProperties;\n}\n\nexport const pixelBasedPreset: TailwindConfig = {\n  theme: {\n    extend: {\n      fontSize: {\n        xs: ['12px', { lineHeight: '16px' }],\n        sm: ['14px', { lineHeight: '20px' }],\n        base: ['16px', { lineHeight: '24px' }],\n        lg: ['18px', { lineHeight: '28px' }],\n        xl: ['20px', { lineHeight: '28px' }],\n        '2xl': ['24px', { lineHeight: '32px' }],\n        '3xl': ['30px', { lineHeight: '36px' }],\n        '4xl': ['36px', { lineHeight: '36px' }],\n        '5xl': ['48px', { lineHeight: '1' }],\n        '6xl': ['60px', { lineHeight: '1' }],\n        '7xl': ['72px', { lineHeight: '1' }],\n        '8xl': ['96px', { lineHeight: '1' }],\n        '9xl': ['144px', { lineHeight: '1' }],\n      },\n      spacing: {\n        px: '1px',\n        0: '0',\n        0.5: '2px',\n        1: '4px',\n        1.5: '6px',\n        2: '8px',\n        2.5: '10px',\n        3: '12px',\n        3.5: '14px',\n        4: '16px',\n        5: '20px',\n        6: '24px',\n        7: '28px',\n        8: '32px',\n        9: '36px',\n        10: '40px',\n        11: '44px',\n        12: '48px',\n        14: '56px',\n        16: '64px',\n        20: '80px',\n        24: '96px',\n        28: '112px',\n        32: '128px',\n        36: '144px',\n        40: '160px',\n        44: '176px',\n        48: '192px',\n        52: '208px',\n        56: '224px',\n        60: '240px',\n        64: '256px',\n        72: '288px',\n        80: '320px',\n        96: '384px',\n      },\n    },\n  },\n};\n\nexport function Tailwind({ children, config }: TailwindProps) {\n  const tailwindSetup = useSuspensedPromise(\n    () => setupTailwind(config ?? {}),\n    JSON.stringify(config, (_key, value) =>\n      typeof value === 'function' ? value.toString() : value,\n    ),\n  );\n  let classesUsed: string[] = [];\n\n  let mappedChildren: React.ReactNode = mapReactTree(children, (node) => {\n    if (React.isValidElement<EmailElementProps>(node)) {\n      if (node.props.className) {\n        const classes = node.props.className?.split(/\\s+/);\n        classesUsed = [...classesUsed, ...classes];\n        tailwindSetup.addUtilities(classes);\n      }\n    }\n\n    return node;\n  });\n\n  const styleSheet = tailwindSetup.getStyleSheet();\n  sanitizeStyleSheet(styleSheet);\n\n  const { inlinable: inlinableRules, nonInlinable: nonInlinableRules } =\n    extractRulesPerClass(styleSheet, classesUsed);\n\n  const customProperties = getCustomProperties(styleSheet);\n\n  const nonInlineStyles: StyleSheet = {\n    type: 'StyleSheet',\n    children: new List<CssNode>().fromArray(\n      Array.from(nonInlinableRules.values()),\n    ),\n  };\n  sanitizeNonInlinableRules(nonInlineStyles);\n\n  const hasNonInlineStylesToApply = nonInlinableRules.size > 0;\n  let appliedNonInlineStyles = false as boolean;\n\n  mappedChildren = mapReactTree(mappedChildren, (node) => {\n    if (React.isValidElement<EmailElementProps>(node)) {\n      const elementWithInlinedStyles = cloneElementWithInlinedStyles(\n        node,\n        inlinableRules,\n        nonInlinableRules,\n        customProperties,\n      );\n\n      if (elementWithInlinedStyles.type === 'head') {\n        appliedNonInlineStyles = true;\n\n        const styleElement = (\n          <style\n            dangerouslySetInnerHTML={{ __html: generate(nonInlineStyles) }}\n          />\n        );\n\n        return React.cloneElement(\n          elementWithInlinedStyles,\n          elementWithInlinedStyles.props,\n          styleElement,\n          elementWithInlinedStyles.props.children,\n        );\n      }\n\n      return elementWithInlinedStyles;\n    }\n\n    return node;\n  });\n\n  if (hasNonInlineStylesToApply && !appliedNonInlineStyles) {\n    throw new Error(\n      `You are trying to use the following Tailwind classes that cannot be inlined: ${Array.from(\n        nonInlinableRules.keys(),\n      ).join(' ')}.\nFor the media queries to work properly on rendering, they need to be added into a <style> tag inside of a <head> tag,\nthe Tailwind component tried finding a <head> element but just wasn't able to find it.\n\nMake sure that you have a <head> element at some point inside of the <Tailwind> component at any depth. \nThis can also be our <Head> component.\n\nIf you do already have a <head> element at some depth, \nplease file a bug https://github.com/resend/react-email/issues/new?assignees=&labels=Type%3A+Bug&projects=&template=1.bug_report.yml.`,\n    );\n  }\n\n  return mappedChildren;\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAaA,QAAM;AACnB,MAAa,QAAQ;AACrB,MAAa,WAAW;AACxB,MAAa,YAAY;AACzB,MAAa,OAAO;AACpB,MAAaC,WAAS;AACtB,MAAa,YAAY;AACzB,MAAa,MAAM;AACnB,MAAa,SAAS;AACtB,MAAa,QAAQ;AACrB,MAAaC,WAAS;AACtB,MAAa,aAAa;AAC1B,MAAa,YAAY;AACzB,MAAa,aAAa;AAC1B,MAAa,MAAM;AACnB,MAAa,MAAM;AACnB,MAAa,QAAQ;AACrB,MAAa,YAAY;AACzB,MAAa,QAAQ;AACrB,MAAa,oBAAoB;AACjC,MAAa,qBAAqB;AAClC,MAAa,kBAAkB;AAC/B,MAAa,mBAAmB;AAChC,MAAa,mBAAmB;AAChC,MAAa,oBAAoB;AACjC,MAAa,UAAU;;;;AC3BvB,MAAM,MAAM;AAOZ,SAAgB,QAAQ,QAAM;AAC1B,QAAOC,UAAQ,MAAUA,UAAQ;;AAMrC,SAAgB,WAAW,QAAM;AAC7B,QACI,QAAQA,OAAK,IACZA,UAAQ,MAAUA,UAAQ,MAC1BA,UAAQ,MAAUA,UAAQ;;AAMnC,SAAgB,kBAAkB,QAAM;AACpC,QAAOA,UAAQ,MAAUA,UAAQ;;AAKrC,SAAgB,kBAAkB,QAAM;AACpC,QAAOA,UAAQ,MAAUA,UAAQ;;AAKrC,SAAgB,SAAS,QAAM;AAC3B,QAAO,kBAAkBA,OAAK,IAAI,kBAAkBA,OAAK;;AAU7D,SAAgB,WAAW,QAAM;AAC7B,QAAOA,UAAQ;;AAKnB,SAAgB,YAAY,QAAM;AAC9B,QAAO,SAASA,OAAK,IAAI,WAAWA,OAAK,IAAIA,WAAS;;AAK1D,SAAgB,OAAO,QAAM;AACzB,QAAO,YAAYA,OAAK,IAAI,QAAQA,OAAK,IAAIA,WAAS;;AAM1D,SAAgB,eAAe,QAAM;AACjC,QACKA,UAAQ,KAAUA,UAAQ,KAC1BA,WAAS,MACTA,UAAQ,MAAUA,UAAQ,MAC1BA,WAAS;;AAQlB,SAAgB,UAAU,QAAM;AAC5B,QAAOA,WAAS,MAAUA,WAAS,MAAUA,WAAS;;AAK1D,SAAgB,aAAa,QAAM;AAC/B,QAAO,UAAUA,OAAK,IAAIA,WAAS,MAAUA,WAAS;;AAI1D,SAAgB,cAAc,OAAO,QAAQ;AAEzC,KAAI,UAAU,GACV,QAAO;AAIX,KAAI,UAAU,OAAO,IAAI,WAAW,IAChC,QAAO;AAIX,QAAO;;AAIX,SAAgB,kBAAkB,OAAO,QAAQ,OAAO;AAIpD,KAAI,UAAU,GAGV,QACI,YAAY,OAAO,IACnB,WAAW,MACX,cAAc,QAAQ,MAAM;AAKpC,KAAI,YAAY,MAAM,CAElB,QAAO;AAIX,KAAI,UAAU,GAEV,QAAO,cAAc,OAAO,OAAO;AAKvC,QAAO;;AAIX,SAAgB,cAAc,OAAO,QAAQ,OAAO;AAKhD,KAAI,UAAU,MAAU,UAAU,IAAQ;AAEtC,MAAI,QAAQ,OAAO,CACf,QAAO;AAMX,SAAO,WAAW,MAAU,QAAQ,MAAM,GAAG,IAAI;;AAIrD,KAAI,UAAU,GAEV,QAAO,QAAQ,OAAO,GAAG,IAAI;AAIjC,KAAI,QAAQ,MAAM,CAEd,QAAO;AAKX,QAAO;;AAQX,SAAgB,MAAM,QAAM;AAExB,KAAIA,WAAS,MACT,QAAO;AAIX,KAAIA,WAAS,MACT,QAAO;AAGX,QAAO;;AAKX,MAAM,WAAW,IAAI,MAAM,IAAK;AAChC,MAAa,cAAc;AAC3B,MAAa,qBAAqB;AAClC,MAAa,gBAAgB;AAC7B,MAAa,oBAAoB;AACjC,MAAa,uBAAuB;AAEpC,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,IACjC,UAAS,KACL,aAAa,EAAE,IAAI,sBACnB,QAAQ,EAAE,IAAI,iBACd,YAAY,EAAE,IAAI,qBAClB,eAAe,EAAE,IAAI,wBACrB,KAAK;AAGb,SAAgB,iBAAiB,QAAM;AACnC,QAAOA,SAAO,MAAO,SAASA,UAAQ;;;;;ACzM1C,SAAS,YAAY,QAAQ,QAAQ;AACjC,QAAO,SAAS,OAAO,SAAS,OAAO,WAAW,OAAO,GAAG;;AAGhE,SAAgB,iBAAiB,QAAQ,QAAQ,QAAM;AACnD,KAAIC,WAAS,MAAe,YAAY,QAAQ,SAAS,EAAE,KAAK,GAC5D,QAAO;AAGX,QAAO;;AAGX,SAAgB,QAAQ,SAAS,QAAQ,eAAe;CACpD,IAAIA,SAAO,QAAQ,WAAW,OAAO;AAGrC,KAAI,kBAAkBA,OAAK,CACvB,UAAOA,SAAO;AAGlB,QAAOA,WAAS;;AAGpB,SAAgB,OAAO,SAAS,OAAO,KAAK,cAAc;AACtD,KAAI,MAAM,UAAU,aAAa,OAC7B,QAAO;AAGX,KAAI,QAAQ,KAAK,MAAM,QAAQ,OAC3B,QAAO;AAGX,MAAK,IAAI,IAAI,OAAO,IAAI,KAAK,KAAK;EAC9B,MAAM,gBAAgB,aAAa,WAAW,IAAI,MAAM;EACxD,IAAI,WAAW,QAAQ,WAAW,EAAE;AAGpC,MAAI,kBAAkB,SAAS,CAC3B,YAAW,WAAW;AAG1B,MAAI,aAAa,cACb,QAAO;;AAIf,QAAO;;AAGX,SAAgB,oBAAoB,QAAQ,QAAQ;AAChD,QAAO,UAAU,GAAG,SAChB,KAAI,CAAC,aAAa,OAAO,WAAW,OAAO,CAAC,CACxC;AAIR,QAAO,SAAS;;AAGpB,SAAgB,kBAAkB,QAAQ,QAAQ;AAC9C,QAAO,SAAS,OAAO,QAAQ,SAC3B,KAAI,CAAC,aAAa,OAAO,WAAW,OAAO,CAAC,CACxC;AAIR,QAAO;;AAGX,SAAgB,qBAAqB,QAAQ,QAAQ;AACjD,QAAO,SAAS,OAAO,QAAQ,SAC3B,KAAI,CAAC,QAAQ,OAAO,WAAW,OAAO,CAAC,CACnC;AAIR,QAAO;;AAIX,SAAgB,eAAe,QAAQ,QAAQ;AAG3C,WAAU;AAGV,KAAI,WAAW,YAAY,QAAQ,SAAS,EAAE,CAAC,EAAE;AAG7C,OAAK,MAAM,YAAY,KAAK,IAAI,OAAO,QAAQ,SAAS,EAAE,EAAE,SAAS,WAAW,SAC5E,KAAI,CAAC,WAAW,YAAY,QAAQ,OAAO,CAAC,CACxC;EAKR,MAAMA,SAAO,YAAY,QAAQ,OAAO;AACxC,MAAI,aAAaA,OAAK,CAClB,WAAU,iBAAiB,QAAQ,QAAQA,OAAK;;AAIxD,QAAO;;AAOX,SAAgB,YAAY,QAAQ,QAAQ;AAGxC,QAAO,SAAS,OAAO,QAAQ,UAAU;EACrC,MAAMA,SAAO,OAAO,WAAW,OAAO;AAGtC,MAAI,OAAOA,OAAK,CAEZ;AAIJ,MAAI,cAAcA,QAAM,YAAY,QAAQ,SAAS,EAAE,CAAC,EAAE;AAEtD,YAAS,eAAe,QAAQ,OAAO,GAAG;AAC1C;;AAKJ;;AAGJ,QAAO;;AAIX,SAAgB,cAAc,QAAQ,QAAQ;CAC1C,IAAIA,SAAO,OAAO,WAAW,OAAO;AAIpC,KAAIA,WAAS,MAAUA,WAAS,GAC5B,UAAO,OAAO,WAAW,UAAU,EAAE;AAIzC,KAAI,QAAQA,OAAK,EAAE;AACf,WAAS,qBAAqB,QAAQ,SAAS,EAAE;AACjD,WAAO,OAAO,WAAW,OAAO;;AAIpC,KAAIA,WAAS,MAAU,QAAQ,OAAO,WAAW,SAAS,EAAE,CAAC,EAAE;AAG3D,YAAU;AAOV,WAAS,qBAAqB,QAAQ,OAAO;;AAKjD,KAAI,QAAQ,QAAQ,QAAQ,IAAY,EAAE;EACtC,IAAI,OAAO;AACX,WAAO,OAAO,WAAW,SAAS,EAAE;AAGpC,MAAIA,WAAS,MAAUA,WAAS,IAAQ;AACpC,UAAO;AACP,YAAO,OAAO,WAAW,SAAS,EAAE;;AAIxC,MAAI,QAAQA,OAAK,CAQb,UAAS,qBAAqB,QAAQ,SAAS,IAAI,OAAO,EAAE;;AAIpE,QAAO;;AAMX,SAAgB,sBAAsB,QAAQ,QAAQ;AAElD,QAAO,SAAS,OAAO,QAAQ,UAAU;EACrC,MAAMA,SAAO,OAAO,WAAW,OAAO;AAItC,MAAIA,WAAS,IAAQ;AAEjB;AACA;;AAGJ,MAAI,cAAcA,QAAM,YAAY,QAAQ,SAAS,EAAE,CAAC,CAKpD,UAAS,eAAe,QAAQ,OAAO;;AAI/C,QAAO;;AAKX,SAAgB,cAAc,SAAS;AAEnC,KAAI,QAAQ,WAAW,KAAK,CAAC,WAAW,QAAQ,WAAW,EAAE,CAAC,CAC1D,QAAO,QAAQ;CAInB,IAAIA,SAAO,SAAS,SAAS,GAAG;AAEhC,KACKA,WAAS,KACTA,UAAQ,SAAUA,UAAQ,SAC1BA,SAAO,QAGR,UAAO;AAIX,QAAO,OAAO,cAAcA,OAAK;;;;;AC5PrC,oBAAe;CACX;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACH;;;;AC3BD,MAAM,WAAW,KAAK;AAEtB,SAAgB,YAAY,SAAS,MAAM,MAAM;AAC7C,KAAI,WAAW,QAAQ,OAAO,SAAS,KACnC,QAAO,IAAI,YAAY,KAAK,IAAI,OAAO,MAAM,SAAS,CAAC;AAG3D,QAAO;;;;;ACJX,MAAMC,MAAI;AACV,MAAMC,MAAI;AACV,MAAMC,MAAI;AAEV,SAAS,uBAAuB,MAAM;CAClC,MAAM,SAAS,KAAK;CACpB,MAAM,eAAe,OAAO;CAC5B,MAAM,cAAc,OAAO,SAAS,IAAI,MAAM,OAAO,WAAW,EAAE,CAAC,GAAG;CACtE,MAAM,QAAQ,YAAY,KAAK,OAAO,aAAa;CACnD,MAAM,UAAU,YAAY,KAAK,SAAS,aAAa;CACvD,IAAI,OAAO,KAAK;CAChB,IAAI,SAAS,KAAK;AAElB,MAAK,IAAI,IAAI,aAAa,IAAI,cAAc,KAAK;EAC7C,MAAMC,SAAO,OAAO,WAAW,EAAE;AAEjC,QAAM,KAAK;AACX,UAAQ,KAAK;AAEb,MAAIA,WAASH,OAAKG,WAASD,OAAKC,WAASF,KAAG;AACxC,OAAIE,WAASD,OAAK,IAAI,IAAI,gBAAgB,OAAO,WAAW,IAAI,EAAE,KAAKF,KAAG;AACtE;AACA,UAAM,KAAK;AACX,YAAQ,KAAK;;AAGjB;AACA,YAAS;;;AAIjB,OAAM,gBAAgB;AACtB,SAAQ,gBAAgB;AAExB,MAAK,QAAQ;AACb,MAAK,UAAU;AACf,MAAK,WAAW;;AAGpB,IAAa,mBAAb,MAA8B;CAC1B,YAAY,QAAQ,aAAa,WAAW,aAAa;AACrD,OAAK,UAAU,QAAQ,aAAa,WAAW,YAAY;AAC3D,OAAK,QAAQ;AACb,OAAK,UAAU;;CAEnB,UAAU,SAAS,IAAI,cAAc,GAAG,YAAY,GAAG,cAAc,GAAG;AACpE,OAAK,SAAS;AACd,OAAK,cAAc;AACnB,OAAK,YAAY;AACjB,OAAK,cAAc;AACnB,OAAK,WAAW;;CAEpB,YAAY,QAAQ,UAAU;AAC1B,MAAI,CAAC,KAAK,SACN,wBAAuB,KAAK;AAGhC,SAAO;GACH,QAAQ;GACR,QAAQ,KAAK,cAAc;GAC3B,MAAM,KAAK,MAAM;GACjB,QAAQ,KAAK,QAAQ;GACxB;;CAEL,iBAAiB,OAAO,KAAK,UAAU;AACnC,MAAI,CAAC,KAAK,SACN,wBAAuB,KAAK;AAGhC,SAAO;GACH,QAAQ;GACR,OAAO;IACH,QAAQ,KAAK,cAAc;IAC3B,MAAM,KAAK,MAAM;IACjB,QAAQ,KAAK,QAAQ;IACxB;GACD,KAAK;IACD,QAAQ,KAAK,cAAc;IAC3B,MAAM,KAAK,MAAM;IACjB,QAAQ,KAAK,QAAQ;IACxB;GACJ;;;;;;ACnET,MAAM,cAAc;AACpB,MAAM,aAAa;AACnB,MAAMI,gBAAc,IAAI,WAAW,GAAG;AACtC,cAAYC,YAAiB;AAC7B,cAAY,mBAAmB;AAC/B,cAAY,qBAAqB;AACjC,cAAY,oBAAoB;AAEhC,SAAS,mBAAmB,aAAW;AACnC,QAAOD,cAAYE,iBAAe;;AAGtC,IAAa,cAAb,MAAyB;CACrB,YAAY,QAAQ,YAAU;AAC1B,OAAK,UAAU,QAAQC,WAAS;;CAEpC,QAAQ;AACJ,OAAK,MAAM;AACX,OAAK,aAAa;AAClB,OAAK,YAAY;AACjB,OAAK,aAAa,KAAK;AACvB,OAAK,WAAW,KAAK;;CAEzB,UAAU,SAAS,IAAI,mBAAiB,IAAI;AACxC,WAAS,OAAO,UAAU,GAAG;EAE7B,MAAM,eAAe,OAAO;EAC5B,MAAM,gBAAgB,YAAY,KAAK,eAAe,OAAO,SAAS,EAAE;EACxE,MAAM,UAAU,YAAY,KAAK,SAAS,OAAO,SAAS,EAAE;EAC5D,IAAI,aAAa;EACjB,IAAI,kBAAkB;EACtB,IAAI,mBAAmB;EACvB,IAAI,eAAe,OAAO;AAG1B,OAAK,gBAAgB;AACrB,OAAK,UAAU;AACf,UAAQ,KAAK,EAAE;AAEf,aAAS,SAAS,MAAM,OAAO,QAAQ;GACnC,MAAM,QAAQ;AAGd,iBAAc,SAAU,QAAQ,aAAc;AAE9C,OAAI,oBAAoB,GACpB,mBAAkB;AAItB,WAAQ,SAAS;AAEjB,OAAI,SAAS,kBAAkB;IAC3B,MAAM,mBAAmB,QAAQ;AAGjC,YAAQ,gBAAgB;AAGxB,mBAAe;AACf,uBAAmBH,cAAY,cAAc,qBAAqB;cAC3D,mBAAmB,KAAK,EAAE;AAEjC,mBAAe;AACf,uBAAmBA,cAAY;;IAErC;AAGF,gBAAc,cAAeI,SAAO,aAAc;AAClD,UAAQ,cAAc;AAYtB,OAAK,IAAI,IAAI,GAAG,IAAI,YAAY,KAAK;GACjC,MAAMC,iBAAe,QAAQ;AAE7B,OAAIA,kBAAgB,GAAG;IACnB,MAAM,aAAa,QAAQA;AAE3B,QAAI,eAAe,EACf,SAAQ,KAAK;cAEVA,iBAAe,WACtB,SAAQ,KAAK;;AAMrB,OAAK,SAAS;AACd,OAAK,kBAAkB,oBAAoB,KAAK,IAAI;AACpD,OAAK,aAAa;AAClB,OAAK,gBAAgB;AACrB,OAAK,UAAU;AAEf,OAAK,OAAO;AACZ,OAAK,MAAM;;CAGf,WAAW,QAAQ;AACf,YAAU,KAAK;AAEf,MAAI,SAAS,KAAK,WACd,QAAO,KAAK,cAAc,WAAW;AAGzC,SAAOD;;CAEX,gBAAgB,KAAK;AACjB,OAAK,IAAI,SAAS,KAAK,YAAY,SAAS,KAAK,YAAY,UAAU;GACnE,MAAMF,cAAY,KAAK,cAAc,WAAW;AAEhD,OAAIA,gBAAc,cAAcA,gBAAc,SAC1C;QAAI,UAAU,EACV,QAAOA;;;AAKnB,SAAOE;;CAEX,aAAa,QAAQ;AACjB,YAAU,KAAK;AAEf,MAAI,SAAS,KAAK,WACd,QAAO,KAAK,cAAc,SAAS,KAAK;AAG5C,SAAO,KAAK,OAAO;;CAEvB,kBAAkB,KAAK;AACnB,OAAK,IAAI,SAAS,KAAK,YAAY,SAAS,KAAK,YAAY,UAAU;GACnE,MAAMF,cAAY,KAAK,cAAc,WAAW;AAEhD,OAAIA,gBAAc,cAAcA,gBAAc,SAC1C;QAAI,UAAU,EACV,QAAO,SAAS,KAAK;;;AAKjC,SAAOE;;CAEX,YAAY,QAAQ,cAAc;AAC9B,YAAU,KAAK;AAEf,MAAI,SAAS,KAAK,WACd,QAAO,OACH,KAAK,QACL,KAAK,cAAc,SAAS,KAAK,aACjC,KAAK,cAAc,UAAU,aAC7B,aACH;AAGL,SAAO;;CAEX,cAAc,YAAY;AACtB,MAAI,eAAe,KAAK,WACpB,QAAO,KAAK;AAGhB,MAAI,aAAa,EACb,QAAO,aAAa,KAAK,aACnB,KAAK,cAAc,aAAa,KAAK,cACrC,KAAK,cAAc,KAAK,cAAc;AAGhD,SAAO,KAAK;;CAEhB,eAAe,OAAO;AAClB,SAAO,KAAK,OAAO,UAAU,OAAO,KAAK,WAAW;;CAGxD,cAAc,KAAK;AACf,SAAO,KAAK,QAAQ,KAAK,cAAc;;CAG3C,QAAQ,QAAM,QAAQ;AAClB,MAAI,OACA,QACI,KAAK,WAAW,OAAO,KAAK,SAC5B,KAAK,OAAO,WAAW,KAAK,aAAa,OAAO,CAAC,KAAKE;AAI9D,SACI,KAAK,cAAc,SACnB,KAAK,OAAO,WAAW,KAAK,WAAW,KAAKA;;CAIpD,KAAK,YAAY;EACb,IAAI,OAAO,KAAK,aAAa;AAE7B,MAAI,OAAO,KAAK,YAAY;AACxB,QAAK,aAAa;AAClB,QAAK,aAAa,KAAK,cAAc,OAAO,KAAK;AACjD,UAAO,KAAK,cAAc;AAC1B,QAAK,YAAY,QAAQ;AACzB,QAAK,WAAW,OAAO;SACpB;AACH,QAAK,aAAa,KAAK;AACvB,QAAK,MAAM;;;CAGnB,OAAO;EACH,IAAI,OAAO,KAAK,aAAa;AAE7B,MAAI,OAAO,KAAK,YAAY;AACxB,QAAK,aAAa;AAClB,QAAK,aAAa,KAAK;AACvB,UAAO,KAAK,cAAc;AAC1B,QAAK,YAAY,QAAQ;AACzB,QAAK,WAAW,OAAO;SACpB;AACH,QAAK,MAAM;AACX,QAAK,aAAa,KAAK;AACvB,QAAK,YAAYF;AACjB,QAAK,aAAa,KAAK,WAAW,KAAK,OAAO;;;CAGtD,SAAS;AACL,SAAO,KAAK,cAAc,cAAc,KAAK,cAAc,QACvD,MAAK,MAAM;;CAGnB,kBAAkB,YAAY,aAAa;EACvC,IAAI,SAAS;EACb,IAAI,aAAa;EACjB,IAAI,SAAS;AAEb,OACA,QAAO,SAAS,KAAK,YAAY,UAAU;AACvC,gBAAa,KAAK,QAAQ;AAG1B,OAAI,aAAa,WACb,OAAM;AAGV,YAAS,SAAS,IAAI,KAAK,cAAc,SAAS,KAAK,cAAc,KAAK;AAG1E,WAAQ,YAAY,KAAK,OAAO,WAAW,OAAO,CAAC,EAAnD;IACI,KAAK,EACD,OAAM;IAEV,KAAK;AACD;AACA,WAAM;IAEV,QAEI,KAAI,mBAAmB,KAAK,cAAc,WAAW,WAAW,CAC5D,UAAS;;;AAKzB,OAAK,KAAK,SAAS,KAAK,WAAW;;CAGvC,aAAa,IAAI;AACb,OAAK,IAAI,IAAI,GAAG,SAAS,KAAK,iBAAiB,IAAI,KAAK,YAAY,KAAK;GACrE,MAAM,QAAQ;GACd,MAAM,OAAO,KAAK,cAAc;GAChC,MAAM,MAAM,OAAO;GACnB,MAAM,OAAO,QAAQ;AAErB,YAAS;AAET,MAAG,MAAM,OAAO,KAAK,EAAE;;;CAG/B,OAAO;EACH,MAAM,SAAS,IAAI,MAAM,KAAK,WAAW;AAEzC,OAAK,cAAc,MAAM,OAAO,KAAK,UAAU;AAC3C,UAAO,SAAS;IACZ,KAAK;IACL,MAAMG,cAAW;IACjB,OAAO,KAAK,OAAO,UAAU,OAAO,IAAI;IACxC,SAAS,KAAK,QAAQ;IACzB;IACH;AAEF,SAAO;;;;;;ACjSf,SAAgBC,WAAS,QAAQ,SAAS;CACtC,SAASC,cAAY,UAAQ;AACzB,SAAOC,WAAS,eAAe,OAAO,WAAWA,SAAO,GAAG;;CAI/D,SAAS,sBAAsB;AAE3B,WAAS,cAAc,QAAQ,OAAO;AAGtC,MAAI,kBAAkBD,cAAY,OAAO,EAAEA,cAAY,SAAS,EAAE,EAAEA,cAAY,SAAS,EAAE,CAAC,EAAE;AAI1F,UAAOE;AACP,YAAS,YAAY,QAAQ,OAAO;AACpC;;AAIJ,MAAIF,cAAY,OAAO,KAAK,IAAQ;AAEhC,UAAOG;AACP;AACA;;AAIJ,SAAOC;;CAIX,SAAS,wBAAwB;EAC7B,MAAM,kBAAkB;AAGxB,WAAS,YAAY,QAAQ,OAAO;AAIpC,MAAI,OAAO,QAAQ,iBAAiB,QAAQ,MAAM,IAAIJ,cAAY,OAAO,KAAK,IAAQ;AAElF,YAAS,kBAAkB,QAAQ,SAAS,EAAE;AAK9C,OAAIA,cAAY,OAAO,KAAK,MACxBA,cAAY,OAAO,KAAK,IAAQ;AAChC,WAAOK;AACP,aAAS,kBAAkB;AAC3B;;AAIJ,oBAAiB;AACjB;;AAKJ,MAAIL,cAAY,OAAO,KAAK,IAAQ;AAChC,UAAOK;AACP;AACA;;AAIJ,SAAOC;;CAIX,SAAS,mBAAmB,iBAAiB;AAIzC,MAAI,CAAC,gBACD,mBAAkBN,cAAY,SAAS;AAI3C,SAAOO;AAGP,SAAO,SAAS,OAAO,QAAQ,UAAU;GACrC,MAAMC,SAAO,OAAO,WAAW,OAAO;AAEtC,WAAQ,iBAAiBA,OAAK,EAA9B;IAEI,KAAK;AAED;AACA;IAQJ,KAAK;AACD,SAAI,UAAUA,OAAK,EAAE;AAGjB,gBAAU,iBAAiB,QAAQ,QAAQA,OAAK;AAChD,aAAOC;AACP;;AAEJ;IAGJ,KAAK;AAED,SAAI,WAAW,OAAO,SAAS,EAC3B;KAGJ,MAAM,WAAWT,cAAY,SAAS,EAAE;AAGxC,SAAI,UAAU,SAAS,CACnB,WAAU,iBAAiB,QAAQ,SAAS,GAAG,SAAS;cACjD,cAAcQ,QAAM,SAAS,CAIpC,UAAS,eAAe,QAAQ,OAAO,GAAG;AAE9C;;;;CAahB,SAAS,kBAAkB;AAEvB,SAAOE;AAGP,WAAS,kBAAkB,QAAQ,OAAO;AAG1C,SAAO,SAAS,OAAO,QAAQ,UAAU;GACrC,MAAMF,SAAO,OAAO,WAAW,OAAO;AAEtC,WAAQ,iBAAiBA,OAAK,EAA9B;IAEI,KAAK;AAED;AACA;IAQJ,KAAK;AAED,cAAS,kBAAkB,QAAQ,OAAO;AAK1C,SAAIR,cAAY,OAAO,KAAK,MAAU,UAAU,OAAO,QAAQ;AAC3D,UAAI,SAAS,OAAO,OAChB;AAEJ;;AAKJ,cAAS,sBAAsB,QAAQ,OAAO;AAC9C,YAAOW;AACP;IAMJ,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;AAGD,cAAS,sBAAsB,QAAQ,OAAO;AAC9C,YAAOA;AACP;IAGJ,KAAK;AAGD,SAAI,cAAcH,QAAMR,cAAY,SAAS,EAAE,CAAC,EAAE;AAC9C,eAAS,eAAe,QAAQ,OAAO,GAAG;AAC1C;;AAKJ,cAAS,sBAAsB,QAAQ,OAAO;AAC9C,YAAOW;AACP;;;;AAShB,UAAS,OAAO,UAAU,GAAG;CAE7B,MAAM,eAAe,OAAO;CAC5B,IAAI,QAAQ,MAAMX,cAAY,EAAE,CAAC;CACjC,IAAI,SAAS;CACb,IAAI;AAIJ,QAAO,SAAS,cAAc;EAC1B,MAAMQ,SAAO,OAAO,WAAW,OAAO;AAEtC,UAAQ,iBAAiBA,OAAK,EAA9B;GAEI,KAAK;AAED,WAAOI;AACP,aAAS,kBAAkB,QAAQ,SAAS,EAAE;AAC9C;GAGJ,KAAK;AAED,wBAAoB;AACpB;GAGJ,KAAK;AAED,QAAI,OAAOZ,cAAY,SAAS,EAAE,CAAC,IAAI,cAAcA,cAAY,SAAS,EAAE,EAAEA,cAAY,SAAS,EAAE,CAAC,EAAE;AAEpG,YAAOa;AAQP,cAAS,YAAY,QAAQ,SAAS,EAAE;WAGrC;AAEH,YAAOC;AACP;;AAGJ;GAGJ,KAAK;AAED,wBAAoB;AACpB;GAGJ,KAAK;AAED,WAAOC;AACP;AACA;GAGJ,KAAK;AAED,WAAOC;AACP;AACA;GAGJ,KAAK;AAED,QAAI,cAAcR,QAAMR,cAAY,SAAS,EAAE,EAAEA,cAAY,SAAS,EAAE,CAAC,CAErE,sBAAqB;SAClB;AAEH,YAAOc;AACP;;AAEJ;GAGJ,KAAK;AAED,WAAOG;AACP;AACA;GAGJ,KAAK;AAED,QAAI,cAAcT,QAAMR,cAAY,SAAS,EAAE,EAAEA,cAAY,SAAS,EAAE,CAAC,CACrE,sBAAqB;aAGjBA,cAAY,SAAS,EAAE,KAAK,MAC5BA,cAAY,SAAS,EAAE,KAAK,IAAQ;AACpC,YAAOkB;AACP,cAAS,SAAS;eAGd,kBAAkBV,QAAMR,cAAY,SAAS,EAAE,EAAEA,cAAY,SAAS,EAAE,CAAC,CAEzE,wBAAuB;SACpB;AAEH,YAAOc;AACP;;AAIZ;GAGJ,KAAK;AAED,QAAI,cAAcN,QAAMR,cAAY,SAAS,EAAE,EAAEA,cAAY,SAAS,EAAE,CAAC,CAErE,sBAAqB;SAClB;AAEH,YAAOc;AACP;;AAGJ;GAGJ,KAAK;AAED,QAAId,cAAY,SAAS,EAAE,KAAK,IAAQ;AAGpC,YAAOmB;AACP,cAAS,OAAO,QAAQ,MAAM,SAAS,EAAE;AACzC,cAAS,WAAW,KAAK,OAAO,SAAS,SAAS;WAC/C;AACH,YAAOL;AACP;;AAEJ;GAGJ,KAAK;AAED,WAAOM;AACP;AACA;GAGJ,KAAK;AAED,WAAOC;AACP;AACA;GAGJ,KAAK;AAED,QAAIrB,cAAY,SAAS,EAAE,KAAK,MAC5BA,cAAY,SAAS,EAAE,KAAK,MAC5BA,cAAY,SAAS,EAAE,KAAK,IAAQ;AAEpC,YAAOsB;AACP,cAAS,SAAS;WACf;AAEH,YAAOR;AACP;;AAGJ;GAGJ,KAAK;AAED,QAAI,kBAAkBd,cAAY,SAAS,EAAE,EAAEA,cAAY,SAAS,EAAE,EAAEA,cAAY,SAAS,EAAE,CAAC,EAAE;AAE9F,YAAOuB;AACP,cAAS,YAAY,QAAQ,SAAS,EAAE;WACrC;AAEH,YAAOT;AACP;;AAGJ;GAGJ,KAAK;AAED,WAAOU;AACP;AACA;GAGJ,KAAK;AAED,QAAI,cAAchB,QAAMR,cAAY,SAAS,EAAE,CAAC,CAE5C,wBAAuB;SACpB;AAEH,YAAOc;AACP;;AAEJ;GAGJ,KAAK;AAED,WAAOW;AACP;AACA;GAGJ,KAAK;AAED,WAAOC;AACP;AACA;GAGJ,KAAK;AAED,WAAOC;AACP;AACA;GAGJ,KAAK;AAED,yBAAqB;AACrB;GAGJ,KAAK;AAED,2BAAuB;AACvB;GAQJ;AAEI,WAAOb;AACP;;AAIR,UAAQ,MAAM,OAAO,QAAQ,OAAO;;;;;;ACte5C,IAAI,kBAAkB;AAEtB,IAAa,OAAb,MAAa,KAAK;CACd,OAAO,WAAW,MAAM;AACpB,SAAO;GACH,MAAM;GACN,MAAM;GACN;GACH;;CAGL,cAAc;AACV,OAAK,OAAO;AACZ,OAAK,OAAO;AACZ,OAAK,SAAS;;CAElB,WAAW,MAAM;AACb,SAAO,KAAK,WAAW,KAAK;;CAIhC,eAAe,MAAM,MAAM;EACvB,IAAI;AAEJ,MAAI,oBAAoB,MAAM;AAC1B,YAAS;AACT,qBAAkB,gBAAgB;AAClC,UAAO,OAAO;AACd,UAAO,OAAO;AACd,UAAO,SAAS,KAAK;QAErB,UAAS;GACL;GACA;GACA,QAAQ,KAAK;GAChB;AAGL,OAAK,SAAS;AAEd,SAAO;;CAEX,gBAAgB;EACZ,MAAM,EAAE,WAAW;AAEnB,OAAK,SAAS,OAAO;AACrB,SAAO,OAAO;AACd,SAAO,OAAO;AACd,SAAO,SAAS;AAChB,oBAAkB;;CAEtB,cAAc,SAAS,SAAS,SAAS,SAAS;EAC9C,IAAI,EAAE,WAAW;AAEjB,SAAO,WAAW,MAAM;AACpB,OAAI,OAAO,SAAS,QAChB,QAAO,OAAO;AAGlB,OAAI,OAAO,SAAS,QAChB,QAAO,OAAO;AAGlB,YAAS,OAAO;;;CAGxB,EAAE,OAAO,YAAY;AACjB,OAAK,IAAI,SAAS,KAAK,MAAM,WAAW,MAAM,SAAS,OAAO,KAC1D,OAAM,OAAO;;CAKrB,IAAI,OAAO;EACP,IAAI,OAAO;AAEX,OAAK,IAAI,SAAS,KAAK,MAAM,WAAW,MAAM,SAAS,OAAO,KAC1D;AAGJ,SAAO;;CAEX,IAAI,UAAU;AACV,SAAO,KAAK,SAAS;;CAEzB,IAAI,QAAQ;AACR,SAAO,KAAK,QAAQ,KAAK,KAAK;;CAElC,IAAI,OAAO;AACP,SAAO,KAAK,QAAQ,KAAK,KAAK;;CAIlC,UAAU,OAAO;EACb,IAAI,SAAS;AACb,OAAK,OAAO;AAEZ,OAAK,IAAI,QAAQ,OAAO;GACpB,MAAM,OAAO,KAAK,WAAW,KAAK;AAElC,OAAI,WAAW,KACX,QAAO,OAAO;OAEd,MAAK,OAAO;AAGhB,QAAK,OAAO;AACZ,YAAS;;AAGb,OAAK,OAAO;AACZ,SAAO;;CAEX,UAAU;AACN,SAAO,CAAC,GAAG,KAAK;;CAEpB,SAAS;AACL,SAAO,CAAC,GAAG,KAAK;;CAIpB,QAAQ,IAAI,UAAU,MAAM;EAExB,MAAM,SAAS,KAAK,eAAe,MAAM,KAAK,KAAK;AAEnD,SAAO,OAAO,SAAS,MAAM;GACzB,MAAM,OAAO,OAAO;AACpB,UAAO,OAAO,KAAK;AACnB,MAAG,KAAK,SAAS,KAAK,MAAM,MAAM,KAAK;;AAI3C,OAAK,eAAe;;CAExB,aAAa,IAAI,UAAU,MAAM;EAE7B,MAAM,SAAS,KAAK,eAAe,KAAK,MAAM,KAAK;AAEnD,SAAO,OAAO,SAAS,MAAM;GACzB,MAAM,OAAO,OAAO;AACpB,UAAO,OAAO,KAAK;AACnB,MAAG,KAAK,SAAS,KAAK,MAAM,MAAM,KAAK;;AAI3C,OAAK,eAAe;;CAExB,OAAO,IAAI,cAAc,UAAU,MAAM;EAErC,IAAI,SAAS,KAAK,eAAe,MAAM,KAAK,KAAK;EACjD,IAAI,MAAM;EACV,IAAI;AAEJ,SAAO,OAAO,SAAS,MAAM;AACzB,UAAO,OAAO;AACd,UAAO,OAAO,KAAK;AAEnB,SAAM,GAAG,KAAK,SAAS,KAAK,KAAK,MAAM,MAAM,KAAK;;AAItD,OAAK,eAAe;AAEpB,SAAO;;CAEX,YAAY,IAAI,cAAc,UAAU,MAAM;EAE1C,IAAI,SAAS,KAAK,eAAe,KAAK,MAAM,KAAK;EACjD,IAAI,MAAM;EACV,IAAI;AAEJ,SAAO,OAAO,SAAS,MAAM;AACzB,UAAO,OAAO;AACd,UAAO,OAAO,KAAK;AAEnB,SAAM,GAAG,KAAK,SAAS,KAAK,KAAK,MAAM,MAAM,KAAK;;AAItD,OAAK,eAAe;AAEpB,SAAO;;CAEX,KAAK,IAAI,UAAU,MAAM;AACrB,OAAK,IAAI,SAAS,KAAK,MAAM,WAAW,MAAM,SAAS,OAAO,KAC1D,KAAI,GAAG,KAAK,SAAS,OAAO,MAAM,QAAQ,KAAK,CAC3C,QAAO;AAIf,SAAO;;CAEX,IAAI,IAAI,UAAU,MAAM;EACpB,MAAM,SAAS,IAAI,MAAM;AAEzB,OAAK,IAAI,SAAS,KAAK,MAAM,WAAW,MAAM,SAAS,OAAO,KAC1D,QAAO,WAAW,GAAG,KAAK,SAAS,OAAO,MAAM,QAAQ,KAAK,CAAC;AAGlE,SAAO;;CAEX,OAAO,IAAI,UAAU,MAAM;EACvB,MAAM,SAAS,IAAI,MAAM;AAEzB,OAAK,IAAI,SAAS,KAAK,MAAM,WAAW,MAAM,SAAS,OAAO,KAC1D,KAAI,GAAG,KAAK,SAAS,OAAO,MAAM,QAAQ,KAAK,CAC3C,QAAO,WAAW,OAAO,KAAK;AAItC,SAAO;;CAGX,UAAU,OAAO,IAAI,UAAU,MAAM;AACjC,MAAI,UAAU,KACV;EAIJ,MAAM,SAAS,KAAK,eAAe,MAAM,MAAM;AAE/C,SAAO,OAAO,SAAS,MAAM;GACzB,MAAM,OAAO,OAAO;AACpB,UAAO,OAAO,KAAK;AACnB,OAAI,GAAG,KAAK,SAAS,KAAK,MAAM,MAAM,KAAK,CACvC;;AAKR,OAAK,eAAe;;CAExB,UAAU,OAAO,IAAI,UAAU,MAAM;AACjC,MAAI,UAAU,KACV;EAIJ,MAAM,SAAS,KAAK,eAAe,OAAO,KAAK;AAE/C,SAAO,OAAO,SAAS,MAAM;GACzB,MAAM,OAAO,OAAO;AACpB,UAAO,OAAO,KAAK;AACnB,OAAI,GAAG,KAAK,SAAS,KAAK,MAAM,MAAM,KAAK,CACvC;;AAKR,OAAK,eAAe;;CAIxB,QAAQ;AACJ,OAAK,OAAO;AACZ,OAAK,OAAO;;CAEhB,OAAO;EACH,MAAM,SAAS,IAAI,MAAM;AAEzB,OAAK,IAAI,QAAQ,KACb,QAAO,WAAW,KAAK;AAG3B,SAAO;;CAEX,QAAQ,MAAM;AAIV,OAAK,cAAc,MAAM,MAAM,KAAK,MAAM,KAAK;AAG/C,MAAI,KAAK,SAAS,MAAM;AAEpB,QAAK,KAAK,OAAO;AAEjB,QAAK,OAAO,KAAK;QAIjB,MAAK,OAAO;AAIhB,OAAK,OAAO;AACZ,SAAO;;CAEX,YAAY,MAAM;AACd,SAAO,KAAK,QAAQ,KAAK,WAAW,KAAK,CAAC;;CAE9C,OAAO,MAAM;AACT,SAAO,KAAK,OAAO,KAAK;;CAE5B,WAAW,MAAM;AACb,SAAO,KAAK,OAAO,KAAK,WAAW,KAAK,CAAC;;CAE7C,OAAO,MAAM,SAAS,MAAM;AACxB,MAAI,WAAW,MAAM;AAIjB,QAAK,cAAc,OAAO,MAAM,MAAM,QAAQ,KAAK;AAEnD,OAAI,OAAO,SAAS,MAAM;AAEtB,QAAI,KAAK,SAAS,OACd,OAAM,IAAI,MAAM,gCAAiC;AAIrD,SAAK,OAAO;AACZ,WAAO,OAAO;AACd,SAAK,OAAO;AACZ,SAAK,cAAc,MAAM,KAAK;UAC3B;AAEH,WAAO,KAAK,OAAO;AACnB,SAAK,OAAO,OAAO;AACnB,WAAO,OAAO;AACd,SAAK,OAAO;;SAEb;AAIH,QAAK,cAAc,KAAK,MAAM,MAAM,MAAM,KAAK;AAG/C,OAAI,KAAK,SAAS,MAAM;AAEpB,SAAK,KAAK,OAAO;AAEjB,SAAK,OAAO,KAAK;SAIjB,MAAK,OAAO;AAIhB,QAAK,OAAO;;AAGhB,SAAO;;CAEX,WAAW,MAAM,QAAQ;AACrB,SAAO,KAAK,OAAO,KAAK,WAAW,KAAK,EAAE,OAAO;;CAErD,OAAO,MAAM;AAIT,OAAK,cAAc,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK;AAEpD,MAAI,KAAK,SAAS,KACd,MAAK,KAAK,OAAO,KAAK;OACnB;AACH,OAAI,KAAK,SAAS,KACd,OAAM,IAAI,MAAM,8BAA+B;AAGnD,QAAK,OAAO,KAAK;;AAGrB,MAAI,KAAK,SAAS,KACd,MAAK,KAAK,OAAO,KAAK;OACnB;AACH,OAAI,KAAK,SAAS,KACd,OAAM,IAAI,MAAM,8BAA+B;AAGnD,QAAK,OAAO,KAAK;;AAGrB,OAAK,OAAO;AACZ,OAAK,OAAO;AAEZ,SAAO;;CAEX,KAAK,MAAM;AACP,OAAK,OAAO,KAAK,WAAW,KAAK,CAAC;;CAEtC,MAAM;AACF,SAAO,KAAK,SAAS,OAAO,KAAK,OAAO,KAAK,KAAK,GAAG;;CAEzD,QAAQ,MAAM;AACV,OAAK,QAAQ,KAAK,WAAW,KAAK,CAAC;;CAEvC,QAAQ;AACJ,SAAO,KAAK,SAAS,OAAO,KAAK,OAAO,KAAK,KAAK,GAAG;;CAEzD,YAAY,MAAM;AACd,SAAO,KAAK,WAAW,MAAM,KAAK,KAAK;;CAE3C,WAAW,MAAM;AACb,SAAO,KAAK,WAAW,KAAK;;CAEhC,WAAW,MAAM,QAAQ;AAErB,MAAI,KAAK,SAAS,KACd,QAAO;AAGX,MAAI,WAAW,UAAa,WAAW,MAAM;AACzC,QAAK,cAAc,OAAO,MAAM,KAAK,MAAM,QAAQ,KAAK,KAAK;AAG7D,OAAI,OAAO,SAAS,MAAM;AAEtB,WAAO,KAAK,OAAO,KAAK;AACxB,SAAK,KAAK,OAAO,OAAO;SAExB,MAAK,OAAO,KAAK;AAGrB,UAAO,OAAO,KAAK;AACnB,QAAK,KAAK,OAAO;SACd;AACH,QAAK,cAAc,KAAK,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK;AAGzD,OAAI,KAAK,SAAS,MAAM;AAIpB,SAAK,KAAK,OAAO,KAAK;AAEtB,SAAK,KAAK,OAAO,KAAK;SAItB,MAAK,OAAO,KAAK;AAIrB,QAAK,OAAO,KAAK;;AAGrB,OAAK,OAAO;AACZ,OAAK,OAAO;AACZ,SAAO;;CAEX,QAAQ,SAAS,eAAe;AAC5B,MAAI,UAAU,cACV,MAAK,WAAW,eAAe,QAAQ;MAEvC,MAAK,OAAO,eAAe,QAAQ;AAGvC,OAAK,OAAO,QAAQ;;;;;;ACld5B,SAAgB,kBAAkB,SAAM,SAAS;CAG7C,MAAM,QAAQ,OAAO,OAAO,YAAY,UAAU;CAClD,MAAM,6BAAa,IAAI,OAAO;AAE9B,QAAO,OAAO,OAAO,OAAO;EACxB;EACA;EACA,IAAI,QAAQ;AACR,WAAQ,WAAW,SAAS,IAAI,QAAQ,gBAAgB,GAAGc,QAAK,IAAI,QAAQ,IAAI;;EAEvF,CAAC;;;;;ACVN,MAAM,kBAAkB;AACxB,MAAM,oBAAoB;AAC1B,MAAM,kBAAkB;AAExB,SAAS,eAAe,EAAE,QAAQ,MAAM,QAAQ,UAAU,cAAc,YAAY;CAChF,SAAS,aAAa,OAAO,KAAK;AAC9B,SAAO,MACF,MAAM,OAAO,IAAI,CACjB,KAAK,QAAM,QACR,OAAO,QAAQ,MAAM,EAAE,CAAC,SAAS,aAAa,GAAG,OAAOC,OAC3D,CAAC,KAAK,KAAK;;CAKpB,MAAM,SAFW,KAAK,OAAO,KAAK,IAAI,WAAW,GAAG,EAAE,CAAC,GACpC,IAAI,OAAO,KAAK,IAAI,aAAa,GAAG,EAAE,CAAC,GACnB,QAAQ,MAAM,cAAc;CACnE,MAAM,YAAY,KAAK,IAAI,GAAG,OAAO,WAAW,GAAG;CACnD,MAAM,UAAU,KAAK,IAAI,OAAO,YAAY,MAAM,SAAS,EAAE;CAC7D,MAAM,eAAe,KAAK,IAAI,GAAG,OAAO,QAAQ,CAAC,OAAO,GAAG;CAC3D,IAAI,UAAU;AAGd,WAAW,KAA+B,MAAM,OAAO,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC,MAAM,MAAM,IAAI,EAAE,EAAE;AAEpG,KAAI,SAAS,iBAAiB;AAC1B,YAAU,SAAS,oBAAoB;AACvC,WAAS,oBAAoB;;AAGjC,MAAK,IAAI,IAAI,WAAW,KAAK,SAAS,IAClC,KAAI,KAAK,KAAK,IAAI,MAAM,QAAQ;AAC5B,QAAM,KAAK,MAAM,GAAG,QAAQ,OAAO,gBAAgB;AACnD,QAAM,MACD,UAAU,KAAK,MAAM,GAAG,SAAS,UAAU,MAAW,MACvD,MAAM,GAAG,OAAO,SAAS,kBAAkB,EAAE,IAC5C,MAAM,GAAG,SAAS,UAAU,kBAAkB,IAAI,MAAW;;AAI1E,QAAO;EACH,aAAa,WAAW,KAAK;EAC7B,IAAI,MAAM,SAAS,eAAe,EAAE,CAAC,KAAK,IAAI,GAAG;EACjD,aAAa,MAAM,QAAQ;EAC9B,CAAC,OAAO,QAAQ,CACZ,KAAK,KAAK,CACV,QAAQ,qBAAqB,GAAG,CAChC,QAAQ,qBAAqB,GAAG;;AAGzC,SAAgBC,cAAY,SAAS,QAAQ,QAAQ,MAAM,QAAQ,WAAW,GAAG,aAAa,GAAG;AAiB7F,QAhBc,OAAO,OAAO,kBAAkB,eAAe,QAAQ,EAAE;EACnE;EACA;EACA;EACA;EACA,eAAe,YAAY;AACvB,UAAO,eAAe;IAAE;IAAQ;IAAM;IAAQ;IAAU;IAAY,EAAE,MAAM,WAAW,GAAG,IAAI,WAAW;;EAE7G,IAAI,mBAAmB;AACnB,UACI,gBAAgB,QAAQ,MACxB,eAAe;IAAE;IAAQ;IAAM;IAAQ;IAAU;IAAY,EAAE,EAAE;;EAG5E,CAAC;;;;;AChEN,SAAgB,aAAa,YAAY;CACrC,MAAM,WAAW,KAAK,YAAY;CAClC,IAAI,QAAQ;CACZ,MAAM,UAAU,EACZ,YACH;AAED,QAAO,CAAC,KAAK,KAAK;AACd,UAAQ,KAAK,WAAb;GACI,KAAK;AACD,SAAK,MAAM;AACX;GAEJ,KAAK;AACD,YAAQ;AACR,SAAK,MAAM;AACX;;EAGR,IAAI,QAAQ,WAAW,QAAQ,KAAK,MAAM,QAAQ;AAElD,MAAI,UAAU,OACV;AAGJ,MAAI,OAAO;AACP,OAAI,WAAW,aACX,YAAW,aAAa,KAAK,MAAM,OAAO,UAAU,QAAQ;AAEhE,WAAQ;;AAGZ,WAAS,KAAK,MAAM;;AAGxB,KAAI,SAAS,WAAW,aACpB,YAAW,aAAa,KAAK,MAAM,MAAM,UAAU,QAAQ;AAG/D,QAAO;;;;;ACjBX,MAAM,aAAa;AACnB,MAAMC,oBAAkB;AACxB,MAAMC,eAAa;AACnB,MAAM,YAAY;AAClB,MAAMC,qBAAmB;AACzB,MAAM,OAAO;AAEb,SAAS,mBAAmB,SAAM;AAC9B,QAAO,WAAW;AACd,SAAO,KAAKC,UAAO;;;AAI3B,SAAS,iBAAiB,MAAM;CAC5B,MAAM,SAAS,OAAO,OAAO,KAAK;AAElC,MAAK,MAAMA,WAAQ,OAAO,KAAK,KAAK,EAAE;EAClC,MAAM,OAAO,KAAKA;EAClB,MAAM,KAAK,KAAK,SAAS;AAEzB,MAAI,GACA,QAAOA,WAAQ;;AAIvB,QAAO;;AAGX,SAAS,cAAc,QAAQ;CAC3B,MAAM,cAAc;EAChB,SAAS,OAAO,OAAO,KAAK;EAC5B,UAAU,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,OAAO,SAAS;EAC7D,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,OAAO,MAAM;EACvD,QAAQ,iBAAiB,OAAO,OAAO;EACvC,QAAQ,iBAAiB,OAAO,OAAO;EACvC,MAAM,iBAAiB,OAAO,KAAK;EACtC;AAED,MAAK,MAAM,CAACA,SAAM,YAAY,OAAO,QAAQ,OAAO,aAAa,CAC7D,SAAQ,OAAO,SAAf;EACI,KAAK;AACD,eAAY,QAAQA,WAAQ;AAC5B;EAEJ,KAAK;AACD,eAAY,QAAQA,WAAQ,mBAAmB,QAAQ;AACvD;;AAIZ,QAAO;EACH,QAAQ;EACR,GAAG;EACH,GAAG,YAAY;EAClB;;AAGL,SAAgB,aAAa,QAAQ;CACjC,IAAI,SAAS;CACb,IAAI,WAAW;CACf,IAAI,gBAAgB;CACpB,IAAI,eAAe;CACnB,IAAI,oBAAoB;CAExB,MAAM,cAAc,IAAI,kBAAkB;CAC1C,MAAM,SAAS,OAAO,OAAO,IAAI,aAAa,EAAE,cAAc,UAAU,EAAE,CAAC,EAAE;EACzE,oBAAoB;EACpB,kBAAkB;EAClB,YAAY;EACZ,qBAAqB;EAErB;EAEA,8BAA8B;EAC9B,6BAA6B,QAAM;AAC/B,UAAOC,WAASF,qBAAmB,IAAI;;EAE3C,wCAAwC,QAAM;AAC1C,UAAOE,WAASF,sBAAoBE,WAAS,YAAY,IAAI;;EAEjE,uCAAuC,QAAM;AACzC,UAAOA,WAASJ,qBAAmBI,WAAS,YAAY,IAAI;;EAEhE,8BAA8B,QAAM;AAChC,UAAOA,WAAS,YAAY,IAAI;;EAGpC,aAAa;AACT,UAAO,IAAI,MAAM;;EAErB,qBAAqB,MAAM;AACvB,UAAO,IAAI,MAAM,CAAC,WAAW,KAAK;;EAEtC,iBAAiB,MAAM;AACnB,UAAO,QAAQ,KAAK;;EAExB,gBAAgB,MAAM;AAClB,UAAO,QAAQ,KAAK;;EAGxB,kBAAkB,UAAU,UAAU;GAClC,MAAM,aAAa,KAAK;AAExB,OAAI;AACA,WAAO,SAAS,KAAK,KAAK;YACrB,GAAG;AACR,QAAI,kBACA,OAAM;AAGV,SAAK,KAAK,aAAa,KAAK,WAAW;IACvC,MAAM,eAAe,SAAS,KAAK,KAAK;AAExC,wBAAoB;AACpB,iBAAa,GAAG,aAAa;AAC7B,wBAAoB;AAEpB,WAAO;;;EAIf,gBAAgB,QAAQ;GACpB,IAAI;AAEJ,MAAG;AACC,WAAO,KAAK,WAAW,SAAS;AAChC,QAAI,SAAS,cAAc,SAAS,QAChC,QAAO;YAEN,SAAS;AAElB,UAAO;;EAGX,WAAW,QAAQ;AACf,UAAO,UAAU,KAAK,SAAS,OAAO,SAAS,OAAO,WAAW,OAAO,GAAG;;EAE/E,UAAU,aAAa,WAAW;AAC9B,UAAO,OAAO,UAAU,aAAa,UAAU;;EAEnD,eAAe,OAAO;AAClB,UAAO,KAAK,OAAO,UAAU,OAAO,KAAK,WAAW;;EAGxD,QAAQ,QAAQ,UAAU;AACtB,UAAO,QAAQ,QAAQ,QAAQ,SAAS;;EAE5C,OAAO,aAAa,WAAW,KAAK;AAChC,UAAO,OAAO,QAAQ,aAAa,WAAW,IAAI;;EAGtD,QAAQ,aAAW;GACf,MAAM,QAAQ,KAAK;AAEnB,QAAK,IAAIC,YAAU;AAEnB,UAAO,KAAK,eAAe,MAAM;;EAErC,sBAAsB;GAClB,MAAMF,UAAO,OAAO,UAAU,KAAK,YAAY,KAAK,WAAW,EAAE;AAEjE,QAAK,IAAIG,SAAc;AAEvB,UAAOH;;EAEX,cAAc,MAAM;GAChB,MAAMI,WAAS,OAAO,UAAU,KAAK,YAAY,cAAc,QAAQ,KAAK,WAAW,CAAC;AAExF,QAAK,IAAI,KAAK;AAEd,UAAOA;;EAGX,IAAI,aAAW;AACX,OAAI,KAAK,cAAcF,aAAW;IAC9B,MAAM,YAAYG,cAAWH,aAAW,MAAM,GAAG,GAAG,CAAC,QAAQ,MAAM,IAAI,CAAC,QAAQ,OAAM,MAAK,EAAE,aAAa,CAAC;IAC3G,IAAI,UAAU,GAAG,YAAY,KAAK,UAAU,GAAG,IAAI,UAAU,KAAK,UAAU;IAC5E,IAAI,SAAS,KAAK;AAGlB,YAAQA,aAAR;KACI,KAAK;AAED,UAAI,KAAK,cAAcC,YAAiB,KAAK,cAAc,KAAK;AAC5D,gBAAS,KAAK,WAAW;AACzB,iBAAU;YAEV,WAAU;AAEd;KAEJ,KAAK;AACD,UAAI,KAAK,QAAQL,aAAW,EAAE;AAC1B,YAAK,MAAM;AACX;AACA,iBAAU;;AAEd;KAEJ,KAAK;AACD,UAAI,KAAK,cAAcQ,UAAa;AAChC,gBAAS,KAAK;AACd,iBAAU;;AAEd;;AAGR,SAAK,MAAM,SAAS,OAAO;;AAG/B,QAAK,MAAM;;EAEf,SAAS,SAAM;AACX,OAAI,KAAK,cAAc,SAAS,KAAK,YAAY,GAAGN,QAAK,KAAK,MAC1D,MAAK,MAAM,eAAeA,QAAK,eAAe;AAGlD,QAAK,MAAM;;EAEf,SAAS,QAAM;AACX,OAAI,CAAC,KAAK,QAAQC,OAAK,CACnB,MAAK,MAAM,UAAU,OAAO,aAAaA,OAAK,CAAC,eAAe;AAGlE,QAAK,MAAM;;EAGf,YAAY,OAAO,KAAK;AACpB,OAAI,cACA,QAAO,YAAY,iBACf,OACA,KACA,SACH;AAGL,UAAO;;EAEX,oBAAoB,MAAM;AACtB,OAAI,eAAe;IACf,MAAM,OAAO,KAAK,iBAAiB,KAAK;IACxC,MAAM,OAAO,KAAK,gBAAgB,KAAK;AACvC,WAAO,YAAY,iBACf,SAAS,OAAO,KAAK,IAAI,MAAM,SAAS,YAAY,cAAc,KAAK,YACvE,SAAS,OAAO,KAAK,IAAI,IAAI,SAAS,YAAY,cAAc,KAAK,YACrE,SACH;;AAGL,UAAO;;EAGX,MAAM,SAAS,QAAQ;GACnB,MAAM,WAAW,OAAO,WAAW,eAAe,SAAS,OAAO,SAC5D,YAAY,YAAY,OAAO,GAC/B,KAAK,MACD,YAAY,YAAY,oBAAoB,QAAQ,OAAO,SAAS,EAAE,CAAC,GACvE,YAAY,YAAY,KAAK,WAAW;AAElD,SAAM,IAAIM,cACN,WAAW,oBACX,QACA,SAAS,QACT,SAAS,MACT,SAAS,QACT,YAAY,WACZ,YAAY,YACf;;EAER,CAAC;CAEF,MAAMC,WAAQ,SAAS,SAAS,SAAS;AACrC,WAAS;AACT,YAAU,WAAW,EAAE;AAEvB,SAAO,UAAU,QAAQC,WAAS;AAClC,cAAY,UACR,QACA,QAAQ,QACR,QAAQ,MACR,QAAQ,OACX;AAED,aAAW,QAAQ,YAAY;AAC/B,kBAAgB,QAAQ,QAAQ,UAAU;AAC1C,iBAAe,OAAO,QAAQ,iBAAiB,aAAa,QAAQ,eAAe;AACnF,sBAAoB;AAEpB,SAAO,qBAAqB,wBAAwB,UAAU,QAAQ,QAAQ,mBAAmB,GAAG;AACpG,SAAO,mBAAmB,sBAAsB,UAAU,QAAQ,QAAQ,iBAAiB,GAAG;AAC9F,SAAO,aAAa,gBAAgB,UAAU,QAAQ,QAAQ,WAAW,GAAG;AAC5E,SAAO,sBAAsB,yBAAyB,UAAU,QAAQ,QAAQ,oBAAoB,GAAG;EAEvG,MAAM,EAAE,UAAU,WAAW,cAAc;AAE3C,MAAI,WAAW,OAAO,YAAY,MAC9B,OAAM,IAAI,MAAM,sBAAsB,UAAU,IAAI;AAGxD,MAAI,OAAO,cAAc,WACrB,QAAO,cAAc,MAAM,OAAO,QAAQ;AACtC,OAAI,SAAS,SAAS;IAClB,MAAM,MAAM,OAAO,YAAY,OAAO,IAAI;AAK1C,cAJc,OAAO,QAAQ,MAAM,GAAG,KAAK,KAAK,GAC1C,OAAO,MAAM,QAAQ,GAAG,MAAM,EAAE,GAChC,OAAO,MAAM,QAAQ,GAAG,IAAI,EAEjB,IAAI;;IAE3B;EAGN,MAAM,MAAM,OAAO,QAAQ,SAAS,KAAK,QAAQ,QAAQ;AAEzD,MAAI,CAAC,OAAO,IACR,QAAO,OAAO;AAGlB,SAAO;;AAGX,QAAO,OAAO,OAAOD,UAAO;EACxB;EACA,QAAQ,OAAO;EAClB,CAAC;;;;;;CCrVN,IAAI,eAAe,mEAAmE,MAAM,GAAG;;;;AAK/F,SAAQ,SAAS,SAAU,UAAQ;AACjC,MAAI,KAAKE,YAAUA,WAAS,aAAa,OACvC,QAAO,aAAaA;AAEtB,QAAM,IAAI,UAAU,+BAA+BA,SAAO;;;;;;AAO5D,SAAQ,SAAS,SAAU,UAAU;EACnC,IAAI,OAAO;EACX,IAAI,OAAO;EAEX,IAAI,UAAU;EACd,IAAI,UAAU;EAEd,IAAIC,SAAO;EACX,IAAI,OAAO;EAEX,IAAI,OAAO;EACX,IAAI,QAAQ;EAEZ,IAAI,eAAe;EACnB,IAAI,eAAe;AAGnB,MAAI,QAAQ,YAAY,YAAY,KAClC,QAAQ,WAAW;AAIrB,MAAI,WAAW,YAAY,YAAY,QACrC,QAAQ,WAAW,UAAU;AAI/B,MAAIA,UAAQ,YAAY,YAAY,KAClC,QAAQ,WAAWA,SAAO;AAI5B,MAAI,YAAY,KACd,QAAO;AAIT,MAAI,YAAY,MACd,QAAO;AAIT,SAAO;;;;;;;CC5BT,IAAI;CAcJ,IAAI,iBAAiB;CAGrB,IAAI,WAAW,KAAK;CAGpB,IAAI,gBAAgB,WAAW;CAG/B,IAAI,uBAAuB;;;;;;;CAQ3B,SAAS,YAAY,QAAQ;AAC3B,SAAO,SAAS,KACV,CAAC,UAAW,KAAK,KAClB,UAAU,KAAK;;;;;;;;CAStB,SAAS,cAAc,QAAQ;EAC7B,IAAI,cAAc,SAAS,OAAO;EAClC,IAAI,UAAU,UAAU;AACxB,SAAO,aACH,CAAC,UACD;;;;;AAMN,SAAQ,SAAS,SAAS,iBAAiB,QAAQ;EACjD,IAAI,UAAU;EACd,IAAI;EAEJ,IAAI,MAAM,YAAY,OAAO;AAE7B,KAAG;AACD,WAAQ,MAAM;AACd,YAAS;AACT,OAAI,MAAM,EAGR,UAAS;AAEX,cAAW,OAAO,OAAO,MAAM;WACxB,MAAM;AAEf,SAAO;;;;;;AAOT,SAAQ,SAAS,SAAS,iBAAiB,MAAM,QAAQ,WAAW;EAClE,IAAI,SAAS,KAAK;EAClB,IAAI,SAAS;EACb,IAAI,QAAQ;EACZ,IAAI,cAAc;AAElB,KAAG;AACD,OAAI,UAAU,OACZ,OAAM,IAAI,MAAM,6CAA6C;AAG/D,WAAQ,OAAO,OAAO,KAAK,WAAW,SAAS,CAAC;AAChD,OAAI,UAAU,GACZ,OAAM,IAAI,MAAM,2BAA2B,KAAK,OAAO,SAAS,EAAE,CAAC;AAGrE,kBAAe,CAAC,EAAE,QAAQ;AAC1B,YAAS;AACT,YAAS,UAAU,SAAS;AAC5B,YAAS;WACF;AAET,YAAU,QAAQ,cAAc,OAAO;AACvC,YAAU,OAAO;;;;;;;;;;;;;;;;;CCzHnB,SAAS,OAAO,OAAO,OAAO,eAAe;AAC3C,MAAI,SAAS,MACX,QAAO,MAAM;WACJ,UAAU,WAAW,EAC9B,QAAO;MAEP,OAAM,IAAI,MAAM,OAAM,QAAQ,6BAA4B;;AAG9D,SAAQ,SAAS;CAEjB,IAAI,YAAY;CAChB,IAAI,gBAAgB;CAEpB,SAAS,SAAS,MAAM;EACtB,IAAI,QAAQ,KAAK,MAAM,UAAU;AACjC,MAAI,CAAC,MACH,QAAO;AAET,SAAO;GACL,QAAQ,MAAM;GACd,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ,MAAM,MAAM;GACb;;AAEH,SAAQ,WAAW;CAEnB,SAAS,YAAY,YAAY;EAC/B,IAAI,MAAM;AACV,MAAI,WAAW,OACb,QAAO,WAAW,SAAS;AAE7B,SAAO;AACP,MAAI,WAAW,KACb,QAAO,WAAW,OAAO;AAE3B,MAAI,WAAW,KACb,QAAO,WAAW;AAEpB,MAAI,WAAW,KACb,QAAO,MAAM,WAAW;AAE1B,MAAI,WAAW,KACb,QAAO,WAAW;AAEpB,SAAO;;AAET,SAAQ,cAAc;CAEtB,IAAI,oBAAoB;;;;;;;;CASxB,SAAS,WAAW,GAAG;EACrB,IAAI,QAAQ,EAAE;AAEd,SAAO,SAAS,OAAO;AACrB,QAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,IAChC,KAAI,MAAM,GAAG,UAAU,OAAO;IAC5B,IAAI,OAAO,MAAM;AACjB,UAAM,KAAK,MAAM;AACjB,UAAM,KAAK;AACX,WAAO,MAAM,GAAG;;GAIpB,IAAI,SAAS,EAAE,MAAM;AAErB,SAAM,QAAQ;IACZ;IACA;IACD,CAAC;AAEF,OAAI,MAAM,SAAS,kBACjB,OAAM,KAAK;AAGb,UAAO;;;;;;;;;;;;;;CAeX,IAAI,YAAY,WAAW,SAAS,UAAU,OAAO;EACnD,IAAI,OAAO;EACX,IAAI,MAAM,SAAS,MAAM;AACzB,MAAI,KAAK;AACP,OAAI,CAAC,IAAI,KACP,QAAO;AAET,UAAO,IAAI;;EAEb,IAAI,aAAa,QAAQ,WAAW,KAAK;EAGzC,IAAI,QAAQ,EAAE;EACd,IAAI,QAAQ;EACZ,IAAI,IAAI;AACR,SAAO,MAAM;AACX,WAAQ;AACR,OAAI,KAAK,QAAQ,KAAK,MAAM;AAC5B,OAAI,MAAM,IAAI;AACZ,UAAM,KAAK,KAAK,MAAM,MAAM,CAAC;AAC7B;UACK;AACL,UAAM,KAAK,KAAK,MAAM,OAAO,EAAE,CAAC;AAChC,WAAO,IAAI,KAAK,UAAU,KAAK,OAAO,IACpC;;;AAKN,OAAK,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AACxD,UAAO,MAAM;AACb,OAAI,SAAS,IACX,OAAM,OAAO,GAAG,EAAE;YACT,SAAS,KAClB;YACS,KAAK,EACd,KAAI,SAAS,IAAI;AAIf,UAAM,OAAO,IAAI,GAAG,GAAG;AACvB,SAAK;UACA;AACL,UAAM,OAAO,GAAG,EAAE;AAClB;;;AAIN,SAAO,MAAM,KAAK,IAAI;AAEtB,MAAI,SAAS,GACX,QAAO,aAAa,MAAM;AAG5B,MAAI,KAAK;AACP,OAAI,OAAO;AACX,UAAO,YAAY,IAAI;;AAEzB,SAAO;GACP;AACF,SAAQ,YAAY;;;;;;;;;;;;;;;;;CAkBpB,SAAS,KAAK,OAAO,OAAO;AAC1B,MAAI,UAAU,GACZ,SAAQ;AAEV,MAAI,UAAU,GACZ,SAAQ;EAEV,IAAI,WAAW,SAAS,MAAM;EAC9B,IAAI,WAAW,SAAS,MAAM;AAC9B,MAAI,SACF,SAAQ,SAAS,QAAQ;AAI3B,MAAI,YAAY,CAAC,SAAS,QAAQ;AAChC,OAAI,SACF,UAAS,SAAS,SAAS;AAE7B,UAAO,YAAY,SAAS;;AAG9B,MAAI,YAAY,MAAM,MAAM,cAAc,CACxC,QAAO;AAIT,MAAI,YAAY,CAAC,SAAS,QAAQ,CAAC,SAAS,MAAM;AAChD,YAAS,OAAO;AAChB,UAAO,YAAY,SAAS;;EAG9B,IAAI,SAAS,MAAM,OAAO,EAAE,KAAK,MAC7B,QACA,UAAU,MAAM,QAAQ,QAAQ,GAAG,GAAG,MAAM,MAAM;AAEtD,MAAI,UAAU;AACZ,YAAS,OAAO;AAChB,UAAO,YAAY,SAAS;;AAE9B,SAAO;;AAET,SAAQ,OAAO;AAEf,SAAQ,aAAa,SAAU,OAAO;AACpC,SAAO,MAAM,OAAO,EAAE,KAAK,OAAO,UAAU,KAAK,MAAM;;;;;;;;CASzD,SAAS,SAAS,OAAO,OAAO;AAC9B,MAAI,UAAU,GACZ,SAAQ;AAGV,UAAQ,MAAM,QAAQ,OAAO,GAAG;EAMhC,IAAI,QAAQ;AACZ,SAAO,MAAM,QAAQ,QAAQ,IAAI,KAAK,GAAG;GACvC,IAAI,QAAQ,MAAM,YAAY,IAAI;AAClC,OAAI,QAAQ,EACV,QAAO;AAMT,WAAQ,MAAM,MAAM,GAAG,MAAM;AAC7B,OAAI,MAAM,MAAM,oBAAoB,CAClC,QAAO;AAGT,KAAE;;AAIJ,SAAO,MAAM,QAAQ,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,OAAO,MAAM,SAAS,EAAE;;AAEtE,SAAQ,WAAW;CAEnB,IAAI,oBAAqB,WAAY;AAEnC,SAAO,EAAE,eADC,OAAO,OAAO,KAAK;IAE5B;CAEH,SAAS,SAAU,GAAG;AACpB,SAAO;;;;;;;;;;;CAYT,SAAS,YAAY,MAAM;AACzB,MAAI,cAAc,KAAK,CACrB,QAAO,MAAM;AAGf,SAAO;;AAET,SAAQ,cAAc,oBAAoB,WAAW;CAErD,SAAS,cAAc,MAAM;AAC3B,MAAI,cAAc,KAAK,CACrB,QAAO,KAAK,MAAM,EAAE;AAGtB,SAAO;;AAET,SAAQ,gBAAgB,oBAAoB,WAAW;CAEvD,SAAS,cAAc,GAAG;AACxB,MAAI,CAAC,EACH,QAAO;EAGT,IAAIC,WAAS,EAAE;AAEf,MAAIA,WAAS,EACX,QAAO;AAGT,MAAI,EAAE,WAAWA,WAAS,EAAE,KAAK,MAC7B,EAAE,WAAWA,WAAS,EAAE,KAAK,MAC7B,EAAE,WAAWA,WAAS,EAAE,KAAK,OAC7B,EAAE,WAAWA,WAAS,EAAE,KAAK,OAC7B,EAAE,WAAWA,WAAS,EAAE,KAAK,OAC7B,EAAE,WAAWA,WAAS,EAAE,KAAK,OAC7B,EAAE,WAAWA,WAAS,EAAE,KAAK,OAC7B,EAAE,WAAWA,WAAS,EAAE,KAAK,MAC7B,EAAE,WAAWA,WAAS,EAAE,KAAK,GAC/B,QAAO;AAGT,OAAK,IAAI,IAAIA,WAAS,IAAI,KAAK,GAAG,IAChC,KAAI,EAAE,WAAW,EAAE,KAAK,GACtB,QAAO;AAIX,SAAO;;;;;;;;;;CAWT,SAAS,2BAA2B,UAAU,UAAU,qBAAqB;EAC3E,IAAI,MAAM,OAAO,SAAS,QAAQ,SAAS,OAAO;AAClD,MAAI,QAAQ,EACV,QAAO;AAGT,QAAM,SAAS,eAAe,SAAS;AACvC,MAAI,QAAQ,EACV,QAAO;AAGT,QAAM,SAAS,iBAAiB,SAAS;AACzC,MAAI,QAAQ,KAAK,oBACf,QAAO;AAGT,QAAM,SAAS,kBAAkB,SAAS;AAC1C,MAAI,QAAQ,EACV,QAAO;AAGT,QAAM,SAAS,gBAAgB,SAAS;AACxC,MAAI,QAAQ,EACV,QAAO;AAGT,SAAO,OAAO,SAAS,MAAM,SAAS,KAAK;;AAE7C,SAAQ,6BAA6B;CAErC,SAAS,mCAAmC,UAAU,UAAU,qBAAqB;EACnF,IAAI,MAEE,SAAS,eAAe,SAAS;AACvC,MAAI,QAAQ,EACV,QAAO;AAGT,QAAM,SAAS,iBAAiB,SAAS;AACzC,MAAI,QAAQ,KAAK,oBACf,QAAO;AAGT,QAAM,SAAS,kBAAkB,SAAS;AAC1C,MAAI,QAAQ,EACV,QAAO;AAGT,QAAM,SAAS,gBAAgB,SAAS;AACxC,MAAI,QAAQ,EACV,QAAO;AAGT,SAAO,OAAO,SAAS,MAAM,SAAS,KAAK;;AAE7C,SAAQ,qCAAqC;;;;;;;;;;CAW7C,SAAS,oCAAoC,UAAU,UAAU,sBAAsB;EACrF,IAAI,MAAM,SAAS,gBAAgB,SAAS;AAC5C,MAAI,QAAQ,EACV,QAAO;AAGT,QAAM,SAAS,kBAAkB,SAAS;AAC1C,MAAI,QAAQ,KAAK,qBACf,QAAO;AAGT,QAAM,OAAO,SAAS,QAAQ,SAAS,OAAO;AAC9C,MAAI,QAAQ,EACV,QAAO;AAGT,QAAM,SAAS,eAAe,SAAS;AACvC,MAAI,QAAQ,EACV,QAAO;AAGT,QAAM,SAAS,iBAAiB,SAAS;AACzC,MAAI,QAAQ,EACV,QAAO;AAGT,SAAO,OAAO,SAAS,MAAM,SAAS,KAAK;;AAE7C,SAAQ,sCAAsC;CAE9C,SAAS,0CAA0C,UAAU,UAAU,sBAAsB;EAC3F,IAAI,MAAM,SAAS,kBAAkB,SAAS;AAC9C,MAAI,QAAQ,KAAK,qBACf,QAAO;AAGT,QAAM,OAAO,SAAS,QAAQ,SAAS,OAAO;AAC9C,MAAI,QAAQ,EACV,QAAO;AAGT,QAAM,SAAS,eAAe,SAAS;AACvC,MAAI,QAAQ,EACV,QAAO;AAGT,QAAM,SAAS,iBAAiB,SAAS;AACzC,MAAI,QAAQ,EACV,QAAO;AAGT,SAAO,OAAO,SAAS,MAAM,SAAS,KAAK;;AAE7C,SAAQ,4CAA4C;CAEpD,SAAS,OAAO,OAAO,OAAO;AAC5B,MAAI,UAAU,MACZ,QAAO;AAGT,MAAI,UAAU,KACZ,QAAO;AAGT,MAAI,UAAU,KACZ,QAAO;AAGT,MAAI,QAAQ,MACV,QAAO;AAGT,SAAO;;;;;;CAOT,SAAS,oCAAoC,UAAU,UAAU;EAC/D,IAAI,MAAM,SAAS,gBAAgB,SAAS;AAC5C,MAAI,QAAQ,EACV,QAAO;AAGT,QAAM,SAAS,kBAAkB,SAAS;AAC1C,MAAI,QAAQ,EACV,QAAO;AAGT,QAAM,OAAO,SAAS,QAAQ,SAAS,OAAO;AAC9C,MAAI,QAAQ,EACV,QAAO;AAGT,QAAM,SAAS,eAAe,SAAS;AACvC,MAAI,QAAQ,EACV,QAAO;AAGT,QAAM,SAAS,iBAAiB,SAAS;AACzC,MAAI,QAAQ,EACV,QAAO;AAGT,SAAO,OAAO,SAAS,MAAM,SAAS,KAAK;;AAE7C,SAAQ,sCAAsC;;;;;;CAO9C,SAAS,oBAAoB,KAAK;AAChC,SAAO,KAAK,MAAM,IAAI,QAAQ,kBAAkB,GAAG,CAAC;;AAEtD,SAAQ,sBAAsB;;;;;CAM9B,SAAS,iBAAiB,YAAY,WAAW,cAAc;AAC7D,cAAY,aAAa;AAEzB,MAAI,YAAY;AAEd,OAAI,WAAW,WAAW,SAAS,OAAO,OAAO,UAAU,OAAO,IAChE,eAAc;AAOhB,eAAY,aAAa;;AAiB3B,MAAI,cAAc;GAChB,IAAI,SAAS,SAAS,aAAa;AACnC,OAAI,CAAC,OACH,OAAM,IAAI,MAAM,mCAAmC;AAErD,OAAI,OAAO,MAAM;IAEf,IAAI,QAAQ,OAAO,KAAK,YAAY,IAAI;AACxC,QAAI,SAAS,EACX,QAAO,OAAO,OAAO,KAAK,UAAU,GAAG,QAAQ,EAAE;;AAGrD,eAAY,KAAK,YAAY,OAAO,EAAE,UAAU;;AAGlD,SAAO,UAAU,UAAU;;AAE7B,SAAQ,mBAAmB;;;;;;CC1kB3B,IAAI;CACJ,IAAI,MAAM,OAAO,UAAU;CAC3B,IAAI,eAAe,OAAO,QAAQ;;;;;;;CAQlC,SAAS,WAAW;AAClB,OAAK,SAAS,EAAE;AAChB,OAAK,OAAO,+BAAe,IAAI,KAAK,GAAG,OAAO,OAAO,KAAK;;;;;AAM5D,UAAS,YAAY,SAAS,mBAAmB,QAAQ,kBAAkB;EACzE,IAAI,MAAM,IAAI,UAAU;AACxB,OAAK,IAAI,IAAI,GAAG,MAAM,OAAO,QAAQ,IAAI,KAAK,IAC5C,KAAI,IAAI,OAAO,IAAI,iBAAiB;AAEtC,SAAO;;;;;;;;AAST,UAAS,UAAU,OAAO,SAAS,gBAAgB;AACjD,SAAO,eAAe,KAAK,KAAK,OAAO,OAAO,oBAAoB,KAAK,KAAK,CAAC;;;;;;;AAQ/E,UAAS,UAAU,MAAM,SAAS,aAAa,MAAM,kBAAkB;EACrE,IAAI,OAAO,eAAe,OAAO,KAAK,YAAY,KAAK;EACvD,IAAI,cAAc,eAAe,KAAK,IAAI,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM,KAAK;EAC3E,IAAI,MAAM,KAAK,OAAO;AACtB,MAAI,CAAC,eAAe,iBAClB,MAAK,OAAO,KAAK,KAAK;AAExB,MAAI,CAAC,YACH,KAAI,aACF,MAAK,KAAK,IAAI,MAAM,IAAI;MAExB,MAAK,KAAK,QAAQ;;;;;;;AAUxB,UAAS,UAAU,MAAM,SAAS,aAAa,MAAM;AACnD,MAAI,aACF,QAAO,KAAK,KAAK,IAAI,KAAK;OACrB;GACL,IAAI,OAAO,KAAK,YAAY,KAAK;AACjC,UAAO,IAAI,KAAK,KAAK,MAAM,KAAK;;;;;;;;AASpC,UAAS,UAAU,UAAU,SAAS,iBAAiB,MAAM;AAC3D,MAAI,cAAc;GAChB,IAAI,MAAM,KAAK,KAAK,IAAI,KAAK;AAC7B,OAAI,OAAO,EACP,QAAO;SAEN;GACL,IAAI,OAAO,KAAK,YAAY,KAAK;AACjC,OAAI,IAAI,KAAK,KAAK,MAAM,KAAK,CAC3B,QAAO,KAAK,KAAK;;AAIrB,QAAM,IAAI,MAAM,OAAM,OAAO,wBAAuB;;;;;;;AAQtD,UAAS,UAAU,KAAK,SAAS,YAAY,MAAM;AACjD,MAAI,QAAQ,KAAK,OAAO,KAAK,OAAO,OAClC,QAAO,KAAK,OAAO;AAErB,QAAM,IAAI,MAAM,2BAA2B,KAAK;;;;;;;AAQlD,UAAS,UAAU,UAAU,SAAS,mBAAmB;AACvD,SAAO,KAAK,OAAO,OAAO;;AAG5B,SAAQ,WAAW;;;;;;CCjHnB,IAAI;;;;;CAMJ,SAAS,uBAAuB,UAAU,UAAU;EAElD,IAAI,QAAQ,SAAS;EACrB,IAAI,QAAQ,SAAS;EACrB,IAAI,UAAU,SAAS;EACvB,IAAI,UAAU,SAAS;AACvB,SAAO,QAAQ,SAAS,SAAS,SAAS,WAAW,WAC9C,KAAK,oCAAoC,UAAU,SAAS,IAAI;;;;;;;CAQzE,SAAS,cAAc;AACrB,OAAK,SAAS,EAAE;AAChB,OAAK,UAAU;AAEf,OAAK,QAAQ;GAAC,eAAe;GAAI,iBAAiB;GAAE;;;;;;;;AAStD,aAAY,UAAU,kBACpB,SAAS,oBAAoB,WAAW,UAAU;AAChD,OAAK,OAAO,QAAQ,WAAW,SAAS;;;;;;;AAQ5C,aAAY,UAAU,MAAM,SAAS,gBAAgB,UAAU;AAC7D,MAAI,uBAAuB,KAAK,OAAO,SAAS,EAAE;AAChD,QAAK,QAAQ;AACb,QAAK,OAAO,KAAK,SAAS;SACrB;AACL,QAAK,UAAU;AACf,QAAK,OAAO,KAAK,SAAS;;;;;;;;;;;;AAa9B,aAAY,UAAU,UAAU,SAAS,sBAAsB;AAC7D,MAAI,CAAC,KAAK,SAAS;AACjB,QAAK,OAAO,KAAK,KAAK,oCAAoC;AAC1D,QAAK,UAAU;;AAEjB,SAAO,KAAK;;AAGd,SAAQ,cAAc;;;;;;CCvEtB,IAAI;CACJ,IAAI;CACJ,IAAI,+BAAkC;CACtC,IAAI,qCAAwC;;;;;;;;;CAU5C,SAAS,mBAAmB,OAAO;AACjC,MAAI,CAAC,MACH,SAAQ,EAAE;AAEZ,OAAK,QAAQ,KAAK,OAAO,OAAO,QAAQ,KAAK;AAC7C,OAAK,cAAc,KAAK,OAAO,OAAO,cAAc,KAAK;AACzD,OAAK,kBAAkB,KAAK,OAAO,OAAO,kBAAkB,MAAM;AAClE,OAAK,wBAAwB,KAAK,OAAO,OAAO,wBAAwB,MAAM;AAC9E,OAAK,WAAW,IAAI,UAAU;AAC9B,OAAK,SAAS,IAAI,UAAU;AAC5B,OAAK,YAAY,IAAI,aAAa;AAClC,OAAK,mBAAmB;;AAG1B,oBAAmB,UAAU,WAAW;;;;;;AAOxC,oBAAmB,gBACjB,SAAS,iCAAiC,oBAAoB,cAAc;EAC1E,IAAI,aAAa,mBAAmB;EACpC,IAAI,YAAY,IAAI,mBAAmB,OAAO,OAAO,gBAAgB,EAAE,EAAE;GACvE,MAAM,mBAAmB;GACb;GACb,CAAC,CAAC;AACH,qBAAmB,YAAY,SAAU,SAAS;GAChD,IAAI,aAAa,EACf,WAAW;IACT,MAAM,QAAQ;IACd,QAAQ,QAAQ;IACjB,EACF;AAED,OAAI,QAAQ,UAAU,MAAM;AAC1B,eAAW,SAAS,QAAQ;AAC5B,QAAI,cAAc,KAChB,YAAW,SAAS,KAAK,SAAS,YAAY,WAAW,OAAO;AAGlE,eAAW,WAAW;KACpB,MAAM,QAAQ;KACd,QAAQ,QAAQ;KACjB;AAED,QAAI,QAAQ,QAAQ,KAClB,YAAW,OAAO,QAAQ;;AAI9B,aAAU,WAAW,WAAW;IAChC;AACF,qBAAmB,QAAQ,QAAQ,SAAU,YAAY;GACvD,IAAI,iBAAiB;AACrB,OAAI,eAAe,KACjB,kBAAiB,KAAK,SAAS,YAAY,WAAW;AAGxD,OAAI,CAAC,UAAU,SAAS,IAAI,eAAe,CACzC,WAAU,SAAS,IAAI,eAAe;GAGxC,IAAI,UAAU,mBAAmB,iBAAiB,WAAW;AAC7D,OAAI,WAAW,KACb,WAAU,iBAAiB,YAAY,QAAQ;IAEjD;AACF,SAAO;;;;;;;;;;;;AAaX,oBAAmB,UAAU,aAC3B,SAAS,8BAA8B,OAAO;EAC5C,IAAI,YAAY,KAAK,OAAO,OAAO,YAAY;EAC/C,IAAI,WAAW,KAAK,OAAO,OAAO,YAAY,KAAK;EACnD,IAAI,SAAS,KAAK,OAAO,OAAO,UAAU,KAAK;EAC/C,IAAIC,UAAO,KAAK,OAAO,OAAO,QAAQ,KAAK;AAE3C,MAAI,CAAC,KAAK,iBACR;OAAI,KAAK,iBAAiB,WAAW,UAAU,QAAQA,QAAK,KAAK,MAC/D;;AAIJ,MAAI,UAAU,MAAM;AAClB,YAAS,OAAO,OAAO;AACvB,OAAI,CAAC,KAAK,SAAS,IAAI,OAAO,CAC5B,MAAK,SAAS,IAAI,OAAO;;AAI7B,MAAIA,WAAQ,MAAM;AAChB,aAAO,OAAOA,QAAK;AACnB,OAAI,CAAC,KAAK,OAAO,IAAIA,QAAK,CACxB,MAAK,OAAO,IAAIA,QAAK;;AAIzB,OAAK,UAAU,IAAI;GACjB,eAAe,UAAU;GACzB,iBAAiB,UAAU;GAC3B,cAAc,YAAY,QAAQ,SAAS;GAC3C,gBAAgB,YAAY,QAAQ,SAAS;GACrC;GACR,MAAMA;GACP,CAAC;;;;;AAMN,oBAAmB,UAAU,mBAC3B,SAAS,oCAAoC,aAAa,gBAAgB;EACxE,IAAI,SAAS;AACb,MAAI,KAAK,eAAe,KACtB,UAAS,KAAK,SAAS,KAAK,aAAa,OAAO;AAGlD,MAAI,kBAAkB,MAAM;AAG1B,OAAI,CAAC,KAAK,iBACR,MAAK,mBAAmB,OAAO,OAAO,KAAK;AAE7C,QAAK,iBAAiB,KAAK,YAAY,OAAO,IAAI;aACzC,KAAK,kBAAkB;AAGhC,UAAO,KAAK,iBAAiB,KAAK,YAAY,OAAO;AACrD,OAAI,OAAO,KAAK,KAAK,iBAAiB,CAAC,WAAW,EAChD,MAAK,mBAAmB;;;;;;;;;;;;;;;;;;;AAqBhC,oBAAmB,UAAU,iBAC3B,SAAS,kCAAkC,oBAAoB,aAAa,gBAAgB;EAC1F,IAAI,aAAa;AAEjB,MAAI,eAAe,MAAM;AACvB,OAAI,mBAAmB,QAAQ,KAC7B,OAAM,IAAI,MACR,iJAED;AAEH,gBAAa,mBAAmB;;EAElC,IAAI,aAAa,KAAK;AAEtB,MAAI,cAAc,KAChB,cAAa,KAAK,SAAS,YAAY,WAAW;EAIpD,IAAI,aAAa,IAAI,UAAU;EAC/B,IAAI,WAAW,IAAI,UAAU;AAG7B,OAAK,UAAU,gBAAgB,SAAU,SAAS;AAChD,OAAI,QAAQ,WAAW,cAAc,QAAQ,gBAAgB,MAAM;IAEjE,IAAI,WAAW,mBAAmB,oBAAoB;KACpD,MAAM,QAAQ;KACd,QAAQ,QAAQ;KACjB,CAAC;AACF,QAAI,SAAS,UAAU,MAAM;AAE3B,aAAQ,SAAS,SAAS;AAC1B,SAAI,kBAAkB,KACpB,SAAQ,SAAS,KAAK,KAAK,gBAAgB,QAAQ,OAAO;AAE5D,SAAI,cAAc,KAChB,SAAQ,SAAS,KAAK,SAAS,YAAY,QAAQ,OAAO;AAE5D,aAAQ,eAAe,SAAS;AAChC,aAAQ,iBAAiB,SAAS;AAClC,SAAI,SAAS,QAAQ,KACnB,SAAQ,OAAO,SAAS;;;GAK9B,IAAI,SAAS,QAAQ;AACrB,OAAI,UAAU,QAAQ,CAAC,WAAW,IAAI,OAAO,CAC3C,YAAW,IAAI,OAAO;GAGxB,IAAIA,UAAO,QAAQ;AACnB,OAAIA,WAAQ,QAAQ,CAAC,SAAS,IAAIA,QAAK,CACrC,UAAS,IAAIA,QAAK;KAGnB,KAAK;AACR,OAAK,WAAW;AAChB,OAAK,SAAS;AAGd,qBAAmB,QAAQ,QAAQ,SAAU,cAAY;GACvD,IAAI,UAAU,mBAAmB,iBAAiBC,aAAW;AAC7D,OAAI,WAAW,MAAM;AACnB,QAAI,kBAAkB,KACpB,gBAAa,KAAK,KAAK,gBAAgBA,aAAW;AAEpD,QAAI,cAAc,KAChB,gBAAa,KAAK,SAAS,YAAYA,aAAW;AAEpD,SAAK,iBAAiBA,cAAY,QAAQ;;KAE3C,KAAK;;;;;;;;;;;;;AAcZ,oBAAmB,UAAU,mBAC3B,SAAS,mCAAmC,YAAY,WAAW,SACvB,OAAO;AAKjD,MAAI,aAAa,OAAO,UAAU,SAAS,YAAY,OAAO,UAAU,WAAW,UAAU;GAC3F,IAAI,UAAU;AAId,OAAI,KAAK,uBAAuB;AAC9B,QAAI,OAAO,YAAY,eAAe,QAAQ,KAC5C,SAAQ,KAAK,QAAQ;AAEvB,WAAO;SAEP,OAAM,IAAI,MAAM,QAAQ;;AAI5B,MAAI,cAAc,UAAU,cAAc,YAAY,cAC/C,WAAW,OAAO,KAAK,WAAW,UAAU,KAC5C,CAAC,aAAa,CAAC,WAAW,CAAC,MAEhC;WAEO,cAAc,UAAU,cAAc,YAAY,cAC/C,aAAa,UAAU,aAAa,YAAY,aAChD,WAAW,OAAO,KAAK,WAAW,UAAU,KAC5C,UAAU,OAAO,KAAK,UAAU,UAAU,KAC1C,QAEV;OAEG;GACH,IAAI,UAAU,sBAAsB,KAAK,UAAU;IACjD,WAAW;IACX,QAAQ;IACR,UAAU;IACV,MAAM;IACP,CAAC;AAEF,OAAI,KAAK,uBAAuB;AAC9B,QAAI,OAAO,YAAY,eAAe,QAAQ,KAC5C,SAAQ,KAAK,QAAQ;AAEvB,WAAO;SAEP,OAAM,IAAI,MAAM,QAAQ;;;;;;;AAShC,oBAAmB,UAAU,qBAC3B,SAAS,uCAAuC;EAC9C,IAAI,0BAA0B;EAC9B,IAAI,wBAAwB;EAC5B,IAAI,yBAAyB;EAC7B,IAAI,uBAAuB;EAC3B,IAAI,eAAe;EACnB,IAAI,iBAAiB;EACrB,IAAI,SAAS;EACb,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EAEJ,IAAI,WAAW,KAAK,UAAU,SAAS;AACvC,OAAK,IAAI,IAAI,GAAG,MAAM,SAAS,QAAQ,IAAI,KAAK,KAAK;AACnD,aAAU,SAAS;AACnB,UAAO;AAEP,OAAI,QAAQ,kBAAkB,uBAAuB;AACnD,8BAA0B;AAC1B,WAAO,QAAQ,kBAAkB,uBAAuB;AACtD,aAAQ;AACR;;cAIE,IAAI,GAAG;AACT,QAAI,CAAC,KAAK,oCAAoC,SAAS,SAAS,IAAI,GAAG,CACrE;AAEF,YAAQ;;AAIZ,WAAQ,UAAU,OAAO,QAAQ,kBACJ,wBAAwB;AACrD,6BAA0B,QAAQ;AAElC,OAAI,QAAQ,UAAU,MAAM;AAC1B,gBAAY,KAAK,SAAS,QAAQ,QAAQ,OAAO;AACjD,YAAQ,UAAU,OAAO,YAAY,eAAe;AACpD,qBAAiB;AAGjB,YAAQ,UAAU,OAAO,QAAQ,eAAe,IACnB,qBAAqB;AAClD,2BAAuB,QAAQ,eAAe;AAE9C,YAAQ,UAAU,OAAO,QAAQ,iBACJ,uBAAuB;AACpD,6BAAyB,QAAQ;AAEjC,QAAI,QAAQ,QAAQ,MAAM;AACxB,eAAU,KAAK,OAAO,QAAQ,QAAQ,KAAK;AAC3C,aAAQ,UAAU,OAAO,UAAU,aAAa;AAChD,oBAAe;;;AAInB,aAAU;;AAGZ,SAAO;;AAGX,oBAAmB,UAAU,0BAC3B,SAAS,0CAA0C,UAAU,aAAa;AACxE,SAAO,SAAS,IAAI,SAAU,QAAQ;AACpC,OAAI,CAAC,KAAK,iBACR,QAAO;AAET,OAAI,eAAe,KACjB,UAAS,KAAK,SAAS,aAAa,OAAO;GAE7C,IAAI,MAAM,KAAK,YAAY,OAAO;AAClC,UAAO,OAAO,UAAU,eAAe,KAAK,KAAK,kBAAkB,IAAI,GACnE,KAAK,iBAAiB,OACtB;KACH,KAAK;;;;;AAMZ,oBAAmB,UAAU,SAC3B,SAAS,4BAA4B;EACnC,IAAI,MAAM;GACR,SAAS,KAAK;GACd,SAAS,KAAK,SAAS,SAAS;GAChC,OAAO,KAAK,OAAO,SAAS;GAC5B,UAAU,KAAK,oBAAoB;GACpC;AACD,MAAI,KAAK,SAAS,KAChB,KAAI,OAAO,KAAK;AAElB,MAAI,KAAK,eAAe,KACtB,KAAI,aAAa,KAAK;AAExB,MAAI,KAAK,iBACP,KAAI,iBAAiB,KAAK,wBAAwB,IAAI,SAAS,IAAI,WAAW;AAGhF,SAAO;;;;;AAMX,oBAAmB,UAAU,WAC3B,SAAS,8BAA8B;AACrC,SAAO,KAAK,UAAU,KAAK,QAAQ,CAAC;;AAGxC,SAAQ,qBAAqB;;;;;;ACzb7B,MAAM,aAAa,IAAI,IAAI;CAAC;CAAU;CAAY;CAAc,CAAC;AAEjE,SAAgB,kBAAkB,UAAU;CACxC,MAAM,MAAM,IAAIC,gDAAoB;CACpC,MAAM,YAAY;EACd,MAAM;EACN,QAAQ;EACX;CACD,MAAM,WAAW;EACb,MAAM;EACN,QAAQ;EACX;CACD,MAAM,qBAAqB;EACvB,MAAM;EACN,QAAQ;EACX;CACD,MAAM,mBAAmB,EACrB,WAAW,oBACd;CACD,IAAI,OAAO;CACX,IAAI,SAAS;CACb,IAAI,sBAAsB;CAE1B,MAAM,mBAAmB,SAAS;AAClC,UAAS,OAAO,SAAS,MAAM;AAC3B,MAAI,KAAK,OAAO,KAAK,IAAI,SAAS,WAAW,IAAI,KAAK,KAAK,EAAE;GACzD,MAAM,WAAW,KAAK,IAAI,MAAM;GAChC,MAAM,aAAa,KAAK,IAAI,MAAM,SAAS;AAE3C,OAAI,SAAS,SAAS,YAClB,SAAS,WAAW,YAAY;AAChC,aAAS,OAAO;AAChB,aAAS,SAAS;AAElB,cAAU,OAAO;AACjB,cAAU,SAAS;AAEnB,QAAI,qBAAqB;AACrB,2BAAsB;AACtB,SAAI,UAAU,SAAS,mBAAmB,QACtC,UAAU,WAAW,mBAAmB,OACxC,KAAI,WAAW,iBAAiB;;AAIxC,0BAAsB;AACtB,QAAI,WAAW;KACX,QAAQ,KAAK,IAAI;KACjB;KACA;KACH,CAAC;;;AAIV,mBAAiB,KAAK,MAAM,KAAK;AAEjC,MAAI,uBAAuB,WAAW,IAAI,KAAK,KAAK,EAAE;AAClD,sBAAmB,OAAO;AAC1B,sBAAmB,SAAS;;;CAIpC,MAAM,mBAAmB,SAAS;AAClC,UAAS,OAAO,SAAS,OAAO,MAAM,MAAM;AACxC,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,IAC9B,KAAI,MAAM,WAAW,EAAE,KAAK,IAAI;AAC5B;AACA,YAAS;QAET;AAIR,mBAAiB,OAAO,MAAM,KAAK;;CAGvC,MAAM,qBAAqB,SAAS;AACpC,UAAS,SAAS,WAAW;AACzB,MAAI,oBACA,KAAI,WAAW,iBAAiB;AAGpC,SAAO;GACH,KAAK,oBAAoB;GACzB;GACH;;AAGL,QAAO;;;;;;;;;ACvEX,MAAMC,aAAW;AACjB,MAAMC,gBAAc;AAEpB,MAAM,QAAQ,MAAM,UAAU;AAC1B,KAAI,SAAS,MACT,QAAO;AAGX,KAAI,OAAO,SAAS,UAAU;EAC1B,MAAM,WAAW,KAAK,WAAW,EAAE;AACnC,SAAO,WAAW,MAAO,QAAS,YAAY;;AAGlD,QAAO;;AASX,MAAM,YAAY;CACd,CAAC,OAAO,MAAM;CACd,CAAC,OAAOC,SAAc;CACtB,CAAC,OAAO,IAAI;CACZ,CAAC,OAAO,OAAO;CACf,CAAC,OAAO,IAAI;CACZ,CAAC,OAAOC,SAAY;CACpB,CAAC,OAAO,WAAW;CACnB,CAAC,OAAO,UAAU;CAClB,CAAC,OAAO,IAAI;CACZ,CAAC,OAAO,gBAAgB;CAExB,CAAC,WAAW,MAAM;CAClB,CAAC,WAAWD,SAAc;CAC1B,CAAC,WAAW,IAAI;CAChB,CAAC,WAAW,OAAO;CACnB,CAAC,WAAW,IAAI;CAChB,CAAC,WAAWC,SAAY;CACxB,CAAC,WAAW,WAAW;CACvB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,IAAI;CAEhB,CAAC,MAAM,MAAM;CACb,CAAC,MAAMD,SAAc;CACrB,CAAC,MAAM,IAAI;CACX,CAAC,MAAM,OAAO;CACd,CAAC,MAAM,IAAI;CACX,CAAC,MAAMC,SAAY;CACnB,CAAC,MAAM,WAAW;CAClB,CAAC,MAAM,UAAU;CACjB,CAAC,MAAM,IAAI;CAEX,CAAC,WAAW,MAAM;CAClB,CAAC,WAAWD,SAAc;CAC1B,CAAC,WAAW,IAAI;CAChB,CAAC,WAAW,OAAO;CACnB,CAAC,WAAW,IAAI;CAChB,CAAC,WAAWC,SAAY;CACxB,CAAC,WAAW,WAAW;CACvB,CAAC,WAAW,UAAU;CACtB,CAAC,WAAW,IAAI;CAEhB,CAAC,KAAK,MAAM;CACZ,CAAC,KAAKD,SAAc;CACpB,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,OAAO;CACb,CAAC,KAAK,IAAI;CACV,CAAC,KAAKC,SAAY;CAClB,CAAC,KAAK,WAAW;CACjB,CAAC,KAAK,UAAU;CAChB,CAAC,KAAK,IAAI;CAEV,CAAC,KAAK,MAAM;CACZ,CAAC,KAAKD,SAAc;CACpB,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,OAAO;CACb,CAAC,KAAK,IAAI;CACV,CAAC,KAAKC,SAAY;CAClB,CAAC,KAAK,WAAW;CACjB,CAAC,KAAK,UAAU;CAChB,CAAC,KAAK,IAAI;CAEV,CAACA,UAAa,MAAM;CACpB,CAACA,UAAaD,SAAc;CAC5B,CAACC,UAAa,IAAI;CAClB,CAACA,UAAa,OAAO;CACrB,CAACA,UAAaA,SAAY;CAC1B,CAACA,UAAa,WAAW;CACzB,CAACA,UAAa,UAAU;CACxB,CAACA,UAAa,IAAI;CAClB,CAACA,UAAa,IAAI;CAElB,CAAC,KAAK,MAAM;CACZ,CAAC,KAAKD,SAAc;CACpB,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,OAAO;CACb,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CAEV,CAAC,KAAKC,SAAY;CAClB,CAAC,KAAK,WAAW;CACjB,CAAC,KAAK,UAAU;CAEhB,CAAC,KAAKA,SAAY;CAClB,CAAC,KAAK,WAAW;CACjB,CAAC,KAAK,UAAU;CAEhB,CAAC,KAAK,IAAI;CACb;AAED,MAAM,YAAY,UAAU,OAAO;CAC/B,CAAC,OAAO,KAAK;CAEb,CAAC,WAAW,KAAK;CAEjB,CAAC,MAAM,KAAK;CAEZ,CAAC,WAAW,gBAAgB;CAC5B,CAAC,WAAWC,SAAY;CACxB,CAAC,WAAW,MAAM;CAElB,CAAC,YAAY,WAAW;CACxB,CAAC,YAAY,UAAU;CACvB,CAAC,YAAYF,SAAc;CAC3B,CAAC,YAAY,IAAI;CAEjB,CAAC,kBAAkB,MAAM;CACzB,CAAC,kBAAkBA,SAAc;CACjC,CAAC,kBAAkB,WAAW;CAC9B,CAAC,kBAAkB,UAAU;CAC7B,CAAC,kBAAkB,KAAK;CACxB,CAAC,kBAAkB,IAAI;CAC1B,CAAC;AAEF,SAAS,UAAU,OAAO;CACtB,MAAM,uBAAuB,IAAI,IAC7B,MAAM,KAAK,CAAC,MAAM,UAAW,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,CAAE,CAC/D;AAED,QAAO,SAAS,UAAU,MAAM,OAAO;EACnC,MAAM,WAAW,KAAK,MAAM,MAAM;EAClC,MAAM,eAAe,MAAM,WAAW,EAAE;AAUxC,MARK,iBAAiBD,iBACd,SAAS,SACT,SAASC,YACT,SAAS,OACZ,iBAAiBF,aACZ,qBAAqB,IAAI,YAAY,KAAK,gBAAgB,EAAE,GAC5D,qBAAqB,IAAI,YAAY,KAAK,SAAS,CAGzD,MAAK,KAAK,KAAK,YAAY,KAAK;AAGpC,SAAO;;;AAIf,MAAa,OAAO,UAAU,UAAU;AACxC,MAAa,OAAO,UAAU,UAAU;;;;ACjLxC,MAAM,iBAAiB;AAEvB,SAAS,gBAAgB,MAAM,WAAW;AACtC,KAAI,OAAO,cAAc,YAAY;EACjC,IAAI,OAAO;AAEX,OAAK,SAAS,SAAQ,WAAQ;AAC1B,OAAI,SAAS,KACT,WAAU,KAAK,MAAM,KAAK;AAG9B,QAAK,KAAKK,OAAK;AACf,UAAOA;IACT;AAEF;;AAGJ,MAAK,SAAS,QAAQ,KAAK,MAAM,KAAK;;AAG1C,SAAS,aAAa,OAAO;AACzB,YAAS,QAAQ,MAAM,OAAO,QAAQ;AAClC,OAAK,MAAM,MAAM,MAAM,MAAM,OAAO,IAAI,CAAC;GAC3C;;AAGN,SAAgB,gBAAgB,QAAQ;CACpC,MAAM,wBAAQ,IAAI,KAAK;AAEvB,MAAK,IAAI,CAACC,SAAM,SAAS,OAAO,QAAQ,OAAO,KAAK,CAGhD,KAAI,QAFO,KAAK,YAAY,UAEV,WACd,OAAM,IAAIA,SAAM,KAAK,YAAY,KAAK;AAI9C,QAAO,SAAS,MAAM,SAAS;EAC3B,IAAI,SAAS;EACb,IAAI,WAAW;EACf,IAAI,WAAW;GACX,KAAK,QAAM;AACP,QAAI,MAAM,IAAID,OAAK,KAAK,CACpB,OAAM,IAAIA,OAAK,KAAK,CAAC,KAAK,WAAWA,OAAK;QAE1C,OAAM,IAAI,MAAM,wBAAwBA,OAAK,KAAK;;GAG1D,aAAaE;GACb,MAAM,MAAM,OAAO;AACf,eAAW,KAAK,YAAY,UAAU,MAAM,MAAM;AAElD,SAAK,KAAK,OAAO,MAAM,MAAM;AAE7B,QAAI,SAAS,SAAS,MAAM,WAAW,EAAE,KAAK,eAC1C,MAAK,KAAK,MAAM,YAAY,KAAK;;GAGzC,KAAK,OAAO;AACR,cAAU;;GAEd,SAAS;AACL,WAAO;;GAEd;AAED,MAAI,SAAS;AACT,OAAI,OAAO,QAAQ,cAAc,WAC7B,YAAW,QAAQ,UAAU,SAAS;AAG1C,OAAI,QAAQ,UACR,YAAW,kBAAkB,SAAS;AAG1C,OAAI,QAAQ,QAAQC,qBAChB,UAAS,cAAcA,qBAAY,QAAQ;;EAInD,MAAM,YAAY;GACd,OAAO,WAAS,SAAS,KAAKH,OAAK;GACnC,UAAU;GACV,QAAQ,MAAM,UAAU,SAAS,MAAM,MAAM,MAAM;GACnD,UAAU;GACb;AAED,WAAS,KAAK,KAAK;AAEnB,SAAO,SAAS,QAAQ;;;;;;AC5FhC,SAAgB,gBAAgB,QAAM;AAClC,QAAO;EACH,gBAAgB,KAAK;AACjB,UAAK,KAAK,EACN,MAAM,MAAM;AACR,QAAI,KAAK,YAAY,KAAK,oBAAoB,SAAS,MACnD,MAAK,WAAW,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS;MAG9D,CAAC;AAEF,UAAO;;EAEX,cAAc,KAAK;AACf,UAAK,KAAK,EACN,MAAM,MAAM;AACR,QAAI,KAAK,YAAY,KAAK,oBAAoB,KAC1C,MAAK,WAAW,KAAK,SAAS,SAAS;MAGlD,CAAC;AAEF,UAAO;;EAEd;;;;;AC1BL,MAAM,EAAE,qCAAmB,OAAO;AAClC,MAAMI,SAAO,WAAW;AAExB,SAASC,iBAAe,OAAO;AAC3B,QAAO,OAAO,UAAU,aAAa,QAAQD;;AAGjD,SAAS,cAAc,IAAI,MAAM;AAC7B,QAAO,SAAS,MAAM,MAAM,MAAM;AAC9B,MAAI,KAAK,SAAS,KACd,IAAG,KAAK,MAAM,MAAM,MAAM,KAAK;;;AAK3C,SAAS,wBAAwB,SAAM,UAAU;CAC7C,MAAME,eAAY,SAAS;CAC3B,MAAM,UAAU,EAAE;AAElB,MAAK,MAAM,OAAOA,cAAW;AACzB,MAAIC,iBAAe,KAAKD,cAAW,IAAI,KAAK,MACxC;EAGJ,IAAI,aAAaA,aAAU;EAC3B,MAAM,SAAS;GACX,MAAM;GACN,MAAM;GACN,UAAU;GACb;AAED,MAAI,CAAC,MAAM,QAAQ,WAAW,CAC1B,cAAa,CAAC,WAAW;AAG7B,OAAK,MAAM,aAAa,WACpB,KAAI,cAAc,KACd,QAAO,WAAW;WACX,OAAO,cAAc,SAC5B,QAAO,OAAO;WACP,MAAM,QAAQ,UAAU,CAC/B,QAAO,OAAO;AAItB,MAAI,OAAO,KACP,SAAQ,KAAK,OAAO;;AAI5B,KAAI,QAAQ,OACR,QAAO;EACH,SAAS,SAAS;EAClB,QAAQ;EACX;AAGL,QAAO;;AAGX,SAAS,mBAAmB,QAAQ;CAChC,MAAM,QAAQ,EAAE;AAEhB,MAAK,MAAME,WAAQ,OAAO,KACtB,KAAID,iBAAe,KAAK,OAAO,MAAMC,QAAK,EAAE;EACxC,MAAM,WAAW,OAAO,KAAKA;AAE7B,MAAI,CAAC,SAAS,UACV,OAAM,IAAI,MAAM,kCAAkCA,UAAO,yBAAyB;AAGtF,QAAMA,WAAQ,wBAAwBA,SAAM,SAAS;;AAI7D,QAAO;;AAGX,SAAS,mBAAmB,QAAQ,SAAS;CACzC,MAAM,SAAS,OAAO,OAAO,OAAO;CACpC,MAAM,cAAc,OAAO;CAC3B,MAAM,aAAa,OAAO,gBAAgB;AAE1C,KAAI,QACA,QAAO,SAAS;AAGpB,QAAO,SAAS,MAAM,SAAS,QAAM,aAAa;EAC9C,IAAI;AAEJ,MAAI,YAAY;AACZ,sBAAmB,QAAQ;AAC3B,WAAQ,eAAe;;AAG3B,OAAK,MAAM,SAAS,QAAQ;GACxB,MAAM,MAAM,KAAK,MAAM;AAEvB,OAAI,CAAC,MAAM,YAAY,KACnB;QAAI,MAAM,SAAS,QAKf;SAJkB,UACZ,IAAI,YAAY,aAAa,MAAM,GACnC,IAAI,OAAO,aAAa,MAAM,CAGhC,QAAO;eAEJC,OAAK,IAAI,CAChB,QAAO;;;AAKnB,MAAI,WACA,SAAQ,eAAe;;;AAKnC,SAAS,sBAAsB,EAC3B,YACA,QACA,MACA,OACA,mBACD;AACC,QAAO;EACH,QAAQ;GACJ;GACA;GACA;GACA;GACH;EACD,MAAM;GACF;GACA;GACA;GACA;GACH;EACD,aAAa;GACT;GACA;GACA;GACA;GACA;GACH;EACJ;;AAGL,SAAgB,aAAa,QAAQ;CACjC,MAAM,QAAQ,mBAAmB,OAAO;CACxC,MAAM,mBAAmB,EAAE;CAC3B,MAAM,mBAAmB,EAAE;CAC3B,MAAM,YAAY,OAAO,aAAa;CACtC,MAAM,WAAW,OAAO,YAAY;AAEpC,MAAK,MAAMD,WAAQ,MACf,KAAID,iBAAe,KAAK,OAAOC,QAAK,IAAI,MAAMA,aAAU,MAAM;AAC1D,mBAAiBA,WAAQ,mBAAmB,MAAMA,UAAO,MAAM;AAC/D,mBAAiBA,WAAQ,mBAAmB,MAAMA,UAAO,KAAK;;CAItE,MAAM,gCAAgC,sBAAsB,iBAAiB;CAC7E,MAAM,gCAAgC,sBAAsB,iBAAiB;CAE7E,MAAMC,SAAO,SAAS,MAAM,SAAS;EACjC,SAAS,SAAS,MAAM,MAAM,MAAM;GAChC,MAAM,WAAW,MAAM,KAAK,SAAS,MAAM,MAAM,KAAK;AAEtD,OAAI,aAAa,UACb,QAAO;AAGX,OAAI,aAAa,SACb,QAAO;AAGX,OAAI,UAAU,eAAe,KAAK,KAAK,EACnC;QAAI,UAAU,KAAK,MAAM,MAAM,SAAS,UAAU,YAAY,CAC1D,QAAO;;AAIf,OAAI,MAAM,KAAK,SAAS,MAAM,MAAM,KAAK,KAAK,UAC1C,QAAO;AAGX,UAAO;;EAGX,IAAI,QAAQL;EACZ,IAAI,QAAQA;EACZ,IAAI,YAAY;EAChB,IAAI,eAAe,KAAK,MAAM,MAAM,SAAS,OAAO,SAAS,MAAM,MAAM,KAAK;EAC9E,MAAM,UAAU;GACZ,OAAO;GACP,MAAM;GAEN;GACA,YAAY;GACZ,QAAQ;GACR,eAAe;GACf,MAAM;GACN,UAAU;GACV,OAAO;GACP,aAAa;GACb,UAAU;GACb;AAED,MAAI,OAAO,YAAY,WACnB,SAAQ;WACD,SAAS;AAChB,WAAQC,iBAAe,QAAQ,MAAM;AACrC,WAAQA,iBAAe,QAAQ,MAAM;AAErC,OAAI,QAAQ,QACR,aAAY;AAGhB,OAAI,QAAQ,OAAO;AACf,QAAI,8BAA8B,eAAe,QAAQ,MAAM,CAC3D,aAAY,QAAQ,UACd,8BAA8B,QAAQ,SACtC,8BAA8B,QAAQ;aACrC,CAAC,MAAM,eAAe,QAAQ,MAAM,CAC3C,OAAM,IAAI,MAAM,gBAAgB,QAAQ,QAAQ,sCAAsC,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,GAAG,IAAI;AAGrI,YAAQ,cAAc,OAAO,QAAQ,MAAM;AAC3C,YAAQ,cAAc,OAAO,QAAQ,MAAM;;;AAInD,MAAI,UAAUD,UAAQ,UAAUA,OAC5B,OAAM,IAAI,MAAM,8EAA+E;AAGnG,WAAS,KAAK;;AAGlB,QAAK,QAAQ;AACb,QAAK,OAAO;AAEZ,QAAK,OAAO,SAAS,KAAK,IAAI;EAC1B,IAAI,QAAQ;AAEZ,SAAK,KAAK,SAAS,MAAM,MAAM,MAAM;AACjC,OAAI,GAAG,KAAK,MAAM,MAAM,MAAM,KAAK,EAAE;AACjC,YAAQ;AACR,WAAO;;IAEb;AAEF,SAAO;;AAGX,QAAK,WAAW,SAAS,KAAK,IAAI;EAC9B,IAAI,QAAQ;AAEZ,SAAK,KAAK;GACN,SAAS;GACT,MAAM,MAAM,MAAM,MAAM;AACpB,QAAI,GAAG,KAAK,MAAM,MAAM,MAAM,KAAK,EAAE;AACjC,aAAQ;AACR,YAAO;;;GAGlB,CAAC;AAEF,SAAO;;AAGX,QAAK,UAAU,SAAS,KAAK,IAAI;EAC7B,MAAM,QAAQ,EAAE;AAEhB,SAAK,KAAK,SAAS,MAAM,MAAM,MAAM;AACjC,OAAI,GAAG,KAAK,MAAM,MAAM,MAAM,KAAK,CAC/B,OAAM,KAAK,KAAK;IAEtB;AAEF,SAAO;;AAGX,QAAOK;;;;;AC7RX,SAASC,OAAK,OAAO;AACjB,QAAO;;AAGX,SAAS,mBAAmB,YAAY;CACpC,MAAM,EAAE,KAAK,KAAK,UAAU;AAE5B,KAAI,QAAQ,KAAK,QAAQ,EACrB,QAAO,QAAQ,OAAO;AAG1B,KAAI,QAAQ,KAAK,QAAQ,EACrB,QAAO;AAGX,KAAI,QAAQ,KAAK,QAAQ,EACrB,QAAO,QAAQ,MAAM;AAGzB,KAAI,QAAQ,KAAK,QAAQ,EACrB,QAAO;AAGX,SACK,QAAQ,MAAM,OACd,QAAQ,MACH,MAAM,MAAM,MACZ,MAAM,MAAM,OAAO,QAAQ,IAAI,MAAM,MAAM;;AAKzD,SAAS,iBAAiB,MAAM;AAC5B,SAAQ,KAAK,MAAb;EACI,KAAK,QACD,QACI,QACC,KAAK,QAAQ,OAAO,OAAO,KAAK,OACjC,OACC,KAAK,QAAQ,OAAO,MAAM,KAAK,OAChC;EAGR,QACI,OAAM,IAAI,MAAM,wBAAwB,KAAK,OAAO,IAAI;;;AAIpE,SAAS,iBAAiB,MAAM,UAAU,aAAa,SAAS;CAC5D,MAAM,aAAa,KAAK,eAAe,OAAO,UAAU,KAAK,aAAa,MAAM,KAAK,aAAa;CAClG,MAAM,SAAS,KAAK,MACf,KAAI,SAAQ,iBAAiB,MAAM,UAAU,aAAa,QAAQ,CAAC,CACnE,KAAK,WAAW;AAErB,KAAI,KAAK,YAAY,YACjB,SAAQ,WAAW,OAAO,OAAO,MAAM,MAAM,QAAQ,UAAU,UAAU,MAAM;AAGnF,QAAO;;AAGX,SAAS,iBAAiB,MAAM,UAAU,aAAa,SAAS;CAC5D,IAAI;AAEJ,SAAQ,KAAK,MAAb;EACI,KAAK;AACD,YACI,iBAAiB,MAAM,UAAU,aAAa,QAAQ,IACrD,KAAK,gBAAgB,MAAM;AAChC;EAEJ,KAAK,aAED,QACI,iBAAiB,KAAK,MAAM,UAAU,aAAa,QAAQ,GAC3D,SAAS,mBAAmB,KAAK,EAAE,KAAK;EAGhD,KAAK;AACD,YAAS,mBAAmB,iBAAiB,KAAK,MAAM,UAAU,aAAa,QAAQ,GAAG;AAC1F;EAEJ,KAAK;AACD,YAAS,MAAM,KAAK,QAAQ,KAAK,OAAO,SAAS,iBAAiB,KAAK,KAAK,EAAE,KAAK,KAAK,GAAG,MAAM;AACjG;EAEJ,KAAK;AACD,YAAS,OAAQ,KAAK,OAAO;AAC7B;EAEJ,KAAK;AACD,YAAS,KAAK;AACd;EAEJ,KAAK;AACD,YAAS,MAAM,KAAK;AACpB;EAEJ,KAAK;AACD,YAAS,KAAK,OAAO;AACrB;EAEJ,KAAK;EACL,KAAK;AACD,YAAS,KAAK;AACd;EAEJ,KAAK;AACD,YAAS;AACT;EAEJ,QACI,OAAM,IAAI,MAAM,wBAAwB,KAAK,OAAO,IAAI;;AAGhE,QAAO,SAAS,QAAQ,KAAK;;AAGjC,SAAgBC,YAAS,MAAM,SAAS;CACpC,IAAI,WAAWD;CACf,IAAI,cAAc;CAClB,IAAI,UAAU;AAEd,KAAI,OAAO,YAAY,WACnB,YAAW;UACJ,SAAS;AAChB,gBAAc,QAAQ,QAAQ,YAAY;AAC1C,YAAU,QAAQ,QAAQ,QAAQ;AAClC,MAAI,OAAO,QAAQ,aAAa,WAC5B,YAAW,QAAQ;;AAI3B,QAAO,iBAAiB,MAAM,UAAU,aAAa,QAAQ;;;;;AClIjE,MAAM,aAAa;CAAE,QAAQ;CAAG,MAAM;CAAG,QAAQ;CAAG;AAEpD,SAAS,eAAe,aAAa,MAAM;CACvC,MAAM,SAAS,YAAY;CAC3B,MAAM,eAAe,YAAY;CACjC,MAAM,eAAe,eAAe,OAAO,SAAS,OAAO,cAAc,QAAQ,OAAO;CACxF,MAAM,UAAU,iBAAiB,OAAO,eAAe;CACvD,IAAI,iBAAiB;CACrB,IAAI,iBAAiB;CACrB,IAAI,UAAU;CACd,IAAIE,QAAM;CACV,IAAI;CACJ,IAAI;AAEJ,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;EACpC,MAAM,QAAQ,OAAO,GAAG;AAExB,MAAI,MAAM,cAAc;AACpB,oBAAiB,MAAM;AACvB,oBAAiBA,MAAI;;AAGzB,MAAI,YAAY,QAAQ,OAAO,GAAG,SAAS,QACvC,KAAI,KAAK,aACL;MAEA,WAAU;AAIlB,WAAO;;AAGX,KAAI,iBAAiB,OAAO,UAAU,UAAU,GAAG;AAC/C,UAAQ,QAAQ,WAAW,MAAM,MAAM,IAAI,SAAS,YAAYA,MAAI;AACpE,QAAM,SAAS,MAAM;QAClB;AACH,UAAQ,QAAQ,SAAS,QAAQ,IAC7B,SAAS,QAAQ,MAAM,QAAQ,IAAI,YAAYA,MAAI,MAAM,GAAG,eAAe,CAAC;AAChF,QAAM,QAAQ,SAAS,MAAM,IACzB,SAAS,OAAOA,MAAI,OAAO,gBAAgB,eAAe,CAAC;;AAGnE,QAAO;EACH;EACA;EACA;EACA;EACA;EACH;;AAGL,SAAS,QAAQ,MAAM,OAAO;CAC1B,MAAM,QAAQ,QAAQ,KAAK,OAAO,KAAK,IAAI;AAE3C,KAAI,MACA,QAAO,UAAU,QAAQ,SAAS,MAAM,GAAG;AAG/C,QAAO;;AAGX,SAAS,SAAS,EAAE,QAAQ,MAAM,UAAU,OAAO;CAC/C,MAAM,MAAM;EACR;EACA;EACA;EACH;AAED,KAAI,OAAO;EACP,MAAM,QAAQ,MAAM,MAAM,cAAc;AAExC,MAAI,UAAU,MAAM;AACpB,MAAI,QAAQ,MAAM,SAAS;AAC3B,MAAI,SAAS,MAAM,WAAW,IAAI,IAAI,SAAS,MAAM,SAAS,MAAM,KAAK,CAAC,SAAS;;AAGvF,QAAO;;AAGX,MAAa,uBAAuB,SAAS,MAAM,eAAe;CAC9D,MAAM,QAAQ,kBACV,wBACA,QAAQ,gBAAgB,OAAO,gBAAgB,MAAM,IACxD;AAED,OAAM,YAAY;AAElB,QAAO;;AAGX,MAAa,mBAAmB,SAAS,SAAS,QAAQ,MAAM,aAAa;CACzE,MAAM,QAAQ,kBAAkB,oBAAoB,QAAQ;CAC5D,MAAM,EACF,YACA,gBACA,gBACA,OACA,QACA,eAAe,aAAa,KAAK;AAErC,OAAM,aAAa;AACnB,OAAM,SAAS,SAASC,YAAS,OAAO,GAAG;AAC3C,OAAM,MAAMD;AACZ,OAAM,iBAAiB;AACvB,OAAM,iBAAiB;AACvB,OAAM,UAAU,UAAU,iBACP,MAAM,SAAS,kBACdA,SAAO,oBAAoB,iBAC5B,IAAI,MAAM,MAAM,iBAAiB,EAAE,CAAC,KAAK,IAAI,GAAG;AAEnE,QAAO,OAAO,OAAO,MAAM;AAC3B,OAAM,MAAM;EACR,QAAS,QAAQ,KAAK,OAAO,KAAK,IAAI,UAAW;EACjD;EACA;EACH;AAED,QAAO;;;;;ACzHX,MAAM,2BAAW,IAAI,KAAK;AAC1B,MAAM,6BAAa,IAAI,KAAK;AAC5B,MAAME,gBAAc;AAEpB,MAAa,UAAU;AACvB,MAAa,WAAW;AAExB,SAAgB,iBAAiB,KAAK,QAAQ;AAC1C,UAAS,UAAU;AAEnB,QAAO,IAAI,SAAS,UAAU,KACvB,IAAI,WAAW,OAAO,KAAKA,iBAC3B,IAAI,WAAW,SAAS,EAAE,KAAKA;;AAG1C,SAAS,gBAAgB,KAAK,QAAQ;AAClC,UAAS,UAAU;AAGnB,KAAI,IAAI,SAAS,UAAU,GAEvB;MAAI,IAAI,WAAW,OAAO,KAAKA,iBAC3B,IAAI,WAAW,SAAS,EAAE,KAAKA,eAAa;GAE5C,MAAM,kBAAkB,IAAI,QAAQ,KAAK,SAAS,EAAE;AAEpD,OAAI,oBAAoB,GACpB,QAAO,IAAI,UAAU,QAAQ,kBAAkB,EAAE;;;AAK7D,QAAO;;AAGX,SAAS,qBAAqB,WAAS;AACnC,KAAI,SAAS,IAAIC,UAAQ,CACrB,QAAO,SAAS,IAAIA,UAAQ;CAGhC,MAAMC,UAAOD,UAAQ,aAAa;CAClC,IAAI,aAAa,SAAS,IAAIC,QAAK;AAEnC,KAAI,eAAe,QAAW;EAC1B,MAAM,SAAS,iBAAiBA,SAAM,EAAE;EACxC,MAAM,SAAS,CAAC,SAAS,gBAAgBA,SAAM,EAAE,GAAG;AACpD,eAAa,OAAO,OAAO;GACvB,UAAUA,QAAK,OAAO,OAAO,OAAO;GACpC;GACA,QAAQ;GACR;GACA;GACH,CAAC;;AAGN,UAAS,IAAID,WAAS,WAAW;AAEjC,QAAO;;AAGX,SAAS,sBAAsB,YAAU;AACrC,KAAI,WAAW,IAAIE,WAAS,CACxB,QAAO,WAAW,IAAIA,WAAS;CAGnC,IAAID,UAAOC;CACX,IAAI,OAAOA,WAAS;AAEpB,KAAI,SAAS,IACT,QAAOA,WAAS,OAAO,MAAM,OAAO;UAC7B,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,IAChB,QAAO;CAGX,MAAM,SAAS,iBAAiBD,SAAM,KAAK,OAAO;AAGlD,KAAI,CAAC,QAAQ;AACT,YAAOA,QAAK,aAAa;AACzB,MAAI,WAAW,IAAIA,QAAK,EAAE;GACtB,MAAME,eAAa,WAAW,IAAIF,QAAK;AACvC,cAAW,IAAIC,YAAUC,aAAW;AACpC,UAAOA;;;CAIf,MAAM,SAAS,CAAC,SAAS,gBAAgBF,SAAM,KAAK,OAAO,GAAG;CAC9D,MAAM,SAASA,QAAK,OAAO,GAAG,KAAK,SAAS,OAAO,OAAO;CAC1D,MAAM,aAAa,OAAO,OAAO;EAC7B,UAAUA,QAAK,OAAO,OAAO,OAAO;EACpC,MAAMA,QAAK,OAAO,KAAK,OAAO;EAC9B;EACA;EACA;EACA;EACH,CAAC;AAEF,YAAW,IAAIC,YAAU,WAAW;AAEpC,QAAO;;;;;ACvGX,MAAa,kBAAkB;CAC3B;CACA;CACA;CACA;CACA;CACH;;;;ACID,MAAME,aAAW;AACjB,MAAMC,gBAAc;AACpB,MAAMC,MAAI;AACV,MAAMC,kBAAgB;AACtB,MAAMC,eAAa;AAEnB,SAASC,UAAQ,OAAO,QAAM;AAC1B,QAAO,UAAU,QAAQ,MAAM,SAAS,SAAS,MAAM,MAAM,WAAW,EAAE,KAAKC;;AAGnF,SAAS,OAAO,OAAO,QAAQ,cAAc;AACzC,QAAO,UAAU,SAAS,MAAM,SAAS,cAAc,MAAM,SAAS,SAClE,SAAQ,aAAa,EAAE,OAAO;AAGlC,QAAO;;AAGX,SAASC,eAAa,OAAO,aAAa,cAAc,QAAQ;AAC5D,KAAI,CAAC,MACD,QAAO;CAGX,MAAMD,SAAO,MAAM,MAAM,WAAW,YAAY;AAEhD,KAAIA,WAASN,cAAYM,WAASL,eAAa;AAC3C,MAAI,aAEA,QAAO;AAEX;;AAGJ,QAAO,cAAc,MAAM,MAAM,QAAQ,cACrC,KAAI,CAAC,QAAQ,MAAM,MAAM,WAAW,YAAY,CAAC,CAE7C,QAAO;AAIf,QAAO,SAAS;;AAKpB,SAASO,WAAS,OAAO,SAAS,cAAc;CAC5C,IAAI,OAAO;CACX,IAAI,SAAS,OAAO,OAAO,SAAS,aAAa;AAEjD,SAAQ,aAAa,OAAO;AAE5B,KAAI,UAAU,KACV,QAAO;AAGX,KAAI,MAAM,SAASC,SACf,KAAIJ,UAAQ,OAAOL,WAAS,IAAIK,UAAQ,OAAOJ,cAAY,EAAE;AACzD,SAAO;AACP,WAAS,OAAO,aAAa,EAAE,OAAO,EAAE,QAAQ,aAAa;AAC7D,UAAQ,aAAa,OAAO;AAE5B,MAAI,UAAU,QAAQ,MAAM,SAASQ,SACjC,QAAO;OAGX,QAAO;AAIf,KAAI,CAAC,MAAM;EACP,MAAMH,SAAO,MAAM,MAAM,WAAW,EAAE;AACtC,MAAIA,WAASN,cAAYM,WAASL,cAE9B,QAAO;;AAIf,QAAOM,eAAa,OAAO,OAAO,IAAI,GAAG,MAAM,OAAO;;AAI1D,SAAwB,QAAQ,OAAO,cAAc;CAEjD,IAAI,SAAS;AAEb,KAAI,CAAC,MACD,QAAO;AAIX,KAAI,MAAM,SAASE,SACf,QAAOF,eAAa,OAAO,GAAGH,cAAY,OAAO;UAQ5C,MAAM,SAAS,SAAS,MAAM,MAAM,WAAW,EAAE,KAAKH,eAAa;AAExE,MAAI,CAAC,QAAQ,MAAM,OAAO,GAAGC,IAAE,CAC3B,QAAO;AAGX,UAAQ,MAAM,MAAM,QAApB;GAII,KAAK,EACD,QAAOM,WAAS,aAAa,EAAE,OAAO,EAAE,QAAQ,aAAa;GAGjE,KAAK;AACD,QAAI,MAAM,MAAM,WAAW,EAAE,KAAKP,cAC9B,QAAO;AAGX,aAAS,OAAO,aAAa,EAAE,OAAO,EAAE,QAAQ,aAAa;AAC7D,YAAQ,aAAa,OAAO;AAE5B,WAAOM,eAAa,OAAO,GAAGJ,iBAAe,OAAO;GAGxD;AACI,QAAI,MAAM,MAAM,WAAW,EAAE,KAAKF,cAC9B,QAAO;AAGX,WAAOM,eAAa,OAAO,GAAGJ,iBAAe,OAAO;;YASvD,MAAM,SAAS,SAAUE,UAAQ,OAAOL,WAAS,IAAI,aAAa,SAAS,EAAE,CAAC,SAAS,OAAQ;AAEpG,MAAI,MAAM,SAAS,MACf,SAAQ,aAAa,EAAE,OAAO;AAGlC,MAAI,UAAU,QAAQ,CAAC,QAAQ,MAAM,OAAO,GAAGE,IAAE,CAC7C,QAAO;AAGX,UAAQ,MAAM,MAAM,QAApB;GAII,KAAK,EACD,QAAOM,WAAS,aAAa,EAAE,OAAO,EAAE,QAAQ,aAAa;GAGjE,KAAK;AACD,QAAI,MAAM,MAAM,WAAW,EAAE,KAAKP,cAC9B,QAAO;AAGX,aAAS,OAAO,aAAa,EAAE,OAAO,EAAE,QAAQ,aAAa;AAC7D,YAAQ,aAAa,OAAO;AAE5B,WAAOM,eAAa,OAAO,GAAGJ,iBAAe,OAAO;GAGxD;AACI,QAAI,MAAM,MAAM,WAAW,EAAE,KAAKF,cAC9B,QAAO;AAGX,WAAOM,eAAa,OAAO,GAAGJ,iBAAe,OAAO;;YASvD,MAAM,SAAS,WAAW;EAC/B,IAAIG,SAAO,MAAM,MAAM,WAAW,EAAE;EACpC,IAAI,OAAOA,WAASN,cAAYM,WAASL,gBAAc,IAAI;EAC3D,IAAI,IAAI;AAER,SAAO,IAAI,MAAM,MAAM,QAAQ,IAC3B,KAAI,CAAC,QAAQ,MAAM,MAAM,WAAW,EAAE,CAAC,CACnC;AAIR,MAAI,MAAM,KAEN,QAAO;AAGX,MAAI,CAAC,QAAQ,MAAM,OAAO,GAAGC,IAAE,CAC3B,QAAO;AAMX,MAAI,IAAI,MAAM,MAAM,MAAM,OACtB,QAAOM,WAAS,aAAa,EAAE,OAAO,EAAE,QAAQ,aAAa;OAC1D;AACH,OAAI,MAAM,MAAM,WAAW,IAAI,EAAE,KAAKP,cAClC,QAAO;AAIX,OAAI,IAAI,MAAM,MAAM,MAAM,QAAQ;AAC9B,aAAS,OAAO,aAAa,EAAE,OAAO,EAAE,QAAQ,aAAa;AAC7D,YAAQ,aAAa,OAAO;AAE5B,WAAOM,eAAa,OAAO,GAAGJ,iBAAe,OAAO;SAIpD,QAAOI,eAAa,OAAO,IAAI,GAAGJ,iBAAe,OAAO;;;AAKpE,QAAO;;;;;ACnOX,MAAMO,aAAW;AACjB,MAAMC,gBAAc;AACpB,MAAMC,iBAAe;AACrB,MAAMC,MAAI;AAEV,SAAS,QAAQ,OAAO,QAAM;AAC1B,QAAO,UAAU,QAAQ,MAAM,SAAS,SAAS,MAAM,MAAM,WAAW,EAAE,KAAKC;;AAGnF,SAASC,aAAW,OAAO,QAAM;AAC7B,QAAO,MAAM,MAAM,WAAW,EAAE,KAAKD;;AAGzC,SAAS,YAAY,OAAO,QAAQ,WAAW;CAC3C,IAAI,SAAS;AAEb,MAAK,IAAI,MAAM,QAAQ,MAAM,MAAM,MAAM,QAAQ,OAAO;EACpD,MAAMA,SAAO,MAAM,MAAM,WAAW,IAAI;AAExC,MAAIA,WAASH,iBAAe,aAAa,WAAW,GAAG;AACnD,eAAY,OAAO,SAAS,SAAS,GAAG,MAAM;AAC9C,UAAO;;AAGX,MAAI,CAAC,WAAWG,OAAK,CACjB,QAAO;AAGX,MAAI,EAAE,SAAS,EACX,QAAO;;AAIf,QAAO;;AAGX,SAAS,yBAAyB,UAAU,UAAQ,cAAc;AAC9D,KAAI,CAAC,SACD,QAAO;AAGX,QAAO,QAAQ,aAAaE,SAAO,EAAEJ,eAAa,EAAE;AAChD,MAAI,EAAE,WAAW,EACb,QAAO;AAGX;;AAGJ,QAAOI;;AAsBX,SAAwB,OAAO,OAAO,cAAc;CAChD,IAAIA,WAAS;AAGb,KAAI,UAAU,QAAQ,MAAM,SAAS,SAAS,CAAC,QAAQ,MAAM,OAAO,GAAGH,IAAE,CACrE,QAAO;AAGX,SAAQ,aAAa,EAAEG,SAAO;AAC9B,KAAI,UAAU,KACV,QAAO;AAKX,KAAI,QAAQ,OAAON,WAAS,EAAE;AAC1B,UAAQ,aAAa,EAAEM,SAAO;AAC9B,MAAI,UAAU,KACV,QAAO;AAGX,MAAI,MAAM,SAAS,MAEf,QAAO,yBAAyB,YAAY,OAAO,GAAG,KAAK,EAAE,EAAEA,UAAQ,aAAa;AAGxF,MAAI,QAAQ,OAAOJ,eAAa,CAE5B,QAAO,yBAAyB,GAAG,EAAEI,UAAQ,aAAa;AAI9D,SAAO;;AAMX,KAAI,MAAM,SAASC,UAAa;EAC5B,MAAM,oBAAoB,YAAY,OAAO,GAAG,KAAK;AACrD,MAAI,sBAAsB,EACtB,QAAO;AAGX,UAAQ,aAAa,EAAED,SAAO;AAC9B,MAAI,UAAU,KAEV,QAAOA;AAGX,MAAI,MAAM,SAAS,aAAa,MAAM,SAASC,UAAa;AAGxD,OAAI,CAACF,aAAW,OAAOJ,cAAY,IAAI,CAAC,YAAY,OAAO,GAAG,MAAM,CAChE,QAAO;AAGX,UAAOK,WAAS;;AAIpB,SAAO,yBAAyB,mBAAmBA,UAAQ,aAAa;;AAI5E,KAAI,MAAM,SAAS,UACf,QAAO,yBAAyB,YAAY,OAAO,GAAG,KAAK,EAAE,EAAEA,UAAQ,aAAa;AAGxF,QAAO;;;;;ACjHX,MAAM,oBAAoB;CAAC;CAAS;CAAc;CAAgB;AAClE,MAAM,cAAc,IAAI,IAAI;CACxB,CAACE,UAAe,iBAAiB;CACjC,CAAC,iBAAiB,iBAAiB;CACnC,CAAC,mBAAmB,mBAAmB;CACvC,CAAC,kBAAkB,kBAAkB;CACxC,CAAC;AAGF,SAAS,WAAW,KAAK,OAAO;AAC5B,QAAO,QAAQ,IAAI,SAAS,IAAI,WAAW,MAAM,GAAG;;AAGxD,SAAS,MAAM,QAAQ,UAAU;AAC7B,QAAO,OAAO,QAAQ,GAAG,OAAO,QAAQ,SAAS;;AAGrD,SAAS,SAAS,QAAQ,UAAU;AAChC,MAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,IACjC,KAAI,MAAM,QAAQ,SAAS,GAAG,CAC1B,QAAO;AAIf,QAAO;;AAIX,SAAS,gBAAgB,KAAK,QAAQ;AAClC,KAAI,WAAW,IAAI,SAAS,EACxB,QAAO;AAGX,QACI,WAAW,KAAK,OAAO,KAAK,MAC5B,QAAQ,WAAW,KAAK,SAAS,EAAE,CAAC;;AAI5C,SAAS,WAAW,MAAM,OAAO,QAAQ;AACrC,KAAI,QAAQ,KAAK,SAAS,SAAS;EAC/B,MAAM,MAAM,OACR,WAAW,UAAa,WAAW,MAAM,SACnC,MAAM,OAAO,GAAG,OAAO,GACvB,MACT;AAED,MAAI,MAAM,IAAI,CACV,QAAO;AAKX,MAAI,KAAK,QAAQ,QAAQ,MAAM,KAAK,OAAO,OAAO,KAAK,QAAQ,SAC3D,QAAO;AAKX,MAAI,KAAK,QAAQ,QAAQ,MAAM,KAAK,OAAO,OAAO,KAAK,QAAQ,SAC3D,QAAO;;AAIf,QAAO;;AAGX,SAAS,gBAAgB,OAAO,cAAc;CAC1C,IAAI,mBAAmB;CACvB,IAAI,eAAe,EAAE;CACrB,IAAIC,WAAS;AAGb,MACA,IAAG;AACC,UAAQ,MAAM,MAAd;GACI,KAAK;GACL,KAAK;GACL,KAAK;AACD,QAAI,MAAM,SAAS,iBACf,OAAM;AAGV,uBAAmB,aAAa,KAAK;AAErC,QAAI,aAAa,WAAW,GAAG;AAC3B;AACA,WAAM;;AAGV;GAEJ,KAAKD;GACL,KAAK;GACL,KAAK;GACL,KAAK;AACD,iBAAa,KAAK,iBAAiB;AACnC,uBAAmB,YAAY,IAAI,MAAM,KAAK;AAC9C;;AAGR;UACK,QAAQ,aAAaC,SAAO;AAErC,QAAOA;;AAMX,SAAS,KAAK,MAAM;AAChB,QAAO,SAAS,OAAO,cAAc,MAAM;AACvC,MAAI,UAAU,KACV,QAAO;AAGX,MAAI,MAAM,SAASD,YAAiB,SAAS,MAAM,OAAO,kBAAkB,CACxE,QAAO,gBAAgB,OAAO,aAAa;AAG/C,SAAO,KAAK,OAAO,cAAc,KAAK;;;AAI9C,SAAS,UAAU,mBAAmB;AAClC,QAAO,SAAS,OAAO;AACnB,MAAI,UAAU,QAAQ,MAAM,SAAS,kBACjC,QAAO;AAGX,SAAO;;;AAef,SAAS,YAAY,OAAO;AACxB,KAAI,UAAU,QAAQ,MAAM,SAAS,MACjC,QAAO;CAGX,MAAME,UAAO,MAAM,MAAM,aAAa;AAGtC,KAAI,SAASA,SAAM,gBAAgB,CAC/B,QAAO;AAIX,KAAI,MAAMA,SAAM,UAAU,CACtB,QAAO;AASX,QAAO;;AAMX,SAAS,YAAY,OAAO;AACxB,KAAI,UAAU,QAAQ,MAAM,SAAS,MACjC,QAAO;AAIX,KAAI,WAAW,MAAM,OAAO,EAAE,KAAK,MAAU,WAAW,MAAM,OAAO,EAAE,KAAK,GACxE,QAAO;AAGX,QAAO;;AAOX,SAAS,mBAAmB,OAAO;AAE/B,KAAI,CAAC,YAAY,MAAM,CACnB,QAAO;AAIX,KAAI,MAAM,UAAU,KAChB,QAAO;AAGX,QAAO;;AAOX,SAAS,SAAS,OAAO;AACrB,KAAI,UAAU,QAAQ,MAAM,SAAS,KACjC,QAAO;CAGX,MAAMD,WAAS,MAAM,MAAM;AAG3B,KAAIA,aAAW,KAAKA,aAAW,KAAKA,aAAW,KAAKA,aAAW,EAC3D,QAAO;AAGX,MAAK,IAAI,IAAI,GAAG,IAAIA,UAAQ,IACxB,KAAI,CAAC,WAAW,WAAW,MAAM,OAAO,EAAE,CAAC,CACvC,QAAO;AAIf,QAAO;;AAGX,SAAS,WAAW,OAAO;AACvB,KAAI,UAAU,QAAQ,MAAM,SAAS,KACjC,QAAO;AAGX,KAAI,CAAC,kBAAkB,WAAW,MAAM,OAAO,EAAE,EAAE,WAAW,MAAM,OAAO,EAAE,EAAE,WAAW,MAAM,OAAO,EAAE,CAAC,CACtG,QAAO;AAGX,QAAO;;AAKX,SAAS,iBAAiB,OAAO,cAAc;AAC3C,KAAI,CAAC,MACD,QAAO;CAGX,IAAI,mBAAmB;CACvB,IAAI,eAAe,EAAE;CACrB,IAAIA,WAAS;AAIb,MACA,IAAG;AACC,UAAQ,MAAM,MAAd;GAEI,KAAK;GACL,KAAK,OACD,OAAM;GAGV,KAAK;GACL,KAAK;GACL,KAAK;AACD,QAAI,MAAM,SAAS,iBACf,OAAM;AAGV,uBAAmB,aAAa,KAAK;AACrC;GAGJ,KAAK;AACD,QAAI,qBAAqB,EACrB,OAAM;AAGV;GAGJ,KAAK;AACD,QAAI,qBAAqB,KAAK,MAAM,UAAU,IAC1C,OAAM;AAGV;GAEJ,KAAKD;GACL,KAAK;GACL,KAAK;GACL,KAAK;AACD,iBAAa,KAAK,iBAAiB;AACnC,uBAAmB,YAAY,IAAI,MAAM,KAAK;AAC9C;;AAGR;UACK,QAAQ,aAAaC,SAAO;AAErC,QAAOA;;AAOX,SAAS,SAAS,OAAO,cAAc;AACnC,KAAI,CAAC,MACD,QAAO;CAGX,IAAI,mBAAmB;CACvB,IAAI,eAAe,EAAE;CACrB,IAAIA,WAAS;AAIb,MACA,IAAG;AACC,UAAQ,MAAM,MAAd;GAEI,KAAK;GACL,KAAK,OACD,OAAM;GAGV,KAAK;GACL,KAAK;GACL,KAAK;AACD,QAAI,MAAM,SAAS,iBACf,OAAM;AAGV,uBAAmB,aAAa,KAAK;AACrC;GAEJ,KAAKD;GACL,KAAK;GACL,KAAK;GACL,KAAK;AACD,iBAAa,KAAK,iBAAiB;AACnC,uBAAmB,YAAY,IAAI,MAAM,KAAK;AAC9C;;AAGR;UACK,QAAQ,aAAaC,SAAO;AAErC,QAAOA;;AAOX,SAAS,UAAU,MAAM;AACrB,KAAI,KACA,QAAO,IAAI,IAAI,KAAK;AAGxB,QAAO,SAAS,OAAO,cAAc,MAAM;AACvC,MAAI,UAAU,QAAQ,MAAM,SAAS,UACjC,QAAO;EAGX,MAAM,YAAY,cAAc,MAAM,OAAO,EAAE;AAG/C,MAAI,SAAS,MAAM;GAEf,MAAM,uBAAuB,MAAM,MAAM,QAAQ,MAAM,UAAU;GACjE,MAAM,OAAO,yBAAyB,MAAM,CAAC,gBAAgB,MAAM,OAAO,qBAAqB,GACzF,MAAM,MAAM,OAAO,UAAU,GAC7B,MAAM,MAAM,UAAU,WAAW,qBAAqB;AAE5D,OAAI,KAAK,IAAI,KAAK,aAAa,CAAC,KAAK,MACjC,QAAO;;AAKf,MAAI,WAAW,MAAM,MAAM,OAAO,UAAU,CACxC,QAAO;AAGX,SAAO;;;AAUf,SAAS,WAAW,OAAO,cAAc,MAAM;AAE3C,KAAI,UAAU,QAAQ,MAAM,SAAS,WACjC,QAAO;AAIX,KAAI,WAAW,MAAM,MAAM,OAAO,MAAM,MAAM,SAAS,EAAE,CACrD,QAAO;AAGX,QAAO;;AAWX,SAAS,KAAK,MAAM;AAChB,KAAI,OAAO,SAAS,WAChB,QAAO,WAAW;AACd,SAAO;;AAIf,QAAO,SAAS,OAAO,cAAc,MAAM;AACvC,MAAI,UAAU,QAAQ,MAAM,SAASE,UACjC;OAAI,OAAO,MAAM,MAAM,KAAK,EACxB,QAAO;;AAIf,SAAO,KAAK,OAAO,cAAc,KAAK;;;AAQ9C,SAAS,OAAO,OAAO,cAAc,MAAM;AACvC,KAAI,UAAU,KACV,QAAO;CAGX,MAAM,YAAY,cAAc,MAAM,OAAO,EAAE;AAE/C,KAAI,EADa,cAAc,MAAM,MAAM,WAC1B,CAAC,gBAAgB,MAAM,OAAO,UAAU,CACrD,QAAO;AAIX,KAAI,WAAW,MAAM,MAAM,OAAO,UAAU,CACxC,QAAO;AAGX,QAAO;;AAKX,SAAS,QAAQ,OAAO,cAAc,MAAM;AAExC,KAAI,UAAU,QAAQ,MAAM,SAASA,SACjC,QAAO;CAIX,IAAI,IAAI,WAAW,MAAM,OAAO,EAAE,KAAK,MAC/B,WAAW,MAAM,OAAO,EAAE,KAAK,KAAS,IAAI;AAGpD,QAAO,IAAI,MAAM,MAAM,QAAQ,IAC3B,KAAI,CAAC,QAAQ,WAAW,MAAM,OAAO,EAAE,CAAC,CACpC,QAAO;AAKf,KAAI,WAAW,MAAM,MAAM,OAAO,EAAE,CAChC,QAAO;AAGX,QAAO;;AAIX,MAAa,aAAa;CACtB,eAAe,UAAU,MAAM;CAC/B,kBAAkB,UAAUH,SAAc;CAC1C,oBAAoB,UAAU,UAAU;CACxC,cAAc,UAAU,KAAK;CAC7B,gBAAgB,UAAUI,SAAY;CACtC,oBAAoB,UAAU,UAAU;CACxC,aAAa,UAAU,IAAI;CAC3B,iBAAiB,UAAU,OAAO;CAClC,eAAe,UAAU,MAAM;CAC/B,gBAAgB,UAAUD,SAAY;CACtC,oBAAoB,UAAU,WAAW;CACzC,mBAAmB,UAAU,UAAU;CACvC,oBAAoB,UAAU,WAAW;CACzC,aAAa,UAAU,IAAI;CAC3B,aAAa,UAAU,IAAI;CAC3B,eAAe,UAAU,MAAM;CAC/B,mBAAmB,UAAU,UAAU;CACvC,eAAe,UAAU,MAAM;CAC/B,WAAW,UAAU,kBAAkB;CACvC,WAAW,UAAU,mBAAmB;CACxC,WAAW,UAAU,gBAAgB;CACrC,WAAW,UAAU,iBAAiB;CACtC,WAAW,UAAU,iBAAiB;CACtC,WAAW,UAAU,kBAAkB;CAC1C;AAGD,MAAa,kBAAkB;CAE3B,UAAU,UAAUC,SAAY;CAChC,SAAS,UAAU,MAAM;CAGzB,cAAc,KAAK,WAAW;CAG9B,QAAQ,MAAM;CACd,UAAU,KAAK,OAAO;CACtB,WAAW,KAAK,QAAQ;CAGxB,gBAAgB;CAChB,gBAAgB;CAChB,wBAAwB;CACxB,aAAa;CACb,eAAe;CACf,aAAa;CACb,UAAU;CACV,qBAAqB;CACrB,aAAa;CAChB;AAcD,SAAgB,qBAAqB,OAAO;CACxC,MAAM,EACF,gBACA,oBACA,wBACA,cACA,kBACA,0BACA,wBACA,iBACA,SAAS,EAAE;AAEf,QAAO;EACH,aAAa,KAAK,UAAU,KAAK,CAAC;EAClC,SAAS,KAAK,UAAUC,QAAM,CAAC;EAC/B,WAAW,KAAK,UAAUC,UAAQ,CAAC;EACnC,aAAa,KAAK,UAAUC,YAAU,CAAC;EACvC,QAAQ,KAAK,UAAUC,OAAK,CAAC;EAC7B,UAAU,KAAK,KAAK,UAAUP,SAAO,CAAC,CAAC;EACvC,cAAc,KAAK,UAAUQ,aAAW,CAAC;EACzC,aAAa,KAAK,UAAUC,YAAU,CAAC;EACvC,QAAQ,KAAK,UAAUC,OAAK,CAAC;EAChC;;AAGL,SAAgB,mBAAmB,OAAO;AACtC,QAAO;EACH,GAAG;EACH,GAAG;EACH,GAAG,qBAAqB,MAAM;EACjC;;;;;;;;;;;;;;;AC5mBL,MAAa,SAAS;CAElB;CAAM;CAAM;CAAK;CAAM;CAAM;CAAM;CAEnC;CAAM;CACN;CAAM;CACN;CAAO;CACP;CAAM;CACN;CAAM;CACN;CAAM;CAEN;CAAM;CAAO;CAAO;CACpB;CAAM;CAAO;CAAO;CACpB;CAAM;CAAO;CAAO;CACpB;CAAM;CAAO;CAAO;CACpB;CAAQ;CAAS;CAAS;CAC1B;CAAQ;CAAS;CAAS;CAE1B;CAAO;CAAO;CAAO;CAAO;CAAS;CACxC;AACD,MAAa,QAAQ;CAAC;CAAO;CAAQ;CAAO;CAAO;AACnD,MAAa,OAAO,CAAC,KAAK,KAAK;AAC/B,MAAa,YAAY,CAAC,MAAM,MAAM;AACtC,MAAa,aAAa;CAAC;CAAO;CAAQ;CAAQ;CAAI;AACtD,MAAa,OAAO,CAAC,KAAK;AAC1B,MAAa,UAAU,CAAC,KAAK;AAC7B,MAAa,YAAY,CAAC,KAAK;;;;ACxB/B,SAAgBC,cAAY,SAAS,OAAO,QAAQ;AAChD,QAAO,OAAO,OAAO,kBAAkB,eAAe,QAAQ,EAAE;EAC5D;EACA;EACA,YAAY;EACZ,SAAS,UAAU,SACR,QAAQ,SACR,IAAI,OAAO,UAAU,MAAM,UAAU,EAAE,CAAC,KAAK,IAAI,GAAG;EAClE,CAAC;;;;;ACRN,MAAMC,QAAM;AACZ,MAAMC,MAAI;AACV,MAAMC,MAAI;AACV,MAAMC,MAAI;AACV,MAAMC,UAAQ;AACd,MAAM,YAAY,IAAI,WAAW,IAAI,CAAC,KAAK,GAAG,QAC1C,gBAAgB,KAAK,OAAO,aAAa,IAAI,CAAC,GAAG,IAAI,EACxD;AAED,IAAa,UAAb,MAAqB;CACjB,YAAY,KAAK;AACb,OAAK,MAAM;AACX,OAAK,MAAM;;CAGf,WAAW,KAAK;AACZ,SAAO,MAAM,KAAK,IAAI,SAAS,KAAK,IAAI,WAAW,IAAI,GAAG;;CAE9D,WAAW;AACP,SAAO,KAAK,WAAW,KAAK,IAAI;;CAEpC,eAAe,SAAO,KAAK,UAAU,EAAE;AACnC,SAAOC,SAAO,OAAO,UAAUA,YAAU;;CAE7C,eAAe;AACX,SAAO,KAAK,WAAW,KAAK,MAAM,EAAE;;CAExC,cAAc,KAAK;AACf,SAAO,KAAK,WAAW,KAAK,UAAU,IAAI,CAAC;;CAE/C,SAAS;AACL,OAAK,MAAM,KAAK,UAAU,KAAK,IAAI;;CAEvC,UAAU,KAAK;AACX,SAAO,MAAM,KAAK,IAAI,QAAQ,OAAO;GACjC,MAAMA,SAAO,KAAK,IAAI,WAAW,IAAI;AACrC,OAAIA,WAASF,OAAKE,WAASJ,OAAKI,WAASH,OAAKG,WAASD,WAASC,WAASL,MACrE;;AAIR,SAAO;;CAEX,eAAe,KAAK;AAChB,SAAO,KAAK,IAAI,UAAU,KAAK,KAAK,KAAK,MAAM,IAAI;;CAEvD,IAAI,QAAM;AACN,MAAI,KAAK,UAAU,KAAKK,OACpB,MAAK,MAAM,aAAa,OAAO,aAAaA,OAAK,GAAG,IAAI;AAG5D,OAAK;;CAET,OAAO;AACH,SAAO,KAAK,MAAM,KAAK,IAAI,SAAS,KAAK,IAAI,OAAO,KAAK,MAAM,GAAG;;CAEtE,MAAM,SAAS;AACX,QAAM,IAAIC,cAAY,SAAS,KAAK,KAAK,KAAK,IAAI;;CAGtD,aAAa;AACT,SAAO,KAAK,eAAe,KAAK,UAAU,KAAK,IAAI,CAAC;;CAExD,WAAW;EACP,IAAI,MAAM,KAAK;AAEf,SAAO,MAAM,KAAK,IAAI,QAAQ,OAAO;GACjC,MAAMD,SAAO,KAAK,IAAI,WAAW,IAAI;AACrC,OAAIA,UAAQ,OAAO,UAAUA,YAAU,EACnC;;AAIR,MAAI,KAAK,QAAQ,IACb,MAAK,MAAM,mBAAmB;AAGlC,SAAO,KAAK,eAAe,IAAI;;CAEnC,aAAa;EACT,IAAI,MAAM,KAAK;AAEf,SAAO,MAAM,KAAK,IAAI,QAAQ,OAAO;GACjC,MAAMA,SAAO,KAAK,IAAI,WAAW,IAAI;AAErC,OAAIA,SAAO,MAAMA,SAAO,GACpB;;AAIR,MAAI,KAAK,QAAQ,IACb,MAAK,MAAM,kBAAkB;AAGjC,SAAO,KAAK,eAAe,IAAI;;CAEnC,aAAa;EACT,MAAM,MAAM,KAAK,IAAI,QAAQ,KAAM,KAAK,MAAM,EAAE;AAEhD,MAAI,QAAQ,IAAI;AACZ,QAAK,MAAM,KAAK,IAAI;AACpB,QAAK,MAAM,uBAAuB;;AAGtC,SAAO,KAAK,eAAe,MAAM,EAAE;;;;;;ACxG3C,MAAM,MAAM;AACZ,MAAME,MAAI;AACV,MAAM,IAAI;AACV,MAAM,IAAI;AACV,MAAMC,UAAQ;AACd,MAAMC,oBAAkB;AACxB,MAAMC,eAAa;AACnB,MAAMC,cAAY;AAClB,MAAMC,eAAa;AACnB,MAAMC,oBAAkB;AACxB,MAAMC,qBAAmB;AACzB,MAAMC,aAAW;AACjB,MAAMC,aAAW;AACjB,MAAM,QAAQ;AACd,MAAM,aAAa;AACnB,MAAMC,iBAAe;AACrB,MAAMC,oBAAkB;AACxB,MAAMC,iBAAe;AACrB,MAAM,eAAe;AACrB,MAAM,oBAAoB;AAC1B,MAAM,qBAAqB;AAC3B,MAAM,mBAAmB;AACzB,MAAMC,iBAAe;AACrB,MAAM,oBAAoB;AAC1B,MAAM,WAAW;AACjB,MAAM,wBAAwB;CAC1B,KAAK;CACL,MAAM;CACN,MAAM;CACN,KAAK;CACR;AAED,SAAS,oBAAoB,SAAS;CAClC,IAAI,MAAM;CACV,IAAI,MAAM;AAEV,SAAQ,IAAI,iBAAiB;AAC7B,SAAQ,QAAQ;AAEhB,OAAM,QAAQ,WAAW,QAAQ;AACjC,SAAQ,QAAQ;AAEhB,KAAI,QAAQ,UAAU,KAAK,OAAO;AAC9B,UAAQ;AACR,UAAQ,QAAQ;AAEhB,MAAI,QAAQ,UAAU,KAAK,mBAAmB;AAC1C,SAAM,QAAQ,WAAW,QAAQ;AACjC,WAAQ,QAAQ;;OAGpB,OAAM;AAGV,SAAQ,IAAI,kBAAkB;AAE9B,QAAO;EACH,KAAK,OAAO,IAAI;EAChB,KAAK,MAAM,OAAO,IAAI,GAAG;EAC5B;;AAGL,SAAS,eAAe,SAAS;CAC7B,IAAI,QAAQ;CACZ,IAAI,QAAQ;AAEZ,SAAQ,QAAQ,UAAU,EAA1B;EACI,KAAKL;AACD,WAAQ;AAER,WAAQ;IACJ,KAAK;IACL,KAAK;IACR;AAED;EAEJ,KAAKC;AACD,WAAQ;AAER,WAAQ;IACJ,KAAK;IACL,KAAK;IACR;AAED;EAEJ,KAAKG;AACD,WAAQ;AAER,WAAQ;IACJ,KAAK;IACL,KAAK;IACR;AAED;EAEJ,KAAKT;AACD,WAAQ;AAER,WAAQ;AAER,OAAI,QAAQ,UAAU,KAAK,iBACvB,SAAQ,oBAAoB,QAAQ;YAC7B,QAAQ,UAAU,KAAKS,gBAAc;AAK5C,YAAQ;AACR,YAAQ;KACJ,KAAK;KACL,KAAK;KACR;SAED,SAAQ;IACJ,KAAK;IACL,KAAK;IACR;AAGL;EAEJ,KAAK;AACD,WAAQ,oBAAoB,QAAQ;AACpC;EAEJ,QACI,QAAO;;AAGf,QAAO;EACH,MAAM;EACN;EACA,KAAK,MAAM;EACX,KAAK,MAAM;EACX,MAAM;EACT;;AAGL,SAAS,gBAAgB,SAAS,MAAM;CACpC,MAAM,aAAa,eAAe,QAAQ;AAE1C,KAAI,eAAe,MAAM;AACrB,aAAW,OAAO;AAWlB,MAAI,QAAQ,UAAU,KAAKT,gBACvB,QAAQ,WAAW,QAAQ,MAAM,EAAE,KAAKM,WACxC,QAAO,gBAAgB,SAAS,WAAW;AAG/C,SAAO;;AAGX,QAAO;;AAGX,SAAS,WAAW,SAAS;CACzB,MAAM,KAAK,QAAQ,MAAM;AAEzB,KAAI,OAAO,GACP,QAAO;AAGX,QAAO,gBAAgB,SAAS;EAC5B,MAAM;EACN,OAAO;EACV,CAAC;;AAGN,SAASK,eAAa,SAAS;CAC3B,IAAIC;AAEJ,SAAQ,IAAIL,eAAa;AACzB,SAAQ,IAAIL,aAAW;AAEvB,WAAO,QAAQ,UAAU;AAEzB,SAAQ,IAAIA,aAAW;AACvB,SAAQ,IAAIM,kBAAgB;AAE5B,QAAO,gBAAgB,SAAS;EAC5B,MAAM;EACN;EACH,CAAC;;AAUN,SAAS,cAAc,SAAS;CAE5B,IAAI,MAAM;CACV,IAAI,MAAM;CACV,IAAI,OAAO;AAEX,SAAQ,IAAI,kBAAkB;AAE9B,KAAI,QAAQ,UAAU,KAAK,YAAY;AACnC,UAAQ,MAAM;AACd,SAAO;;AAGX,KAAI,QAAQ,MAAM,QAAQ,UAAU,KAAK,SACrC,SAAQ,MAAM;MACX;AACH,QAAM,OAAO,OAAO,QAAQ,WAAW,QAAQ,CAAC;AAEhD,MAAI,QAAQ,gBAAgB,CACxB,QAAO,QAAQ,UAAU;;AAIjC,SAAQ,QAAQ;AAChB,SAAQ,IAAI,MAAM;AAClB,SAAQ,QAAQ;AAEhB,KAAI,QAAQ,UAAU,KAAK,SACvB,SAAQ,MAAM;MACX;AACH,SAAO;AAEP,MAAI,QAAQ,UAAU,KAAK,YAAY;AACnC,WAAQ,MAAM;AACd,UAAO;;AAGX,QAAM,OAAO,OAAO,QAAQ,WAAW,QAAQ,CAAC;AAEhD,MAAI,QAAQ,gBAAgB,CACxB,QAAO,QAAQ,UAAU;;AAIjC,SAAQ,IAAI,mBAAmB;AAE/B,QAAO;EACH,MAAM;EACN;EACA;EACH;;AAGL,SAAS,SAAS,SAAS;CACvB,IAAII;CACJ,IAAI,OAAO;AAEX,SAAQ,IAAIL,eAAa;AACzB,WAAO,QAAQ,UAAU;AAGzB,KAAIK,YAAS,gBAAgB;AACzB,UAAQ,IAAI,kBAAkB;EAE9B,MAAM,gBAAgB,kBAAkB,SAAS,mBAAmB;AAEpE,UAAQ,IAAI,mBAAmB;AAC/B,UAAQ,IAAIJ,kBAAgB;AAE5B,SAAO,gBAAgB,SAAS;GAC5B,MAAM;GACN,MAAM,cAAc,MAAM,WAAW,IAC/B,cAAc,MAAM,KACpB;GACT,CAAC;;AAGN,KAAI,QAAQ,UAAU,KAAKL,qBACvB,QAAQ,cAAc,KAAKC,oBAAkB;AAC7C,UAAQ,OAAO;AACf,aAAQ;;AAGZ,KAAI,QAAQ,WAAW,QAAQ,UAAU,QAAQ,IAAI,CAAC,KAAK,mBAAmB;AAC1E,UAAQ,QAAQ;AAChB,SAAO,cAAc,QAAQ;;AAGjC,SAAQ,IAAII,kBAAgB;AAE5B,QAAO,gBAAgB,SAAS;EAC5B,MAAM;EACN;EACA;EACH,CAAC;;AAGN,SAAS,sBAAsB,SAAS;CACpC,MAAMI,UAAO,QAAQ,UAAU;AAE/B,KAAI,QAAQ,UAAU,KAAKT,mBAAiB;AACxC,UAAQ;AAER,SAAO;GACH,MAAM;GACN;GACH;;AAGL,QAAO,gBAAgB,SAAS;EAC5B,MAAM;EACN;EACH,CAAC;;AAGN,SAAS,aAAa,OAAO,aAAa;CACtC,SAAS,YAAY,SAAO,cAAY;AACpC,SAAO;GACH,MAAM;GACN;GACA;GACA,eAAe;GACf,UAAU;GACb;;CAGL,IAAI;AAEJ,eAAc,OAAO,KAAK,YAAY,CACjC,MAAM,GAAG,MAAM,sBAAsB,KAAK,sBAAsB,GAAG;AAExE,QAAO,YAAY,SAAS,GAAG;AAC3B,eAAa,YAAY,OAAO;EAEhC,IAAI,IAAI;EACR,IAAI,gBAAgB;AAEpB,SAAO,IAAI,MAAM,QAAQ,KAAK;GAC1B,MAAM,OAAO,MAAM;AAEnB,OAAI,KAAK,SAAS,aACd,KAAI,KAAK,UAAU,YAAY;AAC3B,QAAI,kBAAkB,GAClB,iBAAgB,IAAI;AAExB,UAAM,OAAO,GAAG,EAAE;AAClB;UACG;AACH,QAAI,kBAAkB,MAAM,IAAI,gBAAgB,GAAG;AAC/C,WAAM,OACF,eACA,IAAI,eACJ,YAAY,MAAM,MAAM,eAAe,EAAE,EAAE,WAAW,CACzD;AACD,SAAI,gBAAgB;;AAExB,oBAAgB;;;AAK5B,MAAI,kBAAkB,MAAM,YAAY,OACpC,OAAM,OACF,eACA,IAAI,eACJ,YAAY,MAAM,MAAM,eAAe,EAAE,EAAE,WAAW,CACzD;;AAIT,QAAO;;AAGX,SAAS,kBAAkB,SAAS,cAAc;CAC9C,MAAM,cAAc,OAAO,OAAO,KAAK;CACvC,MAAM,QAAQ,EAAE;CAChB,IAAI;CACJ,IAAI,YAAY;CAChB,IAAI,eAAe,QAAQ;AAE3B,QAAO,QAAQ,UAAU,KAAK,iBAAiB,QAAQ,KAAK,SAAS,aAAa,EAC9E,KAAI,MAAM,SAAS,UAAU;AACzB,MAAI,MAAM,SAAS,cAAc;AAE7B,OAAI,cAAc,QAAQ,UAAU,SAAS,cAAc;AACvD,YAAQ,MAAM;AACd,YAAQ,MAAM,wBAAwB;;AAG1C,eAAY,MAAM,SAAS;aACpB,cAAc,QAAQ,UAAU,SAAS,cAAc;AAC9D,eAAY,OAAO;AACnB,SAAM,KAAK;IACP,MAAM;IACN,OAAO;IACV,CAAC;;AAGN,QAAM,KAAK,MAAM;AACjB,cAAY;AACZ,iBAAe,QAAQ;;AAK/B,KAAI,cAAc,QAAQ,UAAU,SAAS,cAAc;AACvD,UAAQ,OAAO;AACf,UAAQ,MAAM,wBAAwB;;AAG1C,QAAO;EACH,MAAM;EACN;EACA,YAAY,aAAa,OAAO,YAAY,IAAI;EAChD,eAAe;EACf,UAAU;EACb;;AAGL,SAAS,UAAU,SAAS,cAAc;CACtC,IAAI;AAEJ,SAAQ,IAAI,kBAAkB;AAC9B,UAAS,kBAAkB,SAAS,aAAa;AACjD,SAAQ,IAAI,mBAAmB;AAE/B,QAAO,WAAW;AAElB,KAAI,QAAQ,UAAU,KAAKJ,mBAAiB;AACxC,UAAQ;AACR,SAAO,gBAAgB;;AAG3B,QAAO;;AAGX,SAAS,KAAK,SAAS,cAAc;CACjC,IAAIc,SAAO,QAAQ,UAAU;AAE7B,SAAQA,QAAR;EACI,KAAK,mBAED;EAEJ,KAAK,kBACD,QAAO,gBAAgB,SAAS,UAAU,SAAS,aAAa,CAAC;EAErE,KAAKN,eACD,QAAO,QAAQ,cAAc,KAAKL,eAC5BS,eAAa,QAAQ,GACrB,SAAS,QAAQ;EAE3B,KAAKD,eACD,QAAO;GACH,MAAM;GACN,OAAO,QAAQ,eACX,QAAQ,OAAO,QAAQ,cAAc,KAAKA,iBAAe,IAAI,GAChE;GACJ;EAEL,KAAKT;AACD,WAAQ;AACR,WAAQ,IAAIA,YAAU;AAEtB,UAAO;IACH,MAAM;IACN,OAAO;IACV;EAEL,KAAK;AACD,WAAQ;AACR,UAAO,EACH,MAAM,SACT;EAEL,KAAKC,aACD,QAAO,gBAAgB,SAAS;GAC5B,MAAM;GACN,OAAO,QAAQ,YAAY;GAC9B,CAAC;EAEN,KAAKJ;EACL,KAAK;EACL,KAAKD;EACL,KAAK;EACL,KAAK,EACD,QAAO;GACH,MAAM;GACN,OAAO,QAAQ,YAAY;GAC9B;EAEL,KAAK;AACD,YAAO,QAAQ,cAAc;AAE7B,OAAI,QAAQ,eAAegB,OAAK,EAAE;AAC9B,YAAQ;AACR,WAAO;KACH,MAAM;KACN,MAAM,QAAQ,UAAU;KAC3B;;AAGL,UAAO,WAAW,QAAQ;EAE9B,KAAKR;EACL,KAAKC;EACL,KAAKG;EACL,KAAKT;EACL,KAAKD,kBAED;EAEJ,KAAK;AAGD,YAAO,QAAQ,cAAc;AAE7B,OAAIc,SAAO,MAAMA,SAAO,GACpB,QAAO,WAAW,QAAQ;AAG9B;EAEJ;AACI,OAAI,QAAQ,eAAeA,OAAK,CAC5B,QAAO,sBAAsB,QAAQ;AAGzC,UAAO,WAAW,QAAQ;;;AAItC,SAAgBC,SAAM,QAAQ;CAC1B,MAAM,UAAU,IAAI,QAAQ,OAAO;CACnC,MAAM,SAAS,kBAAkB,QAAQ;AAEzC,KAAI,QAAQ,QAAQ,OAAO,OACvB,SAAQ,MAAM,mBAAmB;AAIrC,KAAI,OAAO,MAAM,WAAW,KAAK,OAAO,MAAM,GAAG,SAAS,QACtD,QAAO,OAAO,MAAM;AAGxB,QAAO;;;;;ACtiBX,MAAM,OAAO,WAAW;AAExB,SAAS,eAAe,OAAO;AAC3B,QAAO,OAAO,UAAU,aAAa,QAAQ;;AAGjD,SAAgBC,OAAK,MAAM,SAAS,SAAS;CACzC,SAASA,OAAK,QAAM;AAChB,QAAM,KAAK,SAASC,OAAK;AAEzB,UAAQA,OAAK,MAAb;GACI,KAAK;AACD,WAAK,MAAM,QAAQD,OAAK;AACxB;GAEJ,KAAK;GACL,KAAK;AACD,WAAKC,OAAK,KAAK;AACf;GAEJ,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,QACD;GAEJ,QACI,OAAM,IAAI,MAAM,mBAAmBA,OAAK,KAAK;;AAGrD,QAAM,KAAK,SAASA,OAAK;;CAG7B,IAAI,QAAQ;CACZ,IAAI,QAAQ;AAEZ,KAAI,OAAO,YAAY,WACnB,SAAQ;UACD,SAAS;AAChB,UAAQ,eAAe,QAAQ,MAAM;AACrC,UAAQ,eAAe,QAAQ,MAAM;;AAGzC,KAAI,UAAU,QAAQ,UAAU,KAC5B,OAAM,IAAI,MAAM,8EAA+E;AAGnG,QAAK,MAAM,QAAQ;;;;;ACjDvB,MAAM,cAAc,EAChB,UAAU,UAAU;CAChB,MAAM,SAAS,EAAE;CACjB,IAAI,UAAU;AAEd,QAAO;EACH,GAAG;EACH,KAAK,MAAM;GACP,MAAM,MAAM;AACZ,aAAU;AACV,YAAS,KAAK,KAAK,MAAM,KAAK;AAC9B,aAAU;;EAEd,KAAK,OAAO,MAAM,MAAM;AACpB,UAAO,KAAK;IACR;IACA;IACA,MAAM,OAAO,OAAO;IACvB,CAAC;;EAEN,SAAS;AACL,UAAO;;EAEd;GAER;AAED,SAAS,eAAe,KAAK;CACzB,MAAM,SAAS,EAAE;AAEjB,YAAS,MAAM,MAAM,OAAO,QACxB,OAAO,KAAK;EACR;EACA,OAAO,IAAI,MAAM,OAAO,IAAI;EAC5B,MAAM;EACT,CAAC,CACL;AAED,QAAO;;AAGX,gCAAwB,OAAO,QAAQ;AACnC,KAAI,OAAO,UAAU,SACjB,QAAO,eAAe,MAAM;AAGhC,QAAO,OAAO,SAAS,OAAO,YAAY;;;;;AC9C9C,MAAa,QAAQ,EAAE,MAAM,SAAS;AACtC,MAAa,WAAW,EAAE,MAAM,YAAY;AAC5C,MAAa,iBAAiB,EAAE,MAAM,iBAAiB;AAEvD,MAAMC,oBAAkB;AACxB,MAAMC,qBAAmB;AAEzB,SAAS,gBAAgB,OAAO,YAAY,YAAY;AAEpD,KAAI,eAAe,SAAS,eAAe,SACvC,QAAO;AAGX,KAAI,UAAU,SAAS,eAAe,SAAS,eAAe,MAC1D,QAAO;AAGX,KAAI,MAAM,SAAS,QAAQ,MAAM,SAAS,YAAY,eAAe,OAAO;AACxE,eAAa,MAAM;AACnB,UAAQ,MAAM;;AAGlB,QAAO;EACH,MAAM;EACN;EACA,MAAM;EACN,MAAM;EACT;;AAGL,SAAS,eAAe,SAAM;AAC1B,QACIC,QAAK,SAAS,KACdA,QAAK,WAAWA,QAAK,SAAS,EAAE,KAAKF,qBACrCE,QAAK,WAAWA,QAAK,SAAS,EAAE,KAAKD;;AAI7C,SAAS,gBAAgB,MAAM;AAC3B,QACI,KAAK,SAAS,aACd,KAAK,SAAS,eACd,KAAK,SAAS,cACd,KAAK,SAAS,UAAU,eAAe,KAAK,KAAK;;AAIzD,SAAS,UAAU,OAAO,aAAa,KAAK,WAAW,OAAO;AAC1D,QAAO;EACH,MAAM;EACN;EACA;EACA,eAAe;EACf;EACH;;AAGL,SAAS,mBAAmB,MAAM,cAAc,0BAAU,IAAI,KAAK,EAAE;AACjE,KAAI,CAAC,QAAQ,IAAI,KAAK,EAAE;AACpB,UAAQ,IAAI,KAAK;AAEjB,UAAQ,KAAK,MAAb;GACI,KAAK;AACD,SAAK,QAAQ,mBAAmB,KAAK,OAAO,cAAc,QAAQ;AAClE,SAAK,OAAO,mBAAmB,KAAK,MAAM,cAAc,QAAQ;AAChE,SAAK,OAAO,mBAAmB,KAAK,MAAM,cAAc,QAAQ;AAChE;GAEJ,KAAK,OACD,QAAO,aAAa,KAAK,SAAS;;;AAI9C,QAAO;;AAGX,SAAS,qBAAqB,YAAY,OAAO,uBAAuB;AACpE,SAAQ,YAAR;EACI,KAAK,KAAK;GAYN,IAAI,SAAS;AAEb,QAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;IACxC,MAAM,OAAO,MAAM;AAEnB,aAAS,gBACL,MACA,QACA,SACH;;AAGL,UAAO;;EAGX,KAAK,KAAK;GAaN,IAAI,SAAS;GACb,IAAI,MAAM;AAEV,QAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;IACxC,IAAI,OAAO,MAAM;AAGjB,QAAI,gBAAgB,KAAK,EAAE;AACvB,SAAI,QAAQ,QAAQ,IAAI,KAAK,gBAAgB,MAAM,IAAI,GAAG,EAAE;AACxD,YAAM,OAAO,OAAO,KAAK;AACzB,eAAS,gBACL;OACI,MAAM;OACN;OACH,EACD,OACA,OACH;;AAGL,SAAI,QAAQ,MAAM;MACd,MAAM,OAAO,eAAe,KAAK,KAAK,GAAG,KAAK,KAAK,MAAM,GAAG,GAAG,GAAG,KAAK,MAAM,aAAa;AAC1F,UAAI,OAAO,QAAQ,OAAO;AACtB,WAAI,OAAO;AACX;;;;AAKZ,UAAM;AAGN,aAAS,gBACL,MACA,OACA,OACH;;AAGL,UAAO;;EAGX,KAAK,MAAM;AAMP,OAAI,MAAM,SAAS,EACf,QAAO;IACH,MAAM;IACN;IACA,KAAK;IACR;GA0BL,IAAI,SAAS;AAEb,QAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;IACxC,MAAM,OAAO,MAAM;IACnB,IAAI;AAEJ,QAAI,MAAM,SAAS,EACf,cAAa,qBACT,YACA,MAAM,OAAO,SAAS,cAAc;AAChC,YAAO,iBAAiB;MAC1B,EACF,MACH;QAED,cAAa;AAGjB,aAAS,gBACL,MACA,YACA,OACH;;AAGL,UAAO;;EAGX,KAAK,MAAM;AAMP,OAAI,MAAM,SAAS,EACf,QAAO;IACH,MAAM;IACN;IACA,KAAK;IACR;GA0BL,IAAI,SAAS,wBAAwB,QAAQ;AAE7C,QAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;IACxC,MAAM,OAAO,MAAM;IACnB,IAAI;AAEJ,QAAI,MAAM,SAAS,EACf,cAAa,qBACT,YACA,MAAM,OAAO,SAAS,cAAc;AAChC,YAAO,iBAAiB;MAC1B,EACF,KACH;QAED,cAAa;AAGjB,aAAS,gBACL,MACA,YACA,OACH;;AAGL,UAAO;;;;AAKnB,SAAS,0BAA0B,MAAM;CACrC,IAAI,SAAS;CACb,IAAI,YAAY,wBAAwB,KAAK,KAAK;AAElD,KAAI,KAAK,QAAQ,GAAG;AAEhB,cAAY,gBACR,WACA,gBACA,SACH;AAID,WAAS,gBACL,WACA,MACA,SACH;AAED,SAAO,OAAO,gBACV,OACA,OACA,OACH;AAED,MAAI,KAAK,MACL,QAAO,KAAK,OAAO,gBACf;GAAE,MAAM;GAAS,QAAQ;GAAM,EAC/B,QACA,SACH;OAIL,MAAK,IAAI,IAAI,KAAK,OAAO,GAAG,KAAK,KAAK,KAAK,KAAK;AAC5C,MAAI,KAAK,SAAS,WAAW,MACzB,UAAS,gBACL;GAAE,MAAM;GAAS,QAAQ;GAAM,EAC/B,QACA,SACH;AAGL,WAAS,gBACL,WACA,gBACI,OACA,OACA,OACH,EACD,SACH;;AAIT,KAAI,KAAK,QAAQ,EAEb,UAAS,gBACL,OACA,OACA,OACH;KAGD,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,GAAG,KAAK;AACnC,MAAI,KAAK,SAAS,WAAW,MACzB,UAAS,gBACL;GAAE,MAAM;GAAS,QAAQ;GAAM,EAC/B,QACA,SACH;AAGL,WAAS,gBACL,WACA,QACA,SACH;;AAIT,QAAO;;AAGX,SAAS,wBAAwB,MAAM;AACnC,KAAI,OAAO,SAAS,WAChB,QAAO;EACH,MAAM;EACN,IAAI;EACP;AAGL,SAAQ,KAAK,MAAb;EACI,KAAK,SAAS;GACV,IAAI,SAAS,qBACT,KAAK,YACL,KAAK,MAAM,IAAI,wBAAwB,EACvC,MACH;AAED,OAAI,KAAK,cACL,UAAS,gBACL,QACA,gBACA,SACH;AAGL,UAAO;;EAGX,KAAK,aACD,QAAO,0BAA0B,KAAK;EAG1C,KAAK,WAAW;GACZ,MAAM,OAAO,wBAAwB,KAAK,KAAK;GAE/C,MAAM,YAAY,wBAAwB,UAAU,CAChD,UAAU,CACN;IAAE,MAAM;IAAW,MAAM;IAAO,EAChC;IAAE,MAAM;IAAQ,MAAM;IAAkB,CAC3C,CAAC,EACF,UAAU,CACN;IAAE,MAAM;IAAQ,MAAM;IAAkB,EACxC,UAAU,CACN;IAAE,MAAM;IAAc,OAAO;IAAO,KAAK;IAAG,KAAK;IAAG,MAAM,UAAU,CAChE;KAAE,MAAM;KAAW,MAAM;KAAO,EAChC;KAAE,MAAM;KAAQ,MAAM;KAAkB,CAC3C,CAAC;IAAE,EACJ;IAAE,MAAM;IAAc,OAAO;IAAO,KAAK;IAAG,KAAK;IAAG,MAAM,UAAU,CAChE;KAAE,MAAM;KAAW,MAAM;KAAM,EAC/B;KAAE,MAAM;KAAQ,MAAM;KAAkB,CAC3C,CAAC;IAAE,CACP,EAAE,IAAI,CACV,CAAC,CACL,EAAE,IAAI,CAAC;GAER,MAAM,eAAe,wBACjB,UAAU;IACN;KAAE,MAAM;KAAQ,MAAM;KAAS;IAC/B,UAAU;KACN;MAAE,MAAM;MAAS,OAAO;MAAK;KAC7B;MAAE,MAAM;MAAQ,MAAM;MAAS;KAC/B;MAAE,MAAM;MAAS,OAAO;MAAK;KAChC,CAAC;IACF;KAAE,MAAM;KAAQ,MAAM;KAAoB;IAC7C,EAAE,IAAI,CACV;AAED,sBAAmB,cAAc;IAAE,SAAS;IAAM,SAAS;IAAW,CAAC;AACvE,sBAAmB,WAAW,EAAE,kBAAkB,cAAc,CAAC;AAEjE,UAAO;;EAGX,KAAK;EACL,KAAK,WACD,QAAO;GACH,MAAM,KAAK;GACX,MAAM,KAAK;GACX,QAAQ;GACX;EAEL,KAAK,UACD,QAAO;GACH,MAAM,KAAK;GACX,MAAM,KAAK,KAAK,aAAa;GAC7B,QAAQ;GACX;EAEL,KAAK,YACD,QAAO;GACH,MAAM,KAAK;GACX,MAAM,MAAM,KAAK,KAAK,aAAa;GACnC,QAAQ;GACX;EAEL,KAAK,WACD,QAAO;GACH,MAAM,KAAK;GACX,MAAM,KAAK,KAAK,aAAa,GAAG;GAChC,QAAQ;GACX;EAEL,KAAK;AAED,OAAI,KAAK,MAAM,WAAW,EACtB,QAAO;IACH,MAAM;IACN,OAAO,KAAK,MAAM,OAAO,EAAE;IAC3B,QAAQ;IACX;AAIL,UAAO;IACH,MAAM,KAAK;IACX,OAAO,KAAK,MAAM,OAAO,GAAG,KAAK,MAAM,SAAS,EAAE,CAAC,QAAQ,QAAQ,IAAK;IACxE,QAAQ;IACX;EAEL,KAAK,QACD,QAAO;GACH,MAAM,KAAK;GACX,OAAO,KAAK;GACZ,QAAQ;GACX;EAEL,KAAK,QACD,QAAO;GACH,MAAM,KAAK;GACX,QAAQ;GACX;EAEL,QACI,OAAM,IAAI,MAAM,sBAAsB,KAAK,KAAK;;;AAI5D,SAAgB,gBAAgB,YAAY,KAAK;AAC7C,KAAI,OAAO,eAAe,SACtB,cAAaE,SAAM,WAAW;AAGlC,QAAO;EACH,MAAM;EACN,OAAO,wBAAwB,WAAW;EAC1C,QAAQ,OAAO;EACf,QAAQ;EACX;;;;;AC1gBL,MAAM,EAAE,qCAAmB,OAAO;AAClC,MAAM,OAAO;AACb,MAAM,QAAQ;AACd,MAAM,cAAc;AACpB,MAAM,eAAe;AAErB,MAAM,oBAAoB;AAC1B,MAAM,uBAAuB;AAC7B,MAAM,8BAA8B;AAEpC,MAAM,kBAAkB;AACxB,IAAW,sBAAsB;AAEjC,SAAS,YAAY,MAAM;CACvB,IAAI,OAAO;CACX,IAAI,OAAO;CACX,IAAI,OAAO;AAEX,QAAO,SAAS,MAAM;AAClB,SAAO,KAAK;AACZ,OAAK,OAAO;AACZ,SAAO;AACP,SAAO;;AAGX,QAAO;;AAGX,SAAS,+BAA+B,SAAS,cAAc;AAC3D,KAAI,QAAQ,WAAW,aAAa,OAChC,QAAO;AAGX,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACrC,MAAM,gBAAgB,aAAa,WAAW,EAAE;EAChD,IAAI,WAAW,QAAQ,WAAW,EAAE;AAGpC,MAAI,YAAY,MAAU,YAAY,GAClC,YAAW,WAAW;AAG1B,MAAI,aAAa,cACb,QAAO;;AAIf,QAAO;;AAGX,SAAS,mBAAmB,OAAO;AAC/B,KAAI,MAAM,SAASC,MACf,QAAO;AAKX,QAAO,MAAM,UAAU;;AAG3B,SAAS,oBAAoB,OAAO;AAChC,KAAI,UAAU,KACV,QAAO;AAGX,QACI,MAAM,SAASC,SACf,MAAM,SAASC,YACf,MAAM,SAASC,mBACf,MAAM,SAASC,qBACf,MAAM,SAASC,oBACf,mBAAmB,MAAM;;AAIjC,SAAS,kBAAkB,OAAO;AAC9B,KAAI,UAAU,KACV,QAAO;AAGX,QACI,MAAM,SAASC,oBACf,MAAM,SAASC,sBACf,MAAM,SAASC,qBACd,MAAM,SAASR,SAAc,MAAM,UAAU;;AAItD,SAAS,cAAc,QAAQ,OAAO,UAAU;CAC5C,SAAS,kBAAkB;AACvB,KAAG;AACC;AACA,WAAQ,aAAa,OAAO,SAAS,OAAO,cAAc;WACrD,UAAU,SAAS,MAAM,SAASS,cAAmB,MAAM,SAASC;;CAGjF,SAAS,aAAa,QAAQ;EAC1B,MAAM,YAAY,aAAa;AAE/B,SAAO,YAAY,OAAO,SAAS,OAAO,aAAa;;CAG3D,SAAS,wBAAwB,WAAW,MAAM;AAC9C,SAAO;GACH;GACA;GACA;GACA;GACA;GACA;GACH;;CAGL,SAAS,cAAc,WAAW;AAC9B,cAAY;GACR;GACA;GACA;GACA,MAAM;GACT;;CAGL,SAAS,cAAc,WAAW;AAC9B,cAAY,wBAAwB,WAAW,UAAU;;CAG7D,SAAS,kBAAkB;AACvB,eAAa;GACT,MAAM;GACN,QAAQ,MAAM;GACd;GACA,MAAM;GACT;AAED,mBAAiB;AACjB,gBAAc;AAEd,MAAI,aAAa,aACb,gBAAe;;CAIvB,SAAS,aAAa;AAClB,gBAAc;GACV,QAAQ,MAAM;GACd,MAAM,MAAM,OAAO,QAAS,gBAAgB,QAAQ,YAAY,QAAS;GACzE,MAAM;GACT;AAED,eAAa;GACT,MAAM;GACN,QAAQ,MAAM;GACd,OAAO,WAAW;GAClB,MAAM;GACT;;CAGL,SAAS,cAAc;AACnB,MAAI,WAAW,SAAS,YACpB,cAAa,WAAW;MAExB,cAAa;GACT,MAAM;GACN,QAAQ,YAAY;GACpB,OAAO,WAAW;GAClB,MAAM;GACT;AAGL,gBAAc,YAAY;;CAG9B,IAAI,cAAc;CAClB,IAAI,YAAY;CAChB,IAAI,YAAY;CAKhB,IAAI,cAAc;CAElB,IAAI,iBAAiB;CACrB,IAAI,aAAa;CAEjB,IAAI,QAAQ;CACZ,IAAI,aAAa;CACjB,IAAI,eAAe;CACnB,IAAI,aAAa;EACb,MAAM;EACN,QAAQ;EACR,OAAO;EACP,MAAM;EACT;AAED,kBAAiB;AAEjB,QAAO,eAAe,QAAQ,EAAE,iBAAiB,gBAkB7C,SAAQ,MAAM,MAAd;EACI,KAAK;AACD,OAAI,cAAc,MAAM;AAEpB,QAAI,UAAU,MAEV;SAAI,eAAe,OAAO,SAAS,KAAM,MAAM,UAAU,SAAS,MAAM,UAAU,OAAQ;AACtF,cAAQ;AACR;;;AAKR,iBAAa;AACb;;AAIJ,WAAQ,UAAU;AAGlB,OAAI,UAAU,eACV,KAAI,UAAU,eAAe,YAAY;AACrC,YAAQ;AACR;SAEA,SAAQ;AAKhB,UAAO,UAAU,gBAAgB,YAC7B,cAAa;AAIjB,eAAY,UAAU;AACtB;EAEJ,KAAK;AAED,OAAI,gBAAgB,QAAQ,gBAAgB,OAExC;QAAI,cAAc,QAAQ,aAAa,UAAU,YAAY;AAEzD,iBAAY;AACZ,mBAAc;;cAEX,cAAc,MAAM;AAG3B,iBAAa;AACb;;AAIJ,WAAQ,UAAU;AAGlB,eAAY,UAAU;AACtB,iBAAc,UAAU;AACxB,gBAAa,UAAU;AACvB,gBAAa,UAAU;AACvB,WAAQ,aAAa,OAAO,SAAS,OAAO,cAAc;AAG1D,eAAY,UAAU;AACtB;EAEJ,KAAK;AACD,WAAQ,MAAM;AACd;EAEJ,KAAK;AAGD,OAAI,MAAM,SAAS,SACf,eAAc,MAAM,KAAK;AAG7B,OAAI,MAAM,SAAS,MACf,eAAc,MAAM,KAAK;AAG7B,WAAQ,MAAM;AACd;EAEJ,KAAK;AACD,WAAQ;IACJ,MAAM;IACN,QAAQ;IACR,OAAO;IACP,MAAM;IACT;AACD;EAEJ,KAAK,mBAAmB;GACpB,MAAM,QAAQ,MAAM,OAAO;AAE3B,OAAI,MAAM,UAAU,MAAM,QAAQ;AAE9B,QAAI,MAAM,SAAS,KAAK,MAAM,OAAO,KAAK;AACtC,aAAQ;AACR;;AAIJ,YAAQ;AACR;;AAIJ,OAAI,MAAM,UAAU,KAAK,MAAM,UAAU,GAAG;AACxC,YAAQ;AACR;;AAGJ,UAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM,SAAS;IAC9C,MAAM,YAAY,KAAK,MAAM;AAE7B,SAAK,MAAM,OAAO,eAAe,GAAG;AAGhC,mBAAc,MAAM;AACpB,mBAAc;MACV,MAAM;MACN,QAAQ,MAAM;MACd,MAAM,MAAM,OAAO;MACtB,CAAC;AAGF,aAAQ,MAAM,MAAM;AACpB;;;AAGR;;EAGJ,KAAK;AACD,WAAQ;IACJ,MAAM;IACN,QAAQ,MAAM;IACd,OAAO;IACP,MAAM,MAAM;IACf;AACD;EAEJ,KAAK;AACD,OAAI,UAAU,MAAM;IAChB,IAAIC,UAAO,MAAM,MAAM,aAAa;AAGpC,QAAIA,QAAK,QAAQ,KAAK,KAAK,GACvB,WAAOA,QAAK,QAAQ,aAAa,GAAG;AAGxC,QAAIC,iBAAe,KAAK,MAAM,KAAKD,QAAK,EAAE;AACtC,aAAQ,MAAM,IAAIA;AAClB;;;AAIR,WAAQ;AACR;EAEJ,KAAK,WAAW;GACZ,MAAM,OAAO,gBAAgB,OAAO,YAAY,OAAO;GACvD,MAAME,mBAAiB,aAAa,KAAK,MAAM,MAAM,GAAG,OAAO,cAAc,KAAK,CAAC;AAEnF,OAAI,CAAC,MAAMA,iBAAe,IAAIA,mBAAiB,YAAY;AACvD,WAAO,aAAaA,iBAChB,kBAAiB;AAGrB,YAAQ;SAER,SAAQ;AAGZ;;EAGJ,KAAK;EACL,KAAK,YAAY;GACb,MAAM,aAAa,MAAM,SAAS,SAAS,UAAU;GACrD,MAAM,aAAaD,iBAAe,KAAK,UAAU,WAAW,GAAG,SAAS,YAAY,MAAM,QAAQ;AAElG,OAAI,CAAC,cAAc,CAAC,WAAW,MAC3B,OAAM,IAAI,MACN,4BACC,MAAM,SAAS,SACV,MAAM,MAAM,OAAO,MACnB,OAAQ,MAAM,OAAO,MAC9B;AAIL,OAAI,gBAAgB,SAAS,UAAU,QAAQ,MAAM,SAAS,QAY1D;QAPK,MAAM,SAAS,kBAAkB,MAAM,SAASE,SAKhD,MAAM,SAAS,YAAY,MAAM,UAAU,KAEvB;AACrB,SAAI,gBAAgB,KAChB,eAAc,wBAAwB,OAAO,UAAU;AAG3D,aAAQ;AACR;;;AAIR,eAAY;AACZ,WAAQ,WAAW,YAAY,WAAW;AAC1C;;EAGJ,KAAK,WAAW;GACZ,MAAMH,UAAO,MAAM;AAEnB,OAAI,UAAU,MAAM;IAChB,IAAI,cAAc,MAAM;AAGxB,QAAI,YAAY,QAAQ,KAAK,KAAK,GAC9B,eAAc,YAAY,QAAQ,aAAa,GAAG;AAGtD,QAAI,+BAA+B,aAAaA,QAAK,EAAE;AACnD,sBAAiB;AACjB,aAAQ;AACR;;;AAIR,WAAQ;AACR;;EAGJ,KAAK;EACL,KAAK;AACD,OAAI,UAAU,QAAQ,+BAA+B,MAAM,OAAO,MAAM,KAAK,EAAE;AAC3E,qBAAiB;AACjB,YAAQ;AACR;;AAGJ,WAAQ;AACR;EAEJ,KAAK;AACD,OAAI,UAAU,QAAQ,MAAM,UAAU,MAAM,OAAO;AAC/C,qBAAiB;AACjB,YAAQ;AACR;;AAGJ,WAAQ;AACR;EAEJ,KAAK;AACD,OAAI,UAAU,QAAQ,MAAM,SAASV,MACjC,KAAI,oBAAoB,WAAW,MAAM,CACrC,SAAQ;QACL;AACH,qBAAiB;AACjB,YAAQ,kBAAkB,MAAM,GAAG,WAAW;;OAGlD,SAAQ,oBAAoB,WAAW,MAAM,IAAI,kBAAkB,MAAM,GAAG,QAAQ;AAGxF;EAEJ,KAAK;GACD,IAAI,SAAS;GACb,IAAI,iBAAiB;AAErB,UAAO,iBAAiB,OAAO,UAAU,OAAO,SAAS,MAAM,MAAM,QAAQ,iBACzE,WAAU,OAAO,gBAAgB;AAGrC,OAAI,+BAA+B,QAAQ,MAAM,MAAM,EAAE;AACrD,WAAO,aAAa,eAChB,kBAAiB;AAGrB,YAAQ;SAER,SAAQ;AAGZ;EAEJ,QACI,OAAM,IAAI,MAAM,wBAAwB,MAAM,KAAK;;AAI/D,wBAAuB;AAEvB,SAAQ,YAAR;EACI,KAAK;AACD,WAAQ,KAAK,iCAAiC,kBAAkB,cAAc;AAC9E,gBAAa;AACb,gBAAa;AACb;EAEJ,KAAK;AACD,UAAO,gBAAgB,KACnB,cAAa;AAEjB;EAEJ,QACI,cAAa;;AAGrB,QAAO;EACH;EACA,QAAQ;EACR,YAAY;EACZ,OAAO;EACP;EACH;;AAoCL,SAAgB,YAAY,QAAQ,YAAY,UAAU;CACtD,MAAM,cAAc,cAAc,QAAQ,YAAY,YAAY,EAAE,CAAC;AAErE,KAAI,YAAY,UAAU,KACtB,QAAO;CAGX,IAAI,OAAO,YAAY;CACvB,IAAI,OAAO,YAAY,QAAQ;EAC3B,QAAQ,WAAW,UAAU;EAC7B,OAAO,EAAE;EACZ;CACD,MAAM,YAAY,CAAC,KAAK;AAGxB,QAAO,YAAY,KAAK,CAAC;AAGzB,QAAO,SAAS,MAAM;AAClB,UAAQ,KAAK,MAAb;GACI,KAAK;AACD,SAAK,MAAM,KAAK,OAAO;KACnB,QAAQ,KAAK;KACb,OAAO,EAAE;KACZ,CAAC;AACF,cAAU,KAAK,KAAK;AACpB;GAEJ,KAAK;AACD,cAAU,KAAK;AACf,WAAO,UAAU,UAAU,SAAS;AACpC;GAEJ,QACI,MAAK,MAAM,KAAK;IACZ,QAAQ,KAAK,UAAU;IACvB,OAAO,KAAK,MAAM;IAClB,MAAM,KAAK,MAAM;IACpB,CAAC;;AAGV,SAAO,KAAK;;AAGhB,QAAO;;;;;;;;;;;ACpnBX,SAAgB,SAAS,MAAM;CAC3B,SAAS,iBAAiB,QAAQ;AAC9B,MAAI,WAAW,KACX,QAAO;AAGX,SACI,OAAO,SAAS,UAChB,OAAO,SAAS,cAChB,OAAO,SAAS;;CAIxB,SAAS,SAAS,WAAW;AACzB,MAAI,MAAM,QAAQ,UAAU,MAAM,EAE9B;QAAK,IAAI,IAAI,GAAG,IAAI,UAAU,MAAM,QAAQ,IACxC,KAAI,SAAS,UAAU,MAAM,GAAG,EAAE;AAC9B,QAAI,iBAAiB,UAAU,OAAO,CAClC,QAAO,QAAQ,UAAU,OAAO;AAGpC,WAAO;;aAGR,UAAU,SAAS,MAAM;AAChC,YAAS,iBAAiB,UAAU,OAAO,GACrC,CAAC,UAAU,OAAO,GAClB,EAAE;AAER,UAAO;;AAGX,SAAO;;CAGX,IAAI,SAAS;AAEb,KAAI,KAAK,YAAY,KACjB,UAAS,KAAK,QAAQ;AAG1B,QAAO;;AAGX,SAAgB,OAAO,MAAM,MAAM;AAC/B,QAAO,SAAS,MAAM,OAAM,UAAS,MAAM,SAAS,UAAU,MAAM,SAAS,KAAK;;AAGtF,SAAgB,WAAW,MAAM,YAAU;AACvC,QAAO,SAAS,MAAM,OAAM,UAAS,MAAM,SAAS,cAAc,MAAM,SAASc,WAAS;;AAG9F,SAAgB,UAAU,MAAM;AAC5B,QAAO,SAAS,MAAM,OAAM,UAAS,MAAM,SAAS,UAAU;;AAGlE,SAAS,SAAS,OAAO,MAAM,IAAI;CAC/B,MAAM,QAAQ,SAAS,KAAK,OAAO,KAAK;AAExC,KAAI,UAAU,KACV,QAAO;AAGX,QAAO,MAAM,KAAK,GAAG;;;;;AC9DzB,SAAS,kBAAkB,WAAW;AAClC,KAAI,UAAU,UACV,QAAO,UAAU;AAGrB,QAAO,kBAAkB,UAAU,MAAM,GAAG;;AAGhD,SAAS,iBAAiB,WAAW;AACjC,KAAI,UAAU,UACV,QAAO,UAAU;AAGrB,QAAO,iBAAiB,UAAU,MAAM,UAAU,MAAM,SAAS,GAAG;;AAGxE,SAAgB,eAAe,SAAO,KAAK,OAAO,MAAM,SAAM;CAC1D,SAAS,cAAc,WAAW;AAC9B,MAAI,UAAU,WAAW,QACrB,UAAU,OAAO,SAAS,QAC1B,UAAU,OAAO,SAASC,SAAM;GAChC,MAAM,QAAQ,kBAAkB,UAAU;GAC1C,MAAM,MAAM,iBAAiB,UAAU;AAEvC,WAAM,OAAO,KAAK,KAAK,SAAS,MAAM,MAAM,MAAM;AAC9C,QAAI,SAAS,OAAO;KAChB,MAAM,QAAQ,IAAI,MAAM;AAExB,QAAG;AACC,YAAM,WAAW,KAAK,KAAK;AAE3B,UAAI,KAAK,SAAS,IACd;AAGJ,aAAO,KAAK;cACP,SAAS;AAElB,eAAU,KAAK;MACX,QAAQ;MACR;MACH,CAAC;;KAER;;AAGN,MAAI,MAAM,QAAQ,UAAU,MAAM,CAC9B,WAAU,MAAM,QAAQ,cAAc;;CAI9C,MAAM,YAAY,EAAE;AAEpB,KAAI,MAAM,YAAY,KAClB,eAAc,MAAM,QAAQ;AAGhC,QAAO;;;;;ACzDX,MAAM,EAAE,qCAAmB,OAAO;AAElC,SAAS,cAAc,OAAO;AAE1B,QACI,OAAO,UAAU,YACjB,SAAS,MAAM,IACf,KAAK,MAAM,MAAM,KAAK,SACtB,SAAS;;AAIjB,SAAS,gBAAgB,KAAK;AAC1B,QACI,QAAQ,IAAI,IACZ,cAAc,IAAI,OAAO,IACzB,cAAc,IAAI,KAAK,IACvB,cAAc,IAAI,OAAO;;AAIjC,SAAS,2BAA2B,MAAM,QAAQ;AAC9C,QAAO,SAAS,UAAU,MAAM,MAAM;AAClC,MAAI,CAAC,QAAQ,KAAK,gBAAgB,OAC9B,QAAO,KAAK,MAAM,mCAAmC;AAGzD,OAAK,IAAI,OAAO,MAAM;GAClB,IAAI,QAAQ;AAEZ,OAAIC,iBAAe,KAAK,MAAM,IAAI,KAAK,MACnC;AAGJ,OAAI,QAAQ,QACR;QAAI,KAAK,SAAS,KACd,MAAK,MAAM,sBAAsB,KAAK,OAAO,kBAAkB,OAAO,IAAI;cAEvE,QAAQ,OAAO;AACtB,QAAI,KAAK,QAAQ,KACb;aACO,KAAK,OAAO,KAAK,IAAI,gBAAgB,OAC5C,KAAI,OAAO,KAAK,IAAI,WAAW,SAC3B,QAAO;aACA,CAAC,gBAAgB,KAAK,IAAI,MAAM,CACvC,QAAO;aACA,CAAC,gBAAgB,KAAK,IAAI,IAAI,CACrC,QAAO;QAEP;AAIR,YAAQ;cACD,OAAO,eAAe,IAAI,EAAE;AACnC,YAAQ;AAER,SAAK,IAAI,IAAI,GAAG,CAAC,SAAS,IAAI,OAAO,KAAK,QAAQ,KAAK;KACnD,MAAM,YAAY,OAAO,KAAK;AAE9B,aAAQ,WAAR;MACI,KAAK;AACD,eAAQ,OAAO,KAAK,SAAS;AAC7B;MAEJ,KAAK;AACD,eAAQ,OAAO,KAAK,SAAS;AAC7B;MAEJ,KAAK;AACD,eAAQ,KAAK,SAAS;AACtB;MAEJ,QACI,KAAI,OAAO,cAAc,SACrB,SAAQ,KAAK,QAAQ,KAAK,KAAK,SAAS;eACjC,MAAM,QAAQ,UAAU,CAC/B,SAAQ,KAAK,gBAAgB;;;SAK7C,MAAK,MAAM,oBAAoB,MAAM,WAAW,OAAO,aAAa;AAGxE,OAAI,CAAC,MACD,MAAK,MAAM,oBAAoB,OAAO,MAAM,MAAM,IAAI;;AAI9D,OAAK,MAAM,OAAO,OACd,KAAIA,iBAAe,KAAK,QAAQ,IAAI,IAChCA,iBAAe,KAAK,MAAM,IAAI,KAAK,MACnC,MAAK,MAAM,YAAY,OAAO,MAAM,MAAM,cAAc;;;AAMxE,SAAS,aAAa,YAAY,MAAM;CACpC,MAAM,YAAY,EAAE;AAEpB,MAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;EACxC,MAAM,YAAY,WAAW;AAC7B,MAAI,cAAc,UAAU,cAAc,QACtC,WAAU,KAAK,UAAU,KAAK,aAAa,CAAC;WACrC,cAAc,KACrB,WAAU,KAAK,OAAO;WACf,OAAO,cAAc,SAC5B,WAAU,KAAK,UAAU;WAClB,MAAM,QAAQ,UAAU,CAC/B,WAAU,KAAK,WAAW,aAAa,WAAW,KAAK,IAAI,SAAS,IAAI;MAExE,OAAM,IAAI,MAAM,kBAAkB,YAAY,WAAW,OAAO,yBAAyB;;AAIjG,QAAO,UAAU,KAAK,MAAM;;AAGhC,SAAS,iBAAiB,SAAM,UAAU;CACtC,MAAMC,eAAY,SAAS;CAC3B,MAAM,SAAS;EACX,MAAM;EACN,KAAK;EACR;CACD,MAAM,OAAO,EACT,MAAM,OAAMC,UAAO,MACtB;AAED,MAAK,MAAM,OAAOD,cAAW;AACzB,MAAID,iBAAe,KAAKC,cAAW,IAAI,KAAK,MACxC;AAOJ,OAAK,OAAO,aAJO,OAAO,OAAO,MAAM,QAAQA,aAAU,KAAK,GACxDA,aAAU,KAAK,OAAO,GACtB,CAACA,aAAU,KAAK,EAEeC,UAAO,MAAM,IAAI;;AAG1D,QAAO;EACH;EACA,OAAO,2BAA2BA,SAAM,OAAO;EAClD;;AAGL,SAAgB,uBAAuB,QAAQ;CAC3C,MAAMD,eAAY,EAAE;AAEpB,KAAI,OAAO,MACP;OAAK,MAAMC,WAAQ,OAAO,KACtB,KAAIF,iBAAe,KAAK,OAAO,MAAME,QAAK,EAAE;GACxC,MAAM,WAAW,OAAO,KAAKA;AAE7B,OAAI,SAAS,UACT,cAAUA,WAAQ,iBAAiBA,SAAM,SAAS;OAElD,OAAM,IAAI,MAAM,kCAAkCA,UAAO,yBAAyB;;;AAMlG,QAAOD;;;;;AC1JX,SAAS,cAAc,KAAK,SAAS,aAAa;CAC9C,MAAM,SAAS,EAAE;AAEjB,MAAK,MAAME,WAAQ,IACf,KAAI,IAAIA,SAAM,OACV,QAAOA,WAAQ,cACT,IAAIA,SAAM,SACVC,YAAS,IAAID,SAAM,QAAQ,EAAE,SAAS,CAAC;AAIrD,QAAO;;AAGX,SAAS,oBAAoB,KAAK,SAAS,aAAa;CACpD,MAAM,SAAS,EAAE;AAEjB,MAAK,MAAM,CAACA,SAAM,WAAW,OAAO,QAAQ,IAAI,CAC5C,QAAOA,WAAQ;EACX,SAAS,OAAO,YACZ,cACM,OAAO,QAAQ,SACfC,YAAS,OAAO,QAAQ,QAAQ,EAAE,SAAS,CAAC;EAEtD,aAAa,OAAO,eAAe,cAAc,OAAO,aAAa,SAAS,YAAY;EAC7F;AAGL,QAAO;;AAGX,SAAS,YAAY,QAAQ;AACzB,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,IAC/B,KAAI,OAAO,GAAG,MAAM,aAAa,KAAK,OAClC,QAAO;AAIf,QAAO;;AAGX,SAAS,iCAAiC,QAAQ;CAC9C,MAAM,aAAa,OAAO,MAAM;AAEhC,QACI,OAAO,aAAa,SACpB,OAAO,MAAM,WAAW,KACxB,WAAW,SAAS,gBACpB,WAAW,UAAU;;AAI7B,SAAS,iBAAiB,SAAS,OAAO,YAAY;AAClD,QAAO;EACH;EACA;EACA;EACA,GAAGC;EACN;;AAGL,SAAS,YAAY,SAAO,QAAQ,OAAO,oBAAoB;CAC3D,MAAM,SAASC,uBAAc,OAAOC,QAAM,OAAO;CACjD,IAAI;AAEJ,KAAI,YAAY,OAAO,CACnB,QAAO,iBAAiB,sBAAM,IAAI,MAAM,kDAAkD,CAAC;AAG/F,KAAI,mBACA,UAAS,YAAY,QAAQA,QAAM,uBAAuBA,QAAM;AAGpE,KAAI,CAAC,sBAAsB,CAAC,OAAO,OAAO;AACtC,WAAS,YAAY,QAAQ,OAAO,OAAOA,QAAM;AACjD,MAAI,CAAC,OAAO,MACR,QAAO,iBACH,MACA,IAAI,iBAAiB,OAAO,QAAQ,OAAO,QAAQ,OAAO,OAAO,EACjE,OAAO,WACV;;AAIT,QAAO,iBAAiB,OAAO,OAAO,MAAM,OAAO,WAAW;;AAGlE,IAAa,QAAb,MAAmB;CACf,YAAY,QAAQ,QAAQ,cAAW;AACnC,OAAK,kBAAkB;AACvB,OAAK,SAAS;AACd,OAAK,UAAU;AACf,OAAK,QAAQ,EAAE,GAAGC,eAAO;AACzB,OAAK,UAAU,OAAO,OAAO,KAAK;AAClC,OAAK,aAAa,OAAO,OAAO,KAAK;AACrC,OAAK,QAAQ,OAAO,OAAO,KAAK;AAChC,OAAK,YAAYC,gBAAa,uBAAuB,OAAO;AAE5D,MAAI,QAAQ;AACR,OAAI,OAAO,gBACP,MAAK,kBAAkB,OAAO;AAGlC,OAAI,OAAO,OACP;SAAK,MAAM,SAAS,OAAO,KAAKD,cAAM,CAClC,KAAI,MAAM,QAAQ,OAAO,MAAM,OAAO,CAClC,MAAK,MAAM,SAAS,OAAO,MAAM;;AAK7C,OAAI,OAAO,MACP,MAAK,MAAM,CAACL,SAAM,SAAS,OAAO,QAAQ,OAAO,MAAM,CACnD,MAAK,SAASA,SAAM,KAAK;AAIjC,OAAI,OAAO,SAAS;AAChB,SAAK,UAAU;AACf,SAAK,MAAM,CAACA,SAAM,UAAU,OAAO,QAAQ,mBAAmB,KAAK,MAAM,CAAC,CACtE,MAAK,SAASA,SAAM,MAAM;;AAIlC,OAAI,OAAO,QACP,MAAK,MAAM,CAACA,SAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,CACvD,MAAK,WAAWA,SAAM,OAAO;AAIrC,OAAI,OAAO,WACP,MAAK,MAAM,CAACA,SAAMO,eAAa,OAAO,QAAQ,OAAO,WAAW,CAC5D,MAAK,aAAaP,SAAMO,WAAS;;AAK7C,OAAK,wBAAwB,gBAAgB,KAAK,gBAAgB,KAAK,OAAO,CAAC;;CAGnF,eAAe,KAAK;EAChB,SAAS,eAAe,MAAM,SAAS;AACnC,SAAM,KAAK;IAAE;IAAM;IAAS,CAAC;;EAGjC,MAAMD,eAAY,KAAK;EACvB,MAAM,QAAQ,EAAE;AAEhB,OAAK,OAAO,KAAK,KAAK,SAAS,MAAM;AACjC,OAAIA,aAAU,eAAe,KAAK,KAAK,CACnC,cAAU,KAAK,MAAM,MAAM,MAAM,eAAe;OAEhD,gBAAe,MAAM,wBAAwB,KAAK,OAAO,IAAI;IAEnE;AAEF,SAAO,MAAM,SAAS,QAAQ;;CAGlC,iBAAiB,QAAQ,MAAM,SAAM,SAAS,MAAM;EAChD,MAAM,MAAM;GACR;GACA;GACH;EACD,MAAM,aAAa;GACf;GACA;GACA;GACA,cAAc,OAAO,WAAW,YAAa,UAAU,OAAO,OAAO,SAAS;GAC9E,QAAQ;GACR,OAAO;GACP,UAAU;GACb;AAED,MAAI,OAAO,WAAW,WAClB,YAAW,QAAQ,gBAAgB,QAAQ,IAAI;OAC5C;AACH,OAAI,OAAO,WAAW,SAElB,QAAO,eAAe,YAAY,UAAU,EACxC,MAAM;AACF,WAAO,eAAe,YAAY,UAAU,EACxC,OAAOE,SAAM,OAAO,EACvB,CAAC;AAEF,WAAO,WAAW;MAEzB,CAAC;OAEF,YAAW,SAAS;AAIxB,UAAO,eAAe,YAAY,SAAS,EACvC,MAAM;AACF,WAAO,eAAe,YAAY,SAAS,EACvC,OAAO,gBAAgB,WAAW,QAAQ,IAAI,EACjD,CAAC;AAEF,WAAO,WAAW;MAEzB,CAAC;AAEF,OAAI,SAAS,WACT,QAAO,eAAe,YAAY,YAAY,EAC1C,MAAM;IACF,MAAMC,WAAS,WAAW;IAC1B,MAAM,QAAQ,iCAAiCA,SAAO,GAChD,gBAAgB;KACd,GAAGA;KACH,OAAO,CAACA,SAAO,MAAM,GAAG,KAAK;KAChC,EAAE,IAAI,GACL;AAEN,WAAO,eAAe,YAAY,YAAY,EAC1C,OACH,CAAC;AAEF,WAAO;MAEd,CAAC;;AAIV,SAAO;;CAEX,WAAW,SAAM,QAAQ;AACrB,MAAI,CAAC,OACD;AAGJ,OAAK,QAAQT,WAAQ;GACjB,MAAM;GACN,MAAMA;GACN,SAAS,OAAO,UAAU,KAAK,iBAAiB,OAAO,SAAS,iBAAiBA,QAAK,GAAG;GACzF,aAAa,OAAO,cACd,OAAO,KAAK,OAAO,YAAY,CAAC,QAC7B,KAAK,aAAa;AACf,QAAI,YAAY,KAAK,iBAAiB,OAAO,YAAY,WAAW,oBAAoB,UAAUA,QAAK;AACvG,WAAO;MAEX,OAAO,OAAO,KAAK,CACtB,GACC;GACT;;CAEL,aAAa,SAAM,QAAQ;AACvB,MAAI,CAAC,OACD;AAGJ,OAAK,WAAWA,WAAQ,KAAK,iBAAiB,QAAQ,YAAYA,QAAK;;CAE3E,SAAS,SAAM,QAAQ;AACnB,MAAI,CAAC,OACD;AAGJ,OAAK,MAAMA,WAAQ,KAAK,iBAAiB,QAAQ,QAAQA,QAAK;;CAGlE,gBAAgB,YAAY;AACxB,MAAI,CAAC,KAAK,UAAU,WAAW,CAC3B,QAAO,IAAI,qBAAqB,mBAAmB,MAAM,WAAW;;CAG5E,mBAAmB,YAAY,SAAS;EACpC,MAAM,QAAQ,KAAK,gBAAgB,WAAW;AAE9C,MAAI,MACA,QAAO;EAGX,MAAM,SAAS,KAAK,UAAU,WAAW;AAEzC,MAAI,CAAC,OAAO,WAAW,QACnB,wBAAO,IAAI,YAAY,eAAe,aAAa,iCAAiC;AAGxF,MAAI,OAAO,WAAW,CAAC,SACnB;OAAI,CAAC,YAAY,MAAM,OAAO,SAAS,IAAI,MAAM,CAAC,QAC9C,wBAAO,IAAI,YAAY,eAAe,aAAa,6BAA6B;;;CAI5F,0BAA0B,YAAY,gBAAgB;EAClD,MAAM,QAAQ,KAAK,gBAAgB,WAAW;AAE9C,MAAI,MACA,QAAO;EAGX,MAAM,SAAS,KAAK,UAAU,WAAW;EACzC,MAAM,aAAaU,QAAc,eAAe;AAEhD,MAAI,CAAC,OAAO,YACR,wBAAO,IAAI,YAAY,eAAe,aAAa,6BAA6B;AAGpF,MAAI,CAAC,OAAO,YAAY,WAAW,SAC/B,CAAC,OAAO,YAAY,WAAW,UAC/B,QAAO,IAAI,qBAAqB,8BAA8B,eAAe;;CAGrF,kBAAkB,cAAc;AAC5B,MAAI,CAAC,KAAK,YAAY,aAAa,CAC/B,QAAO,IAAI,qBAAqB,oBAAoB,aAAa;;CAIzE,mBAAmB,YAAY,SAAS;EACpC,MAAM,QAAQ,KAAK,mBAAmB,YAAY,QAAQ;AAE1D,MAAI,MACA,QAAO,iBAAiB,MAAM,MAAM;EAGxC,MAAM,SAAS,KAAK,UAAU,WAAW;AAEzC,MAAI,CAAC,OAAO,QACR,QAAO,iBAAiB,MAAM,KAAK;AAGvC,SAAO,YAAY,MAAM,OAAO,SAAS,WAAW,IAAI,MAAM;;CAElE,sBAAsB,YAAY,gBAAgB,OAAO;EACrD,MAAM,QAAQ,KAAK,0BAA0B,YAAY,eAAe;AAExE,MAAI,MACA,QAAO,iBAAiB,MAAM,MAAM;EAGxC,MAAM,SAAS,KAAK,UAAU,WAAW;EACzC,MAAM,aAAaA,QAAc,eAAe;AAEhD,SAAO,YAAY,MAAM,OAAO,YAAY,WAAW,SAAS,OAAO,YAAY,WAAW,WAAW,OAAO,MAAM;;CAE1H,iBAAiB,MAAM;AACnB,MAAI,KAAK,SAAS,cACd,QAAO,iBAAiB,sBAAM,IAAI,MAAM,yBAAyB,CAAC;AAGtE,SAAO,KAAK,cAAc,KAAK,UAAU,KAAK,MAAM;;CAExD,cAAc,cAAc,OAAO;AAE/B,MAAIC,SAAe,aAAa,CAAC,OAC7B,QAAO,iBAAiB,sBAAM,IAAI,MAAM,0DAA2D,CAAC;EAGxG,MAAM,QAAQ,KAAK,kBAAkB,aAAa;AAElD,MAAI,MACA,QAAO,iBAAiB,MAAM,MAAM;AAGxC,SAAO,YAAY,MAAM,KAAK,YAAY,aAAa,EAAE,OAAO,KAAK;;CAEzE,UAAU,UAAU,OAAO;EACvB,MAAM,aAAa,KAAK,QAAQ,SAAS;AAEzC,MAAI,CAAC,WACD,QAAO,iBAAiB,MAAM,IAAI,qBAAqB,gBAAgB,SAAS,CAAC;AAGrF,SAAO,YAAY,MAAM,YAAY,OAAO,MAAM;;CAEtD,MAAM,QAAQ,OAAO;AACjB,MAAI,OAAO,WAAW,aAAa,CAAC,UAAU,CAAC,OAAO,MAClD,QAAO,iBAAiB,MAAM,IAAI,qBAAqB,aAAa,CAAC;AAGzE,MAAI,OAAO,WAAW,YAAY,CAAC,OAAO,MACtC,UAAS,KAAK,iBAAiB,QAAQ,QAAQ,YAAY;AAG/D,SAAO,YAAY,MAAM,QAAQ,OAAO,MAAM;;CAGlD,mBAAmB,cAAc,OAAO,MAAM,SAAM;AAChD,SAAO,eAAe,MAAM,OAAO,KAAK,cAAc,cAAc,MAAM,EAAE,MAAMX,QAAK;;CAE3F,8BAA8B,aAAa,MAAM,SAAM;AACnD,SAAO,eAAe,MAAM,YAAY,OAAO,KAAK,iBAAiB,YAAY,EAAE,MAAMA,QAAK;;CAElG,iBAAiB,KAAK,MAAM,SAAM;EAC9B,MAAM,SAAS,EAAE;AAEjB,OAAK,OAAO,KAAK,KAAK;GAClB,OAAO;GACP,QAAQ,gBAAgB;AACpB,WAAO,KAAK,MAAM,QAAQ,KAAK,8BAA8B,aAAa,MAAMA,QAAK,CAAC;;GAE7F,CAAC;AAEF,SAAO;;CAGX,UAAU,YAAY,mBAAmB,MAAM;EAC3C,MAAM,SAASU,QAAc,WAAW;AAKxC,UAJoB,OAAO,UAAU,mBAC/B,KAAK,QAAQ,OAAO,SAAS,KAAK,QAAQ,OAAO,YACjD,KAAK,QAAQ,OAAO,UAEJ;;CAE1B,iBAAiB,YAAY,mBAAmB,MAAM;EAClD,MAAM,SAAS,KAAK,UAAU,YAAY,iBAAiB;AAE3D,SAAO,UAAU,OAAO,WAAW;;CAEvC,oBAAoB,YAAY,SAAM;AAClC,SAAO,KAAK,QAAQ,eAAe,WAAW,IAAI,KAAK,QAAQ,cACzD,KAAK,QAAQ,YAAY,YAAYV,YAAS,OAC9C;;CAEV,YAAY,cAAc,mBAAmB,MAAM;EAC/C,MAAMO,aAAWI,SAAe,aAAa;AAK7C,UAJsBJ,WAAS,UAAU,mBACnC,KAAK,WAAWA,WAAS,SAAS,KAAK,WAAWA,WAAS,YAC3D,KAAK,WAAWA,WAAS,UAEP;;CAE5B,QAAQ,SAAM;AACV,SAAO,eAAe,KAAK,KAAK,OAAOP,QAAK,GAAG,KAAK,MAAMA,WAAQ;;CAGtE,WAAW;EACP,SAAS,UAAU,SAAM,UAAQ;AAC7B,UAAOY,WAAS,IAAIZ,QAAK,KAAK,KAAKA,QAAK;;EAG5C,SAAS,SAAS,QAAQ,SAAM,QAAQ,YAAY;AAChD,OAAI,OAAO,IAAIA,QAAK,CAChB,QAAO,OAAO,IAAIA,QAAK;AAG3B,UAAO,IAAIA,SAAM,MAAM;AACvB,OAAI,WAAW,WAAW,KACtB,QAAK,WAAW,QAAQ,SAAS,MAAM;AACnC,QAAI,KAAK,SAAS,UAAU,KAAK,SAAS,WACtC;IAGJ,MAAM,MAAM,KAAK,SAAS,SAAS,OAAO,QAAQ,OAAO;IACzD,MAAM,YAAY,KAAK,SAAS,SAAS,cAAc;AAEvD,QAAI,CAAC,eAAe,KAAK,KAAK,KAAK,KAAK,EAAE;AACtC,YAAO,KAAK,GAAG,UAAUA,SAAM,WAAW,YAAY,CAAC,iCAAiC,UAAU,KAAK,MAAM,KAAK,SAAS,OAAO,GAAG;AACrI,YAAO,IAAIA,SAAM,KAAK;eACf,SAAS,QAAQ,KAAK,MAAM,WAAW,IAAI,KAAK,MAAM,EAAE;AAC/D,YAAO,KAAK,GAAG,UAAUA,SAAM,WAAW,YAAY,CAAC,iCAAiC,UAAU,KAAK,MAAM,KAAK,SAAS,OAAO,GAAG;AACrI,YAAO,IAAIA,SAAM,KAAK;;MAE3B,KAAK;;EAIhB,MAAM,SAAS,EAAE;EACjB,IAAI,8BAAc,IAAI,KAAK;EAC3B,IAAI,mCAAmB,IAAI,KAAK;AAEhC,OAAK,MAAM,OAAO,KAAK,MACnB,UAAS,MAAM,KAAK,aAAa,KAAK,MAAM,KAAK;AAGrD,OAAK,MAAM,OAAO,KAAK,WACnB,UAAS,MAAM,KAAK,kBAAkB,KAAK,WAAW,KAAK;EAG/D,MAAM,mBAAmB,CAAC,GAAG,YAAY,MAAM,CAAC,CAAC,QAAO,YAAQ,YAAY,IAAIA,QAAK,CAAC;EACtF,MAAM,wBAAwB,CAAC,GAAG,iBAAiB,MAAM,CAAC,CAAC,QAAO,YAAQ,iBAAiB,IAAIA,QAAK,CAAC;AAErG,MAAI,iBAAiB,UAAU,sBAAsB,OACjD,QAAO;GACH;GACA,OAAO;GACP,YAAY;GACf;AAGL,SAAO;;CAEX,KAAK,aAAa,QAAQ;AACtB,SAAO;GACH,SAAS,KAAK;GACd,iBAAiB,KAAK;GACtB,OAAO,KAAK;GACZ,OAAO,cAAc,KAAK,OAAO,CAAC,QAAQ,YAAY;GACtD,YAAY,cAAc,KAAK,YAAY,CAAC,QAAQ,YAAY;GAChE,SAAS,oBAAoB,KAAK,SAAS,CAAC,QAAQ,YAAY;GACnE;;CAEL,WAAW;AACP,SAAO,KAAK,UAAU,KAAK,MAAM,CAAC;;;;;;AC5f1C,SAAS,YAAY,GAAG,GAAG;AACvB,KAAI,OAAO,MAAM,YAAY,SAAS,KAAK,EAAE,CACzC,QAAO,OAAO,MAAM,WACd,IAAI,IACJ,EAAE,QAAQ,aAAa,GAAG;AAGpC,QAAO,KAAK;;AAGhB,SAAS,WAAW,KAAK,OAAO;CAC5B,MAAM,SAAS,OAAO,OAAO,KAAK;AAElC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,CAC1C,KAAI,OAAO;AACP,SAAO,OAAO,EAAE;AAChB,OAAK,MAAM,QAAQ,OAAO,KAAK,MAAM,CACjC,KAAI,MAAM,SAAS,KAAK,CACpB,QAAO,KAAK,QAAQ,MAAM;;AAM1C,QAAO;;AAGX,SAAwB,IAAI,MAAM,KAAK;CACnC,MAAM,SAAS,EAAE,GAAG,MAAM;AAE1B,MAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,IAAI,CAC3C,SAAQ,MAAR;EACI,KAAK;AACD,UAAO,QAAQ,QAAQ,MAAM;AAC7B;EAEJ,KAAK;AACD,UAAO,QAAQ,KAAK,QACd,CAAC,GAAG,KAAK,OAAO,GAAG,MAAM,GACzB,SAAS,EAAE;AACjB;EAEJ,KAAK;AACD,UAAO,QAAQ,EAAE,GAAG,KAAK,OAAO;AAChC,QAAK,MAAM,CAACa,SAAMC,YAAU,OAAO,QAAQ,MAAM,CAC7C,QAAO,MAAMD,WAAQ,MAAM,QAAQC,QAAM,GAAGA,UAAQ,EAAE;AAE1D;EAEJ,KAAK;AACD,UAAO,QAAQ,EAAE,GAAG,KAAK,OAAO;AAEhC,QAAK,MAAM,CAACD,SAAM,WAAW,OAAO,QAAQ,MAAM,EAAE;IAChD,MAAM,SAAS,OAAO,MAAMA,YAAS,EAAE;IACvC,MAAM,UAAU,OAAO,MAAMA,WAAQ;KACjC,SAAS,OAAO,WAAW;KAC3B,aAAa,EACT,GAAG,OAAO,aACb;KACJ;AAED,QAAI,CAAC,OACD;AAGJ,YAAQ,UAAU,OAAO,UACnB,YAAY,QAAQ,SAAS,OAAO,QAAQ,GAC5C,QAAQ,WAAW;AAEzB,SAAK,MAAM,CAAC,gBAAgB,oBAAoB,OAAO,QAAQ,OAAO,eAAe,EAAE,CAAC,CACpF,SAAQ,YAAY,kBAAkB,kBAChC,YAAY,QAAQ,YAAY,iBAAiB,gBAAgB,GACjE;AAGV,QAAI,CAAC,OAAO,KAAK,QAAQ,YAAY,CAAC,OAClC,SAAQ,cAAc;;AAG9B;EAEJ,KAAK;EACL,KAAK;AACD,UAAO,QAAQ,EAAE,GAAG,KAAK,OAAO;AAChC,QAAK,MAAM,CAACA,SAAM,WAAW,OAAO,QAAQ,MAAM,CAC9C,QAAO,MAAMA,WAAQ,YAAY,OAAO,MAAMA,UAAO,OAAO;AAEhE;EAEJ,KAAK;EACL,KAAK;AACD,UAAO,QAAQ,EAAE,GAAG,KAAK,OAAO;AAChC,QAAK,MAAM,CAACA,SAAM,UAAU,OAAO,QAAQ,MAAM,CAC7C,QAAO,MAAMA,WAAQ;IAAE,GAAG,OAAO,MAAMA;IAAO,GAAG;IAAO;AAE5D;EAEJ,KAAK;AACD,UAAO,QAAQ;IACX,GAAG,KAAK;IACR,GAAG;IACN;AACD;EAEJ,KAAK;EACL,KAAK;AACD,UAAO,QAAQ;IACX,GAAG,KAAK;IACR,GAAG,WAAW,OAAO,CAAC,QAAQ,CAAC;IAClC;AACD;EAEJ,KAAK;AACD,UAAO,QAAQ;IACX,GAAG,KAAK;IACR,GAAG,WAAW,OAAO;KAAC;KAAQ;KAAa;KAAS;KAAY;KAAc,CAAC;IAClF;AACD;;AAIZ,QAAO;;;;;ACjHX,SAAS,aAAa,QAAQ;CAC1B,MAAME,WAAQ,aAAa,OAAO;CAClC,MAAMC,SAAO,aAAa,OAAO;CACjC,MAAMC,cAAW,gBAAgB,OAAO;CACxC,MAAM,EAAE,oCAAiB,mCAAkB,gBAAgBD,OAAK;CAEhE,MAAM,SAAS;EACX,OAAO;EACP,cAAa,aAAU,IAAI,MAAME,UAAQ,QAAQ,OAAO,MAAM,UAAU;EAExE;EACA;EACA;EAEA;EACA,MAAMF,OAAK;EACX,UAAUA,OAAK;EACf,SAASA,OAAK;EAEd;EACA;EAEA,KAAK,WAAW;GACZ,MAAM,OAAO,IAAI,EAAE,EAAE,OAAO;AAE5B,UAAO,aACH,OAAO,cAAc,aACf,UAAU,KAAK,GACf,IAAI,MAAM,UAAU,CAC7B;;EAER;AAED,QAAO,QAAQ,IAAI,MAAM;EACrB,SAAS,OAAO;EAChB,iBAAiB,OAAO;EACxB,OAAO,OAAO;EACd,OAAO,OAAO;EACd,SAAS,OAAO;EAChB,YAAY,OAAO;EACnB,MAAM,OAAO;EAChB,EAAE,OAAO;AAEV,QAAO;;AAGX,sBAAe,WAAU,aAAa,IAAI,EAAE,EAAE,OAAO,CAAC;;;;ACnDtD,MAAM,QAAQ;;EAEd,WAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACDf,MAAM,aAAa;CACnB,YAAM;EACN,UAAM;aAEA,eACD;;EAEL,WAAS;EACN;;EAEC,UAAU;EACV,cAAQ,uBAEP;EACD,UAAQ,sBAEP;EACD,eAAY;GACV,oBAAM;IACJ,UAAA;;IAEA,WAAO;IACP,eAAa;IACb,YAAI;IACJ,SAAC;IACL,UAAA;;GAEA,YAAa;IACjB,UAAA;;IAEQ,WAAC;IACL,eAAe;;IAEZ,SAAS;IACR,UAAQ;IACT;GACD,YAAY;IACV,UAAA;IACJ,SAAA;;IAEG,eAAQ;IACP,YAAW;IACX,SAAI;IACJ,UAAQ;IACT;GACD,OAAO;IACL,UAAU;IACV,SAAM;IACN,WAAQ;IACR,eAAI;IACJ,YAAO;IACP,SAAQ;IACR,UAAQ;IACT;GACD,UAAE;IACJ,UAAA;;IAEA,WAAa;IACjB,eAAA;;IAEQ,SAAC;IACL,UAAc;;GAEd,SAAW;IACP,UAAU;IACV,SAAQ;IACR,WAAW;IACf,eAAA;;IAEA,SAAa;IACjB,UAAA;;GAEA,YAAS;IACL,UAAc;;IAEX,WAAS;IACR,eAAc;IACd,YAAI;IACJ,SAAI;IACJ,UAAA;;GAEF,UAAQ;;IAEN,SAAO;IACP,WAAW;IACX,eAAU;IACV,YAAU;IACV,SAAI;IACJ,UAAQ;IACT;GACD,WAAM;IACJ,UAAC;IACL,SAAA;;IAEG,eAAQ;IACP,YAAY;IACZ,SAAI;IACJ,UAAU;IACX;GACD,UAAU;IACR,UAAU;IACV,SAAS;IACT,WAAK;IACL,eAAA;IACJ,YAAA;;IAEA,UAAa;IACjB;;EAEA,UAAc;EACV,WAAO;EACR;CACD,aAAa;EACd,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5GD,MAAMG,aAAW;AACjB,M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"}