{
  "name": "MagicPython",
  "scopeName": "source.python",
  "patterns": [
    {
      "include": "#statement"
    },
    {
      "include": "#expression"
    }
  ],
  "repository": {
    "annotated-parameter": {
      "begin": "(?x)\n  \\b\n  ([[:alpha:]_]\\w*) \\s* (:)\n",
      "end": "(,)|(?=\\))",
      "patterns": [
        {
          "include": "#expression"
        },
        {
          "name": "keyword.operator.assignment.python",
          "match": "=(?!=)"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "variable.parameter.function.language.python"
        },
        "2": {
          "name": "punctuation.separator.annotation.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.separator.parameters.python"
        }
      }
    },
    "assignment-operator": {
      "name": "keyword.operator.assignment.python",
      "match": "(?x)\n     \u003c\u003c= | \u003e\u003e= | //= | \\*\\*=\n    | \\+= | -= | /= | @=\n    | \\*= | %= | ~= | \\^= | \u0026= | \\|=\n    | =(?!=)\n"
    },
    "backticks": {
      "name": "invalid.deprecated.backtick.python",
      "begin": "\\`",
      "end": "(?:\\`|(?\u003c!\\\\)(\\n))",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "builtin-callables": {
      "patterns": [
        {
          "include": "#illegal-names"
        },
        {
          "include": "#illegal-object-name"
        },
        {
          "include": "#builtin-exceptions"
        },
        {
          "include": "#builtin-functions"
        },
        {
          "include": "#builtin-types"
        }
      ]
    },
    "builtin-exceptions": {
      "name": "support.type.exception.python",
      "match": "(?x) (?\u003c!\\.) \\b(\n  (\n    Arithmetic | Assertion | Attribute | Buffer | BlockingIO\n    | BrokenPipe | ChildProcess\n    | (Connection (Aborted | Refused | Reset)?)\n    | EOF | Environment | FileExists | FileNotFound\n    | FloatingPoint | IO | Import | Indentation | Index | Interrupted\n    | IsADirectory | NotADirectory | Permission | ProcessLookup\n    | Timeout\n    | Key | Lookup | Memory | Name | NotImplemented | OS | Overflow\n    | Reference | Runtime | Recursion | Syntax | System\n    | Tab | Type | UnboundLocal | Unicode(Encode|Decode|Translate)?\n    | Value | Windows | ZeroDivision | ModuleNotFound\n  ) Error\n|\n  ((Pending)?Deprecation | Runtime | Syntax | User | Future | Import\n    | Unicode | Bytes | Resource\n  )? Warning\n|\n  SystemExit | Stop(Async)?Iteration\n  | KeyboardInterrupt\n  | GeneratorExit | (Base)?Exception\n)\\b\n"
    },
    "builtin-functions": {
      "patterns": [
        {
          "name": "support.function.builtin.python",
          "match": "(?x)\n  (?\u003c!\\.) \\b(\n    __import__ | abs | all | any | ascii | bin | callable\n    | chr | compile | copyright | credits | delattr | dir | divmod\n    | enumerate | eval | exec | exit | filter | format | getattr\n    | globals | hasattr | hash | help | hex | id | input\n    | isinstance | issubclass | iter | len | license | locals | map\n    | max | memoryview | min | next | oct | open | ord | pow | print\n    | quit | range | reload | repr | reversed | round\n    | setattr | sorted | sum | vars | zip\n  )\\b\n"
        },
        {
          "name": "variable.legacy.builtin.python",
          "match": "(?x)\n  (?\u003c!\\.) \\b(\n    file | reduce | intern | raw_input | unicode | cmp | basestring\n    | execfile | long | xrange\n  )\\b\n"
        }
      ]
    },
    "builtin-possible-callables": {
      "patterns": [
        {
          "include": "#builtin-callables"
        },
        {
          "include": "#magic-names"
        }
      ]
    },
    "builtin-types": {
      "name": "support.type.python",
      "match": "(?x)\n  (?\u003c!\\.) \\b(\n    bool | bytearray | bytes | classmethod | complex | dict\n    | float | frozenset | int | list | object | property\n    | set | slice | staticmethod | str | tuple | type\n\n    (?# Although 'super' is not a type, it's related to types,\n        and is special enough to be highlighted differently from\n        other built-ins)\n    | super\n  )\\b\n"
    },
    "call-wrapper-inheritance": {
      "name": "meta.function-call.python",
      "begin": "(?x)\n  \\b(?=\n    ([[:alpha:]_]\\w*) \\s* (\\()\n  )\n",
      "end": "(\\))",
      "patterns": [
        {
          "include": "#inheritance-name"
        },
        {
          "include": "#function-arguments"
        }
      ],
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.arguments.end.python"
        }
      }
    },
    "class-declaration": {
      "patterns": [
        {
          "name": "meta.class.python",
          "begin": "(?x)\n  \\s*(class)\\s+\n    (?=\n      [[:alpha:]_]\\w* \\s* (:|\\()\n    )\n",
          "end": "(:)",
          "patterns": [
            {
              "include": "#class-name"
            },
            {
              "include": "#class-inheritance"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "storage.type.class.python"
            }
          },
          "endCaptures": {
            "1": {
              "name": "punctuation.section.class.begin.python"
            }
          }
        }
      ]
    },
    "class-inheritance": {
      "name": "meta.class.inheritance.python",
      "begin": "(\\()",
      "end": "(\\))",
      "patterns": [
        {
          "name": "keyword.operator.unpacking.arguments.python",
          "match": "(\\*\\*|\\*)"
        },
        {
          "name": "punctuation.separator.inheritance.python",
          "match": ","
        },
        {
          "name": "keyword.operator.assignment.python",
          "match": "=(?!=)"
        },
        {
          "name": "support.type.metaclass.python",
          "match": "\\bmetaclass\\b"
        },
        {
          "include": "#illegal-names"
        },
        {
          "include": "#class-kwarg"
        },
        {
          "include": "#call-wrapper-inheritance"
        },
        {
          "include": "#expression-base"
        },
        {
          "include": "#member-access-class"
        },
        {
          "include": "#inheritance-identifier"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.definition.inheritance.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.inheritance.end.python"
        }
      }
    },
    "class-kwarg": {
      "match": "(?x)\n  \\b ([[:alpha:]_]\\w*) \\s*(=)(?!=)\n",
      "captures": {
        "1": {
          "name": "entity.other.inherited-class.python variable.parameter.class.python"
        },
        "2": {
          "name": "keyword.operator.assignment.python"
        }
      }
    },
    "class-name": {
      "patterns": [
        {
          "include": "#illegal-object-name"
        },
        {
          "include": "#builtin-possible-callables"
        },
        {
          "name": "entity.name.type.class.python",
          "match": "(?x)\n  \\b ([[:alpha:]_]\\w*) \\b\n"
        }
      ]
    },
    "codetags": {
      "match": "(?:\\b(NOTE|XXX|HACK|FIXME|BUG|TODO)\\b)",
      "captures": {
        "1": {
          "name": "keyword.codetag.notation.python"
        }
      }
    },
    "comments": {
      "patterns": [
        {
          "name": "comment.line.number-sign.python",
          "contentName": "meta.typehint.comment.python",
          "begin": "(?x)\n  (?:\n    \\# \\s* (type:)\n    \\s*+ (?# we want `\\s*+` which is possessive quantifier since\n             we do not actually want to backtrack when matching\n             whitespace here)\n    (?! $ | \\#)\n  )\n",
          "end": "(?:$|(?=\\#))",
          "patterns": [
            {
              "name": "comment.typehint.ignore.notation.python",
              "match": "(?x)\n  \\G ignore\n  (?= \\s* (?: $ | \\#))\n"
            },
            {
              "name": "comment.typehint.type.notation.python",
              "match": "(?x)\n  (?\u003c!\\.)\\b(\n    bool | bytes | float | int | object | str\n    | List | Dict | Iterable | Sequence | Set\n    | FrozenSet | Callable | Union | Tuple\n    | Any | None\n  )\\b\n"
            },
            {
              "name": "comment.typehint.punctuation.notation.python",
              "match": "([\\[\\]\\(\\),\\.\\=\\*]|(-\u003e))"
            },
            {
              "name": "comment.typehint.variable.notation.python",
              "match": "([[:alpha:]_]\\w*)"
            }
          ],
          "beginCaptures": {
            "0": {
              "name": "meta.typehint.comment.python"
            },
            "1": {
              "name": "comment.typehint.directive.notation.python"
            }
          }
        },
        {
          "include": "#comments-base"
        }
      ]
    },
    "comments-base": {
      "name": "comment.line.number-sign.python",
      "begin": "(\\#)",
      "end": "($)",
      "patterns": [
        {
          "include": "#codetags"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.definition.comment.python"
        }
      }
    },
    "comments-string-double-three": {
      "name": "comment.line.number-sign.python",
      "begin": "(\\#)",
      "end": "($|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#codetags"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.definition.comment.python"
        }
      }
    },
    "comments-string-single-three": {
      "name": "comment.line.number-sign.python",
      "begin": "(\\#)",
      "end": "($|(?='''))",
      "patterns": [
        {
          "include": "#codetags"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.definition.comment.python"
        }
      }
    },
    "curly-braces": {
      "begin": "\\{",
      "end": "\\}",
      "patterns": [
        {
          "name": "punctuation.separator.dict.python",
          "match": ":"
        },
        {
          "include": "#expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.dict.begin.python"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.dict.end.python"
        }
      }
    },
    "decorator": {
      "name": "meta.function.decorator.python",
      "begin": "(?x)\n  ^\\s*\n  (@) \\s* (?=[[:alpha:]_]\\w*)\n",
      "end": "(?x)\n  ( \\) )\n    # trailing whitespace and comments are legal\n    (?: (.*?) (?=\\s*(?:\\#|$)) )\n  | (?=\\n|\\#)\n",
      "patterns": [
        {
          "include": "#decorator-name"
        },
        {
          "include": "#function-arguments"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "entity.name.function.decorator.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.arguments.end.python"
        },
        "2": {
          "name": "invalid.illegal.decorator.python"
        }
      }
    },
    "decorator-name": {
      "patterns": [
        {
          "include": "#builtin-callables"
        },
        {
          "include": "#illegal-object-name"
        },
        {
          "name": "entity.name.function.decorator.python",
          "match": "(?x)\n  ([[:alpha:]_]\\w*) | \\.\n"
        },
        {
          "include": "#line-continuation"
        },
        {
          "name": "invalid.illegal.decorator.python",
          "match": "(?x)\n  \\s* ([^([:alpha:]\\s_\\.#\\\\] .*?) (?=\\#|$)\n",
          "captures": {
            "1": {
              "name": "invalid.illegal.decorator.python"
            }
          }
        }
      ]
    },
    "docstring": {
      "patterns": [
        {
          "name": "string.quoted.docstring.multi.python",
          "begin": "(\\'\\'\\'|\\\"\\\"\\\")",
          "end": "(\\1)",
          "patterns": [
            {
              "include": "#docstring-prompt"
            },
            {
              "include": "#codetags"
            },
            {
              "include": "#docstring-guts-unicode"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.string.begin.python"
            }
          },
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.string.end.python"
            }
          }
        },
        {
          "name": "string.quoted.docstring.raw.multi.python",
          "begin": "([rR])(\\'\\'\\'|\\\"\\\"\\\")",
          "end": "(\\2)",
          "patterns": [
            {
              "include": "#string-consume-escape"
            },
            {
              "include": "#docstring-prompt"
            },
            {
              "include": "#codetags"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "storage.type.string.python"
            },
            "2": {
              "name": "punctuation.definition.string.begin.python"
            }
          },
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.string.end.python"
            }
          }
        },
        {
          "name": "string.quoted.docstring.single.python",
          "begin": "(\\'|\\\")",
          "end": "(\\1)|((?\u003c!\\\\)\\n)",
          "patterns": [
            {
              "include": "#codetags"
            },
            {
              "include": "#docstring-guts-unicode"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.string.begin.python"
            }
          },
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.string.end.python"
            },
            "2": {
              "name": "invalid.illegal.newline.python"
            }
          }
        },
        {
          "name": "string.quoted.docstring.raw.single.python",
          "begin": "([rR])(\\'|\\\")",
          "end": "(\\2)|((?\u003c!\\\\)\\n)",
          "patterns": [
            {
              "include": "#string-consume-escape"
            },
            {
              "include": "#codetags"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "storage.type.string.python"
            },
            "2": {
              "name": "punctuation.definition.string.begin.python"
            }
          },
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.string.end.python"
            },
            "2": {
              "name": "invalid.illegal.newline.python"
            }
          }
        }
      ]
    },
    "docstring-guts-unicode": {
      "patterns": [
        {
          "include": "#escape-sequence-unicode"
        },
        {
          "include": "#escape-sequence"
        },
        {
          "include": "#string-line-continuation"
        }
      ]
    },
    "docstring-prompt": {
      "match": "(?x)\n  (?:\n    (?:^|\\G) \\s* (?# '\\G' is necessary for ST)\n    ((?:\u003e\u003e\u003e|\\.\\.\\.) \\s) (?=\\s*\\S)\n  )\n",
      "captures": {
        "1": {
          "name": "keyword.control.flow.python"
        }
      }
    },
    "docstring-statement": {
      "begin": "^(?=\\s*[rR]?(\\'\\'\\'|\\\"\\\"\\\"|\\'|\\\"))",
      "end": "(?\u003c=\\'\\'\\'|\\\"\\\"\\\"|\\'|\\\")",
      "patterns": [
        {
          "include": "#docstring"
        }
      ]
    },
    "double-one-fregexp-conditional": {
      "begin": "(\\()\\?\\((\\w+(?:\\s+[[:alnum:]]+)?|\\d+)\\)",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#double-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.conditional.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.conditional.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.conditional.negative.regexp punctuation.parenthesis.conditional.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-one-fregexp-expression": {
      "patterns": [
        {
          "include": "#fregexp-base-expression"
        },
        {
          "include": "#double-one-regexp-character-set"
        },
        {
          "include": "#double-one-regexp-comments"
        },
        {
          "include": "#regexp-flags"
        },
        {
          "include": "#double-one-regexp-named-group"
        },
        {
          "include": "#regexp-backreference"
        },
        {
          "include": "#double-one-fregexp-lookahead"
        },
        {
          "include": "#double-one-fregexp-lookahead-negative"
        },
        {
          "include": "#double-one-fregexp-lookbehind"
        },
        {
          "include": "#double-one-fregexp-lookbehind-negative"
        },
        {
          "include": "#double-one-fregexp-conditional"
        },
        {
          "include": "#double-one-fregexp-parentheses-non-capturing"
        },
        {
          "include": "#double-one-fregexp-parentheses"
        }
      ]
    },
    "double-one-fregexp-lookahead": {
      "begin": "(\\()\\?=",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#double-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookahead.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookahead.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-one-fregexp-lookahead-negative": {
      "begin": "(\\()\\?!",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#double-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookahead.negative.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookahead.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-one-fregexp-lookbehind": {
      "begin": "(\\()\\?\u003c=",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#double-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookbehind.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookbehind.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-one-fregexp-lookbehind-negative": {
      "begin": "(\\()\\?\u003c!",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#double-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookbehind.negative.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookbehind.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookbehind.negative.regexp punctuation.parenthesis.lookbehind.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-one-fregexp-named-group": {
      "name": "meta.named.regexp",
      "begin": "(?x)\n  (\\()  (\\?P \u003c\\w+(?:\\s+[[:alnum:]]+)?\u003e)\n",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#double-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp"
        },
        "2": {
          "name": "entity.name.tag.named.group.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-one-fregexp-parentheses": {
      "begin": "\\(",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#double-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-one-fregexp-parentheses-non-capturing": {
      "begin": "\\(\\?:",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#double-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-one-regexp-character-set": {
      "patterns": [
        {
          "match": "(?x)\n  \\[ \\^? \\] (?! .*?\\])\n"
        },
        {
          "name": "meta.character.set.regexp",
          "begin": "(\\[)(\\^)?(\\])?",
          "end": "(\\]|(?=\"))|((?=(?\u003c!\\\\)\\n))",
          "patterns": [
            {
              "include": "#regexp-charecter-set-escapes"
            },
            {
              "name": "constant.character.set.regexp",
              "match": "[^\\n]"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "punctuation.character.set.begin.regexp constant.other.set.regexp"
            },
            "2": {
              "name": "keyword.operator.negation.regexp"
            },
            "3": {
              "name": "constant.character.set.regexp"
            }
          },
          "endCaptures": {
            "1": {
              "name": "punctuation.character.set.end.regexp constant.other.set.regexp"
            },
            "2": {
              "name": "invalid.illegal.newline.python"
            }
          }
        }
      ]
    },
    "double-one-regexp-comments": {
      "name": "comment.regexp",
      "begin": "\\(\\?#",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#codetags"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "punctuation.comment.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.comment.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-one-regexp-conditional": {
      "begin": "(\\()\\?\\((\\w+(?:\\s+[[:alnum:]]+)?|\\d+)\\)",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#double-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.conditional.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.conditional.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.conditional.negative.regexp punctuation.parenthesis.conditional.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-one-regexp-expression": {
      "patterns": [
        {
          "include": "#regexp-base-expression"
        },
        {
          "include": "#double-one-regexp-character-set"
        },
        {
          "include": "#double-one-regexp-comments"
        },
        {
          "include": "#regexp-flags"
        },
        {
          "include": "#double-one-regexp-named-group"
        },
        {
          "include": "#regexp-backreference"
        },
        {
          "include": "#double-one-regexp-lookahead"
        },
        {
          "include": "#double-one-regexp-lookahead-negative"
        },
        {
          "include": "#double-one-regexp-lookbehind"
        },
        {
          "include": "#double-one-regexp-lookbehind-negative"
        },
        {
          "include": "#double-one-regexp-conditional"
        },
        {
          "include": "#double-one-regexp-parentheses-non-capturing"
        },
        {
          "include": "#double-one-regexp-parentheses"
        }
      ]
    },
    "double-one-regexp-lookahead": {
      "begin": "(\\()\\?=",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#double-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookahead.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookahead.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-one-regexp-lookahead-negative": {
      "begin": "(\\()\\?!",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#double-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookahead.negative.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookahead.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-one-regexp-lookbehind": {
      "begin": "(\\()\\?\u003c=",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#double-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookbehind.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookbehind.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-one-regexp-lookbehind-negative": {
      "begin": "(\\()\\?\u003c!",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#double-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookbehind.negative.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookbehind.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookbehind.negative.regexp punctuation.parenthesis.lookbehind.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-one-regexp-named-group": {
      "name": "meta.named.regexp",
      "begin": "(?x)\n  (\\()  (\\?P \u003c\\w+(?:\\s+[[:alnum:]]+)?\u003e)\n",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#double-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp"
        },
        "2": {
          "name": "entity.name.tag.named.group.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-one-regexp-parentheses": {
      "begin": "\\(",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#double-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-one-regexp-parentheses-non-capturing": {
      "begin": "\\(\\?:",
      "end": "(\\)|(?=\"))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#double-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-fregexp-conditional": {
      "begin": "(\\()\\?\\((\\w+(?:\\s+[[:alnum:]]+)?|\\d+)\\)",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#double-three-fregexp-expression"
        },
        {
          "include": "#comments-string-double-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.conditional.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.conditional.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.conditional.negative.regexp punctuation.parenthesis.conditional.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-fregexp-expression": {
      "patterns": [
        {
          "include": "#fregexp-base-expression"
        },
        {
          "include": "#double-three-regexp-character-set"
        },
        {
          "include": "#double-three-regexp-comments"
        },
        {
          "include": "#regexp-flags"
        },
        {
          "include": "#double-three-regexp-named-group"
        },
        {
          "include": "#regexp-backreference"
        },
        {
          "include": "#double-three-fregexp-lookahead"
        },
        {
          "include": "#double-three-fregexp-lookahead-negative"
        },
        {
          "include": "#double-three-fregexp-lookbehind"
        },
        {
          "include": "#double-three-fregexp-lookbehind-negative"
        },
        {
          "include": "#double-three-fregexp-conditional"
        },
        {
          "include": "#double-three-fregexp-parentheses-non-capturing"
        },
        {
          "include": "#double-three-fregexp-parentheses"
        },
        {
          "include": "#comments-string-double-three"
        }
      ]
    },
    "double-three-fregexp-lookahead": {
      "begin": "(\\()\\?=",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#double-three-fregexp-expression"
        },
        {
          "include": "#comments-string-double-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookahead.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookahead.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-fregexp-lookahead-negative": {
      "begin": "(\\()\\?!",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#double-three-fregexp-expression"
        },
        {
          "include": "#comments-string-double-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookahead.negative.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookahead.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-fregexp-lookbehind": {
      "begin": "(\\()\\?\u003c=",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#double-three-fregexp-expression"
        },
        {
          "include": "#comments-string-double-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookbehind.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookbehind.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-fregexp-lookbehind-negative": {
      "begin": "(\\()\\?\u003c!",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#double-three-fregexp-expression"
        },
        {
          "include": "#comments-string-double-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookbehind.negative.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookbehind.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookbehind.negative.regexp punctuation.parenthesis.lookbehind.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-fregexp-named-group": {
      "name": "meta.named.regexp",
      "begin": "(?x)\n  (\\()  (\\?P \u003c\\w+(?:\\s+[[:alnum:]]+)?\u003e)\n",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#double-three-fregexp-expression"
        },
        {
          "include": "#comments-string-double-three"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp"
        },
        "2": {
          "name": "entity.name.tag.named.group.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-fregexp-parentheses": {
      "begin": "\\(",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#double-three-fregexp-expression"
        },
        {
          "include": "#comments-string-double-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-fregexp-parentheses-non-capturing": {
      "begin": "\\(\\?:",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#double-three-fregexp-expression"
        },
        {
          "include": "#comments-string-double-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-regexp-character-set": {
      "patterns": [
        {
          "match": "(?x)\n  \\[ \\^? \\] (?! .*?\\])\n"
        },
        {
          "name": "meta.character.set.regexp",
          "begin": "(\\[)(\\^)?(\\])?",
          "end": "(\\]|(?=\"\"\"))",
          "patterns": [
            {
              "include": "#regexp-charecter-set-escapes"
            },
            {
              "name": "constant.character.set.regexp",
              "match": "[^\\n]"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "punctuation.character.set.begin.regexp constant.other.set.regexp"
            },
            "2": {
              "name": "keyword.operator.negation.regexp"
            },
            "3": {
              "name": "constant.character.set.regexp"
            }
          },
          "endCaptures": {
            "1": {
              "name": "punctuation.character.set.end.regexp constant.other.set.regexp"
            },
            "2": {
              "name": "invalid.illegal.newline.python"
            }
          }
        }
      ]
    },
    "double-three-regexp-comments": {
      "name": "comment.regexp",
      "begin": "\\(\\?#",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#codetags"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "punctuation.comment.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.comment.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-regexp-conditional": {
      "begin": "(\\()\\?\\((\\w+(?:\\s+[[:alnum:]]+)?|\\d+)\\)",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#double-three-regexp-expression"
        },
        {
          "include": "#comments-string-double-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.conditional.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.conditional.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.conditional.negative.regexp punctuation.parenthesis.conditional.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-regexp-expression": {
      "patterns": [
        {
          "include": "#regexp-base-expression"
        },
        {
          "include": "#double-three-regexp-character-set"
        },
        {
          "include": "#double-three-regexp-comments"
        },
        {
          "include": "#regexp-flags"
        },
        {
          "include": "#double-three-regexp-named-group"
        },
        {
          "include": "#regexp-backreference"
        },
        {
          "include": "#double-three-regexp-lookahead"
        },
        {
          "include": "#double-three-regexp-lookahead-negative"
        },
        {
          "include": "#double-three-regexp-lookbehind"
        },
        {
          "include": "#double-three-regexp-lookbehind-negative"
        },
        {
          "include": "#double-three-regexp-conditional"
        },
        {
          "include": "#double-three-regexp-parentheses-non-capturing"
        },
        {
          "include": "#double-three-regexp-parentheses"
        },
        {
          "include": "#comments-string-double-three"
        }
      ]
    },
    "double-three-regexp-lookahead": {
      "begin": "(\\()\\?=",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#double-three-regexp-expression"
        },
        {
          "include": "#comments-string-double-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookahead.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookahead.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-regexp-lookahead-negative": {
      "begin": "(\\()\\?!",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#double-three-regexp-expression"
        },
        {
          "include": "#comments-string-double-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookahead.negative.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookahead.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-regexp-lookbehind": {
      "begin": "(\\()\\?\u003c=",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#double-three-regexp-expression"
        },
        {
          "include": "#comments-string-double-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookbehind.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookbehind.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-regexp-lookbehind-negative": {
      "begin": "(\\()\\?\u003c!",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#double-three-regexp-expression"
        },
        {
          "include": "#comments-string-double-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookbehind.negative.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookbehind.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookbehind.negative.regexp punctuation.parenthesis.lookbehind.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-regexp-named-group": {
      "name": "meta.named.regexp",
      "begin": "(?x)\n  (\\()  (\\?P \u003c\\w+(?:\\s+[[:alnum:]]+)?\u003e)\n",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#double-three-regexp-expression"
        },
        {
          "include": "#comments-string-double-three"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp"
        },
        "2": {
          "name": "entity.name.tag.named.group.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-regexp-parentheses": {
      "begin": "\\(",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#double-three-regexp-expression"
        },
        {
          "include": "#comments-string-double-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "double-three-regexp-parentheses-non-capturing": {
      "begin": "\\(\\?:",
      "end": "(\\)|(?=\"\"\"))",
      "patterns": [
        {
          "include": "#double-three-regexp-expression"
        },
        {
          "include": "#comments-string-double-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "ellipsis": {
      "name": "constant.other.ellipsis.python",
      "match": "\\.\\.\\."
    },
    "escape-sequence": {
      "name": "constant.character.escape.python",
      "match": "(?x)\n  \\\\ (\n        x[0-9A-Fa-f]{2}\n        | [0-7]{1,3}\n        | [\\\\\"'abfnrtv]\n     )\n"
    },
    "escape-sequence-unicode": {
      "patterns": [
        {
          "name": "constant.character.escape.python",
          "match": "(?x)\n  \\\\ (\n        u[0-9A-Fa-f]{4}\n        | U[0-9A-Fa-f]{8}\n        | N\\{[\\w\\s]+?\\}\n     )\n"
        }
      ]
    },
    "expression": {
      "patterns": [
        {
          "include": "#expression-base"
        },
        {
          "include": "#member-access"
        },
        {
          "match": "(?x) \\b ([[:alpha:]_]\\w*) \\b"
        }
      ]
    },
    "expression-bare": {
      "patterns": [
        {
          "include": "#backticks"
        },
        {
          "include": "#illegal-anno"
        },
        {
          "include": "#literal"
        },
        {
          "include": "#regexp"
        },
        {
          "include": "#string"
        },
        {
          "include": "#lambda"
        },
        {
          "include": "#illegal-operator"
        },
        {
          "include": "#operator"
        },
        {
          "include": "#curly-braces"
        },
        {
          "include": "#item-access"
        },
        {
          "include": "#list"
        },
        {
          "include": "#round-braces"
        },
        {
          "include": "#function-call"
        },
        {
          "include": "#builtin-functions"
        },
        {
          "include": "#builtin-types"
        },
        {
          "include": "#builtin-exceptions"
        },
        {
          "include": "#magic-names"
        },
        {
          "include": "#special-names"
        },
        {
          "include": "#illegal-names"
        },
        {
          "include": "#special-variables"
        },
        {
          "include": "#ellipsis"
        },
        {
          "include": "#punctuation"
        },
        {
          "include": "#line-continuation"
        }
      ]
    },
    "expression-base": {
      "patterns": [
        {
          "include": "#comments"
        },
        {
          "include": "#expression-bare"
        },
        {
          "include": "#line-continuation"
        }
      ]
    },
    "f-expression": {
      "patterns": [
        {
          "include": "#expression-bare"
        },
        {
          "include": "#member-access"
        },
        {
          "match": "(?x) \\b ([[:alpha:]_]\\w*) \\b"
        }
      ]
    },
    "fregexp-base-expression": {
      "patterns": [
        {
          "include": "#fregexp-quantifier"
        },
        {
          "include": "#fstring-formatting-braces"
        },
        {
          "match": "\\{.*?\\}"
        },
        {
          "include": "#regexp-base-common"
        }
      ]
    },
    "fregexp-double-one-line": {
      "name": "string.interpolated.python string.regexp.quoted.single.python",
      "begin": "\\b(([uU]r)|([fF]r)|(r[fF]?))(\")",
      "end": "(\")|(?\u003c!\\\\)(\\n)",
      "patterns": [
        {
          "include": "#double-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "2": {
          "name": "invalid.deprecated.prefix.python"
        },
        "3": {
          "name": "storage.type.string.python"
        },
        "4": {
          "name": "storage.type.string.python"
        },
        "5": {
          "name": "punctuation.definition.string.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "fregexp-double-three-line": {
      "name": "string.interpolated.python string.regexp.quoted.multi.python",
      "begin": "\\b(([uU]r)|([fF]r)|(r[fF]?))(\"\"\")",
      "end": "(\"\"\")",
      "patterns": [
        {
          "include": "#double-three-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "2": {
          "name": "invalid.deprecated.prefix.python"
        },
        "3": {
          "name": "storage.type.string.python"
        },
        "4": {
          "name": "storage.type.string.python"
        },
        "5": {
          "name": "punctuation.definition.string.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "fregexp-quantifier": {
      "name": "keyword.operator.quantifier.regexp",
      "match": "(?x)\n  \\{\\{(\n    \\d+ | \\d+,(\\d+)? | ,\\d+\n  )\\}\\}\n"
    },
    "fregexp-single-one-line": {
      "name": "string.interpolated.python string.regexp.quoted.single.python",
      "begin": "\\b(([uU]r)|([fF]r)|(r[fF]?))(\\')",
      "end": "(\\')|(?\u003c!\\\\)(\\n)",
      "patterns": [
        {
          "include": "#single-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "2": {
          "name": "invalid.deprecated.prefix.python"
        },
        "3": {
          "name": "storage.type.string.python"
        },
        "4": {
          "name": "storage.type.string.python"
        },
        "5": {
          "name": "punctuation.definition.string.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "fregexp-single-three-line": {
      "name": "string.interpolated.python string.regexp.quoted.multi.python",
      "begin": "\\b(([uU]r)|([fF]r)|(r[fF]?))(\\'\\'\\')",
      "end": "(\\'\\'\\')",
      "patterns": [
        {
          "include": "#single-three-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "2": {
          "name": "invalid.deprecated.prefix.python"
        },
        "3": {
          "name": "storage.type.string.python"
        },
        "4": {
          "name": "storage.type.string.python"
        },
        "5": {
          "name": "punctuation.definition.string.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "fstring-fnorm-quoted-multi-line": {
      "name": "meta.fstring.python",
      "begin": "(\\b[fF])([bBuU])?('''|\"\"\")",
      "end": "(\\3)",
      "patterns": [
        {
          "include": "#fstring-guts"
        },
        {
          "include": "#fstring-illegal-multi-brace"
        },
        {
          "include": "#fstring-multi-brace"
        },
        {
          "include": "#fstring-multi-core"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "string.interpolated.python string.quoted.multi.python storage.type.string.python"
        },
        "2": {
          "name": "invalid.illegal.prefix.python"
        },
        "3": {
          "name": "punctuation.definition.string.begin.python string.interpolated.python string.quoted.multi.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python string.interpolated.python string.quoted.multi.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "fstring-fnorm-quoted-single-line": {
      "name": "meta.fstring.python",
      "begin": "(\\b[fF])([bBuU])?((['\"]))",
      "end": "(\\3)|((?\u003c!\\\\)\\n)",
      "patterns": [
        {
          "include": "#fstring-guts"
        },
        {
          "include": "#fstring-illegal-single-brace"
        },
        {
          "include": "#fstring-single-brace"
        },
        {
          "include": "#fstring-single-core"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "string.interpolated.python string.quoted.single.python storage.type.string.python"
        },
        "2": {
          "name": "invalid.illegal.prefix.python"
        },
        "3": {
          "name": "punctuation.definition.string.begin.python string.interpolated.python string.quoted.single.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python string.interpolated.python string.quoted.single.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "fstring-formatting": {
      "patterns": [
        {
          "include": "#fstring-formatting-braces"
        },
        {
          "include": "#fstring-formatting-singe-brace"
        }
      ]
    },
    "fstring-formatting-braces": {
      "patterns": [
        {
          "match": "({)(\\s*?)(})",
          "captures": {
            "1": {
              "name": "constant.character.format.placeholder.other.python"
            },
            "2": {
              "name": "invalid.illegal.brace.python"
            },
            "3": {
              "name": "constant.character.format.placeholder.other.python"
            }
          }
        },
        {
          "name": "constant.character.escape.python",
          "match": "({{|}})"
        }
      ]
    },
    "fstring-formatting-singe-brace": {
      "name": "invalid.illegal.brace.python",
      "match": "(}(?!}))"
    },
    "fstring-guts": {
      "patterns": [
        {
          "include": "#escape-sequence-unicode"
        },
        {
          "include": "#escape-sequence"
        },
        {
          "include": "#string-line-continuation"
        },
        {
          "include": "#fstring-formatting"
        }
      ]
    },
    "fstring-illegal-multi-brace": {
      "patterns": [
        {
          "include": "#impossible"
        }
      ]
    },
    "fstring-illegal-single-brace": {
      "begin": "(\\{)(?=[^\\n}]*$\\n?)",
      "end": "(\\})|(?=\\n)",
      "patterns": [
        {
          "include": "#fstring-terminator-single"
        },
        {
          "include": "#f-expression"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "constant.character.format.placeholder.other.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "constant.character.format.placeholder.other.python"
        }
      }
    },
    "fstring-multi-brace": {
      "begin": "(\\{)",
      "end": "(?x)\n  (\\})\n",
      "patterns": [
        {
          "include": "#fstring-terminator-multi"
        },
        {
          "include": "#f-expression"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "constant.character.format.placeholder.other.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "constant.character.format.placeholder.other.python"
        }
      }
    },
    "fstring-multi-core": {
      "name": "string.interpolated.python string.quoted.multi.python",
      "match": "(?x)\n  (.+?)\n    (\n      (?# .* and .*? in multi-line match need special handling of\n        newlines otherwise SublimeText and Atom will match slightly\n        differently.\n\n        The guard for newlines has to be separate from the\n        lookahead because of special $ matching rule.)\n      ($\\n?)\n      |\n      (?=[\\\\\\}\\{]|'''|\"\"\")\n    )\n  (?# due to how multiline regexps are matched we need a special case\n    for matching a newline character)\n  | \\n\n"
    },
    "fstring-normf-quoted-multi-line": {
      "name": "meta.fstring.python",
      "begin": "(\\b[bBuU])([fF])('''|\"\"\")",
      "end": "(\\3)",
      "patterns": [
        {
          "include": "#fstring-guts"
        },
        {
          "include": "#fstring-illegal-multi-brace"
        },
        {
          "include": "#fstring-multi-brace"
        },
        {
          "include": "#fstring-multi-core"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "invalid.illegal.prefix.python"
        },
        "2": {
          "name": "string.interpolated.python string.quoted.multi.python storage.type.string.python"
        },
        "3": {
          "name": "punctuation.definition.string.begin.python string.quoted.multi.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python string.interpolated.python string.quoted.multi.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "fstring-normf-quoted-single-line": {
      "name": "meta.fstring.python",
      "begin": "(\\b[bBuU])([fF])((['\"]))",
      "end": "(\\3)|((?\u003c!\\\\)\\n)",
      "patterns": [
        {
          "include": "#fstring-guts"
        },
        {
          "include": "#fstring-illegal-single-brace"
        },
        {
          "include": "#fstring-single-brace"
        },
        {
          "include": "#fstring-single-core"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "invalid.illegal.prefix.python"
        },
        "2": {
          "name": "string.interpolated.python string.quoted.single.python storage.type.string.python"
        },
        "3": {
          "name": "punctuation.definition.string.begin.python string.quoted.single.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python string.interpolated.python string.quoted.single.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "fstring-raw-guts": {
      "patterns": [
        {
          "include": "#string-consume-escape"
        },
        {
          "include": "#fstring-formatting"
        }
      ]
    },
    "fstring-raw-multi-core": {
      "name": "string.interpolated.python string.quoted.raw.multi.python",
      "match": "(?x)\n  (.+?)\n    (\n      (?# .* and .*? in multi-line match need special handling of\n        newlines otherwise SublimeText and Atom will match slightly\n        differently.\n\n        The guard for newlines has to be separate from the\n        lookahead because of special $ matching rule.)\n      ($\\n?)\n      |\n      (?=[\\\\\\}\\{]|'''|\"\"\")\n    )\n  (?# due to how multiline regexps are matched we need a special case\n    for matching a newline character)\n  | \\n\n"
    },
    "fstring-raw-quoted-multi-line": {
      "name": "meta.fstring.python",
      "begin": "(\\b(?:[R][fF]|[fF][R]))('''|\"\"\")",
      "end": "(\\2)",
      "patterns": [
        {
          "include": "#fstring-raw-guts"
        },
        {
          "include": "#fstring-illegal-multi-brace"
        },
        {
          "include": "#fstring-multi-brace"
        },
        {
          "include": "#fstring-raw-multi-core"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "string.interpolated.python string.quoted.raw.multi.python storage.type.string.python"
        },
        "2": {
          "name": "punctuation.definition.string.begin.python string.quoted.raw.multi.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python string.interpolated.python string.quoted.raw.multi.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "fstring-raw-quoted-single-line": {
      "name": "meta.fstring.python",
      "begin": "(\\b(?:[R][fF]|[fF][R]))((['\"]))",
      "end": "(\\2)|((?\u003c!\\\\)\\n)",
      "patterns": [
        {
          "include": "#fstring-raw-guts"
        },
        {
          "include": "#fstring-illegal-single-brace"
        },
        {
          "include": "#fstring-single-brace"
        },
        {
          "include": "#fstring-raw-single-core"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "string.interpolated.python string.quoted.raw.single.python storage.type.string.python"
        },
        "2": {
          "name": "punctuation.definition.string.begin.python string.quoted.raw.single.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python string.interpolated.python string.quoted.raw.single.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "fstring-raw-single-core": {
      "name": "string.interpolated.python string.quoted.raw.single.python",
      "match": "(?x)\n  (.+?)\n    (\n      (?# .* and .*? in multi-line match need special handling of\n        newlines otherwise SublimeText and Atom will match slightly\n        differently.\n\n        The guard for newlines has to be separate from the\n        lookahead because of special $ matching rule.)\n      ($\\n?)\n      |\n      (?=[\\\\\\}\\{]|(['\"])|((?\u003c!\\\\)\\n))\n    )\n  (?# due to how multiline regexps are matched we need a special case\n    for matching a newline character)\n  | \\n\n"
    },
    "fstring-single-brace": {
      "begin": "(\\{)",
      "end": "(?x)\n  (\\})|(?=\\n)\n",
      "patterns": [
        {
          "include": "#fstring-terminator-single"
        },
        {
          "include": "#f-expression"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "constant.character.format.placeholder.other.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "constant.character.format.placeholder.other.python"
        }
      }
    },
    "fstring-single-core": {
      "name": "string.interpolated.python string.quoted.single.python",
      "match": "(?x)\n  (.+?)\n    (\n      (?# .* and .*? in multi-line match need special handling of\n        newlines otherwise SublimeText and Atom will match slightly\n        differently.\n\n        The guard for newlines has to be separate from the\n        lookahead because of special $ matching rule.)\n      ($\\n?)\n      |\n      (?=[\\\\\\}\\{]|(['\"])|((?\u003c!\\\\)\\n))\n    )\n  (?# due to how multiline regexps are matched we need a special case\n    for matching a newline character)\n  | \\n\n"
    },
    "fstring-terminator-multi": {
      "patterns": [
        {
          "name": "storage.type.format.python",
          "match": "(![rsa])(?=})"
        },
        {
          "match": "(?x)\n  (![rsa])?\n    ( : \\w? [\u003c\u003e=^]? [-+ ]? \\#?\n      \\d* ,? (\\.\\d+)? [bcdeEfFgGnosxX%]? )(?=})\n",
          "captures": {
            "1": {
              "name": "storage.type.format.python"
            },
            "2": {
              "name": "storage.type.format.python"
            }
          }
        },
        {
          "include": "#fstring-terminator-multi-tail"
        }
      ]
    },
    "fstring-terminator-multi-tail": {
      "begin": "(![rsa])?(:)(?=.*?{)",
      "end": "(?=})",
      "patterns": [
        {
          "include": "#fstring-illegal-multi-brace"
        },
        {
          "include": "#fstring-multi-brace"
        },
        {
          "name": "storage.type.format.python",
          "match": "([bcdeEfFgGnosxX%])(?=})"
        },
        {
          "name": "storage.type.format.python",
          "match": "(\\.\\d+)"
        },
        {
          "name": "storage.type.format.python",
          "match": "(,)"
        },
        {
          "name": "storage.type.format.python",
          "match": "(\\d+)"
        },
        {
          "name": "storage.type.format.python",
          "match": "(\\#)"
        },
        {
          "name": "storage.type.format.python",
          "match": "([-+ ])"
        },
        {
          "name": "storage.type.format.python",
          "match": "([\u003c\u003e=^])"
        },
        {
          "name": "storage.type.format.python",
          "match": "(\\w)"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "storage.type.format.python"
        },
        "2": {
          "name": "storage.type.format.python"
        }
      }
    },
    "fstring-terminator-single": {
      "patterns": [
        {
          "name": "storage.type.format.python",
          "match": "(![rsa])(?=})"
        },
        {
          "match": "(?x)\n  (![rsa])?\n    ( : \\w? [\u003c\u003e=^]? [-+ ]? \\#?\n      \\d* ,? (\\.\\d+)? [bcdeEfFgGnosxX%]? )(?=})\n",
          "captures": {
            "1": {
              "name": "storage.type.format.python"
            },
            "2": {
              "name": "storage.type.format.python"
            }
          }
        },
        {
          "include": "#fstring-terminator-single-tail"
        }
      ]
    },
    "fstring-terminator-single-tail": {
      "begin": "(![rsa])?(:)(?=.*?{)",
      "end": "(?=})|(?=\\n)",
      "patterns": [
        {
          "include": "#fstring-illegal-single-brace"
        },
        {
          "include": "#fstring-single-brace"
        },
        {
          "name": "storage.type.format.python",
          "match": "([bcdeEfFgGnosxX%])(?=})"
        },
        {
          "name": "storage.type.format.python",
          "match": "(\\.\\d+)"
        },
        {
          "name": "storage.type.format.python",
          "match": "(,)"
        },
        {
          "name": "storage.type.format.python",
          "match": "(\\d+)"
        },
        {
          "name": "storage.type.format.python",
          "match": "(\\#)"
        },
        {
          "name": "storage.type.format.python",
          "match": "([-+ ])"
        },
        {
          "name": "storage.type.format.python",
          "match": "([\u003c\u003e=^])"
        },
        {
          "name": "storage.type.format.python",
          "match": "(\\w)"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "storage.type.format.python"
        },
        "2": {
          "name": "storage.type.format.python"
        }
      }
    },
    "function-arguments": {
      "contentName": "meta.function-call.arguments.python",
      "begin": "(?x)\n  (?:\n    (\\()\n    (?:\\s*(\\*\\*|\\*))?\n  )\n",
      "end": "(?=\\))(?!\\)\\s*\\()",
      "patterns": [
        {
          "match": "(?x)\n  (?:\n    (,)\n    (?:\\s*(\\*\\*|\\*))?\n  )\n",
          "captures": {
            "1": {
              "name": "punctuation.separator.arguments.python"
            },
            "2": {
              "name": "keyword.operator.unpacking.arguments.python"
            }
          }
        },
        {
          "include": "#lambda-incomplete"
        },
        {
          "include": "#illegal-names"
        },
        {
          "match": "\\b([[:alpha:]_]\\w*)\\s*(=)(?!=)",
          "captures": {
            "1": {
              "name": "variable.parameter.function-call.python"
            },
            "2": {
              "name": "keyword.operator.assignment.python"
            }
          }
        },
        {
          "name": "keyword.operator.assignment.python",
          "match": "=(?!=)"
        },
        {
          "include": "#expression"
        },
        {
          "match": "\\s*(\\))\\s*(\\()",
          "captures": {
            "1": {
              "name": "punctuation.definition.arguments.end.python"
            },
            "2": {
              "name": "punctuation.definition.arguments.begin.python"
            }
          }
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.definition.arguments.begin.python"
        },
        "2": {
          "name": "keyword.operator.unpacking.arguments.python"
        }
      }
    },
    "function-call": {
      "name": "meta.function-call.python",
      "begin": "(?x)\n  \\b(?=\n    ([[:alpha:]_]\\w*) \\s* (\\()\n  )\n",
      "end": "(\\))",
      "patterns": [
        {
          "include": "#special-variables"
        },
        {
          "include": "#function-name"
        },
        {
          "include": "#function-arguments"
        }
      ],
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.arguments.end.python"
        }
      }
    },
    "function-declaration": {
      "name": "meta.function.python",
      "begin": "(?x)\n  \\s*\n  (?:\\b(async) \\s+)? \\b(def)\\s+\n    (?=\n      [[:alpha:]_][[:word:]]* \\s* \\(\n    )\n",
      "end": "(:|(?=[#'\"\\n]))",
      "patterns": [
        {
          "include": "#function-def-name"
        },
        {
          "include": "#parameters"
        },
        {
          "include": "#line-continuation"
        },
        {
          "include": "#return-annotation"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "storage.type.function.async.python"
        },
        "2": {
          "name": "storage.type.function.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.section.function.begin.python"
        }
      }
    },
    "function-def-name": {
      "patterns": [
        {
          "include": "#illegal-object-name"
        },
        {
          "include": "#builtin-possible-callables"
        },
        {
          "name": "entity.name.function.python",
          "match": "(?x)\n  \\b ([[:alpha:]_]\\w*) \\b\n"
        }
      ]
    },
    "function-name": {
      "patterns": [
        {
          "include": "#builtin-possible-callables"
        },
        {
          "name": "meta.function-call.generic.python",
          "match": "(?x)\n  \\b ([[:alpha:]_]\\w*) \\b\n"
        }
      ]
    },
    "illegal-anno": {
      "name": "invalid.illegal.annotation.python",
      "match": "-\u003e"
    },
    "illegal-names": {
      "name": "keyword.control.flow.python",
      "match": "(?x)\n  \\b(\n    and | as | assert | async | await | break | class | continue | def\n    | del | elif | else | except | exec | finally | for | from | global\n    | if | import | in | is | (?\u003c=\\.)lambda | lambda(?=\\s*[\\.=])\n    | nonlocal | not | or | pass | raise | return | try | while | with\n    | yield\n  )\\b\n"
    },
    "illegal-object-name": {
      "name": "keyword.illegal.name.python",
      "match": "\\b(True|False|None)\\b"
    },
    "illegal-operator": {
      "patterns": [
        {
          "name": "invalid.illegal.operator.python",
          "match": "\u0026\u0026|\\|\\||--|\\+\\+"
        },
        {
          "name": "invalid.illegal.operator.python",
          "match": "[?$]"
        },
        {
          "name": "invalid.illegal.operator.python",
          "match": "!\\b"
        }
      ]
    },
    "import": {
      "patterns": [
        {
          "match": "(?x)\n  \\s* \\b(from)\\b \\s*(\\.+)\\s* (import)?\n",
          "captures": {
            "1": {
              "name": "keyword.control.import.python"
            },
            "2": {
              "name": "punctuation.separator.period.python"
            },
            "3": {
              "name": "keyword.control.import.python"
            }
          }
        },
        {
          "name": "keyword.control.import.python",
          "match": "\\b(?\u003c!\\.)import\\b"
        }
      ]
    },
    "impossible": {
      "match": "$.^"
    },
    "inheritance-identifier": {
      "match": "(?x)\n  \\b ([[:alpha:]_]\\w*) \\b\n",
      "captures": {
        "1": {
          "name": "entity.other.inherited-class.python"
        }
      }
    },
    "inheritance-name": {
      "patterns": [
        {
          "include": "#lambda-incomplete"
        },
        {
          "include": "#builtin-possible-callables"
        },
        {
          "include": "#inheritance-identifier"
        }
      ]
    },
    "item-access": {
      "patterns": [
        {
          "name": "meta.item-access.python",
          "begin": "(?x)\n  \\b(?=\n    [[:alpha:]_]\\w* \\s* \\[\n  )\n",
          "end": "(\\])",
          "patterns": [
            {
              "include": "#item-name"
            },
            {
              "include": "#item-index"
            },
            {
              "include": "#expression"
            }
          ],
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.arguments.end.python"
            }
          }
        }
      ]
    },
    "item-index": {
      "contentName": "meta.item-access.arguments.python",
      "begin": "(\\[)",
      "end": "(?=\\])",
      "patterns": [
        {
          "name": "punctuation.separator.slice.python",
          "match": ":"
        },
        {
          "include": "#expression"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.definition.arguments.begin.python"
        }
      }
    },
    "item-name": {
      "patterns": [
        {
          "include": "#special-variables"
        },
        {
          "include": "#builtin-functions"
        },
        {
          "include": "#special-names"
        },
        {
          "match": "(?x)\n  \\b ([[:alpha:]_]\\w*) \\b\n"
        }
      ]
    },
    "lambda": {
      "patterns": [
        {
          "match": "((?\u003c=\\.)lambda|lambda(?=\\s*[\\.=]))",
          "captures": {
            "1": {
              "name": "keyword.control.flow.python"
            }
          }
        },
        {
          "match": "\\b(lambda)\\s*?(?=[,\\n]|$)",
          "captures": {
            "1": {
              "name": "storage.type.function.lambda.python"
            }
          }
        },
        {
          "name": "meta.lambda-function.python",
          "contentName": "meta.function.lambda.parameters.python",
          "begin": "(?x)\n  \\b (lambda) \\b\n",
          "end": "(:)|(\\n)",
          "patterns": [
            {
              "name": "keyword.operator.unpacking.parameter.python",
              "match": "(\\*\\*|\\*)"
            },
            {
              "include": "#lambda-nested-incomplete"
            },
            {
              "include": "#illegal-names"
            },
            {
              "match": "([[:alpha:]_]\\w*)\\s*(?:(,)|(?=:|$))",
              "captures": {
                "1": {
                  "name": "variable.parameter.function.language.python"
                },
                "2": {
                  "name": "punctuation.separator.parameters.python"
                }
              }
            },
            {
              "include": "#comments"
            },
            {
              "include": "#backticks"
            },
            {
              "include": "#illegal-anno"
            },
            {
              "include": "#lambda-parameter-with-default"
            },
            {
              "include": "#line-continuation"
            },
            {
              "include": "#illegal-operator"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "storage.type.function.lambda.python"
            }
          },
          "endCaptures": {
            "1": {
              "name": "punctuation.section.function.lambda.begin.python"
            }
          }
        }
      ]
    },
    "lambda-incomplete": {
      "name": "storage.type.function.lambda.python",
      "match": "\\blambda(?=\\s*[,)])"
    },
    "lambda-nested-incomplete": {
      "name": "storage.type.function.lambda.python",
      "match": "\\blambda(?=\\s*[:,)])"
    },
    "lambda-parameter-with-default": {
      "begin": "(?x)\n  \\b\n  ([[:alpha:]_]\\w*) \\s* (=)\n",
      "end": "(,)|(?=:|$)",
      "patterns": [
        {
          "include": "#expression"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "variable.parameter.function.language.python"
        },
        "2": {
          "name": "keyword.operator.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.separator.parameters.python"
        }
      }
    },
    "line-continuation": {
      "patterns": [
        {
          "match": "(\\\\)\\s*(\\S.*$\\n?)",
          "captures": {
            "1": {
              "name": "punctuation.separator.continuation.line.python"
            },
            "2": {
              "name": "invalid.illegal.line.continuation.python"
            }
          }
        },
        {
          "begin": "(\\\\)\\s*$\\n?",
          "end": "(?x)\n  (?=^\\s*$)\n  |\n  (?! (\\s* [rR]? (\\'\\'\\'|\\\"\\\"\\\"|\\'|\\\"))\n      |\n      (\\G $)  (?# '\\G' is necessary for ST)\n  )\n",
          "patterns": [
            {
              "include": "#regexp"
            },
            {
              "include": "#string"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "punctuation.separator.continuation.line.python"
            }
          }
        }
      ]
    },
    "list": {
      "begin": "\\[",
      "end": "\\]",
      "patterns": [
        {
          "include": "#expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.list.begin.python"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.list.end.python"
        }
      }
    },
    "literal": {
      "patterns": [
        {
          "name": "constant.language.python",
          "match": "\\b(True|False|None|NotImplemented|Ellipsis)\\b"
        },
        {
          "include": "#number"
        }
      ]
    },
    "loose-default": {
      "begin": "(=)",
      "end": "(,)|(?=\\))",
      "patterns": [
        {
          "include": "#expression"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "keyword.operator.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.separator.parameters.python"
        }
      }
    },
    "magic-function-names": {
      "match": "(?x)\n  \\b(\n    __(?:\n      abs | add | aenter | aexit | aiter | and | anext | await\n      | bool | call | ceil | cmp | coerce | complex | contains\n      | copy | deepcopy | del | delattr | delete | delitem\n      | delslice | dir | div | divmod | enter | eq | exit | float\n      | floor | floordiv | format | ge | get | getattr\n      | getattribute | getinitargs | getitem | getnewargs\n      | getslice | getstate | gt | hash | hex | iadd | iand | idiv\n      | ifloordiv | ilshift | imod | imul | index | init\n      | instancecheck | int | invert | ior | ipow | irshift | isub\n      | iter | itruediv | ixor | le | len | long | lshift | lt\n      | missing | mod | mul | ne | neg | new | next | nonzero | oct | or\n      | pos | pow | radd | rand | rdiv | rdivmod | reduce\n      | reduce_ex | repr | reversed | rfloordiv | rlshift | rmod\n      | rmul | ror | round | rpow | rrshift | rshift | rsub\n      | rtruediv | rxor | set | setattr | setitem | setslice\n      | setstate | sizeof | str | sub | subclasscheck | truediv\n      | trunc | unicode | xor | matmul | rmatmul | imatmul\n      | init_subclass | set_name | fspath | bytes | prepare\n    )__\n  )\\b\n",
      "captures": {
        "1": {
          "name": "support.function.magic.python"
        }
      }
    },
    "magic-names": {
      "patterns": [
        {
          "include": "#magic-function-names"
        },
        {
          "include": "#magic-variable-names"
        }
      ]
    },
    "magic-variable-names": {
      "match": "(?x)\n  \\b(\n    __(?:\n      all | bases | builtins | class | code | debug | defaults | dict\n      | doc | file | func | kwdefaults | members\n      | metaclass | methods | module | mro | name\n      | qualname | self | signature | slots | subclasses\n      | version | weakref | wrapped | annotations | classcell\n      | spec | path | package | future | traceback\n    )__\n  )\\b\n",
      "captures": {
        "1": {
          "name": "support.variable.magic.python"
        }
      }
    },
    "member-access": {
      "begin": "(\\.)\\s*(?!\\.)",
      "end": "(?x)\n  # stop when you've just read non-whitespace followed by non-word\n  # i.e. when finished reading an identifier or function call\n  (?\u003c=\\S)(?=\\W) |\n  # stop when seeing the start of something that's not a word,\n  # i.e. when seeing a non-identifier\n  (^|(?\u003c=\\s))(?=[^\\\\\\w\\s]) |\n  $\n",
      "patterns": [
        {
          "include": "#function-call"
        },
        {
          "include": "#member-access-base"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.separator.period.python"
        }
      }
    },
    "member-access-base": {
      "patterns": [
        {
          "include": "#magic-names"
        },
        {
          "include": "#illegal-names"
        },
        {
          "include": "#illegal-object-name"
        },
        {
          "include": "#special-names"
        },
        {
          "include": "#line-continuation"
        },
        {
          "include": "#item-access"
        }
      ]
    },
    "member-access-class": {
      "begin": "(\\.)\\s*(?!\\.)",
      "end": "(?\u003c=\\S)(?=\\W)|$",
      "patterns": [
        {
          "include": "#call-wrapper-inheritance"
        },
        {
          "include": "#member-access-base"
        },
        {
          "include": "#inheritance-identifier"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.separator.period.python"
        }
      }
    },
    "number": {
      "name": "constant.numeric.python",
      "patterns": [
        {
          "include": "#number-float"
        },
        {
          "include": "#number-dec"
        },
        {
          "include": "#number-hex"
        },
        {
          "include": "#number-oct"
        },
        {
          "include": "#number-bin"
        },
        {
          "include": "#number-long"
        },
        {
          "name": "invalid.illegal.name.python",
          "match": "\\b[0-9]+\\w+"
        }
      ]
    },
    "number-bin": {
      "name": "constant.numeric.bin.python",
      "match": "(?x)\n  (?\u003c![\\w\\.])\n    (0[bB]) (_?[01])+\n  \\b\n",
      "captures": {
        "1": {
          "name": "storage.type.number.python"
        }
      }
    },
    "number-dec": {
      "name": "constant.numeric.dec.python",
      "match": "(?x)\n  (?\u003c![\\w\\.])(?:\n      [1-9](?: _?[0-9] )*\n      |\n      0+\n      |\n      [0-9](?: _?[0-9] )* ([jJ])\n      |\n      0 ([0-9]+)(?![eE\\.])\n  )\\b\n",
      "captures": {
        "1": {
          "name": "storage.type.imaginary.number.python"
        },
        "2": {
          "name": "invalid.illegal.dec.python"
        },
        "3": {
          "name": "invalid.illegal.dec.python"
        }
      }
    },
    "number-float": {
      "name": "constant.numeric.float.python",
      "match": "(?x)\n  (?\u003c! \\w)(?:\n    (?:\n      \\.[0-9](?: _?[0-9] )*\n      |\n      [0-9](?: _?[0-9] )* \\. [0-9](?: _?[0-9] )*\n      |\n      [0-9](?: _?[0-9] )* \\.\n    ) (?: [eE][+-]?[0-9](?: _?[0-9] )* )?\n    |\n    [0-9](?: _?[0-9] )* (?: [eE][+-]?[0-9](?: _?[0-9] )* )\n  )([jJ])?\\b\n",
      "captures": {
        "1": {
          "name": "storage.type.imaginary.number.python"
        }
      }
    },
    "number-hex": {
      "name": "constant.numeric.hex.python",
      "match": "(?x)\n  (?\u003c![\\w\\.])\n    (0[xX]) (_?[0-9a-fA-F])+\n  \\b\n",
      "captures": {
        "1": {
          "name": "storage.type.number.python"
        }
      }
    },
    "number-long": {
      "name": "constant.numeric.bin.python",
      "match": "(?x)\n  (?\u003c![\\w\\.])\n    ([1-9][0-9]* | 0) ([lL])\n  \\b\n",
      "captures": {
        "2": {
          "name": "storage.type.number.python"
        }
      }
    },
    "number-oct": {
      "name": "constant.numeric.oct.python",
      "match": "(?x)\n  (?\u003c![\\w\\.])\n    (0[oO]) (_?[0-7])+\n  \\b\n",
      "captures": {
        "1": {
          "name": "storage.type.number.python"
        }
      }
    },
    "operator": {
      "match": "(?x)\n    \\b(?\u003c!\\.)\n      (?:\n        (and | or | not | in | is)                         (?# 1)\n        |\n        (for | if | else | await | (?:yield(?:\\s+from)?))  (?# 2)\n      )\n    (?!\\s*:)\\b\n\n    | (\u003c\u003c | \u003e\u003e | \u0026 | \\| | \\^ | ~)                          (?# 3)\n\n    | (\\*\\* | \\* | \\+ | - | % | // | / | @)                (?# 4)\n\n    | (!= | == | \u003e= | \u003c= | \u003c | \u003e)                          (?# 5)\n",
      "captures": {
        "1": {
          "name": "keyword.operator.logical.python"
        },
        "2": {
          "name": "keyword.control.flow.python"
        },
        "3": {
          "name": "keyword.operator.bitwise.python"
        },
        "4": {
          "name": "keyword.operator.arithmetic.python"
        },
        "5": {
          "name": "keyword.operator.comparison.python"
        }
      }
    },
    "parameter-special": {
      "match": "(?x)\n  \\b ((self)|(cls)) \\b \\s*(?:(,)|(?=\\)))\n",
      "captures": {
        "1": {
          "name": "variable.parameter.function.language.python"
        },
        "2": {
          "name": "variable.parameter.function.language.special.self.python"
        },
        "3": {
          "name": "variable.parameter.function.language.special.cls.python"
        },
        "4": {
          "name": "punctuation.separator.parameters.python"
        }
      }
    },
    "parameters": {
      "name": "meta.function.parameters.python",
      "begin": "(\\()",
      "end": "(\\))",
      "patterns": [
        {
          "name": "keyword.operator.unpacking.parameter.python",
          "match": "(\\*\\*|\\*)"
        },
        {
          "include": "#lambda-incomplete"
        },
        {
          "include": "#illegal-names"
        },
        {
          "include": "#illegal-object-name"
        },
        {
          "include": "#parameter-special"
        },
        {
          "match": "(?x)\n  ([[:alpha:]_]\\w*)\n    \\s* (?: (,) | (?=[)#\\n=]))\n",
          "captures": {
            "1": {
              "name": "variable.parameter.function.language.python"
            },
            "2": {
              "name": "punctuation.separator.parameters.python"
            }
          }
        },
        {
          "include": "#comments"
        },
        {
          "include": "#loose-default"
        },
        {
          "include": "#annotated-parameter"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.definition.parameters.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.parameters.end.python"
        }
      }
    },
    "punctuation": {
      "patterns": [
        {
          "name": "punctuation.separator.colon.python",
          "match": ":"
        },
        {
          "name": "punctuation.separator.element.python",
          "match": ","
        }
      ]
    },
    "regexp": {
      "patterns": [
        {
          "include": "#regexp-single-three-line"
        },
        {
          "include": "#regexp-double-three-line"
        },
        {
          "include": "#regexp-single-one-line"
        },
        {
          "include": "#regexp-double-one-line"
        },
        {
          "include": "#fregexp-single-three-line"
        },
        {
          "include": "#fregexp-double-three-line"
        },
        {
          "include": "#fregexp-single-one-line"
        },
        {
          "include": "#fregexp-double-one-line"
        }
      ]
    },
    "regexp-backreference": {
      "name": "meta.backreference.named.regexp",
      "match": "(?x)\n  (\\()  (\\?P= \\w+(?:\\s+[[:alnum:]]+)?)  (\\))\n",
      "captures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.backreference.named.begin.regexp"
        },
        "2": {
          "name": "entity.name.tag.named.backreference.regexp"
        },
        "3": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.backreference.named.end.regexp"
        }
      }
    },
    "regexp-backreference-number": {
      "name": "meta.backreference.regexp",
      "match": "(\\\\[1-9]\\d?)",
      "captures": {
        "1": {
          "name": "entity.name.tag.backreference.regexp"
        }
      }
    },
    "regexp-base-common": {
      "patterns": [
        {
          "name": "support.other.match.any.regexp",
          "match": "\\."
        },
        {
          "name": "support.other.match.begin.regexp",
          "match": "\\^"
        },
        {
          "name": "support.other.match.end.regexp",
          "match": "\\$"
        },
        {
          "name": "keyword.operator.quantifier.regexp",
          "match": "[+*?]\\??"
        },
        {
          "name": "keyword.operator.disjunction.regexp",
          "match": "\\|"
        },
        {
          "include": "#regexp-escape-sequence"
        }
      ]
    },
    "regexp-base-expression": {
      "patterns": [
        {
          "include": "#regexp-quantifier"
        },
        {
          "include": "#regexp-base-common"
        }
      ]
    },
    "regexp-charecter-set-escapes": {
      "patterns": [
        {
          "name": "constant.character.escape.regexp",
          "match": "\\\\[abfnrtv\\\\]"
        },
        {
          "include": "#regexp-escape-special"
        },
        {
          "name": "constant.character.escape.regexp",
          "match": "\\\\([0-7]{1,3})"
        },
        {
          "include": "#regexp-escape-character"
        },
        {
          "include": "#regexp-escape-unicode"
        },
        {
          "include": "#regexp-escape-catchall"
        }
      ]
    },
    "regexp-double-one-line": {
      "name": "string.regexp.quoted.single.python",
      "begin": "\\b(([uU]r)|([bB]r)|(r[bB]?))(\")",
      "end": "(\")|(?\u003c!\\\\)(\\n)",
      "patterns": [
        {
          "include": "#double-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "2": {
          "name": "invalid.deprecated.prefix.python"
        },
        "3": {
          "name": "storage.type.string.python"
        },
        "4": {
          "name": "storage.type.string.python"
        },
        "5": {
          "name": "punctuation.definition.string.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "regexp-double-three-line": {
      "name": "string.regexp.quoted.multi.python",
      "begin": "\\b(([uU]r)|([bB]r)|(r[bB]?))(\"\"\")",
      "end": "(\"\"\")",
      "patterns": [
        {
          "include": "#double-three-regexp-expression"
        }
      ],
      "beginCaptures": {
        "2": {
          "name": "invalid.deprecated.prefix.python"
        },
        "3": {
          "name": "storage.type.string.python"
        },
        "4": {
          "name": "storage.type.string.python"
        },
        "5": {
          "name": "punctuation.definition.string.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "regexp-escape-catchall": {
      "name": "constant.character.escape.regexp",
      "match": "\\\\(.|\\n)"
    },
    "regexp-escape-character": {
      "name": "constant.character.escape.regexp",
      "match": "(?x)\n  \\\\ (\n        x[0-9A-Fa-f]{2}\n        | 0[0-7]{1,2}\n        | [0-7]{3}\n     )\n"
    },
    "regexp-escape-sequence": {
      "patterns": [
        {
          "include": "#regexp-escape-special"
        },
        {
          "include": "#regexp-escape-character"
        },
        {
          "include": "#regexp-escape-unicode"
        },
        {
          "include": "#regexp-backreference-number"
        },
        {
          "include": "#regexp-escape-catchall"
        }
      ]
    },
    "regexp-escape-special": {
      "name": "support.other.escape.special.regexp",
      "match": "\\\\([AbBdDsSwWZ])"
    },
    "regexp-escape-unicode": {
      "name": "constant.character.unicode.regexp",
      "match": "(?x)\n  \\\\ (\n        u[0-9A-Fa-f]{4}\n        | U[0-9A-Fa-f]{8}\n     )\n"
    },
    "regexp-flags": {
      "name": "storage.modifier.flag.regexp",
      "match": "\\(\\?[aiLmsux]+\\)"
    },
    "regexp-quantifier": {
      "name": "keyword.operator.quantifier.regexp",
      "match": "(?x)\n  \\{(\n    \\d+ | \\d+,(\\d+)? | ,\\d+\n  )\\}\n"
    },
    "regexp-single-one-line": {
      "name": "string.regexp.quoted.single.python",
      "begin": "\\b(([uU]r)|([bB]r)|(r[bB]?))(\\')",
      "end": "(\\')|(?\u003c!\\\\)(\\n)",
      "patterns": [
        {
          "include": "#single-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "2": {
          "name": "invalid.deprecated.prefix.python"
        },
        "3": {
          "name": "storage.type.string.python"
        },
        "4": {
          "name": "storage.type.string.python"
        },
        "5": {
          "name": "punctuation.definition.string.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "regexp-single-three-line": {
      "name": "string.regexp.quoted.multi.python",
      "begin": "\\b(([uU]r)|([bB]r)|(r[bB]?))(\\'\\'\\')",
      "end": "(\\'\\'\\')",
      "patterns": [
        {
          "include": "#single-three-regexp-expression"
        }
      ],
      "beginCaptures": {
        "2": {
          "name": "invalid.deprecated.prefix.python"
        },
        "3": {
          "name": "storage.type.string.python"
        },
        "4": {
          "name": "storage.type.string.python"
        },
        "5": {
          "name": "punctuation.definition.string.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "return-annotation": {
      "begin": "(-\u003e)",
      "end": "(?=:)",
      "patterns": [
        {
          "include": "#expression"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "punctuation.separator.annotation.result.python"
        }
      }
    },
    "round-braces": {
      "begin": "\\(",
      "end": "\\)",
      "patterns": [
        {
          "include": "#expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "punctuation.parenthesis.begin.python"
        }
      },
      "endCaptures": {
        "0": {
          "name": "punctuation.parenthesis.end.python"
        }
      }
    },
    "semicolon": {
      "patterns": [
        {
          "name": "invalid.deprecated.semicolon.python",
          "match": "\\;$"
        }
      ]
    },
    "single-one-fregexp-conditional": {
      "begin": "(\\()\\?\\((\\w+(?:\\s+[[:alnum:]]+)?|\\d+)\\)",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#single-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.conditional.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.conditional.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.conditional.negative.regexp punctuation.parenthesis.conditional.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-one-fregexp-expression": {
      "patterns": [
        {
          "include": "#fregexp-base-expression"
        },
        {
          "include": "#single-one-regexp-character-set"
        },
        {
          "include": "#single-one-regexp-comments"
        },
        {
          "include": "#regexp-flags"
        },
        {
          "include": "#single-one-regexp-named-group"
        },
        {
          "include": "#regexp-backreference"
        },
        {
          "include": "#single-one-fregexp-lookahead"
        },
        {
          "include": "#single-one-fregexp-lookahead-negative"
        },
        {
          "include": "#single-one-fregexp-lookbehind"
        },
        {
          "include": "#single-one-fregexp-lookbehind-negative"
        },
        {
          "include": "#single-one-fregexp-conditional"
        },
        {
          "include": "#single-one-fregexp-parentheses-non-capturing"
        },
        {
          "include": "#single-one-fregexp-parentheses"
        }
      ]
    },
    "single-one-fregexp-lookahead": {
      "begin": "(\\()\\?=",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#single-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookahead.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookahead.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-one-fregexp-lookahead-negative": {
      "begin": "(\\()\\?!",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#single-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookahead.negative.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookahead.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-one-fregexp-lookbehind": {
      "begin": "(\\()\\?\u003c=",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#single-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookbehind.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookbehind.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-one-fregexp-lookbehind-negative": {
      "begin": "(\\()\\?\u003c!",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#single-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookbehind.negative.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookbehind.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookbehind.negative.regexp punctuation.parenthesis.lookbehind.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-one-fregexp-named-group": {
      "name": "meta.named.regexp",
      "begin": "(?x)\n  (\\()  (\\?P \u003c\\w+(?:\\s+[[:alnum:]]+)?\u003e)\n",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#single-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp"
        },
        "2": {
          "name": "entity.name.tag.named.group.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-one-fregexp-parentheses": {
      "begin": "\\(",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#single-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-one-fregexp-parentheses-non-capturing": {
      "begin": "\\(\\?:",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#single-one-fregexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-one-regexp-character-set": {
      "patterns": [
        {
          "match": "(?x)\n  \\[ \\^? \\] (?! .*?\\])\n"
        },
        {
          "name": "meta.character.set.regexp",
          "begin": "(\\[)(\\^)?(\\])?",
          "end": "(\\]|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
          "patterns": [
            {
              "include": "#regexp-charecter-set-escapes"
            },
            {
              "name": "constant.character.set.regexp",
              "match": "[^\\n]"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "punctuation.character.set.begin.regexp constant.other.set.regexp"
            },
            "2": {
              "name": "keyword.operator.negation.regexp"
            },
            "3": {
              "name": "constant.character.set.regexp"
            }
          },
          "endCaptures": {
            "1": {
              "name": "punctuation.character.set.end.regexp constant.other.set.regexp"
            },
            "2": {
              "name": "invalid.illegal.newline.python"
            }
          }
        }
      ]
    },
    "single-one-regexp-comments": {
      "name": "comment.regexp",
      "begin": "\\(\\?#",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#codetags"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "punctuation.comment.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.comment.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-one-regexp-conditional": {
      "begin": "(\\()\\?\\((\\w+(?:\\s+[[:alnum:]]+)?|\\d+)\\)",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#single-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.conditional.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.conditional.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.conditional.negative.regexp punctuation.parenthesis.conditional.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-one-regexp-expression": {
      "patterns": [
        {
          "include": "#regexp-base-expression"
        },
        {
          "include": "#single-one-regexp-character-set"
        },
        {
          "include": "#single-one-regexp-comments"
        },
        {
          "include": "#regexp-flags"
        },
        {
          "include": "#single-one-regexp-named-group"
        },
        {
          "include": "#regexp-backreference"
        },
        {
          "include": "#single-one-regexp-lookahead"
        },
        {
          "include": "#single-one-regexp-lookahead-negative"
        },
        {
          "include": "#single-one-regexp-lookbehind"
        },
        {
          "include": "#single-one-regexp-lookbehind-negative"
        },
        {
          "include": "#single-one-regexp-conditional"
        },
        {
          "include": "#single-one-regexp-parentheses-non-capturing"
        },
        {
          "include": "#single-one-regexp-parentheses"
        }
      ]
    },
    "single-one-regexp-lookahead": {
      "begin": "(\\()\\?=",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#single-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookahead.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookahead.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-one-regexp-lookahead-negative": {
      "begin": "(\\()\\?!",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#single-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookahead.negative.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookahead.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-one-regexp-lookbehind": {
      "begin": "(\\()\\?\u003c=",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#single-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookbehind.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookbehind.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-one-regexp-lookbehind-negative": {
      "begin": "(\\()\\?\u003c!",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#single-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookbehind.negative.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookbehind.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookbehind.negative.regexp punctuation.parenthesis.lookbehind.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-one-regexp-named-group": {
      "name": "meta.named.regexp",
      "begin": "(?x)\n  (\\()  (\\?P \u003c\\w+(?:\\s+[[:alnum:]]+)?\u003e)\n",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#single-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp"
        },
        "2": {
          "name": "entity.name.tag.named.group.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-one-regexp-parentheses": {
      "begin": "\\(",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#single-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-one-regexp-parentheses-non-capturing": {
      "begin": "\\(\\?:",
      "end": "(\\)|(?=\\'))|((?=(?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#single-one-regexp-expression"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-fregexp-conditional": {
      "begin": "(\\()\\?\\((\\w+(?:\\s+[[:alnum:]]+)?|\\d+)\\)",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#single-three-fregexp-expression"
        },
        {
          "include": "#comments-string-single-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.conditional.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.conditional.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.conditional.negative.regexp punctuation.parenthesis.conditional.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-fregexp-expression": {
      "patterns": [
        {
          "include": "#fregexp-base-expression"
        },
        {
          "include": "#single-three-regexp-character-set"
        },
        {
          "include": "#single-three-regexp-comments"
        },
        {
          "include": "#regexp-flags"
        },
        {
          "include": "#single-three-regexp-named-group"
        },
        {
          "include": "#regexp-backreference"
        },
        {
          "include": "#single-three-fregexp-lookahead"
        },
        {
          "include": "#single-three-fregexp-lookahead-negative"
        },
        {
          "include": "#single-three-fregexp-lookbehind"
        },
        {
          "include": "#single-three-fregexp-lookbehind-negative"
        },
        {
          "include": "#single-three-fregexp-conditional"
        },
        {
          "include": "#single-three-fregexp-parentheses-non-capturing"
        },
        {
          "include": "#single-three-fregexp-parentheses"
        },
        {
          "include": "#comments-string-single-three"
        }
      ]
    },
    "single-three-fregexp-lookahead": {
      "begin": "(\\()\\?=",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#single-three-fregexp-expression"
        },
        {
          "include": "#comments-string-single-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookahead.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookahead.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-fregexp-lookahead-negative": {
      "begin": "(\\()\\?!",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#single-three-fregexp-expression"
        },
        {
          "include": "#comments-string-single-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookahead.negative.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookahead.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-fregexp-lookbehind": {
      "begin": "(\\()\\?\u003c=",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#single-three-fregexp-expression"
        },
        {
          "include": "#comments-string-single-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookbehind.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookbehind.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-fregexp-lookbehind-negative": {
      "begin": "(\\()\\?\u003c!",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#single-three-fregexp-expression"
        },
        {
          "include": "#comments-string-single-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookbehind.negative.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookbehind.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookbehind.negative.regexp punctuation.parenthesis.lookbehind.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-fregexp-named-group": {
      "name": "meta.named.regexp",
      "begin": "(?x)\n  (\\()  (\\?P \u003c\\w+(?:\\s+[[:alnum:]]+)?\u003e)\n",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#single-three-fregexp-expression"
        },
        {
          "include": "#comments-string-single-three"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp"
        },
        "2": {
          "name": "entity.name.tag.named.group.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-fregexp-parentheses": {
      "begin": "\\(",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#single-three-fregexp-expression"
        },
        {
          "include": "#comments-string-single-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-fregexp-parentheses-non-capturing": {
      "begin": "\\(\\?:",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#single-three-fregexp-expression"
        },
        {
          "include": "#comments-string-single-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-regexp-character-set": {
      "patterns": [
        {
          "match": "(?x)\n  \\[ \\^? \\] (?! .*?\\])\n"
        },
        {
          "name": "meta.character.set.regexp",
          "begin": "(\\[)(\\^)?(\\])?",
          "end": "(\\]|(?=\\'\\'\\'))",
          "patterns": [
            {
              "include": "#regexp-charecter-set-escapes"
            },
            {
              "name": "constant.character.set.regexp",
              "match": "[^\\n]"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "punctuation.character.set.begin.regexp constant.other.set.regexp"
            },
            "2": {
              "name": "keyword.operator.negation.regexp"
            },
            "3": {
              "name": "constant.character.set.regexp"
            }
          },
          "endCaptures": {
            "1": {
              "name": "punctuation.character.set.end.regexp constant.other.set.regexp"
            },
            "2": {
              "name": "invalid.illegal.newline.python"
            }
          }
        }
      ]
    },
    "single-three-regexp-comments": {
      "name": "comment.regexp",
      "begin": "\\(\\?#",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#codetags"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "punctuation.comment.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.comment.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-regexp-conditional": {
      "begin": "(\\()\\?\\((\\w+(?:\\s+[[:alnum:]]+)?|\\d+)\\)",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#single-three-regexp-expression"
        },
        {
          "include": "#comments-string-single-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.conditional.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.conditional.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.conditional.negative.regexp punctuation.parenthesis.conditional.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-regexp-expression": {
      "patterns": [
        {
          "include": "#regexp-base-expression"
        },
        {
          "include": "#single-three-regexp-character-set"
        },
        {
          "include": "#single-three-regexp-comments"
        },
        {
          "include": "#regexp-flags"
        },
        {
          "include": "#single-three-regexp-named-group"
        },
        {
          "include": "#regexp-backreference"
        },
        {
          "include": "#single-three-regexp-lookahead"
        },
        {
          "include": "#single-three-regexp-lookahead-negative"
        },
        {
          "include": "#single-three-regexp-lookbehind"
        },
        {
          "include": "#single-three-regexp-lookbehind-negative"
        },
        {
          "include": "#single-three-regexp-conditional"
        },
        {
          "include": "#single-three-regexp-parentheses-non-capturing"
        },
        {
          "include": "#single-three-regexp-parentheses"
        },
        {
          "include": "#comments-string-single-three"
        }
      ]
    },
    "single-three-regexp-lookahead": {
      "begin": "(\\()\\?=",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#single-three-regexp-expression"
        },
        {
          "include": "#comments-string-single-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookahead.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookahead.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookahead.regexp punctuation.parenthesis.lookahead.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-regexp-lookahead-negative": {
      "begin": "(\\()\\?!",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#single-three-regexp-expression"
        },
        {
          "include": "#comments-string-single-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookahead.negative.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookahead.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookahead.negative.regexp punctuation.parenthesis.lookahead.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-regexp-lookbehind": {
      "begin": "(\\()\\?\u003c=",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#single-three-regexp-expression"
        },
        {
          "include": "#comments-string-single-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookbehind.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookbehind.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookbehind.regexp punctuation.parenthesis.lookbehind.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-regexp-lookbehind-negative": {
      "begin": "(\\()\\?\u003c!",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#single-three-regexp-expression"
        },
        {
          "include": "#comments-string-single-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.lookbehind.negative.regexp"
        },
        "1": {
          "name": "punctuation.parenthesis.lookbehind.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "keyword.operator.lookbehind.negative.regexp punctuation.parenthesis.lookbehind.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-regexp-named-group": {
      "name": "meta.named.regexp",
      "begin": "(?x)\n  (\\()  (\\?P \u003c\\w+(?:\\s+[[:alnum:]]+)?\u003e)\n",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#single-three-regexp-expression"
        },
        {
          "include": "#comments-string-single-three"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.begin.regexp"
        },
        "2": {
          "name": "entity.name.tag.named.group.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.named.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-regexp-parentheses": {
      "begin": "\\(",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#single-three-regexp-expression"
        },
        {
          "include": "#comments-string-single-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "single-three-regexp-parentheses-non-capturing": {
      "begin": "\\(\\?:",
      "end": "(\\)|(?=\\'\\'\\'))",
      "patterns": [
        {
          "include": "#single-three-regexp-expression"
        },
        {
          "include": "#comments-string-single-three"
        }
      ],
      "beginCaptures": {
        "0": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.begin.regexp"
        }
      },
      "endCaptures": {
        "1": {
          "name": "support.other.parenthesis.regexp punctuation.parenthesis.non-capturing.end.regexp"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "special-names": {
      "name": "constant.other.caps.python",
      "match": "(?x)\n  \\b\n    # we want to see \"enough\", meaning 2 or more upper-case\n    # letters in the beginning of the constant\n    #\n    # for more details refer to:\n    #   https://github.com/MagicStack/MagicPython/issues/42\n    (\n      _* [[:upper:]] [_\\d]* [[:upper:]]\n    )\n    [[:upper:]\\d]* (_\\w*)?\n  \\b\n"
    },
    "special-variables": {
      "match": "(?x)\n  \\b (?\u003c!\\.) (?:\n    (self) | (cls)\n  )\\b\n",
      "captures": {
        "1": {
          "name": "variable.language.special.self.python"
        },
        "2": {
          "name": "variable.language.special.cls.python"
        }
      }
    },
    "statement": {
      "patterns": [
        {
          "include": "#import"
        },
        {
          "include": "#class-declaration"
        },
        {
          "include": "#function-declaration"
        },
        {
          "include": "#statement-keyword"
        },
        {
          "include": "#assignment-operator"
        },
        {
          "include": "#decorator"
        },
        {
          "include": "#docstring-statement"
        },
        {
          "include": "#semicolon"
        }
      ]
    },
    "statement-keyword": {
      "patterns": [
        {
          "name": "storage.type.function.python",
          "match": "\\b((async\\s+)?\\s*def)\\b"
        },
        {
          "name": "keyword.control.flow.python",
          "match": "(?x)\n  \\b(?\u003c!\\.)(\n    as | async | continue | del | assert | break | finally | for\n    | from | elif | else | if | except | pass | raise\n    | return | try | while | with\n  )\\b\n"
        },
        {
          "name": "storage.modifier.declaration.python",
          "match": "(?x)\n  \\b(?\u003c!\\.)(\n    global | nonlocal\n  )\\b\n"
        },
        {
          "name": "storage.type.class.python",
          "match": "\\b(?\u003c!\\.)(class)\\b"
        }
      ]
    },
    "string": {
      "patterns": [
        {
          "include": "#string-quoted-multi-line"
        },
        {
          "include": "#string-quoted-single-line"
        },
        {
          "include": "#string-bin-quoted-multi-line"
        },
        {
          "include": "#string-bin-quoted-single-line"
        },
        {
          "include": "#string-raw-quoted-multi-line"
        },
        {
          "include": "#string-raw-quoted-single-line"
        },
        {
          "include": "#string-raw-bin-quoted-multi-line"
        },
        {
          "include": "#string-raw-bin-quoted-single-line"
        },
        {
          "include": "#fstring-fnorm-quoted-multi-line"
        },
        {
          "include": "#fstring-fnorm-quoted-single-line"
        },
        {
          "include": "#fstring-normf-quoted-multi-line"
        },
        {
          "include": "#fstring-normf-quoted-single-line"
        },
        {
          "include": "#fstring-raw-quoted-multi-line"
        },
        {
          "include": "#fstring-raw-quoted-single-line"
        }
      ]
    },
    "string-bin-quoted-multi-line": {
      "name": "string.quoted.binary.multi.python",
      "begin": "(\\b[bB])('''|\"\"\")",
      "end": "(\\2)",
      "patterns": [
        {
          "include": "#string-entity"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "storage.type.string.python"
        },
        "2": {
          "name": "punctuation.definition.string.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "string-bin-quoted-single-line": {
      "name": "string.quoted.binary.single.python",
      "begin": "(\\b[bB])((['\"]))",
      "end": "(\\2)|((?\u003c!\\\\)\\n)",
      "patterns": [
        {
          "include": "#string-entity"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "storage.type.string.python"
        },
        "2": {
          "name": "punctuation.definition.string.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "string-brace-formatting": {
      "patterns": [
        {
          "name": "constant.character.format.placeholder.other.python",
          "match": "(?x)\n  (?:\n    {{ | }}\n    | (?:\n      {\n        \\w*? (\\.[[:alpha:]_]\\w*? | \\[[^\\]'\"]+\\])*?\n        (![rsa])?\n        ( : \\w? [\u003c\u003e=^]? [-+ ]? \\#?\n          \\d* ,? (\\.\\d+)? [bcdeEfFgGnosxX%]? )?\n      })\n  )\n",
          "captures": {
            "2": {
              "name": "storage.type.format.python"
            },
            "3": {
              "name": "storage.type.format.python"
            }
          }
        },
        {
          "name": "constant.character.format.placeholder.other.python",
          "begin": "(?x)\n    \\{\n      \\w*? (\\.[[:alpha:]_]\\w*? | \\[[^\\]'\"]+\\])*?\n      (![rsa])?\n      (:)\n        (?=[^'\"}\\n]*\\})\n",
          "end": "\\}",
          "patterns": [
            {
              "match": "(?x) \\{ [^'\"}\\n]*? \\} (?=.*?\\})\n"
            }
          ],
          "beginCaptures": {
            "2": {
              "name": "storage.type.format.python"
            },
            "3": {
              "name": "storage.type.format.python"
            }
          }
        }
      ]
    },
    "string-consume-escape": {
      "match": "\\\\['\"\\n\\\\]"
    },
    "string-entity": {
      "patterns": [
        {
          "include": "#escape-sequence"
        },
        {
          "include": "#string-line-continuation"
        },
        {
          "include": "#string-formatting"
        }
      ]
    },
    "string-formatting": {
      "name": "constant.character.format.placeholder.other.python",
      "match": "(?x)\n  % (\\([\\w\\s]*\\))?\n    [-+#0 ]*\n    (\\d+|\\*)? (\\.(\\d+|\\*))?\n    ([hlL])?\n    [diouxXeEfFgGcrsa%]\n"
    },
    "string-line-continuation": {
      "name": "constant.language.python",
      "match": "\\\\$"
    },
    "string-multi-bad-brace1-formatting-raw": {
      "begin": "(?x)\n    (?= \\{%\n          ( .*? (?!'''|\"\"\") )\n        %\\}\n    )\n",
      "end": "(?='''|\"\"\")",
      "patterns": [
        {
          "include": "#string-consume-escape"
        }
      ]
    },
    "string-multi-bad-brace1-formatting-unicode": {
      "begin": "(?x)\n    (?= \\{%\n          ( .*? (?!'''|\"\"\") )\n        %\\}\n    )\n",
      "end": "(?='''|\"\"\")",
      "patterns": [
        {
          "include": "#escape-sequence-unicode"
        },
        {
          "include": "#escape-sequence"
        },
        {
          "include": "#string-line-continuation"
        }
      ]
    },
    "string-multi-bad-brace2-formatting-raw": {
      "begin": "(?x)\n    (?!\\{\\{)\n    (?= \\{ (\n              \\w*? (?!'''|\"\"\") [^!:\\.\\[}\\w]\n           )\n        .*?(?!'''|\"\"\")\n        \\}\n    )\n",
      "end": "(?='''|\"\"\")",
      "patterns": [
        {
          "include": "#string-consume-escape"
        },
        {
          "include": "#string-formatting"
        }
      ]
    },
    "string-multi-bad-brace2-formatting-unicode": {
      "begin": "(?x)\n    (?!\\{\\{)\n    (?= \\{ (\n              \\w*? (?!'''|\"\"\") [^!:\\.\\[}\\w]\n           )\n        .*?(?!'''|\"\"\")\n        \\}\n    )\n",
      "end": "(?='''|\"\"\")",
      "patterns": [
        {
          "include": "#escape-sequence-unicode"
        },
        {
          "include": "#string-entity"
        }
      ]
    },
    "string-quoted-multi-line": {
      "name": "string.quoted.multi.python",
      "begin": "(\\b[rR](?=[uU]))?([uU])?('''|\"\"\")",
      "end": "(\\3)",
      "patterns": [
        {
          "include": "#string-multi-bad-brace1-formatting-unicode"
        },
        {
          "include": "#string-multi-bad-brace2-formatting-unicode"
        },
        {
          "include": "#string-unicode-guts"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "invalid.illegal.prefix.python"
        },
        "2": {
          "name": "storage.type.string.python"
        },
        "3": {
          "name": "punctuation.definition.string.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "string-quoted-single-line": {
      "name": "string.quoted.single.python",
      "begin": "(\\b[rR](?=[uU]))?([uU])?((['\"]))",
      "end": "(\\3)|((?\u003c!\\\\)\\n)",
      "patterns": [
        {
          "include": "#string-single-bad-brace1-formatting-unicode"
        },
        {
          "include": "#string-single-bad-brace2-formatting-unicode"
        },
        {
          "include": "#string-unicode-guts"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "invalid.illegal.prefix.python"
        },
        "2": {
          "name": "storage.type.string.python"
        },
        "3": {
          "name": "punctuation.definition.string.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "string-raw-bin-guts": {
      "patterns": [
        {
          "include": "#string-consume-escape"
        },
        {
          "include": "#string-formatting"
        }
      ]
    },
    "string-raw-bin-quoted-multi-line": {
      "name": "string.quoted.raw.binary.multi.python",
      "begin": "(\\b(?:R[bB]|[bB]R))('''|\"\"\")",
      "end": "(\\2)",
      "patterns": [
        {
          "include": "#string-raw-bin-guts"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "storage.type.string.python"
        },
        "2": {
          "name": "punctuation.definition.string.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "string-raw-bin-quoted-single-line": {
      "name": "string.quoted.raw.binary.single.python",
      "begin": "(\\b(?:R[bB]|[bB]R))((['\"]))",
      "end": "(\\2)|((?\u003c!\\\\)\\n)",
      "patterns": [
        {
          "include": "#string-raw-bin-guts"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "storage.type.string.python"
        },
        "2": {
          "name": "punctuation.definition.string.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "string-raw-guts": {
      "patterns": [
        {
          "include": "#string-consume-escape"
        },
        {
          "include": "#string-formatting"
        },
        {
          "include": "#string-brace-formatting"
        }
      ]
    },
    "string-raw-quoted-multi-line": {
      "name": "string.quoted.raw.multi.python",
      "begin": "\\b(([uU]R)|(R))('''|\"\"\")",
      "end": "(\\4)",
      "patterns": [
        {
          "include": "#string-multi-bad-brace1-formatting-raw"
        },
        {
          "include": "#string-multi-bad-brace2-formatting-raw"
        },
        {
          "include": "#string-raw-guts"
        }
      ],
      "beginCaptures": {
        "2": {
          "name": "invalid.deprecated.prefix.python"
        },
        "3": {
          "name": "storage.type.string.python"
        },
        "4": {
          "name": "punctuation.definition.string.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "string-raw-quoted-single-line": {
      "name": "string.quoted.raw.single.python",
      "begin": "\\b(([uU]R)|(R))((['\"]))",
      "end": "(\\4)|((?\u003c!\\\\)\\n)",
      "patterns": [
        {
          "include": "#string-single-bad-brace1-formatting-raw"
        },
        {
          "include": "#string-single-bad-brace2-formatting-raw"
        },
        {
          "include": "#string-raw-guts"
        }
      ],
      "beginCaptures": {
        "2": {
          "name": "invalid.deprecated.prefix.python"
        },
        "3": {
          "name": "storage.type.string.python"
        },
        "4": {
          "name": "punctuation.definition.string.begin.python"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.python"
        },
        "2": {
          "name": "invalid.illegal.newline.python"
        }
      }
    },
    "string-single-bad-brace1-formatting-raw": {
      "begin": "(?x)\n    (?= \\{%\n          ( .*? (?!(['\"])|((?\u003c!\\\\)\\n)) )\n        %\\}\n    )\n",
      "end": "(?=(['\"])|((?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#string-consume-escape"
        }
      ]
    },
    "string-single-bad-brace1-formatting-unicode": {
      "begin": "(?x)\n    (?= \\{%\n          ( .*? (?!(['\"])|((?\u003c!\\\\)\\n)) )\n        %\\}\n    )\n",
      "end": "(?=(['\"])|((?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#escape-sequence-unicode"
        },
        {
          "include": "#escape-sequence"
        },
        {
          "include": "#string-line-continuation"
        }
      ]
    },
    "string-single-bad-brace2-formatting-raw": {
      "begin": "(?x)\n    (?!\\{\\{)\n    (?= \\{ (\n              \\w*? (?!(['\"])|((?\u003c!\\\\)\\n)) [^!:\\.\\[}\\w]\n           )\n        .*?(?!(['\"])|((?\u003c!\\\\)\\n))\n        \\}\n    )\n",
      "end": "(?=(['\"])|((?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#string-consume-escape"
        },
        {
          "include": "#string-formatting"
        }
      ]
    },
    "string-single-bad-brace2-formatting-unicode": {
      "begin": "(?x)\n    (?!\\{\\{)\n    (?= \\{ (\n              \\w*? (?!(['\"])|((?\u003c!\\\\)\\n)) [^!:\\.\\[}\\w]\n           )\n        .*?(?!(['\"])|((?\u003c!\\\\)\\n))\n        \\}\n    )\n",
      "end": "(?=(['\"])|((?\u003c!\\\\)\\n))",
      "patterns": [
        {
          "include": "#escape-sequence-unicode"
        },
        {
          "include": "#string-entity"
        }
      ]
    },
    "string-unicode-guts": {
      "patterns": [
        {
          "include": "#escape-sequence-unicode"
        },
        {
          "include": "#string-entity"
        },
        {
          "include": "#string-brace-formatting"
        }
      ]
    }
  }
}