{"version":3,"sources":["jsdelivr-header.js","/npm/@emmetio/codemirror-plugin@1.2.4/node_modules/@emmetio/scanner/scanner.es.js","/npm/@emmetio/codemirror-plugin@1.2.4/node_modules/@emmetio/abbreviation/dist/abbreviation.es.js","/npm/@emmetio/codemirror-plugin@1.2.4/node_modules/@emmetio/css-abbreviation/dist/css-abbreviation.es.js","/npm/@emmetio/codemirror-plugin@1.2.4/src/lib/config.ts","/npm/@emmetio/action-utils/node_modules/@emmetio/scanner/scanner.es.js","/npm/@emmetio/action-utils/node_modules/@emmetio/html-matcher/dist/html-matcher.es.js","/npm/@emmetio/action-utils/node_modules/@emmetio/css-matcher/dist/css-matcher.es.js","/npm/@emmetio/action-utils/node_modules/@emmetio/abbreviation/dist/abbreviation.es.js","/npm/@emmetio/action-utils/node_modules/@emmetio/css-abbreviation/dist/css-abbreviation.es.js","/npm/@emmetio/action-utils/node_modules/emmet/dist/emmet.es.js","/npm/@emmetio/action-utils/dist/action-utils.es.js","/npm/@emmetio/codemirror-plugin@1.2.4/src/lib/utils.ts","/npm/@emmetio/codemirror-plugin@1.2.4/node_modules/@emmetio/html-matcher/dist/html-matcher.es.js","/npm/@emmetio/codemirror-plugin@1.2.4/src/lib/syntax.ts","/npm/@emmetio/codemirror-plugin@1.2.4/node_modules/emmet/dist/emmet.es.js","/npm/@emmetio/codemirror-plugin@1.2.4/node_modules/@emmetio/css-matcher/dist/css-matcher.es.js","/npm/@emmetio/codemirror-plugin@1.2.4/node_modules/@emmetio/math-expression/dist/math.es.js","/npm/@emmetio/codemirror-plugin@1.2.4/src/lib/output.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/lib/emmet.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/abbreviation.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/lib/match-tags.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/mode/utils.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/mode/markup.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/mode/stylesheet.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/mode/snippet.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/commands/expand-abbreviation.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/commands/reset-abbreviation.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/commands/capture-abbreviation.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/commands/enter-abbreviation.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/commands/insert-line-break.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/commands/wrap-with-abbreviation.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/commands/balance.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/commands/comment.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/commands/evaluate-math.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/commands/go-to-edit-point.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/commands/go-to-tag-pair.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/commands/inc-dec-number.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/commands/remove-tag.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/commands/select-item.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/commands/split-join-tag.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/extension.ts","/npm/@emmetio/codemirror-plugin@1.2.4/src/browser.ts"],"names":[],"mappings":"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","file":"/npm/@emmetio/codemirror-plugin@1.2.4/dist/browser.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@emmetio/codemirror-plugin@1.2.4/dist/browser.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","const defaultQuotedOptions = {\n    escape: 92,\n    throws: false\n};\n/**\n * Check if given code is a number\n */\nfunction isNumber(code) {\n    return code > 47 && code < 58;\n}\n/**\n * Check if given character code is alpha code (letter through A to Z)\n */\nfunction isAlpha(code, from, to) {\n    from = from || 65; // A\n    to = to || 90; // Z\n    code &= ~32; // quick hack to convert any char code to uppercase char code\n    return code >= from && code <= to;\n}\n/**\n * Check if given character code is alpha-numeric (letter through A to Z or number)\n */\nfunction isAlphaNumeric(code) {\n    return isNumber(code) || isAlpha(code);\n}\nfunction isAlphaNumericWord(code) {\n    return isNumber(code) || isAlphaWord(code);\n}\nfunction isAlphaWord(code) {\n    return code === 95 /* _ */ || isAlpha(code);\n}\n/**\n * Check if given character code is a white-space character: a space character\n * or line breaks\n */\nfunction isWhiteSpace(code) {\n    return code === 32 /* space */\n        || code === 9 /* tab */\n        || code === 160; /* non-breaking space */\n}\n/**\n * Check if given character code is a space character\n */\nfunction isSpace(code) {\n    return isWhiteSpace(code)\n        || code === 10 /* LF */\n        || code === 13; /* CR */\n}\n/**\n * Consumes 'single' or \"double\"-quoted string from given string, if possible\n * @return `true` if quoted string was consumed. The contents of quoted string\n * will be available as `stream.current()`\n */\nfunction eatQuoted(stream, options) {\n    options = Object.assign(Object.assign({}, defaultQuotedOptions), options);\n    const start = stream.pos;\n    const quote = stream.peek();\n    if (stream.eat(isQuote)) {\n        while (!stream.eof()) {\n            switch (stream.next()) {\n                case quote:\n                    stream.start = start;\n                    return true;\n                case options.escape:\n                    stream.next();\n                    break;\n            }\n        }\n        // If we’re here then stream wasn’t properly consumed.\n        // Revert stream and decide what to do\n        stream.pos = start;\n        if (options.throws) {\n            throw stream.error('Unable to consume quoted string');\n        }\n    }\n    return false;\n}\n/**\n * Check if given character code is a quote character\n */\nfunction isQuote(code) {\n    return code === 39 /* ' */ || code === 34 /* \" */;\n}\n/**\n * Eats paired characters substring, for example `(foo)` or `[bar]`\n * @param open Character code of pair opening\n * @param close Character code of pair closing\n * @return Returns `true` if character pair was successfully consumed, it’s\n * content will be available as `stream.current()`\n */\nfunction eatPair(stream, open, close, options) {\n    options = Object.assign(Object.assign({}, defaultQuotedOptions), options);\n    const start = stream.pos;\n    if (stream.eat(open)) {\n        let stack = 1;\n        let ch;\n        while (!stream.eof()) {\n            if (eatQuoted(stream, options)) {\n                continue;\n            }\n            ch = stream.next();\n            if (ch === open) {\n                stack++;\n            }\n            else if (ch === close) {\n                stack--;\n                if (!stack) {\n                    stream.start = start;\n                    return true;\n                }\n            }\n            else if (ch === options.escape) {\n                stream.next();\n            }\n        }\n        // If we’re here then paired character can’t be consumed\n        stream.pos = start;\n        if (options.throws) {\n            throw stream.error(`Unable to find matching pair for ${String.fromCharCode(open)}`);\n        }\n    }\n    return false;\n}\n\n/**\n * A streaming, character code-based string reader\n */\nclass Scanner {\n    constructor(str, start, end) {\n        if (end == null && typeof str === 'string') {\n            end = str.length;\n        }\n        this.string = str;\n        this.pos = this.start = start || 0;\n        this.end = end || 0;\n    }\n    /**\n     * Returns true only if the stream is at the end of the file.\n     */\n    eof() {\n        return this.pos >= this.end;\n    }\n    /**\n     * Creates a new stream instance which is limited to given `start` and `end`\n     * range. E.g. its `eof()` method will look at `end` property, not actual\n     * stream end\n     */\n    limit(start, end) {\n        return new Scanner(this.string, start, end);\n    }\n    /**\n     * Returns the next character code in the stream without advancing it.\n     * Will return NaN at the end of the file.\n     */\n    peek() {\n        return this.string.charCodeAt(this.pos);\n    }\n    /**\n     * Returns the next character in the stream and advances it.\n     * Also returns <code>undefined</code> when no more characters are available.\n     */\n    next() {\n        if (this.pos < this.string.length) {\n            return this.string.charCodeAt(this.pos++);\n        }\n    }\n    /**\n     * `match` can be a character code or a function that takes a character code\n     * and returns a boolean. If the next character in the stream 'matches'\n     * the given argument, it is consumed and returned.\n     * Otherwise, `false` is returned.\n     */\n    eat(match) {\n        const ch = this.peek();\n        const ok = typeof match === 'function' ? match(ch) : ch === match;\n        if (ok) {\n            this.next();\n        }\n        return ok;\n    }\n    /**\n     * Repeatedly calls <code>eat</code> with the given argument, until it\n     * fails. Returns <code>true</code> if any characters were eaten.\n     */\n    eatWhile(match) {\n        const start = this.pos;\n        while (!this.eof() && this.eat(match)) { /* */ }\n        return this.pos !== start;\n    }\n    /**\n     * Backs up the stream n characters. Backing it up further than the\n     * start of the current token will cause things to break, so be careful.\n     */\n    backUp(n) {\n        this.pos -= (n || 1);\n    }\n    /**\n     * Get the string between the start of the current token and the\n     * current stream position.\n     */\n    current() {\n        return this.substring(this.start, this.pos);\n    }\n    /**\n     * Returns substring for given range\n     */\n    substring(start, end) {\n        return this.string.slice(start, end);\n    }\n    /**\n     * Creates error object with current stream state\n     */\n    error(message, pos = this.pos) {\n        return new ScannerError(`${message} at ${pos + 1}`, pos, this.string);\n    }\n}\nclass ScannerError extends Error {\n    constructor(message, pos, str) {\n        super(message);\n        this.pos = pos;\n        this.string = str;\n    }\n}\n\nexport default Scanner;\nexport { ScannerError, eatPair, eatQuoted, isAlpha, isAlphaNumeric, isAlphaNumericWord, isAlphaWord, isNumber, isQuote, isSpace, isWhiteSpace };\n//# sourceMappingURL=scanner.es.js.map\n","import Scanner, { isAlphaNumericWord, isSpace, isQuote as isQuote$1, isNumber, isAlpha, ScannerError } from '@emmetio/scanner';\n\nfunction tokenScanner(tokens) {\n    return {\n        tokens,\n        start: 0,\n        pos: 0,\n        size: tokens.length\n    };\n}\nfunction peek(scanner) {\n    return scanner.tokens[scanner.pos];\n}\nfunction next(scanner) {\n    return scanner.tokens[scanner.pos++];\n}\nfunction slice(scanner, from = scanner.start, to = scanner.pos) {\n    return scanner.tokens.slice(from, to);\n}\nfunction readable(scanner) {\n    return scanner.pos < scanner.size;\n}\nfunction consume(scanner, test) {\n    const token = peek(scanner);\n    if (token && test(token)) {\n        scanner.pos++;\n        return true;\n    }\n    return false;\n}\nfunction error(scanner, message, token = peek(scanner)) {\n    if (token && token.start != null) {\n        message += ` at ${token.start}`;\n    }\n    const err = new Error(message);\n    err['pos'] = token && token.start;\n    return err;\n}\n\nfunction abbreviation(abbr, options = {}) {\n    const scanner = tokenScanner(abbr);\n    const result = statements(scanner, options);\n    if (readable(scanner)) {\n        throw error(scanner, 'Unexpected character');\n    }\n    return result;\n}\nfunction statements(scanner, options) {\n    const result = {\n        type: 'TokenGroup',\n        elements: []\n    };\n    let ctx = result;\n    let node;\n    const stack = [];\n    while (readable(scanner)) {\n        if (node = element(scanner, options) || group(scanner, options)) {\n            ctx.elements.push(node);\n            if (consume(scanner, isChildOperator)) {\n                stack.push(ctx);\n                ctx = node;\n            }\n            else if (consume(scanner, isSiblingOperator)) {\n                continue;\n            }\n            else if (consume(scanner, isClimbOperator)) {\n                do {\n                    if (stack.length) {\n                        ctx = stack.pop();\n                    }\n                } while (consume(scanner, isClimbOperator));\n            }\n        }\n        else {\n            break;\n        }\n    }\n    return result;\n}\n/**\n * Consumes group from given scanner\n */\nfunction group(scanner, options) {\n    if (consume(scanner, isGroupStart)) {\n        const result = statements(scanner, options);\n        const token = next(scanner);\n        if (isBracket(token, 'group', false)) {\n            result.repeat = repeater(scanner);\n        }\n        return result;\n    }\n}\n/**\n * Consumes single element from given scanner\n */\nfunction element(scanner, options) {\n    let attr;\n    const elem = {\n        type: 'TokenElement',\n        name: void 0,\n        attributes: void 0,\n        value: void 0,\n        repeat: void 0,\n        selfClose: false,\n        elements: []\n    };\n    if (elementName(scanner, options)) {\n        elem.name = slice(scanner);\n    }\n    while (readable(scanner)) {\n        scanner.start = scanner.pos;\n        if (!elem.repeat && !isEmpty(elem) && consume(scanner, isRepeater)) {\n            elem.repeat = scanner.tokens[scanner.pos - 1];\n        }\n        else if (!elem.value && text(scanner)) {\n            elem.value = getText(scanner);\n        }\n        else if (attr = shortAttribute(scanner, 'id', options) || shortAttribute(scanner, 'class', options) || attributeSet(scanner)) {\n            if (!elem.attributes) {\n                elem.attributes = Array.isArray(attr) ? attr.slice() : [attr];\n            }\n            else {\n                elem.attributes = elem.attributes.concat(attr);\n            }\n        }\n        else {\n            if (!isEmpty(elem) && consume(scanner, isCloseOperator)) {\n                elem.selfClose = true;\n                if (!elem.repeat && consume(scanner, isRepeater)) {\n                    elem.repeat = scanner.tokens[scanner.pos - 1];\n                }\n            }\n            break;\n        }\n    }\n    return !isEmpty(elem) ? elem : void 0;\n}\n/**\n * Consumes attribute set from given scanner\n */\nfunction attributeSet(scanner) {\n    if (consume(scanner, isAttributeSetStart)) {\n        const attributes = [];\n        let attr;\n        while (readable(scanner)) {\n            if (attr = attribute(scanner)) {\n                attributes.push(attr);\n            }\n            else if (consume(scanner, isAttributeSetEnd)) {\n                break;\n            }\n            else if (!consume(scanner, isWhiteSpace)) {\n                throw error(scanner, `Unexpected \"${peek(scanner).type}\" token`);\n            }\n        }\n        return attributes;\n    }\n}\n/**\n * Consumes attribute shorthand (class or id) from given scanner\n */\nfunction shortAttribute(scanner, type, options) {\n    if (isOperator(peek(scanner), type)) {\n        scanner.pos++;\n        const attr = {\n            name: [createLiteral(type)]\n        };\n        // Consume expression after shorthand start for React-like components\n        if (options.jsx && text(scanner)) {\n            attr.value = getText(scanner);\n            attr.expression = true;\n        }\n        else {\n            attr.value = literal(scanner) ? slice(scanner) : void 0;\n        }\n        return attr;\n    }\n}\n/**\n * Consumes single attribute from given scanner\n */\nfunction attribute(scanner) {\n    if (quoted(scanner)) {\n        // Consumed quoted value: it’s a value for default attribute\n        return {\n            value: slice(scanner)\n        };\n    }\n    if (literal(scanner, true)) {\n        return {\n            name: slice(scanner),\n            value: consume(scanner, isEquals) && (quoted(scanner) || literal(scanner, true))\n                ? slice(scanner)\n                : void 0\n        };\n    }\n}\nfunction repeater(scanner) {\n    return isRepeater(peek(scanner))\n        ? scanner.tokens[scanner.pos++]\n        : void 0;\n}\n/**\n * Consumes quoted value from given scanner, if possible\n */\nfunction quoted(scanner) {\n    const start = scanner.pos;\n    const quote = peek(scanner);\n    if (isQuote(quote)) {\n        scanner.pos++;\n        while (readable(scanner)) {\n            if (isQuote(next(scanner), quote.single)) {\n                scanner.start = start;\n                return true;\n            }\n        }\n        throw error(scanner, 'Unclosed quote', quote);\n    }\n    return false;\n}\n/**\n * Consumes literal (unquoted value) from given scanner\n */\nfunction literal(scanner, allowBrackets) {\n    const start = scanner.pos;\n    const brackets = {\n        attribute: 0,\n        expression: 0,\n        group: 0\n    };\n    while (readable(scanner)) {\n        const token = peek(scanner);\n        if (brackets.expression) {\n            // If we’re inside expression, we should consume all content in it\n            if (isBracket(token, 'expression')) {\n                brackets[token.context] += token.open ? 1 : -1;\n            }\n        }\n        else if (isQuote(token) || isOperator(token) || isWhiteSpace(token) || isRepeater(token)) {\n            break;\n        }\n        else if (isBracket(token)) {\n            if (!allowBrackets) {\n                break;\n            }\n            if (token.open) {\n                brackets[token.context]++;\n            }\n            else if (!brackets[token.context]) {\n                // Stop if found unmatched closing brace: it must be handled\n                // by parent consumer\n                break;\n            }\n            else {\n                brackets[token.context]--;\n            }\n        }\n        scanner.pos++;\n    }\n    if (start !== scanner.pos) {\n        scanner.start = start;\n        return true;\n    }\n    return false;\n}\n/**\n * Consumes element name from given scanner\n */\nfunction elementName(scanner, options) {\n    const start = scanner.pos;\n    if (options.jsx && consume(scanner, isCapitalizedLiteral)) {\n        // Check for edge case: consume immediate capitalized class names\n        // for React-like components, e.g. `Foo.Bar.Baz`\n        while (readable(scanner)) {\n            const { pos } = scanner;\n            if (!consume(scanner, isClassNameOperator) || !consume(scanner, isCapitalizedLiteral)) {\n                scanner.pos = pos;\n                break;\n            }\n        }\n    }\n    while (readable(scanner) && consume(scanner, isElementName)) {\n        // empty\n    }\n    if (scanner.pos !== start) {\n        scanner.start = start;\n        return true;\n    }\n    return false;\n}\n/**\n * Consumes text value from given scanner\n */\nfunction text(scanner) {\n    const start = scanner.pos;\n    if (consume(scanner, isTextStart)) {\n        let brackets = 0;\n        while (readable(scanner)) {\n            const token = next(scanner);\n            if (isBracket(token, 'expression')) {\n                if (token.open) {\n                    brackets++;\n                }\n                else if (!brackets) {\n                    break;\n                }\n                else {\n                    brackets--;\n                }\n            }\n        }\n        scanner.start = start;\n        return true;\n    }\n    return false;\n}\nfunction getText(scanner) {\n    let from = scanner.start;\n    let to = scanner.pos;\n    if (isBracket(scanner.tokens[from], 'expression', true)) {\n        from++;\n    }\n    if (isBracket(scanner.tokens[to - 1], 'expression', false)) {\n        to--;\n    }\n    return slice(scanner, from, to);\n}\nfunction isBracket(token, context, isOpen) {\n    return Boolean(token && token.type === 'Bracket'\n        && (!context || token.context === context)\n        && (isOpen == null || token.open === isOpen));\n}\nfunction isOperator(token, type) {\n    return Boolean(token && token.type === 'Operator' && (!type || token.operator === type));\n}\nfunction isQuote(token, isSingle) {\n    return Boolean(token && token.type === 'Quote' && (isSingle == null || token.single === isSingle));\n}\nfunction isWhiteSpace(token) {\n    return Boolean(token && token.type === 'WhiteSpace');\n}\nfunction isEquals(token) {\n    return isOperator(token, 'equal');\n}\nfunction isRepeater(token) {\n    return Boolean(token && token.type === 'Repeater');\n}\nfunction isLiteral(token) {\n    return token.type === 'Literal';\n}\nfunction isCapitalizedLiteral(token) {\n    if (isLiteral(token)) {\n        const ch = token.value.charCodeAt(0);\n        return ch >= 65 && ch <= 90;\n    }\n    return false;\n}\nfunction isElementName(token) {\n    return token.type === 'Literal' || token.type === 'RepeaterNumber' || token.type === 'RepeaterPlaceholder';\n}\nfunction isClassNameOperator(token) {\n    return isOperator(token, 'class');\n}\nfunction isAttributeSetStart(token) {\n    return isBracket(token, 'attribute', true);\n}\nfunction isAttributeSetEnd(token) {\n    return isBracket(token, 'attribute', false);\n}\nfunction isTextStart(token) {\n    return isBracket(token, 'expression', true);\n}\nfunction isGroupStart(token) {\n    return isBracket(token, 'group', true);\n}\nfunction createLiteral(value) {\n    return { type: 'Literal', value };\n}\nfunction isEmpty(elem) {\n    return !elem.name && !elem.value && !elem.attributes;\n}\nfunction isChildOperator(token) {\n    return isOperator(token, 'child');\n}\nfunction isSiblingOperator(token) {\n    return isOperator(token, 'sibling');\n}\nfunction isClimbOperator(token) {\n    return isOperator(token, 'climb');\n}\nfunction isCloseOperator(token) {\n    return isOperator(token, 'close');\n}\n\n/**\n * If consumes escape character, sets current stream range to escaped value\n */\nfunction escaped(scanner) {\n    if (scanner.eat(92 /* Escape */)) {\n        scanner.start = scanner.pos;\n        if (!scanner.eof()) {\n            scanner.pos++;\n        }\n        return true;\n    }\n    return false;\n}\n\nfunction tokenize(source) {\n    const scanner = new Scanner(source);\n    const result = [];\n    const ctx = {\n        group: 0,\n        attribute: 0,\n        expression: 0,\n        quote: 0\n    };\n    let ch = 0;\n    let token;\n    while (!scanner.eof()) {\n        ch = scanner.peek();\n        token = getToken(scanner, ctx);\n        if (token) {\n            result.push(token);\n            if (token.type === 'Quote') {\n                ctx.quote = ch === ctx.quote ? 0 : ch;\n            }\n            else if (token.type === 'Bracket') {\n                ctx[token.context] += token.open ? 1 : -1;\n            }\n        }\n        else {\n            throw scanner.error('Unexpected character');\n        }\n    }\n    return result;\n}\n/**\n * Returns next token from given scanner, if possible\n */\nfunction getToken(scanner, ctx) {\n    return field(scanner, ctx)\n        || repeaterPlaceholder(scanner)\n        || repeaterNumber(scanner)\n        || repeater$1(scanner)\n        || whiteSpace(scanner)\n        || literal$1(scanner, ctx)\n        || operator(scanner)\n        || quote(scanner)\n        || bracket(scanner);\n}\n/**\n * Consumes literal from given scanner\n */\nfunction literal$1(scanner, ctx) {\n    const start = scanner.pos;\n    let value = '';\n    while (!scanner.eof()) {\n        // Consume escaped sequence no matter of context\n        if (escaped(scanner)) {\n            value += scanner.current();\n            continue;\n        }\n        const ch = scanner.peek();\n        if (ch === ctx.quote || ch === 36 /* Dollar */ || isAllowedOperator(ch, ctx)) {\n            // 1. Found matching quote\n            // 2. The `$` character has special meaning in every context\n            // 3. Depending on context, some characters should be treated as operators\n            break;\n        }\n        if (ctx.expression && ch === 125 /* CurlyBracketClose */) {\n            break;\n        }\n        if (!ctx.quote && !ctx.expression) {\n            // Consuming element name\n            if (!ctx.attribute && !isElementName$1(ch)) {\n                break;\n            }\n            if (isAllowedSpace(ch, ctx) || isAllowedRepeater(ch, ctx) || isQuote$1(ch) || bracketType(ch)) {\n                // Stop for characters not allowed in unquoted literal\n                break;\n            }\n        }\n        value += scanner.string[scanner.pos++];\n    }\n    if (start !== scanner.pos) {\n        scanner.start = start;\n        return {\n            type: 'Literal',\n            value,\n            start,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes white space characters as string literal from given scanner\n */\nfunction whiteSpace(scanner) {\n    const start = scanner.pos;\n    if (scanner.eatWhile(isSpace)) {\n        return {\n            type: 'WhiteSpace',\n            start,\n            end: scanner.pos,\n            value: scanner.substring(start, scanner.pos)\n        };\n    }\n}\n/**\n * Consumes quote from given scanner\n */\nfunction quote(scanner) {\n    const ch = scanner.peek();\n    if (isQuote$1(ch)) {\n        return {\n            type: 'Quote',\n            single: ch === 39 /* SingleQuote */,\n            start: scanner.pos++,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes bracket from given scanner\n */\nfunction bracket(scanner) {\n    const ch = scanner.peek();\n    const context = bracketType(ch);\n    if (context) {\n        return {\n            type: 'Bracket',\n            open: isOpenBracket(ch),\n            context,\n            start: scanner.pos++,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes operator from given scanner\n */\nfunction operator(scanner) {\n    const op = operatorType(scanner.peek());\n    if (op) {\n        return {\n            type: 'Operator',\n            operator: op,\n            start: scanner.pos++,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes node repeat token from current stream position and returns its\n * parsed value\n */\nfunction repeater$1(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(42 /* Asterisk */)) {\n        scanner.start = scanner.pos;\n        let count = 1;\n        let implicit = false;\n        if (scanner.eatWhile(isNumber)) {\n            count = Number(scanner.current());\n        }\n        else {\n            implicit = true;\n        }\n        return {\n            type: 'Repeater',\n            count,\n            value: 0,\n            implicit,\n            start,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes repeater placeholder `$#` from given scanner\n */\nfunction repeaterPlaceholder(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(36 /* Dollar */) && scanner.eat(35 /* Hash */)) {\n        return {\n            type: 'RepeaterPlaceholder',\n            value: void 0,\n            start,\n            end: scanner.pos\n        };\n    }\n    scanner.pos = start;\n}\n/**\n * Consumes numbering token like `$` from given scanner state\n */\nfunction repeaterNumber(scanner) {\n    const start = scanner.pos;\n    if (scanner.eatWhile(36 /* Dollar */)) {\n        const size = scanner.pos - start;\n        let reverse = false;\n        let base = 1;\n        let parent = 0;\n        if (scanner.eat(64 /* At */)) {\n            // Consume numbering modifiers\n            while (scanner.eat(94 /* Climb */)) {\n                parent++;\n            }\n            reverse = scanner.eat(45 /* Dash */);\n            scanner.start = scanner.pos;\n            if (scanner.eatWhile(isNumber)) {\n                base = Number(scanner.current());\n            }\n        }\n        scanner.start = start;\n        return {\n            type: 'RepeaterNumber',\n            size,\n            reverse,\n            base,\n            parent,\n            start,\n            end: scanner.pos\n        };\n    }\n}\nfunction field(scanner, ctx) {\n    const start = scanner.pos;\n    // Fields are allowed inside expressions and attributes\n    if ((ctx.expression || ctx.attribute) && scanner.eat(36 /* Dollar */) && scanner.eat(123 /* CurlyBracketOpen */)) {\n        scanner.start = scanner.pos;\n        let index;\n        let name = '';\n        if (scanner.eatWhile(isNumber)) {\n            // It’s a field\n            index = Number(scanner.current());\n            name = scanner.eat(58 /* Colon */) ? consumePlaceholder(scanner) : '';\n        }\n        else if (isAlpha(scanner.peek())) {\n            // It’s a variable\n            name = consumePlaceholder(scanner);\n        }\n        if (scanner.eat(125 /* CurlyBracketClose */)) {\n            return {\n                type: 'Field',\n                index, name,\n                start,\n                end: scanner.pos\n            };\n        }\n        throw scanner.error('Expecting }');\n    }\n    // If we reached here then there’s no valid field here, revert\n    // back to starting position\n    scanner.pos = start;\n}\n/**\n * Consumes a placeholder: value right after `:` in field. Could be empty\n */\nfunction consumePlaceholder(stream) {\n    const stack = [];\n    stream.start = stream.pos;\n    while (!stream.eof()) {\n        if (stream.eat(123 /* CurlyBracketOpen */)) {\n            stack.push(stream.pos);\n        }\n        else if (stream.eat(125 /* CurlyBracketClose */)) {\n            if (!stack.length) {\n                stream.pos--;\n                break;\n            }\n            stack.pop();\n        }\n        else {\n            stream.pos++;\n        }\n    }\n    if (stack.length) {\n        stream.pos = stack.pop();\n        throw stream.error(`Expecting }`);\n    }\n    return stream.current();\n}\n/**\n * Check if given character code is an operator and it’s allowed in current context\n */\nfunction isAllowedOperator(ch, ctx) {\n    const op = operatorType(ch);\n    if (!op || ctx.quote || ctx.expression) {\n        // No operators inside quoted values or expressions\n        return false;\n    }\n    // Inside attributes, only `equals` is allowed\n    return !ctx.attribute || op === 'equal';\n}\n/**\n * Check if given character is a space character and is allowed to be consumed\n * as a space token in current context\n */\nfunction isAllowedSpace(ch, ctx) {\n    return isSpace(ch) && !ctx.expression;\n}\n/**\n * Check if given character can be consumed as repeater in current context\n */\nfunction isAllowedRepeater(ch, ctx) {\n    return ch === 42 /* Asterisk */ && !ctx.attribute && !ctx.expression;\n}\n/**\n * If given character is a bracket, returns it’s type\n */\nfunction bracketType(ch) {\n    if (ch === 40 /* RoundBracketOpen */ || ch === 41 /* RoundBracketClose */) {\n        return 'group';\n    }\n    if (ch === 91 /* SquareBracketOpen */ || ch === 93 /* SquareBracketClose */) {\n        return 'attribute';\n    }\n    if (ch === 123 /* CurlyBracketOpen */ || ch === 125 /* CurlyBracketClose */) {\n        return 'expression';\n    }\n}\n/**\n * If given character is an operator, returns it’s type\n */\nfunction operatorType(ch) {\n    return (ch === 62 /* Child */ && 'child')\n        || (ch === 43 /* Sibling */ && 'sibling')\n        || (ch === 94 /* Climb */ && 'climb')\n        || (ch === 46 /* Dot */ && 'class')\n        || (ch === 35 /* Hash */ && 'id')\n        || (ch === 47 /* Slash */ && 'close')\n        || (ch === 61 /* Equals */ && 'equal')\n        || void 0;\n}\n/**\n * Check if given character is an open bracket\n */\nfunction isOpenBracket(ch) {\n    return ch === 123 /* CurlyBracketOpen */\n        || ch === 91 /* SquareBracketOpen */\n        || ch === 40 /* RoundBracketOpen */;\n}\n/**\n * Check if given character is allowed in element name\n */\nfunction isElementName$1(ch) {\n    return isAlphaNumericWord(ch)\n        || ch === 45 /* Dash */\n        || ch === 58 /* Colon */\n        || ch === 33 /* Excl */;\n}\n\nconst operators = {\n    child: '>',\n    class: '.',\n    climb: '^',\n    id: '#',\n    equal: '=',\n    close: '/',\n    sibling: '+'\n};\nconst tokenVisitor = {\n    Literal(token) {\n        return token.value;\n    },\n    Quote(token) {\n        return token.single ? '\\'' : '\"';\n    },\n    Bracket(token) {\n        if (token.context === 'attribute') {\n            return token.open ? '[' : ']';\n        }\n        else if (token.context === 'expression') {\n            return token.open ? '{' : '}';\n        }\n        else {\n            return token.open ? '(' : '}';\n        }\n    },\n    Operator(token) {\n        return operators[token.operator];\n    },\n    Field(token, state) {\n        if (token.index != null) {\n            // It’s a field: by default, return TextMate-compatible field\n            return token.name\n                ? `\\${${token.index}:${token.name}}`\n                : `\\${${token.index}`;\n        }\n        else if (token.name) {\n            // It’s a variable\n            return state.getVariable(token.name);\n        }\n        return '';\n    },\n    RepeaterPlaceholder(token, state) {\n        // Find closest implicit repeater\n        let repeater;\n        for (let i = state.repeaters.length - 1; i >= 0; i--) {\n            if (state.repeaters[i].implicit) {\n                repeater = state.repeaters[i];\n                break;\n            }\n        }\n        state.inserted = true;\n        return state.getText(repeater && repeater.value);\n    },\n    RepeaterNumber(token, state) {\n        let value = 1;\n        const lastIx = state.repeaters.length - 1;\n        // const repeaterIx = Math.max(0, state.repeaters.length - 1 - token.parent);\n        const repeater = state.repeaters[lastIx];\n        if (repeater) {\n            value = token.reverse\n                ? token.base + repeater.count - repeater.value - 1\n                : token.base + repeater.value;\n            if (token.parent) {\n                const parentIx = Math.max(0, lastIx - token.parent);\n                if (parentIx !== lastIx) {\n                    const parentRepeater = state.repeaters[parentIx];\n                    value += repeater.count * parentRepeater.value;\n                }\n            }\n        }\n        let result = String(value);\n        while (result.length < token.size) {\n            result = '0' + result;\n        }\n        return result;\n    },\n    WhiteSpace(token) {\n        return token.value;\n    }\n};\n/**\n * Converts given value token to string\n */\nfunction stringify(token, state) {\n    if (!tokenVisitor[token.type]) {\n        throw new Error(`Unknown token ${token.type}`);\n    }\n    return tokenVisitor[token.type](token, state);\n}\n\nconst urlRegex = /^((https?:|ftp:|file:)?\\/\\/|(www|ftp)\\.)[^ ]*$/;\nconst emailRegex = /^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,5}$/;\n/**\n * Converts given token-based abbreviation into simplified and unrolled node-based\n * abbreviation\n */\nfunction convert(abbr, options = {}) {\n    let textInserted = false;\n    let cleanText;\n    if (options.text) {\n        if (Array.isArray(options.text)) {\n            cleanText = options.text.filter(s => s.trim());\n        }\n        else {\n            cleanText = options.text;\n        }\n    }\n    const result = {\n        type: 'Abbreviation',\n        children: convertGroup(abbr, {\n            inserted: false,\n            repeaters: [],\n            text: options.text,\n            cleanText,\n            repeatGuard: options.maxRepeat || Number.POSITIVE_INFINITY,\n            getText(pos) {\n                var _a;\n                textInserted = true;\n                let value;\n                if (Array.isArray(options.text)) {\n                    if (pos !== undefined && pos >= 0 && pos < cleanText.length) {\n                        return cleanText[pos];\n                    }\n                    value = pos !== undefined ? options.text[pos] : options.text.join('\\n');\n                }\n                else {\n                    value = (_a = options.text) !== null && _a !== void 0 ? _a : '';\n                }\n                return value;\n            },\n            getVariable(name) {\n                const varValue = options.variables && options.variables[name];\n                return varValue != null ? varValue : name;\n            }\n        })\n    };\n    if (options.text != null && !textInserted) {\n        // Text given but no implicitly repeated elements: insert it into\n        // deepest child\n        const deepest = deepestNode(last(result.children));\n        if (deepest) {\n            const text = Array.isArray(options.text) ? options.text.join('\\n') : options.text;\n            insertText(deepest, text);\n            if (deepest.name === 'a' && options.href) {\n                // Automatically update value of `<a>` element if inserting URL or email\n                insertHref(deepest, text);\n            }\n        }\n    }\n    return result;\n}\n/**\n * Converts given statement to abbreviation nodes\n */\nfunction convertStatement(node, state) {\n    let result = [];\n    if (node.repeat) {\n        // Node is repeated: we should create copies of given node\n        // and supply context token with actual repeater state\n        const original = node.repeat;\n        const repeat = Object.assign({}, original);\n        repeat.count = repeat.implicit && Array.isArray(state.text)\n            ? state.cleanText.length\n            : (repeat.count || 1);\n        let items;\n        state.repeaters.push(repeat);\n        for (let i = 0; i < repeat.count; i++) {\n            repeat.value = i;\n            node.repeat = repeat;\n            items = isGroup(node)\n                ? convertGroup(node, state)\n                : convertElement(node, state);\n            if (repeat.implicit && !state.inserted) {\n                // It’s an implicit repeater but no repeater placeholders found inside,\n                // we should insert text into deepest node\n                const target = last(items);\n                const deepest = target && deepestNode(target);\n                if (deepest) {\n                    insertText(deepest, state.getText(repeat.value));\n                }\n            }\n            result = result.concat(items);\n            // We should output at least one repeated item even if it’s reached\n            // repeat limit\n            if (--state.repeatGuard <= 0) {\n                break;\n            }\n        }\n        state.repeaters.pop();\n        node.repeat = original;\n        if (repeat.implicit) {\n            state.inserted = true;\n        }\n    }\n    else {\n        result = result.concat(isGroup(node) ? convertGroup(node, state) : convertElement(node, state));\n    }\n    return result;\n}\nfunction convertElement(node, state) {\n    let children = [];\n    const elem = {\n        type: 'AbbreviationNode',\n        name: node.name && stringifyName(node.name, state),\n        value: node.value && stringifyValue(node.value, state),\n        attributes: void 0,\n        children,\n        repeat: node.repeat && Object.assign({}, node.repeat),\n        selfClosing: node.selfClose,\n    };\n    let result = [elem];\n    for (const child of node.elements) {\n        children = children.concat(convertStatement(child, state));\n    }\n    if (node.attributes) {\n        elem.attributes = [];\n        for (const attr of node.attributes) {\n            elem.attributes.push(convertAttribute(attr, state));\n        }\n    }\n    // In case if current node is a text-only snippet without fields, we should\n    // put all children as siblings\n    if (!elem.name && !elem.attributes && elem.value && !elem.value.some(isField)) {\n        // XXX it’s unclear that `children` is not bound to `elem`\n        // due to concat operation\n        result = result.concat(children);\n    }\n    else {\n        elem.children = children;\n    }\n    return result;\n}\nfunction convertGroup(node, state) {\n    let result = [];\n    for (const child of node.elements) {\n        result = result.concat(convertStatement(child, state));\n    }\n    if (node.repeat) {\n        result = attachRepeater(result, node.repeat);\n    }\n    return result;\n}\nfunction convertAttribute(node, state) {\n    let implied = false;\n    let isBoolean = false;\n    let valueType = node.expression ? 'expression' : 'raw';\n    let value;\n    const name = node.name && stringifyName(node.name, state);\n    if (name && name[0] === '!') {\n        implied = true;\n    }\n    if (name && name[name.length - 1] === '.') {\n        isBoolean = true;\n    }\n    if (node.value) {\n        const tokens = node.value.slice();\n        if (isQuote(tokens[0])) {\n            // It’s a quoted value: remove quotes from output but mark attribute\n            // value as quoted\n            const quote = tokens.shift();\n            if (tokens.length && last(tokens).type === quote.type) {\n                tokens.pop();\n            }\n            valueType = quote.single ? 'singleQuote' : 'doubleQuote';\n        }\n        else if (isBracket(tokens[0], 'expression', true)) {\n            // Value is expression: remove brackets but mark value type\n            valueType = 'expression';\n            tokens.shift();\n            if (isBracket(last(tokens), 'expression', false)) {\n                tokens.pop();\n            }\n        }\n        value = stringifyValue(tokens, state);\n    }\n    return {\n        name: isBoolean || implied\n            ? name.slice(implied ? 1 : 0, isBoolean ? -1 : void 0)\n            : name,\n        value,\n        boolean: isBoolean,\n        implied,\n        valueType\n    };\n}\n/**\n * Converts given token list to string\n */\nfunction stringifyName(tokens, state) {\n    let str = '';\n    for (let i = 0; i < tokens.length; i++) {\n        str += stringify(tokens[i], state);\n    }\n    return str;\n}\n/**\n * Converts given token list to value list\n */\nfunction stringifyValue(tokens, state) {\n    const result = [];\n    let str = '';\n    for (let i = 0, token; i < tokens.length; i++) {\n        token = tokens[i];\n        if (isField(token)) {\n            // We should keep original fields in output since some editors has their\n            // own syntax for field or doesn’t support fields at all so we should\n            // capture actual field location in output stream\n            if (str) {\n                result.push(str);\n                str = '';\n            }\n            result.push(token);\n        }\n        else {\n            str += stringify(token, state);\n        }\n    }\n    if (str) {\n        result.push(str);\n    }\n    return result;\n}\nfunction isGroup(node) {\n    return node.type === 'TokenGroup';\n}\nfunction isField(token) {\n    return typeof token === 'object' && token.type === 'Field' && token.index != null;\n}\nfunction last(arr) {\n    return arr[arr.length - 1];\n}\nfunction deepestNode(node) {\n    return node.children.length ? deepestNode(last(node.children)) : node;\n}\nfunction insertText(node, text) {\n    if (node.value) {\n        const lastToken = last(node.value);\n        if (typeof lastToken === 'string') {\n            node.value[node.value.length - 1] += text;\n        }\n        else {\n            node.value.push(text);\n        }\n    }\n    else {\n        node.value = [text];\n    }\n}\nfunction insertHref(node, text) {\n    var _a;\n    let href = '';\n    if (urlRegex.test(text)) {\n        href = text;\n        if (!/\\w+:/.test(href) && !href.startsWith('//')) {\n            href = `http://${href}`;\n        }\n    }\n    else if (emailRegex.test(text)) {\n        href = `mailto:${text}`;\n    }\n    const hrefAttribute = (_a = node.attributes) === null || _a === void 0 ? void 0 : _a.find(attr => attr.name === 'href');\n    if (!hrefAttribute) {\n        node.attributes = [{ name: 'href', value: [href], valueType: 'doubleQuote' }];\n    }\n    else if (!hrefAttribute.value) {\n        hrefAttribute.value = [href];\n    }\n}\nfunction attachRepeater(items, repeater) {\n    for (const item of items) {\n        if (!item.repeat) {\n            item.repeat = Object.assign({}, repeater);\n        }\n    }\n    return items;\n}\n\n/**\n * Parses given abbreviation into node tree\n */\nfunction parseAbbreviation(abbr, options) {\n    try {\n        const tokens = typeof abbr === 'string' ? tokenize(abbr) : abbr;\n        return convert(abbreviation(tokens, options), options);\n    }\n    catch (err) {\n        if (err instanceof ScannerError && typeof abbr === 'string') {\n            err.message += `\\n${abbr}\\n${'-'.repeat(err.pos)}^`;\n        }\n        throw err;\n    }\n}\n\nexport default parseAbbreviation;\nexport { convert, getToken, abbreviation as parse, tokenize };\n//# sourceMappingURL=abbreviation.es.js.map\n","import Scanner, { isNumber, isAlpha, isAlphaWord, isQuote, isSpace, isAlphaNumericWord, ScannerError } from '@emmetio/scanner';\n\nfunction tokenize(abbr, isValue) {\n    let brackets = 0;\n    let token;\n    const scanner = new Scanner(abbr);\n    const tokens = [];\n    while (!scanner.eof()) {\n        token = getToken(scanner, brackets === 0 && !isValue);\n        if (!token) {\n            throw scanner.error('Unexpected character');\n        }\n        if (token.type === 'Bracket') {\n            if (!brackets && token.open) {\n                mergeTokens(scanner, tokens);\n            }\n            brackets += token.open ? 1 : -1;\n            if (brackets < 0) {\n                throw scanner.error('Unexpected bracket', token.start);\n            }\n        }\n        tokens.push(token);\n        // Forcibly consume next operator after unit-less numeric value or color:\n        // next dash `-` must be used as value delimiter\n        if (shouldConsumeDashAfter(token) && (token = operator(scanner))) {\n            tokens.push(token);\n        }\n    }\n    return tokens;\n}\n/**\n * Returns next token from given scanner, if possible\n */\nfunction getToken(scanner, short) {\n    return field(scanner)\n        || numberValue(scanner)\n        || colorValue(scanner)\n        || stringValue(scanner)\n        || bracket(scanner)\n        || operator(scanner)\n        || whiteSpace(scanner)\n        || literal(scanner, short);\n}\nfunction field(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(36 /* Dollar */) && scanner.eat(123 /* CurlyBracketOpen */)) {\n        scanner.start = scanner.pos;\n        let index;\n        let name = '';\n        if (scanner.eatWhile(isNumber)) {\n            // It’s a field\n            index = Number(scanner.current());\n            name = scanner.eat(58 /* Colon */) ? consumePlaceholder(scanner) : '';\n        }\n        else if (isAlpha(scanner.peek())) {\n            // It’s a variable\n            name = consumePlaceholder(scanner);\n        }\n        if (scanner.eat(125 /* CurlyBracketClose */)) {\n            return {\n                type: 'Field',\n                index, name,\n                start,\n                end: scanner.pos\n            };\n        }\n        throw scanner.error('Expecting }');\n    }\n    // If we reached here then there’s no valid field here, revert\n    // back to starting position\n    scanner.pos = start;\n}\n/**\n * Consumes a placeholder: value right after `:` in field. Could be empty\n */\nfunction consumePlaceholder(stream) {\n    const stack = [];\n    stream.start = stream.pos;\n    while (!stream.eof()) {\n        if (stream.eat(123 /* CurlyBracketOpen */)) {\n            stack.push(stream.pos);\n        }\n        else if (stream.eat(125 /* CurlyBracketClose */)) {\n            if (!stack.length) {\n                stream.pos--;\n                break;\n            }\n            stack.pop();\n        }\n        else {\n            stream.pos++;\n        }\n    }\n    if (stack.length) {\n        stream.pos = stack.pop();\n        throw stream.error(`Expecting }`);\n    }\n    return stream.current();\n}\n/**\n * Consumes literal from given scanner\n * @param short Use short notation for consuming value.\n * The difference between “short” and “full” notation is that first one uses\n * alpha characters only and used for extracting keywords from abbreviation,\n * while “full” notation also supports numbers and dashes\n */\nfunction literal(scanner, short) {\n    const start = scanner.pos;\n    if (scanner.eat(isIdentPrefix)) {\n        // SCSS or LESS variable\n        // NB a bit dirty hack: if abbreviation starts with identifier prefix,\n        // consume alpha characters only to allow embedded variables\n        scanner.eatWhile(start ? isKeyword : isLiteral);\n    }\n    else if (scanner.eat(isAlphaWord)) {\n        scanner.eatWhile(short ? isLiteral : isKeyword);\n    }\n    else {\n        // Allow dots only at the beginning of literal\n        scanner.eat(46 /* Dot */);\n        scanner.eatWhile(isLiteral);\n    }\n    if (start !== scanner.pos) {\n        scanner.start = start;\n        return createLiteral(scanner, scanner.start = start);\n    }\n}\nfunction createLiteral(scanner, start = scanner.start, end = scanner.pos) {\n    return {\n        type: 'Literal',\n        value: scanner.substring(start, end),\n        start,\n        end\n    };\n}\n/**\n * Consumes numeric CSS value (number with optional unit) from current stream,\n * if possible\n */\nfunction numberValue(scanner) {\n    const start = scanner.pos;\n    if (consumeNumber(scanner)) {\n        scanner.start = start;\n        const rawValue = scanner.current();\n        // eat unit, which can be a % or alpha word\n        scanner.start = scanner.pos;\n        scanner.eat(37 /* Percent */) || scanner.eatWhile(isAlphaWord);\n        return {\n            type: 'NumberValue',\n            value: Number(rawValue),\n            rawValue,\n            unit: scanner.current(),\n            start,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes quoted string value from given scanner\n */\nfunction stringValue(scanner) {\n    const ch = scanner.peek();\n    const start = scanner.pos;\n    let finished = false;\n    if (isQuote(ch)) {\n        scanner.pos++;\n        while (!scanner.eof()) {\n            // Do not throw error on malformed string\n            if (scanner.eat(ch)) {\n                finished = true;\n                break;\n            }\n            else {\n                scanner.pos++;\n            }\n        }\n        scanner.start = start;\n        return {\n            type: 'StringValue',\n            value: scanner.substring(start + 1, scanner.pos - (finished ? 1 : 0)),\n            quote: ch === 39 /* SingleQuote */ ? 'single' : 'double',\n            start,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes a color token from given string\n */\nfunction colorValue(scanner) {\n    // supported color variations:\n    // #abc   → #aabbccc\n    // #0     → #000000\n    // #fff.5 → rgba(255, 255, 255, 0.5)\n    // #t     → transparent\n    const start = scanner.pos;\n    if (scanner.eat(35 /* Hash */)) {\n        const valueStart = scanner.pos;\n        let color = '';\n        let alpha = '';\n        if (scanner.eatWhile(isHex)) {\n            color = scanner.substring(valueStart, scanner.pos);\n            alpha = colorAlpha(scanner);\n        }\n        else if (scanner.eat(116 /* Transparent */)) {\n            color = '0';\n            alpha = colorAlpha(scanner) || '0';\n        }\n        else {\n            alpha = colorAlpha(scanner);\n        }\n        if (color || alpha || scanner.eof()) {\n            const { r, g, b, a } = parseColor(color, alpha);\n            return {\n                type: 'ColorValue',\n                r, g, b, a,\n                raw: scanner.substring(start + 1, scanner.pos),\n                start,\n                end: scanner.pos\n            };\n        }\n        else {\n            // Consumed # but no actual value: invalid color value, treat it as literal\n            return createLiteral(scanner, start);\n        }\n    }\n    scanner.pos = start;\n}\n/**\n * Consumes alpha value of color: `.1`\n */\nfunction colorAlpha(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(46 /* Dot */)) {\n        scanner.start = start;\n        if (scanner.eatWhile(isNumber)) {\n            return scanner.current();\n        }\n        return '1';\n    }\n    return '';\n}\n/**\n * Consumes white space characters as string literal from given scanner\n */\nfunction whiteSpace(scanner) {\n    const start = scanner.pos;\n    if (scanner.eatWhile(isSpace)) {\n        return {\n            type: 'WhiteSpace',\n            start,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes bracket from given scanner\n */\nfunction bracket(scanner) {\n    const ch = scanner.peek();\n    if (isBracket(ch)) {\n        return {\n            type: 'Bracket',\n            open: ch === 40 /* RoundBracketOpen */,\n            start: scanner.pos++,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes operator from given scanner\n */\nfunction operator(scanner) {\n    const op = operatorType(scanner.peek());\n    if (op) {\n        return {\n            type: 'Operator',\n            operator: op,\n            start: scanner.pos++,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Eats number value from given stream\n * @return Returns `true` if number was consumed\n */\nfunction consumeNumber(stream) {\n    const start = stream.pos;\n    stream.eat(45 /* Dash */);\n    const afterNegative = stream.pos;\n    const hasDecimal = stream.eatWhile(isNumber);\n    const prevPos = stream.pos;\n    if (stream.eat(46 /* Dot */)) {\n        // It’s perfectly valid to have numbers like `1.`, which enforces\n        // value to float unit type\n        const hasFloat = stream.eatWhile(isNumber);\n        if (!hasDecimal && !hasFloat) {\n            // Lone dot\n            stream.pos = prevPos;\n        }\n    }\n    // Edge case: consumed dash only: not a number, bail-out\n    if (stream.pos === afterNegative) {\n        stream.pos = start;\n    }\n    return stream.pos !== start;\n}\nfunction isIdentPrefix(code) {\n    return code === 64 /* At */ || code === 36 /* Dollar */;\n}\n/**\n * If given character is an operator, returns it’s type\n */\nfunction operatorType(ch) {\n    return (ch === 43 /* Sibling */ && \"+\" /* Sibling */)\n        || (ch === 33 /* Excl */ && \"!\" /* Important */)\n        || (ch === 44 /* Comma */ && \",\" /* ArgumentDelimiter */)\n        || (ch === 58 /* Colon */ && \":\" /* PropertyDelimiter */)\n        || (ch === 45 /* Dash */ && \"-\" /* ValueDelimiter */)\n        || void 0;\n}\n/**\n * Check if given code is a hex value (/0-9a-f/)\n */\nfunction isHex(code) {\n    return isNumber(code) || isAlpha(code, 65, 70); // A-F\n}\nfunction isKeyword(code) {\n    return isAlphaNumericWord(code) || code === 45 /* Dash */;\n}\nfunction isBracket(code) {\n    return code === 40 /* RoundBracketOpen */ || code === 41 /* RoundBracketClose */;\n}\nfunction isLiteral(code) {\n    return isAlphaWord(code) || code === 37 /* Percent */ || code === 47 /* Slash */;\n}\n/**\n * Parses given color value from abbreviation into RGBA format\n */\nfunction parseColor(value, alpha) {\n    let r = '0';\n    let g = '0';\n    let b = '0';\n    let a = Number(alpha != null && alpha !== '' ? alpha : 1);\n    if (value === 't') {\n        a = 0;\n    }\n    else {\n        switch (value.length) {\n            case 0:\n                break;\n            case 1:\n                r = g = b = value + value;\n                break;\n            case 2:\n                r = g = b = value;\n                break;\n            case 3:\n                r = value[0] + value[0];\n                g = value[1] + value[1];\n                b = value[2] + value[2];\n                break;\n            default:\n                value += value;\n                r = value.slice(0, 2);\n                g = value.slice(2, 4);\n                b = value.slice(4, 6);\n        }\n    }\n    return {\n        r: parseInt(r, 16),\n        g: parseInt(g, 16),\n        b: parseInt(b, 16),\n        a\n    };\n}\n/**\n * Check if scanner reader must consume dash after given token.\n * Used in cases where user must explicitly separate numeric values\n */\nfunction shouldConsumeDashAfter(token) {\n    return token.type === 'ColorValue' || (token.type === 'NumberValue' && !token.unit);\n}\n/**\n * Merges last adjacent tokens into a single literal.\n * This function is used to overcome edge case when function name was parsed\n * as a list of separate tokens. For example, a `scale3d()` value will be\n * parsed as literal and number tokens (`scale` and `3d`) which is a perfectly\n * valid abbreviation but undesired result. This function will detect last adjacent\n * literal and number values and combine them into single literal\n */\nfunction mergeTokens(scanner, tokens) {\n    let start = 0;\n    let end = 0;\n    while (tokens.length) {\n        const token = last(tokens);\n        if (token.type === 'Literal' || token.type === 'NumberValue') {\n            start = token.start;\n            if (!end) {\n                end = token.end;\n            }\n            tokens.pop();\n        }\n        else {\n            break;\n        }\n    }\n    if (start !== end) {\n        tokens.push(createLiteral(scanner, start, end));\n    }\n}\nfunction last(arr) {\n    return arr[arr.length - 1];\n}\n\nfunction tokenScanner(tokens) {\n    return {\n        tokens,\n        start: 0,\n        pos: 0,\n        size: tokens.length\n    };\n}\nfunction peek(scanner) {\n    return scanner.tokens[scanner.pos];\n}\nfunction readable(scanner) {\n    return scanner.pos < scanner.size;\n}\nfunction consume(scanner, test) {\n    if (test(peek(scanner))) {\n        scanner.pos++;\n        return true;\n    }\n    return false;\n}\nfunction error(scanner, message, token = peek(scanner)) {\n    if (token && token.start != null) {\n        message += ` at ${token.start}`;\n    }\n    const err = new Error(message);\n    err['pos'] = token && token.start;\n    return err;\n}\n\nfunction parser(tokens, options = {}) {\n    const scanner = tokenScanner(tokens);\n    const result = [];\n    let property;\n    while (readable(scanner)) {\n        if (property = consumeProperty(scanner, options)) {\n            result.push(property);\n        }\n        else if (!consume(scanner, isSiblingOperator)) {\n            throw error(scanner, 'Unexpected token');\n        }\n    }\n    return result;\n}\n/**\n * Consumes single CSS property\n */\nfunction consumeProperty(scanner, options) {\n    let name;\n    let important = false;\n    let valueFragment;\n    const value = [];\n    const token = peek(scanner);\n    const valueMode = !!options.value;\n    if (!valueMode && isLiteral$1(token) && !isFunctionStart(scanner)) {\n        scanner.pos++;\n        name = token.value;\n        // Consume any following value delimiter after property name\n        consume(scanner, isValueDelimiter);\n    }\n    // Skip whitespace right after property name, if any\n    if (valueMode) {\n        consume(scanner, isWhiteSpace);\n    }\n    while (readable(scanner)) {\n        if (consume(scanner, isImportant)) {\n            important = true;\n        }\n        else if (valueFragment = consumeValue(scanner, valueMode)) {\n            value.push(valueFragment);\n        }\n        else if (!consume(scanner, isFragmentDelimiter)) {\n            break;\n        }\n    }\n    if (name || value.length || important) {\n        return { name, value, important };\n    }\n}\n/**\n * Consumes single value fragment, e.g. all value tokens before comma\n */\nfunction consumeValue(scanner, inArgument) {\n    const result = [];\n    let token;\n    let args;\n    while (readable(scanner)) {\n        token = peek(scanner);\n        if (isValue(token)) {\n            scanner.pos++;\n            if (isLiteral$1(token) && (args = consumeArguments(scanner))) {\n                result.push({\n                    type: 'FunctionCall',\n                    name: token.value,\n                    arguments: args\n                });\n            }\n            else {\n                result.push(token);\n            }\n        }\n        else if (isValueDelimiter(token) || (inArgument && isWhiteSpace(token))) {\n            scanner.pos++;\n        }\n        else {\n            break;\n        }\n    }\n    return result.length\n        ? { type: 'CSSValue', value: result }\n        : void 0;\n}\nfunction consumeArguments(scanner) {\n    const start = scanner.pos;\n    if (consume(scanner, isOpenBracket)) {\n        const args = [];\n        let value;\n        while (readable(scanner) && !consume(scanner, isCloseBracket)) {\n            if (value = consumeValue(scanner, true)) {\n                args.push(value);\n            }\n            else if (!consume(scanner, isWhiteSpace) && !consume(scanner, isArgumentDelimiter)) {\n                throw error(scanner, 'Unexpected token');\n            }\n        }\n        scanner.start = start;\n        return args;\n    }\n}\nfunction isLiteral$1(token) {\n    return token && token.type === 'Literal';\n}\nfunction isBracket$1(token, open) {\n    return token && token.type === 'Bracket' && (open == null || token.open === open);\n}\nfunction isOpenBracket(token) {\n    return isBracket$1(token, true);\n}\nfunction isCloseBracket(token) {\n    return isBracket$1(token, false);\n}\nfunction isWhiteSpace(token) {\n    return token && token.type === 'WhiteSpace';\n}\nfunction isOperator(token, operator) {\n    return token && token.type === 'Operator' && (!operator || token.operator === operator);\n}\nfunction isSiblingOperator(token) {\n    return isOperator(token, \"+\" /* Sibling */);\n}\nfunction isArgumentDelimiter(token) {\n    return isOperator(token, \",\" /* ArgumentDelimiter */);\n}\nfunction isFragmentDelimiter(token) {\n    return isArgumentDelimiter(token);\n}\nfunction isImportant(token) {\n    return isOperator(token, \"!\" /* Important */);\n}\nfunction isValue(token) {\n    return token.type === 'StringValue'\n        || token.type === 'ColorValue'\n        || token.type === 'NumberValue'\n        || token.type === 'Literal'\n        || token.type === 'Field';\n}\nfunction isValueDelimiter(token) {\n    return isOperator(token, \":\" /* PropertyDelimiter */)\n        || isOperator(token, \"-\" /* ValueDelimiter */);\n}\nfunction isFunctionStart(scanner) {\n    const t1 = scanner.tokens[scanner.pos];\n    const t2 = scanner.tokens[scanner.pos + 1];\n    return t1 && t2 && isLiteral$1(t1) && t2.type === 'Bracket';\n}\n\n/**\n * Parses given abbreviation into property set\n */\nfunction parse(abbr, options) {\n    try {\n        const tokens = typeof abbr === 'string' ? tokenize(abbr, options && options.value) : abbr;\n        return parser(tokens, options);\n    }\n    catch (err) {\n        if (err instanceof ScannerError && typeof abbr === 'string') {\n            err.message += `\\n${abbr}\\n${'-'.repeat(err.pos)}^`;\n        }\n        throw err;\n    }\n}\n\nexport default parse;\nexport { getToken, parser, tokenize };\n","import { GlobalConfig } from 'emmet';\n\nexport interface EmmetEditorOptions extends CodeMirror.EditorConfiguration {\n    emmet: EmmetConfig;\n}\n\nexport type EnableForSyntax = boolean | string[];\n\nexport interface EmmetConfig {\n    /** Enables abbreviation marking in editor. Works in known syntaxes only */\n    mark: EnableForSyntax;\n\n    /**\n     * Enables preview of marked abbreviation. Pass `true` to enable preview for\n     * all syntaxes or array of modes or Emmet syntax types (`markup` or `stylesheet`)\n     * where preview should be displayed\n     */\n    preview: EnableForSyntax;\n\n    /** Mark HTML tag pairs in editor */\n    markTagPairs: boolean;\n\n    /**\n     * Displays open tag preview when caret is inside its matching closing tag.\n     * Preview is displayed only if open tag has attributes.\n     * Works only if `markTagPairs` is enabled\n     */\n    previewOpenTag: boolean;\n\n    /** Allow automatic tag pair rename, works only if `markTagPairs` is enabled */\n    autoRenameTags: boolean;\n\n    /** Quotes to use in generated HTML attribute values */\n    attributeQuotes: 'single' | 'double';\n\n    /** Style for self-closing elements (like `<br>`) and boolean attributes */\n    markupStyle: 'html' | 'xhtml' | 'xml',\n\n    /**\n     * Enable automatic tag commenting. When enabled, elements generated from Emmet\n     * abbreviation with `id` and/or `class` attributes will receive a comment\n     * with these attribute values\n     */\n    comments: boolean;\n\n    /**\n     * Commenting template. Default value is `\\n<!-- /[#ID][.CLASS] -->`\n     * Outputs everything between `[` and `]` only if specified attribute name\n     * (written in UPPERCASE) exists in element. Attribute name is replaced with\n     * actual value. Use `\\n` to add a newline.\n     */\n    commentsTemplate?: string;\n\n    /**\n     * Enable BEM support. When enabled, Emmet will treat class names starting\n     * with `-` as _element_ and with `_` as _modifier_ in BEM notation.\n     * These class names will inherit `block` name from current or ancestor element.\n     * For example, the abbreviation `ul.nav.nav_secondary>li.nav__item` can be\n     * shortened to `ul.nav._secondary>li.-item` with this option enabled.\n     */\n    bem: boolean;\n\n    /**\n     * For stylesheet abbreviations, generate short HEX color values, if possible.\n     * For example, `c#0` will be expanded to `color: #000;` instead of `color: #000000`.\n     */\n    shortHex?: boolean;\n\n    /** Advanced Emmet config */\n    config?: GlobalConfig;\n\n    /**\n     * Function for attaching abbreviation preview\n     */\n    attachPreview?: (editor: CodeMirror.Editor, preview: HTMLElement, pos: CodeMirror.Position) => void;\n}\n\nexport const defaultConfig: EmmetConfig = {\n    mark: true,\n    preview: true,\n    autoRenameTags: true,\n    markTagPairs: true,\n    previewOpenTag: false,\n    attributeQuotes: 'double',\n    markupStyle: 'html',\n    comments: false,\n    commentsTemplate: '<!-- /[#ID][.CLASS] -->',\n    bem: false\n};\n\nexport default function getEmmetConfig(editor: CodeMirror.Editor, opt?: Partial<EmmetConfig>): EmmetConfig {\n    if (!opt) {\n        // @ts-ignore Bypass limited options, defined in typings\n        opt = editor.getOption('emmet');\n    }\n    return { ...defaultConfig, ...opt };\n}\n","const defaultQuotedOptions = {\n    escape: 92,\n    throws: false\n};\n/**\n * Check if given code is a number\n */\nfunction isNumber(code) {\n    return code > 47 && code < 58;\n}\n/**\n * Check if given character code is alpha code (letter through A to Z)\n */\nfunction isAlpha(code, from, to) {\n    from = from || 65; // A\n    to = to || 90; // Z\n    code &= ~32; // quick hack to convert any char code to uppercase char code\n    return code >= from && code <= to;\n}\n/**\n * Check if given character code is alpha-numeric (letter through A to Z or number)\n */\nfunction isAlphaNumeric(code) {\n    return isNumber(code) || isAlpha(code);\n}\nfunction isAlphaNumericWord(code) {\n    return isNumber(code) || isAlphaWord(code);\n}\nfunction isAlphaWord(code) {\n    return code === 95 /* _ */ || isAlpha(code);\n}\n/**\n * Check if given character code is a white-space character: a space character\n * or line breaks\n */\nfunction isWhiteSpace(code) {\n    return code === 32 /* space */\n        || code === 9 /* tab */\n        || code === 160; /* non-breaking space */\n}\n/**\n * Check if given character code is a space character\n */\nfunction isSpace(code) {\n    return isWhiteSpace(code)\n        || code === 10 /* LF */\n        || code === 13; /* CR */\n}\n/**\n * Consumes 'single' or \"double\"-quoted string from given string, if possible\n * @return `true` if quoted string was consumed. The contents of quoted string\n * will be available as `stream.current()`\n */\nfunction eatQuoted(stream, options) {\n    options = Object.assign(Object.assign({}, defaultQuotedOptions), options);\n    const start = stream.pos;\n    const quote = stream.peek();\n    if (stream.eat(isQuote)) {\n        while (!stream.eof()) {\n            switch (stream.next()) {\n                case quote:\n                    stream.start = start;\n                    return true;\n                case options.escape:\n                    stream.next();\n                    break;\n            }\n        }\n        // If we’re here then stream wasn’t properly consumed.\n        // Revert stream and decide what to do\n        stream.pos = start;\n        if (options.throws) {\n            throw stream.error('Unable to consume quoted string');\n        }\n    }\n    return false;\n}\n/**\n * Check if given character code is a quote character\n */\nfunction isQuote(code) {\n    return code === 39 /* ' */ || code === 34 /* \" */;\n}\n/**\n * Eats paired characters substring, for example `(foo)` or `[bar]`\n * @param open Character code of pair opening\n * @param close Character code of pair closing\n * @return Returns `true` if character pair was successfully consumed, it’s\n * content will be available as `stream.current()`\n */\nfunction eatPair(stream, open, close, options) {\n    options = Object.assign(Object.assign({}, defaultQuotedOptions), options);\n    const start = stream.pos;\n    if (stream.eat(open)) {\n        let stack = 1;\n        let ch;\n        while (!stream.eof()) {\n            if (eatQuoted(stream, options)) {\n                continue;\n            }\n            ch = stream.next();\n            if (ch === open) {\n                stack++;\n            }\n            else if (ch === close) {\n                stack--;\n                if (!stack) {\n                    stream.start = start;\n                    return true;\n                }\n            }\n            else if (ch === options.escape) {\n                stream.next();\n            }\n        }\n        // If we’re here then paired character can’t be consumed\n        stream.pos = start;\n        if (options.throws) {\n            throw stream.error(`Unable to find matching pair for ${String.fromCharCode(open)}`);\n        }\n    }\n    return false;\n}\n\n/**\n * A streaming, character code-based string reader\n */\nclass Scanner {\n    constructor(str, start, end) {\n        if (end == null && typeof str === 'string') {\n            end = str.length;\n        }\n        this.string = str;\n        this.pos = this.start = start || 0;\n        this.end = end || 0;\n    }\n    /**\n     * Returns true only if the stream is at the end of the file.\n     */\n    eof() {\n        return this.pos >= this.end;\n    }\n    /**\n     * Creates a new stream instance which is limited to given `start` and `end`\n     * range. E.g. its `eof()` method will look at `end` property, not actual\n     * stream end\n     */\n    limit(start, end) {\n        return new Scanner(this.string, start, end);\n    }\n    /**\n     * Returns the next character code in the stream without advancing it.\n     * Will return NaN at the end of the file.\n     */\n    peek() {\n        return this.string.charCodeAt(this.pos);\n    }\n    /**\n     * Returns the next character in the stream and advances it.\n     * Also returns <code>undefined</code> when no more characters are available.\n     */\n    next() {\n        if (this.pos < this.string.length) {\n            return this.string.charCodeAt(this.pos++);\n        }\n    }\n    /**\n     * `match` can be a character code or a function that takes a character code\n     * and returns a boolean. If the next character in the stream 'matches'\n     * the given argument, it is consumed and returned.\n     * Otherwise, `false` is returned.\n     */\n    eat(match) {\n        const ch = this.peek();\n        const ok = typeof match === 'function' ? match(ch) : ch === match;\n        if (ok) {\n            this.next();\n        }\n        return ok;\n    }\n    /**\n     * Repeatedly calls <code>eat</code> with the given argument, until it\n     * fails. Returns <code>true</code> if any characters were eaten.\n     */\n    eatWhile(match) {\n        const start = this.pos;\n        while (!this.eof() && this.eat(match)) { /* */ }\n        return this.pos !== start;\n    }\n    /**\n     * Backs up the stream n characters. Backing it up further than the\n     * start of the current token will cause things to break, so be careful.\n     */\n    backUp(n) {\n        this.pos -= (n || 1);\n    }\n    /**\n     * Get the string between the start of the current token and the\n     * current stream position.\n     */\n    current() {\n        return this.substring(this.start, this.pos);\n    }\n    /**\n     * Returns substring for given range\n     */\n    substring(start, end) {\n        return this.string.slice(start, end);\n    }\n    /**\n     * Creates error object with current stream state\n     */\n    error(message, pos = this.pos) {\n        return new ScannerError(`${message} at ${pos + 1}`, pos, this.string);\n    }\n}\nclass ScannerError extends Error {\n    constructor(message, pos, str) {\n        super(message);\n        this.pos = pos;\n        this.string = str;\n    }\n}\n\nexport default Scanner;\nexport { ScannerError, eatPair, eatQuoted, isAlpha, isAlphaNumeric, isAlphaNumericWord, isAlphaWord, isNumber, isQuote, isSpace, isWhiteSpace };\n//# sourceMappingURL=scanner.es.js.map\n","import Scanner, { eatPair, isAlpha, isNumber, isQuote, isSpace, eatQuoted } from '@emmetio/scanner';\n\nconst defaultOptions = {\n    xml: false,\n    allTokens: false,\n    special: {\n        style: null,\n        script: ['', 'text/javascript', 'application/x-javascript', 'javascript', 'typescript', 'ts', 'coffee', 'coffeescript']\n    },\n    empty: ['img', 'meta', 'link', 'br', 'base', 'hr', 'area', 'wbr', 'col', 'embed', 'input', 'param', 'source', 'track']\n};\n/** Options for `Scanner` utils */\nconst opt = { throws: false };\nfunction createOptions(options = {}) {\n    return Object.assign(Object.assign({}, defaultOptions), options);\n}\n/**\n * Converts given string into array of character codes\n */\nfunction toCharCodes(str) {\n    return str.split('').map(ch => ch.charCodeAt(0));\n}\n/**\n * Consumes array of character codes from given scanner\n */\nfunction consumeArray(scanner, codes) {\n    const start = scanner.pos;\n    for (let i = 0; i < codes.length; i++) {\n        if (!scanner.eat(codes[i])) {\n            scanner.pos = start;\n            return false;\n        }\n    }\n    scanner.start = start;\n    return true;\n}\n/**\n * Consumes section from given string which starts with `open` character codes\n * and ends with `close` character codes\n * @return Returns `true` if section was consumed\n */\nfunction consumeSection(scanner, open, close, allowUnclosed) {\n    const start = scanner.pos;\n    if (consumeArray(scanner, open)) {\n        // consumed `<!--`, read next until we find ending part or reach the end of input\n        while (!scanner.eof()) {\n            if (consumeArray(scanner, close)) {\n                scanner.start = start;\n                return true;\n            }\n            scanner.pos++;\n        }\n        // unclosed section is allowed\n        if (allowUnclosed) {\n            scanner.start = start;\n            return true;\n        }\n        scanner.pos = start;\n        return false;\n    }\n    // unable to find section, revert to initial position\n    scanner.pos = start;\n    return false;\n}\n/**\n * Check if given character can be used as a start of tag name or attribute\n */\nfunction nameStartChar(ch) {\n    // Limited XML spec: https://www.w3.org/TR/xml/#NT-NameStartChar\n    return isAlpha(ch) || ch === 58 /* Colon */ || ch === 95 /* Underscore */\n        || (ch >= 0xC0 && ch <= 0xD6)\n        || (ch >= 0xD8 && ch <= 0xF6)\n        || (ch >= 0xF8 && ch <= 0x2FF)\n        || (ch >= 0x370 && ch <= 0x37D)\n        || (ch >= 0x37F && ch <= 0x1FFF);\n}\n/**\n * Check if given character can be used in a tag or attribute name\n */\nfunction nameChar(ch) {\n    // Limited XML spec: https://www.w3.org/TR/xml/#NT-NameChar\n    return nameStartChar(ch) || ch === 45 /* Dash */ || ch === 46 /* Dot */ || isNumber(ch)\n        || ch === 0xB7\n        || (ch >= 0x0300 && ch <= 0x036F);\n}\n/**\n * Consumes identifier from given scanner\n */\nfunction ident(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(nameStartChar)) {\n        scanner.eatWhile(nameChar);\n        scanner.start = start;\n        return true;\n    }\n    return false;\n}\n/**\n * Check if given code is tag terminator\n */\nfunction isTerminator(code) {\n    return code === 62 /* RightAngle */ || code === 47 /* Slash */;\n}\n/**\n * Check if given character code is valid unquoted value\n */\nfunction isUnquoted(code) {\n    return !isNaN(code) && !isQuote(code) && !isSpace(code) && !isTerminator(code);\n}\n/**\n * Consumes paired tokens (like `[` and `]`) with respect of nesting and embedded\n * quoted values\n * @return `true` if paired token was consumed\n */\nfunction consumePaired(scanner) {\n    return eatPair(scanner, 60 /* LeftAngle */, 62 /* RightAngle */, opt)\n        || eatPair(scanner, 40 /* LeftRound */, 41 /* RightRound */, opt)\n        || eatPair(scanner, 91 /* LeftSquare */, 93 /* RightSquare */, opt)\n        || eatPair(scanner, 123 /* LeftCurly */, 125 /* RightCurly */, opt);\n}\n/**\n * Returns unquoted value of given string\n */\nfunction getUnquotedValue(value) {\n    // Trim quotes\n    if (isQuote(value.charCodeAt(0))) {\n        value = value.slice(1);\n    }\n    if (isQuote(value.charCodeAt(value.length - 1))) {\n        value = value.slice(0, -1);\n    }\n    return value;\n}\n\n/**\n * Parses given string as list of HTML attributes.\n * @param src A fragment to parse. If `name` argument is provided, it must be an\n * opening tag (`<a foo=\"bar\">`), otherwise it should be a fragment between element\n * name and tag closing angle (`foo=\"bar\"`)\n * @param name Tag name\n */\nfunction attributes(src, name) {\n    const result = [];\n    let start = 0;\n    let end = src.length;\n    if (name) {\n        start = name.length + 1;\n        end -= src.slice(-2) === '/>' ? 2 : 1;\n    }\n    const scanner = new Scanner(src, start, end);\n    while (!scanner.eof()) {\n        scanner.eatWhile(isSpace);\n        if (attributeName(scanner)) {\n            const token = {\n                name: scanner.current(),\n                nameStart: scanner.start,\n                nameEnd: scanner.pos\n            };\n            if (scanner.eat(61 /* Equals */) && attributeValue(scanner)) {\n                token.value = scanner.current();\n                token.valueStart = scanner.start;\n                token.valueEnd = scanner.pos;\n            }\n            result.push(token);\n        }\n        else {\n            // Do not break on invalid attributes: we are not validating parser\n            scanner.pos++;\n        }\n    }\n    return result;\n}\n/**\n * Consumes attribute name from given scanner context\n */\nfunction attributeName(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(42 /* Asterisk */) || scanner.eat(35 /* Hash */)) {\n        // Angular-style directives: `<section *ngIf=\"showSection\">`, `<video #movieplayer ...>`\n        ident(scanner);\n        scanner.start = start;\n        return true;\n    }\n    // Attribute name could be a regular name or expression:\n    // React-style – `<div {...props}>`\n    // Angular-style – `<div [ng-for]>` or `<div *ng-for>`\n    return consumePaired(scanner) || ident(scanner);\n}\n/**\n * Consumes attribute value\n */\nfunction attributeValue(scanner) {\n    // Supported attribute values are quoted, React-like expressions (`{foo}`)\n    // or unquoted literals\n    return eatQuoted(scanner, opt) || consumePaired(scanner) || unquoted(scanner);\n}\n/**\n * Returns clean (unquoted) value of `name` attribute\n */\nfunction getAttributeValue(attrs, name) {\n    for (let i = 0; i < attrs.length; i++) {\n        const attr = attrs[i];\n        if (attr.name === name) {\n            return attr.value && getUnquotedValue(attr.value);\n        }\n    }\n}\n/**\n * Consumes unquoted value\n */\nfunction unquoted(scanner) {\n    const start = scanner.pos;\n    if (scanner.eatWhile(isUnquoted)) {\n        scanner.start = start;\n        return true;\n    }\n}\n\nconst cdataOpen = toCharCodes('<![CDATA[');\nconst cdataClose = toCharCodes(']]>');\nconst commentOpen = toCharCodes('<!--');\nconst commentClose = toCharCodes('-->');\nconst piStart = toCharCodes('<?');\nconst piEnd = toCharCodes('?>');\nconst erbStart = toCharCodes('<%');\nconst erbEnd = toCharCodes('%>');\n/**\n * Performs fast scan of given source code: for each tag found it invokes callback\n * with tag name, its type (open, close, self-close) and range in original source.\n * Unlike regular scanner, fast scanner doesn’t provide info about attributes to\n * reduce object allocations hence increase performance.\n * If `callback` returns `false`, scanner stops parsing.\n * @param special List of “special” HTML tags which should be ignored. Most likely\n * it’s a \"script\" and \"style\" tags.\n */\nfunction scan(source, callback, options) {\n    const scanner = new Scanner(source);\n    const special = options ? options.special : null;\n    const allTokens = options ? options.allTokens : false;\n    let type;\n    let name;\n    let nameStart;\n    let nameEnd;\n    let nameCodes;\n    let found = false;\n    let piName = null;\n    while (!scanner.eof()) {\n        const start = scanner.pos;\n        if (cdata(scanner)) {\n            if (allTokens && callback('#cdata', 4 /* CData */, scanner.start, scanner.pos) === false) {\n                break;\n            }\n        }\n        else if (comment(scanner)) {\n            if (allTokens && callback('#comment', 6 /* Comment */, scanner.start, scanner.pos) === false) {\n                break;\n            }\n        }\n        else if (erb(scanner)) {\n            if (allTokens && callback('#erb', 7 /* ERB */, scanner.start, scanner.pos) === false) {\n                break;\n            }\n        }\n        else if (piName = processingInstruction(scanner)) {\n            if (allTokens && callback(piName, 5 /* ProcessingInstruction */, scanner.start, scanner.pos) === false) {\n                break;\n            }\n        }\n        else if (scanner.eat(60 /* LeftAngle */)) {\n            // Maybe a tag name?\n            type = scanner.eat(47 /* Slash */) ? 2 /* Close */ : 1 /* Open */;\n            nameStart = scanner.pos;\n            if (ident(scanner)) {\n                // Consumed tag name\n                nameEnd = scanner.pos;\n                if (type !== 2 /* Close */) {\n                    skipAttributes(scanner);\n                    scanner.eatWhile(isSpace);\n                    if (scanner.eat(47 /* Slash */)) {\n                        type = 3 /* SelfClose */;\n                    }\n                }\n                if (scanner.eat(62 /* RightAngle */)) {\n                    // Tag properly closed\n                    name = scanner.substring(nameStart, nameEnd);\n                    if (callback(name, type, start, scanner.pos) === false) {\n                        break;\n                    }\n                    if (type === 1 /* Open */ && special && isSpecial(special, name, source, start, scanner.pos)) {\n                        // Found opening tag of special element: we should skip\n                        // scanner contents until we find closing tag\n                        nameCodes = toCharCodes(name);\n                        found = false;\n                        while (!scanner.eof()) {\n                            if (consumeClosing(scanner, nameCodes)) {\n                                found = true;\n                                break;\n                            }\n                            scanner.pos++;\n                        }\n                        if (found && callback(name, 2 /* Close */, scanner.start, scanner.pos) === false) {\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n        else {\n            scanner.pos++;\n        }\n    }\n}\n/**\n * Skips attributes in current tag context\n */\nfunction skipAttributes(scanner) {\n    while (!scanner.eof()) {\n        scanner.eatWhile(isSpace);\n        if (attributeName(scanner)) {\n            if (scanner.eat(61 /* Equals */)) {\n                attributeValue(scanner);\n            }\n        }\n        else if (isTerminator(scanner.peek())) {\n            break;\n        }\n        else {\n            scanner.pos++;\n        }\n    }\n}\n/**\n * Consumes closing tag with given name from scanner\n */\nfunction consumeClosing(scanner, name) {\n    const start = scanner.pos;\n    if (scanner.eat(60 /* LeftAngle */) && scanner.eat(47 /* Slash */) && consumeArray(scanner, name) && scanner.eat(62 /* RightAngle */)) {\n        scanner.start = start;\n        return true;\n    }\n    scanner.pos = start;\n    return false;\n}\n/**\n * Consumes CDATA from given scanner\n */\nfunction cdata(scanner) {\n    return consumeSection(scanner, cdataOpen, cdataClose, true);\n}\n/**\n * Consumes comments from given scanner\n */\nfunction comment(scanner) {\n    return consumeSection(scanner, commentOpen, commentClose, true);\n}\n/**\n * Consumes processing instruction from given scanner. If consumed, returns\n * processing instruction name\n */\nfunction processingInstruction(scanner) {\n    const start = scanner.pos;\n    if (consumeArray(scanner, piStart) && ident(scanner)) {\n        const name = scanner.current();\n        while (!scanner.eof()) {\n            if (consumeArray(scanner, piEnd)) {\n                break;\n            }\n            eatQuoted(scanner) || scanner.pos++;\n        }\n        scanner.start = start;\n        return name;\n    }\n    scanner.pos = start;\n    return null;\n}\n/**\n * Consumes ERB-style entity: `<% ... %>` or `<%= ... %>`\n */\nfunction erb(scanner) {\n    const start = scanner.pos;\n    if (consumeArray(scanner, erbStart)) {\n        while (!scanner.eof()) {\n            if (consumeArray(scanner, erbEnd)) {\n                break;\n            }\n            eatQuoted(scanner) || scanner.pos++;\n        }\n        scanner.start = start;\n        return true;\n    }\n    scanner.pos = start;\n    return false;\n}\n/**\n * Check if given tag name should be considered as special\n */\nfunction isSpecial(special, name, source, start, end) {\n    if (name in special) {\n        const typeValues = special[name];\n        if (!Array.isArray(typeValues)) {\n            return true;\n        }\n        const attrs = attributes(source.substring(start + name.length + 1, end - 1));\n        return typeValues.includes(getAttributeValue(attrs, 'type') || '');\n    }\n    return false;\n}\n\n/**\n * Finds matched tag for given `pos` location in XML/HTML `source`\n */\nfunction match(source, pos, opt) {\n    // Since we expect large input document, we’ll use pooling technique\n    // for storing tag data to reduce memory pressure and improve performance\n    const pool = [];\n    const stack = [];\n    const options = createOptions(opt);\n    let result = null;\n    scan(source, (name, type, start, end) => {\n        if (type === 1 /* Open */ && isSelfClose(name, options)) {\n            // Found empty element in HTML mode, mark is as self-closing\n            type = 3 /* SelfClose */;\n        }\n        if (type === 1 /* Open */) {\n            // Allocate tag object from pool\n            stack.push(allocTag(pool, name, start, end));\n        }\n        else if (type === 3 /* SelfClose */) {\n            if (start < pos && pos < end) {\n                // Matched given self-closing tag\n                result = {\n                    name,\n                    attributes: getAttributes(source, start, end, name),\n                    open: [start, end]\n                };\n                return false;\n            }\n        }\n        else {\n            const tag = last(stack);\n            if (tag && tag.name === name) {\n                // Matching closing tag found\n                if (tag.start < pos && pos < end) {\n                    result = {\n                        name,\n                        attributes: getAttributes(source, tag.start, tag.end, name),\n                        open: [tag.start, tag.end],\n                        close: [start, end]\n                    };\n                    return false;\n                }\n                else if (stack.length) {\n                    // Release tag object for further re-use\n                    releaseTag(pool, stack.pop());\n                }\n            }\n        }\n    }, options);\n    stack.length = pool.length = 0;\n    return result;\n}\n/**\n * Returns balanced tag model: a list of all XML/HTML tags that could possibly match\n * given location when moving in outward direction\n */\nfunction balancedOutward(source, pos, opt) {\n    const pool = [];\n    const stack = [];\n    const options = createOptions(opt);\n    const result = [];\n    scan(source, (name, type, start, end) => {\n        if (type === 2 /* Close */) {\n            const tag = last(stack);\n            if (tag && tag.name === name) { // XXX check for invalid tag names?\n                // Matching closing tag found, check if matched pair is a candidate\n                // for outward balancing\n                if (tag.start < pos && pos < end) {\n                    result.push({\n                        name,\n                        open: [tag.start, tag.end],\n                        close: [start, end]\n                    });\n                }\n                // Release tag object for further re-use\n                releaseTag(pool, stack.pop());\n            }\n        }\n        else if (type === 3 /* SelfClose */ || isSelfClose(name, options)) {\n            if (start < pos && pos < end) {\n                // Matched self-closed tag\n                result.push({ name, open: [start, end] });\n            }\n        }\n        else {\n            stack.push(allocTag(pool, name, start, end));\n        }\n    }, options);\n    stack.length = pool.length = 0;\n    return result;\n}\n/**\n * Returns balanced tag model: a list of all XML/HTML tags that could possibly match\n * given location when moving in inward direction\n */\nfunction balancedInward(source, pos, opt) {\n    // Collecting tags for inward balancing is a bit trickier: we have to store\n    // first child of every matched tag until we find the one that matches given\n    // location\n    const pool = [];\n    const stack = [];\n    const options = createOptions(opt);\n    const result = [];\n    const alloc = (name, start, end) => {\n        if (pool.length) {\n            const tag = pool.pop();\n            tag.name = name;\n            tag.ranges.push(start, end);\n            return tag;\n        }\n        return { name, ranges: [start, end] };\n    };\n    const release = (tag) => {\n        tag.ranges.length = 0;\n        tag.firstChild = void 0;\n        pool.push(tag);\n    };\n    scan(source, (name, type, start, end) => {\n        if (type === 2 /* Close */) {\n            if (!stack.length) {\n                // Some sort of lone closing tag, ignore it\n                return;\n            }\n            let tag = last(stack);\n            if (tag.name === name) { // XXX check for invalid tag names?\n                // Matching closing tag found, check if matched pair is a candidate\n                // for outward balancing\n                if (tag.ranges[0] <= pos && pos <= end) {\n                    result.push({\n                        name,\n                        open: tag.ranges.slice(0, 2),\n                        close: [start, end]\n                    });\n                    while (tag.firstChild) {\n                        const child = tag.firstChild;\n                        const res = {\n                            name: child.name,\n                            open: child.ranges.slice(0, 2)\n                        };\n                        if (child.ranges.length > 2) {\n                            res.close = child.ranges.slice(2, 4);\n                        }\n                        result.push(res);\n                        release(tag);\n                        tag = child;\n                    }\n                    return false;\n                }\n                else {\n                    stack.pop();\n                    const parent = last(stack);\n                    if (parent && !parent.firstChild) {\n                        // No first child in parent node: store current tag\n                        tag.ranges.push(start, end);\n                        parent.firstChild = tag;\n                    }\n                    else {\n                        release(tag);\n                    }\n                }\n            }\n        }\n        else if (type === 3 /* SelfClose */ || isSelfClose(name, options)) {\n            if (start < pos && pos < end) {\n                // Matched self-closed tag, no need to look further\n                result.push({ name, open: [start, end] });\n                return false;\n            }\n            const parent = last(stack);\n            if (parent && !parent.firstChild) {\n                parent.firstChild = alloc(name, start, end);\n            }\n        }\n        else {\n            stack.push(alloc(name, start, end));\n        }\n    }, options);\n    stack.length = pool.length = 0;\n    return result;\n}\nfunction allocTag(pool, name, start, end) {\n    if (pool.length) {\n        const tag = pool.pop();\n        tag.name = name;\n        tag.start = start;\n        tag.end = end;\n        return tag;\n    }\n    return { name, start, end };\n}\nfunction releaseTag(pool, tag) {\n    pool.push(tag);\n}\n/**\n * Returns parsed attributes from given source\n */\nfunction getAttributes(source, start, end, name) {\n    const tokens = attributes(source.slice(start, end), name);\n    tokens.forEach(attr => {\n        attr.nameStart += start;\n        attr.nameEnd += start;\n        if (attr.value != null) {\n            attr.valueStart += start;\n            attr.valueEnd += start;\n        }\n    });\n    return tokens;\n}\n/**\n * Check if given tag is self-close for current parsing context\n */\nfunction isSelfClose(name, options) {\n    return !options.xml && options.empty.includes(name);\n}\nfunction last(arr) {\n    return arr.length ? arr[arr.length - 1] : null;\n}\n\nexport default match;\nexport { attributes, balancedInward, balancedOutward, createOptions, scan };\n//# sourceMappingURL=html-matcher.es.js.map\n","import Scanner, { isSpace, isQuote } from '@emmetio/scanner';\n\n/**\n * Performs fast scan of given stylesheet (CSS, LESS, SCSS) source code and runs\n * callback for each token and its range found. The goal of this parser is to quickly\n * determine document structure: selector, property, value and block end.\n * It doesn’t provide detailed info about CSS atoms like compound selectors,\n * operators, quoted string etc. to reduce memory allocations: this data can be\n * parsed later on demand.\n */\nfunction scan(source, callback) {\n    const scanner = new Scanner(source);\n    const state = {\n        start: -1,\n        end: -1,\n        propertyStart: -1,\n        propertyEnd: -1,\n        propertyDelimiter: -1,\n        expression: 0,\n    };\n    let blockEnd;\n    const notify = (type, delimiter = scanner.start, start = state.start, end = state.end) => {\n        return callback(type, start, end, delimiter) === false;\n    };\n    while (!scanner.eof()) {\n        if (comment(scanner) || whitespace(scanner)) {\n            continue;\n        }\n        scanner.start = scanner.pos;\n        if ((blockEnd = scanner.eat(125 /* RightCurly */)) || scanner.eat(59 /* Semicolon */)) {\n            // Block or property end\n            if (state.propertyStart !== -1) {\n                // We have pending property\n                if (notify(\"propertyName\" /* PropertyName */, state.propertyDelimiter, state.propertyStart, state.propertyEnd)) {\n                    return;\n                }\n                if (state.start === -1) {\n                    // Explicit property value state: emit empty value\n                    state.start = state.end = scanner.start;\n                }\n                if (notify(\"propertyValue\" /* PropertyValue */)) {\n                    return;\n                }\n            }\n            else if (state.start !== -1 && notify(\"propertyName\" /* PropertyName */)) {\n                // Flush consumed token\n                return;\n            }\n            if (blockEnd) {\n                state.start = scanner.start;\n                state.end = scanner.pos;\n                if (notify(\"blockEnd\" /* BlockEnd */)) {\n                    return;\n                }\n            }\n            reset(state);\n        }\n        else if (scanner.eat(123 /* LeftCurly */)) {\n            // Block start\n            if (state.start === -1 && state.propertyStart === -1) {\n                // No consumed selector, emit empty value as selector start\n                state.start = state.end = scanner.pos;\n            }\n            if (state.propertyStart !== -1) {\n                // Now we know that value that looks like property name-value pair\n                // was actually a selector\n                state.start = state.propertyStart;\n            }\n            if (notify(\"selector\" /* Selector */)) {\n                return;\n            }\n            reset(state);\n        }\n        else if (scanner.eat(58 /* Colon */) && !isKnownSelectorColon(scanner, state)) {\n            // Colon could be one of the following:\n            // — property delimiter: `foo: bar`, must be in block context\n            // — variable delimiter: `$foo: bar`, could be anywhere\n            // — pseudo-selector: `a:hover`, could be anywhere (for LESS and SCSS)\n            // — media query expression: `min-width: 100px`, must be inside expression context\n            // Since I can’t easily detect `:` meaning for sure, we’ll update state\n            // to accumulate possible property name-value pair or selector\n            if (state.propertyStart === -1) {\n                state.propertyStart = state.start;\n            }\n            state.propertyEnd = state.end;\n            state.propertyDelimiter = scanner.pos - 1;\n            state.start = state.end = -1;\n        }\n        else {\n            if (state.start === -1) {\n                state.start = scanner.pos;\n            }\n            if (scanner.eat(40 /* LeftRound */)) {\n                state.expression++;\n            }\n            else if (scanner.eat(41 /* RightRound */)) {\n                state.expression--;\n            }\n            else if (!literal(scanner)) {\n                scanner.pos++;\n            }\n            state.end = scanner.pos;\n        }\n    }\n    if (state.propertyStart !== -1) {\n        // Pending property name\n        if (notify(\"propertyName\" /* PropertyName */, state.propertyDelimiter, state.propertyStart, state.propertyEnd)) {\n            return;\n        }\n    }\n    if (state.start !== -1) {\n        // There’s pending token in state\n        notify(state.propertyStart !== -1 ? \"propertyValue\" /* PropertyValue */ : \"propertyName\" /* PropertyName */, -1);\n    }\n}\nfunction whitespace(scanner) {\n    return scanner.eatWhile(isSpace);\n}\n/**\n * Consumes CSS comments from scanner: `/*  * /`\n * It’s possible that comment may not have closing part\n */\nfunction comment(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(47 /* Slash */) && scanner.eat(42 /* Asterisk */)) {\n        scanner.start = start;\n        while (!scanner.eof()) {\n            if (scanner.eat(42 /* Asterisk */)) {\n                if (scanner.eat(47 /* Slash */)) {\n                    return true;\n                }\n                continue;\n            }\n            scanner.pos++;\n        }\n        return true;\n    }\n    else {\n        scanner.pos = start;\n    }\n    return false;\n}\n/**\n * Consumes single- or double-quoted string literal\n */\nfunction literal(scanner) {\n    const ch = scanner.peek();\n    if (isQuote(ch)) {\n        scanner.start = scanner.pos++;\n        while (!scanner.eof()) {\n            if (scanner.eat(ch) || scanner.eat(10 /* LF */) || scanner.eat(13 /* CR */)) {\n                break;\n            }\n            // Skip escape character, if any\n            scanner.eat(92 /* Backslash */);\n            scanner.pos++;\n        }\n        // Do not throw if string is incomplete\n        return true;\n    }\n}\nfunction reset(state) {\n    state.start = state.end = state.propertyStart = state.propertyEnd = state.propertyDelimiter = -1;\n}\n/**\n * Check if current state is a known selector context for `:` delimiter\n */\nfunction isKnownSelectorColon(scanner, state) {\n    // Either inside expression like `(min-width: 10px)` or pseudo-element `::before`\n    return state.expression || scanner.eatWhile(58 /* Colon */);\n}\n\n// NB: no `Minus` operator, it must be handled differently\nconst operators = [\n    43 /* Plus */, 47 /* Division */, 42 /* Multiplication */,\n    44 /* Comma */\n];\n/**\n * Splits given CSS value into token list\n */\nfunction splitValue(value, offset = 0) {\n    let start = -1;\n    let expression = 0;\n    let pos = 0;\n    const result = [];\n    const scanner = new Scanner(value);\n    while (!scanner.eof()) {\n        pos = scanner.pos;\n        if (scanner.eat(isSpace) || scanner.eat(isOperator) || isMinusOperator(scanner)) {\n            // Use space as value delimiter but only if not in expression context,\n            // e.g. `1 2` are distinct values but `(1 2)` not\n            if (!expression && start !== -1) {\n                result.push([offset + start, offset + pos]);\n                start = -1;\n            }\n            scanner.eatWhile(isSpace);\n        }\n        else {\n            if (start === -1) {\n                start = scanner.pos;\n            }\n            if (scanner.eat(40 /* LeftRound */)) {\n                expression++;\n            }\n            else if (scanner.eat(41 /* RightRound */)) {\n                expression--;\n            }\n            else if (!literal(scanner)) {\n                scanner.pos++;\n            }\n        }\n    }\n    if (start !== -1 && start !== scanner.pos) {\n        result.push([offset + start, offset + scanner.pos]);\n    }\n    return result;\n}\nfunction isOperator(ch) {\n    return operators.includes(ch);\n}\n/**\n * Check if current scanner state is at minus operator\n */\nfunction isMinusOperator(scanner) {\n    // Minus operator is tricky since CSS supports dashes in keyword names like\n    // `no-repeat`\n    const start = scanner.pos;\n    if (scanner.eat(45 /* Minus */) && scanner.eat(isSpace)) {\n        return true;\n    }\n    scanner.pos = start;\n    return false;\n}\n\nfunction match(source, pos) {\n    const pool = [];\n    const stack = [];\n    let result = null;\n    let pendingProperty = null;\n    const releasePending = () => {\n        if (pendingProperty) {\n            releaseRange(pool, pendingProperty);\n            pendingProperty = null;\n        }\n    };\n    scan(source, (type, start, end, delimiter) => {\n        if (type === \"selector\" /* Selector */) {\n            releasePending();\n            stack.push(allocRange(pool, start, end, delimiter));\n        }\n        else if (type === \"blockEnd\" /* BlockEnd */) {\n            releasePending();\n            const parent = stack.pop();\n            if (parent && parent[0] < pos && pos < end) {\n                result = {\n                    type: 'selector',\n                    start: parent[0],\n                    end,\n                    bodyStart: parent[2] + 1,\n                    bodyEnd: start\n                };\n                return false;\n            }\n        }\n        else if (type === \"propertyName\" /* PropertyName */) {\n            releasePending();\n            pendingProperty = allocRange(pool, start, end, delimiter);\n        }\n        else if (type === \"propertyValue\" /* PropertyValue */) {\n            if (pendingProperty && pendingProperty[0] < pos && pos < end) {\n                result = {\n                    type: 'property',\n                    start: pendingProperty[0],\n                    end: delimiter + 1,\n                    bodyStart: start,\n                    bodyEnd: end\n                };\n                return false;\n            }\n            releasePending();\n        }\n    });\n    return result;\n}\n/**\n * Returns balanced CSS model: a list of all ranges that could possibly match\n * given location when moving in outward direction\n */\nfunction balancedOutward(source, pos) {\n    const pool = [];\n    const stack = [];\n    const result = [];\n    let property = null;\n    scan(source, (type, start, end, delimiter) => {\n        if (type === \"selector\" /* Selector */) {\n            stack.push(allocRange(pool, start, end, delimiter));\n        }\n        else if (type === \"blockEnd\" /* BlockEnd */) {\n            const left = stack.pop();\n            if (left && left[0] < pos && end > pos) {\n                // Matching section found\n                const inner = innerRange(source, left[2] + 1, start);\n                inner && push(result, inner);\n                push(result, [left[0], end]);\n            }\n            left && releaseRange(pool, left);\n            if (!stack.length) {\n                return false;\n            }\n        }\n        else if (type === \"propertyName\" /* PropertyName */) {\n            property && releaseRange(pool, property);\n            property = allocRange(pool, start, end, delimiter);\n        }\n        else if (type === \"propertyValue\" /* PropertyValue */) {\n            if (property && property[0] < pos && Math.max(delimiter, end) > pos) {\n                // Push full token and value range\n                push(result, [start, end]);\n                push(result, [property[0], delimiter !== -1 ? delimiter + 1 : end]);\n            }\n        }\n        if (type !== \"propertyName\" /* PropertyName */ && property) {\n            releaseRange(pool, property);\n            property = null;\n        }\n    });\n    return result;\n}\n/**\n * Returns balanced CSS selectors: a list of all ranges that could possibly match\n * given location when moving in inward direction\n */\nfunction balancedInward(source, pos) {\n    // Collecting ranges for inward balancing is a bit trickier: we have to store\n    // first child of every matched selector until we find the one that matches given\n    // location\n    const pool = [];\n    const stack = [];\n    const result = [];\n    let pendingProperty = null;\n    const alloc = (start, end, delimiter) => {\n        if (pool.length) {\n            const range = pool.pop();\n            range.start = start;\n            range.end = end;\n            range.delimiter = delimiter;\n            return range;\n        }\n        return { start, end, delimiter, firstChild: null };\n    };\n    const release = (range) => {\n        range.firstChild = null;\n        pool.push(range);\n    };\n    const releasePending = () => {\n        if (pendingProperty) {\n            release(pendingProperty);\n            pendingProperty = null;\n        }\n    };\n    /**\n     * Pushes given inward range as a first child of current selector only if it’s\n     * not set yet\n     */\n    const pushChild = (start, end, delimiter) => {\n        const parent = last(stack);\n        if (parent && !parent.firstChild) {\n            parent.firstChild = alloc(start, end, delimiter);\n        }\n    };\n    scan(source, (type, start, end, delimiter) => {\n        if (type === \"blockEnd\" /* BlockEnd */) {\n            releasePending();\n            let range = stack.pop();\n            if (!range) {\n                // Some sort of lone closing brace, ignore it\n                return;\n            }\n            if (range.start <= pos && pos <= end) {\n                // Matching selector found: add it and its inner range into result\n                let inner = innerRange(source, range.delimiter + 1, start);\n                push(result, [range.start, end]);\n                inner && push(result, inner);\n                while (range.firstChild) {\n                    const child = range.firstChild;\n                    inner = innerRange(source, child.delimiter + 1, child.end - 1);\n                    push(result, [child.start, child.end]);\n                    inner && push(result, inner);\n                    range = child;\n                }\n                return false;\n            }\n            else {\n                const parent = last(stack);\n                if (parent && !parent.firstChild) {\n                    // No first child in parent node: store current selector\n                    range.end = end;\n                    parent.firstChild = range;\n                }\n                else {\n                    release(range);\n                }\n            }\n        }\n        else if (type === \"propertyName\" /* PropertyName */) {\n            releasePending();\n            pendingProperty = alloc(start, end, delimiter);\n            pushChild(start, end, delimiter);\n        }\n        else if (type === \"propertyValue\" /* PropertyValue */) {\n            if (pendingProperty) {\n                if (pendingProperty.start <= pos && end >= pos) {\n                    // Direct hit into property, no need to look further\n                    push(result, [pendingProperty.start, delimiter + 1]);\n                    push(result, [start, end]);\n                    releasePending();\n                    return false;\n                }\n                const parent = last(stack);\n                if (parent && parent.firstChild && parent.firstChild.start === pendingProperty.start) {\n                    // First child is an expected property name, update its range\n                    // to include property value\n                    parent.firstChild.end = delimiter !== -1 ? delimiter + 1 : end;\n                }\n                releasePending();\n            }\n        }\n        else {\n            // Selector start\n            stack.push(alloc(start, end, delimiter));\n            releasePending();\n        }\n    });\n    stack.length = pool.length = 0;\n    return result;\n}\n/**\n * Returns inner range for given selector bounds: narrows it to first non-empty\n * region. If resulting region is empty, returns `null`\n */\nfunction innerRange(source, start, end) {\n    while (start < end && isSpace(source.charCodeAt(start))) {\n        start++;\n    }\n    while (end > start && isSpace(source.charCodeAt(end - 1))) {\n        end--;\n    }\n    return start !== end ? [start, end] : null;\n}\nfunction allocRange(pool, start, end, delimiter) {\n    if (pool.length) {\n        const range = pool.pop();\n        range[0] = start;\n        range[1] = end;\n        range[2] = delimiter;\n        return range;\n    }\n    return [start, end, delimiter];\n}\nfunction releaseRange(pool, range) {\n    range && pool.push(range);\n    return null;\n}\nfunction push(ranges, range) {\n    const prev = ranges.length ? ranges[ranges.length - 1] : null;\n    if ((!prev || prev[0] !== range[0] || prev[1] !== range[1]) && range[0] !== range[1]) {\n        ranges.push(range);\n    }\n}\nfunction last(arr) {\n    return arr.length ? arr[arr.length - 1] : null;\n}\n\nexport default match;\nexport { balancedInward, balancedOutward, scan, splitValue };\n//# sourceMappingURL=css-matcher.es.js.map\n","import Scanner, { isAlphaNumericWord, isSpace, isQuote as isQuote$1, isNumber, isAlpha, ScannerError } from '@emmetio/scanner';\n\nfunction tokenScanner(tokens) {\n    return {\n        tokens,\n        start: 0,\n        pos: 0,\n        size: tokens.length\n    };\n}\nfunction peek(scanner) {\n    return scanner.tokens[scanner.pos];\n}\nfunction next(scanner) {\n    return scanner.tokens[scanner.pos++];\n}\nfunction slice(scanner, from = scanner.start, to = scanner.pos) {\n    return scanner.tokens.slice(from, to);\n}\nfunction readable(scanner) {\n    return scanner.pos < scanner.size;\n}\nfunction consume(scanner, test) {\n    const token = peek(scanner);\n    if (token && test(token)) {\n        scanner.pos++;\n        return true;\n    }\n    return false;\n}\nfunction error(scanner, message, token = peek(scanner)) {\n    if (token && token.start != null) {\n        message += ` at ${token.start}`;\n    }\n    const err = new Error(message);\n    err['pos'] = token && token.start;\n    return err;\n}\n\nfunction abbreviation(abbr, options = {}) {\n    const scanner = tokenScanner(abbr);\n    const result = statements(scanner, options);\n    if (readable(scanner)) {\n        throw error(scanner, 'Unexpected character');\n    }\n    return result;\n}\nfunction statements(scanner, options) {\n    const result = {\n        type: 'TokenGroup',\n        elements: []\n    };\n    let ctx = result;\n    let node;\n    const stack = [];\n    while (readable(scanner)) {\n        if (node = element(scanner, options) || group(scanner, options)) {\n            ctx.elements.push(node);\n            if (consume(scanner, isChildOperator)) {\n                stack.push(ctx);\n                ctx = node;\n            }\n            else if (consume(scanner, isSiblingOperator)) {\n                continue;\n            }\n            else if (consume(scanner, isClimbOperator)) {\n                do {\n                    if (stack.length) {\n                        ctx = stack.pop();\n                    }\n                } while (consume(scanner, isClimbOperator));\n            }\n        }\n        else {\n            break;\n        }\n    }\n    return result;\n}\n/**\n * Consumes group from given scanner\n */\nfunction group(scanner, options) {\n    if (consume(scanner, isGroupStart)) {\n        const result = statements(scanner, options);\n        const token = next(scanner);\n        if (isBracket(token, 'group', false)) {\n            result.repeat = repeater(scanner);\n        }\n        return result;\n    }\n}\n/**\n * Consumes single element from given scanner\n */\nfunction element(scanner, options) {\n    let attr;\n    const elem = {\n        type: 'TokenElement',\n        name: void 0,\n        attributes: void 0,\n        value: void 0,\n        repeat: void 0,\n        selfClose: false,\n        elements: []\n    };\n    if (elementName(scanner, options)) {\n        elem.name = slice(scanner);\n    }\n    while (readable(scanner)) {\n        scanner.start = scanner.pos;\n        if (!elem.repeat && !isEmpty(elem) && consume(scanner, isRepeater)) {\n            elem.repeat = scanner.tokens[scanner.pos - 1];\n        }\n        else if (!elem.value && text(scanner)) {\n            elem.value = getText(scanner);\n        }\n        else if (attr = shortAttribute(scanner, 'id', options) || shortAttribute(scanner, 'class', options) || attributeSet(scanner)) {\n            if (!elem.attributes) {\n                elem.attributes = Array.isArray(attr) ? attr.slice() : [attr];\n            }\n            else {\n                elem.attributes = elem.attributes.concat(attr);\n            }\n        }\n        else {\n            if (!isEmpty(elem) && consume(scanner, isCloseOperator)) {\n                elem.selfClose = true;\n                if (!elem.repeat && consume(scanner, isRepeater)) {\n                    elem.repeat = scanner.tokens[scanner.pos - 1];\n                }\n            }\n            break;\n        }\n    }\n    return !isEmpty(elem) ? elem : void 0;\n}\n/**\n * Consumes attribute set from given scanner\n */\nfunction attributeSet(scanner) {\n    if (consume(scanner, isAttributeSetStart)) {\n        const attributes = [];\n        let attr;\n        while (readable(scanner)) {\n            if (attr = attribute(scanner)) {\n                attributes.push(attr);\n            }\n            else if (consume(scanner, isAttributeSetEnd)) {\n                break;\n            }\n            else if (!consume(scanner, isWhiteSpace)) {\n                throw error(scanner, `Unexpected \"${peek(scanner).type}\" token`);\n            }\n        }\n        return attributes;\n    }\n}\n/**\n * Consumes attribute shorthand (class or id) from given scanner\n */\nfunction shortAttribute(scanner, type, options) {\n    if (isOperator(peek(scanner), type)) {\n        scanner.pos++;\n        const attr = {\n            name: [createLiteral(type)]\n        };\n        // Consume expression after shorthand start for React-like components\n        if (options.jsx && text(scanner)) {\n            attr.value = getText(scanner);\n            attr.expression = true;\n        }\n        else {\n            attr.value = literal(scanner) ? slice(scanner) : void 0;\n        }\n        return attr;\n    }\n}\n/**\n * Consumes single attribute from given scanner\n */\nfunction attribute(scanner) {\n    if (quoted(scanner)) {\n        // Consumed quoted value: it’s a value for default attribute\n        return {\n            value: slice(scanner)\n        };\n    }\n    if (literal(scanner, true)) {\n        return {\n            name: slice(scanner),\n            value: consume(scanner, isEquals) && (quoted(scanner) || literal(scanner, true))\n                ? slice(scanner)\n                : void 0\n        };\n    }\n}\nfunction repeater(scanner) {\n    return isRepeater(peek(scanner))\n        ? scanner.tokens[scanner.pos++]\n        : void 0;\n}\n/**\n * Consumes quoted value from given scanner, if possible\n */\nfunction quoted(scanner) {\n    const start = scanner.pos;\n    const quote = peek(scanner);\n    if (isQuote(quote)) {\n        scanner.pos++;\n        while (readable(scanner)) {\n            if (isQuote(next(scanner), quote.single)) {\n                scanner.start = start;\n                return true;\n            }\n        }\n        throw error(scanner, 'Unclosed quote', quote);\n    }\n    return false;\n}\n/**\n * Consumes literal (unquoted value) from given scanner\n */\nfunction literal(scanner, allowBrackets) {\n    const start = scanner.pos;\n    const brackets = {\n        attribute: 0,\n        expression: 0,\n        group: 0\n    };\n    while (readable(scanner)) {\n        const token = peek(scanner);\n        if (brackets.expression) {\n            // If we’re inside expression, we should consume all content in it\n            if (isBracket(token, 'expression')) {\n                brackets[token.context] += token.open ? 1 : -1;\n            }\n        }\n        else if (isQuote(token) || isOperator(token) || isWhiteSpace(token) || isRepeater(token)) {\n            break;\n        }\n        else if (isBracket(token)) {\n            if (!allowBrackets) {\n                break;\n            }\n            if (token.open) {\n                brackets[token.context]++;\n            }\n            else if (!brackets[token.context]) {\n                // Stop if found unmatched closing brace: it must be handled\n                // by parent consumer\n                break;\n            }\n            else {\n                brackets[token.context]--;\n            }\n        }\n        scanner.pos++;\n    }\n    if (start !== scanner.pos) {\n        scanner.start = start;\n        return true;\n    }\n    return false;\n}\n/**\n * Consumes element name from given scanner\n */\nfunction elementName(scanner, options) {\n    const start = scanner.pos;\n    if (options.jsx && consume(scanner, isCapitalizedLiteral)) {\n        // Check for edge case: consume immediate capitalized class names\n        // for React-like components, e.g. `Foo.Bar.Baz`\n        while (readable(scanner)) {\n            const { pos } = scanner;\n            if (!consume(scanner, isClassNameOperator) || !consume(scanner, isCapitalizedLiteral)) {\n                scanner.pos = pos;\n                break;\n            }\n        }\n    }\n    while (readable(scanner) && consume(scanner, isElementName)) {\n        // empty\n    }\n    if (scanner.pos !== start) {\n        scanner.start = start;\n        return true;\n    }\n    return false;\n}\n/**\n * Consumes text value from given scanner\n */\nfunction text(scanner) {\n    const start = scanner.pos;\n    if (consume(scanner, isTextStart)) {\n        let brackets = 0;\n        while (readable(scanner)) {\n            const token = next(scanner);\n            if (isBracket(token, 'expression')) {\n                if (token.open) {\n                    brackets++;\n                }\n                else if (!brackets) {\n                    break;\n                }\n                else {\n                    brackets--;\n                }\n            }\n        }\n        scanner.start = start;\n        return true;\n    }\n    return false;\n}\nfunction getText(scanner) {\n    let from = scanner.start;\n    let to = scanner.pos;\n    if (isBracket(scanner.tokens[from], 'expression', true)) {\n        from++;\n    }\n    if (isBracket(scanner.tokens[to - 1], 'expression', false)) {\n        to--;\n    }\n    return slice(scanner, from, to);\n}\nfunction isBracket(token, context, isOpen) {\n    return Boolean(token && token.type === 'Bracket'\n        && (!context || token.context === context)\n        && (isOpen == null || token.open === isOpen));\n}\nfunction isOperator(token, type) {\n    return Boolean(token && token.type === 'Operator' && (!type || token.operator === type));\n}\nfunction isQuote(token, isSingle) {\n    return Boolean(token && token.type === 'Quote' && (isSingle == null || token.single === isSingle));\n}\nfunction isWhiteSpace(token) {\n    return Boolean(token && token.type === 'WhiteSpace');\n}\nfunction isEquals(token) {\n    return isOperator(token, 'equal');\n}\nfunction isRepeater(token) {\n    return Boolean(token && token.type === 'Repeater');\n}\nfunction isLiteral(token) {\n    return token.type === 'Literal';\n}\nfunction isCapitalizedLiteral(token) {\n    if (isLiteral(token)) {\n        const ch = token.value.charCodeAt(0);\n        return ch >= 65 && ch <= 90;\n    }\n    return false;\n}\nfunction isElementName(token) {\n    return token.type === 'Literal' || token.type === 'RepeaterNumber' || token.type === 'RepeaterPlaceholder';\n}\nfunction isClassNameOperator(token) {\n    return isOperator(token, 'class');\n}\nfunction isAttributeSetStart(token) {\n    return isBracket(token, 'attribute', true);\n}\nfunction isAttributeSetEnd(token) {\n    return isBracket(token, 'attribute', false);\n}\nfunction isTextStart(token) {\n    return isBracket(token, 'expression', true);\n}\nfunction isGroupStart(token) {\n    return isBracket(token, 'group', true);\n}\nfunction createLiteral(value) {\n    return { type: 'Literal', value };\n}\nfunction isEmpty(elem) {\n    return !elem.name && !elem.value && !elem.attributes;\n}\nfunction isChildOperator(token) {\n    return isOperator(token, 'child');\n}\nfunction isSiblingOperator(token) {\n    return isOperator(token, 'sibling');\n}\nfunction isClimbOperator(token) {\n    return isOperator(token, 'climb');\n}\nfunction isCloseOperator(token) {\n    return isOperator(token, 'close');\n}\n\n/**\n * If consumes escape character, sets current stream range to escaped value\n */\nfunction escaped(scanner) {\n    if (scanner.eat(92 /* Escape */)) {\n        scanner.start = scanner.pos;\n        if (!scanner.eof()) {\n            scanner.pos++;\n        }\n        return true;\n    }\n    return false;\n}\n\nfunction tokenize(source) {\n    const scanner = new Scanner(source);\n    const result = [];\n    const ctx = {\n        group: 0,\n        attribute: 0,\n        expression: 0,\n        quote: 0\n    };\n    let ch = 0;\n    let token;\n    while (!scanner.eof()) {\n        ch = scanner.peek();\n        token = getToken(scanner, ctx);\n        if (token) {\n            result.push(token);\n            if (token.type === 'Quote') {\n                ctx.quote = ch === ctx.quote ? 0 : ch;\n            }\n            else if (token.type === 'Bracket') {\n                ctx[token.context] += token.open ? 1 : -1;\n            }\n        }\n        else {\n            throw scanner.error('Unexpected character');\n        }\n    }\n    return result;\n}\n/**\n * Returns next token from given scanner, if possible\n */\nfunction getToken(scanner, ctx) {\n    return field(scanner, ctx)\n        || repeaterPlaceholder(scanner)\n        || repeaterNumber(scanner)\n        || repeater$1(scanner)\n        || whiteSpace(scanner)\n        || literal$1(scanner, ctx)\n        || operator(scanner)\n        || quote(scanner)\n        || bracket(scanner);\n}\n/**\n * Consumes literal from given scanner\n */\nfunction literal$1(scanner, ctx) {\n    const start = scanner.pos;\n    let value = '';\n    while (!scanner.eof()) {\n        // Consume escaped sequence no matter of context\n        if (escaped(scanner)) {\n            value += scanner.current();\n            continue;\n        }\n        const ch = scanner.peek();\n        if (ch === ctx.quote || ch === 36 /* Dollar */ || isAllowedOperator(ch, ctx)) {\n            // 1. Found matching quote\n            // 2. The `$` character has special meaning in every context\n            // 3. Depending on context, some characters should be treated as operators\n            break;\n        }\n        if (ctx.expression && ch === 125 /* CurlyBracketClose */) {\n            break;\n        }\n        if (!ctx.quote && !ctx.expression) {\n            // Consuming element name\n            if (!ctx.attribute && !isElementName$1(ch)) {\n                break;\n            }\n            if (isAllowedSpace(ch, ctx) || isAllowedRepeater(ch, ctx) || isQuote$1(ch) || bracketType(ch)) {\n                // Stop for characters not allowed in unquoted literal\n                break;\n            }\n        }\n        value += scanner.string[scanner.pos++];\n    }\n    if (start !== scanner.pos) {\n        scanner.start = start;\n        return {\n            type: 'Literal',\n            value,\n            start,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes white space characters as string literal from given scanner\n */\nfunction whiteSpace(scanner) {\n    const start = scanner.pos;\n    if (scanner.eatWhile(isSpace)) {\n        return {\n            type: 'WhiteSpace',\n            start,\n            end: scanner.pos,\n            value: scanner.substring(start, scanner.pos)\n        };\n    }\n}\n/**\n * Consumes quote from given scanner\n */\nfunction quote(scanner) {\n    const ch = scanner.peek();\n    if (isQuote$1(ch)) {\n        return {\n            type: 'Quote',\n            single: ch === 39 /* SingleQuote */,\n            start: scanner.pos++,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes bracket from given scanner\n */\nfunction bracket(scanner) {\n    const ch = scanner.peek();\n    const context = bracketType(ch);\n    if (context) {\n        return {\n            type: 'Bracket',\n            open: isOpenBracket(ch),\n            context,\n            start: scanner.pos++,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes operator from given scanner\n */\nfunction operator(scanner) {\n    const op = operatorType(scanner.peek());\n    if (op) {\n        return {\n            type: 'Operator',\n            operator: op,\n            start: scanner.pos++,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes node repeat token from current stream position and returns its\n * parsed value\n */\nfunction repeater$1(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(42 /* Asterisk */)) {\n        scanner.start = scanner.pos;\n        let count = 1;\n        let implicit = false;\n        if (scanner.eatWhile(isNumber)) {\n            count = Number(scanner.current());\n        }\n        else {\n            implicit = true;\n        }\n        return {\n            type: 'Repeater',\n            count,\n            value: 0,\n            implicit,\n            start,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes repeater placeholder `$#` from given scanner\n */\nfunction repeaterPlaceholder(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(36 /* Dollar */) && scanner.eat(35 /* Hash */)) {\n        return {\n            type: 'RepeaterPlaceholder',\n            value: void 0,\n            start,\n            end: scanner.pos\n        };\n    }\n    scanner.pos = start;\n}\n/**\n * Consumes numbering token like `$` from given scanner state\n */\nfunction repeaterNumber(scanner) {\n    const start = scanner.pos;\n    if (scanner.eatWhile(36 /* Dollar */)) {\n        const size = scanner.pos - start;\n        let reverse = false;\n        let base = 1;\n        let parent = 0;\n        if (scanner.eat(64 /* At */)) {\n            // Consume numbering modifiers\n            while (scanner.eat(94 /* Climb */)) {\n                parent++;\n            }\n            reverse = scanner.eat(45 /* Dash */);\n            scanner.start = scanner.pos;\n            if (scanner.eatWhile(isNumber)) {\n                base = Number(scanner.current());\n            }\n        }\n        scanner.start = start;\n        return {\n            type: 'RepeaterNumber',\n            size,\n            reverse,\n            base,\n            parent,\n            start,\n            end: scanner.pos\n        };\n    }\n}\nfunction field(scanner, ctx) {\n    const start = scanner.pos;\n    // Fields are allowed inside expressions and attributes\n    if ((ctx.expression || ctx.attribute) && scanner.eat(36 /* Dollar */) && scanner.eat(123 /* CurlyBracketOpen */)) {\n        scanner.start = scanner.pos;\n        let index;\n        let name = '';\n        if (scanner.eatWhile(isNumber)) {\n            // It’s a field\n            index = Number(scanner.current());\n            name = scanner.eat(58 /* Colon */) ? consumePlaceholder(scanner) : '';\n        }\n        else if (isAlpha(scanner.peek())) {\n            // It’s a variable\n            name = consumePlaceholder(scanner);\n        }\n        if (scanner.eat(125 /* CurlyBracketClose */)) {\n            return {\n                type: 'Field',\n                index, name,\n                start,\n                end: scanner.pos\n            };\n        }\n        throw scanner.error('Expecting }');\n    }\n    // If we reached here then there’s no valid field here, revert\n    // back to starting position\n    scanner.pos = start;\n}\n/**\n * Consumes a placeholder: value right after `:` in field. Could be empty\n */\nfunction consumePlaceholder(stream) {\n    const stack = [];\n    stream.start = stream.pos;\n    while (!stream.eof()) {\n        if (stream.eat(123 /* CurlyBracketOpen */)) {\n            stack.push(stream.pos);\n        }\n        else if (stream.eat(125 /* CurlyBracketClose */)) {\n            if (!stack.length) {\n                stream.pos--;\n                break;\n            }\n            stack.pop();\n        }\n        else {\n            stream.pos++;\n        }\n    }\n    if (stack.length) {\n        stream.pos = stack.pop();\n        throw stream.error(`Expecting }`);\n    }\n    return stream.current();\n}\n/**\n * Check if given character code is an operator and it’s allowed in current context\n */\nfunction isAllowedOperator(ch, ctx) {\n    const op = operatorType(ch);\n    if (!op || ctx.quote || ctx.expression) {\n        // No operators inside quoted values or expressions\n        return false;\n    }\n    // Inside attributes, only `equals` is allowed\n    return !ctx.attribute || op === 'equal';\n}\n/**\n * Check if given character is a space character and is allowed to be consumed\n * as a space token in current context\n */\nfunction isAllowedSpace(ch, ctx) {\n    return isSpace(ch) && !ctx.expression;\n}\n/**\n * Check if given character can be consumed as repeater in current context\n */\nfunction isAllowedRepeater(ch, ctx) {\n    return ch === 42 /* Asterisk */ && !ctx.attribute && !ctx.expression;\n}\n/**\n * If given character is a bracket, returns it’s type\n */\nfunction bracketType(ch) {\n    if (ch === 40 /* RoundBracketOpen */ || ch === 41 /* RoundBracketClose */) {\n        return 'group';\n    }\n    if (ch === 91 /* SquareBracketOpen */ || ch === 93 /* SquareBracketClose */) {\n        return 'attribute';\n    }\n    if (ch === 123 /* CurlyBracketOpen */ || ch === 125 /* CurlyBracketClose */) {\n        return 'expression';\n    }\n}\n/**\n * If given character is an operator, returns it’s type\n */\nfunction operatorType(ch) {\n    return (ch === 62 /* Child */ && 'child')\n        || (ch === 43 /* Sibling */ && 'sibling')\n        || (ch === 94 /* Climb */ && 'climb')\n        || (ch === 46 /* Dot */ && 'class')\n        || (ch === 35 /* Hash */ && 'id')\n        || (ch === 47 /* Slash */ && 'close')\n        || (ch === 61 /* Equals */ && 'equal')\n        || void 0;\n}\n/**\n * Check if given character is an open bracket\n */\nfunction isOpenBracket(ch) {\n    return ch === 123 /* CurlyBracketOpen */\n        || ch === 91 /* SquareBracketOpen */\n        || ch === 40 /* RoundBracketOpen */;\n}\n/**\n * Check if given character is allowed in element name\n */\nfunction isElementName$1(ch) {\n    return isAlphaNumericWord(ch)\n        || ch === 45 /* Dash */\n        || ch === 58 /* Colon */\n        || ch === 33 /* Excl */;\n}\n\nconst operators = {\n    child: '>',\n    class: '.',\n    climb: '^',\n    id: '#',\n    equal: '=',\n    close: '/',\n    sibling: '+'\n};\nconst tokenVisitor = {\n    Literal(token) {\n        return token.value;\n    },\n    Quote(token) {\n        return token.single ? '\\'' : '\"';\n    },\n    Bracket(token) {\n        if (token.context === 'attribute') {\n            return token.open ? '[' : ']';\n        }\n        else if (token.context === 'expression') {\n            return token.open ? '{' : '}';\n        }\n        else {\n            return token.open ? '(' : '}';\n        }\n    },\n    Operator(token) {\n        return operators[token.operator];\n    },\n    Field(token, state) {\n        if (token.index != null) {\n            // It’s a field: by default, return TextMate-compatible field\n            return token.name\n                ? `\\${${token.index}:${token.name}}`\n                : `\\${${token.index}`;\n        }\n        else if (token.name) {\n            // It’s a variable\n            return state.getVariable(token.name);\n        }\n        return '';\n    },\n    RepeaterPlaceholder(token, state) {\n        // Find closest implicit repeater\n        let repeater;\n        for (let i = state.repeaters.length - 1; i >= 0; i--) {\n            if (state.repeaters[i].implicit) {\n                repeater = state.repeaters[i];\n                break;\n            }\n        }\n        state.inserted = true;\n        return state.getText(repeater && repeater.value);\n    },\n    RepeaterNumber(token, state) {\n        let value = 1;\n        const lastIx = state.repeaters.length - 1;\n        // const repeaterIx = Math.max(0, state.repeaters.length - 1 - token.parent);\n        const repeater = state.repeaters[lastIx];\n        if (repeater) {\n            value = token.reverse\n                ? token.base + repeater.count - repeater.value - 1\n                : token.base + repeater.value;\n            if (token.parent) {\n                const parentIx = Math.max(0, lastIx - token.parent);\n                if (parentIx !== lastIx) {\n                    const parentRepeater = state.repeaters[parentIx];\n                    value += repeater.count * parentRepeater.value;\n                }\n            }\n        }\n        let result = String(value);\n        while (result.length < token.size) {\n            result = '0' + result;\n        }\n        return result;\n    },\n    WhiteSpace(token) {\n        return token.value;\n    }\n};\n/**\n * Converts given value token to string\n */\nfunction stringify(token, state) {\n    if (!tokenVisitor[token.type]) {\n        throw new Error(`Unknown token ${token.type}`);\n    }\n    return tokenVisitor[token.type](token, state);\n}\n\nconst urlRegex = /^((https?:|ftp:|file:)?\\/\\/|(www|ftp)\\.)[^ ]*$/;\nconst emailRegex = /^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,5}$/;\n/**\n * Converts given token-based abbreviation into simplified and unrolled node-based\n * abbreviation\n */\nfunction convert(abbr, options = {}) {\n    let textInserted = false;\n    let cleanText;\n    if (options.text) {\n        if (Array.isArray(options.text)) {\n            cleanText = options.text.filter(s => s.trim());\n        }\n        else {\n            cleanText = options.text;\n        }\n    }\n    const result = {\n        type: 'Abbreviation',\n        children: convertGroup(abbr, {\n            inserted: false,\n            repeaters: [],\n            text: options.text,\n            cleanText,\n            repeatGuard: options.maxRepeat || Number.POSITIVE_INFINITY,\n            getText(pos) {\n                var _a;\n                textInserted = true;\n                let value;\n                if (Array.isArray(options.text)) {\n                    if (pos !== undefined && pos >= 0 && pos < cleanText.length) {\n                        return cleanText[pos];\n                    }\n                    value = pos !== undefined ? options.text[pos] : options.text.join('\\n');\n                }\n                else {\n                    value = (_a = options.text) !== null && _a !== void 0 ? _a : '';\n                }\n                return value;\n            },\n            getVariable(name) {\n                const varValue = options.variables && options.variables[name];\n                return varValue != null ? varValue : name;\n            }\n        })\n    };\n    if (options.text != null && !textInserted) {\n        // Text given but no implicitly repeated elements: insert it into\n        // deepest child\n        const deepest = deepestNode(last(result.children));\n        if (deepest) {\n            const text = Array.isArray(options.text) ? options.text.join('\\n') : options.text;\n            insertText(deepest, text);\n            if (deepest.name === 'a' && options.href) {\n                // Automatically update value of `<a>` element if inserting URL or email\n                insertHref(deepest, text);\n            }\n        }\n    }\n    return result;\n}\n/**\n * Converts given statement to abbreviation nodes\n */\nfunction convertStatement(node, state) {\n    let result = [];\n    if (node.repeat) {\n        // Node is repeated: we should create copies of given node\n        // and supply context token with actual repeater state\n        const original = node.repeat;\n        const repeat = Object.assign({}, original);\n        repeat.count = repeat.implicit && Array.isArray(state.text)\n            ? state.cleanText.length\n            : (repeat.count || 1);\n        let items;\n        state.repeaters.push(repeat);\n        for (let i = 0; i < repeat.count; i++) {\n            repeat.value = i;\n            node.repeat = repeat;\n            items = isGroup(node)\n                ? convertGroup(node, state)\n                : convertElement(node, state);\n            if (repeat.implicit && !state.inserted) {\n                // It’s an implicit repeater but no repeater placeholders found inside,\n                // we should insert text into deepest node\n                const target = last(items);\n                const deepest = target && deepestNode(target);\n                if (deepest) {\n                    insertText(deepest, state.getText(repeat.value));\n                }\n            }\n            result = result.concat(items);\n            // We should output at least one repeated item even if it’s reached\n            // repeat limit\n            if (--state.repeatGuard <= 0) {\n                break;\n            }\n        }\n        state.repeaters.pop();\n        node.repeat = original;\n        if (repeat.implicit) {\n            state.inserted = true;\n        }\n    }\n    else {\n        result = result.concat(isGroup(node) ? convertGroup(node, state) : convertElement(node, state));\n    }\n    return result;\n}\nfunction convertElement(node, state) {\n    let children = [];\n    const elem = {\n        type: 'AbbreviationNode',\n        name: node.name && stringifyName(node.name, state),\n        value: node.value && stringifyValue(node.value, state),\n        attributes: void 0,\n        children,\n        repeat: node.repeat && Object.assign({}, node.repeat),\n        selfClosing: node.selfClose,\n    };\n    let result = [elem];\n    for (const child of node.elements) {\n        children = children.concat(convertStatement(child, state));\n    }\n    if (node.attributes) {\n        elem.attributes = [];\n        for (const attr of node.attributes) {\n            elem.attributes.push(convertAttribute(attr, state));\n        }\n    }\n    // In case if current node is a text-only snippet without fields, we should\n    // put all children as siblings\n    if (!elem.name && !elem.attributes && elem.value && !elem.value.some(isField)) {\n        // XXX it’s unclear that `children` is not bound to `elem`\n        // due to concat operation\n        result = result.concat(children);\n    }\n    else {\n        elem.children = children;\n    }\n    return result;\n}\nfunction convertGroup(node, state) {\n    let result = [];\n    for (const child of node.elements) {\n        result = result.concat(convertStatement(child, state));\n    }\n    if (node.repeat) {\n        result = attachRepeater(result, node.repeat);\n    }\n    return result;\n}\nfunction convertAttribute(node, state) {\n    let implied = false;\n    let isBoolean = false;\n    let valueType = node.expression ? 'expression' : 'raw';\n    let value;\n    const name = node.name && stringifyName(node.name, state);\n    if (name && name[0] === '!') {\n        implied = true;\n    }\n    if (name && name[name.length - 1] === '.') {\n        isBoolean = true;\n    }\n    if (node.value) {\n        const tokens = node.value.slice();\n        if (isQuote(tokens[0])) {\n            // It’s a quoted value: remove quotes from output but mark attribute\n            // value as quoted\n            const quote = tokens.shift();\n            if (tokens.length && last(tokens).type === quote.type) {\n                tokens.pop();\n            }\n            valueType = quote.single ? 'singleQuote' : 'doubleQuote';\n        }\n        else if (isBracket(tokens[0], 'expression', true)) {\n            // Value is expression: remove brackets but mark value type\n            valueType = 'expression';\n            tokens.shift();\n            if (isBracket(last(tokens), 'expression', false)) {\n                tokens.pop();\n            }\n        }\n        value = stringifyValue(tokens, state);\n    }\n    return {\n        name: isBoolean || implied\n            ? name.slice(implied ? 1 : 0, isBoolean ? -1 : void 0)\n            : name,\n        value,\n        boolean: isBoolean,\n        implied,\n        valueType\n    };\n}\n/**\n * Converts given token list to string\n */\nfunction stringifyName(tokens, state) {\n    let str = '';\n    for (let i = 0; i < tokens.length; i++) {\n        str += stringify(tokens[i], state);\n    }\n    return str;\n}\n/**\n * Converts given token list to value list\n */\nfunction stringifyValue(tokens, state) {\n    const result = [];\n    let str = '';\n    for (let i = 0, token; i < tokens.length; i++) {\n        token = tokens[i];\n        if (isField(token)) {\n            // We should keep original fields in output since some editors has their\n            // own syntax for field or doesn’t support fields at all so we should\n            // capture actual field location in output stream\n            if (str) {\n                result.push(str);\n                str = '';\n            }\n            result.push(token);\n        }\n        else {\n            str += stringify(token, state);\n        }\n    }\n    if (str) {\n        result.push(str);\n    }\n    return result;\n}\nfunction isGroup(node) {\n    return node.type === 'TokenGroup';\n}\nfunction isField(token) {\n    return typeof token === 'object' && token.type === 'Field' && token.index != null;\n}\nfunction last(arr) {\n    return arr[arr.length - 1];\n}\nfunction deepestNode(node) {\n    return node.children.length ? deepestNode(last(node.children)) : node;\n}\nfunction insertText(node, text) {\n    if (node.value) {\n        const lastToken = last(node.value);\n        if (typeof lastToken === 'string') {\n            node.value[node.value.length - 1] += text;\n        }\n        else {\n            node.value.push(text);\n        }\n    }\n    else {\n        node.value = [text];\n    }\n}\nfunction insertHref(node, text) {\n    var _a;\n    let href = '';\n    if (urlRegex.test(text)) {\n        href = text;\n        if (!/\\w+:/.test(href) && !href.startsWith('//')) {\n            href = `http://${href}`;\n        }\n    }\n    else if (emailRegex.test(text)) {\n        href = `mailto:${text}`;\n    }\n    const hrefAttribute = (_a = node.attributes) === null || _a === void 0 ? void 0 : _a.find(attr => attr.name === 'href');\n    if (!hrefAttribute) {\n        node.attributes = [{ name: 'href', value: [href], valueType: 'doubleQuote' }];\n    }\n    else if (!hrefAttribute.value) {\n        hrefAttribute.value = [href];\n    }\n}\nfunction attachRepeater(items, repeater) {\n    for (const item of items) {\n        if (!item.repeat) {\n            item.repeat = Object.assign({}, repeater);\n        }\n    }\n    return items;\n}\n\n/**\n * Parses given abbreviation into node tree\n */\nfunction parseAbbreviation(abbr, options) {\n    try {\n        const tokens = typeof abbr === 'string' ? tokenize(abbr) : abbr;\n        return convert(abbreviation(tokens, options), options);\n    }\n    catch (err) {\n        if (err instanceof ScannerError && typeof abbr === 'string') {\n            err.message += `\\n${abbr}\\n${'-'.repeat(err.pos)}^`;\n        }\n        throw err;\n    }\n}\n\nexport default parseAbbreviation;\nexport { convert, getToken, abbreviation as parse, tokenize };\n//# sourceMappingURL=abbreviation.es.js.map\n","import Scanner, { isNumber, isAlpha, isAlphaWord, isQuote, isSpace, isAlphaNumericWord, ScannerError } from '@emmetio/scanner';\n\nfunction tokenize(abbr, isValue) {\n    let brackets = 0;\n    let token;\n    const scanner = new Scanner(abbr);\n    const tokens = [];\n    while (!scanner.eof()) {\n        token = getToken(scanner, brackets === 0 && !isValue);\n        if (!token) {\n            throw scanner.error('Unexpected character');\n        }\n        if (token.type === 'Bracket') {\n            if (!brackets && token.open) {\n                mergeTokens(scanner, tokens);\n            }\n            brackets += token.open ? 1 : -1;\n            if (brackets < 0) {\n                throw scanner.error('Unexpected bracket', token.start);\n            }\n        }\n        tokens.push(token);\n        // Forcibly consume next operator after unit-less numeric value or color:\n        // next dash `-` must be used as value delimiter\n        if (shouldConsumeDashAfter(token) && (token = operator(scanner))) {\n            tokens.push(token);\n        }\n    }\n    return tokens;\n}\n/**\n * Returns next token from given scanner, if possible\n */\nfunction getToken(scanner, short) {\n    return field(scanner)\n        || numberValue(scanner)\n        || colorValue(scanner)\n        || stringValue(scanner)\n        || bracket(scanner)\n        || operator(scanner)\n        || whiteSpace(scanner)\n        || literal(scanner, short);\n}\nfunction field(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(36 /* Dollar */) && scanner.eat(123 /* CurlyBracketOpen */)) {\n        scanner.start = scanner.pos;\n        let index;\n        let name = '';\n        if (scanner.eatWhile(isNumber)) {\n            // It’s a field\n            index = Number(scanner.current());\n            name = scanner.eat(58 /* Colon */) ? consumePlaceholder(scanner) : '';\n        }\n        else if (isAlpha(scanner.peek())) {\n            // It’s a variable\n            name = consumePlaceholder(scanner);\n        }\n        if (scanner.eat(125 /* CurlyBracketClose */)) {\n            return {\n                type: 'Field',\n                index, name,\n                start,\n                end: scanner.pos\n            };\n        }\n        throw scanner.error('Expecting }');\n    }\n    // If we reached here then there’s no valid field here, revert\n    // back to starting position\n    scanner.pos = start;\n}\n/**\n * Consumes a placeholder: value right after `:` in field. Could be empty\n */\nfunction consumePlaceholder(stream) {\n    const stack = [];\n    stream.start = stream.pos;\n    while (!stream.eof()) {\n        if (stream.eat(123 /* CurlyBracketOpen */)) {\n            stack.push(stream.pos);\n        }\n        else if (stream.eat(125 /* CurlyBracketClose */)) {\n            if (!stack.length) {\n                stream.pos--;\n                break;\n            }\n            stack.pop();\n        }\n        else {\n            stream.pos++;\n        }\n    }\n    if (stack.length) {\n        stream.pos = stack.pop();\n        throw stream.error(`Expecting }`);\n    }\n    return stream.current();\n}\n/**\n * Consumes literal from given scanner\n * @param short Use short notation for consuming value.\n * The difference between “short” and “full” notation is that first one uses\n * alpha characters only and used for extracting keywords from abbreviation,\n * while “full” notation also supports numbers and dashes\n */\nfunction literal(scanner, short) {\n    const start = scanner.pos;\n    if (scanner.eat(isIdentPrefix)) {\n        // SCSS or LESS variable\n        // NB a bit dirty hack: if abbreviation starts with identifier prefix,\n        // consume alpha characters only to allow embedded variables\n        scanner.eatWhile(start ? isKeyword : isLiteral);\n    }\n    else if (scanner.eat(isAlphaWord)) {\n        scanner.eatWhile(short ? isLiteral : isKeyword);\n    }\n    else {\n        // Allow dots only at the beginning of literal\n        scanner.eat(46 /* Dot */);\n        scanner.eatWhile(isLiteral);\n    }\n    if (start !== scanner.pos) {\n        scanner.start = start;\n        return createLiteral(scanner, scanner.start = start);\n    }\n}\nfunction createLiteral(scanner, start = scanner.start, end = scanner.pos) {\n    return {\n        type: 'Literal',\n        value: scanner.substring(start, end),\n        start,\n        end\n    };\n}\n/**\n * Consumes numeric CSS value (number with optional unit) from current stream,\n * if possible\n */\nfunction numberValue(scanner) {\n    const start = scanner.pos;\n    if (consumeNumber(scanner)) {\n        scanner.start = start;\n        const rawValue = scanner.current();\n        // eat unit, which can be a % or alpha word\n        scanner.start = scanner.pos;\n        scanner.eat(37 /* Percent */) || scanner.eatWhile(isAlphaWord);\n        return {\n            type: 'NumberValue',\n            value: Number(rawValue),\n            rawValue,\n            unit: scanner.current(),\n            start,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes quoted string value from given scanner\n */\nfunction stringValue(scanner) {\n    const ch = scanner.peek();\n    const start = scanner.pos;\n    let finished = false;\n    if (isQuote(ch)) {\n        scanner.pos++;\n        while (!scanner.eof()) {\n            // Do not throw error on malformed string\n            if (scanner.eat(ch)) {\n                finished = true;\n                break;\n            }\n            else {\n                scanner.pos++;\n            }\n        }\n        scanner.start = start;\n        return {\n            type: 'StringValue',\n            value: scanner.substring(start + 1, scanner.pos - (finished ? 1 : 0)),\n            quote: ch === 39 /* SingleQuote */ ? 'single' : 'double',\n            start,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes a color token from given string\n */\nfunction colorValue(scanner) {\n    // supported color variations:\n    // #abc   → #aabbccc\n    // #0     → #000000\n    // #fff.5 → rgba(255, 255, 255, 0.5)\n    // #t     → transparent\n    const start = scanner.pos;\n    if (scanner.eat(35 /* Hash */)) {\n        const valueStart = scanner.pos;\n        let color = '';\n        let alpha = '';\n        if (scanner.eatWhile(isHex)) {\n            color = scanner.substring(valueStart, scanner.pos);\n            alpha = colorAlpha(scanner);\n        }\n        else if (scanner.eat(116 /* Transparent */)) {\n            color = '0';\n            alpha = colorAlpha(scanner) || '0';\n        }\n        else {\n            alpha = colorAlpha(scanner);\n        }\n        if (color || alpha || scanner.eof()) {\n            const { r, g, b, a } = parseColor(color, alpha);\n            return {\n                type: 'ColorValue',\n                r, g, b, a,\n                raw: scanner.substring(start + 1, scanner.pos),\n                start,\n                end: scanner.pos\n            };\n        }\n        else {\n            // Consumed # but no actual value: invalid color value, treat it as literal\n            return createLiteral(scanner, start);\n        }\n    }\n    scanner.pos = start;\n}\n/**\n * Consumes alpha value of color: `.1`\n */\nfunction colorAlpha(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(46 /* Dot */)) {\n        scanner.start = start;\n        if (scanner.eatWhile(isNumber)) {\n            return scanner.current();\n        }\n        return '1';\n    }\n    return '';\n}\n/**\n * Consumes white space characters as string literal from given scanner\n */\nfunction whiteSpace(scanner) {\n    const start = scanner.pos;\n    if (scanner.eatWhile(isSpace)) {\n        return {\n            type: 'WhiteSpace',\n            start,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes bracket from given scanner\n */\nfunction bracket(scanner) {\n    const ch = scanner.peek();\n    if (isBracket(ch)) {\n        return {\n            type: 'Bracket',\n            open: ch === 40 /* RoundBracketOpen */,\n            start: scanner.pos++,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Consumes operator from given scanner\n */\nfunction operator(scanner) {\n    const op = operatorType(scanner.peek());\n    if (op) {\n        return {\n            type: 'Operator',\n            operator: op,\n            start: scanner.pos++,\n            end: scanner.pos\n        };\n    }\n}\n/**\n * Eats number value from given stream\n * @return Returns `true` if number was consumed\n */\nfunction consumeNumber(stream) {\n    const start = stream.pos;\n    stream.eat(45 /* Dash */);\n    const afterNegative = stream.pos;\n    const hasDecimal = stream.eatWhile(isNumber);\n    const prevPos = stream.pos;\n    if (stream.eat(46 /* Dot */)) {\n        // It’s perfectly valid to have numbers like `1.`, which enforces\n        // value to float unit type\n        const hasFloat = stream.eatWhile(isNumber);\n        if (!hasDecimal && !hasFloat) {\n            // Lone dot\n            stream.pos = prevPos;\n        }\n    }\n    // Edge case: consumed dash only: not a number, bail-out\n    if (stream.pos === afterNegative) {\n        stream.pos = start;\n    }\n    return stream.pos !== start;\n}\nfunction isIdentPrefix(code) {\n    return code === 64 /* At */ || code === 36 /* Dollar */;\n}\n/**\n * If given character is an operator, returns it’s type\n */\nfunction operatorType(ch) {\n    return (ch === 43 /* Sibling */ && \"+\" /* Sibling */)\n        || (ch === 33 /* Excl */ && \"!\" /* Important */)\n        || (ch === 44 /* Comma */ && \",\" /* ArgumentDelimiter */)\n        || (ch === 58 /* Colon */ && \":\" /* PropertyDelimiter */)\n        || (ch === 45 /* Dash */ && \"-\" /* ValueDelimiter */)\n        || void 0;\n}\n/**\n * Check if given code is a hex value (/0-9a-f/)\n */\nfunction isHex(code) {\n    return isNumber(code) || isAlpha(code, 65, 70); // A-F\n}\nfunction isKeyword(code) {\n    return isAlphaNumericWord(code) || code === 45 /* Dash */;\n}\nfunction isBracket(code) {\n    return code === 40 /* RoundBracketOpen */ || code === 41 /* RoundBracketClose */;\n}\nfunction isLiteral(code) {\n    return isAlphaWord(code) || code === 37 /* Percent */ || code === 47 /* Slash */;\n}\n/**\n * Parses given color value from abbreviation into RGBA format\n */\nfunction parseColor(value, alpha) {\n    let r = '0';\n    let g = '0';\n    let b = '0';\n    let a = Number(alpha != null && alpha !== '' ? alpha : 1);\n    if (value === 't') {\n        a = 0;\n    }\n    else {\n        switch (value.length) {\n            case 0:\n                break;\n            case 1:\n                r = g = b = value + value;\n                break;\n            case 2:\n                r = g = b = value;\n                break;\n            case 3:\n                r = value[0] + value[0];\n                g = value[1] + value[1];\n                b = value[2] + value[2];\n                break;\n            default:\n                value += value;\n                r = value.slice(0, 2);\n                g = value.slice(2, 4);\n                b = value.slice(4, 6);\n        }\n    }\n    return {\n        r: parseInt(r, 16),\n        g: parseInt(g, 16),\n        b: parseInt(b, 16),\n        a\n    };\n}\n/**\n * Check if scanner reader must consume dash after given token.\n * Used in cases where user must explicitly separate numeric values\n */\nfunction shouldConsumeDashAfter(token) {\n    return token.type === 'ColorValue' || (token.type === 'NumberValue' && !token.unit);\n}\n/**\n * Merges last adjacent tokens into a single literal.\n * This function is used to overcome edge case when function name was parsed\n * as a list of separate tokens. For example, a `scale3d()` value will be\n * parsed as literal and number tokens (`scale` and `3d`) which is a perfectly\n * valid abbreviation but undesired result. This function will detect last adjacent\n * literal and number values and combine them into single literal\n */\nfunction mergeTokens(scanner, tokens) {\n    let start = 0;\n    let end = 0;\n    while (tokens.length) {\n        const token = last(tokens);\n        if (token.type === 'Literal' || token.type === 'NumberValue') {\n            start = token.start;\n            if (!end) {\n                end = token.end;\n            }\n            tokens.pop();\n        }\n        else {\n            break;\n        }\n    }\n    if (start !== end) {\n        tokens.push(createLiteral(scanner, start, end));\n    }\n}\nfunction last(arr) {\n    return arr[arr.length - 1];\n}\n\nfunction tokenScanner(tokens) {\n    return {\n        tokens,\n        start: 0,\n        pos: 0,\n        size: tokens.length\n    };\n}\nfunction peek(scanner) {\n    return scanner.tokens[scanner.pos];\n}\nfunction readable(scanner) {\n    return scanner.pos < scanner.size;\n}\nfunction consume(scanner, test) {\n    if (test(peek(scanner))) {\n        scanner.pos++;\n        return true;\n    }\n    return false;\n}\nfunction error(scanner, message, token = peek(scanner)) {\n    if (token && token.start != null) {\n        message += ` at ${token.start}`;\n    }\n    const err = new Error(message);\n    err['pos'] = token && token.start;\n    return err;\n}\n\nfunction parser(tokens, options = {}) {\n    const scanner = tokenScanner(tokens);\n    const result = [];\n    let property;\n    while (readable(scanner)) {\n        if (property = consumeProperty(scanner, options)) {\n            result.push(property);\n        }\n        else if (!consume(scanner, isSiblingOperator)) {\n            throw error(scanner, 'Unexpected token');\n        }\n    }\n    return result;\n}\n/**\n * Consumes single CSS property\n */\nfunction consumeProperty(scanner, options) {\n    let name;\n    let important = false;\n    let valueFragment;\n    const value = [];\n    const token = peek(scanner);\n    const valueMode = !!options.value;\n    if (!valueMode && isLiteral$1(token) && !isFunctionStart(scanner)) {\n        scanner.pos++;\n        name = token.value;\n        // Consume any following value delimiter after property name\n        consume(scanner, isValueDelimiter);\n    }\n    // Skip whitespace right after property name, if any\n    if (valueMode) {\n        consume(scanner, isWhiteSpace);\n    }\n    while (readable(scanner)) {\n        if (consume(scanner, isImportant)) {\n            important = true;\n        }\n        else if (valueFragment = consumeValue(scanner, valueMode)) {\n            value.push(valueFragment);\n        }\n        else if (!consume(scanner, isFragmentDelimiter)) {\n            break;\n        }\n    }\n    if (name || value.length || important) {\n        return { name, value, important };\n    }\n}\n/**\n * Consumes single value fragment, e.g. all value tokens before comma\n */\nfunction consumeValue(scanner, inArgument) {\n    const result = [];\n    let token;\n    let args;\n    while (readable(scanner)) {\n        token = peek(scanner);\n        if (isValue(token)) {\n            scanner.pos++;\n            if (isLiteral$1(token) && (args = consumeArguments(scanner))) {\n                result.push({\n                    type: 'FunctionCall',\n                    name: token.value,\n                    arguments: args\n                });\n            }\n            else {\n                result.push(token);\n            }\n        }\n        else if (isValueDelimiter(token) || (inArgument && isWhiteSpace(token))) {\n            scanner.pos++;\n        }\n        else {\n            break;\n        }\n    }\n    return result.length\n        ? { type: 'CSSValue', value: result }\n        : void 0;\n}\nfunction consumeArguments(scanner) {\n    const start = scanner.pos;\n    if (consume(scanner, isOpenBracket)) {\n        const args = [];\n        let value;\n        while (readable(scanner) && !consume(scanner, isCloseBracket)) {\n            if (value = consumeValue(scanner, true)) {\n                args.push(value);\n            }\n            else if (!consume(scanner, isWhiteSpace) && !consume(scanner, isArgumentDelimiter)) {\n                throw error(scanner, 'Unexpected token');\n            }\n        }\n        scanner.start = start;\n        return args;\n    }\n}\nfunction isLiteral$1(token) {\n    return token && token.type === 'Literal';\n}\nfunction isBracket$1(token, open) {\n    return token && token.type === 'Bracket' && (open == null || token.open === open);\n}\nfunction isOpenBracket(token) {\n    return isBracket$1(token, true);\n}\nfunction isCloseBracket(token) {\n    return isBracket$1(token, false);\n}\nfunction isWhiteSpace(token) {\n    return token && token.type === 'WhiteSpace';\n}\nfunction isOperator(token, operator) {\n    return token && token.type === 'Operator' && (!operator || token.operator === operator);\n}\nfunction isSiblingOperator(token) {\n    return isOperator(token, \"+\" /* Sibling */);\n}\nfunction isArgumentDelimiter(token) {\n    return isOperator(token, \",\" /* ArgumentDelimiter */);\n}\nfunction isFragmentDelimiter(token) {\n    return isArgumentDelimiter(token);\n}\nfunction isImportant(token) {\n    return isOperator(token, \"!\" /* Important */);\n}\nfunction isValue(token) {\n    return token.type === 'StringValue'\n        || token.type === 'ColorValue'\n        || token.type === 'NumberValue'\n        || token.type === 'Literal'\n        || token.type === 'Field';\n}\nfunction isValueDelimiter(token) {\n    return isOperator(token, \":\" /* PropertyDelimiter */)\n        || isOperator(token, \"-\" /* ValueDelimiter */);\n}\nfunction isFunctionStart(scanner) {\n    const t1 = scanner.tokens[scanner.pos];\n    const t2 = scanner.tokens[scanner.pos + 1];\n    return t1 && t2 && isLiteral$1(t1) && t2.type === 'Bracket';\n}\n\n/**\n * Parses given abbreviation into property set\n */\nfunction parse(abbr, options) {\n    try {\n        const tokens = typeof abbr === 'string' ? tokenize(abbr, options && options.value) : abbr;\n        return parser(tokens, options);\n    }\n    catch (err) {\n        if (err instanceof ScannerError && typeof abbr === 'string') {\n            err.message += `\\n${abbr}\\n${'-'.repeat(err.pos)}^`;\n        }\n        throw err;\n    }\n}\n\nexport default parse;\nexport { getToken, parser, tokenize };\n","import parse$2 from '@emmetio/abbreviation';\nexport { default as markupAbbreviation } from '@emmetio/abbreviation';\nimport parse$3 from '@emmetio/css-abbreviation';\nexport { default as stylesheetAbbreviation } from '@emmetio/css-abbreviation';\n\n/**\n * Merges attributes in current node: de-duplicates attributes with the same name\n * and merges class names\n */\nfunction mergeAttributes(node, config) {\n    if (!node.attributes) {\n        return;\n    }\n    const attributes = [];\n    const lookup = {};\n    for (const attr of node.attributes) {\n        if (attr.name) {\n            const attrName = attr.name;\n            if (attrName in lookup) {\n                const prev = lookup[attrName];\n                if (attrName === 'class') {\n                    prev.value = mergeValue(prev.value, attr.value, ' ');\n                }\n                else {\n                    mergeDeclarations(prev, attr, config);\n                }\n            }\n            else {\n                // Create new attribute instance so we can safely modify it later\n                attributes.push(lookup[attrName] = Object.assign({}, attr));\n            }\n        }\n        else {\n            attributes.push(attr);\n        }\n    }\n    node.attributes = attributes;\n}\n/**\n * Merges two token lists into single list. Adjacent strings are merged together\n */\nfunction mergeValue(prev, next, glue) {\n    if (prev && next) {\n        if (prev.length && glue) {\n            append(prev, glue);\n        }\n        for (const t of next) {\n            append(prev, t);\n        }\n        return prev;\n    }\n    const result = prev || next;\n    return result && result.slice();\n}\n/**\n * Merges data from `src` attribute into `dest` and returns it\n */\nfunction mergeDeclarations(dest, src, config) {\n    dest.name = src.name;\n    if (!config.options['output.reverseAttributes']) {\n        dest.value = src.value;\n    }\n    // Keep high-priority properties\n    if (!dest.implied) {\n        dest.implied = src.implied;\n    }\n    if (!dest.boolean) {\n        dest.boolean = src.boolean;\n    }\n    if (dest.valueType !== 'expression') {\n        dest.valueType = src.valueType;\n    }\n    return dest;\n}\nfunction append(tokens, value) {\n    const lastIx = tokens.length - 1;\n    if (typeof tokens[lastIx] === 'string' && typeof value === 'string') {\n        tokens[lastIx] += value;\n    }\n    else {\n        tokens.push(value);\n    }\n}\n\n/**\n * Walks over each child node of given markup abbreviation AST node (not including\n * given one) and invokes `fn` on each node.\n * The `fn` callback accepts context node, list of ancestor nodes and optional\n * state object\n */\nfunction walk(node, fn, state) {\n    const ancestors = [node];\n    const callback = (ctx) => {\n        fn(ctx, ancestors, state);\n        ancestors.push(ctx);\n        ctx.children.forEach(callback);\n        ancestors.pop();\n    };\n    node.children.forEach(callback);\n}\n/**\n * Finds node which is the deepest for in current node or node itself.\n */\nfunction findDeepest(node) {\n    let parent;\n    while (node.children.length) {\n        parent = node;\n        node = node.children[node.children.length - 1];\n    }\n    return { parent, node };\n}\nfunction isNode(node) {\n    return node.type === 'AbbreviationNode';\n}\n\n/**\n * Finds matching snippet from `registry` and resolves it into a parsed abbreviation.\n * Resolved node is then updated or replaced with matched abbreviation tree.\n *\n * A HTML registry basically contains aliases to another Emmet abbreviations,\n * e.g. a predefined set of name, attributes and so on, possibly a complex\n * abbreviation with multiple elements. So we have to get snippet, parse it\n * and recursively resolve it.\n */\nfunction resolveSnippets(abbr, config) {\n    const stack = [];\n    const reversed = config.options['output.reverseAttributes'];\n    const resolve = (child) => {\n        const snippet = child.name && config.snippets[child.name];\n        // A snippet in stack means circular reference.\n        // It can be either a user error or a perfectly valid snippet like\n        // \"img\": \"img[src alt]/\", e.g. an element with predefined shape.\n        // In any case, simply stop parsing and keep element as is\n        if (!snippet || stack.includes(snippet)) {\n            return null;\n        }\n        const snippetAbbr = parse$2(snippet, config);\n        stack.push(snippet);\n        walkResolve(snippetAbbr, resolve);\n        stack.pop();\n        // Add attributes from current node into every top-level node of parsed abbreviation\n        for (const topNode of snippetAbbr.children) {\n            if (child.attributes) {\n                const from = topNode.attributes || [];\n                const to = child.attributes || [];\n                topNode.attributes = reversed ? to.concat(from) : from.concat(to);\n            }\n            mergeNodes(child, topNode);\n        }\n        return snippetAbbr;\n    };\n    walkResolve(abbr, resolve);\n    return abbr;\n}\nfunction walkResolve(node, resolve, config) {\n    let children = [];\n    for (const child of node.children) {\n        const resolved = resolve(child);\n        if (resolved) {\n            children = children.concat(resolved.children);\n            const deepest = findDeepest(resolved);\n            if (isNode(deepest.node)) {\n                deepest.node.children = deepest.node.children.concat(walkResolve(child, resolve));\n            }\n        }\n        else {\n            children.push(child);\n            child.children = walkResolve(child, resolve);\n        }\n    }\n    return node.children = children;\n}\n/**\n * Adds data from first node into second node\n */\nfunction mergeNodes(from, to) {\n    if (from.selfClosing) {\n        to.selfClosing = true;\n    }\n    if (from.value != null) {\n        to.value = from.value;\n    }\n    if (from.repeat) {\n        to.repeat = from.repeat;\n    }\n}\n\nfunction createOutputStream(options, level = 0) {\n    return {\n        options,\n        value: '',\n        level,\n        offset: 0,\n        line: 0,\n        column: 0\n    };\n}\n/**\n * Pushes plain string into output stream without newline processing\n */\nfunction push(stream, text) {\n    const processText = stream.options['output.text'];\n    _push(stream, processText(text, stream.offset, stream.line, stream.column));\n}\n/**\n * Pushes given string with possible newline formatting into output\n */\nfunction pushString(stream, value) {\n    // If given value contains newlines, we should push content line-by-line and\n    // use `pushNewline()` to maintain proper line/column state\n    const lines = splitByLines(value);\n    for (let i = 0, il = lines.length - 1; i <= il; i++) {\n        push(stream, lines[i]);\n        if (i !== il) {\n            pushNewline(stream, true);\n        }\n    }\n}\n/**\n * Pushes new line into given output stream\n */\nfunction pushNewline(stream, indent) {\n    const baseIndent = stream.options['output.baseIndent'];\n    const newline = stream.options['output.newline'];\n    push(stream, newline + baseIndent);\n    stream.line++;\n    stream.column = baseIndent.length;\n    if (indent) {\n        pushIndent(stream, indent === true ? stream.level : indent);\n    }\n}\n/**\n * Adds indentation of `size` to current output stream\n */\nfunction pushIndent(stream, size = stream.level) {\n    const indent = stream.options['output.indent'];\n    push(stream, indent.repeat(Math.max(size, 0)));\n}\n/**\n * Pushes field/tabstop into output stream\n */\nfunction pushField(stream, index, placeholder) {\n    const field = stream.options['output.field'];\n    // NB: use `_push` instead of `push` to skip text processing\n    _push(stream, field(index, placeholder, stream.offset, stream.line, stream.column));\n}\n/**\n * Returns given tag name formatted according to given config\n */\nfunction tagName(name, config) {\n    return strCase(name, config.options['output.tagCase']);\n}\n/**\n * Returns given attribute name formatted according to given config\n */\nfunction attrName(name, config) {\n    return strCase(name, config.options['output.attributeCase']);\n}\n/**\n * Returns character for quoting value of given attribute\n */\nfunction attrQuote(attr, config, isOpen) {\n    if (attr.valueType === 'expression') {\n        return isOpen ? '{' : '}';\n    }\n    return config.options['output.attributeQuotes'] === 'single' ? '\\'' : '\"';\n}\n/**\n * Check if given attribute is boolean\n */\nfunction isBooleanAttribute(attr, config) {\n    return attr.boolean\n        || config.options['output.booleanAttributes'].includes((attr.name || '').toLowerCase());\n}\n/**\n * Returns a token for self-closing tag, depending on current options\n */\nfunction selfClose(config) {\n    switch (config.options['output.selfClosingStyle']) {\n        case 'xhtml': return ' /';\n        case 'xml': return '/';\n        default: return '';\n    }\n}\n/**\n * Check if given tag name belongs to inline-level element\n * @param node Parsed node or tag name\n */\nfunction isInline(node, config) {\n    if (typeof node === 'string') {\n        return config.options.inlineElements.includes(node.toLowerCase());\n    }\n    // inline node is a node either with inline-level name or text-only node\n    return node.name ? isInline(node.name, config) : Boolean(node.value && !node.attributes);\n}\n/**\n * Splits given text by lines\n */\nfunction splitByLines(text) {\n    return text.split(/\\r\\n|\\r|\\n/g);\n}\n/**\n * Pushes raw string into output stream without any processing\n */\nfunction _push(stream, text) {\n    stream.value += text;\n    stream.offset += text.length;\n    stream.column += text.length;\n}\nfunction strCase(str, type) {\n    if (type) {\n        return type === 'upper' ? str.toUpperCase() : str.toLowerCase();\n    }\n    return str;\n}\n\nconst elementMap = {\n    p: 'span',\n    ul: 'li',\n    ol: 'li',\n    table: 'tr',\n    tr: 'td',\n    tbody: 'tr',\n    thead: 'tr',\n    tfoot: 'tr',\n    colgroup: 'col',\n    select: 'option',\n    optgroup: 'option',\n    audio: 'source',\n    video: 'source',\n    object: 'param',\n    map: 'area'\n};\nfunction implicitTag(node, ancestors, config) {\n    if (!node.name && node.attributes) {\n        resolveImplicitTag(node, ancestors, config);\n    }\n}\nfunction resolveImplicitTag(node, ancestors, config) {\n    const parent = getParentElement(ancestors);\n    const contextName = config.context ? config.context.name : '';\n    const parentName = lowercase(parent ? parent.name : contextName);\n    node.name = elementMap[parentName]\n        || (isInline(parentName, config) ? 'span' : 'div');\n}\nfunction lowercase(str) {\n    return (str || '').toLowerCase();\n}\n/**\n * Returns closest element node from given ancestors list\n */\nfunction getParentElement(ancestors) {\n    for (let i = ancestors.length - 1; i >= 0; i--) {\n        const elem = ancestors[i];\n        if (isNode(elem)) {\n            return elem;\n        }\n    }\n}\n\nvar latin = {\n\t\"common\": [\"lorem\", \"ipsum\", \"dolor\", \"sit\", \"amet\", \"consectetur\", \"adipisicing\", \"elit\"],\n\t\"words\": [\"exercitationem\", \"perferendis\", \"perspiciatis\", \"laborum\", \"eveniet\",\n\t\t\"sunt\", \"iure\", \"nam\", \"nobis\", \"eum\", \"cum\", \"officiis\", \"excepturi\",\n\t\t\"odio\", \"consectetur\", \"quasi\", \"aut\", \"quisquam\", \"vel\", \"eligendi\",\n\t\t\"itaque\", \"non\", \"odit\", \"tempore\", \"quaerat\", \"dignissimos\",\n\t\t\"facilis\", \"neque\", \"nihil\", \"expedita\", \"vitae\", \"vero\", \"ipsum\",\n\t\t\"nisi\", \"animi\", \"cumque\", \"pariatur\", \"velit\", \"modi\", \"natus\",\n\t\t\"iusto\", \"eaque\", \"sequi\", \"illo\", \"sed\", \"ex\", \"et\", \"voluptatibus\",\n\t\t\"tempora\", \"veritatis\", \"ratione\", \"assumenda\", \"incidunt\", \"nostrum\",\n\t\t\"placeat\", \"aliquid\", \"fuga\", \"provident\", \"praesentium\", \"rem\",\n\t\t\"necessitatibus\", \"suscipit\", \"adipisci\", \"quidem\", \"possimus\",\n\t\t\"voluptas\", \"debitis\", \"sint\", \"accusantium\", \"unde\", \"sapiente\",\n\t\t\"voluptate\", \"qui\", \"aspernatur\", \"laudantium\", \"soluta\", \"amet\",\n\t\t\"quo\", \"aliquam\", \"saepe\", \"culpa\", \"libero\", \"ipsa\", \"dicta\",\n\t\t\"reiciendis\", \"nesciunt\", \"doloribus\", \"autem\", \"impedit\", \"minima\",\n\t\t\"maiores\", \"repudiandae\", \"ipsam\", \"obcaecati\", \"ullam\", \"enim\",\n\t\t\"totam\", \"delectus\", \"ducimus\", \"quis\", \"voluptates\", \"dolores\",\n\t\t\"molestiae\", \"harum\", \"dolorem\", \"quia\", \"voluptatem\", \"molestias\",\n\t\t\"magni\", \"distinctio\", \"omnis\", \"illum\", \"dolorum\", \"voluptatum\", \"ea\",\n\t\t\"quas\", \"quam\", \"corporis\", \"quae\", \"blanditiis\", \"atque\", \"deserunt\",\n\t\t\"laboriosam\", \"earum\", \"consequuntur\", \"hic\", \"cupiditate\",\n\t\t\"quibusdam\", \"accusamus\", \"ut\", \"rerum\", \"error\", \"minus\", \"eius\",\n\t\t\"ab\", \"ad\", \"nemo\", \"fugit\", \"officia\", \"at\", \"in\", \"id\", \"quos\",\n\t\t\"reprehenderit\", \"numquam\", \"iste\", \"fugiat\", \"sit\", \"inventore\",\n\t\t\"beatae\", \"repellendus\", \"magnam\", \"recusandae\", \"quod\", \"explicabo\",\n\t\t\"doloremque\", \"aperiam\", \"consequatur\", \"asperiores\", \"commodi\",\n\t\t\"optio\", \"dolor\", \"labore\", \"temporibus\", \"repellat\", \"veniam\",\n\t\t\"architecto\", \"est\", \"esse\", \"mollitia\", \"nulla\", \"a\", \"similique\",\n\t\t\"eos\", \"alias\", \"dolore\", \"tenetur\", \"deleniti\", \"porro\", \"facere\",\n\t\t\"maxime\", \"corrupti\"]\n};\n\nvar ru = {\n\t\"common\": [\"далеко-далеко\", \"за\", \"словесными\", \"горами\", \"в стране\", \"гласных\", \"и согласных\", \"живут\", \"рыбные\", \"тексты\"],\n\t\"words\": [\"вдали\", \"от всех\", \"они\", \"буквенных\", \"домах\", \"на берегу\", \"семантика\",\n\t\t\"большого\", \"языкового\", \"океана\", \"маленький\", \"ручеек\", \"даль\",\n\t\t\"журчит\", \"по всей\", \"обеспечивает\", \"ее\",\"всеми\", \"необходимыми\",\n\t\t\"правилами\", \"эта\", \"парадигматическая\", \"страна\", \"которой\", \"жаренные\",\n\t\t\"предложения\", \"залетают\", \"прямо\", \"рот\", \"даже\", \"всемогущая\",\n\t\t\"пунктуация\", \"не\", \"имеет\", \"власти\", \"над\", \"рыбными\", \"текстами\",\n\t\t\"ведущими\", \"безорфографичный\", \"образ\", \"жизни\", \"однажды\", \"одна\",\n\t\t\"маленькая\", \"строчка\",\"рыбного\", \"текста\", \"имени\", \"lorem\", \"ipsum\",\n\t\t\"решила\", \"выйти\", \"большой\", \"мир\", \"грамматики\", \"великий\", \"оксмокс\",\n\t\t\"предупреждал\", \"о\", \"злых\", \"запятых\", \"диких\", \"знаках\", \"вопроса\",\n\t\t\"коварных\", \"точках\", \"запятой\", \"но\", \"текст\", \"дал\", \"сбить\",\n\t\t\"себя\", \"толку\", \"он\", \"собрал\", \"семь\", \"своих\", \"заглавных\", \"букв\",\n\t\t\"подпоясал\", \"инициал\", \"за\", \"пояс\", \"пустился\", \"дорогу\",\n\t\t\"взобравшись\", \"первую\", \"вершину\", \"курсивных\", \"гор\", \"бросил\",\n\t\t\"последний\", \"взгляд\", \"назад\", \"силуэт\", \"своего\", \"родного\", \"города\",\n\t\t\"буквоград\", \"заголовок\", \"деревни\", \"алфавит\", \"подзаголовок\", \"своего\",\n\t\t\"переулка\", \"грустный\", \"реторический\", \"вопрос\", \"скатился\", \"его\",\n\t\t\"щеке\", \"продолжил\", \"свой\", \"путь\", \"дороге\", \"встретил\", \"рукопись\",\n\t\t\"она\", \"предупредила\",  \"моей\", \"все\", \"переписывается\", \"несколько\",\n\t\t\"раз\", \"единственное\", \"что\", \"меня\", \"осталось\", \"это\", \"приставка\",\n\t\t\"возвращайся\", \"ты\", \"лучше\", \"свою\", \"безопасную\", \"страну\", \"послушавшись\",\n\t\t\"рукописи\", \"наш\", \"продолжил\", \"свой\", \"путь\", \"вскоре\", \"ему\",\n\t\t\"повстречался\", \"коварный\", \"составитель\", \"рекламных\", \"текстов\",\n\t\t\"напоивший\", \"языком\", \"речью\", \"заманивший\", \"свое\", \"агентство\",\n\t\t\"которое\", \"использовало\", \"снова\", \"снова\", \"своих\", \"проектах\",\n\t\t\"если\", \"переписали\", \"то\", \"живет\", \"там\", \"до\", \"сих\", \"пор\"]\n};\n\nvar sp = {\n\t\"common\": [\"mujer\", \"uno\", \"dolor\", \"más\", \"de\", \"poder\", \"mismo\", \"si\"],\n\t\"words\": [\"ejercicio\", \"preferencia\", \"perspicacia\", \"laboral\", \"paño\",\n\t\t\"suntuoso\", \"molde\", \"namibia\", \"planeador\", \"mirar\", \"demás\", \"oficinista\", \"excepción\",\n\t\t\"odio\", \"consecuencia\", \"casi\", \"auto\", \"chicharra\", \"velo\", \"elixir\",\n\t\t\"ataque\", \"no\", \"odio\", \"temporal\", \"cuórum\", \"dignísimo\",\n\t\t\"facilismo\", \"letra\", \"nihilista\", \"expedición\", \"alma\", \"alveolar\", \"aparte\",\n\t\t\"león\", \"animal\", \"como\", \"paria\", \"belleza\", \"modo\", \"natividad\",\n\t\t\"justo\", \"ataque\", \"séquito\", \"pillo\", \"sed\", \"ex\", \"y\", \"voluminoso\",\n\t\t\"temporalidad\", \"verdades\", \"racional\", \"asunción\", \"incidente\", \"marejada\",\n\t\t\"placenta\", \"amanecer\", \"fuga\", \"previsor\", \"presentación\", \"lejos\",\n\t\t\"necesariamente\", \"sospechoso\", \"adiposidad\", \"quindío\", \"pócima\",\n\t\t\"voluble\", \"débito\", \"sintió\", \"accesorio\", \"falda\", \"sapiencia\",\n\t\t\"volutas\", \"queso\", \"permacultura\", \"laudo\", \"soluciones\", \"entero\",\n\t\t\"pan\", \"litro\", \"tonelada\", \"culpa\", \"libertario\", \"mosca\", \"dictado\",\n\t\t\"reincidente\", \"nascimiento\", \"dolor\", \"escolar\", \"impedimento\", \"mínima\",\n\t\t\"mayores\", \"repugnante\", \"dulce\", \"obcecado\", \"montaña\", \"enigma\",\n\t\t\"total\", \"deletéreo\", \"décima\", \"cábala\", \"fotografía\", \"dolores\",\n\t\t\"molesto\", \"olvido\", \"paciencia\", \"resiliencia\", \"voluntad\", \"molestias\",\n\t\t\"magnífico\", \"distinción\", \"ovni\", \"marejada\", \"cerro\", \"torre\", \"y\",\n\t\t\"abogada\", \"manantial\", \"corporal\", \"agua\", \"crepúsculo\", \"ataque\", \"desierto\",\n\t\t\"laboriosamente\", \"angustia\", \"afortunado\", \"alma\", \"encefalograma\",\n\t\t\"materialidad\", \"cosas\", \"o\", \"renuncia\", \"error\", \"menos\", \"conejo\",\n\t\t\"abadía\", \"analfabeto\", \"remo\", \"fugacidad\", \"oficio\", \"en\", \"almácigo\", \"vos\", \"pan\",\n\t\t\"represión\", \"números\", \"triste\", \"refugiado\", \"trote\", \"inventor\",\n\t\t\"corchea\", \"repelente\", \"magma\", \"recusado\", \"patrón\", \"explícito\",\n\t\t\"paloma\", \"síndrome\", \"inmune\", \"autoinmune\", \"comodidad\",\n\t\t\"ley\", \"vietnamita\", \"demonio\", \"tasmania\", \"repeler\", \"apéndice\",\n\t\t\"arquitecto\", \"columna\", \"yugo\", \"computador\", \"mula\", \"a\", \"propósito\",\n\t\t\"fantasía\", \"alias\", \"rayo\", \"tenedor\", \"deleznable\", \"ventana\", \"cara\",\n\t\t\"anemia\", \"corrupto\"]\n};\n\nconst vocabularies = { ru, sp, latin };\nconst reLorem = /^lorem([a-z]*)(\\d*)(-\\d*)?$/i;\nfunction lorem(node, ancestors, config) {\n    let m;\n    if (node.name && (m = node.name.match(reLorem))) {\n        const db = vocabularies[m[1]] || vocabularies.latin;\n        const minWordCount = m[2] ? Math.max(1, Number(m[2])) : 30;\n        const maxWordCount = m[3] ? Math.max(minWordCount, Number(m[3].slice(1))) : minWordCount;\n        const wordCount = rand(minWordCount, maxWordCount);\n        const repeat = node.repeat || findRepeater(ancestors);\n        node.name = node.attributes = void 0;\n        node.value = [paragraph(db, wordCount, !repeat || repeat.value === 0)];\n        if (node.repeat && ancestors.length > 1) {\n            resolveImplicitTag(node, ancestors, config);\n        }\n    }\n}\n/**\n * Returns random integer between <code>from</code> and <code>to</code> values\n */\nfunction rand(from, to) {\n    return Math.floor(Math.random() * (to - from) + from);\n}\nfunction sample(arr, count) {\n    const len = arr.length;\n    const iterations = Math.min(len, count);\n    const result = [];\n    while (result.length < iterations) {\n        const str = arr[rand(0, len)];\n        if (!result.includes(str)) {\n            result.push(str);\n        }\n    }\n    return result;\n}\nfunction choice(val) {\n    return val[rand(0, val.length - 1)];\n}\nfunction sentence(words, end) {\n    if (words.length) {\n        words = [capitalize(words[0])].concat(words.slice(1));\n    }\n    return words.join(' ') + (end || choice('?!...')); // more dots than question marks\n}\nfunction capitalize(word) {\n    return word[0].toUpperCase() + word.slice(1);\n}\n/**\n * Insert commas at randomly selected words. This function modifies values\n * inside `words` array\n */\nfunction insertCommas(words) {\n    if (words.length < 2) {\n        return words;\n    }\n    words = words.slice();\n    const len = words.length;\n    const hasComma = /,$/;\n    let totalCommas = 0;\n    if (len > 3 && len <= 6) {\n        totalCommas = rand(0, 1);\n    }\n    else if (len > 6 && len <= 12) {\n        totalCommas = rand(0, 2);\n    }\n    else {\n        totalCommas = rand(1, 4);\n    }\n    for (let i = 0, pos; i < totalCommas; i++) {\n        pos = rand(0, len - 2);\n        if (!hasComma.test(words[pos])) {\n            words[pos] += ',';\n        }\n    }\n    return words;\n}\n/**\n * Generate a paragraph of \"Lorem ipsum\" text\n * @param dict Words dictionary\n * @param wordCount Words count in paragraph\n * @param startWithCommon Should paragraph start with common \"lorem ipsum\" sentence.\n */\nfunction paragraph(dict, wordCount, startWithCommon) {\n    const result = [];\n    let totalWords = 0;\n    let words;\n    if (startWithCommon && dict.common) {\n        words = dict.common.slice(0, wordCount);\n        totalWords += words.length;\n        result.push(sentence(insertCommas(words), '.'));\n    }\n    while (totalWords < wordCount) {\n        words = sample(dict.words, Math.min(rand(2, 30), wordCount - totalWords));\n        totalWords += words.length;\n        result.push(sentence(insertCommas(words)));\n    }\n    return result.join(' ');\n}\nfunction findRepeater(ancestors) {\n    for (let i = ancestors.length - 1; i >= 0; i--) {\n        const element = ancestors[i];\n        if (element.type === 'AbbreviationNode' && element.repeat) {\n            return element.repeat;\n        }\n    }\n}\n\n/**\n * JSX transformer: replaces `class` and `for` attributes with `className` and\n * `htmlFor` attributes respectively\n */\nfunction jsx(node) {\n    if (node.attributes) {\n        node.attributes.forEach(rename);\n    }\n}\nfunction rename(attr) {\n    if (attr.name === 'class') {\n        attr.name = 'className';\n    }\n    else if (attr.name === 'for') {\n        attr.name = 'htmlFor';\n    }\n}\n\n/**\n * XSL transformer: removes `select` attributes from certain nodes that contain\n * children\n */\nfunction xsl(node) {\n    if (matchesName(node.name) && node.attributes && (node.children.length || node.value)) {\n        node.attributes = node.attributes.filter(isAllowed);\n    }\n}\nfunction isAllowed(attr) {\n    return attr.name !== 'select';\n}\nfunction matchesName(name) {\n    return name === 'xsl:variable' || name === 'xsl:with-param';\n}\n\nconst reElement = /^(-+)([a-z0-9]+[a-z0-9-]*)/i;\nconst reModifier = /^(_+)([a-z0-9]+[a-z0-9-_]*)/i;\nconst blockCandidates1 = (className) => /^[a-z]\\-/i.test(className);\nconst blockCandidates2 = (className) => /^[a-z]/i.test(className);\nfunction bem(node, ancestors, config) {\n    expandClassNames(node);\n    expandShortNotation(node, ancestors, config);\n}\n/**\n * Expands existing class names in BEM notation in given `node`.\n * For example, if node contains `b__el_mod` class name, this method ensures\n * that element contains `b__el` class as well\n */\nfunction expandClassNames(node) {\n    const data = getBEMData(node);\n    const classNames = [];\n    for (const cl of data.classNames) {\n        // remove all modifiers and element prefixes from class name to get a base element name\n        const ix = cl.indexOf('_');\n        if (ix > 0 && !cl.startsWith('-')) {\n            classNames.push(cl.slice(0, ix));\n            classNames.push(cl.slice(ix));\n        }\n        else {\n            classNames.push(cl);\n        }\n    }\n    if (classNames.length) {\n        data.classNames = classNames.filter(uniqueClass);\n        data.block = findBlockName(data.classNames);\n        updateClass(node, data.classNames.join(' '));\n    }\n}\n/**\n * Expands short BEM notation, e.g. `-element` and `_modifier`\n */\nfunction expandShortNotation(node, ancestors, config) {\n    const data = getBEMData(node);\n    const classNames = [];\n    const { options } = config;\n    const path = ancestors.slice(1).concat(node);\n    for (let cl of data.classNames) {\n        let prefix = '';\n        let m;\n        const originalClass = cl;\n        // parse element definition (could be only one)\n        if (m = cl.match(reElement)) {\n            prefix = getBlockName(path, m[1].length, config.context) + options['bem.element'] + m[2];\n            classNames.push(prefix);\n            cl = cl.slice(m[0].length);\n        }\n        // parse modifiers definitions\n        if (m = cl.match(reModifier)) {\n            if (!prefix) {\n                prefix = getBlockName(path, m[1].length);\n                classNames.push(prefix);\n            }\n            classNames.push(`${prefix}${options['bem.modifier']}${m[2]}`);\n            cl = cl.slice(m[0].length);\n        }\n        if (cl === originalClass) {\n            // class name wasn’t modified: it’s not a BEM-specific class,\n            // add it as-is into output\n            classNames.push(originalClass);\n        }\n    }\n    const arrClassNames = classNames.filter(uniqueClass);\n    if (arrClassNames.length) {\n        updateClass(node, arrClassNames.join(' '));\n    }\n}\n/**\n * Returns BEM data from given abbreviation node\n */\nfunction getBEMData(node) {\n    if (!node._bem) {\n        let classValue = '';\n        if (node.attributes) {\n            for (const attr of node.attributes) {\n                if (attr.name === 'class' && attr.value) {\n                    classValue = stringifyValue(attr.value);\n                    break;\n                }\n            }\n        }\n        node._bem = parseBEM(classValue);\n    }\n    return node._bem;\n}\nfunction getBEMDataFromContext(context) {\n    if (!context._bem) {\n        context._bem = parseBEM(context.attributes && context.attributes.class || '');\n    }\n    return context._bem;\n}\n/**\n * Parses BEM data from given class name\n */\nfunction parseBEM(classValue) {\n    const classNames = classValue ? classValue.split(/\\s+/) : [];\n    return {\n        classNames,\n        block: findBlockName(classNames)\n    };\n}\n/**\n * Returns block name for given `node` by `prefix`, which tells the depth of\n * of parent node lookup\n */\nfunction getBlockName(ancestors, depth = 0, context) {\n    const maxParentIx = 0;\n    let parentIx = Math.max(ancestors.length - depth, maxParentIx);\n    do {\n        const parent = ancestors[parentIx];\n        if (parent) {\n            const data = getBEMData(parent);\n            if (data.block) {\n                return data.block;\n            }\n        }\n    } while (maxParentIx < parentIx--);\n    if (context) {\n        const data = getBEMDataFromContext(context);\n        if (data.block) {\n            return data.block;\n        }\n    }\n    return '';\n}\nfunction findBlockName(classNames) {\n    return find(classNames, blockCandidates1)\n        || find(classNames, blockCandidates2)\n        || void 0;\n}\n/**\n * Finds class name from given list which may be used as block name\n */\nfunction find(classNames, filter) {\n    for (const cl of classNames) {\n        if (reElement.test(cl) || reModifier.test(cl)) {\n            break;\n        }\n        if (filter(cl)) {\n            return cl;\n        }\n    }\n}\nfunction updateClass(node, value) {\n    for (const attr of node.attributes) {\n        if (attr.name === 'class') {\n            attr.value = [value];\n            break;\n        }\n    }\n}\nfunction stringifyValue(value) {\n    let result = '';\n    for (const t of value) {\n        result += typeof t === 'string' ? t : t.name;\n    }\n    return result;\n}\nfunction uniqueClass(item, ix, arr) {\n    return !!item && arr.indexOf(item) === ix;\n}\n\nfunction walk$1(abbr, visitor, state) {\n    const callback = (ctx, index, items) => {\n        const { parent, current } = state;\n        state.parent = current;\n        state.current = ctx;\n        visitor(ctx, index, items, state, next);\n        state.current = current;\n        state.parent = parent;\n    };\n    const next = (node, index, items) => {\n        state.ancestors.push(state.current);\n        callback(node, index, items);\n        state.ancestors.pop();\n    };\n    abbr.children.forEach(callback);\n}\nfunction createWalkState(config) {\n    return {\n        // @ts-ignore: Will set value in iterator\n        current: null,\n        parent: void 0,\n        ancestors: [],\n        config,\n        field: 1,\n        out: createOutputStream(config.options)\n    };\n}\n\nconst caret = [{ type: 'Field', index: 0, name: '' }];\n/**\n * Check if given node is a snippet: a node without name and attributes\n */\nfunction isSnippet(node) {\n    return node ? !node.name && !node.attributes : false;\n}\n/**\n * Check if given node is inline-level element, e.g. element with explicitly\n * defined node name\n */\nfunction isInlineElement(node, config) {\n    return node ? isInline(node, config) : false;\n}\n/**\n * Check if given value token is a field\n */\nfunction isField(token) {\n    return typeof token === 'object' && token.type === 'Field';\n}\nfunction pushTokens(tokens, state) {\n    const { out } = state;\n    let largestIndex = -1;\n    for (const t of tokens) {\n        if (typeof t === 'string') {\n            pushString(out, t);\n        }\n        else {\n            pushField(out, state.field + t.index, t.name);\n            if (t.index > largestIndex) {\n                largestIndex = t.index;\n            }\n        }\n    }\n    if (largestIndex !== -1) {\n        state.field += largestIndex + 1;\n    }\n}\n/**\n * Splits given value token by lines: returns array where each entry is a token list\n * for a single line\n */\nfunction splitByLines$1(tokens) {\n    const result = [];\n    let line = [];\n    for (const t of tokens) {\n        if (typeof t === 'string') {\n            const lines = t.split(/\\r\\n?|\\n/g);\n            line.push(lines.shift() || '');\n            while (lines.length) {\n                result.push(line);\n                line = [lines.shift() || ''];\n            }\n        }\n        else {\n            line.push(t);\n        }\n    }\n    line.length && result.push(line);\n    return result;\n}\n/**\n * Check if given attribute should be outputted\n */\nfunction shouldOutputAttribute(attr) {\n    // In case if attribute is implied, check if it has a defined value:\n    // either non-empty value or quoted empty value\n    return !attr.implied || attr.valueType !== 'raw' || (!!attr.value && attr.value.length > 0);\n}\n\n/**\n * Splits given string into template tokens.\n * Template is a string which contains placeholders which are uppercase names\n * between `[` and `]`, for example: `[PLACEHOLDER]`.\n * Unlike other templates, a placeholder may contain extra characters before and\n * after name: `[%PLACEHOLDER.]`. If data for `PLACEHOLDER` is defined, it will\n * be outputted with with these extra character, otherwise will be completely omitted.\n */\nfunction template(text) {\n    const tokens = [];\n    const scanner = { pos: 0, text };\n    let placeholder;\n    let offset = scanner.pos;\n    let pos = scanner.pos;\n    while (scanner.pos < scanner.text.length) {\n        pos = scanner.pos;\n        if (placeholder = consumePlaceholder(scanner)) {\n            if (offset !== scanner.pos) {\n                tokens.push(text.slice(offset, pos));\n            }\n            tokens.push(placeholder);\n            offset = scanner.pos;\n        }\n        else {\n            scanner.pos++;\n        }\n    }\n    if (offset !== scanner.pos) {\n        tokens.push(text.slice(offset));\n    }\n    return tokens;\n}\n/**\n * Consumes placeholder like `[#ID]` from given scanner\n */\nfunction consumePlaceholder(scanner) {\n    if (peek(scanner) === 91 /* Start */) {\n        const start = ++scanner.pos;\n        let namePos = start;\n        let afterPos = start;\n        let stack = 1;\n        while (scanner.pos < scanner.text.length) {\n            const code = peek(scanner);\n            if (isTokenStart(code)) {\n                namePos = scanner.pos;\n                while (isToken(peek(scanner))) {\n                    scanner.pos++;\n                }\n                afterPos = scanner.pos;\n            }\n            else {\n                if (code === 91 /* Start */) {\n                    stack++;\n                }\n                else if (code === 93 /* End */) {\n                    if (--stack === 0) {\n                        return {\n                            before: scanner.text.slice(start, namePos),\n                            after: scanner.text.slice(afterPos, scanner.pos++),\n                            name: scanner.text.slice(namePos, afterPos)\n                        };\n                    }\n                }\n                scanner.pos++;\n            }\n        }\n    }\n}\nfunction peek(scanner, pos = scanner.pos) {\n    return scanner.text.charCodeAt(pos);\n}\nfunction isTokenStart(code) {\n    return code >= 65 && code <= 90; // A-Z\n}\nfunction isToken(code) {\n    return isTokenStart(code)\n        || (code > 47 && code < 58) /* 0-9 */\n        || code === 95 /* Underscore */\n        || code === 45 /* Dash */;\n}\n\nfunction createCommentState(config) {\n    const { options } = config;\n    return {\n        enabled: options['comment.enabled'],\n        trigger: options['comment.trigger'],\n        before: options['comment.before'] ? template(options['comment.before']) : void 0,\n        after: options['comment.after'] ? template(options['comment.after']) : void 0\n    };\n}\n/**\n * Adds comment prefix for given node, if required\n */\nfunction commentNodeBefore(node, state) {\n    if (shouldComment(node, state) && state.comment.before) {\n        output(node, state.comment.before, state);\n    }\n}\n/**\n * Adds comment suffix for given node, if required\n */\nfunction commentNodeAfter(node, state) {\n    if (shouldComment(node, state) && state.comment.after) {\n        output(node, state.comment.after, state);\n    }\n}\n/**\n * Check if given node should be commented\n */\nfunction shouldComment(node, state) {\n    const { comment } = state;\n    if (!comment.enabled || !comment.trigger || !node.name || !node.attributes) {\n        return false;\n    }\n    for (const attr of node.attributes) {\n        if (attr.name && comment.trigger.includes(attr.name)) {\n            return true;\n        }\n    }\n    return false;\n}\n/**\n * Pushes given template tokens into output stream\n */\nfunction output(node, tokens, state) {\n    const attrs = {};\n    const { out } = state;\n    // Collect attributes payload\n    for (const attr of node.attributes) {\n        if (attr.name && attr.value) {\n            attrs[attr.name.toUpperCase()] = attr.value;\n        }\n    }\n    // Output parsed tokens\n    for (const token of tokens) {\n        if (typeof token === 'string') {\n            pushString(out, token);\n        }\n        else if (attrs[token.name]) {\n            pushString(out, token.before);\n            pushTokens(attrs[token.name], state);\n            pushString(out, token.after);\n        }\n    }\n}\n\nconst htmlTagRegex = /^<([\\w\\-:]+)[\\s>]/;\nfunction html(abbr, config) {\n    const state = createWalkState(config);\n    state.comment = createCommentState(config);\n    walk$1(abbr, element, state);\n    return state.out.value;\n}\n/**\n * Outputs `node` content to output stream of `state`\n * @param node Context node\n * @param index Index of `node` in `items`\n * @param items List of `node`’s siblings\n * @param state Current walk state\n */\nfunction element(node, index, items, state, next) {\n    const { out, config } = state;\n    const format = shouldFormat(node, index, items, state);\n    // Pick offset level for current node\n    const level = getIndent(state);\n    out.level += level;\n    format && pushNewline(out, true);\n    if (node.name) {\n        const name = tagName(node.name, config);\n        commentNodeBefore(node, state);\n        pushString(out, `<${name}`);\n        if (node.attributes) {\n            for (const attr of node.attributes) {\n                if (shouldOutputAttribute(attr)) {\n                    pushAttribute(attr, state);\n                }\n            }\n        }\n        if (node.selfClosing && !node.children.length && !node.value) {\n            pushString(out, `${selfClose(config)}>`);\n        }\n        else {\n            pushString(out, '>');\n            if (!pushSnippet(node, state, next)) {\n                if (node.value) {\n                    const innerFormat = node.value.some(hasNewline) || startsWithBlockTag(node.value, config);\n                    innerFormat && pushNewline(state.out, ++out.level);\n                    pushTokens(node.value, state);\n                    innerFormat && pushNewline(state.out, --out.level);\n                }\n                node.children.forEach(next);\n                if (!node.value && !node.children.length) {\n                    const innerFormat = config.options['output.formatLeafNode']\n                        || config.options['output.formatForce'].includes(node.name);\n                    innerFormat && pushNewline(state.out, ++out.level);\n                    pushTokens(caret, state);\n                    innerFormat && pushNewline(state.out, --out.level);\n                }\n            }\n            pushString(out, `</${name}>`);\n            commentNodeAfter(node, state);\n        }\n    }\n    else if (!pushSnippet(node, state, next) && node.value) {\n        // A text-only node (snippet)\n        pushTokens(node.value, state);\n        node.children.forEach(next);\n    }\n    if (format && index === items.length - 1 && state.parent) {\n        const offset = isSnippet(state.parent) ? 0 : 1;\n        pushNewline(out, out.level - offset);\n    }\n    out.level -= level;\n}\n/**\n * Outputs given attribute’s content into output stream\n */\nfunction pushAttribute(attr, state) {\n    const { out, config } = state;\n    if (attr.name) {\n        const name = attrName(attr.name, config);\n        const lQuote = attrQuote(attr, config, true);\n        const rQuote = attrQuote(attr, config);\n        let value = attr.value;\n        if (isBooleanAttribute(attr, config) && !value) {\n            // If attribute value is omitted and it’s a boolean value, check for\n            // `compactBoolean` option: if it’s disabled, set value to attribute name\n            // (XML style)\n            if (!config.options['output.compactBoolean']) {\n                value = [name];\n            }\n        }\n        else if (!value) {\n            value = caret;\n        }\n        pushString(out, ' ' + name);\n        if (value) {\n            pushString(out, '=' + lQuote);\n            pushTokens(value, state);\n            pushString(out, rQuote);\n        }\n        else if (config.options['output.selfClosingStyle'] !== 'html') {\n            pushString(out, '=' + lQuote + rQuote);\n        }\n    }\n}\nfunction pushSnippet(node, state, next) {\n    if (node.value && node.children.length) {\n        // We have a value and child nodes. In case if value contains fields,\n        // we should output children as a content of first field\n        const fieldIx = node.value.findIndex(isField);\n        if (fieldIx !== -1) {\n            pushTokens(node.value.slice(0, fieldIx), state);\n            const line = state.out.line;\n            let pos = fieldIx + 1;\n            node.children.forEach(next);\n            // If there was a line change, trim leading whitespace for better result\n            if (state.out.line !== line && typeof node.value[pos] === 'string') {\n                pushString(state.out, node.value[pos++].trimLeft());\n            }\n            pushTokens(node.value.slice(pos), state);\n            return true;\n        }\n    }\n    return false;\n}\n/**\n * Check if given node should be formatted in its parent context\n */\nfunction shouldFormat(node, index, items, state) {\n    const { config, parent } = state;\n    if (!config.options['output.format']) {\n        return false;\n    }\n    if (index === 0 && !parent) {\n        // Do not format very first node\n        return false;\n    }\n    // Do not format single child of snippet\n    if (parent && isSnippet(parent) && items.length === 1) {\n        return false;\n    }\n    /**\n     * Adjacent text-only/snippet nodes\n     */\n    if (isSnippet(node)) {\n        // Adjacent text-only/snippet nodes\n        const format = isSnippet(items[index - 1]) || isSnippet(items[index + 1])\n            // Has newlines: looks like wrapping code fragment\n            || node.value.some(hasNewline)\n            // Format as wrapper: contains children which will be outputted as field content\n            || (node.value.some(isField) && node.children.length);\n        if (format) {\n            return true;\n        }\n    }\n    if (isInline(node, config)) {\n        // Check if inline node is the next sibling of block-level node\n        if (index === 0) {\n            // First node in parent: format if it’s followed by a block-level element\n            for (let i = 0; i < items.length; i++) {\n                if (!isInline(items[i], config)) {\n                    return true;\n                }\n            }\n        }\n        else if (!isInline(items[index - 1], config)) {\n            // Node is right after block-level element\n            return true;\n        }\n        if (config.options['output.inlineBreak']) {\n            // check for adjacent inline elements before and after current element\n            let adjacentInline = 1;\n            let before = index;\n            let after = index;\n            while (isInlineElement(items[--before], config)) {\n                adjacentInline++;\n            }\n            while (isInlineElement(items[++after], config)) {\n                adjacentInline++;\n            }\n            if (adjacentInline >= config.options['output.inlineBreak']) {\n                return true;\n            }\n        }\n        // Edge case: inline node contains node that should receive formatting\n        for (let i = 0, il = node.children.length; i < il; i++) {\n            if (shouldFormat(node.children[i], i, node.children, state)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    return true;\n}\n/**\n * Returns indentation offset for given node\n */\nfunction getIndent(state) {\n    const { config, parent } = state;\n    if (!parent || isSnippet(parent) || (parent.name && config.options['output.formatSkip'].includes(parent.name))) {\n        return 0;\n    }\n    return 1;\n}\n/**\n * Check if given node value contains newlines\n */\nfunction hasNewline(value) {\n    return typeof value === 'string' && /\\r|\\n/.test(value);\n}\n/**\n * Check if given node value starts with block-level tag\n */\nfunction startsWithBlockTag(value, config) {\n    if (value.length && typeof value[0] === 'string') {\n        const matches = htmlTagRegex.exec(value[0]);\n        if ((matches === null || matches === void 0 ? void 0 : matches.length) && !config.options['inlineElements'].includes(matches[1].toLowerCase())) {\n            return true;\n        }\n    }\n    return false;\n}\n\nfunction indentFormat(abbr, config, options) {\n    const state = createWalkState(config);\n    state.options = options || {};\n    walk$1(abbr, element$1, state);\n    return state.out.value;\n}\n/**\n * Outputs `node` content to output stream of `state`\n * @param node Context node\n * @param index Index of `node` in `items`\n * @param items List of `node`’s siblings\n * @param state Current walk state\n */\nfunction element$1(node, index, items, state, next) {\n    const { out, options } = state;\n    const { primary, secondary } = collectAttributes(node);\n    // Pick offset level for current node\n    const level = state.parent ? 1 : 0;\n    out.level += level;\n    // Do not indent top-level elements\n    if (shouldFormat$1(node, index, items, state)) {\n        pushNewline(out, true);\n    }\n    if (node.name && (node.name !== 'div' || !primary.length)) {\n        pushString(out, (options.beforeName || '') + node.name + (options.afterName || ''));\n    }\n    pushPrimaryAttributes(primary, state);\n    pushSecondaryAttributes(secondary.filter(shouldOutputAttribute), state);\n    if (node.selfClosing && !node.value && !node.children.length) {\n        if (state.options.selfClose) {\n            pushString(out, state.options.selfClose);\n        }\n    }\n    else {\n        pushValue(node, state);\n        node.children.forEach(next);\n    }\n    out.level -= level;\n}\n/**\n * From given node, collects all attributes as `primary` (id, class) and\n * `secondary` (all the rest) lists. In most indent-based syntaxes, primary attribute\n * has special syntax\n */\nfunction collectAttributes(node) {\n    const primary = [];\n    const secondary = [];\n    if (node.attributes) {\n        for (const attr of node.attributes) {\n            if (isPrimaryAttribute(attr)) {\n                primary.push(attr);\n            }\n            else {\n                secondary.push(attr);\n            }\n        }\n    }\n    return { primary, secondary };\n}\n/**\n * Outputs given attributes as primary into output stream\n */\nfunction pushPrimaryAttributes(attrs, state) {\n    for (const attr of attrs) {\n        if (attr.value) {\n            if (attr.name === 'class') {\n                pushString(state.out, '.');\n                // All whitespace characters must be replaced with dots in class names\n                const tokens = attr.value.map(t => typeof t === 'string' ? t.replace(/\\s+/g, '.') : t);\n                pushTokens(tokens, state);\n            }\n            else {\n                // ID attribute\n                pushString(state.out, '#');\n                pushTokens(attr.value, state);\n            }\n        }\n    }\n}\n/**\n * Outputs given attributes as secondary into output stream\n */\nfunction pushSecondaryAttributes(attrs, state) {\n    if (attrs.length) {\n        const { out, config, options } = state;\n        options.beforeAttribute && pushString(out, options.beforeAttribute);\n        for (let i = 0; i < attrs.length; i++) {\n            const attr = attrs[i];\n            pushString(out, attrName(attr.name || '', config));\n            if (isBooleanAttribute(attr, config) && !attr.value) {\n                if (!config.options['output.compactBoolean'] && options.booleanValue) {\n                    pushString(out, '=' + options.booleanValue);\n                }\n            }\n            else {\n                pushString(out, '=' + attrQuote(attr, config, true));\n                pushTokens(attr.value || caret, state);\n                pushString(out, attrQuote(attr, config));\n            }\n            if (i !== attrs.length - 1 && options.glueAttribute) {\n                pushString(out, options.glueAttribute);\n            }\n        }\n        options.afterAttribute && pushString(out, options.afterAttribute);\n    }\n}\n/**\n * Outputs given node value into state output stream\n */\nfunction pushValue(node, state) {\n    // We should either output value or add caret but for leaf nodes only (no children)\n    if (!node.value && node.children.length) {\n        return;\n    }\n    const value = node.value || caret;\n    const lines = splitByLines$1(value);\n    const { out, options } = state;\n    if (lines.length === 1) {\n        if (node.name || node.attributes) {\n            push(out, ' ');\n        }\n        pushTokens(value, state);\n    }\n    else {\n        // We should format multi-line value with terminating `|` character\n        // and same line length\n        const lineLengths = [];\n        let maxLength = 0;\n        // Calculate lengths of all lines and max line length\n        for (const line of lines) {\n            const len = valueLength(line);\n            lineLengths.push(len);\n            if (len > maxLength) {\n                maxLength = len;\n            }\n        }\n        // Output each line, padded to max length\n        out.level++;\n        for (let i = 0; i < lines.length; i++) {\n            pushNewline(out, true);\n            options.beforeTextLine && push(out, options.beforeTextLine);\n            pushTokens(lines[i], state);\n            if (options.afterTextLine) {\n                push(out, ' '.repeat(maxLength - lineLengths[i]));\n                push(out, options.afterTextLine);\n            }\n        }\n        out.level--;\n    }\n}\nfunction isPrimaryAttribute(attr) {\n    return attr.name === 'class' || attr.name === 'id';\n}\n/**\n * Calculates string length from given tokens\n */\nfunction valueLength(tokens) {\n    let len = 0;\n    for (const token of tokens) {\n        len += typeof token === 'string' ? token.length : token.name.length;\n    }\n    return len;\n}\nfunction shouldFormat$1(node, index, items, state) {\n    // Do not format first top-level element or snippets\n    if (!state.parent && index === 0) {\n        return false;\n    }\n    return !isSnippet(node);\n}\n\nfunction haml(abbr, config) {\n    return indentFormat(abbr, config, {\n        beforeName: '%',\n        beforeAttribute: '(',\n        afterAttribute: ')',\n        glueAttribute: ' ',\n        afterTextLine: ' |',\n        booleanValue: 'true',\n        selfClose: '/'\n    });\n}\n\nfunction slim(abbr, config) {\n    return indentFormat(abbr, config, {\n        beforeAttribute: ' ',\n        glueAttribute: ' ',\n        beforeTextLine: '| ',\n        selfClose: '/'\n    });\n}\n\nfunction pug(abbr, config) {\n    return indentFormat(abbr, config, {\n        beforeAttribute: '(',\n        afterAttribute: ')',\n        glueAttribute: ', ',\n        beforeTextLine: '| ',\n        selfClose: config.options['output.selfClosingStyle'] === 'xml' ? '/' : ''\n    });\n}\n\nconst formatters = { html, haml, slim, pug };\n/**\n * Parses given Emmet abbreviation into a final abbreviation tree with all\n * required transformations applied\n */\nfunction parse(abbr, config) {\n    let oldTextValue;\n    if (typeof abbr === 'string') {\n        let parseOpt = config;\n        if (config.options['jsx.enabled']) {\n            parseOpt = Object.assign(Object.assign({}, parseOpt), { jsx: true });\n        }\n        if (config.options['markup.href']) {\n            parseOpt = Object.assign(Object.assign({}, parseOpt), { href: true });\n        }\n        abbr = parse$2(abbr, parseOpt);\n        // remove text field before snippets(abbr, config) call\n        // as abbreviation(abbr, parseOpt) already handled it\n        oldTextValue = config.text;\n        config.text = undefined;\n    }\n    // Run abbreviation resolve in two passes:\n    // 1. Map each node to snippets, which are abbreviations as well. A single snippet\n    // may produce multiple nodes\n    // 2. Transform every resolved node\n    abbr = resolveSnippets(abbr, config);\n    walk(abbr, transform, config);\n    config.text = oldTextValue !== null && oldTextValue !== void 0 ? oldTextValue : config.text;\n    return abbr;\n}\n/**\n * Converts given abbreviation to string according to provided `config`\n */\nfunction stringify(abbr, config) {\n    const formatter = formatters[config.syntax] || html;\n    return formatter(abbr, config);\n}\n/**\n * Modifies given node and prepares it for output\n */\nfunction transform(node, ancestors, config) {\n    implicitTag(node, ancestors, config);\n    mergeAttributes(node, config);\n    lorem(node, ancestors, config);\n    if (config.syntax === 'xsl') {\n        xsl(node);\n    }\n    if (config.options['jsx.enabled']) {\n        jsx(node);\n    }\n    if (config.options['bem.enabled']) {\n        bem(node, ancestors, config);\n    }\n}\n\nconst reProperty = /^([a-z-]+)(?:\\s*:\\s*([^\\n\\r;]+?);*)?$/;\nconst opt = { value: true };\n/**\n * Creates structure for holding resolved CSS snippet\n */\nfunction createSnippet(key, value) {\n    // A snippet could be a raw text snippet (e.g. arbitrary text string) or a\n    // CSS property with possible values separated by `|`.\n    // In latter case, we have to parse snippet as CSS abbreviation\n    const m = value.match(reProperty);\n    if (m) {\n        const keywords = {};\n        const parsed = m[2] ? m[2].split('|').map(parseValue) : [];\n        for (const item of parsed) {\n            for (const cssVal of item) {\n                collectKeywords(cssVal, keywords);\n            }\n        }\n        return {\n            type: \"Property\" /* Property */,\n            key,\n            property: m[1],\n            value: parsed,\n            keywords,\n            dependencies: []\n        };\n    }\n    return { type: \"Raw\" /* Raw */, key, value };\n}\n/**\n * Nests more specific CSS properties into shorthand ones, e.g.\n * `background-position-x` -> `background-position` -> `background`\n */\nfunction nest(snippets) {\n    snippets = snippets.slice().sort(snippetsSort);\n    const stack = [];\n    let prev;\n    // For sorted list of CSS properties, create dependency graph where each\n    // shorthand property contains its more specific one, e.g.\n    // background -> background-position -> background-position-x\n    for (const cur of snippets.filter(isProperty)) {\n        // Check if current property belongs to one from parent stack.\n        // Since `snippets` array is sorted, items are perfectly aligned\n        // from shorthands to more specific variants\n        while (stack.length) {\n            prev = stack[stack.length - 1];\n            if (cur.property.startsWith(prev.property)\n                && cur.property.charCodeAt(prev.property.length) === 45 /* - */) {\n                prev.dependencies.push(cur);\n                stack.push(cur);\n                break;\n            }\n            stack.pop();\n        }\n        if (!stack.length) {\n            stack.push(cur);\n        }\n    }\n    return snippets;\n}\n/**\n * A sorting function for array of snippets\n */\nfunction snippetsSort(a, b) {\n    if (a.key === b.key) {\n        return 0;\n    }\n    return a.key < b.key ? -1 : 1;\n}\nfunction parseValue(value) {\n    return parse$3(value.trim(), opt)[0].value;\n}\nfunction isProperty(snippet) {\n    return snippet.type === \"Property\" /* Property */;\n}\nfunction collectKeywords(cssVal, dest) {\n    for (const v of cssVal.value) {\n        if (v.type === 'Literal') {\n            dest[v.value] = v;\n        }\n        else if (v.type === 'FunctionCall') {\n            dest[v.name] = v;\n        }\n        else if (v.type === 'Field') {\n            // Create literal from field, if available\n            const value = v.name.trim();\n            if (value) {\n                dest[value] = { type: 'Literal', value };\n            }\n        }\n    }\n}\n\n/**\n * Calculates how close `str1` matches `str2` using fuzzy match.\n * How matching works:\n * – first characters of both `str1` and `str2` *must* match\n * – `str1` length larger than `str2` length is allowed only when `unmatched` is true\n * – ideal match is when `str1` equals to `str2` (score: 1)\n * – next best match is `str2` starts with `str1` (score: 1 × percent of matched characters)\n * – other scores depend on how close characters of `str1` to the beginning of `str2`\n * @param partialMatch Allow length `str1` to be greater than `str2` length\n */\nfunction scoreMatch(str1, str2, partialMatch = false) {\n    str1 = str1.toLowerCase();\n    str2 = str2.toLowerCase();\n    if (str1 === str2) {\n        return 1;\n    }\n    // Both strings MUST start with the same character\n    if (!str1 || !str2 || str1.charCodeAt(0) !== str2.charCodeAt(0)) {\n        return 0;\n    }\n    const str1Len = str1.length;\n    const str2Len = str2.length;\n    if (!partialMatch && str1Len > str2Len) {\n        return 0;\n    }\n    // Characters from `str1` which are closer to the beginning of a `str2` should\n    // have higher score.\n    // For example, if `str2` is `abcde`, it’s max score is:\n    // 5 + 4 + 3 + 2 + 1 = 15 (sum of character positions in reverse order)\n    // Matching `abd` against `abcde` should produce:\n    // 5 + 4 + 2 = 11\n    // Acronym bonus for match right after `-`. Matching `abd` against `abc-de`\n    // should produce:\n    // 6 + 5 + 4 (use `d` position in `abd`, not in abc-de`)\n    const minLength = Math.min(str1Len, str2Len);\n    const maxLength = Math.max(str1Len, str2Len);\n    let i = 1;\n    let j = 1;\n    let score = maxLength;\n    let ch1 = 0;\n    let ch2 = 0;\n    let found = false;\n    let acronym = false;\n    while (i < str1Len) {\n        ch1 = str1.charCodeAt(i);\n        found = false;\n        acronym = false;\n        while (j < str2Len) {\n            ch2 = str2.charCodeAt(j);\n            if (ch1 === ch2) {\n                found = true;\n                score += maxLength - (acronym ? i : j);\n                break;\n            }\n            // add acronym bonus for exactly next match after unmatched `-`\n            acronym = ch2 === 45 /* - */;\n            j++;\n        }\n        if (!found) {\n            if (!partialMatch) {\n                return 0;\n            }\n            break;\n        }\n        i++;\n    }\n    const matchRatio = i / maxLength;\n    const delta = maxLength - minLength;\n    const maxScore = sum(maxLength) - sum(delta);\n    return (score * matchRatio) / maxScore;\n}\n/**\n * Calculates sum of first `n` numbers, e.g. 1+2+3+...n\n */\nfunction sum(n) {\n    return n * (n + 1) / 2;\n}\n\nfunction color(token, shortHex) {\n    if (!token.r && !token.g && !token.b && !token.a) {\n        return 'transparent';\n    }\n    else if (token.a === 1) {\n        return asHex(token, shortHex);\n    }\n    return asRGB(token);\n}\n/**\n * Output given color as hex value\n * @param short Produce short value (e.g. #fff instead of #ffffff), if possible\n */\nfunction asHex(token, short) {\n    const fn = (short && isShortHex(token.r) && isShortHex(token.g) && isShortHex(token.b))\n        ? toShortHex : toHex;\n    return '#' + fn(token.r) + fn(token.g) + fn(token.b);\n}\n/**\n * Output current color as `rgba?(...)` CSS color\n */\nfunction asRGB(token) {\n    const values = [token.r, token.g, token.b];\n    if (token.a !== 1) {\n        values.push(frac(token.a, 8));\n    }\n    return `${values.length === 3 ? 'rgb' : 'rgba'}(${values.join(', ')})`;\n}\nfunction frac(num, digits = 4) {\n    return num.toFixed(digits).replace(/\\.?0+$/, '');\n}\nfunction isShortHex(hex) {\n    return !(hex % 17);\n}\nfunction toShortHex(num) {\n    return (num >> 4).toString(16);\n}\nfunction toHex(num) {\n    return pad(num.toString(16), 2);\n}\nfunction pad(value, len) {\n    while (value.length < len) {\n        value = '0' + value;\n    }\n    return value;\n}\n\nfunction css(abbr, config) {\n    var _a;\n    const out = createOutputStream(config.options);\n    const format = config.options['output.format'];\n    if (((_a = config.context) === null || _a === void 0 ? void 0 : _a.name) === \"@@section\" /* Section */) {\n        // For section context, filter out unmatched snippets\n        abbr = abbr.filter(node => node.snippet);\n    }\n    for (let i = 0; i < abbr.length; i++) {\n        if (format && i !== 0) {\n            pushNewline(out, true);\n        }\n        property(abbr[i], out, config);\n    }\n    return out.value;\n}\n/**\n * Outputs given abbreviation node into output stream\n */\nfunction property(node, out, config) {\n    const isJSON = config.options['stylesheet.json'];\n    if (node.name) {\n        // It’s a CSS property\n        const name = isJSON ? toCamelCase(node.name) : node.name;\n        pushString(out, name + config.options['stylesheet.between']);\n        if (node.value.length) {\n            propertyValue(node, out, config);\n        }\n        else {\n            pushField(out, 0, '');\n        }\n        if (isJSON) {\n            // For CSS-in-JS, always finalize property with comma\n            // NB: seems like `important` is not available in CSS-in-JS syntaxes\n            push(out, ',');\n        }\n        else {\n            outputImportant(node, out, true);\n            push(out, config.options['stylesheet.after']);\n        }\n    }\n    else {\n        // It’s a regular snippet, output plain tokens without any additional formatting\n        for (const cssVal of node.value) {\n            for (const v of cssVal.value) {\n                outputToken(v, out, config);\n            }\n        }\n        outputImportant(node, out, node.value.length > 0);\n    }\n}\nfunction propertyValue(node, out, config) {\n    const isJSON = config.options['stylesheet.json'];\n    const num = isJSON ? getSingleNumeric(node) : null;\n    if (num && (!num.unit || num.unit === 'px')) {\n        // For CSS-in-JS, if property contains single numeric value, output it\n        // as JS number\n        push(out, String(num.value));\n    }\n    else {\n        const quote = getQuote(config);\n        isJSON && push(out, quote);\n        for (let i = 0; i < node.value.length; i++) {\n            if (i !== 0) {\n                push(out, ', ');\n            }\n            outputValue(node.value[i], out, config);\n        }\n        isJSON && push(out, quote);\n    }\n}\nfunction outputImportant(node, out, separator) {\n    if (node.important) {\n        if (separator) {\n            push(out, ' ');\n        }\n        push(out, '!important');\n    }\n}\nfunction outputValue(value, out, config) {\n    for (let i = 0, prevEnd = -1; i < value.value.length; i++) {\n        const token = value.value[i];\n        // Handle edge case: a field is written close to previous token like this: `foo${bar}`.\n        // We should not add delimiter here\n        if (i !== 0 && (token.type !== 'Field' || token.start !== prevEnd)) {\n            push(out, ' ');\n        }\n        outputToken(token, out, config);\n        prevEnd = token['end'];\n    }\n}\nfunction outputToken(token, out, config) {\n    if (token.type === 'ColorValue') {\n        push(out, color(token, config.options['stylesheet.shortHex']));\n    }\n    else if (token.type === 'Literal') {\n        pushString(out, token.value);\n    }\n    else if (token.type === 'NumberValue') {\n        pushString(out, frac(token.value, 4) + token.unit);\n    }\n    else if (token.type === 'StringValue') {\n        const quote = token.quote === 'double' ? '\"' : '\\'';\n        pushString(out, quote + token.value + quote);\n    }\n    else if (token.type === 'Field') {\n        pushField(out, token.index, token.name);\n    }\n    else if (token.type === 'FunctionCall') {\n        push(out, token.name + '(');\n        for (let i = 0; i < token.arguments.length; i++) {\n            if (i) {\n                push(out, ', ');\n            }\n            outputValue(token.arguments[i], out, config);\n        }\n        push(out, ')');\n    }\n}\n/**\n * If value of given property is a single numeric value, returns this token\n */\nfunction getSingleNumeric(node) {\n    if (node.value.length === 1) {\n        const cssVal = node.value[0];\n        if (cssVal.value.length === 1 && cssVal.value[0].type === 'NumberValue') {\n            return cssVal.value[0];\n        }\n    }\n}\n/**\n * Converts kebab-case string to camelCase\n */\nfunction toCamelCase(str) {\n    return str.replace(/\\-(\\w)/g, (_, letter) => letter.toUpperCase());\n}\nfunction getQuote(config) {\n    return config.options['stylesheet.jsonDoubleQuotes'] ? '\"' : '\\'';\n}\n\nconst gradientName = 'lg';\n/**\n * Parses given Emmet abbreviation into a final abbreviation tree with all\n * required transformations applied\n */\nfunction parse$1(abbr, config) {\n    var _a;\n    const snippets = ((_a = config.cache) === null || _a === void 0 ? void 0 : _a.stylesheetSnippets) || convertSnippets(config.snippets);\n    if (config.cache) {\n        config.cache.stylesheetSnippets = snippets;\n    }\n    if (typeof abbr === 'string') {\n        abbr = parse$3(abbr, { value: isValueScope(config) });\n    }\n    const filteredSnippets = getSnippetsForScope(snippets, config);\n    for (const node of abbr) {\n        resolveNode(node, filteredSnippets, config);\n    }\n    return abbr;\n}\n/**\n * Converts given raw snippets into internal snippets representation\n */\nfunction convertSnippets(snippets) {\n    const result = [];\n    for (const key of Object.keys(snippets)) {\n        result.push(createSnippet(key, snippets[key]));\n    }\n    return nest(result);\n}\n/**\n * Resolves given node: finds matched CSS snippets using fuzzy match and resolves\n * keyword aliases from node value\n */\nfunction resolveNode(node, snippets, config) {\n    if (!resolveGradient(node, config)) {\n        const score = config.options['stylesheet.fuzzySearchMinScore'];\n        if (isValueScope(config)) {\n            // Resolve as value of given CSS property\n            const propName = config.context.name;\n            const snippet = snippets.find(s => s.type === \"Property\" /* Property */ && s.property === propName);\n            resolveValueKeywords(node, config, snippet, score);\n            node.snippet = snippet;\n        }\n        else if (node.name) {\n            const snippet = findBestMatch(node.name, snippets, score, true);\n            node.snippet = snippet;\n            if (snippet) {\n                if (snippet.type === \"Property\" /* Property */) {\n                    resolveAsProperty(node, snippet, config);\n                }\n                else {\n                    resolveAsSnippet(node, snippet);\n                }\n            }\n        }\n    }\n    if (node.name || config.context) {\n        // Resolve numeric values for CSS properties only\n        resolveNumericValue(node, config);\n    }\n    return node;\n}\n/**\n * Resolves CSS gradient shortcut from given property, if possible\n */\nfunction resolveGradient(node, config) {\n    let gradientFn = null;\n    const cssVal = node.value.length === 1 ? node.value[0] : null;\n    if (cssVal && cssVal.value.length === 1) {\n        const v = cssVal.value[0];\n        if (v.type === 'FunctionCall' && v.name === gradientName) {\n            gradientFn = v;\n        }\n    }\n    if (gradientFn || node.name === gradientName) {\n        if (!gradientFn) {\n            gradientFn = {\n                type: 'FunctionCall',\n                name: 'linear-gradient',\n                arguments: [cssValue(field(0, ''))]\n            };\n        }\n        else {\n            gradientFn = Object.assign(Object.assign({}, gradientFn), { name: 'linear-gradient' });\n        }\n        if (!config.context) {\n            node.name = 'background-image';\n        }\n        node.value = [cssValue(gradientFn)];\n        return true;\n    }\n    return false;\n}\n/**\n * Resolves given parsed abbreviation node as CSS property\n */\nfunction resolveAsProperty(node, snippet, config) {\n    const abbr = node.name;\n    // Check for unmatched part of abbreviation\n    // For example, in `dib` abbreviation the matched part is `d` and `ib` should\n    // be considered as inline value. If unmatched fragment exists, we should check\n    // if it matches actual value of snippet. If either explicit value is specified\n    // or unmatched fragment did not resolve to to a keyword, we should consider\n    // matched snippet as invalid\n    const inlineValue = getUnmatchedPart(abbr, snippet.key);\n    if (inlineValue) {\n        if (node.value.length) {\n            // Already have value: unmatched part indicates matched snippet is invalid\n            return node;\n        }\n        const kw = resolveKeyword(inlineValue, config, snippet);\n        if (!kw) {\n            return node;\n        }\n        node.value.push(cssValue(kw));\n    }\n    node.name = snippet.property;\n    if (node.value.length) {\n        // Replace keyword alias from current abbreviation node with matched keyword\n        resolveValueKeywords(node, config, snippet);\n    }\n    else if (snippet.value.length) {\n        const defaultValue = snippet.value[0];\n        // https://github.com/emmetio/emmet/issues/558\n        // We should auto-select inserted value only if there’s multiple value\n        // choice\n        node.value = snippet.value.length === 1 || defaultValue.some(hasField)\n            ? defaultValue\n            : defaultValue.map(n => wrapWithField(n, config));\n    }\n    return node;\n}\nfunction resolveValueKeywords(node, config, snippet, minScore) {\n    for (const cssVal of node.value) {\n        const value = [];\n        for (const token of cssVal.value) {\n            if (token.type === 'Literal') {\n                value.push(resolveKeyword(token.value, config, snippet, minScore) || token);\n            }\n            else if (token.type === 'FunctionCall') {\n                // For function calls, we should find matching function call\n                // and merge arguments\n                const match = resolveKeyword(token.name, config, snippet, minScore);\n                if (match && match.type === 'FunctionCall') {\n                    value.push(Object.assign(Object.assign({}, match), { arguments: token.arguments.concat(match.arguments.slice(token.arguments.length)) }));\n                }\n                else {\n                    value.push(token);\n                }\n            }\n            else {\n                value.push(token);\n            }\n        }\n        cssVal.value = value;\n    }\n}\n/**\n * Resolves given parsed abbreviation node as a snippet: a plain code chunk\n */\nfunction resolveAsSnippet(node, snippet) {\n    // When resolving snippets, we have to do the following:\n    // 1. Replace field placeholders with actual field tokens.\n    // 2. If input values given, put them instead of fields\n    let offset = 0;\n    let m;\n    const reField = /\\$\\{(\\d+)(:[^}]+)?\\}/g;\n    const inputValue = node.value[0];\n    const outputValue = [];\n    while (m = reField.exec(snippet.value)) {\n        if (offset !== m.index) {\n            outputValue.push(literal(snippet.value.slice(offset, m.index)));\n        }\n        offset = m.index + m[0].length;\n        if (inputValue && inputValue.value.length) {\n            outputValue.push(inputValue.value.shift());\n        }\n        else {\n            outputValue.push(field(Number(m[1]), m[2] ? m[2].slice(1) : ''));\n        }\n    }\n    const tail = snippet.value.slice(offset);\n    if (tail) {\n        outputValue.push(literal(tail));\n    }\n    node.name = void 0;\n    node.value = [cssValue(...outputValue)];\n    return node;\n}\n/**\n * Finds best matching item from `items` array\n * @param abbr  Abbreviation to match\n * @param items List of items for match\n * @param minScore The minimum score the best matched item should have to be a valid match.\n */\nfunction findBestMatch(abbr, items, minScore = 0, partialMatch = false) {\n    let matchedItem = null;\n    let maxScore = 0;\n    for (const item of items) {\n        const score = scoreMatch(abbr, getScoringPart(item), partialMatch);\n        if (score === 1) {\n            // direct hit, no need to look further\n            return item;\n        }\n        if (score && score >= maxScore) {\n            maxScore = score;\n            matchedItem = item;\n        }\n    }\n    return maxScore >= minScore ? matchedItem : null;\n}\nfunction getScoringPart(item) {\n    return typeof item === 'string' ? item : item.key;\n}\n/**\n * Returns a part of `abbr` that wasn’t directly matched against `str`.\n * For example, if abbreviation `poas` is matched against `position`,\n * the unmatched part will be `as` since `a` wasn’t found in string stream\n */\nfunction getUnmatchedPart(abbr, str) {\n    for (let i = 0, lastPos = 0; i < abbr.length; i++) {\n        lastPos = str.indexOf(abbr[i], lastPos);\n        if (lastPos === -1) {\n            return abbr.slice(i);\n        }\n        lastPos++;\n    }\n    return '';\n}\n/**\n * Resolves given keyword shorthand into matched snippet keyword or global keyword,\n * if possible\n */\nfunction resolveKeyword(kw, config, snippet, minScore) {\n    let ref;\n    if (snippet) {\n        if (ref = findBestMatch(kw, Object.keys(snippet.keywords), minScore)) {\n            return snippet.keywords[ref];\n        }\n        for (const dep of snippet.dependencies) {\n            if (ref = findBestMatch(kw, Object.keys(dep.keywords), minScore)) {\n                return dep.keywords[ref];\n            }\n        }\n    }\n    if (ref = findBestMatch(kw, config.options['stylesheet.keywords'], minScore)) {\n        return literal(ref);\n    }\n    return null;\n}\n/**\n * Resolves numeric values in given abbreviation node\n */\nfunction resolveNumericValue(node, config) {\n    const aliases = config.options['stylesheet.unitAliases'];\n    const unitless = config.options['stylesheet.unitless'];\n    for (const v of node.value) {\n        for (const t of v.value) {\n            if (t.type === 'NumberValue') {\n                if (t.unit) {\n                    t.unit = aliases[t.unit] || t.unit;\n                }\n                else if (t.value !== 0 && !unitless.includes(node.name)) {\n                    t.unit = t.rawValue.includes('.')\n                        ? config.options['stylesheet.floatUnit']\n                        : config.options['stylesheet.intUnit'];\n                }\n            }\n        }\n    }\n}\n/**\n * Constructs CSS value token\n */\nfunction cssValue(...args) {\n    return {\n        type: 'CSSValue',\n        value: args\n    };\n}\n/**\n * Constructs literal token\n */\nfunction literal(value) {\n    return { type: 'Literal', value };\n}\n/**\n * Constructs field token\n */\nfunction field(index, name) {\n    return { type: 'Field', index, name };\n}\n/**\n * Check if given value contains fields\n */\nfunction hasField(value) {\n    for (const v of value.value) {\n        if (v.type === 'Field' || (v.type === 'FunctionCall' && v.arguments.some(hasField))) {\n            return true;\n        }\n    }\n    return false;\n}\n/**\n * Wraps tokens of given abbreviation with fields\n */\nfunction wrapWithField(node, config, state = { index: 1 }) {\n    let value = [];\n    for (const v of node.value) {\n        switch (v.type) {\n            case 'ColorValue':\n                value.push(field(state.index++, color(v, config.options['stylesheet.shortHex'])));\n                break;\n            case 'Literal':\n                value.push(field(state.index++, v.value));\n                break;\n            case 'NumberValue':\n                value.push(field(state.index++, `${v.value}${v.unit}`));\n                break;\n            case 'StringValue':\n                const q = v.quote === 'single' ? '\\'' : '\"';\n                value.push(field(state.index++, q + v.value + q));\n                break;\n            case 'FunctionCall':\n                value.push(field(state.index++, v.name), literal('('));\n                for (let i = 0, il = v.arguments.length; i < il; i++) {\n                    value = value.concat(wrapWithField(v.arguments[i], config, state).value);\n                    if (i !== il - 1) {\n                        value.push(literal(', '));\n                    }\n                }\n                value.push(literal(')'));\n                break;\n            default:\n                value.push(v);\n        }\n    }\n    return Object.assign(Object.assign({}, node), { value });\n}\n/**\n * Check if abbreviation should be expanded in CSS value context\n */\nfunction isValueScope(config) {\n    if (config.context) {\n        return config.context.name === \"@@value\" /* Value */ || !config.context.name.startsWith('@@');\n    }\n    return false;\n}\n/**\n * Returns snippets for given scope\n */\nfunction getSnippetsForScope(snippets, config) {\n    if (config.context) {\n        if (config.context.name === \"@@section\" /* Section */) {\n            return snippets.filter(s => s.type === \"Raw\" /* Raw */);\n        }\n        if (config.context.name === \"@@property\" /* Property */) {\n            return snippets.filter(s => s.type === \"Property\" /* Property */);\n        }\n    }\n    return snippets;\n}\n\nvar markupSnippets = {\n\t\"a\": \"a[href]\",\n\t\"a:blank\": \"a[href='http://${0}' target='_blank' rel='noopener noreferrer']\",\n\t\"a:link\": \"a[href='http://${0}']\",\n\t\"a:mail\": \"a[href='mailto:${0}']\",\n\t\"a:tel\": \"a[href='tel:+${0}']\",\n\t\"abbr\": \"abbr[title]\",\n\t\"acr|acronym\": \"acronym[title]\",\n\t\"base\": \"base[href]/\",\n\t\"basefont\": \"basefont/\",\n\t\"br\": \"br/\",\n\t\"frame\": \"frame/\",\n\t\"hr\": \"hr/\",\n\t\"bdo\": \"bdo[dir]\",\n\t\"bdo:r\": \"bdo[dir=rtl]\",\n\t\"bdo:l\": \"bdo[dir=ltr]\",\n\t\"col\": \"col/\",\n\t\"link\": \"link[rel=stylesheet href]/\",\n\t\"link:css\": \"link[href='${1:style}.css']\",\n\t\"link:print\": \"link[href='${1:print}.css' media=print]\",\n\t\"link:favicon\": \"link[rel='shortcut icon' type=image/x-icon href='${1:favicon.ico}']\",\n\t\"link:mf|link:manifest\": \"link[rel='manifest' href='${1:manifest.json}']\",\n\t\"link:touch\": \"link[rel=apple-touch-icon href='${1:favicon.png}']\",\n\t\"link:rss\": \"link[rel=alternate type=application/rss+xml title=RSS href='${1:rss.xml}']\",\n\t\"link:atom\": \"link[rel=alternate type=application/atom+xml title=Atom href='${1:atom.xml}']\",\n\t\"link:im|link:import\": \"link[rel=import href='${1:component}.html']\",\n\t\"meta\": \"meta/\",\n\t\"meta:utf\": \"meta[http-equiv=Content-Type content='text/html;charset=UTF-8']\",\n\t\"meta:vp\": \"meta[name=viewport content='width=${1:device-width}, initial-scale=${2:1.0}']\",\n\t\"meta:compat\": \"meta[http-equiv=X-UA-Compatible content='${1:IE=7}']\",\n\t\"meta:edge\": \"meta:compat[content='${1:ie=edge}']\",\n\t\"meta:redirect\": \"meta[http-equiv=refresh content='0; url=${1:http://example.com}']\",\n\t\"meta:kw\": \"meta[name=keywords content]\",\n\t\"meta:desc\": \"meta[name=description content]\",\n\t\"style\": \"style\",\n\t\"script\": \"script\",\n\t\"script:src\": \"script[src]\",\n\t\"img\": \"img[src alt]/\",\n\t\"img:s|img:srcset\": \"img[srcset src alt]\",\n\t\"img:z|img:sizes\": \"img[sizes srcset src alt]\",\n\t\"picture\": \"picture\",\n\t\"src|source\": \"source/\",\n\t\"src:sc|source:src\": \"source[src type]\",\n\t\"src:s|source:srcset\": \"source[srcset]\",\n\t\"src:t|source:type\": \"source[srcset type='${1:image/}']\",\n\t\"src:z|source:sizes\": \"source[sizes srcset]\",\n\t\"src:m|source:media\": \"source[media='(${1:min-width: })' srcset]\",\n\t\"src:mt|source:media:type\": \"source:media[type='${2:image/}']\",\n\t\"src:mz|source:media:sizes\": \"source:media[sizes srcset]\",\n\t\"src:zt|source:sizes:type\": \"source[sizes srcset type='${1:image/}']\",\n\t\"iframe\": \"iframe[src frameborder=0]\",\n\t\"embed\": \"embed[src type]/\",\n\t\"object\": \"object[data type]\",\n\t\"param\": \"param[name value]/\",\n\t\"map\": \"map[name]\",\n\t\"area\": \"area[shape coords href alt]/\",\n\t\"area:d\": \"area[shape=default]\",\n\t\"area:c\": \"area[shape=circle]\",\n\t\"area:r\": \"area[shape=rect]\",\n\t\"area:p\": \"area[shape=poly]\",\n\t\"form\": \"form[action]\",\n\t\"form:get\": \"form[method=get]\",\n\t\"form:post\": \"form[method=post]\",\n\t\"label\": \"label[for]\",\n\t\"input\": \"input[type=${1:text}]/\",\n\t\"inp\": \"input[name=${1} id=${1}]\",\n\t\"input:h|input:hidden\": \"input[type=hidden name]\",\n\t\"input:t|input:text\": \"inp[type=text]\",\n\t\"input:search\": \"inp[type=search]\",\n\t\"input:email\": \"inp[type=email]\",\n\t\"input:url\": \"inp[type=url]\",\n\t\"input:p|input:password\": \"inp[type=password]\",\n\t\"input:datetime\": \"inp[type=datetime]\",\n\t\"input:date\": \"inp[type=date]\",\n\t\"input:datetime-local\": \"inp[type=datetime-local]\",\n\t\"input:month\": \"inp[type=month]\",\n\t\"input:week\": \"inp[type=week]\",\n\t\"input:time\": \"inp[type=time]\",\n\t\"input:tel\": \"inp[type=tel]\",\n\t\"input:number\": \"inp[type=number]\",\n\t\"input:color\": \"inp[type=color]\",\n\t\"input:c|input:checkbox\": \"inp[type=checkbox]\",\n\t\"input:r|input:radio\": \"inp[type=radio]\",\n\t\"input:range\": \"inp[type=range]\",\n\t\"input:f|input:file\": \"inp[type=file]\",\n\t\"input:s|input:submit\": \"input[type=submit value]\",\n\t\"input:i|input:image\": \"input[type=image src alt]\",\n\t\"input:b|input:btn|input:button\": \"input[type=button value]\",\n\t\"input:reset\": \"input:button[type=reset]\",\n\t\"isindex\": \"isindex/\",\n\t\"select\": \"select[name=${1} id=${1}]\",\n\t\"select:d|select:disabled\": \"select[disabled.]\",\n\t\"opt|option\": \"option[value]\",\n\t\"textarea\": \"textarea[name=${1} id=${1} cols=${2:30} rows=${3:10}]\",\n\t\"marquee\": \"marquee[behavior direction]\",\n\t\"menu:c|menu:context\": \"menu[type=context]\",\n\t\"menu:t|menu:toolbar\": \"menu[type=toolbar]\",\n\t\"video\": \"video[src]\",\n\t\"audio\": \"audio[src]\",\n\t\"html:xml\": \"html[xmlns=http://www.w3.org/1999/xhtml]\",\n\t\"keygen\": \"keygen/\",\n\t\"command\": \"command/\",\n\t\"btn:s|button:s|button:submit\" : \"button[type=submit]\",\n\t\"btn:r|button:r|button:reset\" : \"button[type=reset]\",\n\t\"btn:d|button:d|button:disabled\" : \"button[disabled.]\",\n\t\"fst:d|fset:d|fieldset:d|fieldset:disabled\" : \"fieldset[disabled.]\",\n\n\t\"bq\": \"blockquote\",\n\t\"fig\": \"figure\",\n\t\"figc\": \"figcaption\",\n\t\"pic\": \"picture\",\n\t\"ifr\": \"iframe\",\n\t\"emb\": \"embed\",\n\t\"obj\": \"object\",\n\t\"cap\": \"caption\",\n\t\"colg\": \"colgroup\",\n\t\"fst\": \"fieldset\",\n\t\"btn\": \"button\",\n\t\"optg\": \"optgroup\",\n\t\"tarea\": \"textarea\",\n\t\"leg\": \"legend\",\n\t\"sect\": \"section\",\n\t\"art\": \"article\",\n\t\"hdr\": \"header\",\n\t\"ftr\": \"footer\",\n\t\"adr\": \"address\",\n\t\"dlg\": \"dialog\",\n\t\"str\": \"strong\",\n\t\"prog\": \"progress\",\n\t\"mn\": \"main\",\n\t\"tem\": \"template\",\n\t\"fset\": \"fieldset\",\n\t\"datag\": \"datagrid\",\n\t\"datal\": \"datalist\",\n\t\"kg\": \"keygen\",\n\t\"out\": \"output\",\n\t\"det\": \"details\",\n\t\"sum\": \"summary\",\n\t\"cmd\": \"command\",\n\n\t\"ri:d|ri:dpr\": \"img:s\",\n\t\"ri:v|ri:viewport\": \"img:z\",\n\t\"ri:a|ri:art\": \"pic>src:m+img\",\n\t\"ri:t|ri:type\": \"pic>src:t+img\",\n\n\t\"!!!\": \"{<!DOCTYPE html>}\",\n\t\"doc\": \"html[lang=${lang}]>(head>meta[charset=${charset}]+meta[http-equiv='X-UA-Compatible'][content='IE=edge']+meta:vp+title{${1:Document}})+body\",\n\t\"!|html:5\": \"!!!+doc\",\n\n\t\"c\": \"{<!-- ${0} -->}\",\n\t\"cc:ie\": \"{<!--[if IE]>${0}<![endif]-->}\",\n\t\"cc:noie\": \"{<!--[if !IE]><!-->${0}<!--<![endif]-->}\"\n};\n\nvar stylesheetSnippets = {\n\t\"@f\": \"@font-face {\\n\\tfont-family: ${1};\\n\\tsrc: url(${2});\\n}\",\n\t\"@ff\": \"@font-face {\\n\\tfont-family: '${1:FontName}';\\n\\tsrc: url('${2:FileName}.eot');\\n\\tsrc: url('${2:FileName}.eot?#iefix') format('embedded-opentype'),\\n\\t\\t url('${2:FileName}.woff') format('woff'),\\n\\t\\t url('${2:FileName}.ttf') format('truetype'),\\n\\t\\t url('${2:FileName}.svg#${1:FontName}') format('svg');\\n\\tfont-style: ${3:normal};\\n\\tfont-weight: ${4:normal};\\n}\",\n\t\"@i|@import\": \"@import url(${0});\",\n\t\"@kf\": \"@keyframes ${1:identifier} {\\n\\t${2}\\n}\",\n\t\"@m|@media\": \"@media ${1:screen} {\\n\\t${0}\\n}\",\n\t\"ac\": \"align-content:start|end|flex-start|flex-end|center|space-between|space-around|stretch|space-evenly\",\n\t\"ai\": \"align-items:start|end|flex-start|flex-end|center|baseline|stretch\",\n\t\"anim\": \"animation:${1:name} ${2:duration} ${3:timing-function} ${4:delay} ${5:iteration-count} ${6:direction} ${7:fill-mode}\",\n\t\"animdel\": \"animation-delay:time\",\n\t\"animdir\": \"animation-direction:normal|reverse|alternate|alternate-reverse\",\n\t\"animdur\": \"animation-duration:${1:0}s\",\n\t\"animfm\": \"animation-fill-mode:both|forwards|backwards\",\n\t\"animic\": \"animation-iteration-count:1|infinite\",\n\t\"animn\": \"animation-name\",\n\t\"animps\": \"animation-play-state:running|paused\",\n\t\"animtf\": \"animation-timing-function:linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(${1:0.1}, ${2:0.7}, ${3:1.0}, ${3:0.1})\",\n\t\"ap\": \"appearance:none\",\n\t\"as\": \"align-self:start|end|auto|flex-start|flex-end|center|baseline|stretch\",\n\t\"b\": \"bottom\",\n\t\"bd\": \"border:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdb\": \"border-bottom:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdbc\": \"border-bottom-color:${1:#000}\",\n\t\"bdbi\": \"border-bottom-image:url(${0})\",\n\t\"bdbk\": \"border-break:close\",\n\t\"bdbli\": \"border-bottom-left-image:url(${0})|continue\",\n\t\"bdblrs\": \"border-bottom-left-radius\",\n\t\"bdbri\": \"border-bottom-right-image:url(${0})|continue\",\n\t\"bdbrrs\": \"border-bottom-right-radius\",\n\t\"bdbs\": \"border-bottom-style\",\n\t\"bdbw\": \"border-bottom-width\",\n\t\"bdc\": \"border-color:${1:#000}\",\n\t\"bdci\": \"border-corner-image:url(${0})|continue\",\n\t\"bdcl\": \"border-collapse:collapse|separate\",\n\t\"bdf\": \"border-fit:repeat|clip|scale|stretch|overwrite|overflow|space\",\n\t\"bdi\": \"border-image:url(${0})\",\n\t\"bdl\": \"border-left:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdlc\": \"border-left-color:${1:#000}\",\n\t\"bdlen\": \"border-length\",\n\t\"bdli\": \"border-left-image:url(${0})\",\n\t\"bdls\": \"border-left-style\",\n\t\"bdlw\": \"border-left-width\",\n\t\"bdr\": \"border-right:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdrc\": \"border-right-color:${1:#000}\",\n\t\"bdri\": \"border-right-image:url(${0})\",\n\t\"bdrs\": \"border-radius\",\n\t\"bdrst\": \"border-right-style\",\n\t\"bdrw\": \"border-right-width\",\n\t\"bds\": \"border-style:none|hidden|dotted|dashed|solid|double|dot-dash|dot-dot-dash|wave|groove|ridge|inset|outset\",\n\t\"bdsp\": \"border-spacing\",\n\t\"bdt\": \"border-top:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdtc\": \"border-top-color:${1:#000}\",\n\t\"bdti\": \"border-top-image:url(${0})\",\n\t\"bdtli\": \"border-top-left-image:url(${0})|continue\",\n\t\"bdtlrs\": \"border-top-left-radius\",\n\t\"bdtri\": \"border-top-right-image:url(${0})|continue\",\n\t\"bdtrrs\": \"border-top-right-radius\",\n\t\"bdts\": \"border-top-style\",\n\t\"bdtw\": \"border-top-width\",\n\t\"bdw\": \"border-width\",\n\t\"bfv\": \"backface-visibility:hidden|visible\",\n\t\"bg\": \"background:${1:#000}\",\n\t\"bga\": \"background-attachment:fixed|scroll\",\n\t\"bgbk\": \"background-break:bounding-box|each-box|continuous\",\n\t\"bgc\": \"background-color:#${1:fff}\",\n\t\"bgcp\": \"background-clip:padding-box|border-box|content-box|no-clip\",\n\t\"bgi\": \"background-image:url(${0})\",\n\t\"bgo\": \"background-origin:padding-box|border-box|content-box\",\n\t\"bgp\": \"background-position:${1:0} ${2:0}\",\n\t\"bgpx\": \"background-position-x\",\n\t\"bgpy\": \"background-position-y\",\n\t\"bgr\": \"background-repeat:no-repeat|repeat-x|repeat-y|space|round\",\n\t\"bgsz\": \"background-size:contain|cover\",\n\t\"bxsh\": \"box-shadow:${1:inset }${2:hoff} ${3:voff} ${4:blur} ${5:#000}|none\",\n\t\"bxsz\": \"box-sizing:border-box|content-box|border-box\",\n\t\"c\": \"color:${1:#000}\",\n\t\"cr\": \"color:rgb(${1:0}, ${2:0}, ${3:0})\",\n\t\"cra\": \"color:rgba(${1:0}, ${2:0}, ${3:0}, ${4:.5})\",\n\t\"cl\": \"clear:both|left|right|none\",\n\t\"cm\": \"/* ${0} */\",\n\t\"cnt\": \"content:'${0}'|normal|open-quote|no-open-quote|close-quote|no-close-quote|attr(${0})|counter(${0})|counters(${0})\",\n\t\"coi\": \"counter-increment\",\n\t\"colm\": \"columns\",\n\t\"colmc\": \"column-count\",\n\t\"colmf\": \"column-fill\",\n\t\"colmg\": \"column-gap\",\n\t\"colmr\": \"column-rule\",\n\t\"colmrc\": \"column-rule-color\",\n\t\"colmrs\": \"column-rule-style\",\n\t\"colmrw\": \"column-rule-width\",\n\t\"colms\": \"column-span\",\n\t\"colmw\": \"column-width\",\n\t\"cor\": \"counter-reset\",\n\t\"cp\": \"clip:auto|rect(${1:top} ${2:right} ${3:bottom} ${4:left})\",\n\t\"cps\": \"caption-side:top|bottom\",\n\t\"cur\": \"cursor:pointer|auto|default|crosshair|hand|help|move|pointer|text\",\n\t\"d\": \"display:block|none|flex|inline-flex|inline|inline-block|grid|inline-grid|subgrid|list-item|run-in|compact|table|inline-table|table-caption|table-column|table-column-group|table-header-group|table-footer-group|table-row|table-row-group|table-cell|ruby|ruby-base|ruby-base-group|ruby-text|ruby-text-group\",\n\t\"ec\": \"empty-cells:show|hide\",\n\t\"f\": \"font:${1:1em} ${2:sans-serif}\",\n\t\"fd\": \"font-display:auto|block|swap|fallback|optional\",\n\t\"fef\": \"font-effect:none|engrave|emboss|outline\",\n\t\"fem\": \"font-emphasize\",\n\t\"femp\": \"font-emphasize-position:before|after\",\n\t\"fems\": \"font-emphasize-style:none|accent|dot|circle|disc\",\n\t\"ff\": \"font-family:serif|sans-serif|cursive|fantasy|monospace\",\n\t\"fft\": \"font-family:\\\"Times New Roman\\\", Times, Baskerville, Georgia, serif\",\n\t\"ffa\": \"font-family:Arial, \\\"Helvetica Neue\\\", Helvetica, sans-serif\",\n\t\"ffv\": \"font-family:Verdana, Geneva, sans-serif\",\n\t\"fl\": \"float:left|right|none\",\n\t\"fs\": \"font-style:italic|normal|oblique\",\n\t\"fsm\": \"font-smoothing:antialiased|subpixel-antialiased|none\",\n\t\"fst\": \"font-stretch:normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded\",\n\t\"fv\": \"font-variant:normal|small-caps\",\n\t\"fvs\": \"font-variation-settings:normal|inherit|initial|unset\",\n\t\"fw\": \"font-weight:normal|bold|bolder|lighter\",\n\t\"fx\": \"flex\",\n\t\"fxb\": \"flex-basis:fill|max-content|min-content|fit-content|content\",\n\t\"fxd\": \"flex-direction:row|row-reverse|column|column-reverse\",\n\t\"fxf\": \"flex-flow\",\n\t\"fxg\": \"flex-grow\",\n\t\"fxsh\": \"flex-shrink\",\n\t\"fxw\": \"flex-wrap:nowrap|wrap|wrap-reverse\",\n\t\"fsz\": \"font-size\",\n\t\"fsza\": \"font-size-adjust\",\n\t\"gtc\": \"grid-template-columns:repeat()|minmax()\",\n\t\"gtr\": \"grid-template-rows:repeat()|minmax()\",\n\t\"gta\": \"grid-template-areas\",\n\t\"gt\": \"grid-template\",\n\t\"gg\": \"grid-gap\",\n\t\"gcg\": \"grid-column-gap\",\n\t\"grg\": \"grid-row-gap\",\n\t\"gac\": \"grid-auto-columns:auto|minmax()\",\n\t\"gar\": \"grid-auto-rows:auto|minmax()\",\n\t\"gaf\": \"grid-auto-flow:row|column|dense|inherit|initial|unset\",\n\t\"gd\": \"grid\",\n\t\"gc\": \"grid-column\",\n\t\"gcs\": \"grid-column-start\",\n\t\"gce\": \"grid-column-end\",\n\t\"gr\": \"grid-row\",\n\t\"grs\": \"grid-row-start\",\n\t\"gre\": \"grid-row-end\",\n\t\"ga\": \"grid-area\",\n\t\"h\": \"height\",\n\t\"jc\": \"justify-content:start|end|stretch|flex-start|flex-end|center|space-between|space-around|space-evenly\",\n\t\"ji\": \"justify-items:start|end|center|stretch\",\n\t\"js\": \"justify-self:start|end|center|stretch\",\n\t\"l\": \"left\",\n\t\"lg\": \"background-image:linear-gradient(${1})\",\n\t\"lh\": \"line-height\",\n\t\"lis\": \"list-style\",\n\t\"lisi\": \"list-style-image\",\n\t\"lisp\": \"list-style-position:inside|outside\",\n\t\"list\": \"list-style-type:disc|circle|square|decimal|decimal-leading-zero|lower-roman|upper-roman\",\n\t\"lts\": \"letter-spacing:normal\",\n\t\"m\": \"margin\",\n\t\"mah\": \"max-height\",\n\t\"mar\": \"max-resolution\",\n\t\"maw\": \"max-width\",\n\t\"mb\": \"margin-bottom\",\n\t\"mih\": \"min-height\",\n\t\"mir\": \"min-resolution\",\n\t\"miw\": \"min-width\",\n\t\"ml\": \"margin-left\",\n\t\"mr\": \"margin-right\",\n\t\"mt\": \"margin-top\",\n\t\"ol\": \"outline\",\n\t\"olc\": \"outline-color:${1:#000}|invert\",\n\t\"olo\": \"outline-offset\",\n\t\"ols\": \"outline-style:none|dotted|dashed|solid|double|groove|ridge|inset|outset\",\n\t\"olw\": \"outline-width|thin|medium|thick\",\n\t\"op|opa\": \"opacity\",\n\t\"ord\": \"order\",\n\t\"ori\": \"orientation:landscape|portrait\",\n\t\"orp\": \"orphans\",\n\t\"ov\": \"overflow:hidden|visible|hidden|scroll|auto\",\n\t\"ovs\": \"overflow-style:scrollbar|auto|scrollbar|panner|move|marquee\",\n\t\"ovx\": \"overflow-x:hidden|visible|hidden|scroll|auto\",\n\t\"ovy\": \"overflow-y:hidden|visible|hidden|scroll|auto\",\n\t\"p\": \"padding\",\n\t\"pb\": \"padding-bottom\",\n\t\"pgba\": \"page-break-after:auto|always|left|right\",\n\t\"pgbb\": \"page-break-before:auto|always|left|right\",\n\t\"pgbi\": \"page-break-inside:auto|avoid\",\n\t\"pl\": \"padding-left\",\n\t\"pos\": \"position:relative|absolute|relative|fixed|static\",\n\t\"pr\": \"padding-right\",\n\t\"pt\": \"padding-top\",\n\t\"q\": \"quotes\",\n\t\"qen\": \"quotes:'\\\\201C' '\\\\201D' '\\\\2018' '\\\\2019'\",\n\t\"qru\": \"quotes:'\\\\00AB' '\\\\00BB' '\\\\201E' '\\\\201C'\",\n\t\"r\": \"right\",\n\t\"rsz\": \"resize:none|both|horizontal|vertical\",\n\t\"t\": \"top\",\n\t\"ta\": \"text-align:left|center|right|justify\",\n\t\"tal\": \"text-align-last:left|center|right\",\n\t\"tbl\": \"table-layout:fixed\",\n\t\"td\": \"text-decoration:none|underline|overline|line-through\",\n\t\"te\": \"text-emphasis:none|accent|dot|circle|disc|before|after\",\n\t\"th\": \"text-height:auto|font-size|text-size|max-size\",\n\t\"ti\": \"text-indent\",\n\t\"tj\": \"text-justify:auto|inter-word|inter-ideograph|inter-cluster|distribute|kashida|tibetan\",\n\t\"to\": \"text-outline:${1:0} ${2:0} ${3:#000}\",\n\t\"tov\": \"text-overflow:ellipsis|clip\",\n\t\"tr\": \"text-replace\",\n\t\"trf\": \"transform:${1}|skewX(${1:angle})|skewY(${1:angle})|scale(${1:x}, ${2:y})|scaleX(${1:x})|scaleY(${1:y})|scaleZ(${1:z})|scale3d(${1:x}, ${2:y}, ${3:z})|rotate(${1:angle})|rotateX(${1:angle})|rotateY(${1:angle})|rotateZ(${1:angle})|translate(${1:x}, ${2:y})|translateX(${1:x})|translateY(${1:y})|translateZ(${1:z})|translate3d(${1:tx}, ${2:ty}, ${3:tz})\",\n\t\"trfo\": \"transform-origin\",\n\t\"trfs\": \"transform-style:preserve-3d\",\n\t\"trs\": \"transition:${1:prop} ${2:time}\",\n\t\"trsde\": \"transition-delay:${1:time}\",\n\t\"trsdu\": \"transition-duration:${1:time}\",\n\t\"trsp\": \"transition-property:${1:prop}\",\n\t\"trstf\": \"transition-timing-function:${1:fn}\",\n\t\"tsh\": \"text-shadow:${1:hoff} ${2:voff} ${3:blur} ${4:#000}\",\n\t\"tt\": \"text-transform:uppercase|lowercase|capitalize|none\",\n\t\"tw\": \"text-wrap:none|normal|unrestricted|suppress\",\n\t\"us\": \"user-select:none\",\n\t\"v\": \"visibility:hidden|visible|collapse\",\n\t\"va\": \"vertical-align:top|super|text-top|middle|baseline|bottom|text-bottom|sub\",\n\t\"w\": \"width\",\n\t\"whs\": \"white-space:nowrap|pre|pre-wrap|pre-line|normal\",\n\t\"whsc\": \"white-space-collapse:normal|keep-all|loose|break-strict|break-all\",\n\t\"wid\": \"widows\",\n\t\"wm\": \"writing-mode:lr-tb|lr-tb|lr-bt|rl-tb|rl-bt|tb-rl|tb-lr|bt-lr|bt-rl\",\n\t\"wob\": \"word-break:normal|keep-all|break-all\",\n\t\"wos\": \"word-spacing\",\n\t\"wow\": \"word-wrap:none|unrestricted|suppress|break-word|normal\",\n\t\"z\": \"z-index\",\n\t\"zom\": \"zoom:1\"\n};\n\nvar xslSnippets = {\n    \"tm|tmatch\": \"xsl:template[match mode]\",\n    \"tn|tname\": \"xsl:template[name]\",\n    \"call\": \"xsl:call-template[name]\",\n    \"ap\": \"xsl:apply-templates[select mode]\",\n    \"api\": \"xsl:apply-imports\",\n    \"imp\": \"xsl:import[href]\",\n    \"inc\": \"xsl:include[href]\",\n    \"ch\": \"xsl:choose\",\n    \"wh|xsl:when\": \"xsl:when[test]\",\n    \"ot\": \"xsl:otherwise\",\n    \"if\": \"xsl:if[test]\",\n    \"par\": \"xsl:param[name]\",\n    \"pare\": \"xsl:param[name select]\",\n    \"var\": \"xsl:variable[name]\",\n    \"vare\": \"xsl:variable[name select]\",\n    \"wp\": \"xsl:with-param[name select]\",\n    \"key\": \"xsl:key[name match use]\",\n    \"elem\": \"xsl:element[name]\",\n    \"attr\": \"xsl:attribute[name]\",\n    \"attrs\": \"xsl:attribute-set[name]\",\n    \"cp\": \"xsl:copy[select]\",\n    \"co\": \"xsl:copy-of[select]\",\n    \"val\": \"xsl:value-of[select]\",\n    \"for|each\": \"xsl:for-each[select]\",\n    \"tex\": \"xsl:text\",\n    \"com\": \"xsl:comment\",\n    \"msg\": \"xsl:message[terminate=no]\",\n    \"fall\": \"xsl:fallback\",\n    \"num\": \"xsl:number[value]\",\n    \"nam\": \"namespace-alias[stylesheet-prefix result-prefix]\",\n    \"pres\": \"xsl:preserve-space[elements]\",\n    \"strip\": \"xsl:strip-space[elements]\",\n    \"proc\": \"xsl:processing-instruction[name]\",\n    \"sort\": \"xsl:sort[select order]\",\n    \"choose\": \"xsl:choose>xsl:when+xsl:otherwise\",\n    \"xsl\": \"!!!+xsl:stylesheet[version=1.0 xmlns:xsl=http://www.w3.org/1999/XSL/Transform]>{\\n|}\",\n    \"!!!\": \"{<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>}\"\n};\n\nvar pugSnippets = {\n\t\"!!!\": \"{doctype html}\"\n};\n\nvar variables = {\n\t\"lang\": \"en\",\n\t\"locale\": \"en-US\",\n\t\"charset\": \"UTF-8\",\n\t\"indentation\": \"\\t\",\n\t\"newline\": \"\\n\"\n};\n\n/**\n * Default syntaxes for abbreviation types\n */\nconst defaultSyntaxes = {\n    markup: 'html',\n    stylesheet: 'css'\n};\nconst defaultOptions = {\n    'inlineElements': [\n        'a', 'abbr', 'acronym', 'applet', 'b', 'basefont', 'bdo',\n        'big', 'br', 'button', 'cite', 'code', 'del', 'dfn', 'em', 'font', 'i',\n        'iframe', 'img', 'input', 'ins', 'kbd', 'label', 'map', 'object', 'q',\n        's', 'samp', 'select', 'small', 'span', 'strike', 'strong', 'sub', 'sup',\n        'textarea', 'tt', 'u', 'var'\n    ],\n    'output.indent': '\\t',\n    'output.baseIndent': '',\n    'output.newline': '\\n',\n    'output.tagCase': '',\n    'output.attributeCase': '',\n    'output.attributeQuotes': 'double',\n    'output.format': true,\n    'output.formatLeafNode': false,\n    'output.formatSkip': ['html'],\n    'output.formatForce': ['body'],\n    'output.inlineBreak': 3,\n    'output.compactBoolean': false,\n    'output.booleanAttributes': [\n        'contenteditable', 'seamless', 'async', 'autofocus',\n        'autoplay', 'checked', 'controls', 'defer', 'disabled', 'formnovalidate',\n        'hidden', 'ismap', 'loop', 'multiple', 'muted', 'novalidate', 'readonly',\n        'required', 'reversed', 'selected', 'typemustmatch'\n    ],\n    'output.reverseAttributes': false,\n    'output.selfClosingStyle': 'html',\n    'output.field': (index, placeholder) => placeholder,\n    'output.text': text => text,\n    'markup.href': true,\n    'comment.enabled': false,\n    'comment.trigger': ['id', 'class'],\n    'comment.before': '',\n    'comment.after': '\\n<!-- /[#ID][.CLASS] -->',\n    'bem.enabled': false,\n    'bem.element': '__',\n    'bem.modifier': '_',\n    'jsx.enabled': false,\n    'stylesheet.keywords': ['auto', 'inherit', 'unset', 'none'],\n    'stylesheet.unitless': ['z-index', 'line-height', 'opacity', 'font-weight', 'zoom', 'flex', 'flex-grow', 'flex-shrink'],\n    'stylesheet.shortHex': true,\n    'stylesheet.between': ': ',\n    'stylesheet.after': ';',\n    'stylesheet.intUnit': 'px',\n    'stylesheet.floatUnit': 'em',\n    'stylesheet.unitAliases': { e: 'em', p: '%', x: 'ex', r: 'rem' },\n    'stylesheet.json': false,\n    'stylesheet.jsonDoubleQuotes': false,\n    'stylesheet.fuzzySearchMinScore': 0\n};\nconst defaultConfig = {\n    type: 'markup',\n    syntax: 'html',\n    variables,\n    snippets: {},\n    options: defaultOptions\n};\n/**\n * Default per-syntax config\n */\nconst syntaxConfig = {\n    markup: {\n        snippets: parseSnippets(markupSnippets),\n    },\n    xhtml: {\n        options: {\n            'output.selfClosingStyle': 'xhtml'\n        }\n    },\n    xml: {\n        options: {\n            'output.selfClosingStyle': 'xml'\n        }\n    },\n    xsl: {\n        snippets: parseSnippets(xslSnippets),\n        options: {\n            'output.selfClosingStyle': 'xml'\n        }\n    },\n    jsx: {\n        options: {\n            'jsx.enabled': true\n        }\n    },\n    pug: {\n        snippets: parseSnippets(pugSnippets)\n    },\n    stylesheet: {\n        snippets: parseSnippets(stylesheetSnippets)\n    },\n    sass: {\n        options: {\n            'stylesheet.after': ''\n        }\n    },\n    stylus: {\n        options: {\n            'stylesheet.between': ' ',\n            'stylesheet.after': '',\n        }\n    }\n};\n/**\n * Parses raw snippets definitions with possibly multiple keys into a plan\n * snippet map\n */\nfunction parseSnippets(snippets) {\n    const result = {};\n    Object.keys(snippets).forEach(k => {\n        for (const name of k.split('|')) {\n            result[name] = snippets[k];\n        }\n    });\n    return result;\n}\nfunction resolveConfig(config = {}, globals = {}) {\n    const type = config.type || 'markup';\n    const syntax = config.syntax || defaultSyntaxes[type];\n    return Object.assign(Object.assign(Object.assign({}, defaultConfig), config), { type,\n        syntax, variables: mergedData(type, syntax, 'variables', config, globals), snippets: mergedData(type, syntax, 'snippets', config, globals), options: mergedData(type, syntax, 'options', config, globals) });\n}\nfunction mergedData(type, syntax, key, config, globals = {}) {\n    const typeDefaults = syntaxConfig[type];\n    const typeOverride = globals[type];\n    const syntaxDefaults = syntaxConfig[syntax];\n    const syntaxOverride = globals[syntax];\n    return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, defaultConfig[key]), (typeDefaults && typeDefaults[key])), (syntaxDefaults && syntaxDefaults[key])), (typeOverride && typeOverride[key])), (syntaxOverride && syntaxOverride[key])), config[key]);\n}\n\n/**\n * Creates structure for scanning given string in backward direction\n */\nfunction backwardScanner(text, start = 0) {\n    return { text, start, pos: text.length };\n}\n/**\n * Check if given scanner position is at start of scanned text\n */\nfunction sol(scanner) {\n    return scanner.pos === scanner.start;\n}\n/**\n * “Peeks” character code an current scanner location without advancing it\n */\nfunction peek$1(scanner, offset = 0) {\n    return scanner.text.charCodeAt(scanner.pos - 1 + offset);\n}\n/**\n * Returns current character code and moves character location one symbol back\n */\nfunction previous(scanner) {\n    if (!sol(scanner)) {\n        return scanner.text.charCodeAt(--scanner.pos);\n    }\n}\n/**\n * Consumes current character code if it matches given `match` code or function\n */\nfunction consume(scanner, match) {\n    if (sol(scanner)) {\n        return false;\n    }\n    const ok = typeof match === 'function'\n        ? match(peek$1(scanner))\n        : match === peek$1(scanner);\n    if (ok) {\n        scanner.pos--;\n    }\n    return !!ok;\n}\nfunction consumeWhile(scanner, match) {\n    const start = scanner.pos;\n    while (consume(scanner, match)) {\n        // empty\n    }\n    return scanner.pos < start;\n}\n\n/**\n * Check if given character code is a quote\n */\nfunction isQuote(c) {\n    return c === 39 /* SingleQuote */ || c === 34 /* DoubleQuote */;\n}\n/**\n * Consumes quoted value, if possible\n * @return Returns `true` is value was consumed\n */\nfunction consumeQuoted(scanner) {\n    const start = scanner.pos;\n    const quote = previous(scanner);\n    if (isQuote(quote)) {\n        while (!sol(scanner)) {\n            if (previous(scanner) === quote && peek$1(scanner) !== 92 /* Escape */) {\n                return true;\n            }\n        }\n    }\n    scanner.pos = start;\n    return false;\n}\n\nconst bracePairs = {\n    [91 /* SquareL */]: 93 /* SquareR */,\n    [40 /* RoundL */]: 41 /* RoundR */,\n    [123 /* CurlyL */]: 125 /* CurlyR */,\n};\n\n/**\n * Check if given reader’s current position points at the end of HTML tag\n */\nfunction isHtml(scanner) {\n    const start = scanner.pos;\n    if (!consume(scanner, 62 /* AngleRight */)) {\n        return false;\n    }\n    let ok = false;\n    consume(scanner, 47 /* Slash */); // possibly self-closed element\n    while (!sol(scanner)) {\n        consumeWhile(scanner, isWhiteSpace);\n        if (consumeIdent(scanner)) {\n            // ate identifier: could be a tag name, boolean attribute or unquoted\n            // attribute value\n            if (consume(scanner, 47 /* Slash */)) {\n                // either closing tag or invalid tag\n                ok = consume(scanner, 60 /* AngleLeft */);\n                break;\n            }\n            else if (consume(scanner, 60 /* AngleLeft */)) {\n                // opening tag\n                ok = true;\n                break;\n            }\n            else if (consume(scanner, isWhiteSpace)) {\n                // boolean attribute\n                continue;\n            }\n            else if (consume(scanner, 61 /* Equals */)) {\n                // simple unquoted value or invalid attribute\n                if (consumeIdent(scanner)) {\n                    continue;\n                }\n                break;\n            }\n            else if (consumeAttributeWithUnquotedValue(scanner)) {\n                // identifier was a part of unquoted value\n                ok = true;\n                break;\n            }\n            // invalid tag\n            break;\n        }\n        if (consumeAttribute(scanner)) {\n            continue;\n        }\n        break;\n    }\n    scanner.pos = start;\n    return ok;\n}\n/**\n * Consumes HTML attribute from given string.\n * @return `true` if attribute was consumed.\n */\nfunction consumeAttribute(scanner) {\n    return consumeAttributeWithQuotedValue(scanner) || consumeAttributeWithUnquotedValue(scanner);\n}\nfunction consumeAttributeWithQuotedValue(scanner) {\n    const start = scanner.pos;\n    if (consumeQuoted(scanner) && consume(scanner, 61 /* Equals */) && consumeIdent(scanner)) {\n        return true;\n    }\n    scanner.pos = start;\n    return false;\n}\nfunction consumeAttributeWithUnquotedValue(scanner) {\n    const start = scanner.pos;\n    const stack = [];\n    while (!sol(scanner)) {\n        const ch = peek$1(scanner);\n        if (isCloseBracket(ch)) {\n            stack.push(ch);\n        }\n        else if (isOpenBracket(ch)) {\n            if (stack.pop() !== bracePairs[ch]) {\n                // Unexpected open bracket\n                break;\n            }\n        }\n        else if (!isUnquotedValue(ch)) {\n            break;\n        }\n        scanner.pos--;\n    }\n    if (start !== scanner.pos && consume(scanner, 61 /* Equals */) && consumeIdent(scanner)) {\n        return true;\n    }\n    scanner.pos = start;\n    return false;\n}\n/**\n * Consumes HTML identifier from stream\n */\nfunction consumeIdent(scanner) {\n    return consumeWhile(scanner, isIdent);\n}\n/**\n * Check if given character code belongs to HTML identifier\n */\nfunction isIdent(ch) {\n    return ch === 58 /* Colon */ || ch === 45 /* Dash */ || isAlpha(ch) || isNumber(ch);\n}\n/**\n * Check if given character code is alpha code (letter though A to Z)\n */\nfunction isAlpha(ch) {\n    ch &= ~32; // quick hack to convert any char code to uppercase char code\n    return ch >= 65 && ch <= 90; // A-Z\n}\n/**\n * Check if given code is a number\n */\nfunction isNumber(ch) {\n    return ch > 47 && ch < 58;\n}\n/**\n * Check if given code is a whitespace\n */\nfunction isWhiteSpace(ch) {\n    return ch === 32 /* Space */ || ch === 9 /* Tab */;\n}\n/**\n * Check if given code may belong to unquoted attribute value\n */\nfunction isUnquotedValue(ch) {\n    return !isNaN(ch) && ch !== 61 /* Equals */ && !isWhiteSpace(ch) && !isQuote(ch);\n}\nfunction isOpenBracket(ch) {\n    return ch === 123 /* CurlyL */ || ch === 40 /* RoundL */ || ch === 91 /* SquareL */;\n}\nfunction isCloseBracket(ch) {\n    return ch === 125 /* CurlyR */ || ch === 41 /* RoundR */ || ch === 93 /* SquareR */;\n}\n\nconst code = (ch) => ch.charCodeAt(0);\nconst specialChars = '#.*:$-_!@%^+>/'.split('').map(code);\nconst defaultOptions$1 = {\n    type: 'markup',\n    lookAhead: true,\n    prefix: ''\n};\n/**\n * Extracts Emmet abbreviation from given string.\n * The goal of this module is to extract abbreviation from current editor’s line,\n * e.g. like this: `<span>.foo[title=bar|]</span>` -> `.foo[title=bar]`, where\n * `|` is a current caret position.\n * @param line A text line where abbreviation should be expanded\n * @param pos Caret position in line. If not given, uses end of line\n * @param options Extracting options\n */\nfunction extractAbbreviation(line, pos = line.length, options = {}) {\n    // make sure `pos` is within line range\n    const opt = Object.assign(Object.assign({}, defaultOptions$1), options);\n    pos = Math.min(line.length, Math.max(0, pos == null ? line.length : pos));\n    if (opt.lookAhead) {\n        pos = offsetPastAutoClosed(line, pos, opt);\n    }\n    let ch;\n    const start = getStartOffset(line, pos, opt.prefix || '');\n    if (start === -1) {\n        return void 0;\n    }\n    const scanner = backwardScanner(line, start);\n    scanner.pos = pos;\n    const stack = [];\n    while (!sol(scanner)) {\n        ch = peek$1(scanner);\n        if (stack.includes(125 /* CurlyR */)) {\n            if (ch === 125 /* CurlyR */) {\n                stack.push(ch);\n                scanner.pos--;\n                continue;\n            }\n            if (ch !== 123 /* CurlyL */) {\n                scanner.pos--;\n                continue;\n            }\n        }\n        if (isCloseBrace(ch, opt.type)) {\n            stack.push(ch);\n        }\n        else if (isOpenBrace(ch, opt.type)) {\n            if (stack.pop() !== bracePairs[ch]) {\n                // unexpected brace\n                break;\n            }\n        }\n        else if (stack.includes(93 /* SquareR */) || stack.includes(125 /* CurlyR */)) {\n            // respect all characters inside attribute sets or text nodes\n            scanner.pos--;\n            continue;\n        }\n        else if (isHtml(scanner) || !isAbbreviation(ch)) {\n            break;\n        }\n        scanner.pos--;\n    }\n    if (!stack.length && scanner.pos !== pos) {\n        // Found something, remove some invalid symbols from the\n        // beginning and return abbreviation\n        const abbreviation = line.slice(scanner.pos, pos).replace(/^[*+>^]+/, '');\n        return {\n            abbreviation,\n            location: pos - abbreviation.length,\n            start: options.prefix\n                ? start - options.prefix.length\n                : pos - abbreviation.length,\n            end: pos\n        };\n    }\n}\n/**\n * Returns new `line` index which is right after characters beyound `pos` that\n * editor will likely automatically close, e.g. }, ], and quotes\n */\nfunction offsetPastAutoClosed(line, pos, options) {\n    // closing quote is allowed only as a next character\n    if (isQuote(line.charCodeAt(pos))) {\n        pos++;\n    }\n    // offset pointer until non-autoclosed character is found\n    while (isCloseBrace(line.charCodeAt(pos), options.type)) {\n        pos++;\n    }\n    return pos;\n}\n/**\n * Returns start offset (left limit) in `line` where we should stop looking for\n * abbreviation: it’s nearest to `pos` location of `prefix` token\n */\nfunction getStartOffset(line, pos, prefix) {\n    if (!prefix) {\n        return 0;\n    }\n    const scanner = backwardScanner(line);\n    const compiledPrefix = prefix.split('').map(code);\n    scanner.pos = pos;\n    let result;\n    while (!sol(scanner)) {\n        if (consumePair(scanner, 93 /* SquareR */, 91 /* SquareL */) || consumePair(scanner, 125 /* CurlyR */, 123 /* CurlyL */)) {\n            continue;\n        }\n        result = scanner.pos;\n        if (consumeArray(scanner, compiledPrefix)) {\n            return result;\n        }\n        scanner.pos--;\n    }\n    return -1;\n}\n/**\n * Consumes full character pair, if possible\n */\nfunction consumePair(scanner, close, open) {\n    const start = scanner.pos;\n    if (consume(scanner, close)) {\n        while (!sol(scanner)) {\n            if (consume(scanner, open)) {\n                return true;\n            }\n            scanner.pos--;\n        }\n    }\n    scanner.pos = start;\n    return false;\n}\n/**\n * Consumes all character codes from given array, right-to-left, if possible\n */\nfunction consumeArray(scanner, arr) {\n    const start = scanner.pos;\n    let consumed = false;\n    for (let i = arr.length - 1; i >= 0 && !sol(scanner); i--) {\n        if (!consume(scanner, arr[i])) {\n            break;\n        }\n        consumed = i === 0;\n    }\n    if (!consumed) {\n        scanner.pos = start;\n    }\n    return consumed;\n}\nfunction isAbbreviation(ch) {\n    return (ch > 64 && ch < 91) // uppercase letter\n        || (ch > 96 && ch < 123) // lowercase letter\n        || (ch > 47 && ch < 58) // number\n        || specialChars.includes(ch); // special character\n}\nfunction isOpenBrace(ch, syntax) {\n    return ch === 40 /* RoundL */ || (syntax === 'markup' && (ch === 91 /* SquareL */ || ch === 123 /* CurlyL */));\n}\nfunction isCloseBrace(ch, syntax) {\n    return ch === 41 /* RoundR */ || (syntax === 'markup' && (ch === 93 /* SquareR */ || ch === 125 /* CurlyR */));\n}\n\nfunction expandAbbreviation(abbr, config) {\n    const resolvedConfig = resolveConfig(config);\n    return resolvedConfig.type === 'stylesheet'\n        ? stylesheet(abbr, resolvedConfig)\n        : markup(abbr, resolvedConfig);\n}\n/**\n * Expands given *markup* abbreviation (e.g. regular Emmet abbreviation that\n * produces structured output like HTML) and outputs it according to options\n * provided in config\n */\nfunction markup(abbr, config) {\n    return stringify(parse(abbr, config), config);\n}\n/**\n * Expands given *stylesheet* abbreviation (a special Emmet abbreviation designed for\n * stylesheet languages like CSS, SASS etc.) and outputs it according to options\n * provided in config\n */\nfunction stylesheet(abbr, config) {\n    return css(parse$1(abbr, config), config);\n}\n\nexport default expandAbbreviation;\nexport { extractAbbreviation as extract, markup, parse as parseMarkup, parse$1 as parseStylesheet, convertSnippets as parseStylesheetSnippets, resolveConfig, stringify as stringifyMarkup, css as stringifyStylesheet, stylesheet };\n//# sourceMappingURL=emmet.es.js.map\n","import { scan, attributes, createOptions } from '@emmetio/html-matcher';\nimport { scan as scan$1, splitValue } from '@emmetio/css-matcher';\nimport expand, { stylesheetAbbreviation, markupAbbreviation } from 'emmet';\n\nconst pairs = {\n    '{': '}',\n    '[': ']',\n    '(': ')'\n};\nconst pairsEnd = [];\nfor (const key of Object.keys(pairs)) {\n    pairsEnd.push(pairs[key]);\n}\n/**\n * Returns `true` if given character code is a space\n */\nfunction isSpace(code) {\n    return code === 32 /* space */\n        || code === 9 /* tab */\n        || code === 160 /* non-breaking space */\n        || code === 10 /* LF */\n        || code === 13; /* CR */\n}\nfunction pushRange(ranges, range) {\n    const prev = ranges[ranges.length - 1];\n    if (range && range[0] !== range[1] && (!prev || prev[0] !== range[0] || prev[1] !== range[1])) {\n        ranges.push(range);\n    }\n}\n/**\n * Returns ranges of tokens in given value. Tokens are space-separated words.\n */\nfunction tokenList(value, offset = 0) {\n    const ranges = [];\n    const len = value.length;\n    let pos = 0;\n    let start = 0;\n    let end = 0;\n    while (pos < len) {\n        end = pos;\n        const ch = value.charCodeAt(pos++);\n        if (isSpace(ch)) {\n            if (start !== end) {\n                ranges.push([offset + start, offset + end]);\n            }\n            while (isSpace(value.charCodeAt(pos))) {\n                pos++;\n            }\n            start = pos;\n        }\n    }\n    if (start !== pos) {\n        ranges.push([offset + start, offset + pos]);\n    }\n    return ranges;\n}\n/**\n * Check if given character is a quote\n */\nfunction isQuote(ch) {\n    return ch === '\"' || ch === '\\'';\n}\n/**\n * Returns value of given attribute, parsed by Emmet HTML matcher\n */\nfunction attributeValue(attr) {\n    const { value } = attr;\n    return value && isQuoted(value)\n        ? value.slice(1, -1)\n        : value;\n}\nfunction attributeValueRange(tag, attr, offset = 0) {\n    let valueStart = attr.valueStart;\n    let valueEnd = attr.valueEnd;\n    if (isQuote(tag[valueStart])) {\n        valueStart++;\n    }\n    if (isQuote(tag[valueEnd - 1]) && valueEnd > valueStart) {\n        valueEnd--;\n    }\n    return [offset + valueStart, offset + valueEnd];\n}\n/**\n * Check if given value is either quoted or written as expression\n */\nfunction isQuoted(value) {\n    return !!value && (isQuotedString(value) || isExprString(value));\n}\n/**\n * Check if given string is quoted with single or double quotes\n */\nfunction isQuotedString(str) {\n    return str.length > 1 && isQuote(str[0]) && str[0] === str.slice(-1);\n}\n/**\n * Check if given string contains expression, e.g. wrapped with `{` and `}`\n */\nfunction isExprString(str) {\n    return str[0] === '{' && str.slice(-1) === '}';\n}\n/**\n * Returns last element of given array\n */\nfunction last(arr) {\n    return arr.length > 0 ? arr[arr.length - 1] : undefined;\n}\n\n/**\n * Check if there’s open or self-closing tag under given `pos` location in source code.\n * If found, returns its name, range in source and parsed attributes\n */\nfunction getOpenTag(code, pos) {\n    let tag = void 0;\n    // Find open or self-closing tag, closest to given position\n    scan(code, (name, type, start, end) => {\n        if (start < pos && end > pos) {\n            tag = { name, type, start, end };\n            if (type === 1 /* Open */ || type === 3 /* SelfClose */) {\n                tag.attributes = shiftAttributeRanges(attributes(code.slice(start, end), name), start);\n            }\n            return false;\n        }\n        if (end > pos) {\n            return false;\n        }\n    });\n    return tag;\n}\n/**\n * Returns list of matched tags in given source code\n */\nfunction getTagMatches(code, options) {\n    const opt = createOptions(options);\n    const stack = [];\n    const result = [];\n    scan(code, (name, type, start, end) => {\n        if (type === 3 /* SelfClose */) {\n            result.push({ name, open: [start, end] });\n        }\n        else if (type === 1 /* Open */) {\n            const item = { name, open: [start, end] };\n            stack.push(item);\n            result.push(item);\n        }\n        else {\n            // Handle closing tag\n            while (stack.length) {\n                const item = stack.pop();\n                if (item.name === name) {\n                    item.close = [start, end];\n                    break;\n                }\n            }\n        }\n    }, opt);\n    return result;\n}\n/**\n * Finds tag match for given position\n */\nfunction findTagMatch(source, pos, options) {\n    if (typeof source === 'string') {\n        source = getTagMatches(source, options);\n    }\n    let candidate;\n    source.some(match => {\n        const start = match.open[0];\n        const end = match.close ? match.close[1] : match.open[1];\n        if (pos < start) {\n            // All the following tags will be after given position, stop searching\n            return true;\n        }\n        if (pos > start && pos < end) {\n            candidate = match;\n        }\n    });\n    return candidate;\n}\n/**\n * Returns list of ranges for Select Next/Previous Item action\n */\nfunction selectItemHTML(code, pos, isPrev) {\n    return isPrev ? selectPreviousItem(code, pos) : selectNextItem(code, pos);\n}\n/**\n * Returns list of ranges for Select Next Item action\n */\nfunction selectNextItem(code, pos) {\n    let result = void 0;\n    // Find open or self-closing tag, closest to given position\n    scan(code, (name, type, start, end) => {\n        if ((type === 1 /* Open */ || type === 3 /* SelfClose */) && end > pos) {\n            // Found open or self-closing tag\n            result = getTagSelectionModel(code, name, start, end);\n            return false;\n        }\n    });\n    return result;\n}\n/**\n * Returns list of ranges for Select Previous Item action\n */\nfunction selectPreviousItem(code, pos) {\n    let lastType = null;\n    let lastName = '';\n    let lastStart = -1;\n    let lastEnd = -1;\n    // We should find the closest open or self-closing tag left to given `pos`.\n    scan(code, (name, type, start, end) => {\n        if (start >= pos) {\n            return false;\n        }\n        if (type === 1 /* Open */ || type === 3 /* SelfClose */) {\n            // Found open or self-closing tag\n            lastName = name;\n            lastType = type;\n            lastStart = start;\n            lastEnd = end;\n        }\n    });\n    if (lastType !== null) {\n        return getTagSelectionModel(code, lastName, lastStart, lastEnd);\n    }\n}\n/**\n * Parses open or self-closing tag in `start:end` range of `code` and returns its\n * model for selecting items\n * @param code Document source code\n * @param name Name of matched tag\n */\nfunction getTagSelectionModel(code, name, start, end) {\n    const ranges = [\n        // Add tag name range\n        [start + 1, start + 1 + name.length]\n    ];\n    // Parse and add attributes ranges\n    const tagSrc = code.slice(start, end);\n    for (const attr of attributes(tagSrc, name)) {\n        if (attr.value != null) {\n            // Attribute with value\n            pushRange(ranges, [start + attr.nameStart, start + attr.valueEnd]);\n            // Add (unquoted) value range\n            const val = valueRange(attr);\n            if (val[0] !== val[1]) {\n                pushRange(ranges, [start + val[0], start + val[1]]);\n                if (attr.name === 'class') {\n                    // For class names, split value into space-separated tokens\n                    const tokens = tokenList(tagSrc.slice(val[0], val[1]), start + val[0]);\n                    for (const token of tokens) {\n                        pushRange(ranges, token);\n                    }\n                }\n            }\n        }\n        else {\n            // Attribute without value (boolean)\n            pushRange(ranges, [start + attr.nameStart, start + attr.nameEnd]);\n        }\n    }\n    return { start, end, ranges };\n}\n/**\n * Returns value range of given attribute. Value range is unquoted.\n */\nfunction valueRange(attr) {\n    const value = attr.value;\n    const ch = value[0];\n    const lastCh = value[value.length - 1];\n    if (ch === '\"' || ch === '\\'') {\n        return [\n            attr.valueStart + 1,\n            attr.valueEnd - (lastCh === ch ? 1 : 0)\n        ];\n    }\n    if (ch === '{' && lastCh === '}') {\n        return [\n            attr.valueStart + 1,\n            attr.valueEnd - 1\n        ];\n    }\n    return [attr.valueStart, attr.valueEnd];\n}\nfunction shiftAttributeRanges(attrs, offset) {\n    attrs.forEach(attr => {\n        attr.nameStart += offset;\n        attr.nameEnd += offset;\n        if ('value' in attr) {\n            attr.valueStart += offset;\n            attr.valueEnd += offset;\n        }\n    });\n    return attrs;\n}\n\n/**\n * Returns context CSS section for given location in source code\n * @param properties Parse inner properties\n */\nfunction getCSSSection(code, pos, properties) {\n    const stack = [];\n    const pool = [];\n    let result;\n    scan$1(code, (type, start, end, delimiter) => {\n        if (start > pos && !stack.length) {\n            return false;\n        }\n        if (type === \"selector\" /* Selector */) {\n            stack.push(allocRange(pool, start, end, delimiter));\n        }\n        else if (type === \"blockEnd\" /* BlockEnd */) {\n            const sel = stack.pop();\n            if (sel && sel[0] <= pos && pos <= end) {\n                result = {\n                    start: sel[0],\n                    end,\n                    bodyStart: sel[2] + 1,\n                    bodyEnd: start\n                };\n                return false;\n            }\n            releaseRange(pool, sel);\n        }\n    });\n    if (result && properties) {\n        result.properties = parseProperties(code, result.bodyStart, result.bodyEnd);\n    }\n    return result;\n}\n/**\n * Returns list of ranges for Select Next/Previous CSS Item  action\n */\nfunction selectItemCSS(code, pos, isPrev) {\n    return isPrev ? selectPreviousItem$1(code, pos) : selectNextItem$1(code, pos);\n}\n/**\n * Returns regions for selecting next item in CSS\n */\nfunction selectNextItem$1(code, pos) {\n    let result = void 0;\n    let pendingProperty = void 0;\n    scan$1(code, (type, start, end, delimiter) => {\n        if (start < pos) {\n            return;\n        }\n        if (type === \"selector\" /* Selector */) {\n            result = { start, end, ranges: [[start, end]] };\n            return false;\n        }\n        else if (type === \"propertyName\" /* PropertyName */) {\n            pendingProperty = [start, end, delimiter];\n        }\n        else if (type === \"propertyValue\" /* PropertyValue */) {\n            result = {\n                start,\n                end: delimiter !== -1 ? delimiter + 1 : end,\n                ranges: []\n            };\n            if (pendingProperty) {\n                // Full property range\n                result.start = pendingProperty[0];\n                pushRange(result.ranges, [pendingProperty[0], result.end]);\n            }\n            // Full value range\n            pushRange(result.ranges, [start, end]);\n            // Value fragments\n            for (const r of splitValue(code.substring(start, end))) {\n                pushRange(result.ranges, [r[0] + start, r[1] + start]);\n            }\n            return false;\n        }\n        else if (pendingProperty) {\n            result = {\n                start: pendingProperty[0],\n                end: pendingProperty[1],\n                ranges: [[pendingProperty[0], pendingProperty[1]]]\n            };\n            return false;\n        }\n    });\n    return result;\n}\n/**\n * Returns regions for selecting previous item in CSS\n */\nfunction selectPreviousItem$1(code, pos) {\n    const state = {\n        type: null,\n        start: -1,\n        end: -1,\n        valueStart: -1,\n        valueEnd: -1,\n        valueDelimiter: -1,\n    };\n    scan$1(code, (type, start, end, delimiter) => {\n        // Accumulate context until we reach given position\n        if (start >= pos && type !== \"propertyValue\" /* PropertyValue */) {\n            return false;\n        }\n        if (type === \"selector\" /* Selector */ || type === \"propertyName\" /* PropertyName */) {\n            state.start = start;\n            state.end = end;\n            state.type = type;\n            state.valueStart = state.valueEnd = state.valueDelimiter = -1;\n        }\n        else if (type === \"propertyValue\" /* PropertyValue */) {\n            state.valueStart = start;\n            state.valueEnd = end;\n            state.valueDelimiter = delimiter;\n        }\n    });\n    if (state.type === \"selector\" /* Selector */) {\n        return {\n            start: state.start,\n            end: state.end,\n            ranges: [[state.start, state.end]]\n        };\n    }\n    if (state.type === \"propertyName\" /* PropertyName */) {\n        const result = {\n            start: state.start,\n            end: state.end,\n            ranges: []\n        };\n        if (state.valueStart !== -1) {\n            result.end = state.valueDelimiter !== -1 ? state.valueDelimiter + 1 : state.valueEnd;\n            // Full property range\n            pushRange(result.ranges, [state.start, result.end]);\n            // Full value range\n            pushRange(result.ranges, [state.valueStart, state.valueEnd]);\n            // Value fragments\n            for (const r of splitValue(code.substring(state.valueStart, state.valueEnd))) {\n                pushRange(result.ranges, [r[0] + state.valueStart, r[1] + state.valueStart]);\n            }\n        }\n        else {\n            pushRange(result.ranges, [state.start, state.end]);\n        }\n        return result;\n    }\n}\n/**\n * Parses properties in `from:to` fragment of `code`. Note that `from:to` must\n * point to CSS section content, e.g. *inside* `{` and `}` (or top-level code context),\n * all properties found in nested sections will be ignored\n */\nfunction parseProperties(code, from = 0, to = code.length) {\n    const fragment = code.substring(from, to);\n    const result = [];\n    const pool = [];\n    let pendingName;\n    let nested = 0;\n    let before = from;\n    scan$1(fragment, (type, start, end, delimiter) => {\n        if (type === \"selector\" /* Selector */) {\n            nested++;\n        }\n        else if (type === \"blockEnd\" /* BlockEnd */) {\n            nested--;\n            before = from + end;\n        }\n        else if (!nested) {\n            if (type === \"propertyName\" /* PropertyName */) {\n                if (pendingName) {\n                    // Create property with empty value\n                    const valuePos = pendingName[2];\n                    result.push(createProperty(fragment, pendingName, before, valuePos, valuePos, valuePos, from));\n                    releaseRange(pool, pendingName);\n                    before = from + start;\n                }\n                pendingName = allocRange(pool, start, end, delimiter);\n            }\n            else if (type === \"propertyValue\" /* PropertyValue */) {\n                if (pendingName) {\n                    result.push(createProperty(fragment, pendingName, before, start, end, delimiter, from));\n                    releaseRange(pool, pendingName);\n                    pendingName = void 0;\n                }\n                before = from + delimiter + 1;\n            }\n        }\n    });\n    return result;\n}\nfunction createProperty(code, name, before, start, end, delimiter, offset = 0) {\n    return {\n        name: [offset + name[0], offset + name[1]],\n        value: [offset + start, offset + end],\n        valueTokens: splitValue(code.substring(start, end), offset + start),\n        before,\n        after: offset + delimiter + 1,\n    };\n}\n/**\n * Allocates new token range from pool\n */\nfunction allocRange(pool, start, end, delimiter) {\n    if (pool.length) {\n        const range = pool.pop();\n        range[0] = start;\n        range[1] = end;\n        range[2] = delimiter;\n        return range;\n    }\n    return [start, end, delimiter];\n}\n/**\n * Releases given token range and pushes it back into the pool\n */\nfunction releaseRange(pool, range) {\n    range && pool.push(range);\n    return null;\n}\n\n/**\n * Returns HTML context for given location in source code\n */\nfunction getHTMLContext(code, pos, opt = {}) {\n    const result = {\n        type: 'html',\n        ancestors: [],\n        current: null,\n        css: null\n    };\n    // Since we expect large input document, we’ll use pooling technique\n    // for storing tag data to reduce memory pressure and improve performance\n    const pool = [];\n    const stack = [];\n    const options = createOptions({ xml: opt.xml, allTokens: true });\n    scan(code, (name, type, start, end) => {\n        if (start >= pos) {\n            // Moved beyond location, stop parsing\n            return false;\n        }\n        if (start < pos && pos < end) {\n            // Direct hit on element\n            result.current = { name, type, range: [start, end] };\n            return false;\n        }\n        if (type === 1 /* Open */ && isSelfClose(name, options)) {\n            // Found empty element in HTML mode, mark is as self-closing\n            type = 3 /* SelfClose */;\n        }\n        if (type === 1 /* Open */) {\n            // Allocate tag object from pool\n            stack.push(allocItem(pool, name, type, start, end));\n        }\n        else if (type === 2 /* Close */ && stack.length && last(stack).name === name) {\n            // Release tag object for further re-use\n            releaseItem(pool, stack.pop());\n        }\n    }, options);\n    // Record stack elements as ancestors\n    stack.forEach(item => {\n        result.ancestors.push({\n            name: item.name,\n            range: [item.start, item.end]\n        });\n    });\n    if (!opt.skipCSS) {\n        // Detect if position is inside CSS context\n        result.css = detectCSSContextFromHTML(code, pos, result);\n    }\n    return result;\n}\n/**\n * Returns CSS context for given location in source code\n */\nfunction getCSSContext(code, pos, embedded) {\n    const result = {\n        type: 'css',\n        ancestors: [],\n        current: null,\n        inline: false,\n        embedded\n    };\n    const pool = [];\n    const stack = [];\n    scan$1(code, (type, start, end) => {\n        if (start >= pos) {\n            // Token behind specified location, stop parsing\n            return false;\n        }\n        if (start < pos && pos <= end) {\n            // Direct hit on token\n            result.current = {\n                name: code.slice(start, end),\n                type,\n                range: [start, end]\n            };\n            return false;\n        }\n        switch (type) {\n            case \"selector\" /* Selector */:\n            case \"propertyName\" /* PropertyName */:\n                stack.push(allocItem(pool, code.slice(start, end), type, start, end));\n                break;\n            case \"propertyValue\" /* PropertyValue */:\n            case \"blockEnd\" /* BlockEnd */:\n                releaseItem(pool, stack.pop());\n                break;\n        }\n    });\n    stack.forEach(item => {\n        result.ancestors.push({\n            name: item.name,\n            type: item.type,\n            range: [item.start, item.end]\n        });\n    });\n    return result;\n}\n/**\n * Returns embedded stylesheet syntax from given HTML context\n */\nfunction getEmbeddedStyleSyntax(code, ctx) {\n    const parent = last(ctx.ancestors);\n    if (parent && parent.name === 'style') {\n        for (const attr of attributes(code.slice(parent.range[0], parent.range[1]), parent.name)) {\n            if (attr.name === 'type') {\n                return attributeValue(attr);\n            }\n        }\n    }\n}\n/**\n * Returns context for Emmet abbreviation from given HTML context\n */\nfunction getMarkupAbbreviationContext(code, ctx) {\n    const parent = last(ctx.ancestors);\n    if (parent) {\n        const attrs = {};\n        for (const attr of attributes(code.slice(parent.range[0], parent.range[1]), parent.name)) {\n            attrs[attr.name] = attributeValue(attr) || '';\n        }\n        return {\n            name: parent.name,\n            attributes: attrs\n        };\n    }\n}\n/**\n * Returns context for Emmet abbreviation from given CSS context\n */\nfunction getStylesheetAbbreviationContext(ctx) {\n    if (ctx.inline) {\n        return { name: \"@@property\" /* Property */ };\n    }\n    const parent = last(ctx.ancestors);\n    let scope = \"@@global\" /* Global */;\n    if (ctx.current) {\n        if (ctx.current.type === \"propertyValue\" /* PropertyValue */ && parent) {\n            scope = parent.name;\n        }\n        else if ((ctx.current.type === \"selector\" /* Selector */ || ctx.current.type === \"propertyName\" /* PropertyName */) && !parent) {\n            scope = \"@@section\" /* Section */;\n        }\n    }\n    return {\n        name: scope\n    };\n}\n/**\n * Tries to detect CSS context from given HTML context and returns it\n */\nfunction detectCSSContextFromHTML(code, pos, ctx) {\n    let cssCtx = null;\n    if (ctx.current) {\n        // Maybe inline CSS?\n        const elem = ctx.current;\n        if (elem.type === 1 /* Open */ || elem.type === 2 /* Close */) {\n            const tag = code.slice(elem.range[0], elem.range[1]);\n            attributes(tag, elem.name).some(attr => {\n                if (attr.name === 'style' && attr.value != null) {\n                    const [valueStart, valueEnd] = attributeValueRange(tag, attr, elem.range[0]);\n                    if (pos >= valueStart && pos <= valueEnd) {\n                        cssCtx = getCSSContext(code.slice(valueStart, valueEnd), pos - valueStart, [valueStart, valueEnd]);\n                        applyOffset(cssCtx, valueStart);\n                        cssCtx.inline = true;\n                        return true;\n                    }\n                }\n            });\n        }\n    }\n    else if (ctx.ancestors.length) {\n        // Maybe inside `<style>` element?\n        const parent = last(ctx.ancestors);\n        if (parent.name === 'style') {\n            // Find closing </style> tag\n            const styleStart = parent.range[1];\n            let styleEnd = code.length;\n            scan(code.slice(parent.range[1]), (name, type, start) => {\n                if (name === parent.name && type === 2 /* Close */) {\n                    styleEnd = start + styleStart;\n                    return false;\n                }\n            });\n            cssCtx = getCSSContext(code.slice(styleStart, styleEnd), pos - styleStart, [styleStart, styleEnd]);\n            applyOffset(cssCtx, styleStart);\n        }\n    }\n    return cssCtx;\n}\n/**\n * Check if given tag is self-close for current parsing context\n */\nfunction isSelfClose(name, options) {\n    return !options.xml && options.empty.includes(name);\n}\nfunction allocItem(pool, name, type, start, end) {\n    if (pool.length) {\n        const tag = pool.pop();\n        tag.name = name;\n        tag.type = type;\n        tag.start = start;\n        tag.end = end;\n        return tag;\n    }\n    return { name, type, start, end };\n}\nfunction releaseItem(pool, item) {\n    if (item) {\n        pool.push(item);\n    }\n}\nfunction applyOffset(ctx, offset) {\n    ctx.ancestors.forEach(item => {\n        offsetRange(item.range, offset);\n    });\n    if (ctx.current) {\n        offsetRange(ctx.current.range, offset);\n    }\n}\nfunction offsetRange(range, offset) {\n    range[0] += offset;\n    range[1] += offset;\n}\n\nconst JSX_PREFIX = '<';\nconst reJSXAbbrStart = /^[a-zA-Z.#\\[\\(]$/;\nconst reWordBound = /^[\\s>;\"\\']?[a-zA-Z.#!@\\[\\(]$/;\nconst reStylesheetWordBound = /^[\\s;\"\\']?[a-zA-Z!@]$/;\n/**\n * Controller for tracking Emmet abbreviations in editor as user types.\n * Controller designed to be extended ad-hoc in editor plugins, overriding some\n * methods `mark()` to match editor behavior\n */\nclass AbbreviationTrackingController {\n    constructor() {\n        this.cache = new Map();\n        this.trackers = new Map();\n        this.lastPos = new Map();\n    }\n    /**\n     * Returns last known location of caret in given editor\n     */\n    getLastPost(editor) {\n        return this.lastPos.get(editor.id);\n    }\n    /**\n     * Sets last known caret location for given editor\n     */\n    setLastPos(editor, pos) {\n        this.lastPos.set(editor.id, pos);\n    }\n    /**\n     * Returns abbreviation tracker for given editor, if any\n     */\n    getTracker(editor) {\n        return this.trackers.get(editor.id);\n    }\n    /**\n     * Detects if user is typing abbreviation at given location\n     */\n    typingAbbreviation(editor, pos) {\n        var _a;\n        // Start tracking only if user starts abbreviation typing: entered first\n        // character at the word bound\n        // NB: get last 2 characters: first should be a word bound(or empty),\n        // second must be abbreviation start\n        const prefix = editor.substr(Math.max(0, pos - 2), pos);\n        const syntax = editor.syntax();\n        let start = -1;\n        let end = pos;\n        let offset = 0;\n        if (editor.isJSX(syntax)) {\n            // In JSX, abbreviations should be prefixed\n            if (prefix.length === 2 && prefix[0] === JSX_PREFIX && reJSXAbbrStart.test(prefix[1])) {\n                start = pos - 2;\n                offset = JSX_PREFIX.length;\n            }\n        }\n        else if (reWordBound.test(prefix)) {\n            start = pos - 1;\n        }\n        if (start >= 0) {\n            // Check if there’s paired character\n            const lastCh = prefix[prefix.length - 1];\n            if (lastCh in pairs && editor.substr(pos, pos + 1) === pairs[lastCh]) {\n                end++;\n            }\n            const config = this.getActivationContext(editor, pos);\n            if (config) {\n                if (config.type === 'stylesheet' && !reStylesheetWordBound.test(prefix)) {\n                    // Additional check for stylesheet abbreviation start: it’s slightly\n                    // differs from markup prefix, but we need activation context\n                    // to ensure that context under caret is CSS\n                    return;\n                }\n                const tracker = this.startTracking(editor, start, end, { offset, config });\n                if (tracker && tracker.type === \"abbreviation\" /* Abbreviation */ && ((_a = config.context) === null || _a === void 0 ? void 0 : _a.name) === \"@@section\" /* Section */) {\n                    // Make a silly check for section context: if user start typing\n                    // CSS selector at the end of file, it will be treated as property\n                    // name and provide unrelated completion by default.\n                    // We should check if captured abbreviation actually matched\n                    // snippet to continue. Otherwise, ignore this abbreviation.\n                    // By default, unresolved abbreviations are converted to CSS properties,\n                    // e.g. `a` → `a: ;`. If that’s the case, stop tracking\n                    const { abbreviation, preview } = tracker;\n                    if (preview.startsWith(abbreviation) && /^:\\s*;?$/.test(preview.slice(abbreviation.length))) {\n                        this.stopTracking(editor);\n                        return;\n                    }\n                }\n                return tracker;\n            }\n        }\n    }\n    /**\n     * Starts abbreviation tracking for given editor\n     * @param start Location of abbreviation start\n     * @param pos Current caret position, must be greater that `start`\n     */\n    startTracking(editor, start, pos, params) {\n        const config = (params === null || params === void 0 ? void 0 : params.config) || editor.config(start);\n        const tracker = this.createTracker(editor, [start, pos], Object.assign({ config }, params));\n        if (tracker) {\n            this.trackers.set(editor.id, tracker);\n            return tracker;\n        }\n        this.trackers.delete(editor.id);\n    }\n    /**\n     * Stops abbreviation tracking in given editor instance\n     */\n    stopTracking(editor, params) {\n        const tracker = this.getTracker(editor);\n        if (tracker) {\n            editor.unmark(tracker);\n            if (tracker.forced && !(params === null || params === void 0 ? void 0 : params.skipRemove)) {\n                // Contents of forced abbreviation must be removed\n                editor.replace('', tracker.range[0], tracker.range[1]);\n            }\n            if (params === null || params === void 0 ? void 0 : params.force) {\n                this.cache.delete(editor.id);\n            }\n            else {\n                // Store tracker in history to restore it if user continues editing\n                this.storeTracker(editor, tracker);\n            }\n            this.trackers.delete(editor.id);\n        }\n    }\n    /**\n     * Creates abbreviation tracker for given range in editor. Parses contents\n     * of abbreviation in range and returns either valid abbreviation tracker,\n     * error tracker or `null` if abbreviation cannot be created from given range\n     */\n    createTracker(editor, range, params) {\n        if (range[0] >= range[1]) {\n            // Invalid range\n            return null;\n        }\n        let abbreviation = editor.substr(range[0], range[1]);\n        const { config } = params;\n        if (params.offset) {\n            abbreviation = abbreviation.slice(params.offset);\n        }\n        // Basic validation: do not allow empty abbreviations\n        // or newlines in abbreviations\n        if (!abbreviation || /[\\r\\n]/.test(abbreviation)) {\n            return null;\n        }\n        const base = {\n            abbreviation,\n            range,\n            config,\n            forced: !!params.forced,\n            offset: params.offset || 0,\n            lastPos: range[1],\n            lastLength: editor.size(),\n        };\n        try {\n            let parsedAbbr;\n            let simple = false;\n            if (config.type === 'stylesheet') {\n                parsedAbbr = stylesheetAbbreviation(abbreviation);\n            }\n            else {\n                parsedAbbr = markupAbbreviation(abbreviation, {\n                    jsx: config.syntax === 'jsx'\n                });\n                simple = this.isSimpleMarkupAbbreviation(parsedAbbr);\n            }\n            const previewConfig = editor.previewConfig(config);\n            return Object.assign(Object.assign({}, base), { type: \"abbreviation\" /* Abbreviation */, simple, preview: expand(parsedAbbr, previewConfig) });\n        }\n        catch (error) {\n            return Object.assign(Object.assign({}, base), { type: \"error\" /* Error */, error });\n        }\n    }\n    /**\n     * Stores given tracker in separate cache to restore later\n     */\n    storeTracker(editor, tracker) {\n        this.cache.set(editor.id, tracker);\n    }\n    /**\n     * Returns stored tracker for given editor proxy, if any\n     */\n    getStoredTracker(editor) {\n        return this.cache.get(editor.id);\n    }\n    /**\n     * Tries to restore abbreviation tracker for given editor at specified position\n     */\n    restoreTracker(editor, pos) {\n        const tracker = this.getStoredTracker(editor);\n        if (tracker && tracker.range[0] <= pos && tracker.range[1] >= pos) {\n            const [from, to] = tracker.range;\n            if (editor.substr(from + tracker.offset, to) === tracker.abbreviation) {\n                this.trackers.set(editor.id, tracker);\n                tracker.lastLength = editor.size();\n                return tracker;\n            }\n        }\n    }\n    /**\n     * Handle content change in given editor instance\n     */\n    handleChange(editor, pos) {\n        const tracker = this.getTracker(editor);\n        const editorLastPos = this.getLastPost(editor);\n        this.setLastPos(editor, pos);\n        if (!tracker) {\n            // No active tracker, check if we user is actually typing it\n            if (editorLastPos != null && editorLastPos === pos - 1 && editor.allowTracking(pos)) {\n                return this.typingAbbreviation(editor, pos);\n            }\n            return;\n        }\n        const { lastPos } = tracker;\n        let { range } = tracker;\n        if (lastPos < range[0] || lastPos > range[1]) {\n            // Updated content outside abbreviation: reset tracker\n            this.stopTracking(editor);\n            return;\n        }\n        const length = editor.size();\n        const delta = length - tracker.lastLength;\n        range = range.slice();\n        // Modify range and validate it: if it leads to invalid abbreviation, reset tracker\n        updateRange(range, delta, lastPos);\n        // Handle edge case: empty forced abbreviation is allowed\n        if (range[0] === range[1] && tracker.forced) {\n            tracker.abbreviation = '';\n            return tracker;\n        }\n        const nextTracker = this.createTracker(editor, range, tracker);\n        if (!nextTracker || (!tracker.forced && !isValidTracker(nextTracker, range, pos))) {\n            this.stopTracking(editor);\n            return;\n        }\n        nextTracker.lastPos = pos;\n        this.trackers.set(editor.id, nextTracker);\n        editor.mark(nextTracker);\n        return nextTracker;\n    }\n    /**\n     * Handle selection (caret) change in given editor instance\n     */\n    handleSelectionChange(editor, pos) {\n        this.setLastPos(editor, pos);\n        const tracker = this.getTracker(editor) || this.restoreTracker(editor, pos);\n        if (tracker) {\n            tracker.lastPos = pos;\n            return tracker;\n        }\n    }\n    /**\n     * Detects and returns valid abbreviation activation context for given location\n     * in editor which can be used for abbreviation expanding.\n     * For example, in given HTML code:\n     * `<div title=\"Sample\" style=\"\">Hello world</div>`\n     * it’s not allowed to expand abbreviations inside `<div ...>` or `</div>`,\n     * yet it’s allowed inside `style` attribute and between tags.\n     *\n     * This method ensures that given `pos` is inside location allowed for expanding\n     * abbreviations and returns context data about it.\n     *\n     * Default implementation works for any editor since it uses own parsers for HTML\n     * and CSS but might be slow: if your editor supports low-level access to document\n     * parse tree or tokens, authors should override this method and provide alternative\n     * based on editor native features.\n     */\n    getActivationContext(editor, pos) {\n        const syntax = editor.syntax();\n        const content = editor.substr();\n        if (editor.isCSS(syntax)) {\n            return this.getCSSActivationContext(editor, pos, syntax, getCSSContext(content, pos));\n        }\n        if (editor.isHTML(syntax)) {\n            const ctx = getHTMLContext(content, pos, { xml: editor.isXML(syntax) });\n            if (ctx.css) {\n                return this.getCSSActivationContext(editor, pos, getEmbeddedStyleSyntax(content, ctx) || 'css', ctx.css);\n            }\n            if (!ctx.current) {\n                return {\n                    syntax,\n                    type: 'markup',\n                    context: getMarkupAbbreviationContext(content, ctx),\n                    options: editor.outputOptions(pos)\n                };\n            }\n        }\n        else {\n            return {\n                syntax,\n                type: editor.syntaxType(syntax),\n                options: editor.outputOptions(pos)\n            };\n        }\n    }\n    getCSSActivationContext(editor, pos, syntax, ctx) {\n        // CSS abbreviations can be activated only when a character is entered, e.g.\n        // it should be either property name or value.\n        // In come cases, a first character of selector should also be considered\n        // as activation context\n        if (!ctx.current) {\n            return void 0;\n        }\n        const allowedContext = ctx.current.type === \"propertyName\" /* PropertyName */\n            || ctx.current.type === \"propertyValue\" /* PropertyValue */\n            || this.isTypingBeforeSelector(editor, pos, ctx);\n        if (allowedContext) {\n            return {\n                syntax,\n                type: 'stylesheet',\n                context: getStylesheetAbbreviationContext(ctx),\n                options: editor.outputOptions(pos, ctx.inline)\n            };\n        }\n    }\n    /**\n     * Handle edge case: start typing abbreviation before selector. In this case,\n     * entered character becomes part of selector\n     * Activate only if it’s a nested section and it’s a first character of selector\n     */\n    isTypingBeforeSelector(editor, pos, { current }) {\n        if (current && current.type === \"selector\" /* Selector */ && current.range[0] === pos - 1) {\n            // Typing abbreviation before selector is tricky one:\n            // ensure it’s on its own line\n            const line = editor.substr(current.range[0], current.range[1]).split(/[\\n\\r]/)[0];\n            return line.trim().length === 1;\n        }\n        return false;\n    }\n    /**\n     * Check if given parsed markup abbreviation is simple.A simple abbreviation\n     * may not be displayed to user as preview to reduce distraction\n     */\n    isSimpleMarkupAbbreviation(abbr) {\n        if (abbr.children.length === 1 && !abbr.children[0].children.length) {\n            // Single element: might be a HTML element or text snippet\n            const first = abbr.children[0];\n            // XXX silly check for common snippets like `!`. Should read contents\n            // of expanded abbreviation instead\n            return !first.name || /^[a-z]/i.test(first.name);\n        }\n        return !abbr.children.length;\n    }\n    /**\n     * Method should be called when given editor instance will be no longer\n     * available to clean up cached data\n     */\n    disposeEditor(editor) {\n        this.cache.delete(editor.id);\n        this.trackers.delete(editor.id);\n        this.lastPos.delete(editor.id);\n    }\n}\nfunction updateRange(range, delta, lastPos) {\n    if (delta < 0) {\n        // Content removed\n        if (lastPos === range[0]) {\n            // Updated content at the abbreviation edge\n            range[0] += delta;\n            range[1] += delta;\n        }\n        else if (range[0] < lastPos && lastPos <= range[1]) {\n            range[1] += delta;\n        }\n    }\n    else if (delta > 0 && range[0] <= lastPos && lastPos <= range[1]) {\n        // Content inserted\n        range[1] += delta;\n    }\n    return range;\n}\n/**\n * Check if given tracker is in valid state for keeping it marked\n */\nfunction isValidTracker(tracker, range, pos) {\n    if (tracker.type === \"error\" /* Error */) {\n        if (range[1] === pos) {\n            // Last entered character is invalid\n            return false;\n        }\n        const { abbreviation } = tracker;\n        const start = range[0];\n        let targetPos = range[1];\n        while (targetPos > start) {\n            if (pairsEnd.includes(abbreviation[targetPos - start - 1])) {\n                targetPos--;\n            }\n            else {\n                break;\n            }\n        }\n        return targetPos !== pos;\n    }\n    return true;\n}\n\nexport { AbbreviationTrackingController, JSX_PREFIX, findTagMatch, getCSSContext, getCSSSection, getHTMLContext, getOpenTag, getTagMatches, selectItemCSS, selectItemHTML };\n//# sourceMappingURL=action-utils.es.js.map\n","import { AttributeToken } from '@emmetio/html-matcher';\nimport { CSSProperty, TextRange } from '@emmetio/action-utils';\n\n/** Characters to indicate tab stop start and end in generated snippet */\nexport const tabStopStart = String.fromCodePoint(0xFFF0);\nexport const tabStopEnd = String.fromCodePoint(0xFFF1);\nexport const stateKey = '$$emmet';\n\nexport interface AbbrError {\n    message: string,\n    pos: number\n}\n\nexport interface CMRange {\n    anchor: CodeMirror.Position;\n    head: CodeMirror.Position;\n}\n\nexport type DisposeFn = () => void;\n\nexport interface EmmetState {\n    id: string;\n    tracker?: DisposeFn | null;\n    tagMatch?: DisposeFn | null;\n}\n\nexport const pairs = {\n    '{': '}',\n    '[': ']',\n    '(': ')'\n};\n\nexport const pairsEnd: string[] = [];\nfor (const key of Object.keys(pairs)) {\n    pairsEnd.push(pairs[key]);\n}\n\nlet idCounter = 0;\n\n/**\n * Returns copy of region which starts and ends at non-space character\n */\nexport function narrowToNonSpace(editor: CodeMirror.Editor, range: TextRange): TextRange {\n    const text = substr(editor, range);\n    let startOffset = 0;\n    let endOffset = text.length;\n\n    while (startOffset < endOffset && isSpace(text[startOffset])) {\n        startOffset++;\n    }\n\n    while (endOffset > startOffset && isSpace(text[endOffset - 1])) {\n        endOffset--;\n    }\n\n    return [range[0] + startOffset, range[0] + endOffset];\n}\n\n/**\n * Replaces given range in editor with snippet contents\n */\nexport function replaceWithSnippet(editor: CodeMirror.Editor, range: TextRange, snippet: string): boolean {\n    return editor.operation(() => {\n        const snippetPayload = getSelectionsFromSnippet(snippet, range[0]);\n        const [from, to] = toRange(editor, range);\n        editor.replaceRange(snippetPayload.snippet, from, to);\n\n        // Position cursor\n        if (snippetPayload.ranges.length) {\n            const selections = snippetPayload.ranges.map(r => {\n                const [head, anchor] = toRange(editor, r);\n                return {  head, anchor } as CodeMirror.Range;\n            });\n            editor.setSelections(selections);\n        }\n\n        return true;\n    });\n}\n\n/**\n * Returns current caret position for single selection\n */\nexport function getCaret(editor: CodeMirror.Editor): number {\n    const pos = editor.getCursor();\n    return editor.indexFromPos(pos);\n}\n\n/**\n * Returns full text content of given editor\n */\nexport function getContent(editor: CodeMirror.Editor): string {\n    return editor.getValue();\n}\n\n/**\n * Returns substring of given editor content for specified range\n */\nexport function substr(editor: CodeMirror.Editor, range: TextRange): string {\n    const [from, to] = toRange(editor, range);\n    return editor.getRange(from, to);\n}\n\n/**\n * Converts given index range to editor’s position range\n */\nexport function toRange(editor: CodeMirror.Editor, range: TextRange): [CodeMirror.Position, CodeMirror.Position] {\n    return [\n        editor.posFromIndex(range[0]),\n        editor.posFromIndex(range[1])\n    ];\n}\n\n/**\n * Returns value of given attribute, parsed by Emmet HTML matcher\n */\nexport function attributeValue(attr: AttributeToken): string | undefined {\n    const { value } = attr\n    return value && isQuoted(value)\n        ? value.slice(1, -1)\n        : value;\n}\n\n/**\n * Returns region that covers entire attribute\n */\nexport function attributeRange(attr: AttributeToken): TextRange {\n    const end = attr.value != null ? attr.valueEnd! : attr.nameEnd;\n    return [attr.nameStart, end];\n}\n\n/**\n * Returns patched version of given HTML attribute, parsed by Emmet HTML matcher\n */\nexport function patchAttribute(attr: AttributeToken, value: string | number, name = attr.name) {\n    let before = '';\n    let after = '';\n\n    if (attr.value != null) {\n        if (isQuoted(attr.value)) {\n            // Quoted value or React-like expression\n            before = attr.value[0];\n            after = attr.value[attr.value.length - 1];\n        }\n    } else {\n        // Attribute without value (boolean)\n        before = after = '\"';\n    }\n\n    return `${name}=${before}${value}${after}`;\n}\n\n/**\n * Returns patched version of given CSS property, parsed by Emmet CSS matcher\n */\nexport function patchProperty(editor: CodeMirror.Editor, prop: CSSProperty, value: string, name?: string) {\n    if (name == null) {\n        name = substr(editor, prop.name);\n    }\n\n    const before = substr(editor, [prop.before, prop.name[0]]);\n    const between = substr(editor, [prop.name[1], prop.value[0]]);\n    const after = substr(editor, [prop.value[1], prop.after]);\n\n    return [before, name, between, value, after].join('');\n}\n\n/**\n * Check if given value is either quoted or written as expression\n */\nexport function isQuoted(value: string | undefined): boolean {\n    return !!value && (isQuotedString(value) || isExprString(value));\n}\n\nexport function isQuote(ch: string | undefined) {\n    return ch === '\"' || ch === \"'\";\n}\n\n/**\n * Check if given string is quoted with single or double quotes\n */\nexport function isQuotedString(str: string): boolean {\n    return str.length > 1 && isQuote(str[0]) && str[0] === str.slice(-1);\n}\n\n/**\n * Check if given string contains expression, e.g. wrapped with `{` and `}`\n */\nfunction isExprString(str: string): boolean {\n    return str[0] === '{' && str.slice(-1) === '}';\n}\n\nexport function isSpace(ch: string): boolean {\n    return /^[\\s\\n\\r]+$/.test(ch);\n}\n\nexport function htmlEscape(str: string): string {\n    const replaceMap = {\n        '<': '&lt;',\n        '>': '&gt;',\n        '&': '&amp;',\n    };\n    return str.replace(/[<>&]/g, ch => replaceMap[ch]);\n}\n\n/**\n * Returns special object for bypassing command handling\n */\nexport function pass(editor: CodeMirror.Editor) {\n    return editor.constructor['Pass'];\n}\n\n/**\n * Converts given CodeMirror range to text range\n */\nexport function textRange(editor: CodeMirror.Editor, range: CMRange): TextRange {\n    const head = editor.indexFromPos(range.head);\n    const anchor = editor.indexFromPos(range.anchor);\n    return [\n        Math.min(head, anchor),\n        Math.max(head, anchor)\n    ];\n}\n\n/**\n * Check if `a` and `b` contains the same range\n */\nexport function rangesEqual(a: TextRange, b: TextRange): boolean {\n    return a[0] === b[0] && a[1] === b[1];\n}\n\n/**\n * Check if range `a` fully contains range `b`\n */\nexport function rangeContains(a: TextRange, b: TextRange): boolean {\n    return a[0] <= b[0] && a[1] >= b[1];\n}\n\n/**\n * Check if given range is empty\n */\nexport function rangeEmpty(r: TextRange): boolean {\n    return r[0] === r[1];\n}\n\n/**\n * Generates snippet with error pointer\n */\nexport function errorSnippet(err: AbbrError, baseClass = 'emmet-error-snippet'): string {\n    const msg = err.message.split('\\n')[0];\n    const spacer = ' '.repeat(err.pos || 0);\n    return `<div class=\"${baseClass}\">\n        <div class=\"${baseClass}-ptr\">\n            <div class=\"${baseClass}-line\"></div>\n            <div class=\"${baseClass}-tip\"></div>\n            <div class=\"${baseClass}-spacer\">${spacer}</div>\n        </div>\n        <div class=\"${baseClass}-message\">${htmlEscape(msg.replace(/\\s+at\\s+\\d+$/, ''))}</div>\n    </div>`;\n}\n\n/**\n * Returns last element in given array\n */\nexport function last<T>(arr: T[]): T | undefined {\n    return arr.length > 0 ? arr[arr.length - 1] : undefined;\n}\n\n/**\n * Check if given editor instance has internal Emmet state\n */\nexport function hasInternalState(editor: CodeMirror.Editor): boolean {\n    return stateKey in editor;\n}\n\n/**\n * Returns internal Emmet state for given editor instance\n */\nexport function getInternalState(editor: CodeMirror.Editor): EmmetState {\n    if (!hasInternalState(editor)) {\n        editor[stateKey] = { id: String(idCounter++) } as EmmetState;\n    }\n\n    return editor[stateKey];\n}\n\n/**\n * Finds and collects selections ranges from given snippet\n */\nfunction getSelectionsFromSnippet(snippet: string, base = 0): { ranges: TextRange[], snippet: string } {\n    // Find and collect selection ranges from snippet\n    const ranges: TextRange[] = [];\n    let result = '';\n    let sel: TextRange | null = null;\n    let offset = 0;\n    let i = 0;\n    let ch: string;\n\n    while (i < snippet.length) {\n        ch = snippet.charAt(i++);\n        if (ch === tabStopStart || ch === tabStopEnd) {\n            result += snippet.slice(offset, i - 1);\n            offset = i;\n\n            if (ch === tabStopStart) {\n                sel = [base + result.length, base + result.length];\n                ranges.push(sel);\n            } else if (sel) {\n                sel[1] = base + result.length;\n                sel = null;\n            }\n        }\n    }\n\n    return {\n        ranges,\n        snippet: result + snippet.slice(offset)\n    };\n}\n","import Scanner, { eatPair, isAlpha, isNumber, isQuote, isSpace, eatQuoted } from '@emmetio/scanner';\n\nconst defaultOptions = {\n    xml: false,\n    allTokens: false,\n    special: {\n        style: null,\n        script: ['', 'text/javascript', 'application/x-javascript', 'javascript', 'typescript', 'ts', 'coffee', 'coffeescript']\n    },\n    empty: ['img', 'meta', 'link', 'br', 'base', 'hr', 'area', 'wbr', 'col', 'embed', 'input', 'param', 'source', 'track']\n};\n/** Options for `Scanner` utils */\nconst opt = { throws: false };\nfunction createOptions(options = {}) {\n    return Object.assign(Object.assign({}, defaultOptions), options);\n}\n/**\n * Converts given string into array of character codes\n */\nfunction toCharCodes(str) {\n    return str.split('').map(ch => ch.charCodeAt(0));\n}\n/**\n * Consumes array of character codes from given scanner\n */\nfunction consumeArray(scanner, codes) {\n    const start = scanner.pos;\n    for (let i = 0; i < codes.length; i++) {\n        if (!scanner.eat(codes[i])) {\n            scanner.pos = start;\n            return false;\n        }\n    }\n    scanner.start = start;\n    return true;\n}\n/**\n * Consumes section from given string which starts with `open` character codes\n * and ends with `close` character codes\n * @return Returns `true` if section was consumed\n */\nfunction consumeSection(scanner, open, close, allowUnclosed) {\n    const start = scanner.pos;\n    if (consumeArray(scanner, open)) {\n        // consumed `<!--`, read next until we find ending part or reach the end of input\n        while (!scanner.eof()) {\n            if (consumeArray(scanner, close)) {\n                scanner.start = start;\n                return true;\n            }\n            scanner.pos++;\n        }\n        // unclosed section is allowed\n        if (allowUnclosed) {\n            scanner.start = start;\n            return true;\n        }\n        scanner.pos = start;\n        return false;\n    }\n    // unable to find section, revert to initial position\n    scanner.pos = start;\n    return false;\n}\n/**\n * Check if given character can be used as a start of tag name or attribute\n */\nfunction nameStartChar(ch) {\n    // Limited XML spec: https://www.w3.org/TR/xml/#NT-NameStartChar\n    return isAlpha(ch) || ch === 58 /* Colon */ || ch === 95 /* Underscore */\n        || (ch >= 0xC0 && ch <= 0xD6)\n        || (ch >= 0xD8 && ch <= 0xF6)\n        || (ch >= 0xF8 && ch <= 0x2FF)\n        || (ch >= 0x370 && ch <= 0x37D)\n        || (ch >= 0x37F && ch <= 0x1FFF);\n}\n/**\n * Check if given character can be used in a tag or attribute name\n */\nfunction nameChar(ch) {\n    // Limited XML spec: https://www.w3.org/TR/xml/#NT-NameChar\n    return nameStartChar(ch) || ch === 45 /* Dash */ || ch === 46 /* Dot */ || isNumber(ch)\n        || ch === 0xB7\n        || (ch >= 0x0300 && ch <= 0x036F);\n}\n/**\n * Consumes identifier from given scanner\n */\nfunction ident(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(nameStartChar)) {\n        scanner.eatWhile(nameChar);\n        scanner.start = start;\n        return true;\n    }\n    return false;\n}\n/**\n * Check if given code is tag terminator\n */\nfunction isTerminator(code) {\n    return code === 62 /* RightAngle */ || code === 47 /* Slash */;\n}\n/**\n * Check if given character code is valid unquoted value\n */\nfunction isUnquoted(code) {\n    return !isNaN(code) && !isQuote(code) && !isSpace(code) && !isTerminator(code);\n}\n/**\n * Consumes paired tokens (like `[` and `]`) with respect of nesting and embedded\n * quoted values\n * @return `true` if paired token was consumed\n */\nfunction consumePaired(scanner) {\n    return eatPair(scanner, 60 /* LeftAngle */, 62 /* RightAngle */, opt)\n        || eatPair(scanner, 40 /* LeftRound */, 41 /* RightRound */, opt)\n        || eatPair(scanner, 91 /* LeftSquare */, 93 /* RightSquare */, opt)\n        || eatPair(scanner, 123 /* LeftCurly */, 125 /* RightCurly */, opt);\n}\n/**\n * Returns unquoted value of given string\n */\nfunction getUnquotedValue(value) {\n    // Trim quotes\n    if (isQuote(value.charCodeAt(0))) {\n        value = value.slice(1);\n    }\n    if (isQuote(value.charCodeAt(value.length - 1))) {\n        value = value.slice(0, -1);\n    }\n    return value;\n}\n\n/**\n * Parses given string as list of HTML attributes.\n * @param src A fragment to parse. If `name` argument is provided, it must be an\n * opening tag (`<a foo=\"bar\">`), otherwise it should be a fragment between element\n * name and tag closing angle (`foo=\"bar\"`)\n * @param name Tag name\n */\nfunction attributes(src, name) {\n    const result = [];\n    let start = 0;\n    let end = src.length;\n    if (name) {\n        start = name.length + 1;\n        end -= src.slice(-2) === '/>' ? 2 : 1;\n    }\n    const scanner = new Scanner(src, start, end);\n    while (!scanner.eof()) {\n        scanner.eatWhile(isSpace);\n        if (attributeName(scanner)) {\n            const token = {\n                name: scanner.current(),\n                nameStart: scanner.start,\n                nameEnd: scanner.pos\n            };\n            if (scanner.eat(61 /* Equals */) && attributeValue(scanner)) {\n                token.value = scanner.current();\n                token.valueStart = scanner.start;\n                token.valueEnd = scanner.pos;\n            }\n            result.push(token);\n        }\n        else {\n            // Do not break on invalid attributes: we are not validating parser\n            scanner.pos++;\n        }\n    }\n    return result;\n}\n/**\n * Consumes attribute name from given scanner context\n */\nfunction attributeName(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(42 /* Asterisk */) || scanner.eat(35 /* Hash */)) {\n        // Angular-style directives: `<section *ngIf=\"showSection\">`, `<video #movieplayer ...>`\n        ident(scanner);\n        scanner.start = start;\n        return true;\n    }\n    // Attribute name could be a regular name or expression:\n    // React-style – `<div {...props}>`\n    // Angular-style – `<div [ng-for]>` or `<div *ng-for>`\n    return consumePaired(scanner) || ident(scanner);\n}\n/**\n * Consumes attribute value\n */\nfunction attributeValue(scanner) {\n    // Supported attribute values are quoted, React-like expressions (`{foo}`)\n    // or unquoted literals\n    return eatQuoted(scanner, opt) || consumePaired(scanner) || unquoted(scanner);\n}\n/**\n * Returns clean (unquoted) value of `name` attribute\n */\nfunction getAttributeValue(attrs, name) {\n    for (let i = 0; i < attrs.length; i++) {\n        const attr = attrs[i];\n        if (attr.name === name) {\n            return attr.value && getUnquotedValue(attr.value);\n        }\n    }\n}\n/**\n * Consumes unquoted value\n */\nfunction unquoted(scanner) {\n    const start = scanner.pos;\n    if (scanner.eatWhile(isUnquoted)) {\n        scanner.start = start;\n        return true;\n    }\n}\n\nconst cdataOpen = toCharCodes('<![CDATA[');\nconst cdataClose = toCharCodes(']]>');\nconst commentOpen = toCharCodes('<!--');\nconst commentClose = toCharCodes('-->');\nconst piStart = toCharCodes('<?');\nconst piEnd = toCharCodes('?>');\nconst erbStart = toCharCodes('<%');\nconst erbEnd = toCharCodes('%>');\n/**\n * Performs fast scan of given source code: for each tag found it invokes callback\n * with tag name, its type (open, close, self-close) and range in original source.\n * Unlike regular scanner, fast scanner doesn’t provide info about attributes to\n * reduce object allocations hence increase performance.\n * If `callback` returns `false`, scanner stops parsing.\n * @param special List of “special” HTML tags which should be ignored. Most likely\n * it’s a \"script\" and \"style\" tags.\n */\nfunction scan(source, callback, options) {\n    const scanner = new Scanner(source);\n    const special = options ? options.special : null;\n    const allTokens = options ? options.allTokens : false;\n    let type;\n    let name;\n    let nameStart;\n    let nameEnd;\n    let nameCodes;\n    let found = false;\n    let piName = null;\n    while (!scanner.eof()) {\n        const start = scanner.pos;\n        if (cdata(scanner)) {\n            if (allTokens && callback('#cdata', 4 /* CData */, scanner.start, scanner.pos) === false) {\n                break;\n            }\n        }\n        else if (comment(scanner)) {\n            if (allTokens && callback('#comment', 6 /* Comment */, scanner.start, scanner.pos) === false) {\n                break;\n            }\n        }\n        else if (erb(scanner)) {\n            if (allTokens && callback('#erb', 7 /* ERB */, scanner.start, scanner.pos) === false) {\n                break;\n            }\n        }\n        else if (piName = processingInstruction(scanner)) {\n            if (allTokens && callback(piName, 5 /* ProcessingInstruction */, scanner.start, scanner.pos) === false) {\n                break;\n            }\n        }\n        else if (scanner.eat(60 /* LeftAngle */)) {\n            // Maybe a tag name?\n            type = scanner.eat(47 /* Slash */) ? 2 /* Close */ : 1 /* Open */;\n            nameStart = scanner.pos;\n            if (ident(scanner)) {\n                // Consumed tag name\n                nameEnd = scanner.pos;\n                if (type !== 2 /* Close */) {\n                    skipAttributes(scanner);\n                    scanner.eatWhile(isSpace);\n                    if (scanner.eat(47 /* Slash */)) {\n                        type = 3 /* SelfClose */;\n                    }\n                }\n                if (scanner.eat(62 /* RightAngle */)) {\n                    // Tag properly closed\n                    name = scanner.substring(nameStart, nameEnd);\n                    if (callback(name, type, start, scanner.pos) === false) {\n                        break;\n                    }\n                    if (type === 1 /* Open */ && special && isSpecial(special, name, source, start, scanner.pos)) {\n                        // Found opening tag of special element: we should skip\n                        // scanner contents until we find closing tag\n                        nameCodes = toCharCodes(name);\n                        found = false;\n                        while (!scanner.eof()) {\n                            if (consumeClosing(scanner, nameCodes)) {\n                                found = true;\n                                break;\n                            }\n                            scanner.pos++;\n                        }\n                        if (found && callback(name, 2 /* Close */, scanner.start, scanner.pos) === false) {\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n        else {\n            scanner.pos++;\n        }\n    }\n}\n/**\n * Skips attributes in current tag context\n */\nfunction skipAttributes(scanner) {\n    while (!scanner.eof()) {\n        scanner.eatWhile(isSpace);\n        if (attributeName(scanner)) {\n            if (scanner.eat(61 /* Equals */)) {\n                attributeValue(scanner);\n            }\n        }\n        else if (isTerminator(scanner.peek())) {\n            break;\n        }\n        else {\n            scanner.pos++;\n        }\n    }\n}\n/**\n * Consumes closing tag with given name from scanner\n */\nfunction consumeClosing(scanner, name) {\n    const start = scanner.pos;\n    if (scanner.eat(60 /* LeftAngle */) && scanner.eat(47 /* Slash */) && consumeArray(scanner, name) && scanner.eat(62 /* RightAngle */)) {\n        scanner.start = start;\n        return true;\n    }\n    scanner.pos = start;\n    return false;\n}\n/**\n * Consumes CDATA from given scanner\n */\nfunction cdata(scanner) {\n    return consumeSection(scanner, cdataOpen, cdataClose, true);\n}\n/**\n * Consumes comments from given scanner\n */\nfunction comment(scanner) {\n    return consumeSection(scanner, commentOpen, commentClose, true);\n}\n/**\n * Consumes processing instruction from given scanner. If consumed, returns\n * processing instruction name\n */\nfunction processingInstruction(scanner) {\n    const start = scanner.pos;\n    if (consumeArray(scanner, piStart) && ident(scanner)) {\n        const name = scanner.current();\n        while (!scanner.eof()) {\n            if (consumeArray(scanner, piEnd)) {\n                break;\n            }\n            eatQuoted(scanner) || scanner.pos++;\n        }\n        scanner.start = start;\n        return name;\n    }\n    scanner.pos = start;\n    return null;\n}\n/**\n * Consumes ERB-style entity: `<% ... %>` or `<%= ... %>`\n */\nfunction erb(scanner) {\n    const start = scanner.pos;\n    if (consumeArray(scanner, erbStart)) {\n        while (!scanner.eof()) {\n            if (consumeArray(scanner, erbEnd)) {\n                break;\n            }\n            eatQuoted(scanner) || scanner.pos++;\n        }\n        scanner.start = start;\n        return true;\n    }\n    scanner.pos = start;\n    return false;\n}\n/**\n * Check if given tag name should be considered as special\n */\nfunction isSpecial(special, name, source, start, end) {\n    if (name in special) {\n        const typeValues = special[name];\n        if (!Array.isArray(typeValues)) {\n            return true;\n        }\n        const attrs = attributes(source.substring(start + name.length + 1, end - 1));\n        return typeValues.includes(getAttributeValue(attrs, 'type') || '');\n    }\n    return false;\n}\n\n/**\n * Finds matched tag for given `pos` location in XML/HTML `source`\n */\nfunction match(source, pos, opt) {\n    // Since we expect large input document, we’ll use pooling technique\n    // for storing tag data to reduce memory pressure and improve performance\n    const pool = [];\n    const stack = [];\n    const options = createOptions(opt);\n    let result = null;\n    scan(source, (name, type, start, end) => {\n        if (type === 1 /* Open */ && isSelfClose(name, options)) {\n            // Found empty element in HTML mode, mark is as self-closing\n            type = 3 /* SelfClose */;\n        }\n        if (type === 1 /* Open */) {\n            // Allocate tag object from pool\n            stack.push(allocTag(pool, name, start, end));\n        }\n        else if (type === 3 /* SelfClose */) {\n            if (start < pos && pos < end) {\n                // Matched given self-closing tag\n                result = {\n                    name,\n                    attributes: getAttributes(source, start, end, name),\n                    open: [start, end]\n                };\n                return false;\n            }\n        }\n        else {\n            const tag = last(stack);\n            if (tag && tag.name === name) {\n                // Matching closing tag found\n                if (tag.start < pos && pos < end) {\n                    result = {\n                        name,\n                        attributes: getAttributes(source, tag.start, tag.end, name),\n                        open: [tag.start, tag.end],\n                        close: [start, end]\n                    };\n                    return false;\n                }\n                else if (stack.length) {\n                    // Release tag object for further re-use\n                    releaseTag(pool, stack.pop());\n                }\n            }\n        }\n    }, options);\n    stack.length = pool.length = 0;\n    return result;\n}\n/**\n * Returns balanced tag model: a list of all XML/HTML tags that could possibly match\n * given location when moving in outward direction\n */\nfunction balancedOutward(source, pos, opt) {\n    const pool = [];\n    const stack = [];\n    const options = createOptions(opt);\n    const result = [];\n    scan(source, (name, type, start, end) => {\n        if (type === 2 /* Close */) {\n            const tag = last(stack);\n            if (tag && tag.name === name) { // XXX check for invalid tag names?\n                // Matching closing tag found, check if matched pair is a candidate\n                // for outward balancing\n                if (tag.start < pos && pos < end) {\n                    result.push({\n                        name,\n                        open: [tag.start, tag.end],\n                        close: [start, end]\n                    });\n                }\n                // Release tag object for further re-use\n                releaseTag(pool, stack.pop());\n            }\n        }\n        else if (type === 3 /* SelfClose */ || isSelfClose(name, options)) {\n            if (start < pos && pos < end) {\n                // Matched self-closed tag\n                result.push({ name, open: [start, end] });\n            }\n        }\n        else {\n            stack.push(allocTag(pool, name, start, end));\n        }\n    }, options);\n    stack.length = pool.length = 0;\n    return result;\n}\n/**\n * Returns balanced tag model: a list of all XML/HTML tags that could possibly match\n * given location when moving in inward direction\n */\nfunction balancedInward(source, pos, opt) {\n    // Collecting tags for inward balancing is a bit trickier: we have to store\n    // first child of every matched tag until we find the one that matches given\n    // location\n    const pool = [];\n    const stack = [];\n    const options = createOptions(opt);\n    const result = [];\n    const alloc = (name, start, end) => {\n        if (pool.length) {\n            const tag = pool.pop();\n            tag.name = name;\n            tag.ranges.push(start, end);\n            return tag;\n        }\n        return { name, ranges: [start, end] };\n    };\n    const release = (tag) => {\n        tag.ranges.length = 0;\n        tag.firstChild = void 0;\n        pool.push(tag);\n    };\n    scan(source, (name, type, start, end) => {\n        if (type === 2 /* Close */) {\n            if (!stack.length) {\n                // Some sort of lone closing tag, ignore it\n                return;\n            }\n            let tag = last(stack);\n            if (tag.name === name) { // XXX check for invalid tag names?\n                // Matching closing tag found, check if matched pair is a candidate\n                // for outward balancing\n                if (tag.ranges[0] <= pos && pos <= end) {\n                    result.push({\n                        name,\n                        open: tag.ranges.slice(0, 2),\n                        close: [start, end]\n                    });\n                    while (tag.firstChild) {\n                        const child = tag.firstChild;\n                        const res = {\n                            name: child.name,\n                            open: child.ranges.slice(0, 2)\n                        };\n                        if (child.ranges.length > 2) {\n                            res.close = child.ranges.slice(2, 4);\n                        }\n                        result.push(res);\n                        release(tag);\n                        tag = child;\n                    }\n                    return false;\n                }\n                else {\n                    stack.pop();\n                    const parent = last(stack);\n                    if (parent && !parent.firstChild) {\n                        // No first child in parent node: store current tag\n                        tag.ranges.push(start, end);\n                        parent.firstChild = tag;\n                    }\n                    else {\n                        release(tag);\n                    }\n                }\n            }\n        }\n        else if (type === 3 /* SelfClose */ || isSelfClose(name, options)) {\n            if (start < pos && pos < end) {\n                // Matched self-closed tag, no need to look further\n                result.push({ name, open: [start, end] });\n                return false;\n            }\n            const parent = last(stack);\n            if (parent && !parent.firstChild) {\n                parent.firstChild = alloc(name, start, end);\n            }\n        }\n        else {\n            stack.push(alloc(name, start, end));\n        }\n    }, options);\n    stack.length = pool.length = 0;\n    return result;\n}\nfunction allocTag(pool, name, start, end) {\n    if (pool.length) {\n        const tag = pool.pop();\n        tag.name = name;\n        tag.start = start;\n        tag.end = end;\n        return tag;\n    }\n    return { name, start, end };\n}\nfunction releaseTag(pool, tag) {\n    pool.push(tag);\n}\n/**\n * Returns parsed attributes from given source\n */\nfunction getAttributes(source, start, end, name) {\n    const tokens = attributes(source.slice(start, end), name);\n    tokens.forEach(attr => {\n        attr.nameStart += start;\n        attr.nameEnd += start;\n        if (attr.value != null) {\n            attr.valueStart += start;\n            attr.valueEnd += start;\n        }\n    });\n    return tokens;\n}\n/**\n * Check if given tag is self-close for current parsing context\n */\nfunction isSelfClose(name, options) {\n    return !options.xml && options.empty.includes(name);\n}\nfunction last(arr) {\n    return arr.length ? arr[arr.length - 1] : null;\n}\n\nexport default match;\nexport { attributes, balancedInward, balancedOutward, createOptions, scan };\n//# sourceMappingURL=html-matcher.es.js.map\n","import { SyntaxType, CSSAbbreviationScope, AbbreviationContext } from 'emmet';\nimport { TokenType } from '@emmetio/css-matcher';\nimport { attributes } from '@emmetio/html-matcher';\nimport { CSSContext, HTMLContext, getHTMLContext, getCSSContext } from '@emmetio/action-utils';\nimport { EnableForSyntax } from './config';\nimport { getContent, last, attributeValue } from './utils';\n\nconst xmlSyntaxes = ['xml', 'xsl', 'jsx'];\nconst htmlSyntaxes = ['html', 'htmlmixed', 'vue'];\nconst cssSyntaxes = ['css', 'scss', 'less'];\nconst jsxSyntaxes = ['jsx', 'tsx'];\nconst markupSyntaxes = ['haml', 'jade', 'pug', 'slim'].concat(htmlSyntaxes, xmlSyntaxes, jsxSyntaxes);\nconst stylesheetSyntaxes = ['sass', 'sss', 'stylus', 'postcss'].concat(cssSyntaxes);\n\nexport interface SyntaxInfo {\n    type: SyntaxType;\n    syntax?: string;\n    inline?: boolean;\n    context?: HTMLContext | CSSContext;\n}\n\nexport interface StylesheetRegion {\n    range: [number, number];\n    syntax: string;\n    inline?: boolean;\n}\n\nexport interface SyntaxCache {\n    stylesheetRegions?: StylesheetRegion[];\n}\n\n/**\n * Returns Emmet syntax info for given location in view.\n * Syntax info is an abbreviation type (either 'markup' or 'stylesheet') and syntax\n * name, which is used to apply syntax-specific options for output.\n *\n * By default, if given location doesn’t match any known context, this method\n * returns `null`, but if `fallback` argument is provided, it returns data for\n * given fallback syntax\n */\nexport function syntaxInfo(editor: CodeMirror.Editor, pos: number): SyntaxInfo {\n    let syntax = docSyntax(editor);\n    let inline: boolean | undefined;\n    let context: HTMLContext | CSSContext | undefined;\n\n    if (isHTML(syntax)) {\n        const content = getContent(editor);\n        context = getHTMLContext(content, pos, {\n            xml: isXML(syntax)\n        });\n\n        if (context.css) {\n            // `pos` is in embedded CSS\n            syntax = getEmbeddedStyleSyntax(content, context) || 'css';\n            inline = context.css.inline;\n            context = context.css;\n        }\n    } else if (isCSS(syntax)) {\n        context = getCSSContext(getContent(editor), pos);\n    }\n\n    return {\n        type: getSyntaxType(syntax),\n        syntax,\n        inline,\n        context\n    };\n}\n\n/**\n * Returns syntax for given position in editor\n */\nexport function syntaxFromPos(editor: CodeMirror.Editor, pos: number): string | undefined {\n    const p = editor.posFromIndex(pos);\n    const mode = editor.getModeAt(p);\n    if (mode && mode.name === 'xml') {\n        // XML mode is used for styling HTML as well\n        return mode.configuration || mode.name;\n    }\n    return mode && mode.name;\n}\n\n/**\n * Returns main editor syntax\n */\nexport function docSyntax(editor: CodeMirror.Editor): string {\n    const mode = editor.getMode();\n    if (mode) {\n        return mode.name === 'htmlmixed' ? 'html' : (mode.name || '');\n    }\n    return '';\n}\n\n/**\n * Returns Emmet abbreviation type for given syntax\n */\nexport function getSyntaxType(syntax?: string): SyntaxType {\n    return syntax && stylesheetSyntaxes.includes(syntax) ? 'stylesheet' : 'markup';\n}\n\n/**\n * Check if given syntax is XML dialect\n */\nexport function isXML(syntax?: string): boolean {\n    return syntax ? xmlSyntaxes.includes(syntax) : false;\n}\n\n/**\n * Check if given syntax is HTML dialect (including XML)\n */\nexport function isHTML(syntax?: string): boolean {\n    return syntax\n        ? htmlSyntaxes.includes(syntax) || isXML(syntax)\n        : false;\n}\n\n/**\n * Check if given syntax name is supported by Emmet\n */\nexport function isSupported(syntax: string): boolean {\n    return syntax\n        ? markupSyntaxes.includes(syntax) || stylesheetSyntaxes.includes(syntax)\n        : false;\n}\n\n/**\n * Check if given syntax is a CSS dialect. Note that it’s not the same as stylesheet\n * syntax: for example, SASS is a stylesheet but not CSS dialect (but SCSS is)\n */\nexport function isCSS(syntax?: string): boolean {\n    return syntax ? cssSyntaxes.includes(syntax) : false;\n}\n\n/**\n * Check if given syntax is JSX dialect\n */\nexport function isJSX(syntax?: string): boolean {\n    return syntax ? jsxSyntaxes.includes(syntax) : false;\n}\n\n/**\n * Check if given option if enabled for specified syntax\n */\nexport function enabledForSyntax(opt: EnableForSyntax, info: SyntaxInfo) {\n    if (opt === true) {\n        return true;\n    }\n\n    if (Array.isArray(opt)) {\n        const candidates: string[] = [info.type, info.syntax!];\n        if (info.inline) {\n            candidates.push(`${info.type}-inline`, `${info.syntax!}-inline`);\n        }\n\n        return candidates.some(c => opt.includes(c));\n    }\n\n    return false;\n}\n\n/**\n * Returns embedded stylesheet syntax from given HTML context\n */\nexport function getEmbeddedStyleSyntax(code: string, ctx: HTMLContext): string | undefined {\n    const parent = last(ctx.ancestors);\n    if (parent && parent.name === 'style') {\n        for (const attr of attributes(code.slice(parent.range[0], parent.range[1]), parent.name)) {\n            if (attr.name === 'type') {\n                return attributeValue(attr);\n            }\n        }\n    }\n}\n\n/**\n * Returns context for Emmet abbreviation from given HTML context\n */\nexport function getMarkupAbbreviationContext(code: string, ctx: HTMLContext): AbbreviationContext | undefined {\n    const parent = last(ctx.ancestors);\n    if (parent) {\n        const attrs: { [name: string]: string } = {};\n        for (const attr of attributes(code.slice(parent.range[0], parent.range[1]), parent.name)) {\n            attrs[attr.name] = attributeValue(attr) || '';\n        }\n\n        return {\n            name: parent.name,\n            attributes: attrs\n        };\n    }\n}\n\n/**\n * Returns context for Emmet abbreviation from given CSS context\n */\nexport function getStylesheetAbbreviationContext(ctx: CSSContext): AbbreviationContext {\n    if (ctx.inline) {\n        return { name: CSSAbbreviationScope.Property }\n    }\n\n    const parent = last(ctx.ancestors);\n    let scope: string = CSSAbbreviationScope.Global;\n    if (ctx.current) {\n        if (ctx.current.type === TokenType.PropertyValue && parent) {\n            scope = parent.name;\n        } else if ((ctx.current.type === TokenType.Selector || ctx.current.type === TokenType.PropertyName) && !parent) {\n            scope = CSSAbbreviationScope.Section;\n        }\n    }\n\n    return {\n        name: scope\n    };\n}\n","import parse$2 from '@emmetio/abbreviation';\nexport { default as markupAbbreviation } from '@emmetio/abbreviation';\nimport parse$3 from '@emmetio/css-abbreviation';\nexport { default as stylesheetAbbreviation } from '@emmetio/css-abbreviation';\n\n/**\n * Merges attributes in current node: de-duplicates attributes with the same name\n * and merges class names\n */\nfunction mergeAttributes(node, config) {\n    if (!node.attributes) {\n        return;\n    }\n    const attributes = [];\n    const lookup = {};\n    for (const attr of node.attributes) {\n        if (attr.name) {\n            const attrName = attr.name;\n            if (attrName in lookup) {\n                const prev = lookup[attrName];\n                if (attrName === 'class') {\n                    prev.value = mergeValue(prev.value, attr.value, ' ');\n                }\n                else {\n                    mergeDeclarations(prev, attr, config);\n                }\n            }\n            else {\n                // Create new attribute instance so we can safely modify it later\n                attributes.push(lookup[attrName] = Object.assign({}, attr));\n            }\n        }\n        else {\n            attributes.push(attr);\n        }\n    }\n    node.attributes = attributes;\n}\n/**\n * Merges two token lists into single list. Adjacent strings are merged together\n */\nfunction mergeValue(prev, next, glue) {\n    if (prev && next) {\n        if (prev.length && glue) {\n            append(prev, glue);\n        }\n        for (const t of next) {\n            append(prev, t);\n        }\n        return prev;\n    }\n    const result = prev || next;\n    return result && result.slice();\n}\n/**\n * Merges data from `src` attribute into `dest` and returns it\n */\nfunction mergeDeclarations(dest, src, config) {\n    dest.name = src.name;\n    if (!config.options['output.reverseAttributes']) {\n        dest.value = src.value;\n    }\n    // Keep high-priority properties\n    if (!dest.implied) {\n        dest.implied = src.implied;\n    }\n    if (!dest.boolean) {\n        dest.boolean = src.boolean;\n    }\n    if (dest.valueType !== 'expression') {\n        dest.valueType = src.valueType;\n    }\n    return dest;\n}\nfunction append(tokens, value) {\n    const lastIx = tokens.length - 1;\n    if (typeof tokens[lastIx] === 'string' && typeof value === 'string') {\n        tokens[lastIx] += value;\n    }\n    else {\n        tokens.push(value);\n    }\n}\n\n/**\n * Walks over each child node of given markup abbreviation AST node (not including\n * given one) and invokes `fn` on each node.\n * The `fn` callback accepts context node, list of ancestor nodes and optional\n * state object\n */\nfunction walk(node, fn, state) {\n    const ancestors = [node];\n    const callback = (ctx) => {\n        fn(ctx, ancestors, state);\n        ancestors.push(ctx);\n        ctx.children.forEach(callback);\n        ancestors.pop();\n    };\n    node.children.forEach(callback);\n}\n/**\n * Finds node which is the deepest for in current node or node itself.\n */\nfunction findDeepest(node) {\n    let parent;\n    while (node.children.length) {\n        parent = node;\n        node = node.children[node.children.length - 1];\n    }\n    return { parent, node };\n}\nfunction isNode(node) {\n    return node.type === 'AbbreviationNode';\n}\n\n/**\n * Finds matching snippet from `registry` and resolves it into a parsed abbreviation.\n * Resolved node is then updated or replaced with matched abbreviation tree.\n *\n * A HTML registry basically contains aliases to another Emmet abbreviations,\n * e.g. a predefined set of name, attributes and so on, possibly a complex\n * abbreviation with multiple elements. So we have to get snippet, parse it\n * and recursively resolve it.\n */\nfunction resolveSnippets(abbr, config) {\n    const stack = [];\n    const reversed = config.options['output.reverseAttributes'];\n    const resolve = (child) => {\n        const snippet = child.name && config.snippets[child.name];\n        // A snippet in stack means circular reference.\n        // It can be either a user error or a perfectly valid snippet like\n        // \"img\": \"img[src alt]/\", e.g. an element with predefined shape.\n        // In any case, simply stop parsing and keep element as is\n        if (!snippet || stack.includes(snippet)) {\n            return null;\n        }\n        const snippetAbbr = parse$2(snippet, config);\n        stack.push(snippet);\n        walkResolve(snippetAbbr, resolve);\n        stack.pop();\n        // Add attributes from current node into every top-level node of parsed abbreviation\n        for (const topNode of snippetAbbr.children) {\n            if (child.attributes) {\n                const from = topNode.attributes || [];\n                const to = child.attributes || [];\n                topNode.attributes = reversed ? to.concat(from) : from.concat(to);\n            }\n            mergeNodes(child, topNode);\n        }\n        return snippetAbbr;\n    };\n    walkResolve(abbr, resolve);\n    return abbr;\n}\nfunction walkResolve(node, resolve, config) {\n    let children = [];\n    for (const child of node.children) {\n        const resolved = resolve(child);\n        if (resolved) {\n            children = children.concat(resolved.children);\n            const deepest = findDeepest(resolved);\n            if (isNode(deepest.node)) {\n                deepest.node.children = deepest.node.children.concat(walkResolve(child, resolve));\n            }\n        }\n        else {\n            children.push(child);\n            child.children = walkResolve(child, resolve);\n        }\n    }\n    return node.children = children;\n}\n/**\n * Adds data from first node into second node\n */\nfunction mergeNodes(from, to) {\n    if (from.selfClosing) {\n        to.selfClosing = true;\n    }\n    if (from.value != null) {\n        to.value = from.value;\n    }\n    if (from.repeat) {\n        to.repeat = from.repeat;\n    }\n}\n\nfunction createOutputStream(options, level = 0) {\n    return {\n        options,\n        value: '',\n        level,\n        offset: 0,\n        line: 0,\n        column: 0\n    };\n}\n/**\n * Pushes plain string into output stream without newline processing\n */\nfunction push(stream, text) {\n    const processText = stream.options['output.text'];\n    _push(stream, processText(text, stream.offset, stream.line, stream.column));\n}\n/**\n * Pushes given string with possible newline formatting into output\n */\nfunction pushString(stream, value) {\n    // If given value contains newlines, we should push content line-by-line and\n    // use `pushNewline()` to maintain proper line/column state\n    const lines = splitByLines(value);\n    for (let i = 0, il = lines.length - 1; i <= il; i++) {\n        push(stream, lines[i]);\n        if (i !== il) {\n            pushNewline(stream, true);\n        }\n    }\n}\n/**\n * Pushes new line into given output stream\n */\nfunction pushNewline(stream, indent) {\n    const baseIndent = stream.options['output.baseIndent'];\n    const newline = stream.options['output.newline'];\n    push(stream, newline + baseIndent);\n    stream.line++;\n    stream.column = baseIndent.length;\n    if (indent) {\n        pushIndent(stream, indent === true ? stream.level : indent);\n    }\n}\n/**\n * Adds indentation of `size` to current output stream\n */\nfunction pushIndent(stream, size = stream.level) {\n    const indent = stream.options['output.indent'];\n    push(stream, indent.repeat(Math.max(size, 0)));\n}\n/**\n * Pushes field/tabstop into output stream\n */\nfunction pushField(stream, index, placeholder) {\n    const field = stream.options['output.field'];\n    // NB: use `_push` instead of `push` to skip text processing\n    _push(stream, field(index, placeholder, stream.offset, stream.line, stream.column));\n}\n/**\n * Returns given tag name formatted according to given config\n */\nfunction tagName(name, config) {\n    return strCase(name, config.options['output.tagCase']);\n}\n/**\n * Returns given attribute name formatted according to given config\n */\nfunction attrName(name, config) {\n    return strCase(name, config.options['output.attributeCase']);\n}\n/**\n * Returns character for quoting value of given attribute\n */\nfunction attrQuote(attr, config, isOpen) {\n    if (attr.valueType === 'expression') {\n        return isOpen ? '{' : '}';\n    }\n    return config.options['output.attributeQuotes'] === 'single' ? '\\'' : '\"';\n}\n/**\n * Check if given attribute is boolean\n */\nfunction isBooleanAttribute(attr, config) {\n    return attr.boolean\n        || config.options['output.booleanAttributes'].includes((attr.name || '').toLowerCase());\n}\n/**\n * Returns a token for self-closing tag, depending on current options\n */\nfunction selfClose(config) {\n    switch (config.options['output.selfClosingStyle']) {\n        case 'xhtml': return ' /';\n        case 'xml': return '/';\n        default: return '';\n    }\n}\n/**\n * Check if given tag name belongs to inline-level element\n * @param node Parsed node or tag name\n */\nfunction isInline(node, config) {\n    if (typeof node === 'string') {\n        return config.options.inlineElements.includes(node.toLowerCase());\n    }\n    // inline node is a node either with inline-level name or text-only node\n    return node.name ? isInline(node.name, config) : Boolean(node.value && !node.attributes);\n}\n/**\n * Splits given text by lines\n */\nfunction splitByLines(text) {\n    return text.split(/\\r\\n|\\r|\\n/g);\n}\n/**\n * Pushes raw string into output stream without any processing\n */\nfunction _push(stream, text) {\n    stream.value += text;\n    stream.offset += text.length;\n    stream.column += text.length;\n}\nfunction strCase(str, type) {\n    if (type) {\n        return type === 'upper' ? str.toUpperCase() : str.toLowerCase();\n    }\n    return str;\n}\n\nconst elementMap = {\n    p: 'span',\n    ul: 'li',\n    ol: 'li',\n    table: 'tr',\n    tr: 'td',\n    tbody: 'tr',\n    thead: 'tr',\n    tfoot: 'tr',\n    colgroup: 'col',\n    select: 'option',\n    optgroup: 'option',\n    audio: 'source',\n    video: 'source',\n    object: 'param',\n    map: 'area'\n};\nfunction implicitTag(node, ancestors, config) {\n    if (!node.name && node.attributes) {\n        resolveImplicitTag(node, ancestors, config);\n    }\n}\nfunction resolveImplicitTag(node, ancestors, config) {\n    const parent = getParentElement(ancestors);\n    const contextName = config.context ? config.context.name : '';\n    const parentName = lowercase(parent ? parent.name : contextName);\n    node.name = elementMap[parentName]\n        || (isInline(parentName, config) ? 'span' : 'div');\n}\nfunction lowercase(str) {\n    return (str || '').toLowerCase();\n}\n/**\n * Returns closest element node from given ancestors list\n */\nfunction getParentElement(ancestors) {\n    for (let i = ancestors.length - 1; i >= 0; i--) {\n        const elem = ancestors[i];\n        if (isNode(elem)) {\n            return elem;\n        }\n    }\n}\n\nvar latin = {\n\t\"common\": [\"lorem\", \"ipsum\", \"dolor\", \"sit\", \"amet\", \"consectetur\", \"adipisicing\", \"elit\"],\n\t\"words\": [\"exercitationem\", \"perferendis\", \"perspiciatis\", \"laborum\", \"eveniet\",\n\t\t\"sunt\", \"iure\", \"nam\", \"nobis\", \"eum\", \"cum\", \"officiis\", \"excepturi\",\n\t\t\"odio\", \"consectetur\", \"quasi\", \"aut\", \"quisquam\", \"vel\", \"eligendi\",\n\t\t\"itaque\", \"non\", \"odit\", \"tempore\", \"quaerat\", \"dignissimos\",\n\t\t\"facilis\", \"neque\", \"nihil\", \"expedita\", \"vitae\", \"vero\", \"ipsum\",\n\t\t\"nisi\", \"animi\", \"cumque\", \"pariatur\", \"velit\", \"modi\", \"natus\",\n\t\t\"iusto\", \"eaque\", \"sequi\", \"illo\", \"sed\", \"ex\", \"et\", \"voluptatibus\",\n\t\t\"tempora\", \"veritatis\", \"ratione\", \"assumenda\", \"incidunt\", \"nostrum\",\n\t\t\"placeat\", \"aliquid\", \"fuga\", \"provident\", \"praesentium\", \"rem\",\n\t\t\"necessitatibus\", \"suscipit\", \"adipisci\", \"quidem\", \"possimus\",\n\t\t\"voluptas\", \"debitis\", \"sint\", \"accusantium\", \"unde\", \"sapiente\",\n\t\t\"voluptate\", \"qui\", \"aspernatur\", \"laudantium\", \"soluta\", \"amet\",\n\t\t\"quo\", \"aliquam\", \"saepe\", \"culpa\", \"libero\", \"ipsa\", \"dicta\",\n\t\t\"reiciendis\", \"nesciunt\", \"doloribus\", \"autem\", \"impedit\", \"minima\",\n\t\t\"maiores\", \"repudiandae\", \"ipsam\", \"obcaecati\", \"ullam\", \"enim\",\n\t\t\"totam\", \"delectus\", \"ducimus\", \"quis\", \"voluptates\", \"dolores\",\n\t\t\"molestiae\", \"harum\", \"dolorem\", \"quia\", \"voluptatem\", \"molestias\",\n\t\t\"magni\", \"distinctio\", \"omnis\", \"illum\", \"dolorum\", \"voluptatum\", \"ea\",\n\t\t\"quas\", \"quam\", \"corporis\", \"quae\", \"blanditiis\", \"atque\", \"deserunt\",\n\t\t\"laboriosam\", \"earum\", \"consequuntur\", \"hic\", \"cupiditate\",\n\t\t\"quibusdam\", \"accusamus\", \"ut\", \"rerum\", \"error\", \"minus\", \"eius\",\n\t\t\"ab\", \"ad\", \"nemo\", \"fugit\", \"officia\", \"at\", \"in\", \"id\", \"quos\",\n\t\t\"reprehenderit\", \"numquam\", \"iste\", \"fugiat\", \"sit\", \"inventore\",\n\t\t\"beatae\", \"repellendus\", \"magnam\", \"recusandae\", \"quod\", \"explicabo\",\n\t\t\"doloremque\", \"aperiam\", \"consequatur\", \"asperiores\", \"commodi\",\n\t\t\"optio\", \"dolor\", \"labore\", \"temporibus\", \"repellat\", \"veniam\",\n\t\t\"architecto\", \"est\", \"esse\", \"mollitia\", \"nulla\", \"a\", \"similique\",\n\t\t\"eos\", \"alias\", \"dolore\", \"tenetur\", \"deleniti\", \"porro\", \"facere\",\n\t\t\"maxime\", \"corrupti\"]\n};\n\nvar ru = {\n\t\"common\": [\"далеко-далеко\", \"за\", \"словесными\", \"горами\", \"в стране\", \"гласных\", \"и согласных\", \"живут\", \"рыбные\", \"тексты\"],\n\t\"words\": [\"вдали\", \"от всех\", \"они\", \"буквенных\", \"домах\", \"на берегу\", \"семантика\",\n\t\t\"большого\", \"языкового\", \"океана\", \"маленький\", \"ручеек\", \"даль\",\n\t\t\"журчит\", \"по всей\", \"обеспечивает\", \"ее\",\"всеми\", \"необходимыми\",\n\t\t\"правилами\", \"эта\", \"парадигматическая\", \"страна\", \"которой\", \"жаренные\",\n\t\t\"предложения\", \"залетают\", \"прямо\", \"рот\", \"даже\", \"всемогущая\",\n\t\t\"пунктуация\", \"не\", \"имеет\", \"власти\", \"над\", \"рыбными\", \"текстами\",\n\t\t\"ведущими\", \"безорфографичный\", \"образ\", \"жизни\", \"однажды\", \"одна\",\n\t\t\"маленькая\", \"строчка\",\"рыбного\", \"текста\", \"имени\", \"lorem\", \"ipsum\",\n\t\t\"решила\", \"выйти\", \"большой\", \"мир\", \"грамматики\", \"великий\", \"оксмокс\",\n\t\t\"предупреждал\", \"о\", \"злых\", \"запятых\", \"диких\", \"знаках\", \"вопроса\",\n\t\t\"коварных\", \"точках\", \"запятой\", \"но\", \"текст\", \"дал\", \"сбить\",\n\t\t\"себя\", \"толку\", \"он\", \"собрал\", \"семь\", \"своих\", \"заглавных\", \"букв\",\n\t\t\"подпоясал\", \"инициал\", \"за\", \"пояс\", \"пустился\", \"дорогу\",\n\t\t\"взобравшись\", \"первую\", \"вершину\", \"курсивных\", \"гор\", \"бросил\",\n\t\t\"последний\", \"взгляд\", \"назад\", \"силуэт\", \"своего\", \"родного\", \"города\",\n\t\t\"буквоград\", \"заголовок\", \"деревни\", \"алфавит\", \"подзаголовок\", \"своего\",\n\t\t\"переулка\", \"грустный\", \"реторический\", \"вопрос\", \"скатился\", \"его\",\n\t\t\"щеке\", \"продолжил\", \"свой\", \"путь\", \"дороге\", \"встретил\", \"рукопись\",\n\t\t\"она\", \"предупредила\",  \"моей\", \"все\", \"переписывается\", \"несколько\",\n\t\t\"раз\", \"единственное\", \"что\", \"меня\", \"осталось\", \"это\", \"приставка\",\n\t\t\"возвращайся\", \"ты\", \"лучше\", \"свою\", \"безопасную\", \"страну\", \"послушавшись\",\n\t\t\"рукописи\", \"наш\", \"продолжил\", \"свой\", \"путь\", \"вскоре\", \"ему\",\n\t\t\"повстречался\", \"коварный\", \"составитель\", \"рекламных\", \"текстов\",\n\t\t\"напоивший\", \"языком\", \"речью\", \"заманивший\", \"свое\", \"агентство\",\n\t\t\"которое\", \"использовало\", \"снова\", \"снова\", \"своих\", \"проектах\",\n\t\t\"если\", \"переписали\", \"то\", \"живет\", \"там\", \"до\", \"сих\", \"пор\"]\n};\n\nvar sp = {\n\t\"common\": [\"mujer\", \"uno\", \"dolor\", \"más\", \"de\", \"poder\", \"mismo\", \"si\"],\n\t\"words\": [\"ejercicio\", \"preferencia\", \"perspicacia\", \"laboral\", \"paño\",\n\t\t\"suntuoso\", \"molde\", \"namibia\", \"planeador\", \"mirar\", \"demás\", \"oficinista\", \"excepción\",\n\t\t\"odio\", \"consecuencia\", \"casi\", \"auto\", \"chicharra\", \"velo\", \"elixir\",\n\t\t\"ataque\", \"no\", \"odio\", \"temporal\", \"cuórum\", \"dignísimo\",\n\t\t\"facilismo\", \"letra\", \"nihilista\", \"expedición\", \"alma\", \"alveolar\", \"aparte\",\n\t\t\"león\", \"animal\", \"como\", \"paria\", \"belleza\", \"modo\", \"natividad\",\n\t\t\"justo\", \"ataque\", \"séquito\", \"pillo\", \"sed\", \"ex\", \"y\", \"voluminoso\",\n\t\t\"temporalidad\", \"verdades\", \"racional\", \"asunción\", \"incidente\", \"marejada\",\n\t\t\"placenta\", \"amanecer\", \"fuga\", \"previsor\", \"presentación\", \"lejos\",\n\t\t\"necesariamente\", \"sospechoso\", \"adiposidad\", \"quindío\", \"pócima\",\n\t\t\"voluble\", \"débito\", \"sintió\", \"accesorio\", \"falda\", \"sapiencia\",\n\t\t\"volutas\", \"queso\", \"permacultura\", \"laudo\", \"soluciones\", \"entero\",\n\t\t\"pan\", \"litro\", \"tonelada\", \"culpa\", \"libertario\", \"mosca\", \"dictado\",\n\t\t\"reincidente\", \"nascimiento\", \"dolor\", \"escolar\", \"impedimento\", \"mínima\",\n\t\t\"mayores\", \"repugnante\", \"dulce\", \"obcecado\", \"montaña\", \"enigma\",\n\t\t\"total\", \"deletéreo\", \"décima\", \"cábala\", \"fotografía\", \"dolores\",\n\t\t\"molesto\", \"olvido\", \"paciencia\", \"resiliencia\", \"voluntad\", \"molestias\",\n\t\t\"magnífico\", \"distinción\", \"ovni\", \"marejada\", \"cerro\", \"torre\", \"y\",\n\t\t\"abogada\", \"manantial\", \"corporal\", \"agua\", \"crepúsculo\", \"ataque\", \"desierto\",\n\t\t\"laboriosamente\", \"angustia\", \"afortunado\", \"alma\", \"encefalograma\",\n\t\t\"materialidad\", \"cosas\", \"o\", \"renuncia\", \"error\", \"menos\", \"conejo\",\n\t\t\"abadía\", \"analfabeto\", \"remo\", \"fugacidad\", \"oficio\", \"en\", \"almácigo\", \"vos\", \"pan\",\n\t\t\"represión\", \"números\", \"triste\", \"refugiado\", \"trote\", \"inventor\",\n\t\t\"corchea\", \"repelente\", \"magma\", \"recusado\", \"patrón\", \"explícito\",\n\t\t\"paloma\", \"síndrome\", \"inmune\", \"autoinmune\", \"comodidad\",\n\t\t\"ley\", \"vietnamita\", \"demonio\", \"tasmania\", \"repeler\", \"apéndice\",\n\t\t\"arquitecto\", \"columna\", \"yugo\", \"computador\", \"mula\", \"a\", \"propósito\",\n\t\t\"fantasía\", \"alias\", \"rayo\", \"tenedor\", \"deleznable\", \"ventana\", \"cara\",\n\t\t\"anemia\", \"corrupto\"]\n};\n\nconst vocabularies = { ru, sp, latin };\nconst reLorem = /^lorem([a-z]*)(\\d*)(-\\d*)?$/i;\nfunction lorem(node, ancestors, config) {\n    let m;\n    if (node.name && (m = node.name.match(reLorem))) {\n        const db = vocabularies[m[1]] || vocabularies.latin;\n        const minWordCount = m[2] ? Math.max(1, Number(m[2])) : 30;\n        const maxWordCount = m[3] ? Math.max(minWordCount, Number(m[3].slice(1))) : minWordCount;\n        const wordCount = rand(minWordCount, maxWordCount);\n        const repeat = node.repeat || findRepeater(ancestors);\n        node.name = node.attributes = void 0;\n        node.value = [paragraph(db, wordCount, !repeat || repeat.value === 0)];\n        if (node.repeat && ancestors.length > 1) {\n            resolveImplicitTag(node, ancestors, config);\n        }\n    }\n}\n/**\n * Returns random integer between <code>from</code> and <code>to</code> values\n */\nfunction rand(from, to) {\n    return Math.floor(Math.random() * (to - from) + from);\n}\nfunction sample(arr, count) {\n    const len = arr.length;\n    const iterations = Math.min(len, count);\n    const result = [];\n    while (result.length < iterations) {\n        const str = arr[rand(0, len)];\n        if (!result.includes(str)) {\n            result.push(str);\n        }\n    }\n    return result;\n}\nfunction choice(val) {\n    return val[rand(0, val.length - 1)];\n}\nfunction sentence(words, end) {\n    if (words.length) {\n        words = [capitalize(words[0])].concat(words.slice(1));\n    }\n    return words.join(' ') + (end || choice('?!...')); // more dots than question marks\n}\nfunction capitalize(word) {\n    return word[0].toUpperCase() + word.slice(1);\n}\n/**\n * Insert commas at randomly selected words. This function modifies values\n * inside `words` array\n */\nfunction insertCommas(words) {\n    if (words.length < 2) {\n        return words;\n    }\n    words = words.slice();\n    const len = words.length;\n    const hasComma = /,$/;\n    let totalCommas = 0;\n    if (len > 3 && len <= 6) {\n        totalCommas = rand(0, 1);\n    }\n    else if (len > 6 && len <= 12) {\n        totalCommas = rand(0, 2);\n    }\n    else {\n        totalCommas = rand(1, 4);\n    }\n    for (let i = 0, pos; i < totalCommas; i++) {\n        pos = rand(0, len - 2);\n        if (!hasComma.test(words[pos])) {\n            words[pos] += ',';\n        }\n    }\n    return words;\n}\n/**\n * Generate a paragraph of \"Lorem ipsum\" text\n * @param dict Words dictionary\n * @param wordCount Words count in paragraph\n * @param startWithCommon Should paragraph start with common \"lorem ipsum\" sentence.\n */\nfunction paragraph(dict, wordCount, startWithCommon) {\n    const result = [];\n    let totalWords = 0;\n    let words;\n    if (startWithCommon && dict.common) {\n        words = dict.common.slice(0, wordCount);\n        totalWords += words.length;\n        result.push(sentence(insertCommas(words), '.'));\n    }\n    while (totalWords < wordCount) {\n        words = sample(dict.words, Math.min(rand(2, 30), wordCount - totalWords));\n        totalWords += words.length;\n        result.push(sentence(insertCommas(words)));\n    }\n    return result.join(' ');\n}\nfunction findRepeater(ancestors) {\n    for (let i = ancestors.length - 1; i >= 0; i--) {\n        const element = ancestors[i];\n        if (element.type === 'AbbreviationNode' && element.repeat) {\n            return element.repeat;\n        }\n    }\n}\n\n/**\n * JSX transformer: replaces `class` and `for` attributes with `className` and\n * `htmlFor` attributes respectively\n */\nfunction jsx(node) {\n    if (node.attributes) {\n        node.attributes.forEach(rename);\n    }\n}\nfunction rename(attr) {\n    if (attr.name === 'class') {\n        attr.name = 'className';\n    }\n    else if (attr.name === 'for') {\n        attr.name = 'htmlFor';\n    }\n}\n\n/**\n * XSL transformer: removes `select` attributes from certain nodes that contain\n * children\n */\nfunction xsl(node) {\n    if (matchesName(node.name) && node.attributes && (node.children.length || node.value)) {\n        node.attributes = node.attributes.filter(isAllowed);\n    }\n}\nfunction isAllowed(attr) {\n    return attr.name !== 'select';\n}\nfunction matchesName(name) {\n    return name === 'xsl:variable' || name === 'xsl:with-param';\n}\n\nconst reElement = /^(-+)([a-z0-9]+[a-z0-9-]*)/i;\nconst reModifier = /^(_+)([a-z0-9]+[a-z0-9-_]*)/i;\nconst blockCandidates1 = (className) => /^[a-z]\\-/i.test(className);\nconst blockCandidates2 = (className) => /^[a-z]/i.test(className);\nfunction bem(node, ancestors, config) {\n    expandClassNames(node);\n    expandShortNotation(node, ancestors, config);\n}\n/**\n * Expands existing class names in BEM notation in given `node`.\n * For example, if node contains `b__el_mod` class name, this method ensures\n * that element contains `b__el` class as well\n */\nfunction expandClassNames(node) {\n    const data = getBEMData(node);\n    const classNames = [];\n    for (const cl of data.classNames) {\n        // remove all modifiers and element prefixes from class name to get a base element name\n        const ix = cl.indexOf('_');\n        if (ix > 0 && !cl.startsWith('-')) {\n            classNames.push(cl.slice(0, ix));\n            classNames.push(cl.slice(ix));\n        }\n        else {\n            classNames.push(cl);\n        }\n    }\n    if (classNames.length) {\n        data.classNames = classNames.filter(uniqueClass);\n        data.block = findBlockName(data.classNames);\n        updateClass(node, data.classNames.join(' '));\n    }\n}\n/**\n * Expands short BEM notation, e.g. `-element` and `_modifier`\n */\nfunction expandShortNotation(node, ancestors, config) {\n    const data = getBEMData(node);\n    const classNames = [];\n    const { options } = config;\n    const path = ancestors.slice(1).concat(node);\n    for (let cl of data.classNames) {\n        let prefix = '';\n        let m;\n        const originalClass = cl;\n        // parse element definition (could be only one)\n        if (m = cl.match(reElement)) {\n            prefix = getBlockName(path, m[1].length, config.context) + options['bem.element'] + m[2];\n            classNames.push(prefix);\n            cl = cl.slice(m[0].length);\n        }\n        // parse modifiers definitions\n        if (m = cl.match(reModifier)) {\n            if (!prefix) {\n                prefix = getBlockName(path, m[1].length);\n                classNames.push(prefix);\n            }\n            classNames.push(`${prefix}${options['bem.modifier']}${m[2]}`);\n            cl = cl.slice(m[0].length);\n        }\n        if (cl === originalClass) {\n            // class name wasn’t modified: it’s not a BEM-specific class,\n            // add it as-is into output\n            classNames.push(originalClass);\n        }\n    }\n    const arrClassNames = classNames.filter(uniqueClass);\n    if (arrClassNames.length) {\n        updateClass(node, arrClassNames.join(' '));\n    }\n}\n/**\n * Returns BEM data from given abbreviation node\n */\nfunction getBEMData(node) {\n    if (!node._bem) {\n        let classValue = '';\n        if (node.attributes) {\n            for (const attr of node.attributes) {\n                if (attr.name === 'class' && attr.value) {\n                    classValue = stringifyValue(attr.value);\n                    break;\n                }\n            }\n        }\n        node._bem = parseBEM(classValue);\n    }\n    return node._bem;\n}\nfunction getBEMDataFromContext(context) {\n    if (!context._bem) {\n        context._bem = parseBEM(context.attributes && context.attributes.class || '');\n    }\n    return context._bem;\n}\n/**\n * Parses BEM data from given class name\n */\nfunction parseBEM(classValue) {\n    const classNames = classValue ? classValue.split(/\\s+/) : [];\n    return {\n        classNames,\n        block: findBlockName(classNames)\n    };\n}\n/**\n * Returns block name for given `node` by `prefix`, which tells the depth of\n * of parent node lookup\n */\nfunction getBlockName(ancestors, depth = 0, context) {\n    const maxParentIx = 0;\n    let parentIx = Math.max(ancestors.length - depth, maxParentIx);\n    do {\n        const parent = ancestors[parentIx];\n        if (parent) {\n            const data = getBEMData(parent);\n            if (data.block) {\n                return data.block;\n            }\n        }\n    } while (maxParentIx < parentIx--);\n    if (context) {\n        const data = getBEMDataFromContext(context);\n        if (data.block) {\n            return data.block;\n        }\n    }\n    return '';\n}\nfunction findBlockName(classNames) {\n    return find(classNames, blockCandidates1)\n        || find(classNames, blockCandidates2)\n        || void 0;\n}\n/**\n * Finds class name from given list which may be used as block name\n */\nfunction find(classNames, filter) {\n    for (const cl of classNames) {\n        if (reElement.test(cl) || reModifier.test(cl)) {\n            break;\n        }\n        if (filter(cl)) {\n            return cl;\n        }\n    }\n}\nfunction updateClass(node, value) {\n    for (const attr of node.attributes) {\n        if (attr.name === 'class') {\n            attr.value = [value];\n            break;\n        }\n    }\n}\nfunction stringifyValue(value) {\n    let result = '';\n    for (const t of value) {\n        result += typeof t === 'string' ? t : t.name;\n    }\n    return result;\n}\nfunction uniqueClass(item, ix, arr) {\n    return !!item && arr.indexOf(item) === ix;\n}\n\nfunction walk$1(abbr, visitor, state) {\n    const callback = (ctx, index, items) => {\n        const { parent, current } = state;\n        state.parent = current;\n        state.current = ctx;\n        visitor(ctx, index, items, state, next);\n        state.current = current;\n        state.parent = parent;\n    };\n    const next = (node, index, items) => {\n        state.ancestors.push(state.current);\n        callback(node, index, items);\n        state.ancestors.pop();\n    };\n    abbr.children.forEach(callback);\n}\nfunction createWalkState(config) {\n    return {\n        // @ts-ignore: Will set value in iterator\n        current: null,\n        parent: void 0,\n        ancestors: [],\n        config,\n        field: 1,\n        out: createOutputStream(config.options)\n    };\n}\n\nconst caret = [{ type: 'Field', index: 0, name: '' }];\n/**\n * Check if given node is a snippet: a node without name and attributes\n */\nfunction isSnippet(node) {\n    return node ? !node.name && !node.attributes : false;\n}\n/**\n * Check if given node is inline-level element, e.g. element with explicitly\n * defined node name\n */\nfunction isInlineElement(node, config) {\n    return node ? isInline(node, config) : false;\n}\n/**\n * Check if given value token is a field\n */\nfunction isField(token) {\n    return typeof token === 'object' && token.type === 'Field';\n}\nfunction pushTokens(tokens, state) {\n    const { out } = state;\n    let largestIndex = -1;\n    for (const t of tokens) {\n        if (typeof t === 'string') {\n            pushString(out, t);\n        }\n        else {\n            pushField(out, state.field + t.index, t.name);\n            if (t.index > largestIndex) {\n                largestIndex = t.index;\n            }\n        }\n    }\n    if (largestIndex !== -1) {\n        state.field += largestIndex + 1;\n    }\n}\n/**\n * Splits given value token by lines: returns array where each entry is a token list\n * for a single line\n */\nfunction splitByLines$1(tokens) {\n    const result = [];\n    let line = [];\n    for (const t of tokens) {\n        if (typeof t === 'string') {\n            const lines = t.split(/\\r\\n?|\\n/g);\n            line.push(lines.shift() || '');\n            while (lines.length) {\n                result.push(line);\n                line = [lines.shift() || ''];\n            }\n        }\n        else {\n            line.push(t);\n        }\n    }\n    line.length && result.push(line);\n    return result;\n}\n/**\n * Check if given attribute should be outputted\n */\nfunction shouldOutputAttribute(attr) {\n    // In case if attribute is implied, check if it has a defined value:\n    // either non-empty value or quoted empty value\n    return !attr.implied || attr.valueType !== 'raw' || (!!attr.value && attr.value.length > 0);\n}\n\n/**\n * Splits given string into template tokens.\n * Template is a string which contains placeholders which are uppercase names\n * between `[` and `]`, for example: `[PLACEHOLDER]`.\n * Unlike other templates, a placeholder may contain extra characters before and\n * after name: `[%PLACEHOLDER.]`. If data for `PLACEHOLDER` is defined, it will\n * be outputted with with these extra character, otherwise will be completely omitted.\n */\nfunction template(text) {\n    const tokens = [];\n    const scanner = { pos: 0, text };\n    let placeholder;\n    let offset = scanner.pos;\n    let pos = scanner.pos;\n    while (scanner.pos < scanner.text.length) {\n        pos = scanner.pos;\n        if (placeholder = consumePlaceholder(scanner)) {\n            if (offset !== scanner.pos) {\n                tokens.push(text.slice(offset, pos));\n            }\n            tokens.push(placeholder);\n            offset = scanner.pos;\n        }\n        else {\n            scanner.pos++;\n        }\n    }\n    if (offset !== scanner.pos) {\n        tokens.push(text.slice(offset));\n    }\n    return tokens;\n}\n/**\n * Consumes placeholder like `[#ID]` from given scanner\n */\nfunction consumePlaceholder(scanner) {\n    if (peek(scanner) === 91 /* Start */) {\n        const start = ++scanner.pos;\n        let namePos = start;\n        let afterPos = start;\n        let stack = 1;\n        while (scanner.pos < scanner.text.length) {\n            const code = peek(scanner);\n            if (isTokenStart(code)) {\n                namePos = scanner.pos;\n                while (isToken(peek(scanner))) {\n                    scanner.pos++;\n                }\n                afterPos = scanner.pos;\n            }\n            else {\n                if (code === 91 /* Start */) {\n                    stack++;\n                }\n                else if (code === 93 /* End */) {\n                    if (--stack === 0) {\n                        return {\n                            before: scanner.text.slice(start, namePos),\n                            after: scanner.text.slice(afterPos, scanner.pos++),\n                            name: scanner.text.slice(namePos, afterPos)\n                        };\n                    }\n                }\n                scanner.pos++;\n            }\n        }\n    }\n}\nfunction peek(scanner, pos = scanner.pos) {\n    return scanner.text.charCodeAt(pos);\n}\nfunction isTokenStart(code) {\n    return code >= 65 && code <= 90; // A-Z\n}\nfunction isToken(code) {\n    return isTokenStart(code)\n        || (code > 47 && code < 58) /* 0-9 */\n        || code === 95 /* Underscore */\n        || code === 45 /* Dash */;\n}\n\nfunction createCommentState(config) {\n    const { options } = config;\n    return {\n        enabled: options['comment.enabled'],\n        trigger: options['comment.trigger'],\n        before: options['comment.before'] ? template(options['comment.before']) : void 0,\n        after: options['comment.after'] ? template(options['comment.after']) : void 0\n    };\n}\n/**\n * Adds comment prefix for given node, if required\n */\nfunction commentNodeBefore(node, state) {\n    if (shouldComment(node, state) && state.comment.before) {\n        output(node, state.comment.before, state);\n    }\n}\n/**\n * Adds comment suffix for given node, if required\n */\nfunction commentNodeAfter(node, state) {\n    if (shouldComment(node, state) && state.comment.after) {\n        output(node, state.comment.after, state);\n    }\n}\n/**\n * Check if given node should be commented\n */\nfunction shouldComment(node, state) {\n    const { comment } = state;\n    if (!comment.enabled || !comment.trigger || !node.name || !node.attributes) {\n        return false;\n    }\n    for (const attr of node.attributes) {\n        if (attr.name && comment.trigger.includes(attr.name)) {\n            return true;\n        }\n    }\n    return false;\n}\n/**\n * Pushes given template tokens into output stream\n */\nfunction output(node, tokens, state) {\n    const attrs = {};\n    const { out } = state;\n    // Collect attributes payload\n    for (const attr of node.attributes) {\n        if (attr.name && attr.value) {\n            attrs[attr.name.toUpperCase()] = attr.value;\n        }\n    }\n    // Output parsed tokens\n    for (const token of tokens) {\n        if (typeof token === 'string') {\n            pushString(out, token);\n        }\n        else if (attrs[token.name]) {\n            pushString(out, token.before);\n            pushTokens(attrs[token.name], state);\n            pushString(out, token.after);\n        }\n    }\n}\n\nconst htmlTagRegex = /^<([\\w\\-:]+)[\\s>]/;\nfunction html(abbr, config) {\n    const state = createWalkState(config);\n    state.comment = createCommentState(config);\n    walk$1(abbr, element, state);\n    return state.out.value;\n}\n/**\n * Outputs `node` content to output stream of `state`\n * @param node Context node\n * @param index Index of `node` in `items`\n * @param items List of `node`’s siblings\n * @param state Current walk state\n */\nfunction element(node, index, items, state, next) {\n    const { out, config } = state;\n    const format = shouldFormat(node, index, items, state);\n    // Pick offset level for current node\n    const level = getIndent(state);\n    out.level += level;\n    format && pushNewline(out, true);\n    if (node.name) {\n        const name = tagName(node.name, config);\n        commentNodeBefore(node, state);\n        pushString(out, `<${name}`);\n        if (node.attributes) {\n            for (const attr of node.attributes) {\n                if (shouldOutputAttribute(attr)) {\n                    pushAttribute(attr, state);\n                }\n            }\n        }\n        if (node.selfClosing && !node.children.length && !node.value) {\n            pushString(out, `${selfClose(config)}>`);\n        }\n        else {\n            pushString(out, '>');\n            if (!pushSnippet(node, state, next)) {\n                if (node.value) {\n                    const innerFormat = node.value.some(hasNewline) || startsWithBlockTag(node.value, config);\n                    innerFormat && pushNewline(state.out, ++out.level);\n                    pushTokens(node.value, state);\n                    innerFormat && pushNewline(state.out, --out.level);\n                }\n                node.children.forEach(next);\n                if (!node.value && !node.children.length) {\n                    const innerFormat = config.options['output.formatLeafNode']\n                        || config.options['output.formatForce'].includes(node.name);\n                    innerFormat && pushNewline(state.out, ++out.level);\n                    pushTokens(caret, state);\n                    innerFormat && pushNewline(state.out, --out.level);\n                }\n            }\n            pushString(out, `</${name}>`);\n            commentNodeAfter(node, state);\n        }\n    }\n    else if (!pushSnippet(node, state, next) && node.value) {\n        // A text-only node (snippet)\n        pushTokens(node.value, state);\n        node.children.forEach(next);\n    }\n    if (format && index === items.length - 1 && state.parent) {\n        const offset = isSnippet(state.parent) ? 0 : 1;\n        pushNewline(out, out.level - offset);\n    }\n    out.level -= level;\n}\n/**\n * Outputs given attribute’s content into output stream\n */\nfunction pushAttribute(attr, state) {\n    const { out, config } = state;\n    if (attr.name) {\n        const name = attrName(attr.name, config);\n        const lQuote = attrQuote(attr, config, true);\n        const rQuote = attrQuote(attr, config);\n        let value = attr.value;\n        if (isBooleanAttribute(attr, config) && !value) {\n            // If attribute value is omitted and it’s a boolean value, check for\n            // `compactBoolean` option: if it’s disabled, set value to attribute name\n            // (XML style)\n            if (!config.options['output.compactBoolean']) {\n                value = [name];\n            }\n        }\n        else if (!value) {\n            value = caret;\n        }\n        pushString(out, ' ' + name);\n        if (value) {\n            pushString(out, '=' + lQuote);\n            pushTokens(value, state);\n            pushString(out, rQuote);\n        }\n        else if (config.options['output.selfClosingStyle'] !== 'html') {\n            pushString(out, '=' + lQuote + rQuote);\n        }\n    }\n}\nfunction pushSnippet(node, state, next) {\n    if (node.value && node.children.length) {\n        // We have a value and child nodes. In case if value contains fields,\n        // we should output children as a content of first field\n        const fieldIx = node.value.findIndex(isField);\n        if (fieldIx !== -1) {\n            pushTokens(node.value.slice(0, fieldIx), state);\n            const line = state.out.line;\n            let pos = fieldIx + 1;\n            node.children.forEach(next);\n            // If there was a line change, trim leading whitespace for better result\n            if (state.out.line !== line && typeof node.value[pos] === 'string') {\n                pushString(state.out, node.value[pos++].trimLeft());\n            }\n            pushTokens(node.value.slice(pos), state);\n            return true;\n        }\n    }\n    return false;\n}\n/**\n * Check if given node should be formatted in its parent context\n */\nfunction shouldFormat(node, index, items, state) {\n    const { config, parent } = state;\n    if (!config.options['output.format']) {\n        return false;\n    }\n    if (index === 0 && !parent) {\n        // Do not format very first node\n        return false;\n    }\n    // Do not format single child of snippet\n    if (parent && isSnippet(parent) && items.length === 1) {\n        return false;\n    }\n    /**\n     * Adjacent text-only/snippet nodes\n     */\n    if (isSnippet(node)) {\n        // Adjacent text-only/snippet nodes\n        const format = isSnippet(items[index - 1]) || isSnippet(items[index + 1])\n            // Has newlines: looks like wrapping code fragment\n            || node.value.some(hasNewline)\n            // Format as wrapper: contains children which will be outputted as field content\n            || (node.value.some(isField) && node.children.length);\n        if (format) {\n            return true;\n        }\n    }\n    if (isInline(node, config)) {\n        // Check if inline node is the next sibling of block-level node\n        if (index === 0) {\n            // First node in parent: format if it’s followed by a block-level element\n            for (let i = 0; i < items.length; i++) {\n                if (!isInline(items[i], config)) {\n                    return true;\n                }\n            }\n        }\n        else if (!isInline(items[index - 1], config)) {\n            // Node is right after block-level element\n            return true;\n        }\n        if (config.options['output.inlineBreak']) {\n            // check for adjacent inline elements before and after current element\n            let adjacentInline = 1;\n            let before = index;\n            let after = index;\n            while (isInlineElement(items[--before], config)) {\n                adjacentInline++;\n            }\n            while (isInlineElement(items[++after], config)) {\n                adjacentInline++;\n            }\n            if (adjacentInline >= config.options['output.inlineBreak']) {\n                return true;\n            }\n        }\n        // Edge case: inline node contains node that should receive formatting\n        for (let i = 0, il = node.children.length; i < il; i++) {\n            if (shouldFormat(node.children[i], i, node.children, state)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    return true;\n}\n/**\n * Returns indentation offset for given node\n */\nfunction getIndent(state) {\n    const { config, parent } = state;\n    if (!parent || isSnippet(parent) || (parent.name && config.options['output.formatSkip'].includes(parent.name))) {\n        return 0;\n    }\n    return 1;\n}\n/**\n * Check if given node value contains newlines\n */\nfunction hasNewline(value) {\n    return typeof value === 'string' && /\\r|\\n/.test(value);\n}\n/**\n * Check if given node value starts with block-level tag\n */\nfunction startsWithBlockTag(value, config) {\n    if (value.length && typeof value[0] === 'string') {\n        const matches = htmlTagRegex.exec(value[0]);\n        if ((matches === null || matches === void 0 ? void 0 : matches.length) && !config.options['inlineElements'].includes(matches[1].toLowerCase())) {\n            return true;\n        }\n    }\n    return false;\n}\n\nfunction indentFormat(abbr, config, options) {\n    const state = createWalkState(config);\n    state.options = options || {};\n    walk$1(abbr, element$1, state);\n    return state.out.value;\n}\n/**\n * Outputs `node` content to output stream of `state`\n * @param node Context node\n * @param index Index of `node` in `items`\n * @param items List of `node`’s siblings\n * @param state Current walk state\n */\nfunction element$1(node, index, items, state, next) {\n    const { out, options } = state;\n    const { primary, secondary } = collectAttributes(node);\n    // Pick offset level for current node\n    const level = state.parent ? 1 : 0;\n    out.level += level;\n    // Do not indent top-level elements\n    if (shouldFormat$1(node, index, items, state)) {\n        pushNewline(out, true);\n    }\n    if (node.name && (node.name !== 'div' || !primary.length)) {\n        pushString(out, (options.beforeName || '') + node.name + (options.afterName || ''));\n    }\n    pushPrimaryAttributes(primary, state);\n    pushSecondaryAttributes(secondary.filter(shouldOutputAttribute), state);\n    if (node.selfClosing && !node.value && !node.children.length) {\n        if (state.options.selfClose) {\n            pushString(out, state.options.selfClose);\n        }\n    }\n    else {\n        pushValue(node, state);\n        node.children.forEach(next);\n    }\n    out.level -= level;\n}\n/**\n * From given node, collects all attributes as `primary` (id, class) and\n * `secondary` (all the rest) lists. In most indent-based syntaxes, primary attribute\n * has special syntax\n */\nfunction collectAttributes(node) {\n    const primary = [];\n    const secondary = [];\n    if (node.attributes) {\n        for (const attr of node.attributes) {\n            if (isPrimaryAttribute(attr)) {\n                primary.push(attr);\n            }\n            else {\n                secondary.push(attr);\n            }\n        }\n    }\n    return { primary, secondary };\n}\n/**\n * Outputs given attributes as primary into output stream\n */\nfunction pushPrimaryAttributes(attrs, state) {\n    for (const attr of attrs) {\n        if (attr.value) {\n            if (attr.name === 'class') {\n                pushString(state.out, '.');\n                // All whitespace characters must be replaced with dots in class names\n                const tokens = attr.value.map(t => typeof t === 'string' ? t.replace(/\\s+/g, '.') : t);\n                pushTokens(tokens, state);\n            }\n            else {\n                // ID attribute\n                pushString(state.out, '#');\n                pushTokens(attr.value, state);\n            }\n        }\n    }\n}\n/**\n * Outputs given attributes as secondary into output stream\n */\nfunction pushSecondaryAttributes(attrs, state) {\n    if (attrs.length) {\n        const { out, config, options } = state;\n        options.beforeAttribute && pushString(out, options.beforeAttribute);\n        for (let i = 0; i < attrs.length; i++) {\n            const attr = attrs[i];\n            pushString(out, attrName(attr.name || '', config));\n            if (isBooleanAttribute(attr, config) && !attr.value) {\n                if (!config.options['output.compactBoolean'] && options.booleanValue) {\n                    pushString(out, '=' + options.booleanValue);\n                }\n            }\n            else {\n                pushString(out, '=' + attrQuote(attr, config, true));\n                pushTokens(attr.value || caret, state);\n                pushString(out, attrQuote(attr, config));\n            }\n            if (i !== attrs.length - 1 && options.glueAttribute) {\n                pushString(out, options.glueAttribute);\n            }\n        }\n        options.afterAttribute && pushString(out, options.afterAttribute);\n    }\n}\n/**\n * Outputs given node value into state output stream\n */\nfunction pushValue(node, state) {\n    // We should either output value or add caret but for leaf nodes only (no children)\n    if (!node.value && node.children.length) {\n        return;\n    }\n    const value = node.value || caret;\n    const lines = splitByLines$1(value);\n    const { out, options } = state;\n    if (lines.length === 1) {\n        if (node.name || node.attributes) {\n            push(out, ' ');\n        }\n        pushTokens(value, state);\n    }\n    else {\n        // We should format multi-line value with terminating `|` character\n        // and same line length\n        const lineLengths = [];\n        let maxLength = 0;\n        // Calculate lengths of all lines and max line length\n        for (const line of lines) {\n            const len = valueLength(line);\n            lineLengths.push(len);\n            if (len > maxLength) {\n                maxLength = len;\n            }\n        }\n        // Output each line, padded to max length\n        out.level++;\n        for (let i = 0; i < lines.length; i++) {\n            pushNewline(out, true);\n            options.beforeTextLine && push(out, options.beforeTextLine);\n            pushTokens(lines[i], state);\n            if (options.afterTextLine) {\n                push(out, ' '.repeat(maxLength - lineLengths[i]));\n                push(out, options.afterTextLine);\n            }\n        }\n        out.level--;\n    }\n}\nfunction isPrimaryAttribute(attr) {\n    return attr.name === 'class' || attr.name === 'id';\n}\n/**\n * Calculates string length from given tokens\n */\nfunction valueLength(tokens) {\n    let len = 0;\n    for (const token of tokens) {\n        len += typeof token === 'string' ? token.length : token.name.length;\n    }\n    return len;\n}\nfunction shouldFormat$1(node, index, items, state) {\n    // Do not format first top-level element or snippets\n    if (!state.parent && index === 0) {\n        return false;\n    }\n    return !isSnippet(node);\n}\n\nfunction haml(abbr, config) {\n    return indentFormat(abbr, config, {\n        beforeName: '%',\n        beforeAttribute: '(',\n        afterAttribute: ')',\n        glueAttribute: ' ',\n        afterTextLine: ' |',\n        booleanValue: 'true',\n        selfClose: '/'\n    });\n}\n\nfunction slim(abbr, config) {\n    return indentFormat(abbr, config, {\n        beforeAttribute: ' ',\n        glueAttribute: ' ',\n        beforeTextLine: '| ',\n        selfClose: '/'\n    });\n}\n\nfunction pug(abbr, config) {\n    return indentFormat(abbr, config, {\n        beforeAttribute: '(',\n        afterAttribute: ')',\n        glueAttribute: ', ',\n        beforeTextLine: '| ',\n        selfClose: config.options['output.selfClosingStyle'] === 'xml' ? '/' : ''\n    });\n}\n\nconst formatters = { html, haml, slim, pug };\n/**\n * Parses given Emmet abbreviation into a final abbreviation tree with all\n * required transformations applied\n */\nfunction parse(abbr, config) {\n    let oldTextValue;\n    if (typeof abbr === 'string') {\n        let parseOpt = config;\n        if (config.options['jsx.enabled']) {\n            parseOpt = Object.assign(Object.assign({}, parseOpt), { jsx: true });\n        }\n        if (config.options['markup.href']) {\n            parseOpt = Object.assign(Object.assign({}, parseOpt), { href: true });\n        }\n        abbr = parse$2(abbr, parseOpt);\n        // remove text field before snippets(abbr, config) call\n        // as abbreviation(abbr, parseOpt) already handled it\n        oldTextValue = config.text;\n        config.text = undefined;\n    }\n    // Run abbreviation resolve in two passes:\n    // 1. Map each node to snippets, which are abbreviations as well. A single snippet\n    // may produce multiple nodes\n    // 2. Transform every resolved node\n    abbr = resolveSnippets(abbr, config);\n    walk(abbr, transform, config);\n    config.text = oldTextValue !== null && oldTextValue !== void 0 ? oldTextValue : config.text;\n    return abbr;\n}\n/**\n * Converts given abbreviation to string according to provided `config`\n */\nfunction stringify(abbr, config) {\n    const formatter = formatters[config.syntax] || html;\n    return formatter(abbr, config);\n}\n/**\n * Modifies given node and prepares it for output\n */\nfunction transform(node, ancestors, config) {\n    implicitTag(node, ancestors, config);\n    mergeAttributes(node, config);\n    lorem(node, ancestors, config);\n    if (config.syntax === 'xsl') {\n        xsl(node);\n    }\n    if (config.options['jsx.enabled']) {\n        jsx(node);\n    }\n    if (config.options['bem.enabled']) {\n        bem(node, ancestors, config);\n    }\n}\n\nconst reProperty = /^([a-z-]+)(?:\\s*:\\s*([^\\n\\r;]+?);*)?$/;\nconst opt = { value: true };\n/**\n * Creates structure for holding resolved CSS snippet\n */\nfunction createSnippet(key, value) {\n    // A snippet could be a raw text snippet (e.g. arbitrary text string) or a\n    // CSS property with possible values separated by `|`.\n    // In latter case, we have to parse snippet as CSS abbreviation\n    const m = value.match(reProperty);\n    if (m) {\n        const keywords = {};\n        const parsed = m[2] ? m[2].split('|').map(parseValue) : [];\n        for (const item of parsed) {\n            for (const cssVal of item) {\n                collectKeywords(cssVal, keywords);\n            }\n        }\n        return {\n            type: \"Property\" /* Property */,\n            key,\n            property: m[1],\n            value: parsed,\n            keywords,\n            dependencies: []\n        };\n    }\n    return { type: \"Raw\" /* Raw */, key, value };\n}\n/**\n * Nests more specific CSS properties into shorthand ones, e.g.\n * `background-position-x` -> `background-position` -> `background`\n */\nfunction nest(snippets) {\n    snippets = snippets.slice().sort(snippetsSort);\n    const stack = [];\n    let prev;\n    // For sorted list of CSS properties, create dependency graph where each\n    // shorthand property contains its more specific one, e.g.\n    // background -> background-position -> background-position-x\n    for (const cur of snippets.filter(isProperty)) {\n        // Check if current property belongs to one from parent stack.\n        // Since `snippets` array is sorted, items are perfectly aligned\n        // from shorthands to more specific variants\n        while (stack.length) {\n            prev = stack[stack.length - 1];\n            if (cur.property.startsWith(prev.property)\n                && cur.property.charCodeAt(prev.property.length) === 45 /* - */) {\n                prev.dependencies.push(cur);\n                stack.push(cur);\n                break;\n            }\n            stack.pop();\n        }\n        if (!stack.length) {\n            stack.push(cur);\n        }\n    }\n    return snippets;\n}\n/**\n * A sorting function for array of snippets\n */\nfunction snippetsSort(a, b) {\n    if (a.key === b.key) {\n        return 0;\n    }\n    return a.key < b.key ? -1 : 1;\n}\nfunction parseValue(value) {\n    return parse$3(value.trim(), opt)[0].value;\n}\nfunction isProperty(snippet) {\n    return snippet.type === \"Property\" /* Property */;\n}\nfunction collectKeywords(cssVal, dest) {\n    for (const v of cssVal.value) {\n        if (v.type === 'Literal') {\n            dest[v.value] = v;\n        }\n        else if (v.type === 'FunctionCall') {\n            dest[v.name] = v;\n        }\n        else if (v.type === 'Field') {\n            // Create literal from field, if available\n            const value = v.name.trim();\n            if (value) {\n                dest[value] = { type: 'Literal', value };\n            }\n        }\n    }\n}\n\n/**\n * Calculates how close `str1` matches `str2` using fuzzy match.\n * How matching works:\n * – first characters of both `str1` and `str2` *must* match\n * – `str1` length larger than `str2` length is allowed only when `unmatched` is true\n * – ideal match is when `str1` equals to `str2` (score: 1)\n * – next best match is `str2` starts with `str1` (score: 1 × percent of matched characters)\n * – other scores depend on how close characters of `str1` to the beginning of `str2`\n * @param partialMatch Allow length `str1` to be greater than `str2` length\n */\nfunction scoreMatch(str1, str2, partialMatch = false) {\n    str1 = str1.toLowerCase();\n    str2 = str2.toLowerCase();\n    if (str1 === str2) {\n        return 1;\n    }\n    // Both strings MUST start with the same character\n    if (!str1 || !str2 || str1.charCodeAt(0) !== str2.charCodeAt(0)) {\n        return 0;\n    }\n    const str1Len = str1.length;\n    const str2Len = str2.length;\n    if (!partialMatch && str1Len > str2Len) {\n        return 0;\n    }\n    // Characters from `str1` which are closer to the beginning of a `str2` should\n    // have higher score.\n    // For example, if `str2` is `abcde`, it’s max score is:\n    // 5 + 4 + 3 + 2 + 1 = 15 (sum of character positions in reverse order)\n    // Matching `abd` against `abcde` should produce:\n    // 5 + 4 + 2 = 11\n    // Acronym bonus for match right after `-`. Matching `abd` against `abc-de`\n    // should produce:\n    // 6 + 5 + 4 (use `d` position in `abd`, not in abc-de`)\n    const minLength = Math.min(str1Len, str2Len);\n    const maxLength = Math.max(str1Len, str2Len);\n    let i = 1;\n    let j = 1;\n    let score = maxLength;\n    let ch1 = 0;\n    let ch2 = 0;\n    let found = false;\n    let acronym = false;\n    while (i < str1Len) {\n        ch1 = str1.charCodeAt(i);\n        found = false;\n        acronym = false;\n        while (j < str2Len) {\n            ch2 = str2.charCodeAt(j);\n            if (ch1 === ch2) {\n                found = true;\n                score += maxLength - (acronym ? i : j);\n                break;\n            }\n            // add acronym bonus for exactly next match after unmatched `-`\n            acronym = ch2 === 45 /* - */;\n            j++;\n        }\n        if (!found) {\n            if (!partialMatch) {\n                return 0;\n            }\n            break;\n        }\n        i++;\n    }\n    const matchRatio = i / maxLength;\n    const delta = maxLength - minLength;\n    const maxScore = sum(maxLength) - sum(delta);\n    return (score * matchRatio) / maxScore;\n}\n/**\n * Calculates sum of first `n` numbers, e.g. 1+2+3+...n\n */\nfunction sum(n) {\n    return n * (n + 1) / 2;\n}\n\nfunction color(token, shortHex) {\n    if (!token.r && !token.g && !token.b && !token.a) {\n        return 'transparent';\n    }\n    else if (token.a === 1) {\n        return asHex(token, shortHex);\n    }\n    return asRGB(token);\n}\n/**\n * Output given color as hex value\n * @param short Produce short value (e.g. #fff instead of #ffffff), if possible\n */\nfunction asHex(token, short) {\n    const fn = (short && isShortHex(token.r) && isShortHex(token.g) && isShortHex(token.b))\n        ? toShortHex : toHex;\n    return '#' + fn(token.r) + fn(token.g) + fn(token.b);\n}\n/**\n * Output current color as `rgba?(...)` CSS color\n */\nfunction asRGB(token) {\n    const values = [token.r, token.g, token.b];\n    if (token.a !== 1) {\n        values.push(frac(token.a, 8));\n    }\n    return `${values.length === 3 ? 'rgb' : 'rgba'}(${values.join(', ')})`;\n}\nfunction frac(num, digits = 4) {\n    return num.toFixed(digits).replace(/\\.?0+$/, '');\n}\nfunction isShortHex(hex) {\n    return !(hex % 17);\n}\nfunction toShortHex(num) {\n    return (num >> 4).toString(16);\n}\nfunction toHex(num) {\n    return pad(num.toString(16), 2);\n}\nfunction pad(value, len) {\n    while (value.length < len) {\n        value = '0' + value;\n    }\n    return value;\n}\n\nfunction css(abbr, config) {\n    var _a;\n    const out = createOutputStream(config.options);\n    const format = config.options['output.format'];\n    if (((_a = config.context) === null || _a === void 0 ? void 0 : _a.name) === \"@@section\" /* Section */) {\n        // For section context, filter out unmatched snippets\n        abbr = abbr.filter(node => node.snippet);\n    }\n    for (let i = 0; i < abbr.length; i++) {\n        if (format && i !== 0) {\n            pushNewline(out, true);\n        }\n        property(abbr[i], out, config);\n    }\n    return out.value;\n}\n/**\n * Outputs given abbreviation node into output stream\n */\nfunction property(node, out, config) {\n    const isJSON = config.options['stylesheet.json'];\n    if (node.name) {\n        // It’s a CSS property\n        const name = isJSON ? toCamelCase(node.name) : node.name;\n        pushString(out, name + config.options['stylesheet.between']);\n        if (node.value.length) {\n            propertyValue(node, out, config);\n        }\n        else {\n            pushField(out, 0, '');\n        }\n        if (isJSON) {\n            // For CSS-in-JS, always finalize property with comma\n            // NB: seems like `important` is not available in CSS-in-JS syntaxes\n            push(out, ',');\n        }\n        else {\n            outputImportant(node, out, true);\n            push(out, config.options['stylesheet.after']);\n        }\n    }\n    else {\n        // It’s a regular snippet, output plain tokens without any additional formatting\n        for (const cssVal of node.value) {\n            for (const v of cssVal.value) {\n                outputToken(v, out, config);\n            }\n        }\n        outputImportant(node, out, node.value.length > 0);\n    }\n}\nfunction propertyValue(node, out, config) {\n    const isJSON = config.options['stylesheet.json'];\n    const num = isJSON ? getSingleNumeric(node) : null;\n    if (num && (!num.unit || num.unit === 'px')) {\n        // For CSS-in-JS, if property contains single numeric value, output it\n        // as JS number\n        push(out, String(num.value));\n    }\n    else {\n        const quote = getQuote(config);\n        isJSON && push(out, quote);\n        for (let i = 0; i < node.value.length; i++) {\n            if (i !== 0) {\n                push(out, ', ');\n            }\n            outputValue(node.value[i], out, config);\n        }\n        isJSON && push(out, quote);\n    }\n}\nfunction outputImportant(node, out, separator) {\n    if (node.important) {\n        if (separator) {\n            push(out, ' ');\n        }\n        push(out, '!important');\n    }\n}\nfunction outputValue(value, out, config) {\n    for (let i = 0, prevEnd = -1; i < value.value.length; i++) {\n        const token = value.value[i];\n        // Handle edge case: a field is written close to previous token like this: `foo${bar}`.\n        // We should not add delimiter here\n        if (i !== 0 && (token.type !== 'Field' || token.start !== prevEnd)) {\n            push(out, ' ');\n        }\n        outputToken(token, out, config);\n        prevEnd = token['end'];\n    }\n}\nfunction outputToken(token, out, config) {\n    if (token.type === 'ColorValue') {\n        push(out, color(token, config.options['stylesheet.shortHex']));\n    }\n    else if (token.type === 'Literal') {\n        pushString(out, token.value);\n    }\n    else if (token.type === 'NumberValue') {\n        pushString(out, frac(token.value, 4) + token.unit);\n    }\n    else if (token.type === 'StringValue') {\n        const quote = token.quote === 'double' ? '\"' : '\\'';\n        pushString(out, quote + token.value + quote);\n    }\n    else if (token.type === 'Field') {\n        pushField(out, token.index, token.name);\n    }\n    else if (token.type === 'FunctionCall') {\n        push(out, token.name + '(');\n        for (let i = 0; i < token.arguments.length; i++) {\n            if (i) {\n                push(out, ', ');\n            }\n            outputValue(token.arguments[i], out, config);\n        }\n        push(out, ')');\n    }\n}\n/**\n * If value of given property is a single numeric value, returns this token\n */\nfunction getSingleNumeric(node) {\n    if (node.value.length === 1) {\n        const cssVal = node.value[0];\n        if (cssVal.value.length === 1 && cssVal.value[0].type === 'NumberValue') {\n            return cssVal.value[0];\n        }\n    }\n}\n/**\n * Converts kebab-case string to camelCase\n */\nfunction toCamelCase(str) {\n    return str.replace(/\\-(\\w)/g, (_, letter) => letter.toUpperCase());\n}\nfunction getQuote(config) {\n    return config.options['stylesheet.jsonDoubleQuotes'] ? '\"' : '\\'';\n}\n\nconst gradientName = 'lg';\n/**\n * Parses given Emmet abbreviation into a final abbreviation tree with all\n * required transformations applied\n */\nfunction parse$1(abbr, config) {\n    var _a;\n    const snippets = ((_a = config.cache) === null || _a === void 0 ? void 0 : _a.stylesheetSnippets) || convertSnippets(config.snippets);\n    if (config.cache) {\n        config.cache.stylesheetSnippets = snippets;\n    }\n    if (typeof abbr === 'string') {\n        abbr = parse$3(abbr, { value: isValueScope(config) });\n    }\n    const filteredSnippets = getSnippetsForScope(snippets, config);\n    for (const node of abbr) {\n        resolveNode(node, filteredSnippets, config);\n    }\n    return abbr;\n}\n/**\n * Converts given raw snippets into internal snippets representation\n */\nfunction convertSnippets(snippets) {\n    const result = [];\n    for (const key of Object.keys(snippets)) {\n        result.push(createSnippet(key, snippets[key]));\n    }\n    return nest(result);\n}\n/**\n * Resolves given node: finds matched CSS snippets using fuzzy match and resolves\n * keyword aliases from node value\n */\nfunction resolveNode(node, snippets, config) {\n    if (!resolveGradient(node, config)) {\n        const score = config.options['stylesheet.fuzzySearchMinScore'];\n        if (isValueScope(config)) {\n            // Resolve as value of given CSS property\n            const propName = config.context.name;\n            const snippet = snippets.find(s => s.type === \"Property\" /* Property */ && s.property === propName);\n            resolveValueKeywords(node, config, snippet, score);\n            node.snippet = snippet;\n        }\n        else if (node.name) {\n            const snippet = findBestMatch(node.name, snippets, score, true);\n            node.snippet = snippet;\n            if (snippet) {\n                if (snippet.type === \"Property\" /* Property */) {\n                    resolveAsProperty(node, snippet, config);\n                }\n                else {\n                    resolveAsSnippet(node, snippet);\n                }\n            }\n        }\n    }\n    if (node.name || config.context) {\n        // Resolve numeric values for CSS properties only\n        resolveNumericValue(node, config);\n    }\n    return node;\n}\n/**\n * Resolves CSS gradient shortcut from given property, if possible\n */\nfunction resolveGradient(node, config) {\n    let gradientFn = null;\n    const cssVal = node.value.length === 1 ? node.value[0] : null;\n    if (cssVal && cssVal.value.length === 1) {\n        const v = cssVal.value[0];\n        if (v.type === 'FunctionCall' && v.name === gradientName) {\n            gradientFn = v;\n        }\n    }\n    if (gradientFn || node.name === gradientName) {\n        if (!gradientFn) {\n            gradientFn = {\n                type: 'FunctionCall',\n                name: 'linear-gradient',\n                arguments: [cssValue(field(0, ''))]\n            };\n        }\n        else {\n            gradientFn = Object.assign(Object.assign({}, gradientFn), { name: 'linear-gradient' });\n        }\n        if (!config.context) {\n            node.name = 'background-image';\n        }\n        node.value = [cssValue(gradientFn)];\n        return true;\n    }\n    return false;\n}\n/**\n * Resolves given parsed abbreviation node as CSS property\n */\nfunction resolveAsProperty(node, snippet, config) {\n    const abbr = node.name;\n    // Check for unmatched part of abbreviation\n    // For example, in `dib` abbreviation the matched part is `d` and `ib` should\n    // be considered as inline value. If unmatched fragment exists, we should check\n    // if it matches actual value of snippet. If either explicit value is specified\n    // or unmatched fragment did not resolve to to a keyword, we should consider\n    // matched snippet as invalid\n    const inlineValue = getUnmatchedPart(abbr, snippet.key);\n    if (inlineValue) {\n        if (node.value.length) {\n            // Already have value: unmatched part indicates matched snippet is invalid\n            return node;\n        }\n        const kw = resolveKeyword(inlineValue, config, snippet);\n        if (!kw) {\n            return node;\n        }\n        node.value.push(cssValue(kw));\n    }\n    node.name = snippet.property;\n    if (node.value.length) {\n        // Replace keyword alias from current abbreviation node with matched keyword\n        resolveValueKeywords(node, config, snippet);\n    }\n    else if (snippet.value.length) {\n        const defaultValue = snippet.value[0];\n        // https://github.com/emmetio/emmet/issues/558\n        // We should auto-select inserted value only if there’s multiple value\n        // choice\n        node.value = snippet.value.length === 1 || defaultValue.some(hasField)\n            ? defaultValue\n            : defaultValue.map(n => wrapWithField(n, config));\n    }\n    return node;\n}\nfunction resolveValueKeywords(node, config, snippet, minScore) {\n    for (const cssVal of node.value) {\n        const value = [];\n        for (const token of cssVal.value) {\n            if (token.type === 'Literal') {\n                value.push(resolveKeyword(token.value, config, snippet, minScore) || token);\n            }\n            else if (token.type === 'FunctionCall') {\n                // For function calls, we should find matching function call\n                // and merge arguments\n                const match = resolveKeyword(token.name, config, snippet, minScore);\n                if (match && match.type === 'FunctionCall') {\n                    value.push(Object.assign(Object.assign({}, match), { arguments: token.arguments.concat(match.arguments.slice(token.arguments.length)) }));\n                }\n                else {\n                    value.push(token);\n                }\n            }\n            else {\n                value.push(token);\n            }\n        }\n        cssVal.value = value;\n    }\n}\n/**\n * Resolves given parsed abbreviation node as a snippet: a plain code chunk\n */\nfunction resolveAsSnippet(node, snippet) {\n    // When resolving snippets, we have to do the following:\n    // 1. Replace field placeholders with actual field tokens.\n    // 2. If input values given, put them instead of fields\n    let offset = 0;\n    let m;\n    const reField = /\\$\\{(\\d+)(:[^}]+)?\\}/g;\n    const inputValue = node.value[0];\n    const outputValue = [];\n    while (m = reField.exec(snippet.value)) {\n        if (offset !== m.index) {\n            outputValue.push(literal(snippet.value.slice(offset, m.index)));\n        }\n        offset = m.index + m[0].length;\n        if (inputValue && inputValue.value.length) {\n            outputValue.push(inputValue.value.shift());\n        }\n        else {\n            outputValue.push(field(Number(m[1]), m[2] ? m[2].slice(1) : ''));\n        }\n    }\n    const tail = snippet.value.slice(offset);\n    if (tail) {\n        outputValue.push(literal(tail));\n    }\n    node.name = void 0;\n    node.value = [cssValue(...outputValue)];\n    return node;\n}\n/**\n * Finds best matching item from `items` array\n * @param abbr  Abbreviation to match\n * @param items List of items for match\n * @param minScore The minimum score the best matched item should have to be a valid match.\n */\nfunction findBestMatch(abbr, items, minScore = 0, partialMatch = false) {\n    let matchedItem = null;\n    let maxScore = 0;\n    for (const item of items) {\n        const score = scoreMatch(abbr, getScoringPart(item), partialMatch);\n        if (score === 1) {\n            // direct hit, no need to look further\n            return item;\n        }\n        if (score && score >= maxScore) {\n            maxScore = score;\n            matchedItem = item;\n        }\n    }\n    return maxScore >= minScore ? matchedItem : null;\n}\nfunction getScoringPart(item) {\n    return typeof item === 'string' ? item : item.key;\n}\n/**\n * Returns a part of `abbr` that wasn’t directly matched against `str`.\n * For example, if abbreviation `poas` is matched against `position`,\n * the unmatched part will be `as` since `a` wasn’t found in string stream\n */\nfunction getUnmatchedPart(abbr, str) {\n    for (let i = 0, lastPos = 0; i < abbr.length; i++) {\n        lastPos = str.indexOf(abbr[i], lastPos);\n        if (lastPos === -1) {\n            return abbr.slice(i);\n        }\n        lastPos++;\n    }\n    return '';\n}\n/**\n * Resolves given keyword shorthand into matched snippet keyword or global keyword,\n * if possible\n */\nfunction resolveKeyword(kw, config, snippet, minScore) {\n    let ref;\n    if (snippet) {\n        if (ref = findBestMatch(kw, Object.keys(snippet.keywords), minScore)) {\n            return snippet.keywords[ref];\n        }\n        for (const dep of snippet.dependencies) {\n            if (ref = findBestMatch(kw, Object.keys(dep.keywords), minScore)) {\n                return dep.keywords[ref];\n            }\n        }\n    }\n    if (ref = findBestMatch(kw, config.options['stylesheet.keywords'], minScore)) {\n        return literal(ref);\n    }\n    return null;\n}\n/**\n * Resolves numeric values in given abbreviation node\n */\nfunction resolveNumericValue(node, config) {\n    const aliases = config.options['stylesheet.unitAliases'];\n    const unitless = config.options['stylesheet.unitless'];\n    for (const v of node.value) {\n        for (const t of v.value) {\n            if (t.type === 'NumberValue') {\n                if (t.unit) {\n                    t.unit = aliases[t.unit] || t.unit;\n                }\n                else if (t.value !== 0 && !unitless.includes(node.name)) {\n                    t.unit = t.rawValue.includes('.')\n                        ? config.options['stylesheet.floatUnit']\n                        : config.options['stylesheet.intUnit'];\n                }\n            }\n        }\n    }\n}\n/**\n * Constructs CSS value token\n */\nfunction cssValue(...args) {\n    return {\n        type: 'CSSValue',\n        value: args\n    };\n}\n/**\n * Constructs literal token\n */\nfunction literal(value) {\n    return { type: 'Literal', value };\n}\n/**\n * Constructs field token\n */\nfunction field(index, name) {\n    return { type: 'Field', index, name };\n}\n/**\n * Check if given value contains fields\n */\nfunction hasField(value) {\n    for (const v of value.value) {\n        if (v.type === 'Field' || (v.type === 'FunctionCall' && v.arguments.some(hasField))) {\n            return true;\n        }\n    }\n    return false;\n}\n/**\n * Wraps tokens of given abbreviation with fields\n */\nfunction wrapWithField(node, config, state = { index: 1 }) {\n    let value = [];\n    for (const v of node.value) {\n        switch (v.type) {\n            case 'ColorValue':\n                value.push(field(state.index++, color(v, config.options['stylesheet.shortHex'])));\n                break;\n            case 'Literal':\n                value.push(field(state.index++, v.value));\n                break;\n            case 'NumberValue':\n                value.push(field(state.index++, `${v.value}${v.unit}`));\n                break;\n            case 'StringValue':\n                const q = v.quote === 'single' ? '\\'' : '\"';\n                value.push(field(state.index++, q + v.value + q));\n                break;\n            case 'FunctionCall':\n                value.push(field(state.index++, v.name), literal('('));\n                for (let i = 0, il = v.arguments.length; i < il; i++) {\n                    value = value.concat(wrapWithField(v.arguments[i], config, state).value);\n                    if (i !== il - 1) {\n                        value.push(literal(', '));\n                    }\n                }\n                value.push(literal(')'));\n                break;\n            default:\n                value.push(v);\n        }\n    }\n    return Object.assign(Object.assign({}, node), { value });\n}\n/**\n * Check if abbreviation should be expanded in CSS value context\n */\nfunction isValueScope(config) {\n    if (config.context) {\n        return config.context.name === \"@@value\" /* Value */ || !config.context.name.startsWith('@@');\n    }\n    return false;\n}\n/**\n * Returns snippets for given scope\n */\nfunction getSnippetsForScope(snippets, config) {\n    if (config.context) {\n        if (config.context.name === \"@@section\" /* Section */) {\n            return snippets.filter(s => s.type === \"Raw\" /* Raw */);\n        }\n        if (config.context.name === \"@@property\" /* Property */) {\n            return snippets.filter(s => s.type === \"Property\" /* Property */);\n        }\n    }\n    return snippets;\n}\n\nvar markupSnippets = {\n\t\"a\": \"a[href]\",\n\t\"a:blank\": \"a[href='http://${0}' target='_blank' rel='noopener noreferrer']\",\n\t\"a:link\": \"a[href='http://${0}']\",\n\t\"a:mail\": \"a[href='mailto:${0}']\",\n\t\"a:tel\": \"a[href='tel:+${0}']\",\n\t\"abbr\": \"abbr[title]\",\n\t\"acr|acronym\": \"acronym[title]\",\n\t\"base\": \"base[href]/\",\n\t\"basefont\": \"basefont/\",\n\t\"br\": \"br/\",\n\t\"frame\": \"frame/\",\n\t\"hr\": \"hr/\",\n\t\"bdo\": \"bdo[dir]\",\n\t\"bdo:r\": \"bdo[dir=rtl]\",\n\t\"bdo:l\": \"bdo[dir=ltr]\",\n\t\"col\": \"col/\",\n\t\"link\": \"link[rel=stylesheet href]/\",\n\t\"link:css\": \"link[href='${1:style}.css']\",\n\t\"link:print\": \"link[href='${1:print}.css' media=print]\",\n\t\"link:favicon\": \"link[rel='shortcut icon' type=image/x-icon href='${1:favicon.ico}']\",\n\t\"link:mf|link:manifest\": \"link[rel='manifest' href='${1:manifest.json}']\",\n\t\"link:touch\": \"link[rel=apple-touch-icon href='${1:favicon.png}']\",\n\t\"link:rss\": \"link[rel=alternate type=application/rss+xml title=RSS href='${1:rss.xml}']\",\n\t\"link:atom\": \"link[rel=alternate type=application/atom+xml title=Atom href='${1:atom.xml}']\",\n\t\"link:im|link:import\": \"link[rel=import href='${1:component}.html']\",\n\t\"meta\": \"meta/\",\n\t\"meta:utf\": \"meta[http-equiv=Content-Type content='text/html;charset=UTF-8']\",\n\t\"meta:vp\": \"meta[name=viewport content='width=${1:device-width}, initial-scale=${2:1.0}']\",\n\t\"meta:compat\": \"meta[http-equiv=X-UA-Compatible content='${1:IE=7}']\",\n\t\"meta:edge\": \"meta:compat[content='${1:ie=edge}']\",\n\t\"meta:redirect\": \"meta[http-equiv=refresh content='0; url=${1:http://example.com}']\",\n\t\"meta:kw\": \"meta[name=keywords content]\",\n\t\"meta:desc\": \"meta[name=description content]\",\n\t\"style\": \"style\",\n\t\"script\": \"script\",\n\t\"script:src\": \"script[src]\",\n\t\"img\": \"img[src alt]/\",\n\t\"img:s|img:srcset\": \"img[srcset src alt]\",\n\t\"img:z|img:sizes\": \"img[sizes srcset src alt]\",\n\t\"picture\": \"picture\",\n\t\"src|source\": \"source/\",\n\t\"src:sc|source:src\": \"source[src type]\",\n\t\"src:s|source:srcset\": \"source[srcset]\",\n\t\"src:t|source:type\": \"source[srcset type='${1:image/}']\",\n\t\"src:z|source:sizes\": \"source[sizes srcset]\",\n\t\"src:m|source:media\": \"source[media='(${1:min-width: })' srcset]\",\n\t\"src:mt|source:media:type\": \"source:media[type='${2:image/}']\",\n\t\"src:mz|source:media:sizes\": \"source:media[sizes srcset]\",\n\t\"src:zt|source:sizes:type\": \"source[sizes srcset type='${1:image/}']\",\n\t\"iframe\": \"iframe[src frameborder=0]\",\n\t\"embed\": \"embed[src type]/\",\n\t\"object\": \"object[data type]\",\n\t\"param\": \"param[name value]/\",\n\t\"map\": \"map[name]\",\n\t\"area\": \"area[shape coords href alt]/\",\n\t\"area:d\": \"area[shape=default]\",\n\t\"area:c\": \"area[shape=circle]\",\n\t\"area:r\": \"area[shape=rect]\",\n\t\"area:p\": \"area[shape=poly]\",\n\t\"form\": \"form[action]\",\n\t\"form:get\": \"form[method=get]\",\n\t\"form:post\": \"form[method=post]\",\n\t\"label\": \"label[for]\",\n\t\"input\": \"input[type=${1:text}]/\",\n\t\"inp\": \"input[name=${1} id=${1}]\",\n\t\"input:h|input:hidden\": \"input[type=hidden name]\",\n\t\"input:t|input:text\": \"inp[type=text]\",\n\t\"input:search\": \"inp[type=search]\",\n\t\"input:email\": \"inp[type=email]\",\n\t\"input:url\": \"inp[type=url]\",\n\t\"input:p|input:password\": \"inp[type=password]\",\n\t\"input:datetime\": \"inp[type=datetime]\",\n\t\"input:date\": \"inp[type=date]\",\n\t\"input:datetime-local\": \"inp[type=datetime-local]\",\n\t\"input:month\": \"inp[type=month]\",\n\t\"input:week\": \"inp[type=week]\",\n\t\"input:time\": \"inp[type=time]\",\n\t\"input:tel\": \"inp[type=tel]\",\n\t\"input:number\": \"inp[type=number]\",\n\t\"input:color\": \"inp[type=color]\",\n\t\"input:c|input:checkbox\": \"inp[type=checkbox]\",\n\t\"input:r|input:radio\": \"inp[type=radio]\",\n\t\"input:range\": \"inp[type=range]\",\n\t\"input:f|input:file\": \"inp[type=file]\",\n\t\"input:s|input:submit\": \"input[type=submit value]\",\n\t\"input:i|input:image\": \"input[type=image src alt]\",\n\t\"input:b|input:btn|input:button\": \"input[type=button value]\",\n\t\"input:reset\": \"input:button[type=reset]\",\n\t\"isindex\": \"isindex/\",\n\t\"select\": \"select[name=${1} id=${1}]\",\n\t\"select:d|select:disabled\": \"select[disabled.]\",\n\t\"opt|option\": \"option[value]\",\n\t\"textarea\": \"textarea[name=${1} id=${1} cols=${2:30} rows=${3:10}]\",\n\t\"marquee\": \"marquee[behavior direction]\",\n\t\"menu:c|menu:context\": \"menu[type=context]\",\n\t\"menu:t|menu:toolbar\": \"menu[type=toolbar]\",\n\t\"video\": \"video[src]\",\n\t\"audio\": \"audio[src]\",\n\t\"html:xml\": \"html[xmlns=http://www.w3.org/1999/xhtml]\",\n\t\"keygen\": \"keygen/\",\n\t\"command\": \"command/\",\n\t\"btn:s|button:s|button:submit\" : \"button[type=submit]\",\n\t\"btn:r|button:r|button:reset\" : \"button[type=reset]\",\n\t\"btn:d|button:d|button:disabled\" : \"button[disabled.]\",\n\t\"fst:d|fset:d|fieldset:d|fieldset:disabled\" : \"fieldset[disabled.]\",\n\n\t\"bq\": \"blockquote\",\n\t\"fig\": \"figure\",\n\t\"figc\": \"figcaption\",\n\t\"pic\": \"picture\",\n\t\"ifr\": \"iframe\",\n\t\"emb\": \"embed\",\n\t\"obj\": \"object\",\n\t\"cap\": \"caption\",\n\t\"colg\": \"colgroup\",\n\t\"fst\": \"fieldset\",\n\t\"btn\": \"button\",\n\t\"optg\": \"optgroup\",\n\t\"tarea\": \"textarea\",\n\t\"leg\": \"legend\",\n\t\"sect\": \"section\",\n\t\"art\": \"article\",\n\t\"hdr\": \"header\",\n\t\"ftr\": \"footer\",\n\t\"adr\": \"address\",\n\t\"dlg\": \"dialog\",\n\t\"str\": \"strong\",\n\t\"prog\": \"progress\",\n\t\"mn\": \"main\",\n\t\"tem\": \"template\",\n\t\"fset\": \"fieldset\",\n\t\"datag\": \"datagrid\",\n\t\"datal\": \"datalist\",\n\t\"kg\": \"keygen\",\n\t\"out\": \"output\",\n\t\"det\": \"details\",\n\t\"sum\": \"summary\",\n\t\"cmd\": \"command\",\n\n\t\"ri:d|ri:dpr\": \"img:s\",\n\t\"ri:v|ri:viewport\": \"img:z\",\n\t\"ri:a|ri:art\": \"pic>src:m+img\",\n\t\"ri:t|ri:type\": \"pic>src:t+img\",\n\n\t\"!!!\": \"{<!DOCTYPE html>}\",\n\t\"doc\": \"html[lang=${lang}]>(head>meta[charset=${charset}]+meta[http-equiv='X-UA-Compatible'][content='IE=edge']+meta:vp+title{${1:Document}})+body\",\n\t\"!|html:5\": \"!!!+doc\",\n\n\t\"c\": \"{<!-- ${0} -->}\",\n\t\"cc:ie\": \"{<!--[if IE]>${0}<![endif]-->}\",\n\t\"cc:noie\": \"{<!--[if !IE]><!-->${0}<!--<![endif]-->}\"\n};\n\nvar stylesheetSnippets = {\n\t\"@f\": \"@font-face {\\n\\tfont-family: ${1};\\n\\tsrc: url(${2});\\n}\",\n\t\"@ff\": \"@font-face {\\n\\tfont-family: '${1:FontName}';\\n\\tsrc: url('${2:FileName}.eot');\\n\\tsrc: url('${2:FileName}.eot?#iefix') format('embedded-opentype'),\\n\\t\\t url('${2:FileName}.woff') format('woff'),\\n\\t\\t url('${2:FileName}.ttf') format('truetype'),\\n\\t\\t url('${2:FileName}.svg#${1:FontName}') format('svg');\\n\\tfont-style: ${3:normal};\\n\\tfont-weight: ${4:normal};\\n}\",\n\t\"@i|@import\": \"@import url(${0});\",\n\t\"@kf\": \"@keyframes ${1:identifier} {\\n\\t${2}\\n}\",\n\t\"@m|@media\": \"@media ${1:screen} {\\n\\t${0}\\n}\",\n\t\"ac\": \"align-content:start|end|flex-start|flex-end|center|space-between|space-around|stretch|space-evenly\",\n\t\"ai\": \"align-items:start|end|flex-start|flex-end|center|baseline|stretch\",\n\t\"anim\": \"animation:${1:name} ${2:duration} ${3:timing-function} ${4:delay} ${5:iteration-count} ${6:direction} ${7:fill-mode}\",\n\t\"animdel\": \"animation-delay:time\",\n\t\"animdir\": \"animation-direction:normal|reverse|alternate|alternate-reverse\",\n\t\"animdur\": \"animation-duration:${1:0}s\",\n\t\"animfm\": \"animation-fill-mode:both|forwards|backwards\",\n\t\"animic\": \"animation-iteration-count:1|infinite\",\n\t\"animn\": \"animation-name\",\n\t\"animps\": \"animation-play-state:running|paused\",\n\t\"animtf\": \"animation-timing-function:linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(${1:0.1}, ${2:0.7}, ${3:1.0}, ${3:0.1})\",\n\t\"ap\": \"appearance:none\",\n\t\"as\": \"align-self:start|end|auto|flex-start|flex-end|center|baseline|stretch\",\n\t\"b\": \"bottom\",\n\t\"bd\": \"border:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdb\": \"border-bottom:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdbc\": \"border-bottom-color:${1:#000}\",\n\t\"bdbi\": \"border-bottom-image:url(${0})\",\n\t\"bdbk\": \"border-break:close\",\n\t\"bdbli\": \"border-bottom-left-image:url(${0})|continue\",\n\t\"bdblrs\": \"border-bottom-left-radius\",\n\t\"bdbri\": \"border-bottom-right-image:url(${0})|continue\",\n\t\"bdbrrs\": \"border-bottom-right-radius\",\n\t\"bdbs\": \"border-bottom-style\",\n\t\"bdbw\": \"border-bottom-width\",\n\t\"bdc\": \"border-color:${1:#000}\",\n\t\"bdci\": \"border-corner-image:url(${0})|continue\",\n\t\"bdcl\": \"border-collapse:collapse|separate\",\n\t\"bdf\": \"border-fit:repeat|clip|scale|stretch|overwrite|overflow|space\",\n\t\"bdi\": \"border-image:url(${0})\",\n\t\"bdl\": \"border-left:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdlc\": \"border-left-color:${1:#000}\",\n\t\"bdlen\": \"border-length\",\n\t\"bdli\": \"border-left-image:url(${0})\",\n\t\"bdls\": \"border-left-style\",\n\t\"bdlw\": \"border-left-width\",\n\t\"bdr\": \"border-right:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdrc\": \"border-right-color:${1:#000}\",\n\t\"bdri\": \"border-right-image:url(${0})\",\n\t\"bdrs\": \"border-radius\",\n\t\"bdrst\": \"border-right-style\",\n\t\"bdrw\": \"border-right-width\",\n\t\"bds\": \"border-style:none|hidden|dotted|dashed|solid|double|dot-dash|dot-dot-dash|wave|groove|ridge|inset|outset\",\n\t\"bdsp\": \"border-spacing\",\n\t\"bdt\": \"border-top:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdtc\": \"border-top-color:${1:#000}\",\n\t\"bdti\": \"border-top-image:url(${0})\",\n\t\"bdtli\": \"border-top-left-image:url(${0})|continue\",\n\t\"bdtlrs\": \"border-top-left-radius\",\n\t\"bdtri\": \"border-top-right-image:url(${0})|continue\",\n\t\"bdtrrs\": \"border-top-right-radius\",\n\t\"bdts\": \"border-top-style\",\n\t\"bdtw\": \"border-top-width\",\n\t\"bdw\": \"border-width\",\n\t\"bfv\": \"backface-visibility:hidden|visible\",\n\t\"bg\": \"background:${1:#000}\",\n\t\"bga\": \"background-attachment:fixed|scroll\",\n\t\"bgbk\": \"background-break:bounding-box|each-box|continuous\",\n\t\"bgc\": \"background-color:#${1:fff}\",\n\t\"bgcp\": \"background-clip:padding-box|border-box|content-box|no-clip\",\n\t\"bgi\": \"background-image:url(${0})\",\n\t\"bgo\": \"background-origin:padding-box|border-box|content-box\",\n\t\"bgp\": \"background-position:${1:0} ${2:0}\",\n\t\"bgpx\": \"background-position-x\",\n\t\"bgpy\": \"background-position-y\",\n\t\"bgr\": \"background-repeat:no-repeat|repeat-x|repeat-y|space|round\",\n\t\"bgsz\": \"background-size:contain|cover\",\n\t\"bxsh\": \"box-shadow:${1:inset }${2:hoff} ${3:voff} ${4:blur} ${5:#000}|none\",\n\t\"bxsz\": \"box-sizing:border-box|content-box|border-box\",\n\t\"c\": \"color:${1:#000}\",\n\t\"cr\": \"color:rgb(${1:0}, ${2:0}, ${3:0})\",\n\t\"cra\": \"color:rgba(${1:0}, ${2:0}, ${3:0}, ${4:.5})\",\n\t\"cl\": \"clear:both|left|right|none\",\n\t\"cm\": \"/* ${0} */\",\n\t\"cnt\": \"content:'${0}'|normal|open-quote|no-open-quote|close-quote|no-close-quote|attr(${0})|counter(${0})|counters(${0})\",\n\t\"coi\": \"counter-increment\",\n\t\"colm\": \"columns\",\n\t\"colmc\": \"column-count\",\n\t\"colmf\": \"column-fill\",\n\t\"colmg\": \"column-gap\",\n\t\"colmr\": \"column-rule\",\n\t\"colmrc\": \"column-rule-color\",\n\t\"colmrs\": \"column-rule-style\",\n\t\"colmrw\": \"column-rule-width\",\n\t\"colms\": \"column-span\",\n\t\"colmw\": \"column-width\",\n\t\"cor\": \"counter-reset\",\n\t\"cp\": \"clip:auto|rect(${1:top} ${2:right} ${3:bottom} ${4:left})\",\n\t\"cps\": \"caption-side:top|bottom\",\n\t\"cur\": \"cursor:pointer|auto|default|crosshair|hand|help|move|pointer|text\",\n\t\"d\": \"display:block|none|flex|inline-flex|inline|inline-block|grid|inline-grid|subgrid|list-item|run-in|compact|table|inline-table|table-caption|table-column|table-column-group|table-header-group|table-footer-group|table-row|table-row-group|table-cell|ruby|ruby-base|ruby-base-group|ruby-text|ruby-text-group\",\n\t\"ec\": \"empty-cells:show|hide\",\n\t\"f\": \"font:${1:1em} ${2:sans-serif}\",\n\t\"fd\": \"font-display:auto|block|swap|fallback|optional\",\n\t\"fef\": \"font-effect:none|engrave|emboss|outline\",\n\t\"fem\": \"font-emphasize\",\n\t\"femp\": \"font-emphasize-position:before|after\",\n\t\"fems\": \"font-emphasize-style:none|accent|dot|circle|disc\",\n\t\"ff\": \"font-family:serif|sans-serif|cursive|fantasy|monospace\",\n\t\"fft\": \"font-family:\\\"Times New Roman\\\", Times, Baskerville, Georgia, serif\",\n\t\"ffa\": \"font-family:Arial, \\\"Helvetica Neue\\\", Helvetica, sans-serif\",\n\t\"ffv\": \"font-family:Verdana, Geneva, sans-serif\",\n\t\"fl\": \"float:left|right|none\",\n\t\"fs\": \"font-style:italic|normal|oblique\",\n\t\"fsm\": \"font-smoothing:antialiased|subpixel-antialiased|none\",\n\t\"fst\": \"font-stretch:normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded\",\n\t\"fv\": \"font-variant:normal|small-caps\",\n\t\"fvs\": \"font-variation-settings:normal|inherit|initial|unset\",\n\t\"fw\": \"font-weight:normal|bold|bolder|lighter\",\n\t\"fx\": \"flex\",\n\t\"fxb\": \"flex-basis:fill|max-content|min-content|fit-content|content\",\n\t\"fxd\": \"flex-direction:row|row-reverse|column|column-reverse\",\n\t\"fxf\": \"flex-flow\",\n\t\"fxg\": \"flex-grow\",\n\t\"fxsh\": \"flex-shrink\",\n\t\"fxw\": \"flex-wrap:nowrap|wrap|wrap-reverse\",\n\t\"fsz\": \"font-size\",\n\t\"fsza\": \"font-size-adjust\",\n\t\"gtc\": \"grid-template-columns:repeat()|minmax()\",\n\t\"gtr\": \"grid-template-rows:repeat()|minmax()\",\n\t\"gta\": \"grid-template-areas\",\n\t\"gt\": \"grid-template\",\n\t\"gg\": \"grid-gap\",\n\t\"gcg\": \"grid-column-gap\",\n\t\"grg\": \"grid-row-gap\",\n\t\"gac\": \"grid-auto-columns:auto|minmax()\",\n\t\"gar\": \"grid-auto-rows:auto|minmax()\",\n\t\"gaf\": \"grid-auto-flow:row|column|dense|inherit|initial|unset\",\n\t\"gd\": \"grid\",\n\t\"gc\": \"grid-column\",\n\t\"gcs\": \"grid-column-start\",\n\t\"gce\": \"grid-column-end\",\n\t\"gr\": \"grid-row\",\n\t\"grs\": \"grid-row-start\",\n\t\"gre\": \"grid-row-end\",\n\t\"ga\": \"grid-area\",\n\t\"h\": \"height\",\n\t\"jc\": \"justify-content:start|end|stretch|flex-start|flex-end|center|space-between|space-around|space-evenly\",\n\t\"ji\": \"justify-items:start|end|center|stretch\",\n\t\"js\": \"justify-self:start|end|center|stretch\",\n\t\"l\": \"left\",\n\t\"lg\": \"background-image:linear-gradient(${1})\",\n\t\"lh\": \"line-height\",\n\t\"lis\": \"list-style\",\n\t\"lisi\": \"list-style-image\",\n\t\"lisp\": \"list-style-position:inside|outside\",\n\t\"list\": \"list-style-type:disc|circle|square|decimal|decimal-leading-zero|lower-roman|upper-roman\",\n\t\"lts\": \"letter-spacing:normal\",\n\t\"m\": \"margin\",\n\t\"mah\": \"max-height\",\n\t\"mar\": \"max-resolution\",\n\t\"maw\": \"max-width\",\n\t\"mb\": \"margin-bottom\",\n\t\"mih\": \"min-height\",\n\t\"mir\": \"min-resolution\",\n\t\"miw\": \"min-width\",\n\t\"ml\": \"margin-left\",\n\t\"mr\": \"margin-right\",\n\t\"mt\": \"margin-top\",\n\t\"ol\": \"outline\",\n\t\"olc\": \"outline-color:${1:#000}|invert\",\n\t\"olo\": \"outline-offset\",\n\t\"ols\": \"outline-style:none|dotted|dashed|solid|double|groove|ridge|inset|outset\",\n\t\"olw\": \"outline-width|thin|medium|thick\",\n\t\"op|opa\": \"opacity\",\n\t\"ord\": \"order\",\n\t\"ori\": \"orientation:landscape|portrait\",\n\t\"orp\": \"orphans\",\n\t\"ov\": \"overflow:hidden|visible|hidden|scroll|auto\",\n\t\"ovs\": \"overflow-style:scrollbar|auto|scrollbar|panner|move|marquee\",\n\t\"ovx\": \"overflow-x:hidden|visible|hidden|scroll|auto\",\n\t\"ovy\": \"overflow-y:hidden|visible|hidden|scroll|auto\",\n\t\"p\": \"padding\",\n\t\"pb\": \"padding-bottom\",\n\t\"pgba\": \"page-break-after:auto|always|left|right\",\n\t\"pgbb\": \"page-break-before:auto|always|left|right\",\n\t\"pgbi\": \"page-break-inside:auto|avoid\",\n\t\"pl\": \"padding-left\",\n\t\"pos\": \"position:relative|absolute|relative|fixed|static\",\n\t\"pr\": \"padding-right\",\n\t\"pt\": \"padding-top\",\n\t\"q\": \"quotes\",\n\t\"qen\": \"quotes:'\\\\201C' '\\\\201D' '\\\\2018' '\\\\2019'\",\n\t\"qru\": \"quotes:'\\\\00AB' '\\\\00BB' '\\\\201E' '\\\\201C'\",\n\t\"r\": \"right\",\n\t\"rsz\": \"resize:none|both|horizontal|vertical\",\n\t\"t\": \"top\",\n\t\"ta\": \"text-align:left|center|right|justify\",\n\t\"tal\": \"text-align-last:left|center|right\",\n\t\"tbl\": \"table-layout:fixed\",\n\t\"td\": \"text-decoration:none|underline|overline|line-through\",\n\t\"te\": \"text-emphasis:none|accent|dot|circle|disc|before|after\",\n\t\"th\": \"text-height:auto|font-size|text-size|max-size\",\n\t\"ti\": \"text-indent\",\n\t\"tj\": \"text-justify:auto|inter-word|inter-ideograph|inter-cluster|distribute|kashida|tibetan\",\n\t\"to\": \"text-outline:${1:0} ${2:0} ${3:#000}\",\n\t\"tov\": \"text-overflow:ellipsis|clip\",\n\t\"tr\": \"text-replace\",\n\t\"trf\": \"transform:${1}|skewX(${1:angle})|skewY(${1:angle})|scale(${1:x}, ${2:y})|scaleX(${1:x})|scaleY(${1:y})|scaleZ(${1:z})|scale3d(${1:x}, ${2:y}, ${3:z})|rotate(${1:angle})|rotateX(${1:angle})|rotateY(${1:angle})|rotateZ(${1:angle})|translate(${1:x}, ${2:y})|translateX(${1:x})|translateY(${1:y})|translateZ(${1:z})|translate3d(${1:tx}, ${2:ty}, ${3:tz})\",\n\t\"trfo\": \"transform-origin\",\n\t\"trfs\": \"transform-style:preserve-3d\",\n\t\"trs\": \"transition:${1:prop} ${2:time}\",\n\t\"trsde\": \"transition-delay:${1:time}\",\n\t\"trsdu\": \"transition-duration:${1:time}\",\n\t\"trsp\": \"transition-property:${1:prop}\",\n\t\"trstf\": \"transition-timing-function:${1:fn}\",\n\t\"tsh\": \"text-shadow:${1:hoff} ${2:voff} ${3:blur} ${4:#000}\",\n\t\"tt\": \"text-transform:uppercase|lowercase|capitalize|none\",\n\t\"tw\": \"text-wrap:none|normal|unrestricted|suppress\",\n\t\"us\": \"user-select:none\",\n\t\"v\": \"visibility:hidden|visible|collapse\",\n\t\"va\": \"vertical-align:top|super|text-top|middle|baseline|bottom|text-bottom|sub\",\n\t\"w\": \"width\",\n\t\"whs\": \"white-space:nowrap|pre|pre-wrap|pre-line|normal\",\n\t\"whsc\": \"white-space-collapse:normal|keep-all|loose|break-strict|break-all\",\n\t\"wid\": \"widows\",\n\t\"wm\": \"writing-mode:lr-tb|lr-tb|lr-bt|rl-tb|rl-bt|tb-rl|tb-lr|bt-lr|bt-rl\",\n\t\"wob\": \"word-break:normal|keep-all|break-all\",\n\t\"wos\": \"word-spacing\",\n\t\"wow\": \"word-wrap:none|unrestricted|suppress|break-word|normal\",\n\t\"z\": \"z-index\",\n\t\"zom\": \"zoom:1\"\n};\n\nvar xslSnippets = {\n    \"tm|tmatch\": \"xsl:template[match mode]\",\n    \"tn|tname\": \"xsl:template[name]\",\n    \"call\": \"xsl:call-template[name]\",\n    \"ap\": \"xsl:apply-templates[select mode]\",\n    \"api\": \"xsl:apply-imports\",\n    \"imp\": \"xsl:import[href]\",\n    \"inc\": \"xsl:include[href]\",\n    \"ch\": \"xsl:choose\",\n    \"wh|xsl:when\": \"xsl:when[test]\",\n    \"ot\": \"xsl:otherwise\",\n    \"if\": \"xsl:if[test]\",\n    \"par\": \"xsl:param[name]\",\n    \"pare\": \"xsl:param[name select]\",\n    \"var\": \"xsl:variable[name]\",\n    \"vare\": \"xsl:variable[name select]\",\n    \"wp\": \"xsl:with-param[name select]\",\n    \"key\": \"xsl:key[name match use]\",\n    \"elem\": \"xsl:element[name]\",\n    \"attr\": \"xsl:attribute[name]\",\n    \"attrs\": \"xsl:attribute-set[name]\",\n    \"cp\": \"xsl:copy[select]\",\n    \"co\": \"xsl:copy-of[select]\",\n    \"val\": \"xsl:value-of[select]\",\n    \"for|each\": \"xsl:for-each[select]\",\n    \"tex\": \"xsl:text\",\n    \"com\": \"xsl:comment\",\n    \"msg\": \"xsl:message[terminate=no]\",\n    \"fall\": \"xsl:fallback\",\n    \"num\": \"xsl:number[value]\",\n    \"nam\": \"namespace-alias[stylesheet-prefix result-prefix]\",\n    \"pres\": \"xsl:preserve-space[elements]\",\n    \"strip\": \"xsl:strip-space[elements]\",\n    \"proc\": \"xsl:processing-instruction[name]\",\n    \"sort\": \"xsl:sort[select order]\",\n    \"choose\": \"xsl:choose>xsl:when+xsl:otherwise\",\n    \"xsl\": \"!!!+xsl:stylesheet[version=1.0 xmlns:xsl=http://www.w3.org/1999/XSL/Transform]>{\\n|}\",\n    \"!!!\": \"{<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>}\"\n};\n\nvar pugSnippets = {\n\t\"!!!\": \"{doctype html}\"\n};\n\nvar variables = {\n\t\"lang\": \"en\",\n\t\"locale\": \"en-US\",\n\t\"charset\": \"UTF-8\",\n\t\"indentation\": \"\\t\",\n\t\"newline\": \"\\n\"\n};\n\n/**\n * Default syntaxes for abbreviation types\n */\nconst defaultSyntaxes = {\n    markup: 'html',\n    stylesheet: 'css'\n};\nconst defaultOptions = {\n    'inlineElements': [\n        'a', 'abbr', 'acronym', 'applet', 'b', 'basefont', 'bdo',\n        'big', 'br', 'button', 'cite', 'code', 'del', 'dfn', 'em', 'font', 'i',\n        'iframe', 'img', 'input', 'ins', 'kbd', 'label', 'map', 'object', 'q',\n        's', 'samp', 'select', 'small', 'span', 'strike', 'strong', 'sub', 'sup',\n        'textarea', 'tt', 'u', 'var'\n    ],\n    'output.indent': '\\t',\n    'output.baseIndent': '',\n    'output.newline': '\\n',\n    'output.tagCase': '',\n    'output.attributeCase': '',\n    'output.attributeQuotes': 'double',\n    'output.format': true,\n    'output.formatLeafNode': false,\n    'output.formatSkip': ['html'],\n    'output.formatForce': ['body'],\n    'output.inlineBreak': 3,\n    'output.compactBoolean': false,\n    'output.booleanAttributes': [\n        'contenteditable', 'seamless', 'async', 'autofocus',\n        'autoplay', 'checked', 'controls', 'defer', 'disabled', 'formnovalidate',\n        'hidden', 'ismap', 'loop', 'multiple', 'muted', 'novalidate', 'readonly',\n        'required', 'reversed', 'selected', 'typemustmatch'\n    ],\n    'output.reverseAttributes': false,\n    'output.selfClosingStyle': 'html',\n    'output.field': (index, placeholder) => placeholder,\n    'output.text': text => text,\n    'markup.href': true,\n    'comment.enabled': false,\n    'comment.trigger': ['id', 'class'],\n    'comment.before': '',\n    'comment.after': '\\n<!-- /[#ID][.CLASS] -->',\n    'bem.enabled': false,\n    'bem.element': '__',\n    'bem.modifier': '_',\n    'jsx.enabled': false,\n    'stylesheet.keywords': ['auto', 'inherit', 'unset', 'none'],\n    'stylesheet.unitless': ['z-index', 'line-height', 'opacity', 'font-weight', 'zoom', 'flex', 'flex-grow', 'flex-shrink'],\n    'stylesheet.shortHex': true,\n    'stylesheet.between': ': ',\n    'stylesheet.after': ';',\n    'stylesheet.intUnit': 'px',\n    'stylesheet.floatUnit': 'em',\n    'stylesheet.unitAliases': { e: 'em', p: '%', x: 'ex', r: 'rem' },\n    'stylesheet.json': false,\n    'stylesheet.jsonDoubleQuotes': false,\n    'stylesheet.fuzzySearchMinScore': 0\n};\nconst defaultConfig = {\n    type: 'markup',\n    syntax: 'html',\n    variables,\n    snippets: {},\n    options: defaultOptions\n};\n/**\n * Default per-syntax config\n */\nconst syntaxConfig = {\n    markup: {\n        snippets: parseSnippets(markupSnippets),\n    },\n    xhtml: {\n        options: {\n            'output.selfClosingStyle': 'xhtml'\n        }\n    },\n    xml: {\n        options: {\n            'output.selfClosingStyle': 'xml'\n        }\n    },\n    xsl: {\n        snippets: parseSnippets(xslSnippets),\n        options: {\n            'output.selfClosingStyle': 'xml'\n        }\n    },\n    jsx: {\n        options: {\n            'jsx.enabled': true\n        }\n    },\n    pug: {\n        snippets: parseSnippets(pugSnippets)\n    },\n    stylesheet: {\n        snippets: parseSnippets(stylesheetSnippets)\n    },\n    sass: {\n        options: {\n            'stylesheet.after': ''\n        }\n    },\n    stylus: {\n        options: {\n            'stylesheet.between': ' ',\n            'stylesheet.after': '',\n        }\n    }\n};\n/**\n * Parses raw snippets definitions with possibly multiple keys into a plan\n * snippet map\n */\nfunction parseSnippets(snippets) {\n    const result = {};\n    Object.keys(snippets).forEach(k => {\n        for (const name of k.split('|')) {\n            result[name] = snippets[k];\n        }\n    });\n    return result;\n}\nfunction resolveConfig(config = {}, globals = {}) {\n    const type = config.type || 'markup';\n    const syntax = config.syntax || defaultSyntaxes[type];\n    return Object.assign(Object.assign(Object.assign({}, defaultConfig), config), { type,\n        syntax, variables: mergedData(type, syntax, 'variables', config, globals), snippets: mergedData(type, syntax, 'snippets', config, globals), options: mergedData(type, syntax, 'options', config, globals) });\n}\nfunction mergedData(type, syntax, key, config, globals = {}) {\n    const typeDefaults = syntaxConfig[type];\n    const typeOverride = globals[type];\n    const syntaxDefaults = syntaxConfig[syntax];\n    const syntaxOverride = globals[syntax];\n    return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, defaultConfig[key]), (typeDefaults && typeDefaults[key])), (syntaxDefaults && syntaxDefaults[key])), (typeOverride && typeOverride[key])), (syntaxOverride && syntaxOverride[key])), config[key]);\n}\n\n/**\n * Creates structure for scanning given string in backward direction\n */\nfunction backwardScanner(text, start = 0) {\n    return { text, start, pos: text.length };\n}\n/**\n * Check if given scanner position is at start of scanned text\n */\nfunction sol(scanner) {\n    return scanner.pos === scanner.start;\n}\n/**\n * “Peeks” character code an current scanner location without advancing it\n */\nfunction peek$1(scanner, offset = 0) {\n    return scanner.text.charCodeAt(scanner.pos - 1 + offset);\n}\n/**\n * Returns current character code and moves character location one symbol back\n */\nfunction previous(scanner) {\n    if (!sol(scanner)) {\n        return scanner.text.charCodeAt(--scanner.pos);\n    }\n}\n/**\n * Consumes current character code if it matches given `match` code or function\n */\nfunction consume(scanner, match) {\n    if (sol(scanner)) {\n        return false;\n    }\n    const ok = typeof match === 'function'\n        ? match(peek$1(scanner))\n        : match === peek$1(scanner);\n    if (ok) {\n        scanner.pos--;\n    }\n    return !!ok;\n}\nfunction consumeWhile(scanner, match) {\n    const start = scanner.pos;\n    while (consume(scanner, match)) {\n        // empty\n    }\n    return scanner.pos < start;\n}\n\n/**\n * Check if given character code is a quote\n */\nfunction isQuote(c) {\n    return c === 39 /* SingleQuote */ || c === 34 /* DoubleQuote */;\n}\n/**\n * Consumes quoted value, if possible\n * @return Returns `true` is value was consumed\n */\nfunction consumeQuoted(scanner) {\n    const start = scanner.pos;\n    const quote = previous(scanner);\n    if (isQuote(quote)) {\n        while (!sol(scanner)) {\n            if (previous(scanner) === quote && peek$1(scanner) !== 92 /* Escape */) {\n                return true;\n            }\n        }\n    }\n    scanner.pos = start;\n    return false;\n}\n\nconst bracePairs = {\n    [91 /* SquareL */]: 93 /* SquareR */,\n    [40 /* RoundL */]: 41 /* RoundR */,\n    [123 /* CurlyL */]: 125 /* CurlyR */,\n};\n\n/**\n * Check if given reader’s current position points at the end of HTML tag\n */\nfunction isHtml(scanner) {\n    const start = scanner.pos;\n    if (!consume(scanner, 62 /* AngleRight */)) {\n        return false;\n    }\n    let ok = false;\n    consume(scanner, 47 /* Slash */); // possibly self-closed element\n    while (!sol(scanner)) {\n        consumeWhile(scanner, isWhiteSpace);\n        if (consumeIdent(scanner)) {\n            // ate identifier: could be a tag name, boolean attribute or unquoted\n            // attribute value\n            if (consume(scanner, 47 /* Slash */)) {\n                // either closing tag or invalid tag\n                ok = consume(scanner, 60 /* AngleLeft */);\n                break;\n            }\n            else if (consume(scanner, 60 /* AngleLeft */)) {\n                // opening tag\n                ok = true;\n                break;\n            }\n            else if (consume(scanner, isWhiteSpace)) {\n                // boolean attribute\n                continue;\n            }\n            else if (consume(scanner, 61 /* Equals */)) {\n                // simple unquoted value or invalid attribute\n                if (consumeIdent(scanner)) {\n                    continue;\n                }\n                break;\n            }\n            else if (consumeAttributeWithUnquotedValue(scanner)) {\n                // identifier was a part of unquoted value\n                ok = true;\n                break;\n            }\n            // invalid tag\n            break;\n        }\n        if (consumeAttribute(scanner)) {\n            continue;\n        }\n        break;\n    }\n    scanner.pos = start;\n    return ok;\n}\n/**\n * Consumes HTML attribute from given string.\n * @return `true` if attribute was consumed.\n */\nfunction consumeAttribute(scanner) {\n    return consumeAttributeWithQuotedValue(scanner) || consumeAttributeWithUnquotedValue(scanner);\n}\nfunction consumeAttributeWithQuotedValue(scanner) {\n    const start = scanner.pos;\n    if (consumeQuoted(scanner) && consume(scanner, 61 /* Equals */) && consumeIdent(scanner)) {\n        return true;\n    }\n    scanner.pos = start;\n    return false;\n}\nfunction consumeAttributeWithUnquotedValue(scanner) {\n    const start = scanner.pos;\n    const stack = [];\n    while (!sol(scanner)) {\n        const ch = peek$1(scanner);\n        if (isCloseBracket(ch)) {\n            stack.push(ch);\n        }\n        else if (isOpenBracket(ch)) {\n            if (stack.pop() !== bracePairs[ch]) {\n                // Unexpected open bracket\n                break;\n            }\n        }\n        else if (!isUnquotedValue(ch)) {\n            break;\n        }\n        scanner.pos--;\n    }\n    if (start !== scanner.pos && consume(scanner, 61 /* Equals */) && consumeIdent(scanner)) {\n        return true;\n    }\n    scanner.pos = start;\n    return false;\n}\n/**\n * Consumes HTML identifier from stream\n */\nfunction consumeIdent(scanner) {\n    return consumeWhile(scanner, isIdent);\n}\n/**\n * Check if given character code belongs to HTML identifier\n */\nfunction isIdent(ch) {\n    return ch === 58 /* Colon */ || ch === 45 /* Dash */ || isAlpha(ch) || isNumber(ch);\n}\n/**\n * Check if given character code is alpha code (letter though A to Z)\n */\nfunction isAlpha(ch) {\n    ch &= ~32; // quick hack to convert any char code to uppercase char code\n    return ch >= 65 && ch <= 90; // A-Z\n}\n/**\n * Check if given code is a number\n */\nfunction isNumber(ch) {\n    return ch > 47 && ch < 58;\n}\n/**\n * Check if given code is a whitespace\n */\nfunction isWhiteSpace(ch) {\n    return ch === 32 /* Space */ || ch === 9 /* Tab */;\n}\n/**\n * Check if given code may belong to unquoted attribute value\n */\nfunction isUnquotedValue(ch) {\n    return !isNaN(ch) && ch !== 61 /* Equals */ && !isWhiteSpace(ch) && !isQuote(ch);\n}\nfunction isOpenBracket(ch) {\n    return ch === 123 /* CurlyL */ || ch === 40 /* RoundL */ || ch === 91 /* SquareL */;\n}\nfunction isCloseBracket(ch) {\n    return ch === 125 /* CurlyR */ || ch === 41 /* RoundR */ || ch === 93 /* SquareR */;\n}\n\nconst code = (ch) => ch.charCodeAt(0);\nconst specialChars = '#.*:$-_!@%^+>/'.split('').map(code);\nconst defaultOptions$1 = {\n    type: 'markup',\n    lookAhead: true,\n    prefix: ''\n};\n/**\n * Extracts Emmet abbreviation from given string.\n * The goal of this module is to extract abbreviation from current editor’s line,\n * e.g. like this: `<span>.foo[title=bar|]</span>` -> `.foo[title=bar]`, where\n * `|` is a current caret position.\n * @param line A text line where abbreviation should be expanded\n * @param pos Caret position in line. If not given, uses end of line\n * @param options Extracting options\n */\nfunction extractAbbreviation(line, pos = line.length, options = {}) {\n    // make sure `pos` is within line range\n    const opt = Object.assign(Object.assign({}, defaultOptions$1), options);\n    pos = Math.min(line.length, Math.max(0, pos == null ? line.length : pos));\n    if (opt.lookAhead) {\n        pos = offsetPastAutoClosed(line, pos, opt);\n    }\n    let ch;\n    const start = getStartOffset(line, pos, opt.prefix || '');\n    if (start === -1) {\n        return void 0;\n    }\n    const scanner = backwardScanner(line, start);\n    scanner.pos = pos;\n    const stack = [];\n    while (!sol(scanner)) {\n        ch = peek$1(scanner);\n        if (stack.includes(125 /* CurlyR */)) {\n            if (ch === 125 /* CurlyR */) {\n                stack.push(ch);\n                scanner.pos--;\n                continue;\n            }\n            if (ch !== 123 /* CurlyL */) {\n                scanner.pos--;\n                continue;\n            }\n        }\n        if (isCloseBrace(ch, opt.type)) {\n            stack.push(ch);\n        }\n        else if (isOpenBrace(ch, opt.type)) {\n            if (stack.pop() !== bracePairs[ch]) {\n                // unexpected brace\n                break;\n            }\n        }\n        else if (stack.includes(93 /* SquareR */) || stack.includes(125 /* CurlyR */)) {\n            // respect all characters inside attribute sets or text nodes\n            scanner.pos--;\n            continue;\n        }\n        else if (isHtml(scanner) || !isAbbreviation(ch)) {\n            break;\n        }\n        scanner.pos--;\n    }\n    if (!stack.length && scanner.pos !== pos) {\n        // Found something, remove some invalid symbols from the\n        // beginning and return abbreviation\n        const abbreviation = line.slice(scanner.pos, pos).replace(/^[*+>^]+/, '');\n        return {\n            abbreviation,\n            location: pos - abbreviation.length,\n            start: options.prefix\n                ? start - options.prefix.length\n                : pos - abbreviation.length,\n            end: pos\n        };\n    }\n}\n/**\n * Returns new `line` index which is right after characters beyound `pos` that\n * editor will likely automatically close, e.g. }, ], and quotes\n */\nfunction offsetPastAutoClosed(line, pos, options) {\n    // closing quote is allowed only as a next character\n    if (isQuote(line.charCodeAt(pos))) {\n        pos++;\n    }\n    // offset pointer until non-autoclosed character is found\n    while (isCloseBrace(line.charCodeAt(pos), options.type)) {\n        pos++;\n    }\n    return pos;\n}\n/**\n * Returns start offset (left limit) in `line` where we should stop looking for\n * abbreviation: it’s nearest to `pos` location of `prefix` token\n */\nfunction getStartOffset(line, pos, prefix) {\n    if (!prefix) {\n        return 0;\n    }\n    const scanner = backwardScanner(line);\n    const compiledPrefix = prefix.split('').map(code);\n    scanner.pos = pos;\n    let result;\n    while (!sol(scanner)) {\n        if (consumePair(scanner, 93 /* SquareR */, 91 /* SquareL */) || consumePair(scanner, 125 /* CurlyR */, 123 /* CurlyL */)) {\n            continue;\n        }\n        result = scanner.pos;\n        if (consumeArray(scanner, compiledPrefix)) {\n            return result;\n        }\n        scanner.pos--;\n    }\n    return -1;\n}\n/**\n * Consumes full character pair, if possible\n */\nfunction consumePair(scanner, close, open) {\n    const start = scanner.pos;\n    if (consume(scanner, close)) {\n        while (!sol(scanner)) {\n            if (consume(scanner, open)) {\n                return true;\n            }\n            scanner.pos--;\n        }\n    }\n    scanner.pos = start;\n    return false;\n}\n/**\n * Consumes all character codes from given array, right-to-left, if possible\n */\nfunction consumeArray(scanner, arr) {\n    const start = scanner.pos;\n    let consumed = false;\n    for (let i = arr.length - 1; i >= 0 && !sol(scanner); i--) {\n        if (!consume(scanner, arr[i])) {\n            break;\n        }\n        consumed = i === 0;\n    }\n    if (!consumed) {\n        scanner.pos = start;\n    }\n    return consumed;\n}\nfunction isAbbreviation(ch) {\n    return (ch > 64 && ch < 91) // uppercase letter\n        || (ch > 96 && ch < 123) // lowercase letter\n        || (ch > 47 && ch < 58) // number\n        || specialChars.includes(ch); // special character\n}\nfunction isOpenBrace(ch, syntax) {\n    return ch === 40 /* RoundL */ || (syntax === 'markup' && (ch === 91 /* SquareL */ || ch === 123 /* CurlyL */));\n}\nfunction isCloseBrace(ch, syntax) {\n    return ch === 41 /* RoundR */ || (syntax === 'markup' && (ch === 93 /* SquareR */ || ch === 125 /* CurlyR */));\n}\n\nfunction expandAbbreviation(abbr, config) {\n    const resolvedConfig = resolveConfig(config);\n    return resolvedConfig.type === 'stylesheet'\n        ? stylesheet(abbr, resolvedConfig)\n        : markup(abbr, resolvedConfig);\n}\n/**\n * Expands given *markup* abbreviation (e.g. regular Emmet abbreviation that\n * produces structured output like HTML) and outputs it according to options\n * provided in config\n */\nfunction markup(abbr, config) {\n    return stringify(parse(abbr, config), config);\n}\n/**\n * Expands given *stylesheet* abbreviation (a special Emmet abbreviation designed for\n * stylesheet languages like CSS, SASS etc.) and outputs it according to options\n * provided in config\n */\nfunction stylesheet(abbr, config) {\n    return css(parse$1(abbr, config), config);\n}\n\nexport default expandAbbreviation;\nexport { extractAbbreviation as extract, markup, parse as parseMarkup, parse$1 as parseStylesheet, convertSnippets as parseStylesheetSnippets, resolveConfig, stringify as stringifyMarkup, css as stringifyStylesheet, stylesheet };\n//# sourceMappingURL=emmet.es.js.map\n","import Scanner, { isSpace, isQuote } from '@emmetio/scanner';\n\n/**\n * Performs fast scan of given stylesheet (CSS, LESS, SCSS) source code and runs\n * callback for each token and its range found. The goal of this parser is to quickly\n * determine document structure: selector, property, value and block end.\n * It doesn’t provide detailed info about CSS atoms like compound selectors,\n * operators, quoted string etc. to reduce memory allocations: this data can be\n * parsed later on demand.\n */\nfunction scan(source, callback) {\n    const scanner = new Scanner(source);\n    const state = {\n        start: -1,\n        end: -1,\n        propertyStart: -1,\n        propertyEnd: -1,\n        propertyDelimiter: -1,\n        expression: 0,\n    };\n    let blockEnd;\n    const notify = (type, delimiter = scanner.start, start = state.start, end = state.end) => {\n        return callback(type, start, end, delimiter) === false;\n    };\n    while (!scanner.eof()) {\n        if (comment(scanner) || whitespace(scanner)) {\n            continue;\n        }\n        scanner.start = scanner.pos;\n        if ((blockEnd = scanner.eat(125 /* RightCurly */)) || scanner.eat(59 /* Semicolon */)) {\n            // Block or property end\n            if (state.propertyStart !== -1) {\n                // We have pending property\n                if (notify(\"propertyName\" /* PropertyName */, state.propertyDelimiter, state.propertyStart, state.propertyEnd)) {\n                    return;\n                }\n                if (state.start === -1) {\n                    // Explicit property value state: emit empty value\n                    state.start = state.end = scanner.start;\n                }\n                if (notify(\"propertyValue\" /* PropertyValue */)) {\n                    return;\n                }\n            }\n            else if (state.start !== -1 && notify(\"propertyName\" /* PropertyName */)) {\n                // Flush consumed token\n                return;\n            }\n            if (blockEnd) {\n                state.start = scanner.start;\n                state.end = scanner.pos;\n                if (notify(\"blockEnd\" /* BlockEnd */)) {\n                    return;\n                }\n            }\n            reset(state);\n        }\n        else if (scanner.eat(123 /* LeftCurly */)) {\n            // Block start\n            if (state.start === -1 && state.propertyStart === -1) {\n                // No consumed selector, emit empty value as selector start\n                state.start = state.end = scanner.pos;\n            }\n            if (state.propertyStart !== -1) {\n                // Now we know that value that looks like property name-value pair\n                // was actually a selector\n                state.start = state.propertyStart;\n            }\n            if (notify(\"selector\" /* Selector */)) {\n                return;\n            }\n            reset(state);\n        }\n        else if (scanner.eat(58 /* Colon */) && !isKnownSelectorColon(scanner, state)) {\n            // Colon could be one of the following:\n            // — property delimiter: `foo: bar`, must be in block context\n            // — variable delimiter: `$foo: bar`, could be anywhere\n            // — pseudo-selector: `a:hover`, could be anywhere (for LESS and SCSS)\n            // — media query expression: `min-width: 100px`, must be inside expression context\n            // Since I can’t easily detect `:` meaning for sure, we’ll update state\n            // to accumulate possible property name-value pair or selector\n            if (state.propertyStart === -1) {\n                state.propertyStart = state.start;\n            }\n            state.propertyEnd = state.end;\n            state.propertyDelimiter = scanner.pos - 1;\n            state.start = state.end = -1;\n        }\n        else {\n            if (state.start === -1) {\n                state.start = scanner.pos;\n            }\n            if (scanner.eat(40 /* LeftRound */)) {\n                state.expression++;\n            }\n            else if (scanner.eat(41 /* RightRound */)) {\n                state.expression--;\n            }\n            else if (!literal(scanner)) {\n                scanner.pos++;\n            }\n            state.end = scanner.pos;\n        }\n    }\n    if (state.propertyStart !== -1) {\n        // Pending property name\n        if (notify(\"propertyName\" /* PropertyName */, state.propertyDelimiter, state.propertyStart, state.propertyEnd)) {\n            return;\n        }\n    }\n    if (state.start !== -1) {\n        // There’s pending token in state\n        notify(state.propertyStart !== -1 ? \"propertyValue\" /* PropertyValue */ : \"propertyName\" /* PropertyName */, -1);\n    }\n}\nfunction whitespace(scanner) {\n    return scanner.eatWhile(isSpace);\n}\n/**\n * Consumes CSS comments from scanner: `/*  * /`\n * It’s possible that comment may not have closing part\n */\nfunction comment(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(47 /* Slash */) && scanner.eat(42 /* Asterisk */)) {\n        scanner.start = start;\n        while (!scanner.eof()) {\n            if (scanner.eat(42 /* Asterisk */)) {\n                if (scanner.eat(47 /* Slash */)) {\n                    return true;\n                }\n                continue;\n            }\n            scanner.pos++;\n        }\n        return true;\n    }\n    else {\n        scanner.pos = start;\n    }\n    return false;\n}\n/**\n * Consumes single- or double-quoted string literal\n */\nfunction literal(scanner) {\n    const ch = scanner.peek();\n    if (isQuote(ch)) {\n        scanner.start = scanner.pos++;\n        while (!scanner.eof()) {\n            if (scanner.eat(ch) || scanner.eat(10 /* LF */) || scanner.eat(13 /* CR */)) {\n                break;\n            }\n            // Skip escape character, if any\n            scanner.eat(92 /* Backslash */);\n            scanner.pos++;\n        }\n        // Do not throw if string is incomplete\n        return true;\n    }\n}\nfunction reset(state) {\n    state.start = state.end = state.propertyStart = state.propertyEnd = state.propertyDelimiter = -1;\n}\n/**\n * Check if current state is a known selector context for `:` delimiter\n */\nfunction isKnownSelectorColon(scanner, state) {\n    // Either inside expression like `(min-width: 10px)` or pseudo-element `::before`\n    return state.expression || scanner.eatWhile(58 /* Colon */);\n}\n\n// NB: no `Minus` operator, it must be handled differently\nconst operators = [\n    43 /* Plus */, 47 /* Division */, 42 /* Multiplication */,\n    44 /* Comma */\n];\n/**\n * Splits given CSS value into token list\n */\nfunction splitValue(value, offset = 0) {\n    let start = -1;\n    let expression = 0;\n    let pos = 0;\n    const result = [];\n    const scanner = new Scanner(value);\n    while (!scanner.eof()) {\n        pos = scanner.pos;\n        if (scanner.eat(isSpace) || scanner.eat(isOperator) || isMinusOperator(scanner)) {\n            // Use space as value delimiter but only if not in expression context,\n            // e.g. `1 2` are distinct values but `(1 2)` not\n            if (!expression && start !== -1) {\n                result.push([offset + start, offset + pos]);\n                start = -1;\n            }\n            scanner.eatWhile(isSpace);\n        }\n        else {\n            if (start === -1) {\n                start = scanner.pos;\n            }\n            if (scanner.eat(40 /* LeftRound */)) {\n                expression++;\n            }\n            else if (scanner.eat(41 /* RightRound */)) {\n                expression--;\n            }\n            else if (!literal(scanner)) {\n                scanner.pos++;\n            }\n        }\n    }\n    if (start !== -1 && start !== scanner.pos) {\n        result.push([offset + start, offset + scanner.pos]);\n    }\n    return result;\n}\nfunction isOperator(ch) {\n    return operators.includes(ch);\n}\n/**\n * Check if current scanner state is at minus operator\n */\nfunction isMinusOperator(scanner) {\n    // Minus operator is tricky since CSS supports dashes in keyword names like\n    // `no-repeat`\n    const start = scanner.pos;\n    if (scanner.eat(45 /* Minus */) && scanner.eat(isSpace)) {\n        return true;\n    }\n    scanner.pos = start;\n    return false;\n}\n\nfunction match(source, pos) {\n    const pool = [];\n    const stack = [];\n    let result = null;\n    let pendingProperty = null;\n    const releasePending = () => {\n        if (pendingProperty) {\n            releaseRange(pool, pendingProperty);\n            pendingProperty = null;\n        }\n    };\n    scan(source, (type, start, end, delimiter) => {\n        if (type === \"selector\" /* Selector */) {\n            releasePending();\n            stack.push(allocRange(pool, start, end, delimiter));\n        }\n        else if (type === \"blockEnd\" /* BlockEnd */) {\n            releasePending();\n            const parent = stack.pop();\n            if (parent && parent[0] < pos && pos < end) {\n                result = {\n                    type: 'selector',\n                    start: parent[0],\n                    end,\n                    bodyStart: parent[2] + 1,\n                    bodyEnd: start\n                };\n                return false;\n            }\n        }\n        else if (type === \"propertyName\" /* PropertyName */) {\n            releasePending();\n            pendingProperty = allocRange(pool, start, end, delimiter);\n        }\n        else if (type === \"propertyValue\" /* PropertyValue */) {\n            if (pendingProperty && pendingProperty[0] < pos && pos < end) {\n                result = {\n                    type: 'property',\n                    start: pendingProperty[0],\n                    end: delimiter + 1,\n                    bodyStart: start,\n                    bodyEnd: end\n                };\n                return false;\n            }\n            releasePending();\n        }\n    });\n    return result;\n}\n/**\n * Returns balanced CSS model: a list of all ranges that could possibly match\n * given location when moving in outward direction\n */\nfunction balancedOutward(source, pos) {\n    const pool = [];\n    const stack = [];\n    const result = [];\n    let property = null;\n    scan(source, (type, start, end, delimiter) => {\n        if (type === \"selector\" /* Selector */) {\n            stack.push(allocRange(pool, start, end, delimiter));\n        }\n        else if (type === \"blockEnd\" /* BlockEnd */) {\n            const left = stack.pop();\n            if (left && left[0] < pos && end > pos) {\n                // Matching section found\n                const inner = innerRange(source, left[2] + 1, start);\n                inner && push(result, inner);\n                push(result, [left[0], end]);\n            }\n            left && releaseRange(pool, left);\n            if (!stack.length) {\n                return false;\n            }\n        }\n        else if (type === \"propertyName\" /* PropertyName */) {\n            property && releaseRange(pool, property);\n            property = allocRange(pool, start, end, delimiter);\n        }\n        else if (type === \"propertyValue\" /* PropertyValue */) {\n            if (property && property[0] < pos && Math.max(delimiter, end) > pos) {\n                // Push full token and value range\n                push(result, [start, end]);\n                push(result, [property[0], delimiter !== -1 ? delimiter + 1 : end]);\n            }\n        }\n        if (type !== \"propertyName\" /* PropertyName */ && property) {\n            releaseRange(pool, property);\n            property = null;\n        }\n    });\n    return result;\n}\n/**\n * Returns balanced CSS selectors: a list of all ranges that could possibly match\n * given location when moving in inward direction\n */\nfunction balancedInward(source, pos) {\n    // Collecting ranges for inward balancing is a bit trickier: we have to store\n    // first child of every matched selector until we find the one that matches given\n    // location\n    const pool = [];\n    const stack = [];\n    const result = [];\n    let pendingProperty = null;\n    const alloc = (start, end, delimiter) => {\n        if (pool.length) {\n            const range = pool.pop();\n            range.start = start;\n            range.end = end;\n            range.delimiter = delimiter;\n            return range;\n        }\n        return { start, end, delimiter, firstChild: null };\n    };\n    const release = (range) => {\n        range.firstChild = null;\n        pool.push(range);\n    };\n    const releasePending = () => {\n        if (pendingProperty) {\n            release(pendingProperty);\n            pendingProperty = null;\n        }\n    };\n    /**\n     * Pushes given inward range as a first child of current selector only if it’s\n     * not set yet\n     */\n    const pushChild = (start, end, delimiter) => {\n        const parent = last(stack);\n        if (parent && !parent.firstChild) {\n            parent.firstChild = alloc(start, end, delimiter);\n        }\n    };\n    scan(source, (type, start, end, delimiter) => {\n        if (type === \"blockEnd\" /* BlockEnd */) {\n            releasePending();\n            let range = stack.pop();\n            if (!range) {\n                // Some sort of lone closing brace, ignore it\n                return;\n            }\n            if (range.start <= pos && pos <= end) {\n                // Matching selector found: add it and its inner range into result\n                let inner = innerRange(source, range.delimiter + 1, start);\n                push(result, [range.start, end]);\n                inner && push(result, inner);\n                while (range.firstChild) {\n                    const child = range.firstChild;\n                    inner = innerRange(source, child.delimiter + 1, child.end - 1);\n                    push(result, [child.start, child.end]);\n                    inner && push(result, inner);\n                    range = child;\n                }\n                return false;\n            }\n            else {\n                const parent = last(stack);\n                if (parent && !parent.firstChild) {\n                    // No first child in parent node: store current selector\n                    range.end = end;\n                    parent.firstChild = range;\n                }\n                else {\n                    release(range);\n                }\n            }\n        }\n        else if (type === \"propertyName\" /* PropertyName */) {\n            releasePending();\n            pendingProperty = alloc(start, end, delimiter);\n            pushChild(start, end, delimiter);\n        }\n        else if (type === \"propertyValue\" /* PropertyValue */) {\n            if (pendingProperty) {\n                if (pendingProperty.start <= pos && end >= pos) {\n                    // Direct hit into property, no need to look further\n                    push(result, [pendingProperty.start, delimiter + 1]);\n                    push(result, [start, end]);\n                    releasePending();\n                    return false;\n                }\n                const parent = last(stack);\n                if (parent && parent.firstChild && parent.firstChild.start === pendingProperty.start) {\n                    // First child is an expected property name, update its range\n                    // to include property value\n                    parent.firstChild.end = delimiter !== -1 ? delimiter + 1 : end;\n                }\n                releasePending();\n            }\n        }\n        else {\n            // Selector start\n            stack.push(alloc(start, end, delimiter));\n            releasePending();\n        }\n    });\n    stack.length = pool.length = 0;\n    return result;\n}\n/**\n * Returns inner range for given selector bounds: narrows it to first non-empty\n * region. If resulting region is empty, returns `null`\n */\nfunction innerRange(source, start, end) {\n    while (start < end && isSpace(source.charCodeAt(start))) {\n        start++;\n    }\n    while (end > start && isSpace(source.charCodeAt(end - 1))) {\n        end--;\n    }\n    return start !== end ? [start, end] : null;\n}\nfunction allocRange(pool, start, end, delimiter) {\n    if (pool.length) {\n        const range = pool.pop();\n        range[0] = start;\n        range[1] = end;\n        range[2] = delimiter;\n        return range;\n    }\n    return [start, end, delimiter];\n}\nfunction releaseRange(pool, range) {\n    range && pool.push(range);\n    return null;\n}\nfunction push(ranges, range) {\n    const prev = ranges.length ? ranges[ranges.length - 1] : null;\n    if ((!prev || prev[0] !== range[0] || prev[1] !== range[1]) && range[0] !== range[1]) {\n        ranges.push(range);\n    }\n}\nfunction last(arr) {\n    return arr.length ? arr[arr.length - 1] : null;\n}\n\nexport default match;\nexport { balancedInward, balancedOutward, scan, splitValue };\n//# sourceMappingURL=css-matcher.es.js.map\n","import Scanner, { isWhiteSpace, isNumber, isSpace } from '@emmetio/scanner';\n\nconst nullary = token(\"null\" /* Null */, 0);\n/**\n * Parses given expression in forward direction\n */\nfunction parse(expr) {\n    const scanner = typeof expr === 'string' ? new Scanner(expr) : expr;\n    let ch;\n    let priority = 0;\n    let expected = (1 /* Primary */ | 4 /* LParen */ | 16 /* Sign */);\n    const tokens = [];\n    while (!scanner.eof()) {\n        scanner.eatWhile(isWhiteSpace);\n        scanner.start = scanner.pos;\n        if (consumeNumber(scanner)) {\n            if ((expected & 1 /* Primary */) === 0) {\n                error('Unexpected number', scanner);\n            }\n            tokens.push(number(scanner.current()));\n            expected = (2 /* Operator */ | 8 /* RParen */);\n        }\n        else if (isOperator(scanner.peek())) {\n            ch = scanner.next();\n            if (isSign(ch) && (expected & 16 /* Sign */)) {\n                if (isNegativeSign(ch)) {\n                    tokens.push(op1(ch, priority));\n                }\n                expected = (1 /* Primary */ | 4 /* LParen */ | 16 /* Sign */);\n            }\n            else {\n                if ((expected & 2 /* Operator */) === 0) {\n                    error('Unexpected operator', scanner);\n                }\n                tokens.push(op2(ch, priority));\n                expected = (1 /* Primary */ | 4 /* LParen */ | 16 /* Sign */);\n            }\n        }\n        else if (scanner.eat(40 /* LeftParenthesis */)) {\n            if ((expected & 4 /* LParen */) === 0) {\n                error('Unexpected \"(\"', scanner);\n            }\n            priority += 10;\n            expected = (1 /* Primary */ | 4 /* LParen */ | 16 /* Sign */ | 32 /* NullaryCall */);\n        }\n        else if (scanner.eat(41 /* RightParenthesis */)) {\n            priority -= 10;\n            if (expected & 32 /* NullaryCall */) {\n                tokens.push(nullary);\n            }\n            else if ((expected & 8 /* RParen */) === 0) {\n                error('Unexpected \")\"', scanner);\n            }\n            expected = (2 /* Operator */ | 8 /* RParen */ | 4 /* LParen */);\n        }\n        else {\n            error('Unknown character', scanner);\n        }\n    }\n    if (priority < 0 || priority >= 10) {\n        error('Unmatched \"()\"', scanner);\n    }\n    const result = orderTokens(tokens);\n    if (result === null) {\n        error('Parity', scanner);\n    }\n    return result;\n}\n/**\n * Consumes number from given stream\n * @return Returns `true` if number was consumed\n */\nfunction consumeNumber(scanner) {\n    const start = scanner.pos;\n    if (scanner.eat(46 /* Dot */) && scanner.eatWhile(isNumber)) {\n        // short decimal notation: .025\n        return true;\n    }\n    if (scanner.eatWhile(isNumber) && (!scanner.eat(46 /* Dot */) || scanner.eatWhile(isNumber))) {\n        // either integer or decimal: 10, 10.25\n        return true;\n    }\n    scanner.pos = start;\n    return false;\n}\n/**\n * Orders parsed tokens (operands and operators) in given array so that they are\n * laid off in order of execution\n */\nfunction orderTokens(tokens) {\n    const operators = [];\n    const operands = [];\n    let nOperators = 0;\n    for (let i = 0; i < tokens.length; i++) {\n        const t = tokens[i];\n        if (t.type === \"num\" /* Number */) {\n            operands.push(t);\n        }\n        else {\n            nOperators += t.type === \"op1\" /* Op1 */ ? 1 : 2;\n            while (operators.length) {\n                if (t.priority <= operators[operators.length - 1].priority) {\n                    operands.push(operators.pop());\n                }\n                else {\n                    break;\n                }\n            }\n            operators.push(t);\n        }\n    }\n    return nOperators + 1 === operands.length + operators.length\n        ? operands.concat(operators.reverse())\n        : null /* parity */;\n}\n/**\n * Number token factory\n */\nfunction number(value, priority) {\n    return token(\"num\" /* Number */, parseFloat(value), priority);\n}\n/**\n * Unary operator factory\n * @param value    Operator  character code\n * @param priority Operator execution priority\n */\nfunction op1(value, priority = 0) {\n    if (value === 45 /* Minus */) {\n        priority += 2;\n    }\n    return token(\"op1\" /* Op1 */, value, priority);\n}\n/**\n * Binary operator factory\n * @param value Operator  character code\n * @param priority Operator execution priority\n */\nfunction op2(value, priority = 0) {\n    if (value === 42 /* Multiply */) {\n        priority += 1;\n    }\n    else if (value === 47 /* Divide */ || value === 92 /* IntDivide */) {\n        priority += 2;\n    }\n    return token(\"op2\" /* Op2 */, value, priority);\n}\nfunction error(name, scanner) {\n    if (scanner) {\n        name += ` at column ${scanner.pos} of expression`;\n    }\n    throw new Error(name);\n}\nfunction isSign(ch) {\n    return isPositiveSign(ch) || isNegativeSign(ch);\n}\nfunction isPositiveSign(ch) {\n    return ch === 43 /* Plus */;\n}\nfunction isNegativeSign(ch) {\n    return ch === 45 /* Minus */;\n}\nfunction isOperator(ch) {\n    return ch === 43 /* Plus */ || ch === 45 /* Minus */ || ch === 42 /* Multiply */\n        || ch === 47 /* Divide */ || ch === 92 /* IntDivide */;\n}\nfunction token(type, value, priority = 0) {\n    return { type, value, priority };\n}\n\nconst defaultOptions = {\n    lookAhead: true,\n    whitespace: true\n};\nfunction extract(text, pos = text.length, options) {\n    const opt = Object.assign(Object.assign({}, defaultOptions), options);\n    const scanner = { text, pos };\n    let ch;\n    if (opt.lookAhead && cur(scanner) === 41 /* RightParenthesis */) {\n        // Basically, we should consume right parenthesis only with optional whitespace\n        scanner.pos++;\n        const len = text.length;\n        while (scanner.pos < len) {\n            ch = cur(scanner);\n            if (ch !== 41 /* RightParenthesis */ && !(opt.whitespace && isSpace(ch))) {\n                break;\n            }\n            scanner.pos++;\n        }\n    }\n    const end = scanner.pos;\n    let braces = 0;\n    while (scanner.pos >= 0) {\n        if (number$1(scanner)) {\n            continue;\n        }\n        ch = prev(scanner);\n        if (ch === 41 /* RightParenthesis */) {\n            braces++;\n        }\n        else if (ch === 40 /* LeftParenthesis */) {\n            if (!braces) {\n                break;\n            }\n            braces--;\n        }\n        else if (!((opt.whitespace && isSpace(ch)) || isSign(ch) || isOperator(ch))) {\n            break;\n        }\n        scanner.pos--;\n    }\n    if (scanner.pos !== end && !braces) {\n        // Trim whitespace\n        while (isSpace(cur(scanner))) {\n            scanner.pos++;\n        }\n        return [scanner.pos, end];\n    }\n    return null;\n}\n/**\n * Backward-consumes number from given scanner, if possible\n */\nfunction number$1(scanner) {\n    if (isNumber(prev(scanner))) {\n        scanner.pos--;\n        let dot = false;\n        let ch;\n        while (scanner.pos >= 0) {\n            ch = prev(scanner);\n            if (ch === 46 /* . */) {\n                if (dot) {\n                    // Decimal delimiter already consumed, abort\n                    break;\n                }\n                dot = true;\n            }\n            else if (!isNumber(ch)) {\n                break;\n            }\n            scanner.pos--;\n        }\n        return true;\n    }\n    return false;\n}\nfunction prev(scanner) {\n    return scanner.text.charCodeAt(scanner.pos - 1);\n}\nfunction cur(scanner) {\n    return scanner.text.charCodeAt(scanner.pos);\n}\n\nconst ops1 = {\n    [45 /* Minus */]: num => -num\n};\nconst ops2 = {\n    [43 /* Plus */]: (a, b) => a + b,\n    [45 /* Minus */]: (a, b) => a - b,\n    [42 /* Multiply */]: (a, b) => a * b,\n    [47 /* Divide */]: (a, b) => a / b,\n    [92 /* IntDivide */]: (a, b) => Math.floor(a / b)\n};\n/**\n * Evaluates given math expression\n * @param expr Expression to evaluate\n */\nfunction evaluate(expr) {\n    if (!Array.isArray(expr)) {\n        expr = parse(expr);\n    }\n    if (!expr || !expr.length) {\n        return null;\n    }\n    const nStack = [];\n    let n1;\n    let n2;\n    let f;\n    for (let i = 0, il = expr.length; i < il; i++) {\n        const token = expr[i];\n        if (token.type === \"num\" /* Number */) {\n            nStack.push(token.value);\n        }\n        else if (token.type === \"op2\" /* Op2 */) {\n            n2 = nStack.pop();\n            n1 = nStack.pop();\n            f = ops2[token.value];\n            nStack.push(f(n1, n2));\n        }\n        else if (token.type === \"op1\" /* Op1 */) {\n            n1 = nStack.pop();\n            f = ops1[token.value];\n            nStack.push(f(n1));\n        }\n        else {\n            throw new Error('Invalid expression');\n        }\n    }\n    if (nStack.length > 1) {\n        throw new Error('Invalid Expression (parity)');\n    }\n    return nStack[0];\n}\n\nexport default evaluate;\nexport { extract, parse };\n//# sourceMappingURL=math.es.js.map\n","import { Options } from 'emmet';\nimport getEmmetConfig from './config';\nimport { tabStopStart, tabStopEnd } from './utils';\nimport { isHTML, docSyntax } from './syntax';\n\nexport default function getOutputOptions(editor: CodeMirror.Editor, pos?: number, inline?: boolean): Partial<Options> {\n    const posObj: CodeMirror.Position = pos != null ? editor.posFromIndex(pos) : editor.getCursor();\n    const syntax = docSyntax(editor) || 'html';\n    const config = getEmmetConfig(editor);\n\n    const opt: Partial<Options> = {\n        'output.baseIndent': lineIndent(editor, posObj.line),\n        'output.indent': getIndentation(editor),\n        'output.field': field(),\n        'output.format': !inline,\n        'output.attributeQuotes': config.attributeQuotes\n    };\n\n    if (syntax === 'html') {\n        opt['output.selfClosingStyle'] = config.markupStyle;\n        opt['output.compactBoolean'] = config.markupStyle === 'html';\n    }\n\n    if (isHTML(syntax)) {\n        if (config.comments) {\n            opt['comment.enabled'] = true;\n            if (config.commentsTemplate) {\n                opt['comment.after'] = config.commentsTemplate;\n            }\n        }\n\n        opt['bem.enabled'] = config.bem;\n        opt['stylesheet.shortHex'] = config.shortHex;\n    }\n\n    return opt;\n}\n\n/**\n * Produces tabstop for CodeMirror editor\n */\nexport function field() {\n    let handled = -1;\n    return (index: number, placeholder: string) => {\n        if (handled === -1 || handled === index) {\n            handled = index;\n            return placeholder\n                ? tabStopStart + placeholder + tabStopEnd\n                : tabStopStart;\n        }\n\n        return placeholder || '';\n    }\n}\n\n/**\n * Returns indentation of given line\n */\nexport function lineIndent(editor: CodeMirror.Editor, line: number): string {\n    const lineStr = editor.getLine(line);\n    const indent = lineStr.match(/^\\s+/);\n    return indent ? indent[0] : '';\n}\n\n/**\n * Returns token used for single indentation in given editor\n */\nexport function getIndentation(editor: CodeMirror.Editor): string {\n    if (!editor.getOption('indentWithTabs')) {\n        return ' '.repeat(editor.getOption('indentUnit') || 0);\n    }\n\n    return '\\t';\n}\n","import expandAbbreviation, { extract as extractAbbreviation, UserConfig, AbbreviationContext, ExtractedAbbreviation, Options, ExtractOptions, resolveConfig, MarkupAbbreviation, StylesheetAbbreviation, SyntaxType } from 'emmet';\nimport match, { balancedInward, balancedOutward } from '@emmetio/html-matcher';\nimport { balancedInward as cssBalancedInward, balancedOutward as cssBalancedOutward } from '@emmetio/css-matcher';\nimport { selectItemCSS, selectItemHTML, TextRange } from '@emmetio/action-utils';\nimport evaluate, { extract as extractMath, ExtractOptions as MathExtractOptions } from '@emmetio/math-expression';\nimport { isXML, syntaxInfo, getMarkupAbbreviationContext, getStylesheetAbbreviationContext } from './syntax';\nimport { getContent, isQuotedString } from './utils';\nimport getEmmetConfig from './config';\nimport getOutputOptions, { field } from './output';\n\ninterface EvaluatedMath {\n    start: number;\n    end: number;\n    result: number;\n    snippet: string;\n}\n\nexport interface ContextTag extends AbbreviationContext {\n    open: TextRange;\n    close?: TextRange;\n}\n\nexport interface ExtractedAbbreviationWithContext extends ExtractedAbbreviation {\n    context?: AbbreviationContext;\n    inline?: boolean;\n}\n\n/**\n * Cache for storing internal Emmet data.\n * TODO reset whenever user settings are changed\n */\nlet cache = {};\n\nexport const JSX_PREFIX = '<';\n\n/**\n * Expands given abbreviation into code snippet\n */\nexport function expand(editor: CodeMirror.Editor, abbr: string | MarkupAbbreviation | StylesheetAbbreviation, config?: UserConfig) {\n    let opt: UserConfig = { cache };\n    const outputOpt: Partial<Options> = {\n        'output.field': field(),\n        'output.format': !config || !config['inline'],\n    };\n\n    if (config) {\n        Object.assign(opt, config);\n        if (config.options) {\n            Object.assign(outputOpt, config.options);\n        }\n    }\n\n    opt.options = outputOpt;\n\n    const pluginConfig = getEmmetConfig(editor);\n    if (pluginConfig.config) {\n        opt = resolveConfig(opt, pluginConfig.config);\n    }\n\n    return expandAbbreviation(abbr as string, opt);\n}\n\n/**\n * Extracts abbreviation from given source code by detecting actual syntax context.\n * For example, if host syntax is HTML, it tries to detect if location is inside\n * embedded CSS.\n *\n * It also detects if abbreviation is allowed at given location: HTML tags,\n * CSS selectors may not contain abbreviations.\n * @param code Code from which abbreviation should be extracted\n * @param pos Location at which abbreviation should be expanded\n * @param syntax Syntax of abbreviation to expand\n */\nexport function extract(code: string, pos: number, type: SyntaxType = 'markup', options?: Partial<ExtractOptions>): ExtractedAbbreviation | undefined {\n    return extractAbbreviation(code, pos, {\n        lookAhead: type !== 'stylesheet',\n        type,\n        ...options\n    });\n}\n\n/**\n * Returns list of tags for balancing for given code\n */\nexport function balance(code: string, pos: number, inward = false, xml = false) {\n    const options = { xml };\n    return inward\n        ? balancedInward(code, pos, options)\n        : balancedOutward(code, pos, options);\n}\n\n/**\n * Returns list of selector/property ranges for balancing for given code\n */\nexport function balanceCSS(code: string, pos: number, inward?: boolean) {\n    return inward\n        ? cssBalancedInward(code, pos)\n        : cssBalancedOutward(code, pos);\n}\n\n/**\n * Returns model for selecting next/previous item\n */\nexport function selectItem(code: string, pos: number, isCSS?: boolean, isPrevious?: boolean) {\n    return isCSS\n        ? selectItemCSS(code, pos, isPrevious)\n        : selectItemHTML(code, pos, isPrevious);\n}\n\n/**\n * Finds and evaluates math expression at given position in line\n */\nexport function evaluateMath(code: string, pos: number, options?: Partial<MathExtractOptions>): EvaluatedMath | undefined {\n    const expr = extractMath(code, pos, options);\n    if (expr) {\n        try {\n            const [start, end] = expr;\n            const result = evaluate(code.slice(start, end));\n            if (result !== null) {\n                return {\n                    start, end, result,\n                    snippet: result.toFixed(4).replace(/\\.?0+$/, '')\n                };\n            }\n        } catch (err) {\n            console.error(err);\n        }\n    }\n}\n\n/**\n * Returns matched HTML/XML tag for given point in view\n */\nexport function getTagContext(editor: CodeMirror.Editor, pos: number, xml?: boolean): ContextTag | undefined {\n    const content = getContent(editor);\n    let ctx: ContextTag | undefined;\n\n    if (xml == null) {\n        // Autodetect XML dialect\n        const mode = editor.getMode();\n        xml = mode ? isXML(mode.name) : false;\n    }\n\n    const matchedTag = match(content, pos, { xml });\n    if (matchedTag) {\n        const { open, close } = matchedTag;\n        ctx = {\n            name: matchedTag.name,\n            open,\n            close\n        };\n\n        if (matchedTag.attributes) {\n            ctx.attributes = {};\n            matchedTag.attributes.forEach(attr => {\n                let value = attr.value;\n                if (value && isQuotedString(value)) {\n                    value = value.slice(1, -1);\n                }\n\n                ctx!.attributes![attr.name] = value == null ? null : value;\n            });\n        }\n    }\n\n    return ctx;\n}\n\n/**\n * Returns Emmet options for given character location in editor\n */\nexport function getOptions(editor: CodeMirror.Editor, pos: number): UserConfig {\n    const info = syntaxInfo(editor, pos);\n    const { context } = info;\n\n    const config: UserConfig = {\n        type: info.type,\n        syntax: info.syntax || 'html',\n        options: getOutputOptions(editor, pos, info.inline)\n    };\n\n    if (context) {\n        const content = getContent(editor);\n        // Set context from syntax info\n        if (context.type === 'html' && context.ancestors.length) {\n            config.context = getMarkupAbbreviationContext(content, context);\n        } else if (context.type === 'css') {\n            config.context = getStylesheetAbbreviationContext(context);\n        }\n    }\n\n    return config;\n}\n","import { UserConfig } from 'emmet';\nimport { AbbreviationTrackingController, EditorProxy, AbbreviationTracker, AbbreviationTrackerType, JSX_PREFIX, StopTrackingParams, StartTrackingParams } from '@emmetio/action-utils';\nimport { getInternalState, getCaret, toRange, errorSnippet, replaceWithSnippet } from './lib/utils';\nimport {\n    isSupported, isJSX, isCSS, isHTML, isXML, syntaxFromPos, docSyntax,\n    syntaxInfo, enabledForSyntax, getSyntaxType\n} from './lib/syntax';\nimport { getOptions, extract, expand } from './lib/emmet';\nimport getOutputOptions from './lib/output';\nimport getEmmetConfig from './lib/config';\n\nexport interface CompletionItem {\n    text: string;\n    displayText: string;\n    hint(): void;\n    from: CodeMirror.Position;\n    to: CodeMirror.Position;\n}\n\n/** Class name for Emmet abbreviation marker in editor */\nconst markClass = 'emmet-abbreviation';\n\n/** Class name for Emmet abbreviation preview in editor */\nconst previewClass = 'emmet-abbreviation-preview';\n\nclass CMEditorProxy implements EditorProxy {\n    public cm: CodeMirror.Editor;\n    public marker: CodeMirror.TextMarker | null = null;\n    public preview: CodeMirror.Editor | null = null;\n    public forcedMarker: HTMLElement | null = null;\n\n    get id() {\n        return getInternalState(this.cm).id;\n    }\n\n    substr(from?: number, to?: number) {\n        const value = this.cm.getValue();\n        if (from === undefined && to === undefined) {\n            return value;\n        }\n\n        return value.slice(from || 0, to);\n    }\n\n    replace(value: string, from: number, to: number) {\n        this.cm.replaceRange(value,\n            this.cm.posFromIndex(from),\n            this.cm.posFromIndex(to));\n    }\n\n    syntax() {\n        return docSyntax(this.cm);\n    }\n\n    size() {\n        return this.cm.getValue().length;\n    }\n\n    config(pos: number): UserConfig {\n        return getOptions(this.cm, pos);\n    }\n\n    outputOptions(pos: number, inline?: boolean) {\n        return getOutputOptions(this.cm, pos, inline);\n    }\n\n    previewConfig(config: UserConfig) {\n        return {\n            ...config,\n            options: {\n                ...config.options,\n                'output.field': previewField,\n                'output.indent': '  ',\n                'output.baseIndent': ''\n            }\n        };\n    }\n\n    allowTracking(pos: number) {\n        return allowTracking(this.cm, pos);\n    }\n\n    mark(tracker: AbbreviationTracker): void {\n        const { cm } = this;\n        this.disposeMarker();\n        const [from, to] = toRange(cm, tracker.range);\n        this.marker = cm.markText(from, to, {\n            inclusiveLeft: true,\n            inclusiveRight: true,\n            clearWhenEmpty: false,\n            className: markClass\n        });\n\n        if (tracker.forced && !this.forcedMarker) {\n            this.forcedMarker = document.createElement('div');\n            this.forcedMarker.className = `${markClass}-marker`;\n            cm.addWidget(from, this.forcedMarker, false);\n        }\n    }\n\n    unmark(): void {\n        this.disposeMarker();\n        this.hidePreview();\n    }\n\n    showPreview(tracker: AbbreviationTracker) {\n        const { cm } = this;\n        const config = getEmmetConfig(cm);\n\n        // Check if we should display preview\n        if (!enabledForSyntax(config.preview, syntaxInfo(cm, tracker.range[0]))) {\n            return;\n        }\n\n        let content: string | undefined;\n        let isError = false;\n\n        if (tracker.type === AbbreviationTrackerType.Error) {\n            content = errorSnippet(tracker.error);\n            isError = true;\n        } else if (tracker.forced || !tracker.simple) {\n            content = tracker.preview;\n        }\n\n        if (content) {\n            if (!this.preview) {\n                const previewElem = document.createElement('div');\n                previewElem.className = previewClass;\n\n                const pos = cm.posFromIndex(tracker.range[0]);\n                if (config.attachPreview) {\n                    config.attachPreview(cm, previewElem, pos);\n                } else {\n                    cm.addWidget(pos, previewElem, false);\n                }\n\n                // @ts-ignore\n                this.preview = new this.cm.constructor(previewElem, {\n                    mode: cm.getOption('mode'),\n                    readOnly: 'nocursor',\n                    lineNumbers: false\n                }) as CodeMirror.Editor;\n\n                const errElement = document.createElement('div');\n                errElement.className = `${previewClass}-error`;\n                previewElem.appendChild(errElement);\n            }\n\n            const wrapper = this.preview.getWrapperElement().parentElement!;\n            wrapper.classList.toggle('has-error', isError);\n            if (isError) {\n                wrapper.querySelector(`.${previewClass}-error`)!.innerHTML = content;\n            } else {\n                this.preview.setValue(content);\n            }\n        } else {\n            this.hidePreview();\n        }\n    }\n\n    hidePreview() {\n        if (this.preview) {\n            this.preview.getWrapperElement().parentElement!.remove();\n            this.preview = null;\n        }\n    }\n\n    /**\n     * Check if given syntax is a CSS dialect (including SCSS, LESS etc)\n     */\n    isCSS(syntax: string): boolean {\n        return isCSS(syntax);\n    }\n\n    syntaxType(syntax: string) {\n        return getSyntaxType(syntax);\n    }\n\n    /**\n     * Check if given syntax is a HTML dialect. HTML dialects also support embedded\n     * stylesheets in `<style>` tga or `style=\"\"` attribute\n     */\n    isHTML(syntax: string): boolean {\n        return isHTML(syntax);\n    }\n\n    /**\n     * Check if given syntax is a XML dialect. Unlike HTML, XML dialects doesn’t\n     * support embedded stylesheets\n     */\n    isXML(syntax: string): boolean {\n        return isXML(syntax);\n    }\n\n    /**\n     * Check if given syntax is a JSX dialect\n     */\n    isJSX(syntax: string) {\n        return isJSX(syntax);\n    }\n\n    /**\n     * Runs given callback in context of given editor\n     */\n    run<R>(editor: CodeMirror.Editor, callback: () => R): R {\n        const { cm } = this;\n        this.cm = editor;\n        const result = callback();\n        this.cm = cm;\n        return result;\n    }\n\n    private disposeMarker() {\n        if (this.marker) {\n            this.marker.clear();\n            this.marker = null;\n        }\n\n        if (this.forcedMarker) {\n            this.forcedMarker.remove();\n            this.forcedMarker = null;\n        }\n    }\n}\n\nfunction previewField(index: number, placeholder: string) {\n    return placeholder;\n}\n\nconst proxy = new CMEditorProxy();\nconst controller = new AbbreviationTrackingController<CMEditorProxy>();\n\nexport default function initAbbreviationTracker(editor: CodeMirror.Editor) {\n    const onChange = (ed: CodeMirror.Editor) => {\n        proxy.run(ed, () => {\n            controller.handleChange(proxy, getCaret(ed));\n        });\n    };\n    const onSelectionChange = (ed: CodeMirror.Editor) => {\n        proxy.run(ed, () => {\n            const caret = getCaret(ed);\n            if (!isEnabled(ed, caret)) {\n                return;\n            }\n\n            const tracker = controller.handleSelectionChange(proxy, caret);\n            if (tracker) {\n                if (contains(tracker, caret)) {\n                    proxy.showPreview(tracker);\n                } else {\n                    proxy.hidePreview();\n                }\n            }\n        });\n    };\n\n    editor.on('change', onChange);\n    editor.on('focus', onSelectionChange);\n    editor.on('cursorActivity', onSelectionChange);\n\n    return () => {\n        proxy.run(editor, () => controller.disposeEditor(proxy));\n        editor.off('change', onChange);\n        editor.off('focus', onSelectionChange);\n        editor.off('cursorActivity', onSelectionChange);\n    };\n}\n\n/**\n * Runs given function in context of abbreviation tracker\n */\nexport function runInTrackerContext<R>(editor: CodeMirror.Editor, callback: (controller: AbbreviationTrackingController<CMEditorProxy>, proxy: CMEditorProxy) => R): R {\n    return proxy.run(editor, () => callback(controller, proxy));\n}\n\n/**\n * Check if abbreviation tracking is allowed in editor at given location\n */\nexport function allowTracking(editor: CodeMirror.Editor, pos: number): boolean {\n    if (isEnabled(editor, pos)) {\n        const syntax = syntaxFromPos(editor, pos);\n        return syntax ? isSupported(syntax) || isJSX(syntax) : false;\n    }\n\n    return false;\n}\n\n/**\n * Check if Emmet auto-complete is enabled\n */\nexport function isEnabled(editor: CodeMirror.Editor, pos: number): boolean {\n    const config = getEmmetConfig(editor);\n    return enabledForSyntax(config.mark, syntaxInfo(editor, pos));\n}\n\n/**\n * If allowed, tries to extract abbreviation from given completion context\n * @param forceValid Enforces tracker to be valid, e.g. do not track abbreviation\n * if it’s not valid\n */\nexport function extractTracker(editor: CodeMirror.Editor, pos: number, forceValid?: boolean): AbbreviationTracker | undefined {\n    return proxy.run(editor, () => {\n        const syntax = proxy.syntax();\n        const prefix = proxy.isJSX(syntax) ? JSX_PREFIX : '';\n        const config = controller.getActivationContext(proxy, pos);\n        const abbr = extract(proxy.substr(), pos, getSyntaxType(config?.syntax), { prefix });\n        if (abbr) {\n            const tracker = controller.startTracking(proxy, abbr.start, abbr.end, {\n                offset: prefix.length,\n                config\n            });\n\n            if (tracker) {\n                if (tracker.type === AbbreviationTrackerType.Error && forceValid) {\n                    controller.stopTracking(proxy, { force: true });\n                    return;\n                }\n                proxy.showPreview(tracker);\n            }\n            return tracker;\n        }\n    });\n}\n\n/**\n * Returns abbreviation tracker for given editor, if any\n */\nexport function getTracker(editor: CodeMirror.Editor): AbbreviationTracker | undefined {\n    return proxy.run(editor, () => controller.getTracker(proxy));\n}\n\n/**\n * Start abbreviation tracking in given editor for given range\n */\nexport function startTracking(editor: CodeMirror.Editor, start: number, pos: number, params?: Partial<StartTrackingParams>) {\n    return proxy.run(editor, () => {\n        const tracker = controller.startTracking(proxy, start, pos, params);\n        if (tracker) {\n            proxy.showPreview(tracker);\n        }\n\n        return tracker;\n    });\n}\n\n/**\n * Stops abbreviation tracking in given editor\n */\nexport function stopTracking(editor: CodeMirror.Editor, params?: Partial<StopTrackingParams>) {\n    return proxy.run(editor, () => controller.stopTracking(proxy, params));\n}\n\n/**\n * Returns completion item, suitable for auto-hint CodeMirror module,\n * with tracked abbreviation for it\n */\nexport function getCompletion(editor: CodeMirror.Editor, pos: number): CompletionItem | undefined {\n    const tracker = getTracker(editor) || extractTracker(editor, pos);\n    if (tracker && contains(tracker, pos) && tracker.type === AbbreviationTrackerType.Abbreviation) {\n        const { abbreviation, preview } = tracker;\n        return {\n            text: abbreviation,\n            displayText: preview,\n            hint: () => {\n                stopTracking(editor);\n                const snippet = expand(editor, abbreviation, tracker.config);\n                replaceWithSnippet(editor, tracker.range, snippet);\n            },\n            from: editor.posFromIndex(tracker.range[0]),\n            to: editor.posFromIndex(tracker.range[1]),\n        } as CompletionItem;\n    }\n}\n\n/**\n * Restore tracker on undo, if possible\n */\nexport function restoreOnUndo(editor: CodeMirror.Editor, pos: number, abbr: string) {\n    proxy.run(editor, () => {\n        const lastTracker = controller.getStoredTracker(proxy);\n\n        if (lastTracker) {\n            const shouldRestore = lastTracker.type === AbbreviationTrackerType.Abbreviation\n                && abbr === lastTracker.abbreviation\n                && lastTracker.range[0] === pos;\n\n            if (shouldRestore) {\n                controller.restoreTracker(proxy, pos);\n            }\n        }\n    })\n}\n\n/**\n * Check if tracker range contains given position\n */\nexport function contains(tracker: AbbreviationTracker, pos: number): boolean {\n    return pos >= tracker.range[0] && pos <= tracker.range[1];\n}\n","import { attributes } from '@emmetio/html-matcher';\nimport { TagMatch, findTagMatch, getTagMatches } from '@emmetio/action-utils';\nimport { getCaret, rangesEqual, substr, isQuotedString } from './utils';\nimport getEmmetConfig from './config';\n\nconst openTagMark = 'emmet-open-tag';\nconst closeTagMark = 'emmet-close-tag';\n\ninterface CMTagMatch extends TagMatch {\n    /** Open tag name preview */\n    preview?: string;\n}\n\ninterface CMMarkRange {\n    from: CodeMirror.Position;\n    to: CodeMirror.Position;\n}\n\n/**\n * Setup editor for tag matching\n */\nexport default function markTagMatches(editor: CodeMirror.Editor) {\n    let tags: TagMatch[] | null = null;\n    let lastMatch: TagMatch | null | undefined;\n    let tagPreview: HTMLElement | null = null;\n\n    /**\n     * Displays tag preview as given location, if possible\n     */\n    function showTagPreview(ed: CodeMirror.Editor, pos: number, preview: string) {\n        // Check if we already have preview at given location\n        if (!tagPreview || tagPreview.dataset.pos !== String(pos)) {\n            hidePreview();\n            tagPreview = createPreviewWidget(ed, pos, preview);\n        }\n    }\n\n    function hidePreview() {\n        if (tagPreview) {\n            tagPreview.remove();\n            tagPreview = null;\n        }\n    }\n\n    const onCursorActivity = (ed: CodeMirror.Editor) => {\n        if (!tags) {\n            tags = getTagMatches(ed.getValue());\n        }\n\n        const caret = getCaret(ed);\n        let match = findTagMatch(tags!, caret) as CMTagMatch | undefined;\n        if (match) {\n            if (!match.preview) {\n                match.preview = generatePreview(ed, match);\n            }\n\n            if (shouldDisplayTagPreview(ed, match, caret)) {\n                showTagPreview(ed, match.close![1], match.preview);\n            } else {\n                hidePreview();\n            }\n\n            // Replace full tag match with name-only match\n            const nLen = match.name.length;\n            match = {\n                ...match,\n                open: [match.open[0] + 1, match.open[0] + 1 + nLen],\n            };\n            if (match.close) {\n                match.close = [match.close[0] + 2, match.close[0] + 2 + nLen]\n            }\n        }\n\n        if (match && (!lastMatch || !rangesEqual(lastMatch.open, match.open))) {\n            clearTagMarks(ed);\n            markTagMatch(ed, match);\n        } else if (!match && lastMatch) {\n            clearTagMarks(ed);\n        }\n        lastMatch = match;\n    };\n\n    const onChange = (editor: CodeMirror.Editor) => {\n        tags = null;\n        if (getEmmetConfig(editor).autoRenameTags) {\n            const { open, close } = getTagMarks(editor);\n            if (open && close) {\n                const cursor = editor.getCursor();\n                const openRange = open.find();\n                const closeRange = close.find();\n\n                let shouldReset = false;\n                // Handle edge case when user deletes text fragment which invalidates\n                // matched tags, e.g. in `<div>1</div>` remove `>1</div`.\n                // In this case, a closing range becomes empty\n                if (isEmptyRange(editor, openRange) || isEmptyRange(editor, closeRange)) {\n                    shouldReset = true;\n                } else if (isValidAutoRenameRanges(editor, openRange, closeRange)) {\n                    if (containsPos(openRange, cursor)) {\n                        // Update happened inside open tag, update close tag as well\n                        shouldReset = updateTag(editor, openRange, closeRange);\n                    } else if (containsPos(closeRange, cursor)) {\n                        // Update happened inside close tag, update open tag as well\n                        shouldReset = updateTag(editor, closeRange, openRange);\n                    }\n                }\n\n                if (shouldReset) {\n                    // Reset last match & marker to find and re-mark new location\n                    clearTagMarks(editor);\n                    lastMatch = null;\n                }\n            }\n        }\n    }\n\n    editor.on('cursorActivity', onCursorActivity);\n    editor.on('change', onChange);\n\n    return () => {\n        clearTagMarks(editor);\n        hidePreview();\n        editor.off('cursorActivity', onCursorActivity);\n        editor.off('cursorActivity', onChange);\n        tags = lastMatch = null;\n    };\n}\n\nfunction shouldDisplayTagPreview(editor: CodeMirror.Editor, match: CMTagMatch, caret: number) {\n    return match.close && match.preview && getEmmetConfig(editor).previewOpenTag\n        && caret > match.close[0] && caret < match.close[1];\n}\n\n/**\n * Marks given tag match in editor\n */\nfunction markTagMatch(editor: CodeMirror.Editor, { open, close, preview }: CMTagMatch) {\n    createTagMark(editor, editor.posFromIndex(open[0]), editor.posFromIndex(open[1]), openTagMark);\n    if (close) {\n        createTagMark(editor, editor.posFromIndex(close[0]), editor.posFromIndex(close[1]), closeTagMark);\n    }\n}\n\n/**\n * Removes any existing tag marks in editor\n */\nfunction clearTagMarks(editor: CodeMirror.Editor) {\n    const { open, close } = getTagMarks(editor);\n    open && open.clear();\n    close && close.clear();\n}\n\n/**\n * Returns open and close tag marks in editor, if available\n */\nfunction getTagMarks(editor: CodeMirror.Editor) {\n    let open: CodeMirror.TextMarker | undefined;\n    let close: CodeMirror.TextMarker | undefined;\n    editor.getAllMarks().forEach(mark => {\n        if (mark['className'] === openTagMark) {\n            open = mark;\n        } else if (mark['className'] === closeTagMark) {\n            close = mark;\n        }\n    });\n\n    return { open, close };\n}\n\nfunction createTagMark(editor: CodeMirror.Editor, from: CodeMirror.Position, to: CodeMirror.Position, className: string, attributes?: {}) {\n    return editor.markText(from, to, {\n        className,\n        inclusiveLeft: true,\n        inclusiveRight: true,\n        clearWhenEmpty: false,\n        // @ts-ignore `attributes` key is supported\n        attributes\n    });\n}\n\n/**\n * Updates content of `dest` range with valid tag name from `source` range.\n * @returns `true` if tag markers must be updated\n */\nfunction updateTag(editor: CodeMirror.Editor, source: CMMarkRange, dest: CMMarkRange): boolean {\n    const name = editor.getRange(source.from, source.to);\n    const m = name.match(/[\\w:.-]+/);\n    const newName = m ? m[0] : '';\n\n    if (editor.getRange(dest.from, dest.to) !== newName) {\n        editor.replaceRange(newName, dest.from, dest.to);\n    }\n\n    return name !== newName;\n}\n\nfunction createPreviewWidget(editor: CodeMirror.Editor, pos: number, preview: string): HTMLElement {\n    const elem = document.createElement('div');\n    elem.className = 'emmet-tag-preview';\n    elem.innerText = preview;\n    elem.dataset.pos = String(pos);\n\n    editor.addWidget(editor.posFromIndex(pos), elem, false);\n    return elem;\n}\n\n/**\n * Generates open tag preview for given tag match\n */\nfunction generatePreview(editor: CodeMirror.Editor, match: TagMatch): string {\n    let className = '';\n    let id = '';\n    const attrs: string[] = [];\n\n    attributes(substr(editor, match.open), match.name).forEach(attr => {\n        if (attr.name === 'class' && attr.value) {\n            className = '.' + unquoted(attr.value).replace(/\\s+/g, '.');\n        } else if (attr.name === 'id' && attr.value) {\n            id = '#' + unquoted(attr.value);\n        } else {\n            attrs.push(attr.value ? `${attr.name}=${attr.value}` : attr.name);\n        }\n    });\n\n    const attrString = attrs.length ? `[${attrs.join(' ')}]` : '';\n    const suffix = id + className + attrString;\n    return suffix ? match.name + suffix : '';\n}\n\nfunction unquoted(str: string) {\n    return isQuotedString(str) ? str.slice(1, -1) : str;\n}\n\n/**\n * Check if given range contains point\n * @param exclude Exclude range end and start\n */\nfunction containsPos(range: CMMarkRange, pos: CodeMirror.Position, exclude?: boolean): boolean {\n    return exclude\n        ? comparePos(pos, range.from) > 0 && comparePos(pos, range.to) < 0\n        : comparePos(pos, range.from) >= 0 && comparePos(pos, range.to) <= 0;\n}\n\nfunction comparePos(a: CodeMirror.Position, b: CodeMirror.Position) {\n    return a.line - b.line || a.ch - b.ch;\n}\n\nfunction isValidAutoRenameRanges(editor: CodeMirror.Editor, open: CMMarkRange, close: CMMarkRange) {\n    const openName = editor.getRange(open.from, open.to);\n    const closeName = editor.getRange(close.from, close.to);\n    return openName !== closeName;\n}\n\nfunction isEmptyRange(editor: CodeMirror.Editor, range: CMMarkRange): boolean {\n    return editor.getRange(range.from, range.to) === '';\n}\n","import Scanner from '@emmetio/scanner';\n\nexport type ParseModeError = Error & { ch?: number };\n\ninterface State {\n    parseError?: ParseModeError;\n}\n\nexport function error(message: string, scanner: Scanner | CodeMirror.StringStream): ParseModeError {\n    const err = new Error(message) as ParseModeError;\n    err.ch = scanner.pos;\n    return err;\n}\n\nexport function unexpectedCharacter(stream: CodeMirror.StringStream, state: State, message = 'Unexpected character'): string {\n    state.parseError = error(message.replace(/\\s+at\\s+\\d+$/, ''), stream);\n    stream.skipToEnd();\n    return 'invalidchar';\n}\n\nexport function last<T>(arr: T[]): T {\n    return arr[arr.length - 1];\n}\n","import Scanner from '@emmetio/scanner';\nimport { getToken, BracketType, Bracket, AllTokens } from '@emmetio/abbreviation';\nimport { last, unexpectedCharacter, error, ParseModeError } from './utils';\n\ntype Context = { [ctx in BracketType]: number } & { quote: number };\n\ninterface EmmetMarkupModeState extends Context {\n    parseError?: ParseModeError;\n    braces: Bracket[];\n    scanner: Scanner;\n    tokens: AllTokens[];\n}\n\nexport default function emmetAbbreviationMode(): CodeMirror.Mode<EmmetMarkupModeState> {\n    return {\n        startState() {\n            return {\n                attribute: 0,\n                expression: 0,\n                group: 0,\n                quote: 0,\n                braces: [],\n                tokens: [],\n                scanner: new Scanner('')\n            };\n        },\n        token(stream, state) {\n            const { scanner } = state;\n            scanner.string = stream.string;\n            scanner.pos = stream.pos;\n            scanner.start = stream.start;\n            scanner.end = stream.string.length;\n\n            const ch = scanner.peek();\n            const token = getToken(scanner, state);\n\n            if (!token) {\n                return unexpectedCharacter(stream, state);\n            }\n\n            stream.pos = scanner.pos;\n\n            if (token.type === 'Quote') {\n                state.quote = ch === state.quote ? 0 : ch;\n            } else if (token.type === 'Bracket') {\n                if (token.open) {\n                    state[token.context]++;\n                    state.braces.push(token);\n                } else {\n                    state[token.context]--;\n                    const lastBrace = last(state.braces);\n                    if (lastBrace && lastBrace.context === token.context) {\n                        state.braces.pop();\n                    }\n                }\n            }\n\n            // Report if closing braces are missing at the end of abbreviation\n            if (stream.eol() && state.braces.length && !state.parseError) {\n                const pos = last(state.braces).start;\n                state.parseError = error(`No closing brace at ${pos}`, stream);\n                return null;\n            }\n\n            const name = getTokenName(token, state);\n            state.tokens.push(token);\n            return name;\n        }\n    }\n}\n\n/**\n * Returns scope name for given token\n */\nfunction getTokenName(token: AllTokens, state: EmmetMarkupModeState): string {\n    const prev = last(state.tokens)\n    switch(token.type) {\n        case 'Bracket':\n            return `bracket`;\n        case 'Field':\n            return 'variable-2';\n        case 'Literal':\n            if (state.attribute) {\n                if (prev && prev.type === 'Operator' && prev.operator === 'equal') {\n                    return 'string-2';\n                }\n                return state.quote ? 'string' : 'attribute';\n            }\n\n            if (state.quote) {\n                return 'string';\n            }\n\n            if (prev && prev.type === 'Operator') {\n                if (prev.operator === 'class') {\n                    return 'variable-2';\n                }\n\n                if (prev.operator === 'id') {\n                    return 'variable-3';\n                }\n            }\n\n            return 'tag';\n        case 'Operator':\n            if (token.operator === 'class') {\n                return 'variable-2';\n            }\n\n            if (token.operator === 'id') {\n                return 'variable-3';\n            }\n\n            return `operator ${token.operator}`;\n        case 'Repeater':\n        case 'RepeaterPlaceholder':\n            return 'meta';\n        case 'Quote':\n            return 'string';\n        case 'RepeaterNumber':\n            return 'number';\n    }\n\n    return '';\n}\n","import Scanner from '@emmetio/scanner';\nimport { getToken, AllTokens } from '@emmetio/css-abbreviation';\nimport { unexpectedCharacter, ParseModeError } from './utils';\n\ninterface EmmetStylesheetModeState {\n    parseError?: ParseModeError;\n    brackets: number;\n    scanner: Scanner;\n    tokens: AllTokens[];\n}\n\nexport default function emmetAbbreviationMode(): CodeMirror.Mode<EmmetStylesheetModeState> {\n    return {\n        startState() {\n            return {\n                brackets: 0,\n                tokens: [],\n                scanner: new Scanner('')\n            };\n        },\n        token(stream, state) {\n            const { scanner } = state;\n            scanner.string = stream.string;\n            scanner.pos = stream.pos;\n            scanner.start = stream.start;\n            scanner.end = stream.string.length;\n\n            const token = getToken(scanner, state.brackets === 0);\n\n            if (!token) {\n                return unexpectedCharacter(stream, state);\n            }\n\n            if (token.type === 'Bracket') {\n                state.brackets += token.open ? 1 : -1;\n                if (state.brackets < 0) {\n                    return unexpectedCharacter(stream, state, 'Unexpected bracket');\n                }\n            }\n\n            stream.pos = scanner.pos;\n\n            const name = getTokenName(token, state);\n            state.tokens.push(token);\n            return name;\n        }\n    }\n}\n\n/**\n * Returns scope name for given token\n */\nfunction getTokenName(token: AllTokens, state: EmmetStylesheetModeState): string | null {\n    switch (token.type) {\n        case 'Bracket':\n            return `bracket`;\n        case 'Field':\n            return 'variable-2';\n        case 'Literal':\n            return 'tag';\n        case 'Operator':\n            return `operator ${token.operator}`;\n        case 'ColorValue':\n            return 'variable-3';\n        case 'NumberValue':\n            return 'number';\n        case 'StringValue':\n            return 'string';\n    }\n\n    return null;\n}\n","/**\n * Emmet snippet name parsing mode\n */\nexport default function snippetNameMode(): CodeMirror.Mode<{}> {\n    return {\n        token(stream) {\n            if (stream.eatWhile(ident)) {\n                return 'tag';\n            }\n\n            if (stream.eat(separator)) {\n                return 'operator';\n            }\n\n            stream.skipToEnd();\n            return 'invalidchar';\n        }\n    };\n}\n\nfunction ident(ch: string): boolean {\n    return /[a-zA-Z0-9-_$@!:]/.test(ch);\n}\n\nfunction separator(ch: string): boolean {\n    return ch === '|';\n}\n","import { UserConfig } from 'emmet';\nimport { TextRange, AbbreviationTrackerType } from '@emmetio/action-utils';\nimport { pass, getCaret, replaceWithSnippet } from '../lib/utils';\nimport getEmmetConfig from '../lib/config';\nimport { getTracker, stopTracking, contains, runInTrackerContext } from '../abbreviation';\nimport { expand, extract, getOptions } from '../lib/emmet';\nimport { getSyntaxType } from '../lib/syntax';\n// import { getActivationContext } from '../abbreviation';\n\nexport default function expandAbbreviation(editor: CodeMirror.Editor, tabKey?: boolean) {\n    if (editor.somethingSelected()) {\n        return pass(editor);\n    }\n\n    if (tabKey) {\n        return expandAbbreviationWithTab(editor);\n    }\n\n    const caret = getCaret(editor);\n    const pos = editor.posFromIndex(caret);\n    const line = editor.getLine(pos.line);\n    const options = getOptions(editor, caret);\n    const abbr = extract(line, pos.ch, getSyntaxType(options.syntax));\n\n    if (abbr) {\n        const offset = caret - pos.ch;\n        runExpand(editor, abbr.abbreviation, [abbr.start + offset, abbr.end + offset], options);\n    }\n}\n\nfunction expandAbbreviationWithTab(editor: CodeMirror.Editor) {\n    // With Tab key, we should either expand tracked abbreviation\n    // or extract abbreviation from current location if abbreviation marking\n    // is not available\n    const caret = getCaret(editor);\n    if (getEmmetConfig(editor).mark) {\n        const tracker = getTracker(editor);\n\n        if (tracker && contains(tracker, caret) && tracker.type === AbbreviationTrackerType.Abbreviation) {\n            runExpand(editor, tracker.abbreviation, tracker.range, tracker.config);\n            stopTracking(editor, { skipRemove: true });\n            return;\n        }\n        return pass(editor);\n    }\n\n    return runInTrackerContext(editor, (controller, proxy) => {\n        const options = controller.getActivationContext(proxy, caret);\n        if (options) {\n            const pos = editor.posFromIndex(caret);\n            const line = editor.getLine(pos.line);\n            const abbr = extract(line, pos.ch, getSyntaxType(options.syntax));\n            if (abbr) {\n                const offset = caret - pos.ch;\n                runExpand(editor, abbr.abbreviation, [abbr.start + offset, abbr.end + offset], options);\n                return;\n            }\n        }\n        return pass(editor);\n    });\n}\n\nfunction runExpand(editor: CodeMirror.Editor, abbr: string, range: TextRange, options?: UserConfig) {\n    const snippet = expand(editor, abbr, options);\n    replaceWithSnippet(editor, range, snippet);\n}\n","import { getTracker, stopTracking } from '../abbreviation';\nimport { pass } from '../lib/utils';\n\nexport default function resetAbbreviation(editor: CodeMirror.Editor) {\n    const tracker = getTracker(editor);\n    if (tracker) {\n        stopTracking(editor, { force: true });\n    } else {\n        return pass(editor);\n    }\n}\n","import { getCaret } from '../lib/utils';\nimport { extractTracker, stopTracking } from '../abbreviation';\n\nexport default function captureAbbreviation(editor: CodeMirror.Editor) {\n    stopTracking(editor);\n    extractTracker(editor, getCaret(editor));\n}\n","import { getTracker, stopTracking, startTracking } from '../abbreviation';\nimport { textRange } from '../lib/utils';\n\nexport default function enterAbbreviationMode(editor: CodeMirror.Editor) {\n    let tracker = getTracker(editor);\n    stopTracking(editor);\n    if (tracker && tracker.forced) {\n        // Already have forced abbreviation: act as toggler\n        return;\n    }\n\n    const [from, to] = textRange(editor, editor.listSelections()[0]);\n\n    tracker = startTracking(editor, from, to, { forced: true });\n    if (from !== to) {\n        editor.setSelection(editor.posFromIndex(to));\n    }\n}\n","import { pass } from '../lib/utils';\nimport { getIndentation, lineIndent } from '../lib/output';\n\ninterface Sel {\n    anchor: CodeMirror.Position;\n    head: CodeMirror.Position;\n}\n\nexport default function insertLineBreak(editor: CodeMirror.Editor) {\n    const between = editor.listSelections().map(sel => betweenTags(editor, sel.anchor, sel.head));\n\n    if (!between.some(Boolean)) {\n        return pass(editor);\n    }\n\n    editor.operation(() => {\n        const sels = editor.listSelections();\n        // @ts-ignore Invalid docs for Document\n        const nl = editor.getDoc().lineSeparator();\n        const indent = getIndentation(editor);\n\n        // Step 1: insert newlines either single or double depending on selection\n        const nextSels: Sel[] = [];\n        for (let i = sels.length - 1; i >= 0; i--) {\n            const sel = sels[i];\n            const base = lineIndent(editor, sel.anchor.line);\n            let nextIndent = base;\n            if (between[i]) {\n                nextIndent += indent;\n                editor.replaceRange( nl + nextIndent + nl + base, sel.anchor, sel.head);\n            } else {\n                editor.replaceRange(nl + base, sel.anchor, sel.head);\n            }\n\n            const nextPos: CodeMirror.Position = {\n                line: sel.anchor.line + 1,\n                ch: nextIndent.length\n            };\n            nextSels.unshift({ anchor: nextPos, head: nextPos });\n        }\n\n        editor.setSelections(nextSels);\n    });\n}\n\n/**\n * Check if given range is a single caret between tags\n */\nfunction betweenTags(editor: CodeMirror.Editor, anchor: CodeMirror.Position, head: CodeMirror.Position) {\n    if (equalCursorPos(anchor, head)) {\n        const mode = editor.getModeAt(anchor);\n\n        if (mode.name === 'xml') {\n            const left = editor.getTokenAt(anchor);\n            const right = editor.getTokenAt(Object.assign({}, anchor, { ch: anchor.ch + 1 }));\n\n            return left.type === 'tag bracket' && left.string === '>'\n                && right.type === 'tag bracket' && right.string === '</';\n        }\n    }\n}\n\n// Compare two positions, return 0 if they are the same, a negative\n// number when a is less, and a positive number otherwise.\nfunction cmp(a: CodeMirror.Position, b: CodeMirror.Position) {\n    return a.line - b.line || a.ch - b.ch;\n}\n\nfunction equalCursorPos(a: CodeMirror.Position, b: CodeMirror.Position) {\n    return a.sticky === b.sticky && cmp(a, b) === 0;\n}\n","import { TextRange } from '@emmetio/action-utils';\nimport { getOptions, getTagContext, ContextTag, expand } from '../lib/emmet';\nimport { getCaret, narrowToNonSpace, replaceWithSnippet, substr, errorSnippet, textRange } from '../lib/utils';\nimport { docSyntax, isXML } from '../lib/syntax';\nimport { lineIndent } from '../lib/output';\n\nconst baseClass = 'emmet-panel';\nconst errClass = 'emmet-error';\n\nexport default function wrapWithAbbreviation(editor: CodeMirror.Editor) {\n    const syntax = docSyntax(editor);\n    const caret = getCaret(editor);\n    const context = getTagContext(editor, caret, isXML(syntax));\n    const wrapRange = getWrapRange(editor, getSelection(editor), context);\n    const options = getOptions(editor, wrapRange[0]);\n    options.text = getContent(editor, wrapRange, true);\n\n    let panel = createInputPanel();\n    let input = panel.querySelector('input')!;\n    let errContainer = panel.querySelector(`.${baseClass}-error`)!;\n    let updated = false;\n\n    function onInput(evt: InputEvent) {\n        evt && evt.stopPropagation();\n        undo();\n        const abbr = input.value.trim();\n        if (!abbr) {\n            return;\n        }\n\n        try {\n            const snippet = expand(editor, abbr, options);\n            replaceWithSnippet(editor, wrapRange, snippet);\n            updated = true;\n            if (panel.classList.contains(errClass)) {\n                errContainer.innerHTML = '';\n                panel.classList.remove(errClass);\n            }\n        } catch (err) {\n            updated = false;\n            panel.classList.add(errClass);\n            errContainer.innerHTML = errorSnippet(err);\n            console.error(err);\n        }\n    };\n\n    function onKeyDown(evt: KeyboardEvent) {\n        if (evt.keyCode === 27 /* ESC */) {\n            evt.stopPropagation();\n            evt.preventDefault();\n            cancel();\n        } else if (evt.keyCode === 13 /* Enter */) {\n            evt.stopPropagation();\n            evt.preventDefault();\n            submit();\n        }\n    };\n\n    function undo() {\n        if (updated) {\n            editor.undo();\n        }\n    }\n\n    function cancel() {\n        undo();\n        dispose();\n        editor.focus();\n    }\n\n    function submit() {\n        // Changes should already be applied to editor\n        dispose();\n        editor.focus();\n    }\n\n    function dispose() {\n        input.removeEventListener('input', onInput);\n        input.removeEventListener('change', onInput);\n        input.removeEventListener('paste', onInput);\n        input.removeEventListener('keydown', onKeyDown);\n        input.removeEventListener('blur', cancel);\n        panel.remove();\n        // @ts-ignore Dispose element references\n        panel = input = errContainer = null;\n    }\n\n    // Expose internals to programmatically submit or cancel command\n    panel['emmet'] = { submit, cancel, update: onInput };\n\n    input.addEventListener('input', onInput);\n    input.addEventListener('change', onInput);\n    input.addEventListener('paste', onInput);\n    input.addEventListener('keydown', onKeyDown);\n    editor.getWrapperElement().appendChild(panel);\n    input.focus();\n}\n\nfunction createInputPanel(): HTMLElement {\n    const elem = document.createElement('div');\n    elem.className = baseClass;\n    elem.innerHTML = `<div class=\"${baseClass}-wrapper\">\n        <input type=\"text\" placeholder=\"Enter abbreviation\" autofocus />\n        <div class=\"${baseClass}-error\"></div>\n    </div>`;\n    return elem;\n}\n\nfunction getWrapRange(editor: CodeMirror.Editor, range: TextRange, context?: ContextTag): TextRange {\n    if (range[0] === range[1] && context) {\n        // No selection means user wants to wrap current tag container\n        const { open, close } = context;\n        const pos = range[0];\n\n        // Check how given point relates to matched tag:\n        // if it's in either open or close tag, we should wrap tag itself,\n        // otherwise we should wrap its contents\n\n        if (inRange(open, pos) || (close && inRange(close, pos))) {\n            return [open[0], close ? close[1] : open[1]];\n        }\n\n        if (close) {\n            return narrowToNonSpace(editor, [open[1], close[0]]);\n        }\n    }\n\n    return range;\n}\n\n/**\n * Returns contents of given region, properly de-indented\n */\nfunction getContent(editor: CodeMirror.Editor, range: TextRange, lines = false): string | string[] {\n    const pos = editor.posFromIndex(range[0]);\n    const baseIndent = lineIndent(editor, pos.line);\n    const srcLines = substr(editor, range).split('\\n');\n    const destLines = srcLines.map(line => {\n        return line.startsWith(baseIndent)\n            ? line.slice(baseIndent.length)\n            : line;\n    });\n\n    return lines ? destLines : destLines.join('\\n');\n}\n\nfunction inRange(range: TextRange, pt: number): boolean {\n    return range[0] < pt && pt < range[1];\n}\n\nfunction getSelection(editor: CodeMirror.Editor): TextRange {\n    return textRange(editor, editor.listSelections()[0]);\n}\n","import { TextRange } from '@emmetio/action-utils';\nimport { isCSS, isXML, docSyntax, isHTML } from '../lib/syntax';\nimport { balanceCSS, balance } from '../lib/emmet';\nimport { getContent, textRange, rangeContains, rangesEqual, pass } from '../lib/utils';\n\nexport default function balanceAction(editor: CodeMirror.Editor, inward?: boolean) {\n    const syntax = docSyntax(editor);\n\n    if (isHTML(syntax) || isCSS(syntax)) {\n        const ranges = inward\n            ? balanceActionInward(editor, syntax)\n            : balanceActionOutward(editor, syntax);\n\n        editor.setSelections(ranges.map(r => ({\n            anchor: editor.posFromIndex(r[0]),\n            head: editor.posFromIndex(r[1]),\n        })));\n    } else {\n        return pass(editor);\n    }\n}\n\n/**\n * Pushes given `range` into `ranges` list on if it’s not the same as last one\n */\nfunction pushRange(ranges: TextRange[], range: TextRange) {\n    const last = ranges[ranges.length - 1];\n    if (!last || !rangesEqual(last, range)) {\n        ranges.push(range);\n    }\n}\n\n/**\n * Returns regions for balancing\n */\nfunction getRanges(editor: CodeMirror.Editor, pos: number, syntax: string, inward?: boolean): TextRange[] {\n    const content = getContent(editor);\n    if (isCSS(syntax)) {\n        return balanceCSS(content, pos, inward);\n    }\n\n    const result: TextRange[] = [];\n    const tags = balance(content, pos, inward, isXML(syntax));\n\n    for (const tag of tags) {\n        if (tag.close) {\n            // Inner range\n            pushRange(result, [tag.open[1], tag.close[0]]);\n            // Outer range\n            pushRange(result, [tag.open[0], tag.close[1]]);\n        } else {\n            pushRange(result, [tag.open[0], tag.open[1]]);\n        }\n    }\n\n    return result.sort((a, b) => {\n        return inward ? a[0] - b[0] : b[0] - a[0];\n    });\n}\n\n/**\n * Returns inward balanced ranges from current view's selection\n */\nfunction balanceActionInward(editor: CodeMirror.Editor, syntax: string): TextRange[] {\n    const result: TextRange[] = [];\n\n    for (const sel of editor.listSelections()) {\n        const selRange = textRange(editor, sel);\n        const ranges = getRanges(editor, selRange[0], syntax, true);\n\n        // Try to find range which equals to selection: we should pick leftmost\n        let ix = ranges.findIndex(r => rangesEqual(selRange, r));\n        let targetRange: TextRange | undefined;\n\n        if (ix < ranges.length - 1) {\n            targetRange = ranges[ix + 1];\n        } else if (ix !== -1) {\n            // No match found, pick closest region\n            targetRange = ranges.find(r => rangeContains(r, selRange));\n        }\n\n        result.push(targetRange || selRange);\n    }\n\n    return result;\n}\n\n/**\n * Returns outward balanced ranges from current view's selection\n */\nfunction balanceActionOutward(editor: CodeMirror.Editor, syntax: string): TextRange[] {\n    const result: TextRange[] = [];\n    for (const sel of editor.listSelections()) {\n        const selRange = textRange(editor, sel);\n        const ranges = getRanges(editor, selRange[0], syntax);\n        const targetRange = ranges.find(r => rangeContains(r, selRange) && r[1] > selRange[1]);\n        result.push(targetRange || selRange);\n    }\n\n    return result;\n}\n\n","import Scanner from '@emmetio/scanner';\nimport { scan, createOptions, ElementType, ScannerOptions } from '@emmetio/html-matcher';\nimport matchCSS from '@emmetio/css-matcher';\nimport { TextRange } from '@emmetio/action-utils';\nimport { isSpace, getContent, narrowToNonSpace, textRange, rangeEmpty, substr, toRange } from '../lib/utils';\nimport { isHTML, isXML, isCSS, syntaxInfo } from '../lib/syntax';\n\ninterface Block {\n    range: TextRange;\n    commentStart?: string;\n    commentEnd?: string;\n}\n\ninterface Tag {\n    name: string;\n    start: number;\n    end: number;\n}\n\ntype CommentTokens = [string, string];\n\nconst htmlComment: CommentTokens = ['<!--', '-->'];\nconst cssComment: CommentTokens = ['/*', '*/'];\n\nexport default function comment(editor: CodeMirror.Editor) {\n    const selection = editor.listSelections().slice().reverse();\n    editor.operation(() => {\n        for (const sel of selection) {\n            const selRange = textRange(editor, sel);\n            const { syntax } = syntaxInfo(editor, selRange[0]);\n            const tokens = syntax && isCSS(syntax) ? cssComment : htmlComment;\n            const block = getRangeForComment(editor, selRange[0]);\n\n            if (block && block.commentStart) {\n                // Caret inside comment, strip it\n                removeComment(editor, block);\n            } else if (block && rangeEmpty(selRange)) {\n                // Wrap block with comments but remove inner comments first\n                let removed = 0;\n                for (const c of getCommentRegions(editor, block.range, tokens).reverse()) {\n                    removed += removeComment(editor, c);\n                }\n\n                addComment(editor, [block.range[0], block.range[1] - removed], tokens);\n            } else if (!rangeEmpty(selRange)) {\n                // No matching block, comment selection\n                addComment(editor, selRange, tokens);\n            } else {\n                // No matching block, comment line\n\n                const line = editor.getLine(sel.anchor.line);\n                const lineRange = textRange(editor, {\n                    anchor: { line: sel.anchor.line, ch: 0 },\n                    head: { line: sel.anchor.line, ch: line.length },\n                })\n                addComment(editor, narrowToNonSpace(editor, lineRange), tokens);\n            }\n        }\n    });\n}\n\n/**\n * Removes comment markers from given region. Returns amount of characters removed\n */\nfunction removeComment(editor: CodeMirror.Editor, { range, commentStart, commentEnd }: Block): number {\n    const text = substr(editor, range);\n\n    if (commentStart && text.startsWith(commentStart)) {\n        let startOffset = commentStart.length;\n        let endOffset = commentEnd && text.endsWith(commentEnd)\n            ? commentEnd.length\n            : 0;\n\n        // Narrow down offsets for whitespace\n        if (isSpace(text[startOffset])) {\n            startOffset += 1;\n        }\n\n        if (endOffset && isSpace(text[text.length - endOffset - 1])) {\n            endOffset += 1;\n        }\n\n        const r1 = toRange(editor, [range[1] - endOffset, range[1]]);\n        const r2 = toRange(editor, [range[0], range[0] + startOffset]);\n        editor.replaceRange('', r1[0], r1[1]);\n        editor.replaceRange('', r2[0], r2[1]);\n\n        return startOffset + endOffset;\n    }\n\n    return 0;\n}\n\n/**\n * Adds comments around given range\n */\nfunction addComment(editor: CodeMirror.Editor, range: TextRange, tokens: CommentTokens) {\n    const [from, to] = toRange(editor, range);\n    editor.replaceRange(' ' + tokens[1], to, to);\n    editor.replaceRange(tokens[0] + ' ', from, from);\n}\n\n/**\n * Finds comments inside given region and returns their regions\n */\nfunction getCommentRegions(editor: CodeMirror.Editor, range: TextRange, tokens: CommentTokens): Block[] {\n    const result: Block[] = [];\n    const text = substr(editor, range);\n    let start = range[0];\n    let offset = 0\n\n    while (true) {\n        const commentStart = text.indexOf(tokens[0], offset);\n        if (commentStart !== -1) {\n            offset = commentStart + tokens[0].length;\n\n            // Find comment end\n            const commentEnd = text.indexOf(tokens[1], offset);\n            if (commentEnd !== -1) {\n                offset = commentEnd + tokens[1].length;\n                result.push({\n                    range: [start + commentStart, start + offset],\n                    commentStart: tokens[0],\n                    commentEnd: tokens[1],\n                });\n            }\n        } else {\n            break;\n        }\n    }\n\n    return result;\n}\n\nfunction getRangeForComment(editor: CodeMirror.Editor, pos: number): Block | undefined {\n    const { syntax } = syntaxInfo(editor, pos);\n    if (!syntax) {\n        return;\n    }\n\n    if (isHTML(syntax)) {\n        return getHTMLBlockRange(getContent(editor), pos, isXML(syntax));\n    }\n\n    if (isCSS(syntax)) {\n        const content = getContent(editor);\n        const comment = findCSSComment(content, pos);\n        if (comment) {\n            return comment;\n        }\n\n        const css = matchCSS(content, pos);\n        if (css) {\n            return {\n                range: [css.start, css.end]\n            };\n        }\n    }\n}\n\n/**\n * Returns range for comment toggling\n */\nfunction getHTMLBlockRange(source: string, pos: number, xml = false): Block | undefined {\n    // Since we expect large input document, we’ll use pooling technique\n    // for storing tag data to reduce memory pressure and improve performance\n    const pool: Tag[] = [];\n    const stack: Tag[] = [];\n    const options = createOptions({ xml, allTokens: true });\n    let result: Block | undefined;\n\n    scan(source, (name, type, start, end) => {\n        if (type === ElementType.Open && isSelfClose(name, options)) {\n            // Found empty element in HTML mode, mark is as self-closing\n            type = ElementType.SelfClose;\n        }\n\n        if (type === ElementType.Open) {\n            // Allocate tag object from pool\n            stack.push(allocTag(pool, name, start, end));\n        } else if (type === ElementType.SelfClose) {\n            if (start < pos && pos < end) {\n                // Matched given self-closing tag\n                result = { range: [start, end] };\n                return false;\n            }\n        } else if (type === ElementType.Close) {\n            const tag = last(stack);\n            if (tag && tag.name === name) {\n                // Matching closing tag found\n                if (tag.start < pos && pos < end) {\n                    result = {\n                        range: [tag.start, end],\n                    };\n                    return false;\n                } else if (stack.length) {\n                    // Release tag object for further re-use\n                    releaseTag(pool, stack.pop()!);\n                }\n            }\n        } else if (start < pos && pos < end) {\n            // Found other token that matches given location\n            result = { range: [start, end] };\n            if (type === ElementType.Comment) {\n                result.commentStart = htmlComment[0];\n                result.commentEnd = htmlComment[1];\n            }\n            return false;\n        }\n    }, options);\n\n    stack.length = pool.length = 0;\n    return result;\n}\n\n/**\n * If given `pos` location is inside CSS comment in given `code`, returns its\n * range\n */\nfunction findCSSComment(code: string, pos: number): Block | undefined {\n    const enum Chars {\n        Asterisk = 42,\n        Slash = 47,\n        Backslash = 92,\n        LF = 10,\n        CR = 13,\n    };\n    const scanner = new Scanner(code);\n\n    while (!scanner.eof() && pos > scanner.pos) {\n        const start = scanner.pos;\n\n        if (consumeSeq2(scanner, Chars.Slash, Chars.Asterisk)) {\n            // Consumed multiline comment start\n            while (!scanner.eof() && !consumeSeq2(scanner, Chars.Asterisk, Chars.Slash)) {\n                scanner.pos++;\n            }\n\n            if (start < pos && pos < scanner.pos) {\n                return {\n                    range: [start, scanner.pos],\n                    commentStart: cssComment[0],\n                    commentEnd: cssComment[1],\n                };\n            }\n        } else if (consumeSeq2(scanner, Chars.Slash, Chars.Slash)) {\n            // Consumed single-line comment\n            while (!scanner.eof() && !scanner.eat(Chars.CR) && !scanner.eat(Chars.LF)) {\n                scanner.pos++;\n            }\n            if (start < pos && pos < scanner.pos) {\n                return {\n                    range: [start, scanner.pos],\n                    commentStart: '//',\n                };\n            }\n        } else {\n            scanner.pos++;\n        }\n    }\n}\n\n/**\n * Returns `true` if both `ch1` and `ch2` where consumed\n */\nfunction consumeSeq2(scanner: Scanner, ch1: number, ch2: number): boolean {\n    const { pos } = scanner;\n    if (scanner.eat(ch1) && scanner.eat(ch2)) {\n        return true;\n    }\n\n    scanner.pos = pos;\n    return false;\n}\n\n/**\n * Check if given tag is self-close for current parsing context\n */\nfunction isSelfClose(name: string, options: ScannerOptions) {\n    return !options.xml && options.empty.includes(name);\n}\n\nfunction allocTag(pool: Tag[], name: string, start: number, end: number): Tag {\n    if (pool.length) {\n        const tag = pool.pop()!;\n        tag.name = name;\n        tag.start = start;\n        tag.end = end;\n        return tag;\n    }\n    return { name, start, end };\n}\n\nfunction releaseTag(pool: Tag[], tag: Tag) {\n    pool.push(tag);\n}\n\nfunction last<T>(arr: T[]): T | null {\n    return arr.length ? arr[arr.length - 1] : null;\n}\n","import { evaluateMath } from '../lib/emmet';\n\nexport default function evaluateMathCommand(editor: CodeMirror.Editor) {\n    const cursor = editor.getCursor();\n    const line = editor.getLine(cursor.line);\n    const expr = evaluateMath(line, cursor.ch);\n\n    if (expr) {\n        const from = { line: cursor.line, ch: expr.start };\n        const to = { line: cursor.line, ch: expr.end };\n        editor.replaceRange(expr.snippet, from, to);\n    }\n}\n","import { getContent, isQuote, isSpace, getCaret } from '../lib/utils';\n\nexport default function goToEditPoint(editor: CodeMirror.Editor, inc: number) {\n    const caret = getCaret(editor);\n    const pos = findNewEditPoint(editor, caret + inc, inc);\n    if (pos != null) {\n        editor.setCursor(editor.posFromIndex(pos));\n    }\n}\n\nfunction findNewEditPoint(editor: CodeMirror.Editor, pos: number, inc: number): number | undefined {\n    const doc = getContent(editor);\n    const docSize = doc.length;\n    let curPos = pos;\n\n    while (curPos < docSize && curPos >= 0) {\n        curPos += inc;\n        const cur = doc[curPos];\n        const next = doc[curPos + 1];\n        const prev = doc[curPos - 1];\n\n        if (isQuote(cur) && next === cur && prev === '=') {\n            // Empty attribute value\n            return curPos + 1;\n        }\n\n        if (cur === '<' && prev === '>') {\n            // Between tags\n            return curPos;\n        }\n\n        if (isNewLine(cur)) {\n            const pt = editor.posFromIndex(curPos);\n            const line = editor.getLine(pt.line);\n            if (!line || isSpace(line)) {\n                // Empty line\n                return editor.indexFromPos({\n                    line: pt.line,\n                    ch: line.length\n                });\n            }\n        }\n    }\n}\n\nfunction isNewLine(ch: string) {\n    return ch === '\\r' || ch === '\\n';\n}\n","import { TextRange } from '@emmetio/action-utils';\nimport { getCaret, substr } from '../lib/utils';\nimport { isHTML, isXML, syntaxInfo } from '../lib/syntax';\nimport { getTagContext } from '../lib/emmet';\n\nexport default function goToTagPair(editor: CodeMirror.Editor) {\n    let caret = getCaret(editor);\n    const nextRange: TextRange = [caret, Math.min(caret + 1, editor.getValue().length)];\n    if (substr(editor, nextRange) === '<') {\n        caret++;\n    }\n\n    const { syntax } = syntaxInfo(editor, caret);\n    if (isHTML(syntax)) {\n        const ctx = getTagContext(editor, caret, isXML(syntax));\n        if (ctx && ctx.open && ctx.close) {\n            const { open, close } = ctx;\n            const nextPos = open[0] <= caret && caret < open[1]\n                ? close[0]\n                : open[0];\n\n            editor.setCursor(editor.posFromIndex(nextPos));\n        }\n    }\n}\n","import { isNumber } from '@emmetio/scanner';\nimport { textRange, rangeEmpty, substr, replaceWithSnippet } from '../lib/utils';\n\nexport default function incrementNumber(editor: CodeMirror.Editor, delta = 1) {\n    editor.operation(() => {\n        const nextRanges = editor.listSelections().slice().reverse().map(sel => {\n            let selRange = textRange(editor, sel);\n            if (rangeEmpty(selRange)) {\n                // No selection, extract number\n                const line = editor.getLine(sel.anchor.line);\n                const offset = sel.anchor.ch;\n                const numRange = extractNumber(line, offset);\n                if (numRange) {\n                    selRange = [\n                        selRange[0] - offset + numRange[0],\n                        selRange[0] - offset + numRange[1],\n                    ]\n                }\n            }\n\n            if (!rangeEmpty(selRange)) {\n                // Try to update value in given region\n                let value = updateNumber(substr(editor, selRange), delta);\n                replaceWithSnippet(editor, selRange, value);\n                sel = {\n                    anchor: editor.posFromIndex(selRange[0]),\n                    head: editor.posFromIndex(selRange[0] + value.length)\n                };\n            }\n\n            return sel;\n        });\n\n        editor.setSelections(nextRanges);\n    });\n}\n\n/**\n * Extracts number from text at given location\n */\nfunction extractNumber(text: string, pos: number): [number, number] | undefined {\n    let hasDot = false;\n    let end = pos;\n    let start = pos;\n    let ch: number;\n    const len = text.length;\n\n    // Read ahead for possible numbers\n    while (end < len) {\n        ch = text.charCodeAt(end);\n        if (isDot(ch)) {\n            if (hasDot) {\n                break;\n            }\n            hasDot = true;\n        } else if (!isNumber(ch)) {\n            break;\n        }\n        end++;\n    }\n\n    // Read backward for possible numerics\n    while (start >= 0) {\n        ch = text.charCodeAt(start - 1);\n        if (isDot(ch)) {\n            if (hasDot) {\n                break;\n            }\n            hasDot = true;\n        } else if (!isNumber(ch)) {\n            break;\n        }\n        start--;\n    }\n\n    // Negative number?\n    if (start > 0 && text[start - 1] === '-') {\n        start--;\n    }\n\n    if (start !== end) {\n        return [start, end];\n    }\n}\n\nfunction updateNumber(num: string, delta: number, precision = 3): string {\n    const value = parseFloat(num) + delta;\n\n    if (isNaN(value)) {\n        return num;\n    }\n\n    const neg = value < 0;\n    let result = Math.abs(value).toFixed(precision);\n\n    // Trim trailing zeroes and optionally decimal number\n    result = result.replace(/\\.?0+$/, '');\n\n    // Trim leading zero if input value doesn't have it\n    if ((num[0] === '.' || num.startsWith('-.')) && result[0] === '0') {\n        result = result.slice(1);\n    }\n\n    return (neg ? '-' : '') + result;\n}\n\nfunction isDot(ch: number) {\n    return ch === 46;\n}\n","import { TextRange } from '@emmetio/action-utils';\nimport { getTagContext, ContextTag } from '../lib/emmet';\nimport { narrowToNonSpace, isSpace as isSpaceText, replaceWithSnippet, substr, rangeEmpty } from '../lib/utils';\nimport { lineIndent } from '../lib/output';\n\nexport default function removeTagCommand(editor: CodeMirror.Editor) {\n    editor.operation(() => {\n        const nextRanges = editor.listSelections().slice().reverse().map(sel => {\n            const tag = getTagContext(editor, editor.indexFromPos(sel.anchor));\n            if (tag) {\n                removeTag(editor, tag);\n                const pos = editor.posFromIndex(tag.open[0]);\n                return {\n                    anchor: pos,\n                    head: pos\n                };\n            }\n\n            return sel;\n        });\n\n        editor.setSelections(nextRanges);\n    });\n}\n\nfunction removeTag(editor: CodeMirror.Editor, { open, close }: ContextTag) {\n    if (close) {\n        // Remove open and close tag and dedent inner content\n        const innerRange = narrowToNonSpace(editor, [open[1], close[0]]);\n        if (!rangeEmpty(innerRange)) {\n            // Gracefully remove open and close tags and tweak indentation on tag contents\n            replaceWithSnippet(editor, [innerRange[1], close[1]], '');\n\n            const start = editor.posFromIndex(open[0]);\n            const end = editor.posFromIndex(close[1]);\n            if (start.line !== end.line) {\n                // Skip two lines: first one for open tag, on second one\n                // indentation will be removed with open tag\n                let line = start.line + 2;\n                const baseIndent = getLineIndent(editor, open[0]);\n                const innerIndent = getLineIndent(editor, innerRange[0]);\n\n                while (line <= end.line) {\n                    const lineStart = editor.indexFromPos({ line, ch: 0 });\n                    const indentRange: TextRange = [lineStart, lineStart + innerIndent.length];\n                    if (isSpaceText(substr(editor, indentRange))) {\n                        console.log('replace \"%s\" with \"%s\"', substr(editor, indentRange), baseIndent);\n                        replaceWithSnippet(editor, indentRange, baseIndent);\n                    }\n                    line++;\n                }\n            }\n\n            replaceWithSnippet(editor, [open[0], innerRange[0]], '');\n        } else {\n            replaceWithSnippet(editor, [open[0], close[1]], '');\n        }\n    } else {\n        replaceWithSnippet(editor, open, '');\n    }\n}\n\n/**\n * Returns indentation for line found from given character location\n */\nfunction getLineIndent(editor: CodeMirror.Editor, ix: number): string {\n    return lineIndent(editor, editor.posFromIndex(ix).line);\n}\n\n","import { TextRange } from '@emmetio/action-utils';\nimport { isCSS, isHTML, docSyntax } from '../lib/syntax';\nimport { getContent, toRange, textRange, rangesEqual, rangeContains } from '../lib/utils';\nimport { selectItem } from '../lib/emmet';\n\nexport default function selectItemCommand(editor: CodeMirror.Editor, isPrev = false) {\n    const syntax = docSyntax(editor);\n\n    if (!isCSS(syntax) && !isHTML(syntax)) {\n        return;\n    }\n\n    const sel = editor.listSelections()[0];\n    const selRange = textRange(editor, sel);\n    const code = getContent(editor);\n    let model = selectItem(code, selRange[0], isCSS(syntax), isPrev);\n\n    if (model) {\n        let range = findRange(selRange, model.ranges, isPrev);\n        if (!range) {\n            // Out of available selection range, move to next item\n            const nextPos = isPrev ? model.start : model.end;\n            model = selectItem(code, nextPos, isCSS(syntax), isPrev);\n            if (model) {\n                range = findRange(selRange, model.ranges, isPrev)\n            }\n        }\n\n        if (range) {\n            const [from, to] = toRange(editor, range);\n            editor.setSelection(from, to);\n        }\n    }\n}\n\nfunction findRange(sel: TextRange, ranges: TextRange[], reverse = false) {\n    if (reverse) {\n        ranges = ranges.slice().reverse();\n    }\n\n    let getNext = false;\n    let candidate: TextRange | undefined;\n\n    for (const r of ranges) {\n        if (getNext) {\n            return r;\n        }\n        if (  rangesEqual(r, sel)) {\n            // This range is currently selected, request next\n            getNext = true;\n        } else if (!candidate && (rangeContains(r, sel) || (reverse && r[0] <= sel[0]) || (!reverse && r[0] >= sel[0]))) {\n            candidate = r;\n        }\n    }\n\n    if (!getNext) {\n        return candidate;\n    }\n}\n","import { isXML, syntaxInfo } from '../lib/syntax';\nimport { getTagContext } from '../lib/emmet';\nimport { isSpace, substr, replaceWithSnippet, CMRange } from '../lib/utils';\n\nexport default function splitJoinTag(editor: CodeMirror.Editor) {\n    const selections = editor.listSelections().slice().reverse();\n    const nextRanges: CMRange[] = [];\n\n    editor.operation(() => {\n        for (const sel of selections) {\n            const pos = editor.indexFromPos(sel.anchor);\n            const { syntax } = syntaxInfo(editor, pos);\n            const tag = getTagContext(editor, pos, isXML(syntax));\n\n            if (tag) {\n                const { open, close } = tag;\n                if (close) {\n                    // Join tag: remove tag contents, if any, and add closing slash\n                    replaceWithSnippet(editor, [open[1], close[1]], '');\n                    let closing = isSpace(getChar(editor, open[1] - 2)) ? '/' : ' /';\n                    replaceWithSnippet(editor, [open[1] - 1, open[1] - 1], closing);\n                    nextRanges.push(createRange(editor, open[1] + closing.length));\n                } else {\n                    // Split tag: add closing part and remove closing slash\n                    const endTag = `</${tag.name}>`;\n\n                    replaceWithSnippet(editor, [open[1], open[1]], endTag);\n                    if (getChar(editor, open[1] - 2) === '/') {\n                        let start = open[1] - 2;\n                        let end = open[1] - 1;\n                        if (isSpace(getChar(editor, start - 1))) {\n                            start--;\n                        }\n\n                        replaceWithSnippet(editor, [start, end], '');\n                        nextRanges.push(createRange(editor, open[1] - end + start));\n                    } else {\n                        nextRanges.push(createRange(editor, open[1]));\n                    }\n                }\n            } else {\n                nextRanges.push(sel);\n            }\n        }\n        editor.setSelections(nextRanges);\n    });\n}\n\nfunction getChar(editor: CodeMirror.Editor, pos: number): string {\n    return substr(editor, [pos, pos + 1]);\n}\n\nfunction createRange(editor: CodeMirror.Editor, pos: number): CMRange {\n    const p = editor.posFromIndex(pos);\n    return {\n        anchor: p,\n        head: p\n    };\n}\n","import { UserConfig } from 'emmet';\nimport { parse as parseMarkup, tokenize as tokenizeMarkup, MarkupAbbreviation } from '@emmetio/abbreviation';\nimport { parser as parseStylesheet, tokenize as tokenizeStylesheet, CSSAbbreviation } from '@emmetio/css-abbreviation';\nimport CodeMirror from 'codemirror';\nimport getEmmetConfig, { defaultConfig, EmmetConfig, EmmetEditorOptions } from './lib/config';\n\nimport abbreviationTracker, { extractTracker, allowTracking, getCompletion, restoreOnUndo } from './abbreviation';\n\n// import { extractTracker, allowTracking } from './abbreviation';\n// import { startTracking } from './abbreviation/AbbreviationTracker';\n\nimport matchTags from './lib/match-tags';\nimport markupMode from './mode/markup';\nimport stylesheetMode from './mode/stylesheet';\nimport snippetMode from './mode/snippet';\n\nimport expandAbbreviation from './commands/expand-abbreviation';\nimport emmetResetAbbreviation from './commands/reset-abbreviation'\nimport emmetCaptureAbbreviation from './commands/capture-abbreviation'\nimport emmetEnterAbbreviationMode from './commands/enter-abbreviation';\nimport emmetInsertLineBreak from './commands/insert-line-break';\nimport emmetWrapWithAbbreviation from './commands/wrap-with-abbreviation';\nimport emmetBalance from './commands/balance';\nimport emmetToggleComment from './commands/comment';\nimport emmetEvaluateMath from './commands/evaluate-math';\nimport goToEditPoint from './commands/go-to-edit-point';\nimport emmetGoToTagPair from './commands/go-to-tag-pair';\nimport incrementNumber from './commands/inc-dec-number';\nimport emmetRemoveTag from './commands/remove-tag';\nimport selectItem from './commands/select-item';\nimport emmetSplitJoinTag from './commands/split-join-tag';\nimport { expand, getOptions } from './lib/emmet';\nimport { getInternalState, hasInternalState } from './lib/utils';\n\nexport interface EmmetEditor extends CodeMirror.Editor {\n    /**\n     * Expands given abbreviation with options, defined for current editor\n     */\n    expandAbbreviation(abbr: string, options?: UserConfig): string;\n    /**\n     * Returns Emmet config for given location in editor\n     */\n    emmetOptions(pos?: number, withContext?: boolean): UserConfig;\n\n    /** Parses given abbreviation to AST or throws exception if abbreviation is invalid */\n    parseAbbreviation(abbr: string, type: 'markup' | 'jsx'): MarkupAbbreviation;\n    parseAbbreviation(abbr: string, type: 'stylesheet'): CSSAbbreviation;\n    getEmmetCompletion(pos: number | CodeMirror.Position): CompletionItem;\n}\n\ninterface CompletionItem {\n    text: string;\n    displayText: string;\n    hint(): void;\n    from: CodeMirror.Position;\n    to: CodeMirror.Position;\n}\n\n/**\n * Registers Emmet extension on given CodeMirror constructor.\n * This file is designed to be imported somehow into the app (CommonJS, ES6,\n * Rollup/Webpack/whatever). If you simply want to add a <script> into your page\n * that registers Emmet extension on global CodeMirror constructor, use\n * `browser.js` instead\n */\nexport default function registerEmmetExtension(CM: typeof CodeMirror) {\n    // Register Emmet commands\n    Object.assign(CM.commands, {\n        emmetExpandAbbreviation: (editor: CodeMirror.Editor) => expandAbbreviation(editor, true),\n        emmetExpandAbbreviationAll: (editor: CodeMirror.Editor) => expandAbbreviation(editor, false),\n        emmetCaptureAbbreviation,\n        emmetResetAbbreviation,\n        emmetEnterAbbreviationMode,\n        emmetInsertLineBreak,\n        emmetWrapWithAbbreviation,\n        emmetBalance,\n        emmetBalanceInward: (editor: CodeMirror.Editor) => emmetBalance(editor, true),\n        emmetToggleComment,\n        emmetEvaluateMath,\n        emmetGoToNextEditPoint: (editor: CodeMirror.Editor) => goToEditPoint(editor, 1),\n        emmetGoToPreviousEditPoint: (editor: CodeMirror.Editor) => goToEditPoint(editor, -1),\n        emmetGoToTagPair,\n        emmetIncrementNumber1: (editor: CodeMirror.Editor) => incrementNumber(editor, 1),\n        emmetIncrementNumber01: (editor: CodeMirror.Editor) => incrementNumber(editor, .1),\n        emmetIncrementNumber10: (editor: CodeMirror.Editor) => incrementNumber(editor, 10),\n        emmetDecrementNumber1: (editor: CodeMirror.Editor) => incrementNumber(editor, -1),\n        emmetDecrementNumber01: (editor: CodeMirror.Editor) => incrementNumber(editor, -.1),\n        emmetDecrementNumber10: (editor: CodeMirror.Editor) => incrementNumber(editor, -10),\n        emmetRemoveTag,\n        emmetSelectNextItem: (editor: CodeMirror.Editor) => selectItem(editor),\n        emmetSelectPreviousItem: (editor: CodeMirror.Editor) => selectItem(editor, true),\n        emmetSplitJoinTag,\n    });\n\n    // Track options change\n    CM.defineOption('emmet', defaultConfig, (editor: CodeMirror.Editor, value: EmmetConfig) => {\n        if (!hasInternalState(editor)) {\n            editor.on('change', undoTracker);\n            editor.on('change', pasteTracker);\n        }\n\n        const state = getInternalState(editor);\n        value = getEmmetConfig(editor, value);\n\n        if (value.mark && !state.tracker) {\n            state.tracker = abbreviationTracker(editor);\n        } else if (!value.mark && state.tracker) {\n            state.tracker();\n            state.tracker = null;\n        }\n\n        if (value.markTagPairs && !state.tagMatch) {\n            state.tagMatch = matchTags(editor);\n        } else if (!value.markTagPairs && state.tagMatch) {\n            state.tagMatch();\n            state.tagMatch = null;\n        }\n    });\n\n    CM.defineMode('emmet-abbreviation', markupMode);\n    CM.defineMode('emmet-css-abbreviation', stylesheetMode);\n    CM.defineMode('emmet-snippet', snippetMode);\n\n    // Expose `expandAbbreviation` method to all instances to allow\n    // programmatic usage based on current Emmet options\n    CM.defineExtension('expandAbbreviation', function (this: CodeMirror.Editor, abbr: string, options = getOptions(this, 0)) {\n        return expand(this, abbr, options);\n    });\n\n    CM.defineExtension('emmetOptions', function (this: CodeMirror.Editor, pos = 0) {\n        return getOptions(this, pos);\n    });\n\n    CM.defineExtension('parseAbbreviation', function (this: CodeMirror.Editor, abbr: string, type: 'markup' | 'stylesheet' | 'jsx') {\n        if (type === 'stylesheet') {\n            return parseStylesheet(tokenizeStylesheet(abbr));\n        } else {\n            return parseMarkup(tokenizeMarkup(abbr), { jsx: type === 'jsx' });\n        }\n    });\n\n    CM.defineExtension('getEmmetCompletion', function (this: CodeMirror.Editor, pos: number | CodeMirror.Position) {\n        if (typeof pos !== 'number') {\n            pos = this.indexFromPos(pos);\n        }\n\n        return getCompletion(this, pos);\n    });\n}\n\n/**\n * Undo tracker, if possible\n */\nfunction undoTracker(editor: CodeMirror.Editor, change: CodeMirror.EditorChangeLinkedList) {\n    if (change.origin === 'undo' && change.text.length === 1) {\n        const pos = editor.indexFromPos(change.from);\n        const abbr = change.text[0];\n        restoreOnUndo(editor, pos, abbr);\n    }\n}\n\n/**\n * Capture abbreviation on paste, if possible\n */\nfunction pasteTracker(editor: CodeMirror.Editor, change: CodeMirror.EditorChangeLinkedList) {\n    if (change.origin === 'paste' && change.text.length === 1 && allowTracking(editor, editor.indexFromPos(change.from))) {\n        // Try to capture abbreviation on paste\n        const pos = editor.indexFromPos(change.from) + change.text[0].length;\n        extractTracker(editor, pos, true);\n    }\n}\n\nexport { EmmetConfig, EmmetEditorOptions };\n","import registerEmmetExtension from './extension';\n\nif (typeof window.CodeMirror !== 'undefined') {\n    registerEmmetExtension(window.CodeMirror);\n}\n"]}