diff --git a/.github/workflows/codestyle.yml b/.github/workflows/codestyle.yml
index b12941f..887735a 100644
--- a/.github/workflows/codestyle.yml
+++ b/.github/workflows/codestyle.yml
@@ -11,7 +11,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        php: [ '8.3' ]
+        php: [ '8.4' ]
         os: [ ubuntu-latest ]
     steps:
       - name: Set Git To Use LF
@@ -33,4 +33,4 @@ jobs:
           max_attempts: 5
           command: composer update --prefer-dist --no-interaction --no-progress
       - name: Check Code Style
-        run: composer phpcs:check
+        run: PHP_CS_FIXER_IGNORE_ENV=1 composer phpcs:check
diff --git a/README.md b/README.md
index b93028a..26414f6 100644
--- a/README.md
+++ b/README.md
@@ -9,9 +9,12 @@
     <a href="https://packagist.org/packages/type-lang/phpdoc"><img src="https://poser.pugx.org/type-lang/phpdoc/version?style=for-the-badge" alt="Latest Stable Version"></a>
     <a href="https://packagist.org/packages/type-lang/phpdoc"><img src="https://poser.pugx.org/type-lang/phpdoc/v/unstable?style=for-the-badge" alt="Latest Unstable Version"></a>
     <a href="https://raw.githubusercontent.com/php-type-language/phpdoc/blob/master/LICENSE"><img src="https://poser.pugx.org/type-lang/phpdoc/license?style=for-the-badge" alt="License MIT"></a>
+    <a href="https://github.com/xepozz/meta-storm-idea-plugin"><img src="https://img.shields.io/static/v1?label=Powered+by&message=Meta+Storm&color=db5860&style=for-the-badge&logo=data:image/svg%2bxml;base64,PHN2ZyB3aWR0aD0iMTExIiBoZWlnaHQ9IjExMSIgdmlld0JveD0iMCAwIDExMSAxMTEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTYwLjQ2MTcgOEwzMC4xNjU0IDguMjQ3OUMyNy4yNDYgOC4yNzE3OSAyNC42NDggMTAuMTA1IDIzLjY0NyAxMi44NDc1TDAuNDMwNTkgNzYuODMxNEMtMS4yNDQ1OSA4MS40MjA4IDIuMTc4MDUgODYuMjcxMyA3LjA2MzUzIDg2LjIzMTNMMzIuMTE5NyA4Ni4wMjYzTDM1LjQxNDcgNzYuOTk5TDkuODczOTEgNzcuMjA4TDMxLjYyNTkgMTcuMjM2Mkw1Ny4xNjY2IDE3LjAyNzNMNjAuNDYxNyA4WiIgZmlsbD0iI0FGQjFCMyIvPjxwYXRoIGQ9Ik00OS40MTQ5IDEwMi45OTlMNzkuNzEyMiAxMDIuOTk5QzgyLjYzMTcgMTAyLjk5OSA4NS4yNDQ2IDEwMS4xODcgODYuMjY4IDk4LjQ1MjlMMTEwLjAxMyAzNC40NTI0QzExMS43MjYgMjkuODc2OCAxMDguMzQzIDI0Ljk5ODUgMTAzLjQ1NyAyNC45OTg1TDc4LjQwMDQgMjQuOTk4NUw3NS4wMzE2IDMzLjk5ODVMMTAwLjU3MyAzMy45OTg1TDc4LjMyNTMgOTMuOTk5TDUyLjc4MzcgOTMuOTk5TDQ5LjQxNDkgMTAyLjk5OVoiIGZpbGw9IiNBRkIxQjMiLz48cGF0aCBkPSJNMjIgNjFMODYgOEw1NyA1MEw4OS45OTk3IDQ5Ljk5OTdMMjYgMTAzTDU1IDYxSDIyWiIgZmlsbD0iI0M3NTQ1MCIvPjwvc3ZnPg==" alt="MetaStorm"></a>
 </p>
 <p align="center">
-    <a href="https://github.com/php-type-language/phpdoc/actions"><img src="https://github.com/php-type-language/phpdoc/workflows/tests/badge.svg"></a>
+    <a href="https://github.com/php-type-language/phpdoc/actions/workflows/tests.yml"><img src="https://img.shields.io/github/actions/workflow/status/php-type-language/phpdoc/tests.yml?label=Tests&style=flat-square&logo=unpkg"></a>
+    <a href="https://github.com/php-type-language/phpdoc/actions/workflows/codestyle.yml"><img src="https://img.shields.io/github/actions/workflow/status/php-type-language/phpdoc/codestyle.yml?label=PER-2+CodeStyle&style=flat-square&logo=telegraph"></a>
+    <a href="https://github.com/php-type-language/phpdoc/actions/workflows/static-analysis.yml"><img src="https://img.shields.io/github/actions/workflow/status/php-type-language/phpdoc/static-analysis.yml?label=PHPStan&style=flat-square&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAGb0lEQVR42u1Xe1BUZRS/y4Kg8oiR3FCCBUySESZBRCiaBnmEsOzeSzsg+KxYYO9dEEftNRqZjx40FRZkTpqmOz5S2LsXlEZBciatkQnHDGYaGdFy1EpGMHl/p/PdFlt2rk5O+J9n5nA/vtf5ned3lnlISpRhafBlLRLHCtJGVrB/ZBDsaw2lUqzReGAC46DstTYfnSCGUjaaDvgxACo6j3vUenNdImeRXqdnWV5az5rrnzeZznj8J+E5Ftsclhf3s4J4CS/oRx5Bvon8ZU65FGYQxAwcf85a7CeRz+C41THejueydCZ7AAK34nwv3kHP/oUKdOL4K7258fF7Cud427O48RQeGkIGJ77N8fZqlrcfRP4d/x90WQfHXLeBt9dTrSlwl3V65ynWLM1SEA2qbNQckbe4Xmww10Hmy3shid0CMcmlEJtSDsl5VZBdfAgMvI3uuR+moJqN6LaxmpsOBeLCDmTifCB92RcQmbAUJvtqALc5sQr8p86gYBCcFdBq9wOin7NQax6ewlB6rqLZHf23FP10y3lj6uJtEBg2HxiVCtzd3SEwMBCio6Nh9uzZ4O/vLwOZ4OUNM2NyIGPFrvuzBG//lRPs+VQ2k1ki+ePkd84bskz7YFpYgizEz88P8vPzYffu3dDS0gJNTU1QXV0NqampRK1WIwgfiE4qhOyig0rC+pCvK8QUoML7uJVHA5kcQUp3DSpqWjc3d/Dy8oKioiLo6uqCoaEhuHb1KvT09AAhBFpbW4lOpyMyyIBQSCmoUQLQzgniNvz+obB2HS2RwBgE6dOxCyJogmNkP2u1Wrhw4QJ03+iGrR9XEd3CTNBn6eCbo40wPDwMdXV1BF1DVG5qiEtboxSUP6J71+D3NwUAhLOIRQzm7lnnhYUv7QFv/yDZ/Lm5ubK2DVI9iZ8bR8JDtEB57lNzENQN6OjoIGlpabIVZsYaMTO+hrikRRA1JxmSX9hE7/sJtVyF38tKsUCVZxBhz9jI3wGT/QJlADzPAyXrnj0kInzGHQCRMyOg/ed2uHjxIuE4TgYQHq2DLJqumashY+lnsMC4GVC5do6XVuK9l+4SkN8y+GfYeVJn2g++U7QygPT0dBgYGIDvT58mnF5PQcjC83PzSF9fH7S1tZGEhAQZQOT8JaA317oIkM6jS8uVLSDzOQqg23Uh+MlkOf00Gg0cP34c+vv74URzM9n41gby/rvvkc7OThlATU3NCGYJUXt4QaLuTYwBcTSOBmj1RD7D4Tsix4ByOjZRF/zgupDEbgZ3j4ly/qekpND0o5aQ44HS4OAgsVqtI1gTZO01IbG0aP1bknnxCDUvArHi+B0lJSlzglTFYO2udF3Ql9TCrHn5oEIreHp6QlRUFJSUlJCqqipSWVlJ8vLyCGYIFS7HS3zGa87mv4lcjLwLlStlLTKYYUUAlvrlDGcW45wKxXX6aqHZNutM+1oQBHFTewAKkoH4+vqCj48PYAGS5yb5amjNoO+CU2SL53NKpDD0vxHHmOJir7L5xUvZgm0us2R142ScOIyVqYvlpWU4XoHIP8DXL2b+wjdWeXh6U2FjmIIKmbWAYPFRMus62h/geIvjOQYlpuDysQrLL6Ger49HgW8jqvXUhI7UvDb9iaSTDqHtyItiF5Suw5ewF/Nd8VJ6zlhsn06bEhwX4NyfCvuGEeRpTmh4mkG68yDpyuzB9EUcjU5awbAgncPlAeSdAQER0zCndzqVbeXC4qDsMpvGEYBXRnsDx4N3Auf1FCTjTIaVtY/QTmd0I8bBVm1kejEubUfO01vqImn3c49X7qpeqI9inIgtbpxK3YrKfIJCt+OeV2nfUVFR4ca4EkVENyA7gkYcMfB1R5MMmxZ7ez/2KF5SSN1yV+158UPsJT0ZBcI2bRLtIXGoYu5FerOUiJe1OfsL3XEWH43l2KS+iJF9+S4FpcNgsc+j8cT8H4o1bfPg/qkLt50uJ1RzdMsGg0UqwfEN114Pwb1CtWTGg+Y9U5ClK9x7xUWI7BI5VQVp0AVcQ3bZkQhmnEgdHhKyNSZe16crtBIlc7sIb6cRLft2PCgoKGjijBDtjrAQ7a3EdMsxzIRflAFIhPb6mHYmYwX+WBlPQgskhgVryyJCQyNyBLsBQdQ6fgsQhyt6MSOOsWZ7gbH8wETmgRKAijatNL8Ngm0xx4tLcsps0Wzx4al0jXlI40B/A3pa144MDtSgAAAAAElFTkSuQmCC"></a>
 </p>
 
 Reference implementation for TypeLang PHPDoc Parser.
@@ -27,6 +30,224 @@ be installed using the following command in a root of your project:
 composer require type-lang/phpdoc
 ```
 
+## Supported Tags
+
+- [x] `@abstract` - Declare any _Element_ as abstract
+- [x] `@api` - Highlight _Element_ as being part of the public API
+- [ ] `@author` - TODO
+- [x] `@category` - Used to organize groups of packages together
+- [x] `@copyright` - Used to document the copyright information of any _Element_.
+- [ ] `@deprecated` - TODO
+- [ ] `@example` - TODO
+- [x] `@extends` - Allows to extend templated classes and interfaces
+- [ ] `@filesource` - TODO
+- [x] `@final` - Declare any _Element_ as final
+- [ ] `@global` - TODO
+- [x] `@ignore` - Used to tell documentation systems that _Element_ are 
+      not to be processed.
+- [x] `@implements` - Allows to extend templated interfaces
+- [ ] `@inheritdoc` - TODO
+- [x] `@inherits` - An alias of `@extends` tag
+- [ ] `@internal` - TODO
+- [x] `@license` - Used to indicate which license is applicable
+- [x] `@link` - Indicates a custom relation between the associated _Element_ 
+      and a website, which is identified by an absolute URI
+- [x] `@method` - Allows a class to know which "_magic_" methods are callable
+- [ ] `@mixin` - TODO
+- [x] `@no-named-arguments` - Indicates that argument names may be 
+      changed in the future.
+- [x] `@package` - Used to categorize _Element(s)_ into logical subdivisions
+- [x] `@override` - Mention to see if the method is actually overriding a definition
+- [x] `@param` - Used to document a single argument of a function or method
+- [ ] `@param-closure-this` - TODO
+- [ ] `@param-immediately-invoked-callable` - TODO
+- [ ] `@param-later-invoked-callable` - TODO
+- [ ] `@param-out` - TODO
+- [x] `@property` - Used to declare which "_magic_" properties are supported
+- [x] `@property-read` - Used to declare which "_magic_" properties are supported for reading
+- [x] `@property-write` - Used to declare which "_magic_" properties are supported for writing
+- [ ] `@pure-unless-callable-is-impure` - TODO
+- [ ] `@readonly` - TODO
+- [ ] `@require-extends` - TODO
+- [ ] `@require-implements` - TODO
+- [x] `@return` - Used to document the return value of functions or methods
+- [x] `@returns` - An alias of `@return` tag
+- [ ] `@seal-methods` - TODO
+- [ ] `@seal-properties` - TODO
+- [x] `@see` - Indicates a reference from the associated _Symbol(s)_ to a 
+      website or other _Symbol(s)_
+- [ ] `@since` - TODO
+- [ ] `@source` - TODO
+- [x] `@subpackage` - Used to categorize _Element(s)_ into logical subdivisions
+- [ ] `@suppress` - TODO
+- [x] `@template` - Allows classes (and class-like entries), functions and
+      methods to declare a generic type parameter
+- [x] `@template-contravariant` - Allows classes (and class-like entries),
+      functions and methods to declare a generic contravariant type parameter
+- [x] `@template-covariant` - Allows classes (and class-like entries), functions
+      and methods to declare a generic covariant type parameter
+- [x] `@template-extends` - An alias of `@extends` tag
+- [x] `@template-implements` - An alias of `@implements` tag
+- [x] `@template-use` - Allows to extend templated traits
+- [x] `@throw` - An alias of `@throws` tag
+- [x] `@throws` - Used to indicate whether _Element_ throw a specific type 
+      of `\Throwable` (exception or error)
+- [ ] `@todo` - TODO
+- [ ] `@unused-param` - TODO
+- [x] `@use` - An alias of `@template-use` tag
+- [ ] `@used-by` - TODO
+- [ ] `@uses` - TODO
+- [x] `@var` - Document the _Type_ of the following _Element_
+- [ ] `@version` - TODO
+
+### Psalm Tags
+
+- [ ] `@psalm-allow-private-mutation` - TODO
+- [x] `@psalm-api` - Vendor-specific `@api` alias
+- [ ] `@psalm-assert` - TODO
+- [ ] `@psalm-assert-if-false` - TODO
+- [ ] `@psalm-assert-if-true` - TODO
+- [ ] `@psalm-assert-untainted` - TODO
+- [ ] `@psalm-check-type` - TODO
+- [ ] `@psalm-check-type-exact` - TODO
+- [ ] `@psalm-consistent-constructor` - TODO
+- [ ] `@psalm-consistent-templates` - TODO
+- [ ] `@psalm-external-mutation-free` - TODO
+- [x] `@psalm-extends` - Vendor-specific `@extends` alias
+- [ ] `@psalm-flow` - TODO
+- [ ] `@psalm-if-this-is` - TODO
+- [ ] `@psalm-ignore-falsable-return` - TODO
+- [ ] `@psalm-ignore-nullable-return` - TODO
+- [ ] `@psalm-ignore-var` - TODO
+- [ ] `@psalm-ignore-variable-method` - TODO
+- [ ] `@psalm-ignore-variable-property` - TODO
+- [ ] `@psalm-immutable` - TODO
+- [x] `@psalm-implements` - Vendor-specific `@implements` alias
+- [ ] `@psalm-import-type` - TODO
+- [ ] `@psalm-inheritors` - TODO
+- [ ] `@psalm-internal` - TODO
+- [x] `@psalm-method` - Vendor-specific `@method` alias
+- [ ] `@psalm-mutation-free` - TODO
+- [ ] `@psalm-no-seal-methods` - TODO
+- [ ] `@psalm-no-seal-properties` - TODO
+- [ ] `@psalm-override-method-visibility` - TODO
+- [ ] `@psalm-override-property-visibility` - TODO
+- [x] `@psalm-param` - Vendor-specific `@param` alias
+- [ ] `@psalm-param-out` - TODO
+- [x] `@psalm-property` - Vendor-specific `@property` alias
+- [x] `@psalm-property-read` - Vendor-specific `@property-read` alias
+- [x] `@psalm-property-write` - Vendor-specific `@property-write` alias
+- [ ] `@psalm-pure` - TODO
+- [ ] `@psalm-readonly` - TODO
+- [ ] `@psalm-readonly-allow-private-mutation` - TODO
+- [ ] `@psalm-require-extends` - TODO
+- [ ] `@psalm-require-implements` - TODO
+- [x] `@psalm-return` - Vendor-specific `@return` alias
+- [ ] `@psalm-scope-this` - TODO
+- [ ] `@psalm-seal-methods` - TODO
+- [ ] `@psalm-seal-properties` - TODO
+- [ ] `@psalm-self-out` - TODO
+- [ ] `@psalm-stub-override` - TODO
+- [ ] `@psalm-suppress` - TODO
+- [ ] `@psalm-taint-escape` - TODO
+- [ ] `@psalm-taint-sink` - TODO
+- [ ] `@psalm-taint-source` - TODO
+- [ ] `@psalm-taint-specialize` - TODO
+- [ ] `@psalm-taint-unescape` - TODO
+- [x] `@psalm-template` - Vendor-specific `@template` alias
+- [x] `@psalm-template-contravariant` - Vendor-specific `@template-contravariant` alias
+- [x] `@psalm-template-covariant` - Vendor-specific `@template-covariant` alias
+- [ ] `@psalm-this-out` - TODO
+- [ ] `@psalm-trace` - TODO
+- [ ] `@psalm-type` - TODO
+- [x] `@psalm-use` - Vendor-specific `@use` alias
+- [x] `@psalm-var` - Vendor-specific `@var` alias
+- [ ] `@psalm-variadic` - TODO
+- [ ] `@psalm-yield` - TODO
+
+### PHPStan Tags
+
+- [ ] `@phpstan-allow-private-mutation` - TODO
+- [ ] `@phpstan-assert` - TODO
+- [ ] `@phpstan-assert-if-false` - TODO
+- [ ] `@phpstan-assert-if-true` - TODO
+- [ ] `@phpstan-consistent-constructor` - TODO
+- [ ] `@phpstan-extends` - TODO
+- [ ] `@phpstan-ignore` - TODO
+- [ ] `@phpstan-ignore-line` - TODO
+- [ ] `@phpstan-ignore-next-line` - TODO
+- [ ] `@phpstan-immutable` - TODO
+- [ ] `@phpstan-implements` - TODO
+- [ ] `@phpstan-import-type` - TODO
+- [ ] `@phpstan-impure` - TODO
+- [x] `@phpstan-method` - Vendor-specific `@method` alias
+- [x] `@phpstan-param` - Vendor-specific `@param` alias
+- [ ] `@phpstan-param-closure-this` - TODO
+- [ ] `@phpstan-param-immediately-invoked-callable` - TODO
+- [ ] `@phpstan-param-later-invoked-callable` - TODO
+- [ ] `@phpstan-param-out` - TODO
+- [ ] `@phpstan-property` - Vendor-specific `@property` alias
+- [ ] `@phpstan-property-read` - Vendor-specific `@property-read` alias
+- [ ] `@phpstan-property-write` - Vendor-specific `@property-write` alias
+- [ ] `@phpstan-pure` - TODO
+- [ ] `@phpstan-pure-unless-callable-is-impure` - TODO
+- [ ] `@phpstan-readonly` - TODO
+- [ ] `@phpstan-readonly-allow-private-mutation` - TODO
+- [ ] `@phpstan-require-extends` - TODO
+- [ ] `@phpstan-require-implements` - TODO
+- [ ] `@phpstan-return` - Vendor-specific `@return` alias
+- [ ] `@phpstan-self-out` - TODO
+- [x] `@phpstan-template` - Vendor-specific `@template` alias
+- [x] `@phpstan-template-contravariant` - Vendor-specific `@template-contravariant` alias
+- [x] `@phpstan-template-covariant` - Vendor-specific `@template-covariant` alias
+- [ ] `@phpstan-this-out` - TODO
+- [x] `@phpstan-throws` - Vendor-specific `@throws` alias
+- [ ] `@phpstan-type` - TODO
+- [ ] `@phpstan-use` - TODO
+- [x] `@phpstan-var` - Vendor-specific `@var` alias
+
+### Phan Tags
+
+- [x] `@phan-abstract` - Vendor-specific `@abstract` alias
+- [ ] `@phan-assert` - TODO
+- [ ] `@phan-assert-false-condition` - TODO
+- [ ] `@phan-assert-if-false` - TODO
+- [ ] `@phan-assert-if-true` - TODO
+- [ ] `@phan-assert-true-condition` - TODO
+- [ ] `@phan-closure-scope` - TODO
+- [ ] `@phan-constructor-used-for-side-effects` - TODO
+- [x] `@phan-extends` - Vendor-specific `@extends` alias
+- [ ] `@phan-file-suppress` - TODO
+- [ ] `@phan-forbid-undeclared-magic-methods` - TODO
+- [ ] `@phan-forbid-undeclared-magic-properties` - TODO
+- [ ] `@phan-hardcode-return-type` - TODO
+- [ ] `@phan-immutable` - TODO
+- [x] `@phan-inherits` - Vendor-specific `@extends` alias
+- [x] `@phan-method` - Vendor-specific `@method` alias
+- [ ] `@phan-mixin` - TODO
+- [ ] `@phan-output-reference` - TODO
+- [x] `@phan-override` - Vendor-specific `@override` alias
+- [x] `@phan-param` - Vendor-specific `@param` alias
+- [x] `@phan-property` - Vendor-specific `@property` alias
+- [x] `@phan-property-read` - Vendor-specific `@property-read` alias
+- [x] `@phan-property-write` - Vendor-specific `@property-write` alias
+- [ ] `@phan-pure` - TODO
+- [ ] `@phan-read-only` - TODO
+- [ ] `@phan-real-return` - TODO
+- [x] `@phan-return` - Vendor-specific `@return` alias
+- [ ] `@phan-side-effect-free` - TODO
+- [ ] `@phan-suppress-current-line` - TODO
+- [ ] `@phan-suppress-next-line` - TODO
+- [ ] `@phan-suppress-next-next-line` - TODO
+- [ ] `@phan-suppress-previous-line` - TODO
+- [x] `@phan-template` - Vendor-specific `@template` alias
+- [ ] `@phan-transient` - TODO
+- [ ] `@phan-type` - TODO
+- [ ] `@phan-unused-param` - TODO
+- [x] `@phan-var` - Vendor-specific `@var` alias
+- [ ] `@phan-write-only` - TODO
+- [ ] `@phanclosurescope` - TODO
+
 ## Quick Start
 
 ```php
@@ -45,41 +266,42 @@ var_dump($result);
 ```
 
 **Expected Output:**
+
 ```php
-TypeLang\PHPDoc\DocBlock {
-  -description: TypeLang\PHPDoc\Tag\Description\Description {
-    -template: "Example description %1$s and blah-blah-blah."
-    -tags: array:1 [
-      0 => TypeLang\PHPDoc\Tag\Tag {
-        #description: TypeLang\PHPDoc\Tag\Description\Description {
-          -template: "some"
-          -tags: []
+TypeLang\PHPDoc\DocBlock\DocBlock {
+  +description: TypeLang\PHPDoc\DocBlock\Description\TaggedDescription {
+    +components: array:3 [
+      0 => TypeLang\PHPDoc\DocBlock\Description\Description {
+        #value: "Example description "
+      }
+      1 => TypeLang\PHPDoc\DocBlock\Tag\SeeTag\SeeTag {
+        +description: null
+        +name: "see"
+        +ref: TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\TypeSymbolReference {
+          +type: TypeLang\Parser\Node\Stmt\NamedTypeNode { … }
         }
-        #name: "see"
+      }
+      2 => TypeLang\PHPDoc\DocBlock\Description\Description {
+        #value: " and blah-blah-blah.\n"
       }
     ]
   }
-  -tags: array:3 [
-    0 => TypeLang\PHPDoc\Tag\Tag {
-      #description: TypeLang\PHPDoc\Tag\Description\Description {
-        -template: "("foo")"
-        -tags: []
+  +tags: array:3 [
+    0 => TypeLang\PHPDoc\DocBlock\Tag\Tag {
+      +description: TypeLang\PHPDoc\DocBlock\Description\Description {
+        #value: "("foo")\n"
       }
-      #name: "Example\Annotation"
+      +name: "Example\Annotation"
     }
-    1 => TypeLang\PHPDoc\Tag\Tag {
-      #description: TypeLang\PHPDoc\Tag\Description\Description {
-        -template: "array<non-empty-string, TypeStatement>"
-        -tags: []
-      }
-      #name: "return"
+    1 => TypeLang\PHPDoc\DocBlock\Tag\ReturnTag\ReturnTag {
+      +description: null
+      +name: "return"
+      +type: TypeLang\Parser\Node\Stmt\NamedTypeNode { … }
     }
-    2 => TypeLang\PHPDoc\Tag\Tag {
-      #description: TypeLang\PHPDoc\Tag\Description\Description {
-        -template: "\Throwable"
-        -tags: []
-      }
-      #name: "throws"
+    2 => TypeLang\PHPDoc\DocBlock\Tag\ThrowsTag\ThrowsTag {
+      +description: null
+      +name: "throws"
+      +type: TypeLang\Parser\Node\Stmt\NamedTypeNode { … }
     }
   ]
 }
@@ -100,17 +322,21 @@ DocBlock is a representation of the comment object.
  */                                 |
 ```
 
-- `getDescription()` ― Provides a `Description` object.
-- `getTags()` ― Provides a list of `Tag` objects.
+- `$description` ― Provides a `Description` object.
+- `$tags` ― Provides a list of `Tag` objects.
 
 ```php
-/** @template-implements \Traversable<array-key, Tag> */
-class DocBlock implements \Traversable
+/**
+ * DocBlock structure pseudocode (real impl may differ)
+ * 
+ * @template-implements \Traversable<array-key, Tag>
+ * @template-implements \ArrayAccess<array-key, Tag>
+ */
+class DocBlock
 {
-    public function getDescription(): Description;
-    
-    /** @return list<Tag> */
-    public function getTags(): array;
+    public ?Description $description { get; }
+
+    public iterable<array-key, Tag> $tags { get; }
 }
 ```
 
@@ -127,17 +353,29 @@ other tags.
  */
 ```
 
-- `getTemplate()` ― Provides a sprintf-formatted template string of the description.
-- `getTags()` ― Provides a list of `Tag` objects.
+- `$tags` ― Provides a list of `Tag` objects.
+- `$components` ― Provides a list of `Tag|Description` objects.
 
 ```php
-/** @template-implements \Traversable<array-key, Tag> */
-class Description implements \Traversable, \Stringable
-{
-    public function getTemplate(): string;
+/**
+ * Simple description structure pseudocode (real impl may differ)
+ */
+class Description implements \Stringable {}
 
-    /** @return list<Tag> */
-    public function getTags(): array;
+/**
+ * Tagged (composite) description structure pseudocode (real impl may differ)
+ * 
+ * @template-implements \Traversable<array-key, Tag>
+ * @template-implements \ArrayAccess<array-key, Tag>
+ */
+class TaggedDescription extends Description implements 
+    \Traversable, 
+    \ArrayAccess,
+    \Countable
+{
+    public iterable<array-key, Tag> $tags { get; }
+    
+    public iterable<array-key, Tag|Description> $components { get; }
 }
 ```
 
@@ -153,14 +391,25 @@ A Tag represents a name (ID) and its contents.
  */
 ```
 
-- `getName()` ― Provides a tag's name (ID).
-- `getDescription()` ― Provides an optional description of the tag.
+- `$name` ― Provides a tag's name (ID).
+- `$description` ― Provides an optional description of the tag.
 
 ```php
+/**
+ * Common tag structure pseudocode (real impl may differ)
+ */
 class Tag implements \Stringable
 {
-    public function getName(): string;
+    public non-empty-string $name { get; }
+
+    public ?Description $description { get; }
+}
 
-    public function getDescription(): ?Description;
+/**
+ * Throws tag structure pseudocode (real impl may differ)
+ */
+class ThrowsTag extends Tag
+{
+    public TypeStatement $type;
 }
 ```
diff --git a/composer.json b/composer.json
index 737882e..6b74d8e 100644
--- a/composer.json
+++ b/composer.json
@@ -9,30 +9,47 @@
         "issues": "https://github.com/php-type-language/phpdoc/issues"
     },
     "require": {
-        "php": "^8.1"
+        "php": "^8.1",
+        "league/uri": "^7.5",
+        "type-lang/parser": "^1.5"
+    },
+    "replace": {
+        "type-lang/phpdoc-standard-tags": "*",
+        "type-lang/phpdoc-template-tags": "*"
     },
     "autoload": {
         "psr-4": {
             "TypeLang\\PHPDoc\\": "src"
-        }
+        },
+        "files": [
+            "src/polyfill.php"
+        ]
     },
     "require-dev": {
-        "friendsofphp/php-cs-fixer": "^3.53",
+        "composer/spdx-licenses": "^1.5",
+        "friendsofphp/php-cs-fixer": "^3.70",
         "jetbrains/phpstorm-attributes": "^1.0",
+        "phpbench/phpbench": "^1.4",
+        "phpdocumentor/reflection-docblock": "^5.6",
+        "phpstan/phpdoc-parser": "^2.1",
         "phpstan/phpstan": "^2.1",
         "phpstan/phpstan-strict-rules": "^2.0",
-        "phpunit/phpunit": "^10.5|^11.0",
-        "type-lang/parser": "^1.0"
+        "phpunit/phpunit": "^10.5|^11.0|^12.0",
+        "symfony/property-access": "^5.4|^6.0|^7.0",
+        "symfony/var-dumper": "^5.4|^6.0|^7.0"
     },
     "autoload-dev": {
         "psr-4": {
             "TypeLang\\PHPDoc\\Tests\\": "tests"
         }
     },
+    "suggest": {
+        "composer/spdx-licenses": "Provides additional licenses (@license tag) support"
+    },
     "extra": {
         "branch-alias": {
-            "dev-master": "1.x-dev",
-            "dev-main": "1.x-dev"
+            "dev-master": "2.x-dev",
+            "dev-main": "2.x-dev"
         }
     },
     "config": {
@@ -45,17 +62,21 @@
         }
     },
     "scripts": {
-        "test": ["@test:unit", "@test:functional"],
+        "test": [
+            "@test:unit",
+            "@test:functional"
+        ],
         "test:unit": "phpunit --testdox --testsuite=unit",
-        "test:functional": "phpunit --testsuite=functional",
-
+        "test:functional": "phpunit --testdox --testsuite=functional",
         "linter": "@linter:check",
         "linter:check": "phpstan analyse --configuration phpstan.neon",
         "linter:baseline": "phpstan analyse --configuration phpstan.neon --generate-baseline",
-
         "phpcs": "@phpcs:check",
         "phpcs:check": "php-cs-fixer fix --config=.php-cs-fixer.php --allow-risky=yes --dry-run --verbose --diff",
-        "phpcs:fix": "php-cs-fixer fix --config=.php-cs-fixer.php --allow-risky=yes --verbose --diff"
+        "phpcs:fix": "php-cs-fixer fix --config=.php-cs-fixer.php --allow-risky=yes --verbose --diff",
+        "bench": [
+            "phpbench run --report=default --tag=current --progress=none --filter=benchDocBlockParsing"
+        ]
     },
     "minimum-stability": "dev",
     "prefer-stable": true
diff --git a/phpbench.json b/phpbench.json
new file mode 100644
index 0000000..07f023c
--- /dev/null
+++ b/phpbench.json
@@ -0,0 +1,58 @@
+{
+    "$schema": "./vendor/phpbench/phpbench/phpbench.schema.json",
+    "runner.bootstrap": "vendor/autoload.php",
+    "runner.path": "tests/Bench",
+    "runner.progress": "plain",
+    "runner.file_pattern": "*Bench.php",
+    "runner.php_config": {
+        "opcache.enable": 1,
+        "opcache.enable_cli": 1,
+        "opcache.jit_buffer_size": "128M",
+        "opcache.jit": "1255",
+        "xdebug.mode": "off"
+    },
+    "storage.xml_storage_path": "vendor/.cache.phpbench",
+    "storage.store_binary": true,
+    "storage.driver": "xml",
+    "report.generators": {
+        "default": {
+            "extends": "overview",
+            "tabbed": false,
+            "components": [
+                {
+                    "component": "section",
+                    "tabbed": true,
+                    "tab_labels": [
+                        "Time",
+                        "Memory"
+                    ],
+                    "components": [
+                        {
+                            "component": "section",
+                            "title": "Results",
+                            "components": [
+                                {
+                                    "component": "table_aggregate",
+                                    "title": "Aggregation Table ({{ first(frame.suite_tag) }})",
+                                    "partition": [
+                                        "benchmark_name",
+                                        "subject_name",
+                                        "variant_name"
+                                    ],
+                                    "row": {
+                                        "benchmark": "first(partition['benchmark_name'])",
+                                        "memory": "first(partition['result_mem_peak']) as memory",
+                                        "min": "min(partition['result_time_avg']) as time",
+                                        "max": "max(partition['result_time_avg']) as time",
+                                        "mode": "mode(partition['result_time_avg']) as time",
+                                        "rstdev": "rstdev(partition['result_time_avg'])"
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        }
+    }
+}
diff --git a/phpunit.xml b/phpunit.xml
index ea677ba..02b3c8f 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd"
+         xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
          colors="true"
          backupGlobals="true"
          stopOnFailure="false"
diff --git a/resources/.meta-storm.xml b/resources/.meta-storm.xml
new file mode 100644
index 0000000..474799d
--- /dev/null
+++ b/resources/.meta-storm.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<meta-storm xmlns="meta-storm">
+    <definitions>
+
+        <classMethod class="\TypeLang\PHPDoc\ParserInterface"
+                          method="parse"
+                          argument="0">
+            <languageInjection language="InjectablePHP" />
+        </classMethod>
+
+        <classMethod class="\TypeLang\PHPDoc\Parser"
+                     method="parse"
+                     argument="0">
+            <languageInjection language="InjectablePHP" />
+        </classMethod>
+
+    </definitions>
+</meta-storm>
diff --git a/src/Tag/Description/Description.php b/src/DocBlock/Description/Description.php
similarity index 78%
rename from src/Tag/Description/Description.php
rename to src/DocBlock/Description/Description.php
index 4369a69..454e10d 100644
--- a/src/Tag/Description/Description.php
+++ b/src/DocBlock/Description/Description.php
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace TypeLang\PHPDoc\Tag\Description;
+namespace TypeLang\PHPDoc\DocBlock\Description;
 
 class Description implements DescriptionInterface
 {
@@ -30,11 +30,15 @@ public static function fromStringable(string|\Stringable $description): Descript
      */
     public static function fromStringableOrNull(string|\Stringable|null $description): ?DescriptionInterface
     {
-        if ($description === null) {
+        if ($description instanceof DescriptionInterface) {
+            return $description;
+        }
+
+        if ($description === null || ((string) $description) === '') {
             return null;
         }
 
-        return self::fromStringable($description);
+        return new self($description);
     }
 
     public function __toString(): string
diff --git a/src/Tag/Description/DescriptionInterface.php b/src/DocBlock/Description/DescriptionInterface.php
similarity index 91%
rename from src/Tag/Description/DescriptionInterface.php
rename to src/DocBlock/Description/DescriptionInterface.php
index 20d65a1..8a73f3d 100644
--- a/src/Tag/Description/DescriptionInterface.php
+++ b/src/DocBlock/Description/DescriptionInterface.php
@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace TypeLang\PHPDoc\Tag\Description;
+namespace TypeLang\PHPDoc\DocBlock\Description;
 
 /**
  * Any class that implements this interface is a description object
diff --git a/src/DocBlock/Description/DescriptionProviderInterface.php b/src/DocBlock/Description/DescriptionProviderInterface.php
new file mode 100644
index 0000000..3bac8dc
--- /dev/null
+++ b/src/DocBlock/Description/DescriptionProviderInterface.php
@@ -0,0 +1,19 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Description;
+
+/**
+ * Representation of any entry that contain an description.
+ */
+interface DescriptionProviderInterface extends OptionalDescriptionProviderInterface
+{
+    /**
+     * Gets description object which can be represented as a {@see string}
+     * and contains additional information.
+     *
+     * @readonly
+     */
+    public DescriptionInterface $description { get; }
+}
diff --git a/src/DocBlock/Description/OptionalDescriptionProviderInterface.php b/src/DocBlock/Description/OptionalDescriptionProviderInterface.php
new file mode 100644
index 0000000..379e741
--- /dev/null
+++ b/src/DocBlock/Description/OptionalDescriptionProviderInterface.php
@@ -0,0 +1,20 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Description;
+
+/**
+ * Representation of any entry that MAY contain an optional description.
+ */
+interface OptionalDescriptionProviderInterface
+{
+    /**
+     * Gets optional description object which can be represented as
+     * a {@see string} and contains additional information or {@see null}
+     * in case of description is not defined in the entry.
+     *
+     * @readonly
+     */
+    public ?DescriptionInterface $description { get; }
+}
diff --git a/src/Tag/Description/TaggedDescription.php b/src/DocBlock/Description/TaggedDescription.php
similarity index 55%
rename from src/Tag/Description/TaggedDescription.php
rename to src/DocBlock/Description/TaggedDescription.php
index cf84344..9c82f29 100644
--- a/src/Tag/Description/TaggedDescription.php
+++ b/src/DocBlock/Description/TaggedDescription.php
@@ -2,13 +2,13 @@
 
 declare(strict_types=1);
 
-namespace TypeLang\PHPDoc\Tag\Description;
+namespace TypeLang\PHPDoc\DocBlock\Description;
 
-use TypeLang\PHPDoc\Tag\TagInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\TagInterface;
 
 /**
- * @template-implements \ArrayAccess<array-key, TagInterface|DescriptionInterface|null>
- * @template-implements \IteratorAggregate<array-key, TagInterface|DescriptionInterface>
+ * @template-implements \ArrayAccess<array-key, TagInterface|null>
+ * @template-implements \IteratorAggregate<array-key, TagInterface>
  */
 class TaggedDescription implements
     TaggedDescriptionInterface,
@@ -18,7 +18,12 @@ class TaggedDescription implements
     /**
      * @var list<TagInterface|DescriptionInterface>
      */
-    private readonly array $components;
+    public readonly array $components;
+
+    /**
+     * @var list<TagInterface>
+     */
+    public readonly array $tags;
 
     /**
      * @param iterable<array-key, TagInterface|DescriptionInterface> $components
@@ -26,46 +31,36 @@ class TaggedDescription implements
     public function __construct(iterable $components = [])
     {
         $this->components = \array_values([...$components]);
+
+        $this->tags = $this->getTagsFromComponents($this->components);
     }
 
     /**
-     * @return list<TagInterface|DescriptionInterface>
+     * @param iterable<mixed, object> $components
+     *
+     * @return list<TagInterface>
      */
-    public function getComponents(): iterable
+    private function getTagsFromComponents(iterable $components): array
     {
-        return $this->components;
-    }
+        $result = [];
 
-    public function getTags(): iterable
-    {
-        foreach ($this->components as $component) {
+        foreach ($components as $component) {
             if ($component instanceof TagInterface) {
-                yield $component;
+                $result[] = $component;
             }
         }
-    }
 
-    public function getIterator(): \Traversable
-    {
-        return new \ArrayIterator($this->components);
-    }
-
-    /**
-     * @return int<0, max>
-     */
-    public function count(): int
-    {
-        return \count($this->components);
+        return $result;
     }
 
     public function offsetExists(mixed $offset): bool
     {
-        return isset($this->components[$offset]);
+        return isset($this->tags[$offset]);
     }
 
-    public function offsetGet(mixed $offset): TagInterface|DescriptionInterface|null
+    public function offsetGet(mixed $offset): ?TagInterface
     {
-        return $this->components[$offset] ?? null;
+        return $this->tags[$offset] ?? null;
     }
 
     /**
@@ -84,8 +79,29 @@ public function offsetUnset(mixed $offset): void
         throw new \BadMethodCallException(static::class . ' objects are immutable');
     }
 
+    public function getIterator(): \Traversable
+    {
+        return new \ArrayIterator($this->tags);
+    }
+
+    /**
+     * @return int<0, max>
+     */
+    public function count(): int
+    {
+        return \count($this->tags);
+    }
+
     public function __toString(): string
     {
-        return \implode('', $this->components);
+        $result = [];
+
+        foreach ($this->components as $component) {
+            $result[] = $component instanceof TagInterface
+                ? \sprintf('{%s}', $component)
+                : $component;
+        }
+
+        return \implode('', $result);
     }
 }
diff --git a/src/DocBlock/Description/TaggedDescriptionInterface.php b/src/DocBlock/Description/TaggedDescriptionInterface.php
new file mode 100644
index 0000000..ad34513
--- /dev/null
+++ b/src/DocBlock/Description/TaggedDescriptionInterface.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Description;
+
+use TypeLang\PHPDoc\DocBlock\Tag\TagInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\TagsProviderInterface;
+
+/**
+ * Any class that implements this interface is a description object
+ * containing an arbitrary set of nested tags ({@see TagInterface}) and,
+ * like a parent {@see DescriptionInterface}, can be represented as a string.
+ *
+ * @template-extends \Traversable<array-key, TagInterface>
+ */
+interface TaggedDescriptionInterface extends
+    DescriptionInterface,
+    TagsProviderInterface,
+    \Traversable,
+    \Countable
+{
+    /**
+     * Gets a list of components (that is, tags of {@see TagInterface}
+     * and descriptions of {@see DescriptionInterface}) that make up the
+     * {@see \TypeLang\PHPDoc\DocBlock\Polyfill\Description\TaggedDescriptionInterface} in the order in which these
+     * elements are defined.
+     *
+     * @var iterable<array-key, DescriptionInterface|TagInterface>
+     *
+     * @readonly
+     */
+    public iterable $components { get; }
+}
diff --git a/src/DocBlock.php b/src/DocBlock/DocBlock.php
similarity index 68%
rename from src/DocBlock.php
rename to src/DocBlock/DocBlock.php
index ab08e52..008b143 100644
--- a/src/DocBlock.php
+++ b/src/DocBlock/DocBlock.php
@@ -2,17 +2,17 @@
 
 declare(strict_types=1);
 
-namespace TypeLang\PHPDoc;
+namespace TypeLang\PHPDoc\DocBlock;
 
-use TypeLang\PHPDoc\Tag\Description\Description;
-use TypeLang\PHPDoc\Tag\Description\DescriptionInterface;
-use TypeLang\PHPDoc\Tag\Description\OptionalDescriptionProviderInterface;
-use TypeLang\PHPDoc\Tag\TagInterface;
-use TypeLang\PHPDoc\Tag\TagsProviderInterface;
+use TypeLang\PHPDoc\DocBlock\Description\Description;
+use TypeLang\PHPDoc\DocBlock\Description\DescriptionInterface;
+use TypeLang\PHPDoc\DocBlock\Description\OptionalDescriptionProviderInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\TagInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\TagsProviderInterface;
 
 /**
- * This class represents structure containing a description and a set of tags
- * that describe an arbitrary DocBlock Comment in the code.
+ * An implementation represents structure containing a description and a set
+ * of tags that describe an arbitrary DocBlock Comment in the code.
  *
  * @template-implements \ArrayAccess<array-key, TagInterface|null>
  * @template-implements \IteratorAggregate<array-key, TagInterface>
@@ -24,12 +24,12 @@ final class DocBlock implements
     \ArrayAccess,
     \Countable
 {
-    private readonly DescriptionInterface $description;
+    public readonly ?DescriptionInterface $description;
 
     /**
      * @var list<TagInterface>
      */
-    private readonly array $tags;
+    public readonly array $tags;
 
     /**
      * @param iterable<array-key, TagInterface> $tags List of all tags contained in
@@ -48,30 +48,25 @@ public function __construct(
         $this->tags = \array_values([...$tags]);
     }
 
-    public function getDescription(): DescriptionInterface
-    {
-        return $this->description;
-    }
-
     /**
-     * @return list<TagInterface>
+     * @internal direct usage of {@see offsetExists()} is not recommended
      */
-    public function getTags(): array
-    {
-        return $this->tags;
-    }
-
     public function offsetExists(mixed $offset): bool
     {
         return isset($this->tags[$offset]);
     }
 
+    /**
+     * @internal direct usage of {@see offsetGet()} is not recommended
+     */
     public function offsetGet(mixed $offset): ?TagInterface
     {
         return $this->tags[$offset] ?? null;
     }
 
     /**
+     * @internal direct usage of {@see offsetSet()} is not recommended
+     *
      * @throws \BadMethodCallException
      */
     public function offsetSet(mixed $offset, mixed $value): void
@@ -80,6 +75,8 @@ public function offsetSet(mixed $offset, mixed $value): void
     }
 
     /**
+     * @internal direct usage of {@see offsetUnset()} is not recommended
+     *
      * @throws \BadMethodCallException
      */
     public function offsetUnset(mixed $offset): void
diff --git a/src/DocBlock/Polyfill/Description/DescriptionProviderInterface.php b/src/DocBlock/Polyfill/Description/DescriptionProviderInterface.php
new file mode 100644
index 0000000..6b2995c
--- /dev/null
+++ b/src/DocBlock/Polyfill/Description/DescriptionProviderInterface.php
@@ -0,0 +1,16 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Polyfill\Description;
+
+use TypeLang\PHPDoc\DocBlock\Description\DescriptionInterface;
+use TypeLang\PHPDoc\DocBlock\Description\OptionalDescriptionProviderInterface;
+
+/**
+ * @internal polyfill interface for the {@see \TypeLang\PHPDoc\DocBlock\Description\DescriptionProviderInterface}
+ *
+ * @property-read DescriptionInterface $description
+ */
+interface DescriptionProviderInterface extends
+    OptionalDescriptionProviderInterface {}
diff --git a/src/DocBlock/Polyfill/Description/OptionalDescriptionProviderInterface.php b/src/DocBlock/Polyfill/Description/OptionalDescriptionProviderInterface.php
new file mode 100644
index 0000000..ffdb883
--- /dev/null
+++ b/src/DocBlock/Polyfill/Description/OptionalDescriptionProviderInterface.php
@@ -0,0 +1,14 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Polyfill\Description;
+
+use TypeLang\PHPDoc\DocBlock\Description\DescriptionInterface;
+
+/**
+ * @internal polyfill interface for the {@see \TypeLang\PHPDoc\DocBlock\Description\OptionalDescriptionProviderInterface}
+ *
+ * @property-read DescriptionInterface|null $description
+ */
+interface OptionalDescriptionProviderInterface {}
diff --git a/src/DocBlock/Polyfill/Description/TaggedDescriptionInterface.php b/src/DocBlock/Polyfill/Description/TaggedDescriptionInterface.php
new file mode 100644
index 0000000..64be33a
--- /dev/null
+++ b/src/DocBlock/Polyfill/Description/TaggedDescriptionInterface.php
@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Polyfill\Description;
+
+use TypeLang\PHPDoc\DocBlock\Description\DescriptionInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\TagInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\TagsProviderInterface;
+
+/**
+ * @internal polyfill interface for the {@see \TypeLang\PHPDoc\DocBlock\Description\TaggedDescriptionInterface}
+ *
+ * @template-extends \Traversable<array-key, DescriptionInterface|TagInterface>
+ *
+ * @property-read \Traversable<array-key, DescriptionInterface|TagInterface> $components
+ */
+interface TaggedDescriptionInterface extends
+    DescriptionInterface,
+    TagsProviderInterface,
+    \Traversable,
+    \Countable {}
diff --git a/src/DocBlock/Polyfill/Tag/InvalidTagInterface.php b/src/DocBlock/Polyfill/Tag/InvalidTagInterface.php
new file mode 100644
index 0000000..d2bd298
--- /dev/null
+++ b/src/DocBlock/Polyfill/Tag/InvalidTagInterface.php
@@ -0,0 +1,15 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Polyfill\Tag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\TagInterface;
+
+/**
+ * @internal polyfill interface for the {@see \TypeLang\PHPDoc\DocBlock\Tag\InvalidTagInterface}
+ *
+ * @property-read \Throwable $reason
+ */
+interface InvalidTagInterface extends
+    TagInterface {}
diff --git a/src/DocBlock/Polyfill/Tag/OptionalTypeProviderInterface.php b/src/DocBlock/Polyfill/Tag/OptionalTypeProviderInterface.php
new file mode 100644
index 0000000..b573ded
--- /dev/null
+++ b/src/DocBlock/Polyfill/Tag/OptionalTypeProviderInterface.php
@@ -0,0 +1,14 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Polyfill\Tag;
+
+use TypeLang\Parser\Node\Stmt\TypeStatement;
+
+/**
+ * @internal polyfill interface for the {@see \TypeLang\PHPDoc\DocBlock\Tag\OptionalTypeProviderInterface}
+ *
+ * @property-read TypeStatement|null $type
+ */
+interface OptionalTypeProviderInterface {}
diff --git a/src/DocBlock/Polyfill/Tag/OptionalVariableProviderInterface.php b/src/DocBlock/Polyfill/Tag/OptionalVariableProviderInterface.php
new file mode 100644
index 0000000..8121bca
--- /dev/null
+++ b/src/DocBlock/Polyfill/Tag/OptionalVariableProviderInterface.php
@@ -0,0 +1,12 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Polyfill\Tag;
+
+/**
+ * @internal polyfill interface for the {@see \TypeLang\PHPDoc\DocBlock\Tag\OptionalVariableProviderInterface}
+ *
+ * @property-read non-empty-string|null $variable
+ */
+interface OptionalVariableProviderInterface {}
diff --git a/src/DocBlock/Polyfill/Tag/TagInterface.php b/src/DocBlock/Polyfill/Tag/TagInterface.php
new file mode 100644
index 0000000..023abb6
--- /dev/null
+++ b/src/DocBlock/Polyfill/Tag/TagInterface.php
@@ -0,0 +1,16 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Polyfill\Tag;
+
+use TypeLang\PHPDoc\DocBlock\Description\OptionalDescriptionProviderInterface;
+
+/**
+ * @internal polyfill interface for the {@see \TypeLang\PHPDoc\DocBlock\Tag\TagInterface}
+ *
+ * @property-read non-empty-string $name
+ */
+interface TagInterface extends
+    OptionalDescriptionProviderInterface,
+    \Stringable {}
diff --git a/src/DocBlock/Polyfill/Tag/TagsProviderInterface.php b/src/DocBlock/Polyfill/Tag/TagsProviderInterface.php
new file mode 100644
index 0000000..08569ac
--- /dev/null
+++ b/src/DocBlock/Polyfill/Tag/TagsProviderInterface.php
@@ -0,0 +1,14 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Polyfill\Tag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\TagInterface;
+
+/**
+ * @internal polyfill interface for the {@see \TypeLang\PHPDoc\DocBlock\Tag\TagsProviderInterface}
+ *
+ * @property-read iterable<array-key, TagInterface> $tags
+ */
+interface TagsProviderInterface {}
diff --git a/src/DocBlock/Polyfill/Tag/TypeProviderInterface.php b/src/DocBlock/Polyfill/Tag/TypeProviderInterface.php
new file mode 100644
index 0000000..081d4d7
--- /dev/null
+++ b/src/DocBlock/Polyfill/Tag/TypeProviderInterface.php
@@ -0,0 +1,16 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Polyfill\Tag;
+
+use TypeLang\Parser\Node\Stmt\TypeStatement;
+use TypeLang\PHPDoc\DocBlock\Tag\OptionalTypeProviderInterface;
+
+/**
+ * @internal polyfill interface for the {@see \TypeLang\PHPDoc\DocBlock\Tag\TypeProviderInterface}
+ *
+ * @property-read TypeStatement $type
+ */
+interface TypeProviderInterface extends
+    OptionalTypeProviderInterface {}
diff --git a/src/DocBlock/Polyfill/Tag/VariableProviderInterface.php b/src/DocBlock/Polyfill/Tag/VariableProviderInterface.php
new file mode 100644
index 0000000..263d119
--- /dev/null
+++ b/src/DocBlock/Polyfill/Tag/VariableProviderInterface.php
@@ -0,0 +1,15 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Polyfill\Tag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\OptionalVariableProviderInterface;
+
+/**
+ * @internal polyfill interface for the {@see \TypeLang\PHPDoc\DocBlock\Tag\VariableProviderInterface}
+ *
+ * @property-read non-empty-string $variable
+ */
+interface VariableProviderInterface extends
+    OptionalVariableProviderInterface {}
diff --git a/src/DocBlock/Tag/AbstractTag/AbstractTag.php b/src/DocBlock/Tag/AbstractTag/AbstractTag.php
new file mode 100644
index 0000000..09f9c0f
--- /dev/null
+++ b/src/DocBlock/Tag/AbstractTag/AbstractTag.php
@@ -0,0 +1,25 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\AbstractTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+
+/**
+ * Declare a class-like or method as abstract, as well as for declaring
+ * what methods must be redefined in a child class.
+ *
+ * ```
+ * "@abstract" [<description>]
+ * ```
+ */
+final class AbstractTag extends Tag
+{
+    public function __construct(
+        string $name,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/AbstractTag/AbstractTagFactory.php b/src/DocBlock/Tag/AbstractTag/AbstractTagFactory.php
new file mode 100644
index 0000000..72a5582
--- /dev/null
+++ b/src/DocBlock/Tag/AbstractTag/AbstractTagFactory.php
@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\AbstractTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@abstract`" tags.
+ *
+ * See {@see AbstractTag} for details about this tag.
+ */
+final class AbstractTagFactory implements TagFactoryInterface
+{
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): AbstractTag
+    {
+        $stream = new Stream($tag, $content);
+
+        return new AbstractTag(
+            name: $tag,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/ApiTag/ApiTag.php b/src/DocBlock/Tag/ApiTag/ApiTag.php
new file mode 100644
index 0000000..88a22cf
--- /dev/null
+++ b/src/DocBlock/Tag/ApiTag/ApiTag.php
@@ -0,0 +1,41 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\ApiTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+
+/**
+ * Used to highlight _Element_ as being part of the primary
+ * public API of a package.
+ *
+ * The "`@api`" tag may be applied to public _Element_ to highlight them
+ * in generated documentation, pointing the consumer to the primary public
+ * API components of a library or framework.
+ *
+ * When the "`@api`" tag is used, other _Element_ with a public
+ * visibility serve to support the internal structure and
+ * are not recommended to be used by the consumer.
+ *
+ * The exact meaning of _Element_ tagged with "`@api`" MAY differ per project.
+ * It is however RECOMMENDED that all "`@api`" tagged _Element_ SHOULD
+ * NOT change after publication unless the new version
+ * is tagged as breaking Backwards Compatibility.
+ *
+ * See also the `"@internal"` tag, which can be used to hide internal
+ * _Element_ from generated documentation.
+ *
+ * ```
+ * "@api" [<description>]
+ * ```
+ */
+final class ApiTag extends Tag
+{
+    public function __construct(
+        string $name,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/ApiTag/ApiTagFactory.php b/src/DocBlock/Tag/ApiTag/ApiTagFactory.php
new file mode 100644
index 0000000..7485e66
--- /dev/null
+++ b/src/DocBlock/Tag/ApiTag/ApiTagFactory.php
@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\ApiTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@api`" tags.
+ *
+ * See {@see ApiTag} for details about this tag.
+ */
+final class ApiTagFactory implements TagFactoryInterface
+{
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): ApiTag
+    {
+        $stream = new Stream($tag, $content);
+
+        return new ApiTag(
+            name: $tag,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/CategoryTag/CategoryTag.php b/src/DocBlock/Tag/CategoryTag/CategoryTag.php
new file mode 100644
index 0000000..ea1a154
--- /dev/null
+++ b/src/DocBlock/Tag/CategoryTag/CategoryTag.php
@@ -0,0 +1,35 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\CategoryTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+
+/**
+ * Used to organize groups of packages together.
+ *
+ * The "`@category`" tag was meant in the original de-facto Standard to group
+ * several _Elements_ by their "`@package`" tags into one category.
+ * These categories could then be used to aid in the
+ * generation of API documentation.
+ *
+ * This was necessary since the "`@package`" tag, as defined in the
+ * original Standard, did not allow for more than one hierarchy
+ * level. Since this has changed this tag SHOULD NOT be used.
+ *
+ * Please see the documentation for "`@package`" for details of its usage.
+ *
+ * ```
+ * "@category" [<description>]
+ * ```
+ */
+final class CategoryTag extends Tag
+{
+    public function __construct(
+        string $name,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/CategoryTag/CategoryTagFactory.php b/src/DocBlock/Tag/CategoryTag/CategoryTagFactory.php
new file mode 100644
index 0000000..97223d0
--- /dev/null
+++ b/src/DocBlock/Tag/CategoryTag/CategoryTagFactory.php
@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\CategoryTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@category`" tags.
+ *
+ * See {@see CategoryTag} for details about this tag.
+ */
+final class CategoryTagFactory implements TagFactoryInterface
+{
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): CategoryTag
+    {
+        $stream = new Stream($tag, $content);
+
+        return new CategoryTag(
+            name: $tag,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/CopyrightTag/CopyrightTag.php b/src/DocBlock/Tag/CopyrightTag/CopyrightTag.php
new file mode 100644
index 0000000..16b9f71
--- /dev/null
+++ b/src/DocBlock/Tag/CopyrightTag/CopyrightTag.php
@@ -0,0 +1,32 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\CopyrightTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+
+/**
+ * Used to document the copyright information of any _Element_.
+ *
+ * The "`@copyright`" tag defines who holds the copyright over the _Element_.
+ * The copyright indicated with this tag applies to the _Element_ with which
+ * it is associated and all child elements unless otherwise noted.
+ *
+ * The format of the description is governed by the coding standard of each
+ * individual project. It is RECOMMENDED to mention the year or years which
+ * are covered by this copyright and the organization involved.
+ *
+ * ```
+ * "@copyright" [<description>]
+ * ```
+ */
+final class CopyrightTag extends Tag
+{
+    public function __construct(
+        string $name,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/CopyrightTag/CopyrightTagFactory.php b/src/DocBlock/Tag/CopyrightTag/CopyrightTagFactory.php
new file mode 100644
index 0000000..a64b87e
--- /dev/null
+++ b/src/DocBlock/Tag/CopyrightTag/CopyrightTagFactory.php
@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\CopyrightTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@copyright`" tags.
+ *
+ * See {@see CopyrightTag} for details about this tag.
+ */
+final class CopyrightTagFactory implements TagFactoryInterface
+{
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): CopyrightTag
+    {
+        $stream = new Stream($tag, $content);
+
+        return new CopyrightTag(
+            name: $tag,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/Factory/MutableTagFactoryInterface.php b/src/DocBlock/Tag/Factory/MutableTagFactoryInterface.php
new file mode 100644
index 0000000..4006d5c
--- /dev/null
+++ b/src/DocBlock/Tag/Factory/MutableTagFactoryInterface.php
@@ -0,0 +1,20 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\Factory;
+
+interface MutableTagFactoryInterface extends TagFactoryInterface
+{
+    /**
+     * Registers a handler for tags.
+     *
+     * If you want to use your own tags then you can use this method to
+     * instruct the {@see TagFactoryInterface} to register the name of a tag with
+     * the custom {@see TagFactoryInterface} to which processing of this tag will
+     * be delegated.
+     *
+     * @param non-empty-lowercase-string|list<non-empty-lowercase-string> $tags
+     */
+    public function register(string|array $tags, TagFactoryInterface $delegate): void;
+}
diff --git a/src/DocBlock/Tag/Factory/TagFactory.php b/src/DocBlock/Tag/Factory/TagFactory.php
new file mode 100644
index 0000000..47e613a
--- /dev/null
+++ b/src/DocBlock/Tag/Factory/TagFactory.php
@@ -0,0 +1,80 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\Factory;
+
+use TypeLang\PHPDoc\DocBlock\Tag\InvalidTag;
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+use TypeLang\PHPDoc\DocBlock\Tag\TagInterface;
+use TypeLang\PHPDoc\Exception\InvalidTagException;
+use TypeLang\PHPDoc\Exception\RuntimeExceptionInterface;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+final class TagFactory implements MutableTagFactoryInterface
+{
+    /**
+     * @var array<non-empty-lowercase-string, TagFactoryInterface>
+     */
+    private array $factories;
+
+    /**
+     * @param iterable<non-empty-lowercase-string, TagFactoryInterface> $factories
+     */
+    public function __construct(iterable $factories = [])
+    {
+        if ($factories instanceof \Traversable) {
+            $factories = \iterator_to_array($factories);
+        }
+
+        $this->factories = $factories;
+    }
+
+    public function register(array|string $tags, TagFactoryInterface $delegate): void
+    {
+        if (\is_string($tags)) {
+            $tags = [$tags];
+        }
+
+        foreach ($tags as $tag) {
+            $this->factories[$tag] = $delegate;
+        }
+    }
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): TagInterface
+    {
+        $delegate = $this->factories[\strtolower($tag)] ?? null;
+
+        if ($delegate !== null) {
+            try {
+                try {
+                    return $delegate->create($tag, $content, $descriptions);
+                } catch (RuntimeExceptionInterface $e) {
+                    throw $e;
+                } catch (\Throwable $e) {
+                    throw InvalidTagException::fromCreatingTag(
+                        tag: $tag,
+                        source: $content,
+                        prev: $e,
+                    );
+                }
+            } catch (RuntimeExceptionInterface $e) {
+                $description = null;
+
+                if ($content !== '') {
+                    $description = $descriptions->parse($content);
+                }
+
+                return new InvalidTag($tag, $e, $description);
+            }
+        }
+
+        $description = null;
+
+        if ($content !== '') {
+            $description = $descriptions->parse($content);
+        }
+
+        return new Tag($tag, $description);
+    }
+}
diff --git a/src/Tag/Factory/FactoryInterface.php b/src/DocBlock/Tag/Factory/TagFactoryInterface.php
similarity index 57%
rename from src/Tag/Factory/FactoryInterface.php
rename to src/DocBlock/Tag/Factory/TagFactoryInterface.php
index 9147f2c..6ee9f42 100644
--- a/src/Tag/Factory/FactoryInterface.php
+++ b/src/DocBlock/Tag/Factory/TagFactoryInterface.php
@@ -2,22 +2,21 @@
 
 declare(strict_types=1);
 
-namespace TypeLang\PHPDoc\Tag\Factory;
+namespace TypeLang\PHPDoc\DocBlock\Tag\Factory;
 
+use TypeLang\PHPDoc\DocBlock\Tag\TagInterface;
 use TypeLang\PHPDoc\Exception\RuntimeExceptionInterface;
 use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
-use TypeLang\PHPDoc\Tag\Content;
-use TypeLang\PHPDoc\Tag\TagInterface;
 
-interface FactoryInterface
+interface TagFactoryInterface
 {
     /**
      * Returns a tag object with the specified name and description.
      *
-     * @param non-empty-string $name
+     * @param non-empty-string $tag
      *
      * @throws RuntimeExceptionInterface in case of parsing error occurs
      * @throws \Throwable in case of internal error occurs
      */
-    public function create(string $name, Content $content, DescriptionParserInterface $descriptions): TagInterface;
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): TagInterface;
 }
diff --git a/src/DocBlock/Tag/FinalTag/FinalTag.php b/src/DocBlock/Tag/FinalTag/FinalTag.php
new file mode 100644
index 0000000..cd6c645
--- /dev/null
+++ b/src/DocBlock/Tag/FinalTag/FinalTag.php
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\FinalTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+
+/**
+ * Used to denote that the associated _Element_ is final, are not allowed to
+ * extend or override the _Element_ in a child element.
+ *
+ * In some situations the language construct final cannot be used by the
+ * implementing library where the functionality of the library prevents
+ * elements from being final. For example when proxy patterns are applied.
+ * In these cases the "`@final`" tag can be used to indicate that the element
+ * should be treated as final.
+ *
+ * The optional description is used to provide a more detailed explanation of
+ * why the element is marked as final.
+ *
+ * IDE's and other tools can use this information to show an error when such
+ * an element is extended or overridden.
+ *
+ * ```
+ * "@final" [<description>]
+ * ```
+ */
+final class FinalTag extends Tag
+{
+    public function __construct(
+        string $name,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/FinalTag/FinalTagFactory.php b/src/DocBlock/Tag/FinalTag/FinalTagFactory.php
new file mode 100644
index 0000000..39dd05e
--- /dev/null
+++ b/src/DocBlock/Tag/FinalTag/FinalTagFactory.php
@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\FinalTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@final`" tags.
+ *
+ * See {@see FinalTag} for details about this tag.
+ */
+final class FinalTagFactory implements TagFactoryInterface
+{
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): FinalTag
+    {
+        $stream = new Stream($tag, $content);
+
+        return new FinalTag(
+            name: $tag,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/IgnoreTag/IgnoreTag.php b/src/DocBlock/Tag/IgnoreTag/IgnoreTag.php
new file mode 100644
index 0000000..faa5845
--- /dev/null
+++ b/src/DocBlock/Tag/IgnoreTag/IgnoreTag.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\IgnoreTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+
+/**
+ * Used to tell documentation systems that _Element_ are not to be processed.
+ *
+ * ```
+ * "@ignore" [<description>]
+ * ```
+ */
+final class IgnoreTag extends Tag
+{
+    public function __construct(
+        string $name,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/IgnoreTag/IgnoreTagFactory.php b/src/DocBlock/Tag/IgnoreTag/IgnoreTagFactory.php
new file mode 100644
index 0000000..d19115c
--- /dev/null
+++ b/src/DocBlock/Tag/IgnoreTag/IgnoreTagFactory.php
@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\IgnoreTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@ignore`" tags.
+ *
+ * See {@see IgnoreTag} for details about this tag.
+ */
+final class IgnoreTagFactory implements TagFactoryInterface
+{
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): IgnoreTag
+    {
+        $stream = new Stream($tag, $content);
+
+        return new IgnoreTag(
+            name: $tag,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/InheritDocTag/InheritDocTag.php b/src/DocBlock/Tag/InheritDocTag/InheritDocTag.php
new file mode 100644
index 0000000..ecdb13d
--- /dev/null
+++ b/src/DocBlock/Tag/InheritDocTag/InheritDocTag.php
@@ -0,0 +1,25 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\InheritDocTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+
+/**
+ * Used to directly inherit the long description from the parent
+ * class in child classes.
+ *
+ * ```
+ * "@inheritDoc" [<description>]
+ * ```
+ */
+final class InheritDocTag extends Tag
+{
+    public function __construct(
+        string $name,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/InheritDocTag/InheritDocTagFactory.php b/src/DocBlock/Tag/InheritDocTag/InheritDocTagFactory.php
new file mode 100644
index 0000000..11527b3
--- /dev/null
+++ b/src/DocBlock/Tag/InheritDocTag/InheritDocTagFactory.php
@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\InheritDocTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@inheritDoc`" tags.
+ *
+ * See {@see InheritDocTag} for details about this tag.
+ */
+final class InheritDocTagFactory implements TagFactoryInterface
+{
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): InheritDocTag
+    {
+        $stream = new Stream($tag, $content);
+
+        return new InheritDocTag(
+            name: $tag,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/InvalidTag.php b/src/DocBlock/Tag/InvalidTag.php
new file mode 100644
index 0000000..10809ad
--- /dev/null
+++ b/src/DocBlock/Tag/InvalidTag.php
@@ -0,0 +1,31 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag;
+
+class InvalidTag extends Tag implements InvalidTagInterface
+{
+    /**
+     * @param non-empty-string $name
+     */
+    public function __construct(
+        string $name,
+        public readonly \Throwable $reason,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+
+    public function __toString(): string
+    {
+        if ($this->description === null) {
+            return \sprintf('@%s', $this->name);
+        }
+
+        return \rtrim(\vsprintf('@%s %s', [
+            $this->name,
+            (string) $this->description,
+        ]));
+    }
+}
diff --git a/src/DocBlock/Tag/InvalidTagInterface.php b/src/DocBlock/Tag/InvalidTagInterface.php
new file mode 100644
index 0000000..0629a60
--- /dev/null
+++ b/src/DocBlock/Tag/InvalidTagInterface.php
@@ -0,0 +1,18 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag;
+
+/**
+ * Representation of invalid tag definition.
+ */
+interface InvalidTagInterface extends TagInterface
+{
+    /**
+     * Gets the reason why this tag is invalid.
+     *
+     * @readonly
+     */
+    public \Throwable $reason { get; }
+}
diff --git a/src/DocBlock/Tag/LicenseTag/LicenseTag.php b/src/DocBlock/Tag/LicenseTag/LicenseTag.php
new file mode 100644
index 0000000..3be7a0c
--- /dev/null
+++ b/src/DocBlock/Tag/LicenseTag/LicenseTag.php
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\LicenseTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\UriReference;
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+
+/**
+ * Used to indicate which license is applicable for the associated _Element_.
+ *
+ * The `"@license"` tag provides the user with the name and URL of the license
+ * that is applicable to a _Element_ and any of its child elements.
+ *
+ * Whenever multiple licenses apply, there MUST be one "`@license"` tag per
+ * applicable license.
+ *
+ * ```
+ * "@license" [<url>] [name]
+ * ```
+ */
+final class LicenseTag extends Tag
+{
+    public function __construct(
+        string $name,
+        public readonly ?UriReference $uri = null,
+        /**
+         * @var non-empty-string|null
+         */
+        public readonly ?string $license = null,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/LicenseTag/LicenseTagFactory.php b/src/DocBlock/Tag/LicenseTag/LicenseTagFactory.php
new file mode 100644
index 0000000..7060a09
--- /dev/null
+++ b/src/DocBlock/Tag/LicenseTag/LicenseTagFactory.php
@@ -0,0 +1,67 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\LicenseTag;
+
+use Composer\Spdx\SpdxLicenses;
+use League\Uri\Uri;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\UriReference;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Content\UriReferenceReader;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@license`" tags.
+ *
+ * See {@see LicenseTag} for details about this tag.
+ */
+final class LicenseTagFactory implements TagFactoryInterface
+{
+    private readonly ?SpdxLicenses $licenses;
+
+    public function __construct()
+    {
+        $this->licenses = $this->createSpdxLicenses();
+    }
+
+    private function createSpdxLicenses(): ?SpdxLicenses
+    {
+        if (\class_exists(SpdxLicenses::class)) {
+            return new SpdxLicenses();
+        }
+
+        return null;
+    }
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): LicenseTag
+    {
+        $stream = new Stream($tag, $content);
+
+        try {
+            $uri = $stream->apply(new UriReferenceReader());
+        } catch (\Throwable) {
+            $uri = null;
+        }
+
+        $description = $identifier = ($suffix = \trim($stream->value)) === '' ? null : $suffix;
+
+        if ($this->licenses !== null && $identifier !== null) {
+            /** @var array{0:non-empty-string, 1:bool, 2:non-empty-string, 3:bool}|null $info */
+            $info = $this->licenses->getLicenseByIdentifier($identifier);
+
+            if ($info !== null) {
+                $uri ??= new UriReference(Uri::new($info[2]));
+                $description = $info[0];
+            }
+        }
+
+        return new LicenseTag(
+            name: $tag,
+            uri: $uri,
+            license: $identifier,
+            description: $description,
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/LinkTag/LinkTag.php b/src/DocBlock/Tag/LinkTag/LinkTag.php
new file mode 100644
index 0000000..6565952
--- /dev/null
+++ b/src/DocBlock/Tag/LinkTag/LinkTag.php
@@ -0,0 +1,35 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\LinkTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\ReferenceInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\UriReference;
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+
+/**
+ * The "`@link`" tag can be used to define a relation, or link, between
+ * the element, or part of the long description when used inline, to a URI.
+ *
+ * The URI MUST be complete and well-formed as specified in RFC2396.
+ *
+ * The "`@link`" tag MAY have a description appended to indicate the type of
+ * relation defined by this occurrence.
+ *
+ * ```
+ * "@link" [<URI> | <reference>] [<description>]
+ * ```
+ *
+ * @link https://www.ietf.org/rfc/rfc2396.txt RFC2396
+ */
+final class LinkTag extends Tag
+{
+    public function __construct(
+        string $name,
+        public readonly ReferenceInterface $reference,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/LinkTag/LinkTagFactory.php b/src/DocBlock/Tag/LinkTag/LinkTagFactory.php
new file mode 100644
index 0000000..ffc0664
--- /dev/null
+++ b/src/DocBlock/Tag/LinkTag/LinkTagFactory.php
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\LinkTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\ElementReferenceReader;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Content\UriReferenceReader;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@link`" tags.
+ *
+ * See {@see LinkTag} for details about this tag.
+ */
+final class LinkTagFactory implements TagFactoryInterface
+{
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): LinkTag
+    {
+        $stream = new Stream($tag, $content);
+
+        try {
+            $reference = $stream->apply(new UriReferenceReader());
+        } catch (\Throwable) {
+            $reference = $stream->apply(new ElementReferenceReader());
+        }
+
+        return new LinkTag(
+            name: $tag,
+            reference: $reference,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/MethodTag/MethodTag.php b/src/DocBlock/Tag/MethodTag/MethodTag.php
new file mode 100644
index 0000000..4d44f77
--- /dev/null
+++ b/src/DocBlock/Tag/MethodTag/MethodTag.php
@@ -0,0 +1,75 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\MethodTag;
+
+use TypeLang\Parser\Node\Stmt\Callable\CallableParameterNode;
+use TypeLang\Parser\Node\Stmt\Callable\ParameterNode;
+use TypeLang\Parser\Node\Stmt\TypeStatement;
+use TypeLang\PHPDoc\DocBlock\Tag\OptionalTypeProviderInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+
+/**
+ * The "`@method`" tag is used in situations where a class contains the
+ * `__call()` or `__callStatic()` magic method and defines some definite uses.
+ *
+ * An example of this is a child class whose parent has a `__call()` method
+ * defined to have dynamic getters or setters for predefined properties. The
+ * child knows which getters and setters need to be present, but relies on the
+ * parent class to use the `__call()` method to provide this functionality. In
+ * this situation, the child class would have a "`@method`" tag for each magic
+ * setter or getter method.
+ *
+ * The "`@method`" tag allows the author to communicate the type of the
+ * arguments and return value by including those types in the signature.
+ *
+ * When the intended method does not have a return value then the return type
+ * MAY be omitted; in which case '`void`' is implied.
+ *
+ * If the intended method is static, the static keyword can be placed before
+ * the return type to communicate that. In that case, a return type MUST be
+ * provided, as static on its own would mean that the method returns an instance
+ * of the child class which the method is called on.
+ *
+ * The "`@method`" tags MUST NOT be used in a PHPDoc unless it is associated
+ * with a class or interface.
+ *
+ * ```
+ * "@method" [static] <callable-type> [<description>]
+ * "@method" [static] <return-type> <callable-type> [<description>]
+ * "@method" [static] <callable-type>: <return-type> [<description>]
+ * ```
+ */
+class MethodTag extends Tag implements OptionalTypeProviderInterface
+{
+    /**
+     * @var list<ParameterNode|CallableParameterNode>
+     */
+    public readonly array $parameters;
+
+    /**
+     * @param non-empty-string $name
+     * @param non-empty-string $method
+     * @param iterable<mixed, ParameterNode|CallableParameterNode> $parameters
+     */
+    public function __construct(
+        string $name,
+        /**
+         * @var non-empty-string
+         */
+        public readonly string $method,
+        public readonly ?TypeStatement $type = null,
+        iterable $parameters = [],
+        public readonly bool $isStatic = false,
+        \Stringable|string|null $description = null,
+    ) {
+        $this->parameters = match (true) {
+            $parameters instanceof \Traversable => \iterator_to_array($parameters, false),
+            \array_is_list($parameters) => $parameters,
+            default => \array_values($parameters),
+        };
+
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/MethodTag/MethodTagFactory.php b/src/DocBlock/Tag/MethodTag/MethodTagFactory.php
new file mode 100644
index 0000000..8d6e377
--- /dev/null
+++ b/src/DocBlock/Tag/MethodTag/MethodTagFactory.php
@@ -0,0 +1,87 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\MethodTag;
+
+use TypeLang\Parser\Node\Stmt\CallableTypeNode;
+use TypeLang\Parser\Node\Stmt\NamedTypeNode;
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Exception\InvalidTagException;
+use TypeLang\PHPDoc\Parser\Content\OptionalTypeReader;
+use TypeLang\PHPDoc\Parser\Content\OptionalValueReader;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Content\TypeReader;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@method`" tags.
+ *
+ * See {@see MethodTag} for details about this tag.
+ */
+final class MethodTagFactory implements TagFactoryInterface
+{
+    public function __construct(
+        private readonly TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {}
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): MethodTag
+    {
+        $stream = new Stream($tag, $content);
+
+        $isStatic = $stream->apply(new OptionalValueReader('static')) !== null;
+
+        try {
+            $type = $stream->apply(new TypeReader($this->parser));
+        } catch (InvalidTagException $e) {
+            $type = $isStatic ? new NamedTypeNode('static') : throw $e;
+        }
+
+        $callable = null;
+
+        if (!$type instanceof CallableTypeNode) {
+            $callable = $stream->apply(new OptionalTypeReader($this->parser));
+        }
+
+        // In case of return type has not been defined then we swap first
+        // defined type as method signature definition.
+        if ($callable === null) {
+            $callable = $type;
+            $type = null;
+        }
+
+        if (!$callable instanceof CallableTypeNode) {
+            throw $stream->toException(\sprintf(
+                'Tag @%s must contain the method signature',
+                $tag,
+            ));
+        }
+
+        if ($callable->type !== null && $type !== null) {
+            throw $stream->toException(\sprintf(
+                'You can specify the return type of the @%s tag before or '
+                    . 'after the method`s signature, but not both',
+                $tag,
+            ));
+        }
+
+        if (!$callable->name->isSimple()) {
+            throw $stream->toException(\sprintf(
+                'Tag @%s must contain the method name, but FQN "%s" given',
+                $tag,
+                $callable->name->toString(),
+            ));
+        }
+
+        return new MethodTag(
+            name: $tag,
+            method: $callable->name->toString(),
+            type: $callable->type ?? $type,
+            parameters: $callable->parameters,
+            isStatic: $isStatic,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/NoNamedArgumentsTag/NoNamedArgumentsTag.php b/src/DocBlock/Tag/NoNamedArgumentsTag/NoNamedArgumentsTag.php
new file mode 100644
index 0000000..025a442
--- /dev/null
+++ b/src/DocBlock/Tag/NoNamedArgumentsTag/NoNamedArgumentsTag.php
@@ -0,0 +1,25 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\NoNamedArgumentsTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+
+/**
+ * Indicates that argument names may be changed in the future, and an update
+ * may break backwards compatibility with unction calls using named arguments.
+ *
+ * ```
+ * "@no-named-arguments" [<description>]
+ * ```
+ */
+final class NoNamedArgumentsTag extends Tag
+{
+    public function __construct(
+        string $name,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/NoNamedArgumentsTag/NoNamedArgumentsTagFactory.php b/src/DocBlock/Tag/NoNamedArgumentsTag/NoNamedArgumentsTagFactory.php
new file mode 100644
index 0000000..f337be5
--- /dev/null
+++ b/src/DocBlock/Tag/NoNamedArgumentsTag/NoNamedArgumentsTagFactory.php
@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\NoNamedArgumentsTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@no-named-arguments`" tags.
+ *
+ * See {@see NoNamedArgumentsTag} for details about this tag.
+ */
+final class NoNamedArgumentsTagFactory implements TagFactoryInterface
+{
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): NoNamedArgumentsTag
+    {
+        $stream = new Stream($tag, $content);
+
+        return new NoNamedArgumentsTag(
+            name: $tag,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/OptionalTypeProviderInterface.php b/src/DocBlock/Tag/OptionalTypeProviderInterface.php
new file mode 100644
index 0000000..9d8de1a
--- /dev/null
+++ b/src/DocBlock/Tag/OptionalTypeProviderInterface.php
@@ -0,0 +1,21 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag;
+
+use TypeLang\Parser\Node\Stmt\TypeStatement;
+
+/**
+ * Representation of any entry that MAY contain optional type definition.
+ */
+interface OptionalTypeProviderInterface
+{
+    /**
+     * Gets an AST object of the {@see TypeStatement} type or {@see null}
+     * in case the type is not specified.
+     *
+     * @readonly
+     */
+    public ?TypeStatement $type { get; }
+}
diff --git a/src/DocBlock/Tag/OptionalVariableProviderInterface.php b/src/DocBlock/Tag/OptionalVariableProviderInterface.php
new file mode 100644
index 0000000..a7c53c7
--- /dev/null
+++ b/src/DocBlock/Tag/OptionalVariableProviderInterface.php
@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag;
+
+/**
+ * Representation of any entry that MAY contain an optional variable name.
+ */
+interface OptionalVariableProviderInterface
+{
+    /**
+     * The name of the variable (parameter, field, etc.) to which this
+     * interface is attached or {@see null} in case of
+     * entry does not contain a name.
+     *
+     * @var non-empty-string|null
+     *
+     * @readonly
+     */
+    public ?string $variable { get; }
+}
diff --git a/src/DocBlock/Tag/OverrideTag/OverrideTag.php b/src/DocBlock/Tag/OverrideTag/OverrideTag.php
new file mode 100644
index 0000000..ca297c4
--- /dev/null
+++ b/src/DocBlock/Tag/OverrideTag/OverrideTag.php
@@ -0,0 +1,26 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\OverrideTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+
+/**
+ * Used is mention to see if the method is actually overriding a definition
+ * or implementing an abstract method (Or a phpdoc "`@method`")
+ * in an ancestor class/trait/interface.
+ *
+ * ```
+ * "@override" [<description>]
+ * ```
+ */
+final class OverrideTag extends Tag
+{
+    public function __construct(
+        string $name,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/OverrideTag/OverrideTagFactory.php b/src/DocBlock/Tag/OverrideTag/OverrideTagFactory.php
new file mode 100644
index 0000000..1a63a72
--- /dev/null
+++ b/src/DocBlock/Tag/OverrideTag/OverrideTagFactory.php
@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\OverrideTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@override`" tags.
+ *
+ * See {@see OverrideTag} for details about this tag.
+ */
+final class OverrideTagFactory implements TagFactoryInterface
+{
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): OverrideTag
+    {
+        $stream = new Stream($tag, $content);
+
+        return new OverrideTag(
+            name: $tag,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/PackageTag/PackageTag.php b/src/DocBlock/Tag/PackageTag/PackageTag.php
new file mode 100644
index 0000000..63cb3fd
--- /dev/null
+++ b/src/DocBlock/Tag/PackageTag/PackageTag.php
@@ -0,0 +1,46 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\PackageTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+
+/**
+ * Used to categorize _Element(s)_ into logical subdivisions.
+ *
+ * The "`@package`" tag can be used as a counterpart or supplement to
+ * Namespaces. Namespaces provide a functional subdivision of _Element(s)_
+ * where the "`@package`" tag can provide a logical subdivision in which
+ * way the elements can be grouped with a different hierarchy.
+ *
+ * If, across the board, both logical and functional subdivisions
+ * are equal is it NOT RECOMMENDED to use the "`@package`"
+ * tag to prevent maintenance overhead.
+ *
+ * Each level in the logical hierarchy MUST be separated with a backslash
+ * (`\`) to be familiar to Namespaces. A hierarchy MAY be of endless depth
+ * but it is RECOMMENDED to keep the depth at less or equal than six levels.
+ *
+ * Please note that the "`@package`" tag applies to different _Element(s)_
+ * depending where it is defined.
+ *
+ * - If the package is defined in the file-level DocBlock then it only applies
+ *   to the following elements in the applicable file:
+ *    - global functions
+ *    - global constants
+ *    - global variables
+ *    - requires and includes
+ *
+ * - If the package is defined in a namespace-level or class-level DocBlock
+ *   then the package applies to that namespace, class, trait or interface
+ *   and their contained elements. This means that a function which is
+ *   contained in a namespace with the "`@package`" tag assumes that package.
+ *
+ * The "`@package`" tag MUST NOT occur more than once in a PHPDoc.
+ *
+ * ```
+ * "@package" <namespace> [<description>]
+ * ```
+ */
+final class PackageTag extends SubPackageTag {}
diff --git a/src/DocBlock/Tag/PackageTag/PackageTagFactory.php b/src/DocBlock/Tag/PackageTag/PackageTagFactory.php
new file mode 100644
index 0000000..7275b22
--- /dev/null
+++ b/src/DocBlock/Tag/PackageTag/PackageTagFactory.php
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\PackageTag;
+
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@package`" tags.
+ *
+ * See {@see PackageTag} for details about this tag.
+ */
+final class PackageTagFactory implements TagFactoryInterface
+{
+    private readonly SubPackageTagFactory $factory;
+
+    public function __construct(
+        TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {
+        $this->factory = new SubPackageTagFactory($parser);
+    }
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): PackageTag
+    {
+        $result = $this->factory->create($tag, $content, $descriptions);
+
+        return new PackageTag(
+            name: $result->name,
+            package: $result->package,
+            description: $result->description,
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/PackageTag/SubPackageTag.php b/src/DocBlock/Tag/PackageTag/SubPackageTag.php
new file mode 100644
index 0000000..13f4372
--- /dev/null
+++ b/src/DocBlock/Tag/PackageTag/SubPackageTag.php
@@ -0,0 +1,43 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\PackageTag;
+
+use TypeLang\Parser\Node\Name;
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+
+/**
+ * Used to categorize _Element(s)_ into logical subdivisions.
+ *
+ * The "`@subpackage`" tag can be used as a counterpart or supplement to
+ * Namespaces. Namespaces provide a functional subdivision of _Element(s)_
+ * where the "`@subpackage`" tag can provide a logical subdivision in
+ * which way the elements can be grouped with a different hierarchy.
+ *
+ * If, across the board, both logical and functional subdivisions
+ * are equal, it is NOT RECOMMENDED to use the "`@subpackage`"
+ * tag to prevent maintenance overhead.
+ *
+ * The "`@subpackage`" tag MUST only be used in a select set of
+ * DocBlocks, as is described in the documentation for the "`@package`"
+ * tag. It MUST also accompany a "`@package`" tag and may occur
+ * only once per DocBlock.
+ *
+ * This tag is considered superseded by the support for multiple levels
+ * in the "`@package`" tag and is as such considered deprecated.
+ *
+ * ```
+ * ""`@subpackage`"" <namespace> [<description>]
+ * ```
+ */
+class SubPackageTag extends Tag
+{
+    public function __construct(
+        string $name,
+        public readonly Name $package,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/PackageTag/SubPackageTagFactory.php b/src/DocBlock/Tag/PackageTag/SubPackageTagFactory.php
new file mode 100644
index 0000000..8422f89
--- /dev/null
+++ b/src/DocBlock/Tag/PackageTag/SubPackageTagFactory.php
@@ -0,0 +1,59 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\PackageTag;
+
+use TypeLang\Parser\Node\Stmt\NamedTypeNode;
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Content\TypeReader;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@subpackage`" tags.
+ *
+ * See {@see SubPackageTag} for details about this tag.
+ */
+final class SubPackageTagFactory implements TagFactoryInterface
+{
+    public function __construct(
+        private readonly TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {}
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): SubPackageTag
+    {
+        $stream = new Stream($tag, $content);
+
+        $type = $stream->apply(new TypeReader($this->parser));
+
+        if (!$type instanceof NamedTypeNode) {
+            throw $stream->toException(\sprintf(
+                'Tag @%s expects the namespace to be defined',
+                $stream->tag,
+            ));
+        }
+
+        if ($type->arguments !== null) {
+            throw $stream->toException(\sprintf(
+                'Tag @%s namespace cannot contain template arguments',
+                $stream->tag,
+            ));
+        }
+
+        if ($type->fields !== null) {
+            throw $stream->toException(\sprintf(
+                'Tag @%s namespace cannot contain shape fields',
+                $stream->tag,
+            ));
+        }
+
+        return new SubPackageTag(
+            name: $tag,
+            package: $type->name,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/ParamTag/ParamTag.php b/src/DocBlock/Tag/ParamTag/ParamTag.php
new file mode 100644
index 0000000..823fb5e
--- /dev/null
+++ b/src/DocBlock/Tag/ParamTag/ParamTag.php
@@ -0,0 +1,52 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\ParamTag;
+
+use TypeLang\Parser\Node\Stmt\TypeStatement;
+use TypeLang\PHPDoc\DocBlock\Tag\OptionalTypeProviderInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+use TypeLang\PHPDoc\DocBlock\Tag\VariableProviderInterface;
+
+/**
+ * With the "`@param`" tag it is possible to document the type and the intent of
+ * a single argument of a function or method. When provided it MAY contain a
+ * type to indicate what is expected. The name of the argument MUST be present
+ * so that it is clear which argument this tag relates to.
+ *
+ * The description is OPTIONAL yet RECOMMENDED, for instance, in case of
+ * complicated structures, such as associative arrays.
+ *
+ * The "`@param`" tag MAY have a multi-line description and does not need
+ * explicit delimiting.
+ *
+ * At a minimum, it is RECOMMENDED to use this tag with each argument whose code
+ * signature does not provide type information.
+ *
+ * This tag MUST NOT occur more than once per argument in a PHPDoc and is
+ * limited to structural elements of type method or function.
+ *
+ * ```
+ * "@param" [<type>] $<variable> [<description>]
+ * ```
+ */
+class ParamTag extends Tag implements
+    OptionalTypeProviderInterface,
+    VariableProviderInterface
+{
+    /**
+     * @param non-empty-string $name
+     * @param non-empty-string $variable
+     */
+    public function __construct(
+        string $name,
+        public readonly ?TypeStatement $type,
+        public readonly string $variable,
+        public readonly bool $isVariadic = false,
+        public readonly bool $isOutput = false,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/ParamTag/ParamTagFactory.php b/src/DocBlock/Tag/ParamTag/ParamTagFactory.php
new file mode 100644
index 0000000..4419f46
--- /dev/null
+++ b/src/DocBlock/Tag/ParamTag/ParamTagFactory.php
@@ -0,0 +1,66 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\ParamTag;
+
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Content\TypeReader;
+use TypeLang\PHPDoc\Parser\Content\VariableNameReader;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@param`" tags.
+ *
+ * See {@see ParamTag} for details about this tag.
+ */
+final class ParamTagFactory implements TagFactoryInterface
+{
+    public function __construct(
+        private readonly TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {}
+
+    private function isVariable(string $content): bool
+    {
+        return \str_starts_with($content, '&$')
+            || \str_starts_with($content, '...$')
+            || \str_starts_with($content, '&...$')
+            || \str_starts_with($content, '$');
+    }
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): ParamTag
+    {
+        $stream = new Stream($tag, $content);
+
+        $type = null;
+        $output = $variadic = false;
+
+        if (!$this->isVariable($stream->value)) {
+            $type = $stream->apply(new TypeReader($this->parser));
+        }
+
+        if (\str_starts_with($stream->value, '&')) {
+            $stream->shift(1);
+            $output = true;
+        }
+
+        if (\str_starts_with($stream->value, '...')) {
+            $stream->shift(3);
+            $variadic = true;
+        }
+
+        $variable = $stream->apply(new VariableNameReader());
+
+        return new ParamTag(
+            name: $tag,
+            type: $type,
+            variable: $variable,
+            isVariadic: $variadic,
+            isOutput: $output,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/PropertyTag/PropertyReadTag.php b/src/DocBlock/Tag/PropertyTag/PropertyReadTag.php
new file mode 100644
index 0000000..bdaaf2a
--- /dev/null
+++ b/src/DocBlock/Tag/PropertyTag/PropertyReadTag.php
@@ -0,0 +1,12 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\PropertyTag;
+
+/**
+ * ```
+ * "@property-read" [<type>] $<name> [<description>]
+ * ```
+ */
+class PropertyReadTag extends PropertyTag {}
diff --git a/src/DocBlock/Tag/PropertyTag/PropertyReadTagFactory.php b/src/DocBlock/Tag/PropertyTag/PropertyReadTagFactory.php
new file mode 100644
index 0000000..dc9f18d
--- /dev/null
+++ b/src/DocBlock/Tag/PropertyTag/PropertyReadTagFactory.php
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\PropertyTag;
+
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@property-read`" tags.
+ *
+ * See {@see PropertyReadTag} for details about this tag.
+ */
+final class PropertyReadTagFactory implements TagFactoryInterface
+{
+    private readonly PropertyTagFactory $factory;
+
+    public function __construct(
+        TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {
+        $this->factory = new PropertyTagFactory($parser);
+    }
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): PropertyReadTag
+    {
+        $property = $this->factory->create($tag, $content, $descriptions);
+
+        return new PropertyReadTag(
+            name: $property->name,
+            type: $property->type,
+            variable: $property->variable,
+            description: $property->description,
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/PropertyTag/PropertyTag.php b/src/DocBlock/Tag/PropertyTag/PropertyTag.php
new file mode 100644
index 0000000..8d7b4fa
--- /dev/null
+++ b/src/DocBlock/Tag/PropertyTag/PropertyTag.php
@@ -0,0 +1,56 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\PropertyTag;
+
+use TypeLang\Parser\Node\Stmt\TypeStatement;
+use TypeLang\PHPDoc\DocBlock\Tag\OptionalTypeProviderInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+use TypeLang\PHPDoc\DocBlock\Tag\VariableProviderInterface;
+
+/**
+ * The "`@property`" tag is used when a class or trait implements the `__get()`
+ * and/or `__set()` 'magic' methods to resolve non-literal properties
+ * at run-time.
+ *
+ * The "`@property-read`" and "`@property-write`" variants MAY be used to
+ * indicate 'magic' properties that can only be read or written.
+ *
+ * For example, the "`@property-read`" tag could be used when a class contains
+ * a `__get()` magic method which allows for specific names, while those names
+ * are not covered in the `__set()` magic method.
+ *
+ * | Property supported via  | Tag to use          |
+ * |-------------------------|---------------------|
+ * | `__get()` and `__set()` | "`@property`"       |
+ * | `__get()` only          | "`@property-read`"  |
+ * | `__set()` only          | "`@property-write`" |
+ *
+ * The "`@property`", "`@property-read`" and "`@property-write`" tags can ONLY
+ * be used in a PHPDoc that is associated with a class or trait.
+ *
+ * - Also {@see PropertyReadTag} for "`@property-read`" tag implementation.
+ * - Also {@see PropertyWriteTag} for "`@property-write`" tag implementation.
+ *
+ * ```
+ * "@property" [<type>] $<name> [<description>]
+ * ```
+ */
+class PropertyTag extends Tag implements
+    OptionalTypeProviderInterface,
+    VariableProviderInterface
+{
+    /**
+     * @param non-empty-string $name
+     * @param non-empty-string $variable
+     */
+    public function __construct(
+        string $name,
+        public readonly ?TypeStatement $type,
+        public readonly string $variable,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/PropertyTag/PropertyTagFactory.php b/src/DocBlock/Tag/PropertyTag/PropertyTagFactory.php
new file mode 100644
index 0000000..ede131c
--- /dev/null
+++ b/src/DocBlock/Tag/PropertyTag/PropertyTagFactory.php
@@ -0,0 +1,44 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\PropertyTag;
+
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Content\TypeReader;
+use TypeLang\PHPDoc\Parser\Content\VariableNameReader;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@property`" tags.
+ *
+ * See {@see PropertyTag} for details about this tag.
+ */
+final class PropertyTagFactory implements TagFactoryInterface
+{
+    public function __construct(
+        private readonly TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {}
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): PropertyTag
+    {
+        $stream = new Stream($tag, $content);
+        $type = null;
+
+        if (!\str_starts_with($stream->value, '$')) {
+            $type = $stream->apply(new TypeReader($this->parser));
+        }
+
+        $variable = $stream->apply(new VariableNameReader());
+
+        return new PropertyTag(
+            name: $tag,
+            type: $type,
+            variable: $variable,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/PropertyTag/PropertyWriteTag.php b/src/DocBlock/Tag/PropertyTag/PropertyWriteTag.php
new file mode 100644
index 0000000..925fe37
--- /dev/null
+++ b/src/DocBlock/Tag/PropertyTag/PropertyWriteTag.php
@@ -0,0 +1,12 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\PropertyTag;
+
+/**
+ * ```
+ * "@property-write" [<type>] $<name> [<description>]
+ * ```
+ */
+class PropertyWriteTag extends PropertyTag {}
diff --git a/src/DocBlock/Tag/PropertyTag/PropertyWriteTagFactory.php b/src/DocBlock/Tag/PropertyTag/PropertyWriteTagFactory.php
new file mode 100644
index 0000000..489b307
--- /dev/null
+++ b/src/DocBlock/Tag/PropertyTag/PropertyWriteTagFactory.php
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\PropertyTag;
+
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@property-write`" tags.
+ *
+ * See {@see PropertyWriteTag} for details about this tag.
+ */
+final class PropertyWriteTagFactory implements TagFactoryInterface
+{
+    private readonly PropertyTagFactory $factory;
+
+    public function __construct(
+        TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {
+        $this->factory = new PropertyTagFactory($parser);
+    }
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): PropertyWriteTag
+    {
+        $property = $this->factory->create($tag, $content, $descriptions);
+
+        return new PropertyWriteTag(
+            name: $property->name,
+            type: $property->type,
+            variable: $property->variable,
+            description: $property->description,
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/ReturnTag/ReturnTag.php b/src/DocBlock/Tag/ReturnTag/ReturnTag.php
new file mode 100644
index 0000000..c57a54f
--- /dev/null
+++ b/src/DocBlock/Tag/ReturnTag/ReturnTag.php
@@ -0,0 +1,48 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\ReturnTag;
+
+use TypeLang\Parser\Node\Stmt\TypeStatement;
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+use TypeLang\PHPDoc\DocBlock\Tag\TypeProviderInterface;
+
+/**
+ * With the "`@return`" tag it is possible to document the return type of a
+ * function or method. When provided it MUST contain a type to indicate what is
+ * returned; the description on the other hand is OPTIONAL yet RECOMMENDED, for
+ * instance, in case of complicated return structures, such as associative arrays.
+ *
+ * The "`@return`" tag MAY have a multi-line description and does not need
+ * explicit delimiting.
+ *
+ * It is RECOMMENDED to use this tag with every function and method. Exceptions
+ * to this recommendation, as defined by the coding standard of any individual
+ * project, MAY be:
+ *
+ *  - Constructors, the "`@return`" tag MAY be omitted here, in which
+ *    case "`@return`" self is implied.
+ *  - Functions and methods without a `return` value, the "`@return`" tag MAY be
+ *    omitted here, in which case "`@return`" void is implied.
+ *
+ * This tag MUST NOT occur more than once in a PHPDoc and is limited to
+ * structural elements of type method or function.
+ *
+ * ```
+ * "@return" [<type>] [<description>]
+ * ```
+ */
+class ReturnTag extends Tag implements TypeProviderInterface
+{
+    /**
+     * @param non-empty-string $name
+     */
+    public function __construct(
+        string $name,
+        public readonly TypeStatement $type,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/ReturnTag/ReturnTagFactory.php b/src/DocBlock/Tag/ReturnTag/ReturnTagFactory.php
new file mode 100644
index 0000000..6f004b0
--- /dev/null
+++ b/src/DocBlock/Tag/ReturnTag/ReturnTagFactory.php
@@ -0,0 +1,35 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\ReturnTag;
+
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Content\TypeReader;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@return`" tags.
+ *
+ * See {@see ReturnTag} for details about this tag.
+ */
+final class ReturnTagFactory implements TagFactoryInterface
+{
+    public function __construct(
+        private readonly TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {}
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): ReturnTag
+    {
+        $stream = new Stream($tag, $content);
+
+        return new ReturnTag(
+            name: $tag,
+            type: $stream->apply(new TypeReader($this->parser)),
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/SeeTag/SeeTag.php b/src/DocBlock/Tag/SeeTag/SeeTag.php
new file mode 100644
index 0000000..9e3fa7b
--- /dev/null
+++ b/src/DocBlock/Tag/SeeTag/SeeTag.php
@@ -0,0 +1,42 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\SeeTag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\ElementReference;
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\ReferenceInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\UriReference;
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+
+/**
+ * The "`@see`" tag can be used to define a {@see ElementReference element} or
+ * to an {@see UriReference external URI}.
+ *
+ * When defining a reference to other elements, you can refer to a specific
+ * element by appending a double colon and providing the name of that element
+ * (also called the 'Fully Qualified Name' or _FQN_).
+ *
+ * A URI MUST be complete and well-formed as specified in RFC 2396.
+ *
+ * The "`@see"` tag SHOULD have a description to provide additional information
+ * regarding the relationship between the element and its target.
+ *
+ * The "`@see`" tag cannot refer to a namespace element.
+ *
+ * ```
+ * "@see" [<URI> | <reference> | <type>] [<description>]
+ * ```
+ *
+ * @link https://www.ietf.org/rfc/rfc2396.txt RFC2396
+ */
+final class SeeTag extends Tag
+{
+    public function __construct(
+        string $name,
+        public readonly ReferenceInterface $ref,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/SeeTag/SeeTagFactory.php b/src/DocBlock/Tag/SeeTag/SeeTagFactory.php
new file mode 100644
index 0000000..ec4dc3b
--- /dev/null
+++ b/src/DocBlock/Tag/SeeTag/SeeTagFactory.php
@@ -0,0 +1,50 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\SeeTag;
+
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\TypeElementReference;
+use TypeLang\PHPDoc\Parser\Content\ElementReferenceReader;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Content\TypeReader;
+use TypeLang\PHPDoc\Parser\Content\UriReferenceReader;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@see`" tags.
+ *
+ * See {@see SeeTag} for details about this tag.
+ */
+final class SeeTagFactory implements TagFactoryInterface
+{
+    public function __construct(
+        private readonly TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {}
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): SeeTag
+    {
+        $stream = new Stream($tag, $content);
+
+        try {
+            $reference = $stream->apply(new UriReferenceReader());
+        } catch (\Throwable) {
+            try {
+                $reference = $stream->apply(new ElementReferenceReader());
+            } catch (\Throwable) {
+                $reference = new TypeElementReference(
+                    type: $stream->apply(new TypeReader($this->parser))
+                );
+            }
+        }
+
+        return new SeeTag(
+            name: $tag,
+            ref: $reference,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/Shared/Reference/ClassConstantElementReference.php b/src/DocBlock/Tag/Shared/Reference/ClassConstantElementReference.php
new file mode 100644
index 0000000..cd485f9
--- /dev/null
+++ b/src/DocBlock/Tag/Shared/Reference/ClassConstantElementReference.php
@@ -0,0 +1,23 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference;
+
+use TypeLang\Parser\Node\Name;
+
+/**
+ * Related to any internal class property reference
+ */
+final class ClassConstantElementReference extends ClassElementReference
+{
+    public function __construct(
+        Name $class,
+        /**
+         * @var non-empty-string
+         */
+        public readonly string $constant,
+    ) {
+        parent::__construct($class);
+    }
+}
diff --git a/src/DocBlock/Tag/Shared/Reference/ClassElementReference.php b/src/DocBlock/Tag/Shared/Reference/ClassElementReference.php
new file mode 100644
index 0000000..9030ee0
--- /dev/null
+++ b/src/DocBlock/Tag/Shared/Reference/ClassElementReference.php
@@ -0,0 +1,17 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference;
+
+use TypeLang\Parser\Node\Name;
+
+/**
+ * Related to any internal class reference
+ */
+abstract class ClassElementReference extends ElementReference
+{
+    public function __construct(
+        public readonly Name $class,
+    ) {}
+}
diff --git a/src/DocBlock/Tag/Shared/Reference/ClassMethodElementReference.php b/src/DocBlock/Tag/Shared/Reference/ClassMethodElementReference.php
new file mode 100644
index 0000000..b1685ab
--- /dev/null
+++ b/src/DocBlock/Tag/Shared/Reference/ClassMethodElementReference.php
@@ -0,0 +1,23 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference;
+
+use TypeLang\Parser\Node\Name;
+
+/**
+ * Related to any internal class property reference
+ */
+final class ClassMethodElementReference extends ClassElementReference
+{
+    public function __construct(
+        Name $class,
+        /**
+         * @var non-empty-string
+         */
+        public readonly string $method,
+    ) {
+        parent::__construct($class);
+    }
+}
diff --git a/src/DocBlock/Tag/Shared/Reference/ClassPropertyElementReference.php b/src/DocBlock/Tag/Shared/Reference/ClassPropertyElementReference.php
new file mode 100644
index 0000000..4138ec7
--- /dev/null
+++ b/src/DocBlock/Tag/Shared/Reference/ClassPropertyElementReference.php
@@ -0,0 +1,23 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference;
+
+use TypeLang\Parser\Node\Name;
+
+/**
+ * Related to any internal class property reference
+ */
+final class ClassPropertyElementReference extends ClassElementReference
+{
+    public function __construct(
+        Name $class,
+        /**
+         * @var non-empty-string
+         */
+        public readonly string $property,
+    ) {
+        parent::__construct($class);
+    }
+}
diff --git a/src/DocBlock/Tag/Shared/Reference/ElementReference.php b/src/DocBlock/Tag/Shared/Reference/ElementReference.php
new file mode 100644
index 0000000..3b1699f
--- /dev/null
+++ b/src/DocBlock/Tag/Shared/Reference/ElementReference.php
@@ -0,0 +1,10 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference;
+
+/**
+ * Related to any internal reference
+ */
+abstract class ElementReference implements ReferenceInterface {}
diff --git a/src/DocBlock/Tag/Shared/Reference/FunctionElementReference.php b/src/DocBlock/Tag/Shared/Reference/FunctionElementReference.php
new file mode 100644
index 0000000..72b0e38
--- /dev/null
+++ b/src/DocBlock/Tag/Shared/Reference/FunctionElementReference.php
@@ -0,0 +1,17 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference;
+
+use TypeLang\Parser\Node\Name;
+
+/**
+ * Related to internal function reference
+ */
+final class FunctionElementReference extends ElementReference
+{
+    public function __construct(
+        public readonly Name $function,
+    ) {}
+}
diff --git a/src/DocBlock/Tag/Shared/Reference/ReferenceInterface.php b/src/DocBlock/Tag/Shared/Reference/ReferenceInterface.php
new file mode 100644
index 0000000..7bba4c1
--- /dev/null
+++ b/src/DocBlock/Tag/Shared/Reference/ReferenceInterface.php
@@ -0,0 +1,10 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference;
+
+/**
+ * Represents reference to the external or internal element
+ */
+interface ReferenceInterface {}
diff --git a/src/DocBlock/Tag/Shared/Reference/TypeElementReference.php b/src/DocBlock/Tag/Shared/Reference/TypeElementReference.php
new file mode 100644
index 0000000..97cfb63
--- /dev/null
+++ b/src/DocBlock/Tag/Shared/Reference/TypeElementReference.php
@@ -0,0 +1,17 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference;
+
+use TypeLang\Parser\Node\Stmt\TypeStatement;
+
+/**
+ * Related to internal type reference
+ */
+final class TypeElementReference extends ElementReference
+{
+    public function __construct(
+        public readonly TypeStatement $type,
+    ) {}
+}
diff --git a/src/DocBlock/Tag/Shared/Reference/UriReference.php b/src/DocBlock/Tag/Shared/Reference/UriReference.php
new file mode 100644
index 0000000..e079861
--- /dev/null
+++ b/src/DocBlock/Tag/Shared/Reference/UriReference.php
@@ -0,0 +1,17 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference;
+
+use League\Uri\Contracts\UriInterface;
+
+/**
+ * Related to external URI reference
+ */
+final class UriReference implements ReferenceInterface
+{
+    public function __construct(
+        public readonly UriInterface $uri,
+    ) {}
+}
diff --git a/src/DocBlock/Tag/Shared/Reference/VariableReference.php b/src/DocBlock/Tag/Shared/Reference/VariableReference.php
new file mode 100644
index 0000000..39fd1dd
--- /dev/null
+++ b/src/DocBlock/Tag/Shared/Reference/VariableReference.php
@@ -0,0 +1,17 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference;
+
+use TypeLang\Parser\Node\Literal\VariableLiteralNode;
+
+/**
+ * Related to local variable reference
+ */
+final class VariableReference extends ElementReference
+{
+    public function __construct(
+        public readonly VariableLiteralNode $variable,
+    ) {}
+}
diff --git a/src/DocBlock/Tag/Shared/Version.php b/src/DocBlock/Tag/Shared/Version.php
new file mode 100644
index 0000000..03ab245
--- /dev/null
+++ b/src/DocBlock/Tag/Shared/Version.php
@@ -0,0 +1,79 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\Shared;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Version\Stability;
+
+final class Version implements \Stringable
+{
+    public function __construct(
+        /**
+         * @var int<0, max>
+         */
+        public readonly int $major = 0,
+        /**
+         * @var int<0, max>
+         */
+        public readonly int $minor = 0,
+        /**
+         * @var int<0, max>|null
+         */
+        public readonly ?int $patch = null,
+        /**
+         * @var int<0, max>|null
+         */
+        public readonly ?int $build = null,
+        public readonly ?Stability $stability = null,
+    ) {}
+
+    /**
+     * @return non-empty-string
+     */
+    private function toSignificantVersionString(): string
+    {
+        return \sprintf('%d.%d.%d.%d', $this->major, $this->minor, $this->patch, $this->build);
+    }
+
+    public function compare(self $other): int
+    {
+        $result = \version_compare(
+            version1: $this->toSignificantVersionString(),
+            version2: $other->toSignificantVersionString(),
+        );
+
+        if ($result === 0) {
+            // Compare stability if provided
+            if ($this->stability !== null && $other->stability !== null) {
+                return $this->stability->compare($other->stability);
+            }
+
+            // Stable (no Stability flag) is greater than RC/beta/alpha/dev/etc
+            return $this->stability === null ? 1 : -1;
+        }
+
+        return $result;
+    }
+
+    public function __toString(): string
+    {
+        $result = [$this->major, $this->minor];
+
+        foreach ([$this->patch, $this->build] as $insignificant) {
+            if ($insignificant === null) {
+                break;
+            }
+
+            $result[] = $insignificant;
+        }
+
+        $version = \implode('.', $result);
+
+        if ($this->stability !== null) {
+            $version .= '-' . $this->stability;
+        }
+
+        return $version;
+    }
+}
diff --git a/src/DocBlock/Tag/Shared/Version/Stability.php b/src/DocBlock/Tag/Shared/Version/Stability.php
new file mode 100644
index 0000000..27f3d30
--- /dev/null
+++ b/src/DocBlock/Tag/Shared/Version/Stability.php
@@ -0,0 +1,71 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\Shared\Version;
+
+final class Stability implements \Stringable
+{
+    /**
+     * @var int<0, max>
+     */
+    public readonly int $priority;
+
+    public function __construct(
+        public readonly StabilityType $type,
+        /**
+         * @var int<0, max>
+         */
+        public readonly int $version = 0,
+    ) {
+        // @phpstan-ignore-next-line : This expression provides int<0, max>
+        $this->priority = $this->version << 2 | $this->type->value;
+    }
+
+    /**
+     * @param int<0, max> $version
+     */
+    public static function rc(int $version = 0): self
+    {
+        return new self(StabilityType::ReleaseCandidate, $version);
+    }
+
+    /**
+     * @param int<0, max> $version
+     */
+    public static function beta(int $version = 0): self
+    {
+        return new self(StabilityType::Beta, $version);
+    }
+
+    /**
+     * @param int<0, max> $version
+     */
+    public static function alpha(int $version = 0): self
+    {
+        return new self(StabilityType::Alpha, $version);
+    }
+
+    /**
+     * @param int<0, max> $version
+     */
+    public static function dev(int $version = 0): self
+    {
+        return new self(StabilityType::Dev, $version);
+    }
+
+    public function compare(self $other): int
+    {
+        return $this->priority <=> $other->priority;
+    }
+
+    public function __toString(): string
+    {
+        return match ($this->type) {
+            StabilityType::ReleaseCandidate => 'RC' . $this->version,
+            StabilityType::Beta => 'beta' . $this->version,
+            StabilityType::Alpha => 'alpha' . $this->version,
+            StabilityType::Dev => 'dev' . $this->version,
+        };
+    }
+}
diff --git a/src/DocBlock/Tag/Shared/Version/StabilityType.php b/src/DocBlock/Tag/Shared/Version/StabilityType.php
new file mode 100644
index 0000000..80defab
--- /dev/null
+++ b/src/DocBlock/Tag/Shared/Version/StabilityType.php
@@ -0,0 +1,13 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\Shared\Version;
+
+enum StabilityType: int
+{
+    case Dev = 0x0000;
+    case Alpha = 0x0001;
+    case Beta = 0x0002;
+    case ReleaseCandidate = 0x0003;
+}
diff --git a/src/Tag/Tag.php b/src/DocBlock/Tag/Tag.php
similarity index 57%
rename from src/Tag/Tag.php
rename to src/DocBlock/Tag/Tag.php
index 1e82f5d..8736861 100644
--- a/src/Tag/Tag.php
+++ b/src/DocBlock/Tag/Tag.php
@@ -2,35 +2,25 @@
 
 declare(strict_types=1);
 
-namespace TypeLang\PHPDoc\Tag;
+namespace TypeLang\PHPDoc\DocBlock\Tag;
 
-use TypeLang\PHPDoc\Tag\Description\Description;
-use TypeLang\PHPDoc\Tag\Description\DescriptionInterface;
+use TypeLang\PHPDoc\DocBlock\Description\Description;
+use TypeLang\PHPDoc\DocBlock\Description\DescriptionInterface;
 
 class Tag implements TagInterface
 {
-    protected readonly ?DescriptionInterface $description;
+    public readonly ?DescriptionInterface $description;
 
     /**
      * @param non-empty-string $name
      */
     public function __construct(
-        protected readonly string $name,
+        public readonly string $name,
         \Stringable|string|null $description = null,
     ) {
         $this->description = Description::fromStringableOrNull($description);
     }
 
-    public function getName(): string
-    {
-        return $this->name;
-    }
-
-    public function getDescription(): ?DescriptionInterface
-    {
-        return $this->description;
-    }
-
     public function __toString(): string
     {
         if ($this->description === null) {
diff --git a/src/Tag/TagInterface.php b/src/DocBlock/Tag/TagInterface.php
similarity index 50%
rename from src/Tag/TagInterface.php
rename to src/DocBlock/Tag/TagInterface.php
index dc2e5c4..a7d47f6 100644
--- a/src/Tag/TagInterface.php
+++ b/src/DocBlock/Tag/TagInterface.php
@@ -2,22 +2,29 @@
 
 declare(strict_types=1);
 
-namespace TypeLang\PHPDoc\Tag;
+namespace TypeLang\PHPDoc\DocBlock\Tag;
 
-use TypeLang\PHPDoc\Tag\Description\OptionalDescriptionProviderInterface;
+use TypeLang\PHPDoc\DocBlock\Description\OptionalDescriptionProviderInterface;
 
+/**
+ * Representation of the phpdoc tag.
+ */
 interface TagInterface extends OptionalDescriptionProviderInterface, \Stringable
 {
     /**
-     * Returns the non-empty tag name string without the '@' prefix.
+     * Gets non-empty tag name string without the '@' prefix.
      *
-     * Each tag name MUST match the pattern: `@[a-zA-Z_\x80-\xff\\\][\w\x80-\xff\-:\\\]*`,
-     * that is, can contain all the characters that can match the PHP FQN, as
-     * well as the '-' character.
+     * Each tag name MUST match the pattern:
+     *  - `@[a-zA-Z_\x80-\xff\\\][\w\x80-\xff\-:\\\]*`
      *
-     * @return non-empty-string
+     * That is, can contain all the characters that can match the PHP FQN
+     * (Fully Qualified Name), as well as the '-' character.
+     *
+     * @var non-empty-string
+     *
+     * @readonly
      */
-    public function getName(): string;
+    public string $name { get; }
 
     /**
      * Magic method {@link https://www.php.net/manual/en/language.oop5.magic.php#object.tostring}
diff --git a/src/DocBlock/Tag/TagsProviderInterface.php b/src/DocBlock/Tag/TagsProviderInterface.php
new file mode 100644
index 0000000..f4a04f3
--- /dev/null
+++ b/src/DocBlock/Tag/TagsProviderInterface.php
@@ -0,0 +1,20 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag;
+
+/**
+ * Representation of any entry that contain inner tags list.
+ */
+interface TagsProviderInterface
+{
+    /**
+     * Gets tags list for this object.
+     *
+     * @var iterable<array-key, TagInterface>
+     *
+     * @readonly
+     */
+    public iterable $tags { get; }
+}
diff --git a/src/DocBlock/Tag/TemplateExtendsTag/TemplateExtendsTag.php b/src/DocBlock/Tag/TemplateExtendsTag/TemplateExtendsTag.php
new file mode 100644
index 0000000..9529a86
--- /dev/null
+++ b/src/DocBlock/Tag/TemplateExtendsTag/TemplateExtendsTag.php
@@ -0,0 +1,12 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\TemplateExtendsTag;
+
+/**
+ * ```
+ * "@extends" <type> [<description>]
+ * ```
+ */
+class TemplateExtendsTag extends TemplateInheritanceTag {}
diff --git a/src/DocBlock/Tag/TemplateExtendsTag/TemplateExtendsTagFactory.php b/src/DocBlock/Tag/TemplateExtendsTag/TemplateExtendsTagFactory.php
new file mode 100644
index 0000000..cc188e9
--- /dev/null
+++ b/src/DocBlock/Tag/TemplateExtendsTag/TemplateExtendsTagFactory.php
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\TemplateExtendsTag;
+
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Content\TypeReader;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@extends`" tags.
+ *
+ * See {@see TemplateExtendsTag} for details about this tag.
+ */
+final class TemplateExtendsTagFactory implements TagFactoryInterface
+{
+    public function __construct(
+        private readonly TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {}
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): TemplateExtendsTag
+    {
+        $stream = new Stream($tag, $content);
+
+        $type = $stream->apply(new TypeReader($this->parser));
+
+        return new TemplateExtendsTag(
+            name: $tag,
+            type: $type,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/TemplateExtendsTag/TemplateImplementsTag.php b/src/DocBlock/Tag/TemplateExtendsTag/TemplateImplementsTag.php
new file mode 100644
index 0000000..ac41862
--- /dev/null
+++ b/src/DocBlock/Tag/TemplateExtendsTag/TemplateImplementsTag.php
@@ -0,0 +1,12 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\TemplateExtendsTag;
+
+/**
+ * ```
+ * "@implements" <type> [<description>]
+ * ```
+ */
+class TemplateImplementsTag extends TemplateInheritanceTag {}
diff --git a/src/DocBlock/Tag/TemplateExtendsTag/TemplateImplementsTagFactory.php b/src/DocBlock/Tag/TemplateExtendsTag/TemplateImplementsTagFactory.php
new file mode 100644
index 0000000..706fc4e
--- /dev/null
+++ b/src/DocBlock/Tag/TemplateExtendsTag/TemplateImplementsTagFactory.php
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\TemplateExtendsTag;
+
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@implements`" tags.
+ *
+ * See {@see TemplateImplementsTag} for details about this tag.
+ */
+final class TemplateImplementsTagFactory implements TagFactoryInterface
+{
+    private readonly TemplateExtendsTagFactory $factory;
+
+    public function __construct(
+        TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {
+        $this->factory = new TemplateExtendsTagFactory($parser);
+    }
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): TemplateImplementsTag
+    {
+        $result = $this->factory->create($tag, $content, $descriptions);
+
+        return new TemplateImplementsTag(
+            name: $result->name,
+            type: $result->type,
+            description: $result->description,
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/TemplateExtendsTag/TemplateInheritanceTag.php b/src/DocBlock/Tag/TemplateExtendsTag/TemplateInheritanceTag.php
new file mode 100644
index 0000000..3bec217
--- /dev/null
+++ b/src/DocBlock/Tag/TemplateExtendsTag/TemplateInheritanceTag.php
@@ -0,0 +1,23 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\TemplateExtendsTag;
+
+use TypeLang\Parser\Node\Stmt\TypeStatement;
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+use TypeLang\PHPDoc\DocBlock\Tag\TypeProviderInterface;
+
+abstract class TemplateInheritanceTag extends Tag implements TypeProviderInterface
+{
+    /**
+     * @param non-empty-string $name
+     */
+    public function __construct(
+        string $name,
+        public readonly TypeStatement $type,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/TemplateExtendsTag/TemplateUseTag.php b/src/DocBlock/Tag/TemplateExtendsTag/TemplateUseTag.php
new file mode 100644
index 0000000..742f4b5
--- /dev/null
+++ b/src/DocBlock/Tag/TemplateExtendsTag/TemplateUseTag.php
@@ -0,0 +1,12 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\TemplateExtendsTag;
+
+/**
+ * ```
+ * "@use" <type> [<description>]
+ * ```
+ */
+class TemplateUseTag extends TemplateInheritanceTag {}
diff --git a/src/DocBlock/Tag/TemplateExtendsTag/TemplateUseTagFactory.php b/src/DocBlock/Tag/TemplateExtendsTag/TemplateUseTagFactory.php
new file mode 100644
index 0000000..04ce75a
--- /dev/null
+++ b/src/DocBlock/Tag/TemplateExtendsTag/TemplateUseTagFactory.php
@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\TemplateExtendsTag;
+
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@use`" tags.
+ *
+ * See {@see TemplateUseTag} for details about this tag.
+ */
+final class TemplateUseTagFactory implements TagFactoryInterface
+{
+    private readonly TemplateExtendsTagFactory $factory;
+
+    public function __construct(
+        TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {
+        $this->factory = new TemplateExtendsTagFactory($parser);
+    }
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): TemplateUseTag
+    {
+        $result = $this->factory->create($tag, $content, $descriptions);
+
+        return new TemplateUseTag(
+            name: $result->name,
+            type: $result->type,
+            description: $result->description,
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/TemplateTag/TemplateContravariantTag.php b/src/DocBlock/Tag/TemplateTag/TemplateContravariantTag.php
new file mode 100644
index 0000000..424e5ad
--- /dev/null
+++ b/src/DocBlock/Tag/TemplateTag/TemplateContravariantTag.php
@@ -0,0 +1,12 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\TemplateTag;
+
+/**
+ * ```
+ * "@template-contravariant" <name> ['of' <type>] [<description>]
+ * ```
+ */
+final class TemplateContravariantTag extends TemplateTag {}
diff --git a/src/DocBlock/Tag/TemplateTag/TemplateContravariantTagFactory.php b/src/DocBlock/Tag/TemplateTag/TemplateContravariantTagFactory.php
new file mode 100644
index 0000000..188827a
--- /dev/null
+++ b/src/DocBlock/Tag/TemplateTag/TemplateContravariantTagFactory.php
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\TemplateTag;
+
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@template-contravariant`" tags.
+ *
+ * See {@see TemplateContravariantTag} for details about this tag.
+ */
+final class TemplateContravariantTagFactory implements TagFactoryInterface
+{
+    private readonly TemplateTagFactory $factory;
+
+    public function __construct(
+        TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {
+        $this->factory = new TemplateTagFactory($parser);
+    }
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): TemplateContravariantTag
+    {
+        $result = $this->factory->create($tag, $content, $descriptions);
+
+        return new TemplateContravariantTag(
+            name: $result->name,
+            template: $result->template,
+            type: $result->type,
+            description: $result->description,
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/TemplateTag/TemplateCovariantTag.php b/src/DocBlock/Tag/TemplateTag/TemplateCovariantTag.php
new file mode 100644
index 0000000..66e11b1
--- /dev/null
+++ b/src/DocBlock/Tag/TemplateTag/TemplateCovariantTag.php
@@ -0,0 +1,12 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\TemplateTag;
+
+/**
+ * ```
+ * "@template-covariant" <name> ['of' <type>] [<description>]
+ * ```
+ */
+final class TemplateCovariantTag extends TemplateTag {}
diff --git a/src/DocBlock/Tag/TemplateTag/TemplateCovariantTagFactory.php b/src/DocBlock/Tag/TemplateTag/TemplateCovariantTagFactory.php
new file mode 100644
index 0000000..3d258b9
--- /dev/null
+++ b/src/DocBlock/Tag/TemplateTag/TemplateCovariantTagFactory.php
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\TemplateTag;
+
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@template-covariant`" tags.
+ *
+ * See {@see TemplateCovariantTag} for details about this tag.
+ */
+final class TemplateCovariantTagFactory implements TagFactoryInterface
+{
+    private readonly TemplateTagFactory $factory;
+
+    public function __construct(
+        TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {
+        $this->factory = new TemplateTagFactory($parser);
+    }
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): TemplateCovariantTag
+    {
+        $result = $this->factory->create($tag, $content, $descriptions);
+
+        return new TemplateCovariantTag(
+            name: $result->name,
+            template: $result->template,
+            type: $result->type,
+            description: $result->description,
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/TemplateTag/TemplateTag.php b/src/DocBlock/Tag/TemplateTag/TemplateTag.php
new file mode 100644
index 0000000..d8b2532
--- /dev/null
+++ b/src/DocBlock/Tag/TemplateTag/TemplateTag.php
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\TemplateTag;
+
+use TypeLang\Parser\Node\Stmt\TypeStatement;
+use TypeLang\PHPDoc\DocBlock\Tag\OptionalTypeProviderInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+
+/**
+ * ```
+ * "@template" <name> ['of' <type>] [<description>]
+ * ```
+ */
+class TemplateTag extends Tag implements OptionalTypeProviderInterface
+{
+    /**
+     * @param non-empty-string $name
+     * @param non-empty-string $template
+     */
+    public function __construct(
+        string $name,
+        public readonly string $template,
+        public readonly ?TypeStatement $type = null,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/TemplateTag/TemplateTagFactory.php b/src/DocBlock/Tag/TemplateTag/TemplateTagFactory.php
new file mode 100644
index 0000000..ab86fa7
--- /dev/null
+++ b/src/DocBlock/Tag/TemplateTag/TemplateTagFactory.php
@@ -0,0 +1,50 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\TemplateTag;
+
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\IdentifierReader;
+use TypeLang\PHPDoc\Parser\Content\OptionalTypeReader;
+use TypeLang\PHPDoc\Parser\Content\OptionalValueReader;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@template`" tags.
+ *
+ * See {@see TemplateTag} for details about this tag.
+ */
+final class TemplateTagFactory implements TagFactoryInterface
+{
+    public function __construct(
+        private readonly TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {}
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): TemplateTag
+    {
+        $stream = new Stream($tag, $content);
+
+        $template = $stream->apply(new IdentifierReader());
+
+        $type = null;
+
+        $stream->lookahead(function (Stream $stream) use (&$type): bool {
+            if ($stream->apply(new OptionalValueReader('of')) !== null) {
+                $type = $stream->apply(new OptionalTypeReader($this->parser));
+            }
+
+            return $type !== null;
+        });
+
+        return new TemplateTag(
+            name: $tag,
+            template: $template,
+            type: $type,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/ThrowsTag/ThrowsTag.php b/src/DocBlock/Tag/ThrowsTag/ThrowsTag.php
new file mode 100644
index 0000000..62aade3
--- /dev/null
+++ b/src/DocBlock/Tag/ThrowsTag/ThrowsTag.php
@@ -0,0 +1,43 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\ThrowsTag;
+
+use TypeLang\Parser\Node\Stmt\TypeStatement;
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+use TypeLang\PHPDoc\DocBlock\Tag\TypeProviderInterface;
+
+/**
+ * The "`@throws`" tag MAY be used to indicate that structural elements throw a
+ * specific type of error.
+ *
+ * The type provided with this tag MUST represent an object that implements the
+ * {@see \Throwable} interface, such as an {@see \Error}, {@see \Exception} or
+ * any subclass thereof.
+ *
+ * This tag is used to present in your documentation which error COULD occur and
+ * under which circumstances. It is RECOMMENDED to provide a description that
+ * describes the reason an exception is thrown.
+ *
+ * It is also RECOMMENDED that this tag occurs for every occurrence of an
+ * exception, even if it has the same type. By documenting every occurrence a
+ * detailed view is created and the consumer knows for which errors to check.
+ *
+ * ```
+ * "@throws" [<type>] [<description>]
+ * ```
+ */
+class ThrowsTag extends Tag implements TypeProviderInterface
+{
+    /**
+     * @param non-empty-string $name
+     */
+    public function __construct(
+        string $name,
+        public readonly TypeStatement $type,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/ThrowsTag/ThrowsTagFactory.php b/src/DocBlock/Tag/ThrowsTag/ThrowsTagFactory.php
new file mode 100644
index 0000000..7ce625c
--- /dev/null
+++ b/src/DocBlock/Tag/ThrowsTag/ThrowsTagFactory.php
@@ -0,0 +1,35 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\ThrowsTag;
+
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Content\TypeReader;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@throws`" tags.
+ *
+ * See {@see ThrowsTag} for details about this tag.
+ */
+final class ThrowsTagFactory implements TagFactoryInterface
+{
+    public function __construct(
+        private readonly TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {}
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): ThrowsTag
+    {
+        $stream = new Stream($tag, $content);
+
+        return new ThrowsTag(
+            name: $tag,
+            type: $stream->apply(new TypeReader($this->parser)),
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/TypeProviderInterface.php b/src/DocBlock/Tag/TypeProviderInterface.php
new file mode 100644
index 0000000..73340d9
--- /dev/null
+++ b/src/DocBlock/Tag/TypeProviderInterface.php
@@ -0,0 +1,18 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag;
+
+use TypeLang\Parser\Node\Stmt\TypeStatement;
+
+/**
+ * Representation of any entry that contain type definition.
+ */
+interface TypeProviderInterface extends OptionalTypeProviderInterface
+{
+    /**
+     * Gets an AST object of the {@see TypeStatement} type.
+     */
+    public TypeStatement $type { get; }
+}
diff --git a/src/DocBlock/Tag/UnknownTag.php b/src/DocBlock/Tag/UnknownTag.php
new file mode 100644
index 0000000..6283b26
--- /dev/null
+++ b/src/DocBlock/Tag/UnknownTag.php
@@ -0,0 +1,25 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag;
+
+class UnknownTag extends Tag implements InvalidTagInterface
+{
+    /**
+     * @var non-empty-string
+     */
+    public const DEFAULT_UNKNOWN_TAG_NAME = 'unknown';
+
+    public function __construct(
+        public readonly \Throwable $reason,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct(self::DEFAULT_UNKNOWN_TAG_NAME, $description);
+    }
+
+    public function __toString(): string
+    {
+        return \sprintf('@%s', $this->description);
+    }
+}
diff --git a/src/DocBlock/Tag/VarTag/VarTag.php b/src/DocBlock/Tag/VarTag/VarTag.php
new file mode 100644
index 0000000..d35a1c9
--- /dev/null
+++ b/src/DocBlock/Tag/VarTag/VarTag.php
@@ -0,0 +1,52 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\VarTag;
+
+use TypeLang\Parser\Node\Stmt\TypeStatement;
+use TypeLang\PHPDoc\DocBlock\Tag\OptionalVariableProviderInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+use TypeLang\PHPDoc\DocBlock\Tag\TypeProviderInterface;
+
+/**
+ * The "`@var`" tag defines which type of data is represented by the value of a
+ * constant, property or variable.
+ *
+ * Each constant or property definition or variable where the type is ambiguous
+ * or unknown SHOULD be preceded by a DocBlock containing the "`@var`" tag. Any
+ * other variable MAY be preceded with a DocBlock containing the "`@var`" tag.
+ *
+ * The "`@var`" tag MUST contain the name of the element it documents. An
+ * exception to this is when a declaration only refers to a single property or
+ * constant. In that case, the name of the property or constant MAY be omitted.
+ *
+ * The name is used when compound statements are used to define a series of
+ * constants or properties. Such a compound statement can only have one DocBlock
+ * while several items are represented.
+ *
+ * ```
+ * "@var" [<type>] $<variable>      [<description>]
+ * "@var" [<type>] ...$<variable>   [<description>]
+ * "@var" [<type>] &$<variable>     [<description>]
+ * "@var" [<type>] ...&$<variable>  [<description>]
+ * "@var" [<type>] &...$<variable>  [<description>]
+ * ```
+ */
+class VarTag extends Tag implements
+    TypeProviderInterface,
+    OptionalVariableProviderInterface
+{
+    /**
+     * @param non-empty-string $name
+     * @param non-empty-string|null $variable
+     */
+    public function __construct(
+        string $name,
+        public readonly TypeStatement $type,
+        public readonly ?string $variable = null,
+        \Stringable|string|null $description = null,
+    ) {
+        parent::__construct($name, $description);
+    }
+}
diff --git a/src/DocBlock/Tag/VarTag/VarTagFactory.php b/src/DocBlock/Tag/VarTag/VarTagFactory.php
new file mode 100644
index 0000000..a684238
--- /dev/null
+++ b/src/DocBlock/Tag/VarTag/VarTagFactory.php
@@ -0,0 +1,40 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag\VarTag;
+
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\Parser\Content\OptionalVariableNameReader;
+use TypeLang\PHPDoc\Parser\Content\Stream;
+use TypeLang\PHPDoc\Parser\Content\TypeReader;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+/**
+ * This class is responsible for creating "`@var`" tags.
+ *
+ * See {@see VarTag} for details about this tag.
+ */
+final class VarTagFactory implements TagFactoryInterface
+{
+    public function __construct(
+        private readonly TypesParserInterface $parser = new TypesParser(tolerant: true),
+    ) {}
+
+    public function create(string $tag, string $content, DescriptionParserInterface $descriptions): VarTag
+    {
+        $stream = new Stream($tag, $content);
+
+        $type = $stream->apply(new TypeReader($this->parser));
+        $variable = $stream->apply(new OptionalVariableNameReader());
+
+        return new VarTag(
+            name: $tag,
+            type: $type,
+            variable: $variable,
+            description: $stream->toOptionalDescription($descriptions),
+        );
+    }
+}
diff --git a/src/DocBlock/Tag/VariableProviderInterface.php b/src/DocBlock/Tag/VariableProviderInterface.php
new file mode 100644
index 0000000..736823f
--- /dev/null
+++ b/src/DocBlock/Tag/VariableProviderInterface.php
@@ -0,0 +1,21 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock\Tag;
+
+/**
+ * Representation of any entry that contain variable name.
+ */
+interface VariableProviderInterface extends OptionalVariableProviderInterface
+{
+    /**
+     * The name of the variable (parameter, field, etc.) to which
+     * this interface is attached.
+     *
+     * @var non-empty-string
+     *
+     * @readonly
+     */
+    public string $variable { get; }
+}
diff --git a/src/Parser.php b/src/Parser.php
index 74ed185..7937895 100644
--- a/src/Parser.php
+++ b/src/Parser.php
@@ -4,7 +4,10 @@
 
 namespace TypeLang\PHPDoc;
 
-use JetBrains\PhpStorm\Language;
+use TypeLang\PHPDoc\DocBlock\DocBlock;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\MutableTagFactoryInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
 use TypeLang\PHPDoc\Exception\ParsingException;
 use TypeLang\PHPDoc\Exception\RuntimeExceptionInterface;
 use TypeLang\PHPDoc\Parser\Comment\CommentParserInterface;
@@ -15,8 +18,12 @@
 use TypeLang\PHPDoc\Parser\SourceMap;
 use TypeLang\PHPDoc\Parser\Tag\RegexTagParser;
 use TypeLang\PHPDoc\Parser\Tag\TagParserInterface;
-use TypeLang\PHPDoc\Tag\Factory\FactoryInterface;
-use TypeLang\PHPDoc\Tag\Factory\TagFactory;
+use TypeLang\PHPDoc\Platform\CompoundPlatform;
+use TypeLang\PHPDoc\Platform\PhanPlatform;
+use TypeLang\PHPDoc\Platform\PHPStanPlatform;
+use TypeLang\PHPDoc\Platform\PlatformInterface;
+use TypeLang\PHPDoc\Platform\PsalmPlatform;
+use TypeLang\PHPDoc\Platform\StandardPlatform;
 
 class Parser implements ParserInterface
 {
@@ -26,18 +33,51 @@ class Parser implements ParserInterface
 
     private readonly TagParserInterface $tags;
 
+    private readonly MutableTagFactoryInterface $factories;
+
     public function __construct(
-        FactoryInterface $tags = new TagFactory(),
+        public readonly PlatformInterface $platform = new CompoundPlatform([
+            new StandardPlatform(),
+            new PsalmPlatform(),
+            new PHPStanPlatform(),
+            new PhanPlatform(),
+        ]),
     ) {
-        $this->tags = new RegexTagParser($tags);
-        $this->descriptions = new RegexDescriptionParser($this->tags);
-        $this->comments = new RegexCommentParser();
+        $this->factories = new TagFactory($platform->getTags());
+        $this->tags = $this->createTagParser($this->factories);
+        $this->descriptions = $this->createDescriptionParser($this->tags);
+        $this->comments = $this->createCommentParser();
+    }
+
+    protected function createTagParser(TagFactoryInterface $factories): TagParserInterface
+    {
+        return new RegexTagParser($factories);
+    }
+
+    protected function createDescriptionParser(TagParserInterface $tags): DescriptionParserInterface
+    {
+        return new RegexDescriptionParser($tags);
+    }
+
+    protected function createCommentParser(): CommentParserInterface
+    {
+        return new RegexCommentParser();
+    }
+
+    /**
+     * Facade method of {@see MutableTagFactoryInterface::register()}
+     *
+     * @param non-empty-lowercase-string|list<non-empty-lowercase-string> $tags
+     */
+    public function register(string|array $tags, TagFactoryInterface $delegate): void
+    {
+        $this->factories->register($tags, $delegate);
     }
 
     /**
      * @throws RuntimeExceptionInterface
      */
-    public function parse(#[Language('PHP')] string $docblock): DocBlock
+    public function parse(string $docblock): DocBlock
     {
         $mapper = new SourceMap();
 
diff --git a/src/Parser/Content/ElementReferenceReader.php b/src/Parser/Content/ElementReferenceReader.php
new file mode 100644
index 0000000..3e836b1
--- /dev/null
+++ b/src/Parser/Content/ElementReferenceReader.php
@@ -0,0 +1,107 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Parser\Content;
+
+use TypeLang\Parser\Node\FullQualifiedName;
+use TypeLang\Parser\Node\Literal\VariableLiteralNode;
+use TypeLang\Parser\Node\Name;
+use TypeLang\Parser\Node\Stmt\NamedTypeNode;
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\ClassConstantElementReference;
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\ClassMethodElementReference;
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\ClassPropertyElementReference;
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\ElementReference;
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\FunctionElementReference;
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\TypeElementReference;
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\VariableReference;
+
+/**
+ * @template-implements ReaderInterface<ElementReference>
+ */
+final class ElementReferenceReader implements ReaderInterface
+{
+    private const T_FQN = '(?:[\\\\]?+[a-zA-Z\x80-\xFF_][0-9a-zA-Z\x80-\xFF_-]*+)++';
+    private const T_IDENTIFIER = '[a-zA-Z_\\x80-\\xff][a-zA-Z0-9\\-_\\x80-\\xff]*+';
+
+    private const SIMPLE_TOKENIZER_PCRE = '/^(?'
+        . '|(?:(?P<T_CLASS>' . self::T_FQN . ')::(?:'
+        . '(?:\\$[a-zA-Z_\\x80-\\xff][a-zA-Z0-9_\\x80-\\xff]*+)(*MARK:T_CLASS_PROPERTY)'
+        . '|(?:[a-zA-Z_\\x80-\\xff][a-zA-Z0-9_\\x80-\\xff]*+\(\))(*MARK:T_CLASS_METHOD)'
+        . '|(?:[a-zA-Z_\\x80-\\xff][a-zA-Z0-9_\\x80-\\xff]*+)(*MARK:T_CLASS_CONSTANT)'
+        . '))'
+        . '|(?:(?:\\$' . self::T_IDENTIFIER . ')(*MARK:T_VARIABLE))'
+        . '|(?:(?:' . self::T_FQN . '\(\))(*MARK:T_FUNCTION))'
+        . '|(?:(?:' . self::T_FQN . ')(*MARK:T_IDENTIFIER))'
+        . ')(?:\s|$)/Ssum';
+
+    public function __invoke(Stream $stream): ElementReference
+    {
+        \preg_match(self::SIMPLE_TOKENIZER_PCRE, $stream->value, $matches);
+
+        if ($matches !== []) {
+            /** @var non-empty-string $body */
+            $body = \rtrim($matches[0]);
+            $isFullyQualified = $body[0] === '\\';
+
+            // @phpstan-ignore match.unhandled
+            $result = match ($matches['MARK']) {
+                // @phpstan-ignore-next-line : All ok
+                'T_FUNCTION' => new FunctionElementReference(
+                    function: $isFullyQualified
+                        // @phpstan-ignore-next-line : All ok
+                        ? new FullQualifiedName(\substr($body, 0, -2))
+                        // @phpstan-ignore-next-line : All ok
+                        : new Name(\substr($body, 0, -2)),
+                ),
+                // @phpstan-ignore-next-line : All ok
+                'T_IDENTIFIER' => new TypeElementReference(
+                    type: new NamedTypeNode(
+                        name: $isFullyQualified
+                            ? new FullQualifiedName($body)
+                            : new Name($body)
+                    ),
+                ),
+                'T_VARIABLE' => new VariableReference(
+                    variable: new VariableLiteralNode($body),
+                ),
+                'T_CLASS_CONSTANT' => new ClassConstantElementReference(
+                    class: $isFullyQualified
+                        // @phpstan-ignore-next-line : All ok
+                        ? new FullQualifiedName($matches['T_CLASS'])
+                        // @phpstan-ignore-next-line : All ok
+                        : new Name($matches['T_CLASS']),
+                    // @phpstan-ignore-next-line : All ok
+                    constant: \substr($body, \strlen($matches['T_CLASS']) + 2),
+                ),
+                'T_CLASS_METHOD' => new ClassMethodElementReference(
+                    class: $isFullyQualified
+                        // @phpstan-ignore-next-line : All ok
+                        ? new FullQualifiedName($matches['T_CLASS'])
+                        // @phpstan-ignore-next-line : All ok
+                        : new Name($matches['T_CLASS']),
+                    // @phpstan-ignore-next-line : All ok
+                    method: \substr($body, \strlen($matches['T_CLASS']) + 2, -2),
+                ),
+                'T_CLASS_PROPERTY' => new ClassPropertyElementReference(
+                    class: $isFullyQualified
+                        // @phpstan-ignore-next-line : All ok
+                        ? new FullQualifiedName($matches['T_CLASS'])
+                        // @phpstan-ignore-next-line : All ok
+                        : new Name($matches['T_CLASS']),
+                    // @phpstan-ignore-next-line : All ok
+                    property: \substr($body, \strlen($matches['T_CLASS']) + 3),
+                ),
+            };
+
+            $stream->shift(\strlen($matches[0]));
+
+            return $result;
+        }
+
+        throw $stream->toException(\sprintf(
+            'Tag @%s expects the FQN reference to be defined',
+            $stream->tag,
+        ));
+    }
+}
diff --git a/src/Parser/Content/IdentifierReader.php b/src/Parser/Content/IdentifierReader.php
new file mode 100644
index 0000000..8c69960
--- /dev/null
+++ b/src/Parser/Content/IdentifierReader.php
@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Parser\Content;
+
+use TypeLang\PHPDoc\Exception\InvalidTagException;
+
+/**
+ * @template-implements ReaderInterface<non-empty-string>
+ */
+final class IdentifierReader implements ReaderInterface
+{
+    private readonly OptionalIdentifierReader $id;
+
+    public function __construct()
+    {
+        $this->id = new OptionalIdentifierReader();
+    }
+
+    /**
+     * @return non-empty-string
+     * @throws InvalidTagException
+     */
+    public function __invoke(Stream $stream): string
+    {
+        return ($this->id)($stream)
+            ?? throw $stream->toException(\sprintf(
+                'Tag @%s contains an incorrect identifier value',
+                $stream->tag,
+            ));
+    }
+}
diff --git a/src/Parser/Content/OptionalIdentifierReader.php b/src/Parser/Content/OptionalIdentifierReader.php
new file mode 100644
index 0000000..5421728
--- /dev/null
+++ b/src/Parser/Content/OptionalIdentifierReader.php
@@ -0,0 +1,29 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Parser\Content;
+
+/**
+ * @template-implements OptionalReaderInterface<non-empty-string>
+ */
+final class OptionalIdentifierReader implements OptionalReaderInterface
+{
+    public function __invoke(Stream $stream): ?string
+    {
+        // @phpstan-ignore-next-line : PHPStan false positive
+        if ($stream->value === '') {
+            return null;
+        }
+
+        \preg_match('/([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)\b/u', $stream->value, $matches);
+
+        if (\count($matches) !== 2) {
+            return null;
+        }
+
+        $stream->shift(\strlen($matches[0]));
+
+        return $matches[1];
+    }
+}
diff --git a/src/Parser/Content/OptionalReaderInterface.php b/src/Parser/Content/OptionalReaderInterface.php
new file mode 100644
index 0000000..5a8b067
--- /dev/null
+++ b/src/Parser/Content/OptionalReaderInterface.php
@@ -0,0 +1,16 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Parser\Content;
+
+/**
+ * @template-covariant T of mixed
+ */
+interface OptionalReaderInterface
+{
+    /**
+     * @return T|null
+     */
+    public function __invoke(Stream $stream): mixed;
+}
diff --git a/src/Tag/Content/OptionalTypeParserApplicator.php b/src/Parser/Content/OptionalTypeReader.php
similarity index 56%
rename from src/Tag/Content/OptionalTypeParserApplicator.php
rename to src/Parser/Content/OptionalTypeReader.php
index b0da327..46366e9 100644
--- a/src/Tag/Content/OptionalTypeParserApplicator.php
+++ b/src/Parser/Content/OptionalTypeReader.php
@@ -2,18 +2,20 @@
 
 declare(strict_types=1);
 
-namespace TypeLang\PHPDoc\Tag\Content;
+namespace TypeLang\PHPDoc\Parser\Content;
 
 use TypeLang\Parser\Exception\ParserExceptionInterface;
+use TypeLang\Parser\Node\FullQualifiedName;
+use TypeLang\Parser\Node\Name;
+use TypeLang\Parser\Node\Stmt\NamedTypeNode;
 use TypeLang\Parser\Node\Stmt\TypeStatement;
 use TypeLang\Parser\ParserInterface as TypesParserInterface;
 use TypeLang\PHPDoc\Exception\InvalidTagException;
-use TypeLang\PHPDoc\Tag\Content;
 
 /**
- * @template-extends Applicator<TypeStatement|null>
+ * @template-implements OptionalReaderInterface<TypeStatement>
  */
-final class OptionalTypeParserApplicator extends Applicator
+final class OptionalTypeReader implements OptionalReaderInterface
 {
     public function __construct(
         private readonly TypesParserInterface $parser,
@@ -23,16 +25,16 @@ public function __construct(
      * @throws \Throwable
      * @throws InvalidTagException
      */
-    public function __invoke(Content $lexer): ?TypeStatement
+    public function __invoke(Stream $stream): ?TypeStatement
     {
         try {
-            $type = $this->parser->parse($lexer->value);
+            $type = $this->parser->parse($stream->value);
         } catch (ParserExceptionInterface) {
             return null;
         }
 
         // @phpstan-ignore-next-line : Property is defined
-        $lexer->shift($this->parser->lastProcessedTokenOffset);
+        $stream->shift($this->parser->lastProcessedTokenOffset);
 
         return $type;
     }
diff --git a/src/Parser/Content/OptionalValueReader.php b/src/Parser/Content/OptionalValueReader.php
new file mode 100644
index 0000000..1f0a9c8
--- /dev/null
+++ b/src/Parser/Content/OptionalValueReader.php
@@ -0,0 +1,50 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Parser\Content;
+
+/**
+ * @template T of non-empty-string
+ * @template-implements OptionalReaderInterface<T|null>
+ */
+final class OptionalValueReader implements OptionalReaderInterface
+{
+    public function __construct(
+        /**
+         * @var T
+         */
+        private readonly string $value,
+    ) {}
+
+    public function __invoke(Stream $stream): ?string
+    {
+        if (!\str_starts_with($stream->value, $this->value)) {
+            return null;
+        }
+
+        $expectedLength = \strlen($this->value);
+
+        // In case of end of string
+        if ($expectedLength === \strlen(\rtrim($stream->value))) {
+            return $this->apply($stream);
+        }
+
+        // In case of separated by whitespace
+        if (\ctype_space($stream->value[$expectedLength])) {
+            return $this->apply($stream);
+        }
+
+        return null;
+    }
+
+    /**
+     * @return T
+     */
+    private function apply(Stream $lexer): string
+    {
+        $lexer->shift(\strlen($this->value));
+
+        return $this->value;
+    }
+}
diff --git a/src/Parser/Content/OptionalVariableNameReader.php b/src/Parser/Content/OptionalVariableNameReader.php
new file mode 100644
index 0000000..c973d65
--- /dev/null
+++ b/src/Parser/Content/OptionalVariableNameReader.php
@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Parser\Content;
+
+/**
+ * @template-implements OptionalReaderInterface<non-empty-string>
+ */
+final class OptionalVariableNameReader implements OptionalReaderInterface
+{
+    public function __invoke(Stream $stream): ?string
+    {
+        if (!\str_starts_with($stream->value, '$')) {
+            return null;
+        }
+
+        \preg_match('/\$([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)\b/u', $stream->value, $matches);
+
+        if (\count($matches) !== 2) {
+            return null;
+        }
+
+        $stream->shift(\strlen($matches[0]));
+
+        return $matches[1];
+    }
+}
diff --git a/src/Parser/Content/ReaderInterface.php b/src/Parser/Content/ReaderInterface.php
new file mode 100644
index 0000000..60276c4
--- /dev/null
+++ b/src/Parser/Content/ReaderInterface.php
@@ -0,0 +1,18 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Parser\Content;
+
+/**
+ * @template-covariant T of mixed
+ *
+ * @template-extends OptionalReaderInterface<T>
+ */
+interface ReaderInterface extends OptionalReaderInterface
+{
+    /**
+     * @return T
+     */
+    public function __invoke(Stream $stream): mixed;
+}
diff --git a/src/Parser/Content/Stream.php b/src/Parser/Content/Stream.php
new file mode 100644
index 0000000..888ed84
--- /dev/null
+++ b/src/Parser/Content/Stream.php
@@ -0,0 +1,116 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Parser\Content;
+
+use TypeLang\PHPDoc\DocBlock\Description\DescriptionInterface;
+use TypeLang\PHPDoc\Exception\InvalidTagException;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+
+final class Stream implements \Stringable
+{
+    public readonly string $source;
+
+    /**
+     * @var int<0, max>
+     */
+    public int $offset = 0;
+
+    public function __construct(
+        /**
+         * @var non-empty-string
+         */
+        public readonly string $tag,
+        public string $value,
+    ) {
+        $this->source = $this->value;
+    }
+
+    /**
+     * @param int<0, max> $offset
+     */
+    public function shift(int $offset, bool $ltrim = true): void
+    {
+        $size = \strlen($this->value);
+        $this->value = \substr($this->value, $offset);
+
+        if ($ltrim) {
+            $this->value = \ltrim($this->value);
+        }
+
+        // @phpstan-ignore-next-line : Offset already greater than 0
+        $this->offset += $size - \strlen($this->value);
+    }
+
+    /**
+     * @api
+     * @template TArgResult of mixed
+     * @param callable(self):TArgResult $context
+     * @return TArgResult
+     */
+    public function lookahead(callable $context): mixed
+    {
+        $offset = $this->offset;
+        $value = $this->value;
+
+        $result = $context($this);
+
+        if ($result === null) {
+            $this->offset = $offset;
+            $this->value = $value;
+        }
+
+        return $result;
+    }
+
+    /**
+     * @template T of mixed
+     *
+     * @param callable(Stream):T $applicator
+     *
+     * @return T
+     */
+    public function apply(callable $applicator): mixed
+    {
+        return $applicator($this);
+    }
+
+    /**
+     * @api
+     */
+    public function toException(string $message, ?\Throwable $previous = null): InvalidTagException
+    {
+        return new InvalidTagException(
+            source: $this->source,
+            offset: $this->offset,
+            message: $message,
+            previous: $previous,
+        );
+    }
+
+    /**
+     * @api
+     */
+    public function toDescription(DescriptionParserInterface $descriptions): DescriptionInterface
+    {
+        return $descriptions->parse($this->value);
+    }
+
+    /**
+     * @api
+     */
+    public function toOptionalDescription(DescriptionParserInterface $descriptions): ?DescriptionInterface
+    {
+        if (\trim($this->value) === '') {
+            return null;
+        }
+
+        return $descriptions->parse(\rtrim($this->value));
+    }
+
+    public function __toString(): string
+    {
+        return $this->value;
+    }
+}
diff --git a/src/Parser/Content/TypeReader.php b/src/Parser/Content/TypeReader.php
new file mode 100644
index 0000000..c25a330
--- /dev/null
+++ b/src/Parser/Content/TypeReader.php
@@ -0,0 +1,53 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Parser\Content;
+
+use TypeLang\Parser\Exception\ParserExceptionInterface;
+use TypeLang\Parser\Node\FullQualifiedName;
+use TypeLang\Parser\Node\Name;
+use TypeLang\Parser\Node\Stmt\NamedTypeNode;
+use TypeLang\Parser\Node\Stmt\TypeStatement;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\Exception\InvalidTagException;
+
+/**
+ * @template-implements ReaderInterface<TypeStatement>
+ */
+final class TypeReader implements ReaderInterface
+{
+    public function __construct(
+        private readonly TypesParserInterface $parser,
+    ) {}
+
+    /**
+     * @throws \Throwable
+     * @throws InvalidTagException
+     */
+    public function __invoke(Stream $stream): TypeStatement
+    {
+        try {
+            $type = $this->parser->parse($stream->value);
+        } catch (ParserExceptionInterface $e) {
+            // @phpstan-ignore-next-line : Property is defined
+            if (\trim($stream->value) === '') {
+                throw $stream->toException(\sprintf(
+                    'Tag @%s expects the type to be defined',
+                    $stream->tag,
+                ), $e);
+            }
+
+            throw $stream->toException(\sprintf(
+                'Tag @%s contains an incorrect type "%s"',
+                $stream->tag,
+                \trim($stream->value),
+            ), $e);
+        }
+
+        // @phpstan-ignore-next-line : Property is defined
+        $stream->shift($this->parser->lastProcessedTokenOffset);
+
+        return $type;
+    }
+}
diff --git a/src/Parser/Content/UriReferenceReader.php b/src/Parser/Content/UriReferenceReader.php
new file mode 100644
index 0000000..49249ae
--- /dev/null
+++ b/src/Parser/Content/UriReferenceReader.php
@@ -0,0 +1,65 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Parser\Content;
+
+use League\Uri\Uri;
+use TypeLang\PHPDoc\DocBlock\Tag\Shared\Reference\UriReference;
+
+/**
+ * A strict URI parser that requires an "scheme://" or "//" prefix for a
+ * string to be recognized as a valid Uri.
+ *
+ * This analysis can be used as part of internal and external link recognition.
+ *
+ * @template-implements ReaderInterface<UriReference>
+ */
+final class UriReferenceReader implements ReaderInterface
+{
+    /**
+     * Scheme (e)BNF defined in RFC 2396
+     *
+     * ```
+     * alpha    = lowalpha | upalpha
+     *
+     * lowalpha = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" |
+     *            "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" |
+     *            "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"
+     *
+     * upalpha  = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" |
+     *            "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" |
+     *            "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"
+     *
+     * scheme   = alpha *( alpha | digit | '+' | '-' | '.' )
+     * ```
+     */
+    private const OPTIONAL_SCHEME_STARTED_PCRE = '/^([a-z][a-z0-9+\-.]*:)?\/\/\S+/ui';
+
+    public function __invoke(Stream $stream): UriReference
+    {
+        \preg_match(self::OPTIONAL_SCHEME_STARTED_PCRE, $stream->value, $matches);
+
+        if ($matches === []) {
+            throw $stream->toException(\sprintf(
+                'Tag @%s contains an incorrect URI "%s"',
+                $stream->tag,
+                $stream->value,
+            ));
+        }
+
+        try {
+            $uri = Uri::new($matches[0] ?? '');
+        } catch (\Throwable $e) {
+            throw $stream->toException(\sprintf(
+                'Tag @%s contains an incorrect URI "%s"',
+                $stream->tag,
+                $matches[0] ?? '',
+            ), $e);
+        }
+
+        $stream->shift(\strlen($matches[0]));
+
+        return new UriReference($uri);
+    }
+}
diff --git a/src/Parser/Content/ValueReader.php b/src/Parser/Content/ValueReader.php
new file mode 100644
index 0000000..6e93af6
--- /dev/null
+++ b/src/Parser/Content/ValueReader.php
@@ -0,0 +1,42 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Parser\Content;
+
+use TypeLang\PHPDoc\Exception\InvalidTagException;
+
+/**
+ * @template T of non-empty-string
+ * @template-implements ReaderInterface<T>
+ */
+final class ValueReader implements ReaderInterface
+{
+    /**
+     * @var OptionalValueReader<T>
+     */
+    private readonly OptionalValueReader $identifier;
+
+    public function __construct(
+        /**
+         * @var T
+         */
+        private readonly string $value,
+    ) {
+        $this->identifier = new OptionalValueReader($value);
+    }
+
+    /**
+     * @throws InvalidTagException
+     */
+    public function __invoke(Stream $stream): string
+    {
+        /** @var T */
+        return ($this->identifier)($stream)
+            ?? throw $stream->toException(\sprintf(
+                'Tag @%s contains an incorrect identifier value "%s"',
+                $stream->tag,
+                $this->value,
+            ));
+    }
+}
diff --git a/src/Parser/Content/VariableNameReader.php b/src/Parser/Content/VariableNameReader.php
new file mode 100644
index 0000000..133b24d
--- /dev/null
+++ b/src/Parser/Content/VariableNameReader.php
@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Parser\Content;
+
+use TypeLang\PHPDoc\Exception\InvalidTagException;
+
+/**
+ * @template-implements ReaderInterface<non-empty-string>
+ */
+final class VariableNameReader implements ReaderInterface
+{
+    private readonly OptionalVariableNameReader $var;
+
+    public function __construct()
+    {
+        $this->var = new OptionalVariableNameReader();
+    }
+
+    /**
+     * @return non-empty-string
+     * @throws InvalidTagException
+     */
+    public function __invoke(Stream $stream): string
+    {
+        return ($this->var)($stream)
+            ?? throw $stream->toException(\sprintf(
+                'Tag @%s contains an incorrect variable name',
+                $stream->tag,
+            ));
+    }
+}
diff --git a/src/Parser/Description/DescriptionParserInterface.php b/src/Parser/Description/DescriptionParserInterface.php
index e448af5..d653921 100644
--- a/src/Parser/Description/DescriptionParserInterface.php
+++ b/src/Parser/Description/DescriptionParserInterface.php
@@ -4,7 +4,7 @@
 
 namespace TypeLang\PHPDoc\Parser\Description;
 
-use TypeLang\PHPDoc\Tag\Description\DescriptionInterface;
+use TypeLang\PHPDoc\DocBlock\Description\DescriptionInterface;
 
 interface DescriptionParserInterface
 {
diff --git a/src/Parser/Description/RegexDescriptionParser.php b/src/Parser/Description/RegexDescriptionParser.php
index a3f3604..fcce270 100644
--- a/src/Parser/Description/RegexDescriptionParser.php
+++ b/src/Parser/Description/RegexDescriptionParser.php
@@ -4,12 +4,12 @@
 
 namespace TypeLang\PHPDoc\Parser\Description;
 
+use TypeLang\PHPDoc\DocBlock\Description\Description;
+use TypeLang\PHPDoc\DocBlock\Description\DescriptionInterface;
+use TypeLang\PHPDoc\DocBlock\Description\TaggedDescription;
+use TypeLang\PHPDoc\DocBlock\Tag\TagInterface;
 use TypeLang\PHPDoc\Parser\Tag\RegexTagParser;
 use TypeLang\PHPDoc\Parser\Tag\TagParserInterface;
-use TypeLang\PHPDoc\Tag\Description\Description;
-use TypeLang\PHPDoc\Tag\Description\DescriptionInterface;
-use TypeLang\PHPDoc\Tag\Description\TaggedDescription;
-use TypeLang\PHPDoc\Tag\TagInterface;
 
 class RegexDescriptionParser implements DescriptionParserInterface
 {
@@ -54,7 +54,7 @@ public function parse(string $description): DescriptionInterface
     private function createFromChunk(string $chunk): DescriptionInterface|TagInterface
     {
         if ($chunk === '@') {
-            return new Description('{' . $chunk . '}');
+            return new Description('{@}');
         }
 
         if (\str_starts_with($chunk, '@')) {
diff --git a/src/Parser/Tag/RegexTagParser.php b/src/Parser/Tag/RegexTagParser.php
index d8001fe..b83209c 100644
--- a/src/Parser/Tag/RegexTagParser.php
+++ b/src/Parser/Tag/RegexTagParser.php
@@ -4,14 +4,13 @@
 
 namespace TypeLang\PHPDoc\Parser\Tag;
 
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\TagInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\UnknownTag;
 use TypeLang\PHPDoc\Exception\InvalidTagNameException;
 use TypeLang\PHPDoc\Exception\RuntimeExceptionInterface;
 use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
-use TypeLang\PHPDoc\Tag\Content;
-use TypeLang\PHPDoc\Tag\Factory\FactoryInterface;
-use TypeLang\PHPDoc\Tag\Factory\TagFactory;
-use TypeLang\PHPDoc\Tag\InvalidTag;
-use TypeLang\PHPDoc\Tag\TagInterface;
 
 final class RegexTagParser implements TagParserInterface
 {
@@ -21,7 +20,7 @@ final class RegexTagParser implements TagParserInterface
     private const PATTERN_TAG = '\G@[a-zA-Z_\x80-\xff\\\][\w\x80-\xff\-:\\\]*';
 
     public function __construct(
-        private readonly FactoryInterface $tags = new TagFactory(),
+        private readonly TagFactoryInterface $tags = new TagFactory(),
     ) {}
 
     /**
@@ -68,9 +67,7 @@ public function parse(string $tag, DescriptionParserInterface $parser): TagInter
         try {
             $name = $this->getTagName($tag);
         } catch (InvalidTagNameException $e) {
-            return new InvalidTag($e, $parser->parse(
-                description: \substr($tag, 1),
-            ));
+            return new UnknownTag($e, description: $tag);
         }
 
         /** @var non-empty-string $name */
@@ -80,7 +77,7 @@ public function parse(string $tag, DescriptionParserInterface $parser): TagInter
         $trimmed = \ltrim($content);
 
         try {
-            return $this->tags->create($name, new Content($trimmed), $parser);
+            return $this->tags->create($name, $trimmed, $parser);
         } catch (RuntimeExceptionInterface $e) {
             $offset += \strlen($content) - \strlen($trimmed);
 
diff --git a/src/Parser/Tag/TagParserInterface.php b/src/Parser/Tag/TagParserInterface.php
index 9942973..618b081 100644
--- a/src/Parser/Tag/TagParserInterface.php
+++ b/src/Parser/Tag/TagParserInterface.php
@@ -4,8 +4,8 @@
 
 namespace TypeLang\PHPDoc\Parser\Tag;
 
+use TypeLang\PHPDoc\DocBlock\Tag\TagInterface;
 use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
-use TypeLang\PHPDoc\Tag\TagInterface;
 
 interface TagParserInterface
 {
diff --git a/src/ParserInterface.php b/src/ParserInterface.php
index f21e65c..f329c1f 100644
--- a/src/ParserInterface.php
+++ b/src/ParserInterface.php
@@ -5,11 +5,12 @@
 namespace TypeLang\PHPDoc;
 
 use JetBrains\PhpStorm\Language;
+use TypeLang\PHPDoc\DocBlock\DocBlock;
 
 interface ParserInterface
 {
     /**
      * @param string $docblock a string containing the DocBlock to parse
      */
-    public function parse(#[Language('PHP')] string $docblock): DocBlock;
+    public function parse(#[Language('InjectablePHP')] string $docblock): DocBlock;
 }
diff --git a/src/Platform/CompoundPlatform.php b/src/Platform/CompoundPlatform.php
new file mode 100644
index 0000000..c82ce5a
--- /dev/null
+++ b/src/Platform/CompoundPlatform.php
@@ -0,0 +1,47 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Platform;
+
+final class CompoundPlatform implements PlatformInterface
+{
+    /**
+     * @var list<PlatformInterface>
+     */
+    public readonly array $platforms;
+
+    /**
+     * @param iterable<array-key, PlatformInterface> $platforms
+     */
+    public function __construct(iterable $platforms = [])
+    {
+        $this->platforms = match (true) {
+            $platforms instanceof \Traversable => \iterator_to_array($platforms, false),
+            \array_is_list($platforms) => $platforms,
+            default => \array_values($platforms),
+        };
+    }
+
+    public function getName(): string
+    {
+        if ($this->platforms === []) {
+            return 'empty';
+        }
+
+        $names = [];
+
+        foreach ($this->platforms as $platform) {
+            $names[] = $platform->getName();
+        }
+
+        return \implode(' & ', $names);
+    }
+
+    public function getTags(): iterable
+    {
+        foreach ($this->platforms as $platform) {
+            yield from $platform->getTags();
+        }
+    }
+}
diff --git a/src/Platform/EmptyPlatform.php b/src/Platform/EmptyPlatform.php
new file mode 100644
index 0000000..0d1e249
--- /dev/null
+++ b/src/Platform/EmptyPlatform.php
@@ -0,0 +1,20 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Platform;
+
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+
+final class EmptyPlatform extends Platform
+{
+    public function getName(): string
+    {
+        return 'Empty';
+    }
+
+    protected function load(TypesParserInterface $types): iterable
+    {
+        return [];
+    }
+}
diff --git a/src/Platform/PHPStanPlatform.php b/src/Platform/PHPStanPlatform.php
new file mode 100644
index 0000000..326bfeb
--- /dev/null
+++ b/src/Platform/PHPStanPlatform.php
@@ -0,0 +1,46 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Platform;
+
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\MethodTag\MethodTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\ParamTag\ParamTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\PropertyTag\PropertyReadTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\PropertyTag\PropertyTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\PropertyTag\PropertyWriteTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\ReturnTag\ReturnTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateExtendsTag\TemplateExtendsTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateExtendsTag\TemplateImplementsTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateTag\TemplateContravariantTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateTag\TemplateCovariantTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateTag\TemplateTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\ThrowsTag\ThrowsTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\VarTag\VarTagFactory;
+
+final class PHPStanPlatform extends Platform
+{
+    public function getName(): string
+    {
+        return 'PHPStan';
+    }
+
+    protected function load(TypesParserInterface $types): iterable
+    {
+        yield 'phpstan-method' => new MethodTagFactory($types);
+        yield 'phpstan-param' => new ParamTagFactory($types);
+        yield 'phpstan-property' => new PropertyTagFactory($types);
+        yield 'phpstan-property-read' => new PropertyReadTagFactory($types);
+        yield 'phpstan-property-write' => new PropertyWriteTagFactory($types);
+        yield 'phpstan-return' => new ReturnTagFactory($types);
+        yield 'phpstan-template' => new TemplateTagFactory($types);
+        yield 'phpstan-implements' => new TemplateImplementsTagFactory($types);
+        yield 'phpstan-extends' => new TemplateExtendsTagFactory($types);
+        yield 'phpstan-use' => new TemplateExtendsTagFactory($types);
+        yield 'phpstan-template-covariant' => new TemplateCovariantTagFactory($types);
+        yield 'phpstan-template-contravariant' => new TemplateContravariantTagFactory($types);
+        yield 'phpstan-throws' => new ThrowsTagFactory($types);
+        yield 'phpstan-var' => new VarTagFactory($types);
+    }
+}
diff --git a/src/Platform/PhanPlatform.php b/src/Platform/PhanPlatform.php
new file mode 100644
index 0000000..1e57284
--- /dev/null
+++ b/src/Platform/PhanPlatform.php
@@ -0,0 +1,41 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Platform;
+
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\AbstractTag\AbstractTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\MethodTag\MethodTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\OverrideTag\OverrideTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\ParamTag\ParamTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\PropertyTag\PropertyReadTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\PropertyTag\PropertyTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\PropertyTag\PropertyWriteTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\ReturnTag\ReturnTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateExtendsTag\TemplateExtendsTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateTag\TemplateTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\VarTag\VarTagFactory;
+
+final class PhanPlatform extends Platform
+{
+    public function getName(): string
+    {
+        return 'Phan';
+    }
+
+    protected function load(TypesParserInterface $types): iterable
+    {
+        yield 'phan-abstract' => new AbstractTagFactory();
+        yield 'phan-method' => new MethodTagFactory($types);
+        yield 'phan-override' => new OverrideTagFactory();
+        yield 'phan-param' => new ParamTagFactory($types);
+        yield 'phan-property' => new PropertyTagFactory($types);
+        yield 'phan-property-read' => new PropertyReadTagFactory($types);
+        yield 'phan-property-write' => new PropertyWriteTagFactory($types);
+        yield 'phan-return' => new ReturnTagFactory($types);
+        yield 'phan-template' => new TemplateTagFactory($types);
+        yield ['phan-inherits', 'phan-extends'] => new TemplateExtendsTagFactory($types);
+        yield 'phan-var' => new VarTagFactory($types);
+    }
+}
diff --git a/src/Platform/Platform.php b/src/Platform/Platform.php
new file mode 100644
index 0000000..532ccc7
--- /dev/null
+++ b/src/Platform/Platform.php
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Platform;
+
+use TypeLang\Parser\Parser as TypesParser;
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+
+abstract class Platform implements PlatformInterface
+{
+    public function __construct(
+        protected readonly TypesParserInterface $types = new TypesParser(tolerant: true),
+    ) {
+        if ($this->types instanceof TypesParser && $this->types->tolerant === false) {
+            throw new \InvalidArgumentException('Tolerant parser mode required');
+        }
+    }
+
+    public function getTags(): iterable
+    {
+        foreach ($this->load($this->types) as $tag => $factory) {
+            if (\is_iterable($tag)) {
+                foreach ($tag as $name) {
+                    yield $name => $factory;
+                }
+            } else {
+                yield $tag => $factory;
+            }
+        }
+    }
+
+    /**
+     * @return iterable<non-empty-lowercase-string|iterable<mixed, non-empty-lowercase-string>, TagFactoryInterface>
+     */
+    abstract protected function load(TypesParserInterface $types): iterable;
+}
diff --git a/src/Platform/PlatformInterface.php b/src/Platform/PlatformInterface.php
new file mode 100644
index 0000000..4fbfe24
--- /dev/null
+++ b/src/Platform/PlatformInterface.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Platform;
+
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+
+interface PlatformInterface
+{
+    /**
+     * Platform name to display anywhere.
+     *
+     * @return non-empty-string
+     */
+    public function getName(): string;
+
+    /**
+     * Returns a list of registered tags for the specified platform.
+     *
+     * @return iterable<non-empty-lowercase-string, TagFactoryInterface>
+     */
+    public function getTags(): iterable;
+}
diff --git a/src/Platform/PsalmPlatform.php b/src/Platform/PsalmPlatform.php
new file mode 100644
index 0000000..83d5295
--- /dev/null
+++ b/src/Platform/PsalmPlatform.php
@@ -0,0 +1,46 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Platform;
+
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\ApiTag\ApiTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\MethodTag\MethodTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\ParamTag\ParamTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\PropertyTag\PropertyReadTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\PropertyTag\PropertyTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\PropertyTag\PropertyWriteTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\ReturnTag\ReturnTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateExtendsTag\TemplateExtendsTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateExtendsTag\TemplateImplementsTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateTag\TemplateContravariantTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateTag\TemplateCovariantTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateTag\TemplateTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\VarTag\VarTagFactory;
+
+final class PsalmPlatform extends Platform
+{
+    public function getName(): string
+    {
+        return 'Psalm';
+    }
+
+    protected function load(TypesParserInterface $types): iterable
+    {
+        yield 'psalm-api' => new ApiTagFactory();
+        yield 'psalm-method' => new MethodTagFactory($types);
+        yield 'psalm-param' => new ParamTagFactory($types);
+        yield 'psalm-property' => new PropertyTagFactory($types);
+        yield 'psalm-property-read' => new PropertyReadTagFactory($types);
+        yield 'psalm-property-write' => new PropertyWriteTagFactory($types);
+        yield 'psalm-return' => new ReturnTagFactory($types);
+        yield 'psalm-template' => new TemplateTagFactory($types);
+        yield 'psalm-implements' => new TemplateImplementsTagFactory($types);
+        yield 'psalm-extends' => new TemplateExtendsTagFactory($types);
+        yield 'psalm-use' => new TemplateExtendsTagFactory($types);
+        yield 'psalm-template-covariant' => new TemplateCovariantTagFactory($types);
+        yield 'psalm-template-contravariant' => new TemplateContravariantTagFactory($types);
+        yield 'psalm-var' => new VarTagFactory($types);
+    }
+}
diff --git a/src/Platform/StandardPlatform.php b/src/Platform/StandardPlatform.php
new file mode 100644
index 0000000..068aadc
--- /dev/null
+++ b/src/Platform/StandardPlatform.php
@@ -0,0 +1,89 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Platform;
+
+use TypeLang\Parser\ParserInterface as TypesParserInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\AbstractTag\AbstractTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\ApiTag\ApiTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\CategoryTag\CategoryTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\CopyrightTag\CopyrightTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\FinalTag\FinalTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\IgnoreTag\IgnoreTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\InheritDocTag\InheritDocTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\LicenseTag\LicenseTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\LinkTag\LinkTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\MethodTag\MethodTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\NoNamedArgumentsTag\NoNamedArgumentsTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\OverrideTag\OverrideTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\PackageTag\PackageTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\PackageTag\SubPackageTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\ParamTag\ParamTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\PropertyTag\PropertyReadTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\PropertyTag\PropertyTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\PropertyTag\PropertyWriteTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\ReturnTag\ReturnTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\SeeTag\SeeTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateExtendsTag\TemplateExtendsTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateExtendsTag\TemplateImplementsTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateTag\TemplateContravariantTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateTag\TemplateCovariantTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\TemplateTag\TemplateTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\ThrowsTag\ThrowsTagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\VarTag\VarTagFactory;
+
+final class StandardPlatform extends Platform
+{
+    public function getName(): string
+    {
+        return 'Standard';
+    }
+
+    protected function load(TypesParserInterface $types): iterable
+    {
+        yield 'abstract' => new AbstractTagFactory();
+        yield 'api' => new ApiTagFactory();
+        yield 'category' => new CategoryTagFactory();
+        yield 'copyright' => new CopyrightTagFactory();
+        yield 'extends' => new TemplateExtendsTagFactory($types);
+        yield 'final' => new FinalTagFactory();
+        yield 'implements' => new TemplateImplementsTagFactory($types);
+        yield 'inheritdoc' => new InheritDocTagFactory();
+        yield 'ignore' => new IgnoreTagFactory();
+        yield 'license' => new LicenseTagFactory();
+        yield 'link' => new LinkTagFactory();
+        yield 'method' => new MethodTagFactory($types);
+        yield 'no-named-arguments' => new NoNamedArgumentsTagFactory();
+        yield 'package' => new PackageTagFactory($types);
+        yield 'override' => new OverrideTagFactory();
+        yield 'param' => new ParamTagFactory($types);
+        yield 'property' => new PropertyTagFactory($types);
+        yield 'property-read' => new PropertyReadTagFactory($types);
+        yield 'property-write' => new PropertyWriteTagFactory($types);
+        yield 'return' => new ReturnTagFactory($types);
+        yield 'see' => new SeeTagFactory($types);
+        yield 'subpackage' => new SubPackageTagFactory($types);
+        yield 'template' => new TemplateTagFactory($types);
+        yield 'template-contravariant' => new TemplateContravariantTagFactory($types);
+        yield 'template-covariant' => new TemplateCovariantTagFactory($types);
+        yield 'use' => new TemplateExtendsTagFactory($types);
+        yield 'throws' => new ThrowsTagFactory($types);
+        yield 'var' => new VarTagFactory($types);
+
+        yield from $this->loadAliases($types);
+    }
+
+    /**
+     * @return iterable<non-empty-lowercase-string|iterable<mixed, non-empty-lowercase-string>, TagFactoryInterface>
+     */
+    protected function loadAliases(TypesParserInterface $types): iterable
+    {
+        yield 'returns' => new ReturnTagFactory($types);
+        yield ['template-extends', 'inherits'] => new TemplateExtendsTagFactory($types);
+        yield 'template-implements' => new TemplateImplementsTagFactory($types);
+        yield 'template-use' => new TemplateExtendsTagFactory($types);
+        yield 'throw' => new ThrowsTagFactory($types);
+    }
+}
diff --git a/src/Tag/Content.php b/src/Tag/Content.php
deleted file mode 100644
index 366fac4..0000000
--- a/src/Tag/Content.php
+++ /dev/null
@@ -1,203 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag;
-
-use TypeLang\Parser\Node\Stmt\TypeStatement;
-use TypeLang\Parser\ParserInterface as TypesParserInterface;
-use TypeLang\PHPDoc\Exception\InvalidTagException;
-use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
-use TypeLang\PHPDoc\Tag\Content\IdentifierApplicator;
-use TypeLang\PHPDoc\Tag\Content\OptionalIdentifierApplicator;
-use TypeLang\PHPDoc\Tag\Content\OptionalTypeParserApplicator;
-use TypeLang\PHPDoc\Tag\Content\OptionalValueApplicator;
-use TypeLang\PHPDoc\Tag\Content\OptionalVariableNameApplicator;
-use TypeLang\PHPDoc\Tag\Content\TypeParserApplicator;
-use TypeLang\PHPDoc\Tag\Content\ValueApplicator;
-use TypeLang\PHPDoc\Tag\Content\VariableNameApplicator;
-use TypeLang\PHPDoc\Tag\Description\DescriptionInterface;
-
-class Content implements \Stringable
-{
-    public readonly string $source;
-
-    /**
-     * @var int<0, max>
-     */
-    public int $offset = 0;
-
-    public function __construct(
-        public string $value,
-    ) {
-        $this->source = $this->value;
-    }
-
-    /**
-     * @param int<0, max> $offset
-     */
-    public function shift(int $offset, bool $ltrim = true): void
-    {
-        if ($offset <= 0) {
-            return;
-        }
-
-        $size = \strlen($this->value);
-        $this->value = \substr($this->value, $offset);
-
-        if ($ltrim) {
-            $this->value = \ltrim($this->value);
-        }
-
-        // @phpstan-ignore-next-line : Offset already greater than 0
-        $this->offset += $size - \strlen($this->value);
-    }
-
-    /**
-     * @param callable(self):bool $context
-     */
-    public function transactional(callable $context): void
-    {
-        $offset = $this->offset;
-        $value = $this->value;
-
-        if ($context($this) === false) {
-            $this->offset = $offset;
-            $this->value = $value;
-        }
-    }
-
-    public function getTagException(string $message, ?\Throwable $previous = null): InvalidTagException
-    {
-        return new InvalidTagException(
-            source: $this->source,
-            offset: $this->offset,
-            message: $message,
-            previous: $previous,
-        );
-    }
-
-    /**
-     * @api
-     *
-     * @param non-empty-string $tag
-     */
-    public function nextType(string $tag, TypesParserInterface $parser): TypeStatement
-    {
-        return $this->apply(new TypeParserApplicator($tag, $parser));
-    }
-
-    /**
-     * @api
-     */
-    public function nextOptionalType(TypesParserInterface $parser): ?TypeStatement
-    {
-        return $this->apply(new OptionalTypeParserApplicator($parser));
-    }
-
-    /**
-     * @api
-     *
-     * @param non-empty-string $tag
-     *
-     * @return non-empty-string
-     */
-    public function nextIdentifier(string $tag): string
-    {
-        return $this->apply(new IdentifierApplicator($tag));
-    }
-
-    /**
-     * @api
-     *
-     * @return non-empty-string|null
-     */
-    public function nextOptionalIdentifier(): ?string
-    {
-        return $this->apply(new OptionalIdentifierApplicator());
-    }
-
-    /**
-     * @api
-     *
-     * @param non-empty-string $tag
-     *
-     * @return non-empty-string
-     */
-    public function nextVariable(string $tag): string
-    {
-        return $this->apply(new VariableNameApplicator($tag));
-    }
-
-    /**
-     * @api
-     *
-     * @return non-empty-string|null
-     */
-    public function nextOptionalVariable(): ?string
-    {
-        return $this->apply(new OptionalVariableNameApplicator());
-    }
-
-    /**
-     * @api
-     *
-     * @template T of non-empty-string
-     *
-     * @param non-empty-string $tag
-     * @param T $value
-     *
-     * @return T
-     */
-    public function nextValue(string $tag, string $value): string
-    {
-        /** @var T */
-        return $this->apply(new ValueApplicator($tag, $value));
-    }
-
-    /**
-     * @api
-     *
-     * @template T of non-empty-string
-     *
-     * @param T $value
-     *
-     * @return T|null
-     */
-    public function nextOptionalValue(string $value): ?string
-    {
-        /** @var T|null */
-        return $this->apply(new OptionalValueApplicator($value));
-    }
-
-    /**
-     * @template T of mixed
-     *
-     * @param callable(Content):T $applicator
-     *
-     * @return T
-     */
-    public function apply(callable $applicator): mixed
-    {
-        return $applicator($this);
-    }
-
-    public function toDescription(DescriptionParserInterface $descriptions): DescriptionInterface
-    {
-        return $descriptions->parse($this->value);
-    }
-
-    public function toOptionalDescription(DescriptionParserInterface $descriptions): ?DescriptionInterface
-    {
-        if (\trim($this->value) === '') {
-            return null;
-        }
-
-        return $descriptions->parse(\rtrim($this->value));
-    }
-
-    public function __toString(): string
-    {
-        return $this->value;
-    }
-}
diff --git a/src/Tag/Content/Applicator.php b/src/Tag/Content/Applicator.php
deleted file mode 100644
index 7194e98..0000000
--- a/src/Tag/Content/Applicator.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag\Content;
-
-use TypeLang\PHPDoc\Tag\Content;
-
-/**
- * @template T of mixed
- */
-abstract class Applicator
-{
-    /**
-     * @return T
-     */
-    abstract public function __invoke(Content $lexer): mixed;
-}
diff --git a/src/Tag/Content/IdentifierApplicator.php b/src/Tag/Content/IdentifierApplicator.php
deleted file mode 100644
index 92916f0..0000000
--- a/src/Tag/Content/IdentifierApplicator.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag\Content;
-
-use TypeLang\PHPDoc\Exception\InvalidTagException;
-use TypeLang\PHPDoc\Tag\Content;
-
-/**
- * @template-extends Applicator<non-empty-string>
- */
-final class IdentifierApplicator extends Applicator
-{
-    private readonly OptionalIdentifierApplicator $id;
-
-    /**
-     * @param non-empty-string $tag
-     */
-    public function __construct(
-        private readonly string $tag,
-    ) {
-        $this->id = new OptionalIdentifierApplicator();
-    }
-
-    /**
-     * @return non-empty-string
-     * @throws InvalidTagException
-     */
-    public function __invoke(Content $lexer): string
-    {
-        return ($this->id)($lexer)
-            ?? throw $lexer->getTagException(\sprintf(
-                'Tag @%s contains an incorrect identifier value',
-                $this->tag,
-            ));
-    }
-}
diff --git a/src/Tag/Content/OptionalIdentifierApplicator.php b/src/Tag/Content/OptionalIdentifierApplicator.php
deleted file mode 100644
index 4e877e4..0000000
--- a/src/Tag/Content/OptionalIdentifierApplicator.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag\Content;
-
-use TypeLang\PHPDoc\Tag\Content;
-
-/**
- * @template-extends Applicator<non-empty-string|null>
- */
-final class OptionalIdentifierApplicator extends Applicator
-{
-    /**
-     * @return non-empty-string|null
-     */
-    public function __invoke(Content $lexer): ?string
-    {
-        // @phpstan-ignore-next-line : PHPStan false positive
-        if ($lexer->value === '') {
-            return null;
-        }
-
-        \preg_match('/([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)\b/u', $lexer->value, $matches);
-
-        if (\count($matches) !== 2) {
-            return null;
-        }
-
-        $lexer->shift(\strlen($matches[0]));
-
-        return $matches[1];
-    }
-}
diff --git a/src/Tag/Content/OptionalValueApplicator.php b/src/Tag/Content/OptionalValueApplicator.php
deleted file mode 100644
index 992f5ef..0000000
--- a/src/Tag/Content/OptionalValueApplicator.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag\Content;
-
-use TypeLang\PHPDoc\Tag\Content;
-
-/**
- * @template T of non-empty-string
- * @template-extends Applicator<T|null>
- */
-final class OptionalValueApplicator extends Applicator
-{
-    /**
-     * @param T $value
-     */
-    public function __construct(
-        private readonly string $value,
-    ) {}
-
-    /**
-     * @return T|null
-     */
-    public function __invoke(Content $lexer): ?string
-    {
-        if (!\str_starts_with($lexer->value, $this->value)) {
-            return null;
-        }
-
-        $expectedLength = \strlen($this->value);
-
-        // In case of end of string
-        if ($expectedLength === \strlen(\rtrim($lexer->value))) {
-            return $this->apply($lexer);
-        }
-
-        // In case of separated by whitespace
-        if (\ctype_space($lexer->value[$expectedLength])) {
-            return $this->apply($lexer);
-        }
-
-        return null;
-    }
-
-    /**
-     * @return T
-     */
-    private function apply(Content $lexer): string
-    {
-        $lexer->shift(\strlen($this->value));
-
-        return $this->value;
-    }
-}
diff --git a/src/Tag/Content/OptionalVariableNameApplicator.php b/src/Tag/Content/OptionalVariableNameApplicator.php
deleted file mode 100644
index 0710677..0000000
--- a/src/Tag/Content/OptionalVariableNameApplicator.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag\Content;
-
-use TypeLang\PHPDoc\Tag\Content;
-
-/**
- * @template-extends Applicator<non-empty-string|null>
- */
-final class OptionalVariableNameApplicator extends Applicator
-{
-    /**
-     * @return non-empty-string|null
-     */
-    public function __invoke(Content $lexer): ?string
-    {
-        if (!\str_starts_with($lexer->value, '$')) {
-            return null;
-        }
-
-        \preg_match('/\$([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)\b/u', $lexer->value, $matches);
-
-        if (\count($matches) !== 2) {
-            return null;
-        }
-
-        $lexer->shift(\strlen($matches[0]));
-
-        return $matches[1];
-    }
-}
diff --git a/src/Tag/Content/TypeParserApplicator.php b/src/Tag/Content/TypeParserApplicator.php
deleted file mode 100644
index d3b0c3e..0000000
--- a/src/Tag/Content/TypeParserApplicator.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag\Content;
-
-use TypeLang\Parser\Exception\ParserExceptionInterface;
-use TypeLang\Parser\Node\Stmt\TypeStatement;
-use TypeLang\Parser\ParserInterface as TypesParserInterface;
-use TypeLang\PHPDoc\Exception\InvalidTagException;
-use TypeLang\PHPDoc\Tag\Content;
-
-/**
- * @template-extends Applicator<TypeStatement>
- */
-final class TypeParserApplicator extends Applicator
-{
-    /**
-     * @param non-empty-string $tag
-     */
-    public function __construct(
-        private readonly string $tag,
-        private readonly TypesParserInterface $parser,
-    ) {}
-
-    /**
-     * @throws \Throwable
-     * @throws InvalidTagException
-     */
-    public function __invoke(Content $lexer): TypeStatement
-    {
-        try {
-            $type = $this->parser->parse($lexer->value);
-        } catch (ParserExceptionInterface $e) {
-            throw $lexer->getTagException(
-                message: \sprintf('Tag @%s contains an incorrect type', $this->tag),
-                previous: $e,
-            );
-        }
-
-        // @phpstan-ignore-next-line : Property is defined
-        $lexer->shift($this->parser->lastProcessedTokenOffset);
-
-        return $type;
-    }
-}
diff --git a/src/Tag/Content/ValueApplicator.php b/src/Tag/Content/ValueApplicator.php
deleted file mode 100644
index 0ccbf71..0000000
--- a/src/Tag/Content/ValueApplicator.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag\Content;
-
-use TypeLang\PHPDoc\Exception\InvalidTagException;
-use TypeLang\PHPDoc\Tag\Content;
-
-/**
- * @template T of non-empty-string
- * @template-extends Applicator<T>
- */
-final class ValueApplicator extends Applicator
-{
-    /**
-     * @var OptionalValueApplicator<T>
-     */
-    private readonly OptionalValueApplicator $identifier;
-
-    /**
-     * @param non-empty-string $tag
-     * @param T $value
-     */
-    public function __construct(
-        private readonly string $tag,
-        private readonly string $value,
-    ) {
-        $this->identifier = new OptionalValueApplicator($value);
-    }
-
-    /**
-     * @return T
-     * @throws InvalidTagException
-     */
-    public function __invoke(Content $lexer): string
-    {
-        /** @var T */
-        return ($this->identifier)($lexer)
-            ?? throw $lexer->getTagException(\sprintf(
-                'Tag @%s contains an incorrect identifier value "%s"',
-                $this->tag,
-                $this->value,
-            ));
-    }
-}
diff --git a/src/Tag/Content/VariableNameApplicator.php b/src/Tag/Content/VariableNameApplicator.php
deleted file mode 100644
index d3f4ef2..0000000
--- a/src/Tag/Content/VariableNameApplicator.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag\Content;
-
-use TypeLang\PHPDoc\Exception\InvalidTagException;
-use TypeLang\PHPDoc\Tag\Content;
-
-/**
- * @template-extends Applicator<non-empty-string>
- */
-final class VariableNameApplicator extends Applicator
-{
-    private readonly OptionalVariableNameApplicator $var;
-
-    /**
-     * @param non-empty-string $tag
-     */
-    public function __construct(
-        private readonly string $tag,
-    ) {
-        $this->var = new OptionalVariableNameApplicator();
-    }
-
-    /**
-     * @return non-empty-string
-     * @throws InvalidTagException
-     */
-    public function __invoke(Content $lexer): string
-    {
-        return ($this->var)($lexer)
-            ?? throw $lexer->getTagException(\sprintf(
-                'Tag @%s contains an incorrect variable name',
-                $this->tag,
-            ));
-    }
-}
diff --git a/src/Tag/Description/DescriptionProviderInterface.php b/src/Tag/Description/DescriptionProviderInterface.php
deleted file mode 100644
index c91b92f..0000000
--- a/src/Tag/Description/DescriptionProviderInterface.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag\Description;
-
-interface DescriptionProviderInterface extends OptionalDescriptionProviderInterface
-{
-    /**
-     * Returns description object which can be represented as a string and
-     * contains additional information.
-     */
-    public function getDescription(): DescriptionInterface;
-}
diff --git a/src/Tag/Description/OptionalDescriptionProviderInterface.php b/src/Tag/Description/OptionalDescriptionProviderInterface.php
deleted file mode 100644
index 0de030c..0000000
--- a/src/Tag/Description/OptionalDescriptionProviderInterface.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag\Description;
-
-interface OptionalDescriptionProviderInterface
-{
-    /**
-     * Returns description object which can be represented as a string and
-     * contains additional information.
-     */
-    public function getDescription(): ?DescriptionInterface;
-}
diff --git a/src/Tag/Description/TaggedDescriptionInterface.php b/src/Tag/Description/TaggedDescriptionInterface.php
deleted file mode 100644
index 9328097..0000000
--- a/src/Tag/Description/TaggedDescriptionInterface.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag\Description;
-
-use TypeLang\PHPDoc\Tag\TagInterface;
-use TypeLang\PHPDoc\Tag\TagsProviderInterface;
-
-/**
- * Any class that implements this interface is a description object
- * containing an arbitrary set of nested tags ({@see TagInterface}) and,
- * like a parent {@see DescriptionInterface}, can be represented as a string.
- *
- * @template-extends \Traversable<array-key, DescriptionInterface|TagInterface>
- */
-interface TaggedDescriptionInterface extends
-    TagsProviderInterface,
-    DescriptionInterface,
-    \Traversable,
-    \Countable
-{
-    /**
-     * Returns a list of components (that is, tags of {@see TagInterface}
-     * and descriptions of {@see DescriptionInterface}) that make up the
-     * {@see TaggedDescriptionInterface} in the order in which these
-     * elements are defined.
-     *
-     * @return iterable<array-key, TagInterface|DescriptionInterface>
-     */
-    public function getComponents(): iterable;
-}
diff --git a/src/Tag/Factory/MutableFactoryInterface.php b/src/Tag/Factory/MutableFactoryInterface.php
deleted file mode 100644
index bc80b18..0000000
--- a/src/Tag/Factory/MutableFactoryInterface.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag\Factory;
-
-interface MutableFactoryInterface extends FactoryInterface
-{
-    /**
-     * Registers a handler for tags.
-     *
-     * If you want to use your own tags then you can use this method to
-     * instruct the {@see FactoryInterface} to register the name of a tag with
-     * the custom {@see FactoryInterface} to which processing of this tag will
-     * be delegated.
-     *
-     * @param non-empty-string|list<non-empty-string> $tags
-     */
-    public function register(string|array $tags, FactoryInterface $delegate): void;
-}
diff --git a/src/Tag/Factory/PrefixedTagFactory.php b/src/Tag/Factory/PrefixedTagFactory.php
deleted file mode 100644
index 6fad8ef..0000000
--- a/src/Tag/Factory/PrefixedTagFactory.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag\Factory;
-
-use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
-use TypeLang\PHPDoc\Tag\Content;
-use TypeLang\PHPDoc\Tag\TagInterface;
-
-final class PrefixedTagFactory implements MutableFactoryInterface
-{
-    /**
-     * @param non-empty-list<non-empty-string> $prefixes
-     */
-    public function __construct(
-        private readonly array $prefixes,
-        private readonly MutableFactoryInterface $delegate = new TagFactory(),
-        private readonly bool $allowNonPrefixedTags = true,
-    ) {}
-
-    public function register(array|string $tags, FactoryInterface $delegate): void
-    {
-        foreach ((array) $tags as $tag) {
-            if ($this->allowNonPrefixedTags) {
-                $this->delegate->register($tag, $delegate);
-            }
-
-            foreach ($this->prefixes as $prefix) {
-                $this->delegate->register($prefix . $tag, $delegate);
-            }
-        }
-    }
-
-    public function create(string $name, Content $content, DescriptionParserInterface $descriptions): TagInterface
-    {
-        return $this->delegate->create($name, $content, $descriptions);
-    }
-}
diff --git a/src/Tag/Factory/TagFactory.php b/src/Tag/Factory/TagFactory.php
deleted file mode 100644
index 8aefa20..0000000
--- a/src/Tag/Factory/TagFactory.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag\Factory;
-
-use TypeLang\PHPDoc\Exception\InvalidTagException;
-use TypeLang\PHPDoc\Exception\RuntimeExceptionInterface;
-use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
-use TypeLang\PHPDoc\Tag\Content;
-use TypeLang\PHPDoc\Tag\InvalidTag;
-use TypeLang\PHPDoc\Tag\Tag;
-use TypeLang\PHPDoc\Tag\TagInterface;
-
-final class TagFactory implements MutableFactoryInterface
-{
-    /**
-     * @param array<non-empty-string, FactoryInterface> $factories
-     */
-    public function __construct(
-        private array $factories = [],
-    ) {}
-
-    public function register(array|string $tags, FactoryInterface $delegate): void
-    {
-        foreach ((array) $tags as $tag) {
-            $this->factories[$tag] = $delegate;
-        }
-    }
-
-    public function create(string $name, Content $content, DescriptionParserInterface $descriptions): TagInterface
-    {
-        $delegate = $this->factories[$name] ?? null;
-
-        if ($delegate !== null) {
-            try {
-                try {
-                    return $delegate->create($name, $content, $descriptions);
-                } catch (RuntimeExceptionInterface $e) {
-                    throw $e;
-                } catch (\Throwable $e) {
-                    throw InvalidTagException::fromCreatingTag(
-                        tag: $name,
-                        source: $content->value,
-                        prev: $e,
-                    );
-                }
-            } catch (RuntimeExceptionInterface $e) {
-                return new InvalidTag(
-                    reason: $e,
-                    description: $descriptions->parse($content->source),
-                    name: $name,
-                );
-            }
-        }
-
-        $description = null;
-
-        if ($content->value !== '') {
-            $description = $content->toDescription($descriptions);
-        }
-
-        return new Tag($name, $description);
-    }
-}
diff --git a/src/Tag/InvalidTag.php b/src/Tag/InvalidTag.php
deleted file mode 100644
index 03a9235..0000000
--- a/src/Tag/InvalidTag.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag;
-
-final class InvalidTag extends Tag implements InvalidTagInterface
-{
-    /**
-     * @var non-empty-string
-     */
-    public const DEFAULT_UNKNOWN_TAG_NAME = '<unknown>';
-
-    /**
-     * @param non-empty-string $name
-     */
-    public function __construct(
-        protected readonly \Throwable $reason,
-        \Stringable|string|null $description = null,
-        string $name = self::DEFAULT_UNKNOWN_TAG_NAME,
-    ) {
-        parent::__construct($name, $description);
-    }
-
-    public function getReason(): \Throwable
-    {
-        return $this->reason;
-    }
-
-    public function __toString(): string
-    {
-        $name = $this->name === self::DEFAULT_UNKNOWN_TAG_NAME ? '' : $this->name;
-
-        if ($this->description === null) {
-            return \sprintf('@%s', $name);
-        }
-
-        return \rtrim(\vsprintf('@%s %s', [
-            $name,
-            (string) $this->description,
-        ]));
-    }
-}
diff --git a/src/Tag/InvalidTagInterface.php b/src/Tag/InvalidTagInterface.php
deleted file mode 100644
index 8209413..0000000
--- a/src/Tag/InvalidTagInterface.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag;
-
-interface InvalidTagInterface extends TagInterface
-{
-    /**
-     * Returns the reason why this tag is invalid.
-     */
-    public function getReason(): \Throwable;
-}
diff --git a/src/Tag/OptionalTypeProviderInterface.php b/src/Tag/OptionalTypeProviderInterface.php
deleted file mode 100644
index 7ceeb65..0000000
--- a/src/Tag/OptionalTypeProviderInterface.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag;
-
-use TypeLang\Parser\Node\Stmt\TypeStatement;
-
-/**
- * Every class that implements a given interface is an implementation of a
- * tag that contains type information (that is, an AST object).
- *
- * Requires a `type-lang/parser` dependency for {@see TypeStatement} support.
- */
-interface OptionalTypeProviderInterface
-{
-    /**
-     * Returns an AST object of the type or {@see null} in case the
-     * type is not specified.
-     */
-    public function getType(): ?TypeStatement;
-}
diff --git a/src/Tag/OptionalVariableNameProviderInterface.php b/src/Tag/OptionalVariableNameProviderInterface.php
deleted file mode 100644
index 82189c8..0000000
--- a/src/Tag/OptionalVariableNameProviderInterface.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag;
-
-interface OptionalVariableNameProviderInterface
-{
-    /**
-     * Returns the name of the variable (parameter, field, etc.) to
-     * which this tag is attached or {@see null} in case of the tag does
-     * not contain a name.
-     *
-     * @return non-empty-string|null
-     */
-    public function getVariableName(): ?string;
-}
diff --git a/src/Tag/TagsProviderInterface.php b/src/Tag/TagsProviderInterface.php
deleted file mode 100644
index c721b54..0000000
--- a/src/Tag/TagsProviderInterface.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag;
-
-/**
- * @internal this is an internal library interface, please do not use it in your code
- * @psalm-internal TypeLang\PHPDoc\Tag
- */
-interface TagsProviderInterface
-{
-    /**
-     * Returns the tags for this object.
-     *
-     * @return iterable<array-key, TagInterface>
-     */
-    public function getTags(): iterable;
-}
diff --git a/src/Tag/TypeProviderInterface.php b/src/Tag/TypeProviderInterface.php
deleted file mode 100644
index d1b13b8..0000000
--- a/src/Tag/TypeProviderInterface.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag;
-
-use TypeLang\Parser\Node\Stmt\TypeStatement;
-
-interface TypeProviderInterface extends OptionalTypeProviderInterface
-{
-    /**
-     * Returns an AST object of the type.
-     */
-    public function getType(): TypeStatement;
-}
diff --git a/src/Tag/VariableNameProviderInterface.php b/src/Tag/VariableNameProviderInterface.php
deleted file mode 100644
index 7e2d766..0000000
--- a/src/Tag/VariableNameProviderInterface.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tag;
-
-interface VariableNameProviderInterface extends OptionalVariableNameProviderInterface
-{
-    /**
-     * Returns the name of the variable (parameter, field, etc.) to
-     * which this tag is attached.
-     *
-     * @return non-empty-string
-     */
-    public function getVariableName(): string;
-}
diff --git a/src/polyfill.php b/src/polyfill.php
new file mode 100644
index 0000000..54c9565
--- /dev/null
+++ b/src/polyfill.php
@@ -0,0 +1,59 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\DocBlock;
+
+if (\PHP_VERSION_ID >= 80400) {
+    return;
+}
+
+\class_alias(
+    Polyfill\Description\OptionalDescriptionProviderInterface::class,
+    Description\OptionalDescriptionProviderInterface::class,
+);
+
+\class_alias(
+    Polyfill\Description\DescriptionProviderInterface::class,
+    Description\DescriptionProviderInterface::class,
+);
+
+\class_alias(
+    Polyfill\Tag\OptionalTypeProviderInterface::class,
+    Tag\OptionalTypeProviderInterface::class,
+);
+
+\class_alias(
+    Polyfill\Tag\TypeProviderInterface::class,
+    Tag\TypeProviderInterface::class,
+);
+
+\class_alias(
+    Polyfill\Tag\OptionalVariableProviderInterface::class,
+    Tag\OptionalVariableProviderInterface::class,
+);
+
+\class_alias(
+    Polyfill\Tag\VariableProviderInterface::class,
+    Tag\VariableProviderInterface::class,
+);
+
+\class_alias(
+    Polyfill\Tag\TagsProviderInterface::class,
+    Tag\TagsProviderInterface::class,
+);
+
+\class_alias(
+    Polyfill\Tag\TagInterface::class,
+    Tag\TagInterface::class,
+);
+
+\class_alias(
+    Polyfill\Tag\InvalidTagInterface::class,
+    Tag\InvalidTagInterface::class,
+);
+
+\class_alias(
+    Polyfill\Description\TaggedDescriptionInterface::class,
+    Description\TaggedDescriptionInterface::class,
+);
diff --git a/tests/Bench/DocBlockParser/DocBlockParserBenchCase.php b/tests/Bench/DocBlockParser/DocBlockParserBenchCase.php
new file mode 100644
index 0000000..e3b8230
--- /dev/null
+++ b/tests/Bench/DocBlockParser/DocBlockParserBenchCase.php
@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Bench\DocBlockParser;
+
+abstract class DocBlockParserBenchCase
+{
+    /**
+     * @var non-empty-list<non-empty-string>
+     */
+    protected readonly array $samples;
+
+    public function __construct()
+    {
+        $this->samples = \json_decode(
+            json: \file_get_contents(__DIR__ . '/samples.json'),
+            associative: true,
+            flags: \JSON_THROW_ON_ERROR,
+        );
+    }
+
+    abstract public function benchDocBlockParsing(): void;
+}
diff --git a/tests/Bench/DocBlockParser/PHPDocumentorDocBlockParserBench.php b/tests/Bench/DocBlockParser/PHPDocumentorDocBlockParserBench.php
new file mode 100644
index 0000000..e7e6744
--- /dev/null
+++ b/tests/Bench/DocBlockParser/PHPDocumentorDocBlockParserBench.php
@@ -0,0 +1,31 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Bench\DocBlockParser;
+
+use PhpBench\Attributes\Iterations;
+use PhpBench\Attributes\Revs;
+use PhpBench\Attributes\Warmup;
+use phpDocumentor\Reflection\DocBlockFactory;
+use phpDocumentor\Reflection\DocBlockFactoryInterface;
+
+#[Revs(1), Warmup(1), Iterations(2)]
+final class PHPDocumentorDocBlockParserBench extends DocBlockParserBenchCase
+{
+    private readonly DocBlockFactoryInterface $parser;
+
+    public function __construct()
+    {
+        parent::__construct();
+
+        $this->parser = DocBlockFactory::createInstance();
+    }
+
+    public function benchDocBlockParsing(): void
+    {
+        foreach ($this->samples as $sample) {
+            $this->parser->create($sample);
+        }
+    }
+}
diff --git a/tests/Bench/DocBlockParser/PHPStanDocBlockParserBench.php b/tests/Bench/DocBlockParser/PHPStanDocBlockParserBench.php
new file mode 100644
index 0000000..151a5cb
--- /dev/null
+++ b/tests/Bench/DocBlockParser/PHPStanDocBlockParserBench.php
@@ -0,0 +1,45 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Bench\DocBlockParser;
+
+use PhpBench\Attributes\Iterations;
+use PhpBench\Attributes\Revs;
+use PhpBench\Attributes\Warmup;
+use PHPStan\PhpDocParser\Lexer\Lexer;
+use PHPStan\PhpDocParser\Parser\ConstExprParser;
+use PHPStan\PhpDocParser\Parser\PhpDocParser;
+use PHPStan\PhpDocParser\Parser\TokenIterator;
+use PHPStan\PhpDocParser\Parser\TypeParser;
+use PHPStan\PhpDocParser\ParserConfig;
+
+#[Revs(1), Warmup(1), Iterations(2)]
+final class PHPStanDocBlockParserBench extends DocBlockParserBenchCase
+{
+    private readonly Lexer $lexer;
+    private readonly PhpDocParser $parser;
+
+    public function __construct()
+    {
+        parent::__construct();
+
+        $config = new ParserConfig(usedAttributes: [
+            'lines' => true,
+            'indexes' => true,
+            'comments' => true,
+        ]);
+        $constExprParser = new ConstExprParser($config);
+        $typeParser = new TypeParser($config, $constExprParser);
+        $this->lexer = new Lexer($config);
+        $this->parser = new PhpDocParser($config, $typeParser, $constExprParser);
+    }
+
+    public function benchDocBlockParsing(): void
+    {
+        foreach ($this->samples as $sample) {
+            $tokens = new TokenIterator($this->lexer->tokenize($sample));
+            $this->parser->parse($tokens);
+        }
+    }
+}
diff --git a/tests/Bench/DocBlockParser/TypeLangDocBlockParserBench.php b/tests/Bench/DocBlockParser/TypeLangDocBlockParserBench.php
new file mode 100644
index 0000000..ff89c63
--- /dev/null
+++ b/tests/Bench/DocBlockParser/TypeLangDocBlockParserBench.php
@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Bench\DocBlockParser;
+
+use PhpBench\Attributes\Iterations;
+use PhpBench\Attributes\Revs;
+use PhpBench\Attributes\Warmup;
+use TypeLang\PHPDoc\Parser;
+
+#[Revs(1), Warmup(1), Iterations(2)]
+final class TypeLangDocBlockParserBench extends DocBlockParserBenchCase
+{
+    private readonly Parser $parser;
+
+    public function __construct()
+    {
+        parent::__construct();
+
+        $this->parser = new Parser();
+    }
+
+    public function benchDocBlockParsing(): void
+    {
+        foreach ($this->samples as $sample) {
+            $this->parser->parse($sample);
+        }
+    }
+}
diff --git a/tests/Bench/DocBlockParser/samples.json b/tests/Bench/DocBlockParser/samples.json
new file mode 100644
index 0000000..2473175
--- /dev/null
+++ b/tests/Bench/DocBlockParser/samples.json
@@ -0,0 +1 @@
+{"0":"\/**\n * The Decoder \/ Parser reads from a plain stream and emits data objects for each JSON element\n *\/","1":"\/** @var int *\/","2":"\/**\n     * @param ReadableStreamInterface $input\n     * @param bool $assoc\n     * @param int $depth\n     * @param int $options (requires PHP 5.4+)\n     * @param int $maxlength\n     * @throws \\BadMethodCallException\n     *\/","3":"\/** @internal *\/","6":"\/**\n * The Encoder \/ Serializer can be used to write any value, encode it as a JSON text and forward it to an output stream\n *\/","7":"\/**\n     * @param WritableStreamInterface $output\n     * @param int $options\n     * @param int $depth (requires PHP 5.5+)\n     * @throws \\InvalidArgumentException\n     * @throws \\BadMethodCallException\n     *\/","10":"\/**\n * This class is copied in every Composer installed project and available to all\n *\n * See also https:\/\/getcomposer.org\/doc\/07-runtime.md#installed-versions\n *\n * To require its presence, you can require `composer-runtime-api ^2.0`\n *\n * @final\n *\/","11":"\/**\n     * @var mixed[]|null\n     * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null\n     *\/","12":"\/**\n     * @var bool\n     *\/","13":"\/**\n     * @var bool|null\n     *\/","14":"\/**\n     * @var array[]\n     * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>\n     *\/","15":"\/**\n     * Returns a list of all package names which are present, either by being installed, replaced or provided\n     *\n     * @return string[]\n     * @psalm-return list<string>\n     *\/","16":"\/**\n     * Returns a list of all package names with a specific type e.g. 'library'\n     *\n     * @param  string   $type\n     * @return string[]\n     * @psalm-return list<string>\n     *\/","17":"\/**\n     * Checks whether the given package is installed\n     *\n     * This also returns true if the package name is provided or replaced by another package\n     *\n     * @param  string $packageName\n     * @param  bool   $includeDevRequirements\n     * @return bool\n     *\/","18":"\/**\n     * Checks whether the given package satisfies a version constraint\n     *\n     * e.g. If you want to know whether version 2.3+ of package foo\/bar is installed, you would call:\n     *\n     *   Composer\\InstalledVersions::satisfies(new VersionParser, 'foo\/bar', '^2.3')\n     *\n     * @param  VersionParser $parser      Install composer\/semver to have access to this class and functionality\n     * @param  string        $packageName\n     * @param  string|null   $constraint  A version constraint to check for, if you pass one you have to make sure composer\/semver is required by your package\n     * @return bool\n     *\/","19":"\/**\n     * Returns a version constraint representing all the range(s) which are installed for a given package\n     *\n     * It is easier to use this via isInstalled() with the $constraint argument if you need to check\n     * whether a given version of a package is installed, and not just whether it exists\n     *\n     * @param  string $packageName\n     * @return string Version constraint usable with composer\/semver\n     *\/","20":"\/**\n     * @param  string      $packageName\n     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present\n     *\/","22":"\/**\n     * @param  string      $packageName\n     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference\n     *\/","23":"\/**\n     * @param  string      $packageName\n     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.\n     *\/","24":"\/**\n     * @return array\n     * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}\n     *\/","25":"\/**\n     * Returns the raw installed.php data for custom implementations\n     *\n     * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.\n     * @return array[]\n     * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}\n     *\/","26":"\/**\n     * Returns the raw data of all installed.php which are currently loaded for custom implementations\n     *\n     * @return array[]\n     * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>\n     *\/","27":"\/**\n     * Lets you reload the static array from another file\n     *\n     * This is only useful for complex integrations in which a project needs to use\n     * this class but then also needs to execute another project's autoloader in process,\n     * and wants to ensure both projects have access to their version of installed.php.\n     *\n     * A typical case would be PHPUnit, where it would need to make sure it reads all\n     * the data it needs from this class, then call reload() with\n     * `require $CWD\/vendor\/composer\/installed.php` (or similar) as input to make sure\n     * the project in which it runs can then also use this class safely, without\n     * interference between PHPUnit's dependencies and the project's dependencies.\n     *\n     * @param  array[] $data A vendor\/composer\/installed.php data set\n     * @return void\n     *\n     * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data\n     *\/","28":"\/**\n     * @return array[]\n     * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>\n     *\/","29":"\/**\n     * An array of match group => list of matched strings\n     *\n     * @readonly\n     * @var array<int|string, list<string|null>>\n     *\/","30":"\/**\n     * @readonly\n     * @var 0|positive-int\n     *\/","31":"\/**\n     * @readonly\n     * @var bool\n     *\/","32":"\/**\n     * @param 0|positive-int $count\n     * @param array<int|string, list<string|null>> $matches\n     *\/","33":"\/**\n     * An array of match group => list of matched strings\n     *\n     * @readonly\n     * @var array<int|string, list<string>>\n     *\/","36":"\/**\n     * @param 0|positive-int $count\n     * @param array<list<string>> $matches\n     *\/","37":"\/**\n     * An array of match group => list of matches, every match being a pair of string matched + offset in bytes (or -1 if no match)\n     *\n     * @readonly\n     * @var array<int|string, list<array{string|null, int}>>\n     * @phpstan-var array<int|string, list<array{string|null, int<-1, max>}>>\n     *\/","40":"\/**\n     * @param 0|positive-int $count\n     * @param array<int|string, list<array{string|null, int}>> $matches\n     * @phpstan-param array<int|string, list<array{string|null, int<-1, max>}>> $matches\n     *\/","41":"\/**\n     * An array of match group => string matched\n     *\n     * @readonly\n     * @var array<int|string, string|null>\n     *\/","43":"\/**\n     * @param 0|positive-int $count\n     * @param array<string|null> $matches\n     *\/","44":"\/**\n     * An array of match group => string matched\n     *\n     * @readonly\n     * @var array<int|string, string>\n     *\/","46":"\/**\n     * @param 0|positive-int $count\n     * @param array<string> $matches\n     *\/","47":"\/**\n     * An array of match group => pair of string matched + offset in bytes (or -1 if no match)\n     *\n     * @readonly\n     * @var array<int|string, array{string|null, int}>\n     * @phpstan-var array<int|string, array{string|null, int<-1, max>}>\n     *\/","49":"\/**\n     * @param 0|positive-int $count\n     * @param array<array{string|null, int}> $matches\n     * @phpstan-param array<int|string, array{string|null, int<-1, max>}> $matches\n     *\/","50":"\/**\n * Copy of PHPStan's RegularExpressionPatternRule\n *\n * @implements Rule<StaticCall>\n *\/","51":"\/**\n     * @return string[]\n     *\/","52":"\/**\n     * @var RegexArrayShapeMatcher\n     *\/","53":"\/**\n     * @var TypeSpecifier\n     *\/","56":"\/**\n * @implements Rule<StaticCall>\n *\/","58":"\/**\n     * @param  string $function\n     * @param  string|string[] $pattern\n     * @return self\n     *\/","59":"\/**\n     * @param  int $code\n     * @return string\n     *\/","62":"\/**\n     * @param non-empty-string   $pattern\n     * @param array<mixed> $matches Set by method\n     * @param int-mask<PREG_UNMATCHED_AS_NULL> $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported\n     * @return 0|1\n     *\n     * @param-out array<int|string, string|null> $matches\n     *\/","63":"\/**\n     * Variant of `match()` which outputs non-null matches (or throws)\n     *\n     * @param non-empty-string $pattern\n     * @param array<mixed> $matches Set by method\n     * @param int-mask<PREG_UNMATCHED_AS_NULL> $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported\n     * @return 0|1\n     * @throws UnexpectedNullMatchException\n     *\n     * @param-out array<int|string, string> $matches\n     *\/","64":"\/**\n     * Runs preg_match with PREG_OFFSET_CAPTURE\n     *\n     * @param non-empty-string   $pattern\n     * @param array<mixed> $matches Set by method\n     * @param int-mask<PREG_UNMATCHED_AS_NULL|PREG_OFFSET_CAPTURE> $flags PREG_UNMATCHED_AS_NULL and PREG_OFFSET_CAPTURE are always set, no other flags are supported\n     * @return 0|1\n     *\n     * @param-out array<int|string, array{string|null, int<-1, max>}> $matches\n     *\/","65":"\/**\n     * @param non-empty-string   $pattern\n     * @param array<mixed> $matches Set by method\n     * @param int-mask<PREG_UNMATCHED_AS_NULL> $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported\n     * @return 0|positive-int\n     *\n     * @param-out array<int|string, list<string|null>> $matches\n     *\/","66":"\/**\n     * Variant of `match()` which outputs non-null matches (or throws)\n     *\n     * @param non-empty-string   $pattern\n     * @param array<mixed> $matches Set by method\n     * @param int-mask<PREG_UNMATCHED_AS_NULL> $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported\n     * @return 0|positive-int\n     * @throws UnexpectedNullMatchException\n     *\n     * @param-out array<int|string, list<string>> $matches\n     *\/","67":"\/**\n     * Runs preg_match_all with PREG_OFFSET_CAPTURE\n     *\n     * @param non-empty-string   $pattern\n     * @param array<mixed> $matches Set by method\n     * @param int-mask<PREG_UNMATCHED_AS_NULL|PREG_OFFSET_CAPTURE> $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported\n     * @return 0|positive-int\n     *\n     * @param-out array<int|string, list<array{string|null, int<-1, max>}>> $matches\n     *\/","68":"\/**\n     * @param string|string[] $pattern\n     * @param string|string[] $replacement\n     * @param string $subject\n     * @param int             $count Set by method\n     *\n     * @param-out int<0, max> $count\n     *\/","69":"\/**\n     * @param string|string[] $pattern\n     * @param ($flags is PREG_OFFSET_CAPTURE ? (callable(array<int|string, array{string|null, int<-1, max>}>): string) : callable(array<int|string, string|null>): string) $replacement\n     * @param string $subject\n     * @param int             $count Set by method\n     * @param int-mask<PREG_UNMATCHED_AS_NULL|PREG_OFFSET_CAPTURE> $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set\n     *\n     * @param-out int<0, max> $count\n     *\/","70":"\/**\n     * Variant of `replaceCallback()` which outputs non-null matches (or throws)\n     *\n     * @param string $pattern\n     * @param ($flags is PREG_OFFSET_CAPTURE ? (callable(array<int|string, array{string, int<0, max>}>): string) : callable(array<int|string, string>): string) $replacement\n     * @param string $subject\n     * @param int $count Set by method\n     * @param int-mask<PREG_UNMATCHED_AS_NULL|PREG_OFFSET_CAPTURE> $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set\n     *\n     * @param-out int<0, max> $count\n     *\/","71":"\/**\n     * @param ($flags is PREG_OFFSET_CAPTURE ? (array<string, callable(array<int|string, array{string|null, int<-1, max>}>): string>) : array<string, callable(array<int|string, string|null>): string>) $pattern\n     * @param string $subject\n     * @param int    $count Set by method\n     * @param int-mask<PREG_UNMATCHED_AS_NULL|PREG_OFFSET_CAPTURE> $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set\n     *\n     * @param-out int<0, max> $count\n     *\/","72":"\/**\n     * @param int-mask<PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_OFFSET_CAPTURE> $flags PREG_SPLIT_NO_EMPTY or PREG_SPLIT_DELIM_CAPTURE\n     * @return list<string>\n     *\/","73":"\/**\n     * @param int-mask<PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_OFFSET_CAPTURE> $flags PREG_SPLIT_NO_EMPTY or PREG_SPLIT_DELIM_CAPTURE, PREG_SPLIT_OFFSET_CAPTURE is always set\n     * @return list<array{string, int}>\n     * @phpstan-return list<array{string, int<0, max>}>\n     *\/","74":"\/**\n     * @template T of string|\\Stringable\n     * @param string   $pattern\n     * @param array<T> $array\n     * @param int-mask<PREG_GREP_INVERT> $flags PREG_GREP_INVERT\n     * @return array<T>\n     *\/","75":"\/**\n     * Variant of match() which returns a bool instead of int\n     *\n     * @param non-empty-string   $pattern\n     * @param array<mixed> $matches Set by method\n     * @param int-mask<PREG_UNMATCHED_AS_NULL> $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported\n     *\n     * @param-out array<int|string, string|null> $matches\n     *\/","76":"\/**\n     * Variant of `isMatch()` which outputs non-null matches (or throws)\n     *\n     * @param non-empty-string $pattern\n     * @param array<mixed> $matches Set by method\n     * @param int-mask<PREG_UNMATCHED_AS_NULL> $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported\n     * @throws UnexpectedNullMatchException\n     *\n     * @param-out array<int|string, string> $matches\n     *\/","77":"\/**\n     * Variant of matchAll() which returns a bool instead of int\n     *\n     * @param non-empty-string   $pattern\n     * @param array<mixed> $matches Set by method\n     * @param int-mask<PREG_UNMATCHED_AS_NULL> $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported\n     *\n     * @param-out array<int|string, list<string|null>> $matches\n     *\/","78":"\/**\n     * Variant of `isMatchAll()` which outputs non-null matches (or throws)\n     *\n     * @param non-empty-string $pattern\n     * @param array<mixed> $matches Set by method\n     * @param int-mask<PREG_UNMATCHED_AS_NULL> $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported\n     *\n     * @param-out array<int|string, list<string>> $matches\n     *\/","79":"\/**\n     * Variant of matchWithOffsets() which returns a bool instead of int\n     *\n     * Runs preg_match with PREG_OFFSET_CAPTURE\n     *\n     * @param non-empty-string   $pattern\n     * @param array<mixed> $matches Set by method\n     * @param int-mask<PREG_UNMATCHED_AS_NULL> $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported\n     *\n     * @param-out array<int|string, array{string|null, int<-1, max>}> $matches\n     *\/","80":"\/**\n     * Variant of matchAllWithOffsets() which returns a bool instead of int\n     *\n     * Runs preg_match_all with PREG_OFFSET_CAPTURE\n     *\n     * @param non-empty-string   $pattern\n     * @param array<mixed> $matches Set by method\n     * @param int-mask<PREG_UNMATCHED_AS_NULL> $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported\n     *\n     * @param-out array<int|string, list<array{string|null, int<-1, max>}>> $matches\n     *\/","81":"\/**\n     * @param array<int|string, string|null|array{string|null, int}> $matches\n     * @return array<int|string, string>\n     * @throws UnexpectedNullMatchException\n     *\/","82":"\/**\n     * @param array<int|string, list<string|null>> $matches\n     * @return array<int|string, list<string>>\n     * @throws UnexpectedNullMatchException\n     *\/","83":"\/**\n     * @param non-empty-string $pattern\n     *\/","84":"\/**\n     * @param non-empty-string $pattern\n     * @param int-mask<PREG_UNMATCHED_AS_NULL> $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported\n     *\/","85":"\/**\n     * Variant of `match()` which returns non-null matches (or throws)\n     *\n     * @param non-empty-string $pattern\n     * @param int-mask<PREG_UNMATCHED_AS_NULL> $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported\n     * @throws UnexpectedNullMatchException\n     *\/","86":"\/**\n     * Runs preg_match with PREG_OFFSET_CAPTURE\n     *\n     * @param non-empty-string $pattern\n     * @param int-mask<PREG_UNMATCHED_AS_NULL|PREG_OFFSET_CAPTURE> $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported\n     *\/","88":"\/**\n     * Variant of `matchAll()` which returns non-null matches (or throws)\n     *\n     * @param non-empty-string $pattern\n     * @param int-mask<PREG_UNMATCHED_AS_NULL> $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported\n     * @throws UnexpectedNullMatchException\n     *\/","89":"\/**\n     * Runs preg_match_all with PREG_OFFSET_CAPTURE\n     *\n     * @param non-empty-string $pattern\n     * @param int-mask<PREG_UNMATCHED_AS_NULL|PREG_OFFSET_CAPTURE> $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported\n     *\/","90":"\/**\n     * @param string|string[] $pattern\n     * @param string|string[] $replacement\n     * @param string          $subject\n     *\/","91":"\/**\n     * @param string|string[] $pattern\n     * @param ($flags is PREG_OFFSET_CAPTURE ? (callable(array<int|string, array{string|null, int<-1, max>}>): string) : callable(array<int|string, string|null>): string) $replacement\n     * @param string          $subject\n     * @param int-mask<PREG_UNMATCHED_AS_NULL|PREG_OFFSET_CAPTURE> $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set\n     *\/","92":"\/**\n     * Variant of `replaceCallback()` which outputs non-null matches (or throws)\n     *\n     * @param string $pattern\n     * @param ($flags is PREG_OFFSET_CAPTURE ? (callable(array<int|string, array{string, int<0, max>}>): string) : callable(array<int|string, string>): string) $replacement\n     * @param string          $subject\n     * @param int-mask<PREG_UNMATCHED_AS_NULL|PREG_OFFSET_CAPTURE> $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set\n     *\/","93":"\/**\n     * @param ($flags is PREG_OFFSET_CAPTURE ? (array<string, callable(array<int|string, array{string|null, int<-1, max>}>): string>) : array<string, callable(array<int|string, string|null>): string>) $pattern\n     * @param string $subject\n     * @param int-mask<PREG_UNMATCHED_AS_NULL|PREG_OFFSET_CAPTURE> $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set\n     *\/","94":"\/**\n     * @readonly\n     * @var string\n     *\/","97":"\/**\n     * @param 0|positive-int $count\n     *\/","98":"\/**\n     * Evaluates the expression: $version1 > $version2.\n     *\n     * @param string $version1\n     * @param string $version2\n     *\n     * @return bool\n     *\/","99":"\/**\n     * Evaluates the expression: $version1 >= $version2.\n     *\n     * @param string $version1\n     * @param string $version2\n     *\n     * @return bool\n     *\/","100":"\/**\n     * Evaluates the expression: $version1 < $version2.\n     *\n     * @param string $version1\n     * @param string $version2\n     *\n     * @return bool\n     *\/","101":"\/**\n     * Evaluates the expression: $version1 <= $version2.\n     *\n     * @param string $version1\n     * @param string $version2\n     *\n     * @return bool\n     *\/","102":"\/**\n     * Evaluates the expression: $version1 == $version2.\n     *\n     * @param string $version1\n     * @param string $version2\n     *\n     * @return bool\n     *\/","103":"\/**\n     * Evaluates the expression: $version1 != $version2.\n     *\n     * @param string $version1\n     * @param string $version2\n     *\n     * @return bool\n     *\/","104":"\/**\n     * Evaluates the expression: $version1 $operator $version2.\n     *\n     * @param string $version1\n     * @param string $operator\n     * @param string $version2\n     *\n     * @return bool\n     *\n     * @phpstan-param Constraint::STR_OP_*  $operator\n     *\/","105":"\/**\n * Helper class to evaluate constraint by compiling and reusing the code to evaluate\n *\/","106":"\/**\n     * @var array\n     * @phpstan-var array<string, callable>\n     *\/","107":"\/**\n     * @var array\n     * @phpstan-var array<string, bool>\n     *\/","108":"\/** @var bool *\/","109":"\/**\n     * @phpstan-var array<Constraint::OP_*, Constraint::STR_OP_*>\n     *\/","110":"\/**\n     * Clears the memoization cache once you are done\n     *\n     * @return void\n     *\/","111":"\/**\n     * Evaluates the expression: $constraint match $operator $version\n     *\n     * @param ConstraintInterface $constraint\n     * @param int                 $operator\n     * @phpstan-param Constraint::OP_*  $operator\n     * @param string              $version\n     *\n     * @return bool\n     *\/","112":"\/**\n     * @var string\n     *\/","114":"\/**\n     * @param string $version\n     * @param bool   $isInclusive\n     *\/","115":"\/**\n     * @return string\n     *\/","116":"\/**\n     * @return bool\n     *\/","119":"\/**\n     * Compares a bound to another with a given operator.\n     *\n     * @param Bound  $other\n     * @param string $operator\n     *\n     * @return bool\n     *\/","120":"\/**\n     * @return self\n     *\/","122":"\/**\n * Defines a constraint.\n *\/","123":"\/**\n     * Operator to integer translation table.\n     *\n     * @var array\n     * @phpstan-var array<self::STR_OP_*, self::OP_*>\n     *\/","124":"\/**\n     * Integer to operator translation table.\n     *\n     * @var array\n     * @phpstan-var array<self::OP_*, self::STR_OP_*>\n     *\/","125":"\/**\n     * @var int\n     * @phpstan-var self::OP_*\n     *\/","126":"\/** @var string *\/","127":"\/** @var string|null *\/","128":"\/** @var Bound *\/","130":"\/**\n     * Sets operator and version to compare with.\n     *\n     * @param string $operator\n     * @param string $version\n     *\n     * @throws \\InvalidArgumentException if invalid operator is given.\n     *\n     * @phpstan-param self::STR_OP_* $operator\n     *\/","132":"\/**\n     * @return string\n     *\n     * @phpstan-return self::STR_OP_*\n     *\/","133":"\/**\n     * @param ConstraintInterface $provider\n     *\n     * @return bool\n     *\/","134":"\/**\n     * {@inheritDoc}\n     *\/","136":"\/**\n     * Get all supported comparison operators.\n     *\n     * @return array\n     *\n     * @phpstan-return list<self::STR_OP_*>\n     *\/","137":"\/**\n     * @param  string $operator\n     * @return int\n     *\n     * @phpstan-param  self::STR_OP_* $operator\n     * @phpstan-return self::OP_*\n     *\/","138":"\/**\n     * @param string $a\n     * @param string $b\n     * @param string $operator\n     * @param bool   $compareBranches\n     *\n     * @throws \\InvalidArgumentException if invalid operator is given.\n     *\n     * @return bool\n     *\n     * @phpstan-param self::STR_OP_* $operator\n     *\/","140":"\/**\n     * @param Constraint $provider\n     * @param bool       $compareBranches\n     *\n     * @return bool\n     *\/","144":"\/**\n     * @return void\n     *\/","145":"\/**\n * DO NOT IMPLEMENT this interface. It is only meant for usage as a type hint\n * in libraries relying on composer\/semver but creating your own constraint class\n * that implements this interface is not a supported use case and will cause the\n * composer\/semver components to return unexpected results.\n *\/","146":"\/**\n     * Checks whether the given constraint intersects in any way with this constraint\n     *\n     * @param ConstraintInterface $provider\n     *\n     * @return bool\n     *\/","147":"\/**\n     * Provides a compiled version of the constraint for the given operator\n     * The compiled version must be a PHP expression.\n     * Executor of compile version must provide 2 variables:\n     * - $v = the string version to compare with\n     * - $b = whether or not the version is a non-comparable branch (starts with \"dev-\")\n     *\n     * @see Constraint::OP_* for the list of available operators.\n     * @example return '!$b && version_compare($v, '1.0', '>')';\n     *\n     * @param int $otherOperator one Constraint::OP_*\n     *\n     * @return string\n     *\n     * @phpstan-param Constraint::OP_* $otherOperator\n     *\/","148":"\/**\n     * @return Bound\n     *\/","151":"\/**\n     * @param string|null $prettyString\n     *\n     * @return void\n     *\/","153":"\/**\n * Defines the absence of a constraint.\n *\n * This constraint matches everything.\n *\/","162":"\/**\n * Blackhole of constraints, nothing escapes it\n *\/","171":"\/**\n * Defines a conjunctive or disjunctive set of constraints.\n *\/","172":"\/**\n     * @var ConstraintInterface[]\n     * @phpstan-var non-empty-array<ConstraintInterface>\n     *\/","176":"\/** @var Bound|null *\/","178":"\/**\n     * @param ConstraintInterface[] $constraints A set of constraints\n     * @param bool                  $conjunctive Whether the constraints should be treated as conjunctive or disjunctive\n     *\n     * @throws \\InvalidArgumentException If less than 2 constraints are passed\n     *\/","179":"\/**\n     * @return ConstraintInterface[]\n     *\/","189":"\/**\n     * Tries to optimize the constraints as much as possible, meaning\n     * reducing\/collapsing congruent constraints etc.\n     * Does not necessarily return a MultiConstraint instance if\n     * things can be reduced to a simple constraint\n     *\n     * @param ConstraintInterface[] $constraints A set of constraints\n     * @param bool                  $conjunctive Whether the constraints should be treated as conjunctive or disjunctive\n     *\n     * @return ConstraintInterface\n     *\/","190":"\/**\n     * @param  ConstraintInterface[] $constraints\n     * @param  bool                  $conjunctive\n     * @return ?array\n     *\n     * @phpstan-return array{0: list<ConstraintInterface>, 1: bool}|null\n     *\/","192":"\/** @var Constraint *\/","194":"\/**\n     * @return Constraint\n     *\/","199":"\/**\n     * @return array{'names': string[], 'exclude': bool}\n     *\/","201":"\/**\n * Helper class generating intervals from constraints\n *\n * This contains utilities for:\n *\n *  - compacting an existing constraint which can be used to combine several into one\n * by creating a MultiConstraint out of the many constraints you have.\n *\n *  - checking whether one subset is a subset of another.\n *\n * Note: You should call clear to free memoization memory  usage when you are done using this class\n *\/","202":"\/**\n     * @phpstan-var array<string, array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}}>\n     *\/","203":"\/**\n     * @phpstan-var array<string, int>\n     *\/","205":"\/**\n     * Checks whether $candidate is a subset of $constraint\n     *\n     * @return bool\n     *\/","206":"\/**\n     * Checks whether $a and $b have any intersection, equivalent to $a->matches($b)\n     *\n     * @return bool\n     *\/","207":"\/**\n     * Attempts to optimize a MultiConstraint\n     *\n     * When merging MultiConstraints together they can get very large, this will\n     * compact it by looking at the real intervals covered by all the constraints\n     * and then creates a new constraint containing only the smallest amount of rules\n     * to match the same intervals.\n     *\n     * @return ConstraintInterface\n     *\/","208":"\/**\n     * Creates an array of numeric intervals and branch constraints representing a given constraint\n     *\n     * if the returned numeric array is empty it means the constraint matches nothing in the numeric range (0 - +inf)\n     * if the returned branches array is empty it means no dev-* versions are matched\n     * if a constraint matches all possible dev-* versions, branches will contain Interval::anyDev()\n     *\n     * @return array\n     * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}}\n     *\/","209":"\/**\n     * @param bool $stopOnFirstValidInterval\n     *\n     * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}}\n     *\/","210":"\/**\n     * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}}\n     *\/","211":"\/** @var VersionParser *\/","212":"\/**\n     * Determine if given version satisfies given constraints.\n     *\n     * @param string $version\n     * @param string $constraints\n     *\n     * @return bool\n     *\/","213":"\/**\n     * Return all versions that satisfy given constraints.\n     *\n     * @param string[] $versions\n     * @param string   $constraints\n     *\n     * @return string[]\n     *\/","214":"\/**\n     * Sort given array of versions.\n     *\n     * @param string[] $versions\n     *\n     * @return string[]\n     *\/","215":"\/**\n     * Sort given array of versions in reverse.\n     *\n     * @param string[] $versions\n     *\n     * @return string[]\n     *\/","216":"\/**\n     * @param string[] $versions\n     * @param int      $direction\n     *\n     * @return string[]\n     *\/","217":"\/**\n * Version parser.\n *\n * @author Jordi Boggiano <j.boggiano@seld.be>\n *\/","218":"\/**\n     * Regex to match pre-release data (sort of).\n     *\n     * Due to backwards compatibility:\n     *   - Instead of enforcing hyphen, an underscore, dot or nothing at all are also accepted.\n     *   - Only stabilities as recognized by Composer are allowed to precede a numerical identifier.\n     *   - Numerical-only pre-release identifiers are not supported, see tests.\n     *\n     *                        |--------------|\n     * [major].[minor].[patch] -[pre-release] +[build-metadata]\n     *\n     * @var string\n     *\/","220":"\/**\n     * Returns the stability of a version.\n     *\n     * @param string $version\n     *\n     * @return string\n     * @phpstan-return 'stable'|'RC'|'beta'|'alpha'|'dev'\n     *\/","221":"\/**\n     * @param string $stability\n     *\n     * @return string\n     * @phpstan-return 'stable'|'RC'|'beta'|'alpha'|'dev'\n     *\/","222":"\/**\n     * Normalizes a version string to be able to perform comparisons on it.\n     *\n     * @param string $version\n     * @param ?string $fullVersion optional complete version string to give more context\n     *\n     * @throws \\UnexpectedValueException\n     *\n     * @return string\n     *\/","223":"\/**\n     * Extract numeric prefix from alias, if it is in numeric format, suitable for version comparison.\n     *\n     * @param string $branch Branch name (e.g. 2.1.x-dev)\n     *\n     * @return string|false Numeric prefix if present (e.g. 2.1.) or false\n     *\/","224":"\/**\n     * Normalizes a branch name to be able to perform comparisons on it.\n     *\n     * @param string $name\n     *\n     * @return string\n     *\/","225":"\/**\n     * Normalizes a default branch name (i.e. master on git) to 9999999-dev.\n     *\n     * @param string $name\n     *\n     * @return string\n     *\n     * @deprecated No need to use this anymore in theory, Composer 2 does not normalize any branch names to 9999999-dev anymore\n     *\/","226":"\/**\n     * Parses a constraint string into MultiConstraint and\/or Constraint objects.\n     *\n     * @param string $constraints\n     *\n     * @return ConstraintInterface\n     *\/","227":"\/**\n     * @param string $constraint\n     *\n     * @throws \\UnexpectedValueException\n     *\n     * @return array\n     *\n     * @phpstan-return non-empty-array<ConstraintInterface>\n     *\/","228":"\/**\n     * Increment, decrement, or simply pad a version number.\n     *\n     * Support function for {@link parseConstraint()}\n     *\n     * @param array  $matches   Array with version parts in array indexes 1,2,3,4\n     * @param int    $position  1,2,3,4 - which segment of the version to increment\/decrement\n     * @param int    $increment\n     * @param string $pad       The string to pad version parts after $position\n     *\n     * @return string|null The new version\n     *\n     * @phpstan-param string[] $matches\n     *\/","229":"\/**\n     * Expand shorthand stability string to long version.\n     *\n     * @param string $stability\n     *\n     * @return string\n     *\/","232":"\/**\n     * Contains all the licenses.\n     *\n     * The array is indexed by license identifiers, which contain\n     * a numerically indexed array with license details.\n     *\n     *  [ lowercased license identifier =>\n     *      [ 0 => identifier (string), 1 => full name (string), 2 => osi certified (bool), 3 => deprecated (bool) ]\n     *    , ...\n     *  ]\n     *\n     * @var array<string, array{0: string, 1: string, 2: bool, 3: bool}>\n     *\/","234":"\/**\n     * Contains all the license exceptions.\n     *\n     * The array is indexed by license exception identifiers, which contain\n     * a numerically indexed array with license exception details.\n     *\n     *  [ lowercased exception identifier =>\n     *      [ 0 => exception identifier (string), 1 => full name (string) ]\n     *    , ...\n     *  ]\n     *\n     * @var array<string, array{0: string, 1: string}>\n     *\/","236":"\/**\n     * Returns license metadata by license identifier.\n     *\n     * This function adds a link to the full license text to the license metadata.\n     * The array returned is in the form of:\n     *\n     *  [ 0 => full name (string), 1 => osi certified, 2 => link to license text (string), 3 => deprecation status (bool) ]\n     *\n     * @param string $identifier\n     *\n     * @return array{0: string, 1: bool, 2: string, 3: bool}|null\n     *\/","237":"\/**\n     * Returns all licenses information, keyed by the lowercased license identifier.\n     *\n     * @return array{0: string, 1: string, 2: bool, 3: bool}[] Each item is [ 0 => identifier (string), 1 => full name (string), 2 => osi certified (bool), 3 => deprecated (bool) ]\n     *\/","238":"\/**\n     * Returns license exception metadata by license exception identifier.\n     *\n     * This function adds a link to the full license exception text to the license exception metadata.\n     * The array returned is in the form of:\n     *\n     *  [ 0 => full name (string), 1 => link to license text (string) ]\n     *\n     * @param string $identifier\n     *\n     * @return array{0: string, 1: string}|null\n     *\/","239":"\/**\n     * Returns the short identifier of a license (or license exception) by full name.\n     *\n     * @param string $name\n     *\n     * @return string|null\n     *\/","240":"\/**\n     * Returns the OSI Approved status for a license by identifier.\n     *\n     * @param string $identifier\n     *\n     * @return bool\n     *\/","241":"\/**\n     * Returns the deprecation status for a license by identifier.\n     *\n     * @param string $identifier\n     *\n     * @return bool\n     *\/","242":"\/**\n     * @param string[]|string $license\n     *\n     * @throws \\InvalidArgumentException\n     *\n     * @return bool\n     *\/","248":"\/**\n     * @param string $license\n     *\n     * @throws \\RuntimeException\n     *\n     * @return bool\n     *\/","249":"\/**\n * @author John Stevenson <john-stevenson@blueyonder.co.uk>\n *\n * @phpstan-type restartData array{tmpIni: string, scannedInis: bool, scanDir: false|string, phprc: false|string, inis: string[], skipped: string}\n *\/","250":"\/**\n     * Use the original PHP configuration\n     *\n     * @return string[] Empty array of PHP cli options\n     *\/","251":"\/**\n     * Use standard restart settings\n     *\n     * @return string[] PHP cli options\n     *\/","252":"\/**\n     * Use environment variables to persist settings\n     *\n     * @return string[] Empty array of PHP cli options\n     *\/","253":"\/**\n     * Returns restart data if available and resets the environment\n     *\n     * @phpstan-return restartData|null\n     *\/","254":"\/**\n     * Updates a restart settings value in the environment\n     *\n     * @param string $name\n     * @param string|false $value\n     *\/","255":"\/**\n * Process utility functions\n *\n * @author John Stevenson <john-stevenson@blueyonder.co.uk>\n *\/","256":"\/**\n     * Escapes a string to be used as a shell argument.\n     *\n     * From https:\/\/github.com\/johnstevenson\/winbox-args\n     * MIT Licensed (c) John Stevenson <john-stevenson@blueyonder.co.uk>\n     *\n     * @param string $arg  The argument to be escaped\n     * @param bool $meta Additionally escape cmd.exe meta characters\n     * @param bool $module The argument is the module to invoke\n     *\/","257":"\/**\n     * Escapes an array of arguments that make up a shell command\n     *\n     * @param string[] $args Argument list, with the module name first\n     *\/","258":"\/**\n     * Makes putenv environment changes available in $_SERVER and $_ENV\n     *\n     * @param string $name\n     * @param ?string $value A null value unsets the variable\n      *\/","259":"\/**\n * @author John Stevenson <john-stevenson@blueyonder.co.uk>\n * @internal\n *\/","263":"\/** @var LoggerInterface|null *\/","265":"\/** @var float *\/","266":"\/**\n     * @param string $envAllowXdebug Prefixed _ALLOW_XDEBUG name\n     * @param bool $debug Whether debug output is required\n     *\/","267":"\/**\n     * Activates status message output to a PSR3 logger\n     *\n     * @return void\n     *\/","268":"\/**\n     * Calls a handler method to report a message\n     *\n     * @throws \\InvalidArgumentException If $op is not known\n     *\/","269":"\/**\n     * Outputs a status message\n     *\/","270":"\/**\n     * Checking status message\n     *\/","271":"\/**\n     * Error status message\n     *\/","272":"\/**\n     * Info status message\n     *\/","273":"\/**\n     * No restart status message\n     *\/","274":"\/**\n     * Restart status message\n     *\/","275":"\/**\n     * Restarted status message\n     *\/","276":"\/**\n     * Restarting status message\n     *\/","277":"\/**\n     * Returns the _ALLOW_XDEBUG environment variable as name=value\n     *\/","278":"\/**\n     * Returns the Xdebug status and version\n     *\/","279":"\/**\n * @author John Stevenson <john-stevenson@blueyonder.co.uk>\n *\n * @phpstan-import-type restartData from PhpConfig\n *\/","293":"\/** @var Status *\/","294":"\/**\n     * Constructor\n     *\n     * The $envPrefix is used to create distinct environment variables. It is\n     * uppercased and prepended to the default base values. For example 'myapp'\n     * would result in MYAPP_ALLOW_XDEBUG and MYAPP_ORIGINAL_INIS.\n     *\n     * @param string $envPrefix Value used in environment variables\n     * @throws \\RuntimeException If the parameter is invalid\n     *\/","295":"\/**\n     * Activates status message output to a PSR3 logger\n     *\/","296":"\/**\n     * Sets the main script location if it cannot be called from argv\n     *\/","297":"\/**\n     * Persist the settings to keep Xdebug out of sub-processes\n     *\/","298":"\/**\n     * Checks if Xdebug is loaded and the process needs to be restarted\n     *\n     * This behaviour can be disabled by setting the MYAPP_ALLOW_XDEBUG\n     * environment variable to 1. This variable is used internally so that\n     * the restarted process is created only once.\n     *\/","299":"\/**\n     * Returns an array of php.ini locations with at least one entry\n     *\n     * The equivalent of calling php_ini_loaded_file then php_ini_scanned_files.\n     * The loaded ini location is the first entry and may be an empty string.\n     *\n     * @return non-empty-list<string>\n     *\/","300":"\/**\n     * Returns an array of restart settings or null\n     *\n     * Settings will be available if the current process was restarted, or\n     * called with the settings from an existing restart.\n     *\n     * @phpstan-return restartData|null\n     *\/","301":"\/**\n     * Returns the Xdebug version that triggered a successful restart\n     *\/","302":"\/**\n     * Returns whether Xdebug is loaded and active\n     *\n     * true: if Xdebug is loaded and is running in an active mode.\n     * false: if Xdebug is not loaded, or it is running with xdebug.mode=off.\n     *\/","303":"\/**\n     * Allows an extending class to decide if there should be a restart\n     *\n     * The default is to restart if Xdebug is loaded and its mode is not \"off\".\n     *\/","304":"\/**\n     * Allows an extending class to access the tmpIni\n     *\n     * @param non-empty-list<string> $command\n     *\/","305":"\/**\n     * Executes the restarted command then deletes the tmp ini\n     *\n     * @param non-empty-list<string> $command\n     * @phpstan-return never\n     *\/","306":"\/**\n     * Returns the command line array if everything was written for the restart\n     *\n     * If any of the following fails (however unlikely) we must return false to\n     * stop potential recursion:\n     *   - tmp ini file creation\n     *   - environment variable creation\n     *\n     * @return non-empty-list<string>|null\n     *\/","307":"\/**\n     * Returns true if the tmp ini file was written\n     *\n     * @param non-empty-list<string> $iniFiles All ini files used in the current process\n     *\/","308":"\/**\n     * Returns the command line arguments for the restart\n     *\n     * @param non-empty-list<string> $argv\n     * @return non-empty-list<string>\n     *\/","309":"\/**\n     * Returns true if the restart environment variables were set\n     *\n     * No need to update $_SERVER since this is set in the restarted process.\n     *\n     * @param non-empty-list<string> $iniFiles All ini files used in the current process\n     *\/","310":"\/**\n     * Logs status messages\n     *\/","311":"\/**\n     * Returns default, changed and command-line ini settings\n     *\n     * @param mixed[] $loadedConfig All current ini settings\n     * @param mixed[] $iniConfig Settings from user ini files\n     *\n     *\/","312":"\/**\n     * Returns true if the script name can be used\n     *\n     * @param non-empty-list<string> $argv\n     *\/","313":"\/**\n     * Adds restart settings to the environment\n     *\n     * @param non-empty-list<string> $envArgs\n     *\/","314":"\/**\n     * Syncs settings and the environment if called with existing settings\n     *\n     * @phpstan-param restartData $settings\n     *\/","315":"\/**\n     * Returns true if there are no known configuration issues\n     *\/","316":"\/**\n     * Enables async signals and control interrupts in the restarted process\n     *\n     * Available on Unix PHP 7.1+ with the pcntl extension and Windows PHP 7.4+.\n     *\/","317":"\/**\n     * Returns $_SERVER['argv'] if it is as expected\n     *\n     * @return non-empty-list<string>|null\n     *\/","318":"\/**\n     * Sets static properties $xdebugActive, $xdebugVersion and $xdebugMode\n     *\/","319":"\/**\n * @final\n *\/","320":"\/**\n     * @var object[] List of objects copied.\n     *\/","321":"\/**\n     * Filters to apply.\n     *\n     * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs.\n     *\/","322":"\/**\n     * Type Filters to apply.\n     *\n     * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs.\n     *\/","325":"\/**\n     * @param bool $useCloneMethod   If set to true, when an object implements the __clone() function, it will be used\n     *                               instead of the regular deep cloning.\n     *\/","326":"\/**\n     * If enabled, will not throw an exception when coming across an uncloneable property.\n     *\n     * @param $skipUncloneable\n     *\n     * @return $this\n     *\/","327":"\/**\n     * Deep copies the given object.\n     *\n     * @param mixed $object\n     *\n     * @return mixed\n     *\/","328":"\/**\n     * Copy an array\n     * @param array $array\n     * @return array\n     *\/","329":"\/**\n     * Copies an object.\n     *\n     * @param object $object\n     *\n     * @throws CloneException\n     *\n     * @return object\n     *\/","330":"\/**\n     * Returns first filter that matches variable, `null` if no such filter found.\n     *\n     * @param array $filterRecords Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and\n     *                             'matcher' with value of type {@see TypeMatcher}\n     * @param mixed $var\n     *\n     * @return TypeFilter|null\n     *\/","331":"\/**\n     * Returns first element that matches predicate, `null` if no such element found.\n     *\n     * @param array    $elements Array of ['filter' => Filter, 'matcher' => Matcher] pairs.\n     * @param callable $predicate Predicate arguments are: element.\n     *\n     * @return array|null Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and 'matcher'\n     *                    with value of type {@see TypeMatcher} or `null`.\n     *\/","332":"\/**\n * Defines a decorator filter that will not stop the chain of filters.\n *\/","333":"\/**\n     * @var Filter\n     *\/","335":"\/**\n     * Copies the object property doctrine collection.\n     *\n     * {@inheritdoc}\n     *\/","337":"\/**\n     * Sets the object property to an empty doctrine collection.\n     *\n     * @param object   $object\n     * @param string   $property\n     * @param callable $objectCopier\n     *\/","339":"\/**\n     * Triggers the magic method __load() on a Doctrine Proxy class to load the\n     * actual entity from the database.\n     *\n     * {@inheritdoc}\n     *\/","340":"\/**\n * Filter to apply to a property while copying an object\n *\/","341":"\/**\n     * Applies the filter to the object.\n     *\n     * @param object   $object\n     * @param string   $property\n     * @param callable $objectCopier\n     *\/","342":"\/**\n     * Keeps the value of the object property.\n     *\n     * {@inheritdoc}\n     *\/","344":"\/**\n     * @var callable\n     *\/","345":"\/**\n     * @param callable $callable Will be called to get the new value for each property to replace\n     *\/","346":"\/**\n     * Replaces the object property by the result of the callback called with the object property.\n     *\n     * {@inheritdoc}\n     *\/","348":"\/**\n     * Sets the object property to null.\n     *\n     * {@inheritdoc}\n     *\/","350":"\/**\n     * Matches a Doctrine Proxy class.\n     *\n     * {@inheritdoc}\n     *\/","351":"\/**\n     * @param object $object\n     * @param string $property\n     *\n     * @return boolean\n     *\/","355":"\/**\n     * @param string $class    Class name\n     * @param string $property Property name\n     *\/","356":"\/**\n     * Matches a specific property of a specific class.\n     *\n     * {@inheritdoc}\n     *\/","359":"\/**\n     * @param string $property Property name\n     *\/","360":"\/**\n     * Matches a property by its name.\n     *\n     * {@inheritdoc}\n     *\/","361":"\/**\n * Matches a property by its type.\n *\n * It is recommended to use {@see DeepCopy\\TypeFilter\\TypeFilter} instead, as it applies on all occurrences\n * of given type in copied context (eg. array elements), not just on object properties.\n *\n * @final\n *\/","363":"\/**\n     * @param string $propertyType Property type\n     *\/","364":"\/**\n     * {@inheritdoc}\n     *\/","365":"\/**\n     * Retrieves all properties (including private ones), from object and all its ancestors.\n     *\n     * Standard \\ReflectionClass->getProperties() does not return private properties from ancestor classes.\n     *\n     * @author muratyaman@gmail.com\n     * @see http:\/\/php.net\/manual\/en\/reflectionclass.getproperties.php\n     *\n     * @param ReflectionClass $ref\n     *\n     * @return ReflectionProperty[]\n     *\/","366":"\/**\n     * Retrieves property by name from object and all its ancestors.\n     *\n     * @param object|string $object\n     * @param string $name\n     *\n     * @throws PropertyException\n     * @throws ReflectionException\n     *\n     * @return ReflectionProperty\n     *\/","367":"\/**\n * @final\n *\n * @deprecated Will be removed in 2.0. This filter will no longer be necessary in PHP 7.1+.\n *\/","368":"\/**\n     * {@inheritdoc}\n     *\n     * @param DateInterval $element\n     *\n     * @see http:\/\/news.php.net\/php.bugs\/205076\n     *\/","370":"\/**\n     * {@inheritdoc}\n     *\n     * @param DatePeriod $element\n     *\n     * @see http:\/\/news.php.net\/php.bugs\/205076\n     *\/","373":"\/**\n     * @param callable $callable Will be called to get the new value for each element to replace\n     *\/","377":"\/**\n * In PHP 7.4 the storage of an ArrayObject isn't returned as\n * ReflectionProperty. So we deep copy its array copy.\n *\/","378":"\/**\n     * @var DeepCopy\n     *\/","380":"\/**\n * @deprecated Use {@see SplDoublyLinkedListFilter} instead.\n *\/","384":"\/**\n     * Applies the filter to the object.\n     *\n     * @param mixed $element\n     *\/","386":"\/**\n     * @param string $type\n     *\/","387":"\/**\n     * @param mixed $element\n     *\n     * @return boolean\n     *\/","388":"\/**\n * Annotations class.\n *\/","389":"\/**\n     * Value property. Common among all derived classes.\n     *\n     * @var mixed\n     *\/","390":"\/** @param array<string, mixed> $data Key-value for properties to be defined in this class. *\/","391":"\/**\n     * Error handler for unknown property accessor in Annotation class.\n     *\n     * @throws BadMethodCallException\n     *\/","392":"\/**\n     * Error handler for unknown property mutator in Annotation class.\n     *\n     * @param mixed $value Property value.\n     *\n     * @throws BadMethodCallException\n     *\/","393":"\/**\n * Description of AnnotationException\n *\/","394":"\/**\n     * Creates a new AnnotationException describing a Syntax error.\n     *\n     * @return AnnotationException\n     *\/","395":"\/**\n     * Creates a new AnnotationException describing a Semantical error.\n     *\n     * @return AnnotationException\n     *\/","396":"\/**\n     * Creates a new AnnotationException describing an error which occurred during\n     * the creation of the annotation.\n     *\n     * @return AnnotationException\n     *\/","397":"\/**\n     * Creates a new AnnotationException describing a type error.\n     *\n     * @return AnnotationException\n     *\/","398":"\/**\n     * Creates a new AnnotationException describing a constant semantical error.\n     *\n     * @return AnnotationException\n     *\/","399":"\/**\n     * Creates a new AnnotationException describing an type error of an attribute.\n     *\n     * @param mixed $actual\n     *\n     * @return AnnotationException\n     *\/","400":"\/**\n     * Creates a new AnnotationException describing an required error of an attribute.\n     *\n     * @return AnnotationException\n     *\/","401":"\/**\n     * Creates a new AnnotationException describing a invalid enummerator.\n     *\n     * @param mixed $given\n     * @phpstan-param list<string> $available\n     *\n     * @return AnnotationException\n     *\/","402":"\/** @return AnnotationException *\/","404":"\/**\n * A reader for docblock annotations.\n *\/","405":"\/**\n     * Global map for imports.\n     *\n     * @var array<string, class-string>\n     *\/","406":"\/**\n     * A list with annotations that are not causing exceptions when not resolved to an annotation class.\n     *\n     * The names are case sensitive.\n     *\n     * @var array<string, true>\n     *\/","408":"\/**\n     * Annotations parser.\n     *\n     * @var DocParser\n     *\/","409":"\/**\n     * Annotations parser used to collect parsing metadata.\n     *\n     * @var DocParser\n     *\/","410":"\/**\n     * PHP parser used to collect imports.\n     *\n     * @var PhpParser\n     *\/","411":"\/**\n     * In-memory cache mechanism to store imported annotations per class.\n     *\n     * @psalm-var array<'class'|'function', array<string, array<string, class-string>>>\n     *\/","412":"\/**\n     * In-memory cache mechanism to store ignored annotations per class.\n     *\n     * @psalm-var array<'class'|'function', array<string, array<string, true>>>\n     *\/","413":"\/**\n     * Add a new annotation to the globally ignored annotation names with regard to exception handling.\n     *\/","414":"\/**\n     * Add a new annotation to the globally ignored annotation namespaces with regard to exception handling.\n     *\/","415":"\/**\n     * Initializes a new AnnotationReader.\n     *\n     * @throws AnnotationException\n     *\/","422":"\/**\n     * Gets the annotations applied to a function.\n     *\n     * @phpstan-return list<object> An array of Annotations.\n     *\/","423":"\/**\n     * Gets a function annotation.\n     *\n     * @return object|null The Annotation or NULL, if the requested annotation does not exist.\n     *\/","424":"\/**\n     * Returns the ignored annotations for the given class or function.\n     *\n     * @param ReflectionClass|ReflectionFunction $reflection\n     *\n     * @return array<string, true>\n     *\/","425":"\/**\n     * Retrieves imports for a class or a function.\n     *\n     * @param ReflectionClass|ReflectionFunction $reflection\n     *\n     * @return array<string, class-string>\n     *\/","426":"\/**\n     * Retrieves imports for methods.\n     *\n     * @return array<string, class-string>\n     *\/","427":"\/**\n     * Retrieves imports for properties.\n     *\n     * @return array<string, class-string>\n     *\/","428":"\/**\n     * Collects parsing metadata for a given class or function.\n     *\n     * @param ReflectionClass|ReflectionFunction $reflection\n     *\/","429":"\/**\n     * An array of classes which cannot be found\n     *\n     * @var null[] indexed by class name\n     *\/","430":"\/**\n     * Autoloads an annotation class silently.\n     *\/","431":"\/**\n * Annotation that can be used to signal to the parser\n * to check the attribute type during the parsing process.\n *\n * @Annotation\n *\/","435":"\/**\n * Annotation that can be used to signal to the parser\n * to check the types of all declared attributes during the parsing process.\n *\n * @Annotation\n *\/","436":"\/** @var array<Attribute> *\/","437":"\/**\n * Annotation that can be used to signal to the parser\n * to check the available values during the parsing process.\n *\n * @Annotation\n * @Attributes({\n *    @Attribute(\"value\",   required = true,  type = \"array\"),\n *    @Attribute(\"literal\", required = false, type = \"array\")\n * })\n *\/","438":"\/** @phpstan-var list<scalar> *\/","439":"\/**\n     * Literal target declaration.\n     *\n     * @var mixed[]\n     *\/","440":"\/**\n     * @phpstan-param array{literal?: mixed[], value: list<scalar>} $values\n     *\n     * @throws InvalidArgumentException\n     *\/","441":"\/**\n * Annotation that can be used to signal to the parser to ignore specific\n * annotations during the parsing process.\n *\n * @Annotation\n *\/","442":"\/** @phpstan-var list<string> *\/","443":"\/**\n     * @phpstan-param array{value: string|list<string>} $values\n     *\n     * @throws RuntimeException\n     *\/","444":"\/**\n * Annotation that indicates that the annotated class should be constructed with a named argument call.\n *\n * @Annotation\n * @Target(\"CLASS\")\n *\/","445":"\/**\n * Annotation that can be used to signal to the parser\n * to check if that attribute is required during the parsing process.\n *\n * @Annotation\n *\/","446":"\/**\n * Annotation that can be used to signal to the parser\n * to check the annotation target during the parsing process.\n *\n * @Annotation\n *\/","447":"\/** @var array<string, int> *\/","449":"\/**\n     * Targets as bitmask.\n     *\n     * @var int\n     *\/","450":"\/**\n     * Literal target declaration.\n     *\n     * @var string\n     *\/","451":"\/**\n     * @phpstan-param array{value?: string|list<string>} $values\n     *\n     * @throws InvalidArgumentException\n     *\/","452":"\/**\n * Simple lexer for docblock annotations.\n *\n * @template-extends AbstractLexer<DocLexer::T_*, string>\n *\/","453":"\/** @var array<string, self::T*> *\/","455":"\/**\n     * The next token in the input.\n     *\n     * @var Token<T, V>|null\n     *\/","456":"\/**\n     * The last matched\/seen token.\n     *\n     * @var Token<T, V>|null\n     *\/","457":"\/**\n     * Whether the next token starts immediately, or if there were\n     * non-captured symbols before that\n     *\/","461":"\/**\n     * Sets the input data to be tokenized.\n     *\n     * The Lexer is immediately reset and the new input tokenized.\n     * Any unprocessed tokens from any previous input are lost.\n     *\n     * @param string $input The input to be tokenized.\n     *\n     * @return void\n     *\/","462":"\/**\n     * Resets the lexer.\n     *\n     * @return void\n     *\/","463":"\/**\n     * Resets the peek pointer to 0.\n     *\n     * @return void\n     *\/","464":"\/**\n     * Resets the lexer position on the input to the given position.\n     *\n     * @param int $position Position to place the lexical scanner.\n     *\n     * @return void\n     *\/","465":"\/**\n     * Retrieve the original lexer's input until a given position.\n     *\n     * @return string\n     *\/","466":"\/**\n     * Checks whether a given token matches the current lookahead.\n     *\n     * @param T $type\n     *\n     * @return bool\n     *\n     * @psalm-assert-if-true !=null $this->lookahead\n     *\/","467":"\/**\n     * Checks whether any of the given tokens matches the current lookahead.\n     *\n     * @param list<T> $types\n     *\n     * @return bool\n     *\n     * @psalm-assert-if-true !=null $this->lookahead\n     *\/","468":"\/**\n     * Moves to the next token in the input string.\n     *\n     * @return bool\n     *\n     * @psalm-assert-if-true !null $this->lookahead\n     *\/","469":"\/**\n     * Tells the lexer to skip input tokens until it sees a token with the given value.\n     *\n     * @param T $type The token type to skip until.\n     *\n     * @return void\n     *\/","470":"\/**\n     * Checks if given value is identical to the given token.\n     *\n     * @return bool\n     *\/","471":"\/**\n     * Moves the lookahead token forward.\n     *\n     * @return Token<T, V>|null The next token or NULL if there are no more tokens ahead.\n     *\/","472":"\/**\n     * Peeks at the next token, returns it and immediately resets the peek.\n     *\n     * @return Token<T, V>|null The next token or NULL if there are no more tokens ahead.\n     *\/","473":"\/**\n     * Scans the input string for tokens.\n     *\n     * @param string $input A query string.\n     *\n     * @return void\n     *\/","474":"\/**\n     * Gets the literal for a given token.\n     *\n     * @param T $token\n     *\n     * @return int|string\n     *\/","475":"\/**\n     * Regex modifiers\n     *\n     * @return string\n     *\/","476":"\/**\n * A parser for docblock annotations.\n *\n * It is strongly discouraged to change the default annotation parsing process.\n *\n * @psalm-type Arguments = array{positional_arguments?: array<int, mixed>, named_arguments?: array<string, mixed>}\n *\/","477":"\/**\n     * An array of all valid tokens for a class name.\n     *\n     * @phpstan-var list<int>\n     *\/","478":"\/**\n     * The lexer.\n     *\n     * @var DocLexer\n     *\/","479":"\/**\n     * Current target context.\n     *\n     * @var int\n     *\/","480":"\/**\n     * Doc parser used to collect annotation target.\n     *\n     * @var DocParser\n     *\/","481":"\/**\n     * Flag to control if the current annotation is nested or not.\n     *\n     * @var bool\n     *\/","482":"\/**\n     * Hashmap containing all use-statements that are to be used when parsing\n     * the given doc block.\n     *\n     * @var array<string, class-string>\n     *\/","483":"\/**\n     * This hashmap is used internally to cache results of class_exists()\n     * look-ups.\n     *\n     * @var array<class-string, bool>\n     *\/","484":"\/**\n     * Whether annotations that have not been imported should be ignored.\n     *\n     * @var bool\n     *\/","485":"\/**\n     * An array of default namespaces if operating in simple mode.\n     *\n     * @var string[]\n     *\/","486":"\/**\n     * A list with annotations that are not causing exceptions when not resolved to an annotation class.\n     *\n     * The names must be the raw names as used in the class, not the fully qualified\n     *\n     * @var bool[] indexed by annotation name\n     *\/","487":"\/**\n     * A list with annotations in namespaced format\n     * that are not causing exceptions when not resolved to an annotation class.\n     *\n     * @var bool[] indexed by namespace name\n     *\/","489":"\/**\n     * Hash-map for caching annotation metadata.\n     *\n     * @var array<class-string, mixed[]>\n     *\/","490":"\/**\n     * Hash-map for handle types declaration.\n     *\n     * @var array<string, string>\n     *\/","491":"\/**\n     * Constructs a new DocParser.\n     *\/","492":"\/**\n     * Sets the annotation names that are ignored during the parsing process.\n     *\n     * The names are supposed to be the raw names as used in the class, not the\n     * fully qualified class names.\n     *\n     * @param bool[] $names indexed by annotation name\n     *\n     * @return void\n     *\/","493":"\/**\n     * Sets the annotation namespaces that are ignored during the parsing process.\n     *\n     * @param bool[] $ignoredAnnotationNamespaces indexed by annotation namespace name\n     *\n     * @return void\n     *\/","494":"\/**\n     * Sets ignore on not-imported annotations.\n     *\n     * @return void\n     *\/","495":"\/**\n     * Sets the default namespaces.\n     *\n     * @return void\n     *\n     * @throws RuntimeException\n     *\/","496":"\/**\n     * Sets the imports.\n     *\n     * @param array<string, class-string> $imports\n     *\n     * @return void\n     *\n     * @throws RuntimeException\n     *\/","497":"\/**\n     * Sets current target context as bitmask.\n     *\n     * @return void\n     *\/","498":"\/**\n     * Parses the given docblock string for annotations.\n     *\n     * @phpstan-return list<object> Array of annotations. If no annotations are found, an empty array is returned.\n     *\n     * @throws AnnotationException\n     * @throws ReflectionException\n     *\/","499":"\/**\n     * Finds the first valid annotation\n     *\/","500":"\/**\n     * Attempts to match the given token with the current lookahead token.\n     * If they match, updates the lookahead token; otherwise raises a syntax error.\n     *\n     * @param int $token Type of token.\n     *\n     * @return bool True if tokens match; false otherwise.\n     *\n     * @throws AnnotationException\n     *\/","501":"\/**\n     * Attempts to match the current lookahead token with any of the given tokens.\n     *\n     * If any of them matches, this method updates the lookahead token; otherwise\n     * a syntax error is raised.\n     *\n     * @phpstan-param list<mixed[]> $tokens\n     *\n     * @throws AnnotationException\n     *\/","502":"\/**\n     * Generates a new syntax error.\n     *\n     * @param string       $expected Expected string.\n     * @param mixed[]|null $token    Optional token.\n     *\/","503":"\/**\n     * Attempts to check if a class exists or not. This never goes through the PHP autoloading mechanism\n     * but uses the {@link AnnotationRegistry} to load classes.\n     *\n     * @param class-string $fqcn\n     *\/","504":"\/**\n     * Collects parsing metadata for a given annotation class\n     *\n     * @param class-string $name The annotation name\n     *\n     * @throws AnnotationException\n     * @throws ReflectionException\n     *\/","505":"\/**\n     * Collects parsing metadata for a given attribute.\n     *\n     * @param mixed[] $metadata\n     *\/","506":"\/**\n     * Annotations ::= Annotation {[ \"*\" ]* [Annotation]}*\n     *\n     * @phpstan-return list<object>\n     *\n     * @throws AnnotationException\n     * @throws ReflectionException\n     *\/","507":"\/**\n     * Annotation     ::= \"@\" AnnotationName MethodCall\n     * AnnotationName ::= QualifiedName | SimpleName\n     * QualifiedName  ::= NameSpacePart \"\\\" {NameSpacePart \"\\\"}* SimpleName\n     * NameSpacePart  ::= identifier | null | false | true\n     * SimpleName     ::= identifier | null | false | true\n     *\n     * @return object|false False if it is not a valid annotation.\n     *\n     * @throws AnnotationException\n     * @throws ReflectionException\n     *\/","508":"\/**\n     * MethodCall ::= [\"(\" [Values] \")\"]\n     *\n     * @psalm-return Arguments\n     *\n     * @throws AnnotationException\n     * @throws ReflectionException\n     *\/","509":"\/**\n     * Values ::= Array | Value {\",\" Value}* [\",\"]\n     *\n     * @psalm-return Arguments\n     *\n     * @throws AnnotationException\n     * @throws ReflectionException\n     *\/","510":"\/**\n     * Constant ::= integer | string | float | boolean\n     *\n     * @return mixed\n     *\n     * @throws AnnotationException\n     *\/","511":"\/** @return int|false *\/","512":"\/**\n     * Identifier ::= string\n     *\n     * @throws AnnotationException\n     *\/","513":"\/**\n     * Value ::= PlainValue | FieldAssignment\n     *\n     * @return mixed\n     *\n     * @throws AnnotationException\n     * @throws ReflectionException\n     *\/","514":"\/**\n     * PlainValue ::= integer | string | float | boolean | Array | Annotation\n     *\n     * @return mixed\n     *\n     * @throws AnnotationException\n     * @throws ReflectionException\n     *\/","515":"\/**\n     * FieldAssignment ::= FieldName \"=\" PlainValue\n     * FieldName ::= identifier\n     *\n     * @throws AnnotationException\n     * @throws ReflectionException\n     *\/","516":"\/**\n     * Array ::= \"{\" ArrayEntry {\",\" ArrayEntry}* [\",\"] \"}\"\n     *\n     * @return mixed[]\n     *\n     * @throws AnnotationException\n     * @throws ReflectionException\n     *\/","517":"\/**\n     * ArrayEntry ::= Value | KeyValuePair\n     * KeyValuePair ::= Key (\"=\" | \":\") PlainValue | Constant\n     * Key ::= string | integer | Constant\n     *\n     * @phpstan-return array{mixed, mixed}\n     *\n     * @throws AnnotationException\n     * @throws ReflectionException\n     *\/","518":"\/**\n     * Checks whether the given $name matches any ignored annotation name or namespace\n     *\/","519":"\/**\n     * Resolve positional arguments (without name) to named ones\n     *\n     * @psalm-param Arguments $arguments\n     *\n     * @return array<string,mixed>\n     *\/","520":"\/**\n     * Try to instantiate the annotation and catch and process any exceptions related to failure\n     *\n     * @param class-string        $name\n     * @param array<string,mixed> $arguments\n     *\n     * @return object\n     *\n     * @throws AnnotationException\n     *\/","521":"\/**\n *  A list of annotations that are implicitly ignored during the parsing process.\n *\n *  All names are case sensitive.\n *\/","522":"\/**\n * Allows the reader to be used in-place of Doctrine's reader.\n *\/","523":"\/** @var Reader *\/","530":"\/**\n     * Proxies all methods to the delegate.\n     *\n     * @param mixed[] $args\n     *\n     * @return mixed\n     *\/","531":"\/**\n * Parses a file for namespaces\/use\/class declarations.\n *\/","532":"\/**\n     * Parse a class or function for use statements.\n     *\n     * @param ReflectionClass|ReflectionFunction $reflection\n     *\n     * @psalm-return array<string, string> a list with use statements in the form (Alias => FQN).\n     *\/","533":"\/**\n     * Gets the content of the file right up to the given line number.\n     *\n     * @param string $filename   The name of the file to load.\n     * @param int    $lineNumber The number of lines to read from file.\n     *\n     * @return string|null The content of the file or null if the file does not exist.\n     *\/","534":"\/**\n * A cache aware annotation reader.\n *\/","536":"\/** @var CacheItemPoolInterface *\/","538":"\/** @var array<string, array<object>> *\/","539":"\/** @var int[] *\/","546":"\/** @return mixed[] *\/","547":"\/**\n     * Used in debug mode to check if the cache is fresh.\n     *\n     * @return bool Returns true if the cache was fresh, or false if the class\n     * being read was modified since writing to the cache.\n     *\/","548":"\/**\n     * Returns the time the class was last modified, testing traits and parents\n     *\/","549":"\/**\n * Interface for annotation readers.\n *\/","550":"\/**\n     * Gets the annotations applied to a class.\n     *\n     * @param ReflectionClass $class The ReflectionClass of the class from which\n     * the class annotations should be read.\n     *\n     * @return array<object> An array of Annotations.\n     *\/","551":"\/**\n     * Gets a class annotation.\n     *\n     * @param ReflectionClass $class          The ReflectionClass of the class from which\n     *          the class annotations should be read.\n     * @param class-string<T> $annotationName The name of the annotation.\n     *\n     * @return T|null The Annotation or NULL, if the requested annotation does not exist.\n     *\n     * @template T\n     *\/","552":"\/**\n     * Gets the annotations applied to a method.\n     *\n     * @param ReflectionMethod $method The ReflectionMethod of the method from which\n     * the annotations should be read.\n     *\n     * @return array<object> An array of Annotations.\n     *\/","553":"\/**\n     * Gets a method annotation.\n     *\n     * @param ReflectionMethod $method         The ReflectionMethod to read the annotations from.\n     * @param class-string<T>  $annotationName The name of the annotation.\n     *\n     * @return T|null The Annotation or NULL, if the requested annotation does not exist.\n     *\n     * @template T\n     *\/","554":"\/**\n     * Gets the annotations applied to a property.\n     *\n     * @param ReflectionProperty $property The ReflectionProperty of the property\n     * from which the annotations should be read.\n     *\n     * @return array<object> An array of Annotations.\n     *\/","555":"\/**\n     * Gets a property annotation.\n     *\n     * @param ReflectionProperty $property       The ReflectionProperty to read the annotations from.\n     * @param class-string<T>    $annotationName The name of the annotation.\n     *\n     * @return T|null The Annotation or NULL, if the requested annotation does not exist.\n     *\n     * @template T\n     *\/","557":"\/**\n     * The token list.\n     *\n     * @phpstan-var list<mixed[]>\n     *\/","558":"\/**\n     * The number of tokens.\n     *\n     * @var int\n     *\/","559":"\/**\n     * The current array pointer.\n     *\n     * @var int\n     *\/","560":"\/**\n     * Gets the next non whitespace and non comment token.\n     *\n     * @param bool $docCommentIsComment If TRUE then a doc comment is considered a comment and skipped.\n     * If FALSE then only whitespace and normal comments are skipped.\n     *\n     * @return mixed[]|string|null The token if exists, null otherwise.\n     *\/","561":"\/**\n     * Parses a single use statement.\n     *\n     * @return array<string, string> A list with all found class names for a use statement.\n     *\/","562":"\/**\n     * Gets all use statements.\n     *\n     * @param string $namespaceName The namespace name of the reflected class.\n     *\n     * @return array<string, string> A list with all found use statements.\n     *\/","563":"\/**\n     * Gets the namespace.\n     *\n     * @return string The found namespace.\n     *\/","564":"\/**\n     * Gets the class name.\n     *\n     * @return string The found class name.\n     *\/","565":"\/**\n * Base class for writing simple lexers, i.e. for creating small DSLs.\n *\n * @template T of UnitEnum|string|int\n * @template V of string|int\n *\/","566":"\/**\n     * Lexer original input string.\n     *\/","567":"\/**\n     * Array of scanned tokens.\n     *\n     * @var list<Token<T, V>>\n     *\/","568":"\/**\n     * Current lexer position in input string.\n     *\/","569":"\/**\n     * Current peek of current lexer position.\n     *\/","572":"\/**\n     * Composed regex for input parsing.\n     *\n     * @var non-empty-string|null\n     *\/","588":"\/**\n     * Lexical catchable patterns.\n     *\n     * @return string[]\n     *\/","589":"\/**\n     * Lexical non-catchable patterns.\n     *\n     * @return string[]\n     *\/","590":"\/**\n     * Retrieve token type. Also processes the token value if necessary.\n     *\n     * @return T|null\n     *\n     * @param-out V $value\n     *\/","591":"\/**\n * @template T of UnitEnum|string|int\n * @template V of string|int\n *\/","592":"\/**\n     * The string value of the token in the input string\n     *\n     * @readonly\n     * @var V\n     *\/","593":"\/**\n     * The type of the token (identifier, numeric, string, input parameter, none)\n     *\n     * @readonly\n     * @var T|null\n     *\/","594":"\/**\n     * The position of the token in the input string\n     *\n     * @readonly\n     *\/","595":"\/**\n     * @param V      $value\n     * @param T|null $type\n     *\/","596":"\/** @param T ...$types *\/","597":"\/**\n * Manages Deprecation logging in different ways.\n *\n * By default triggered exceptions are not logged.\n *\n * To enable different deprecation logging mechanisms you can call the\n * following methods:\n *\n *  - Minimal collection of deprecations via getTriggeredDeprecations()\n *    \\Doctrine\\Deprecations\\Deprecation::enableTrackingDeprecations();\n *\n *  - Uses @trigger_error with E_USER_DEPRECATED\n *    \\Doctrine\\Deprecations\\Deprecation::enableWithTriggerError();\n *\n *  - Sends deprecation messages via a PSR-3 logger\n *    \\Doctrine\\Deprecations\\Deprecation::enableWithPsrLogger($logger);\n *\n * Packages that trigger deprecations should use the `trigger()` or\n * `triggerIfCalledFromOutside()` methods.\n *\/","598":"\/** @var int-mask-of<self::TYPE_*>|null *\/","600":"\/** @var array<string,bool> *\/","601":"\/** @var array<string,int> *\/","604":"\/**\n     * Trigger a deprecation for the given package and identfier.\n     *\n     * The link should point to a Github issue or Wiki entry detailing the\n     * deprecation. It is additionally used to de-duplicate the trigger of the\n     * same deprecation during a request.\n     *\n     * @param float|int|string $args\n     *\/","605":"\/**\n     * Trigger a deprecation for the given package and identifier when called from outside.\n     *\n     * \"Outside\" means we assume that $package is currently installed as a\n     * dependency and the caller is not a file in that package. When $package\n     * is installed as a root package then deprecations triggered from the\n     * tests folder are also considered \"outside\".\n     *\n     * This deprecation method assumes that you are using Composer to install\n     * the dependency and are using the default \/vendor\/ folder and not a\n     * Composer plugin to change the install location. The assumption is also\n     * that $package is the exact composer packge name.\n     *\n     * Compared to {@link trigger()} this method causes some overhead when\n     * deprecation tracking is enabled even during deduplication, because it\n     * needs to call {@link debug_backtrace()}\n     *\n     * @param float|int|string $args\n     *\/","606":"\/** @param list<array{function: string, line?: int, file?: string, class?: class-string, type?: string, args?: mixed[], object?: object}> $backtrace *\/","607":"\/**\n     * A non-local-aware version of PHPs basename function.\n     *\/","608":"\/**\n     * Returns each triggered deprecation link identifier and the amount of occurrences.\n     *\n     * @return array<string,int>\n     *\/","609":"\/** @return int-mask-of<self::TYPE_*> *\/","612":"\/** @before *\/","613":"\/** @after *\/","614":"\/**\n     * @var list<CpuCoreFinder>\n     *\/","615":"\/**\n     * @var positive-int|null\n     *\/","616":"\/**\n     * @param list<CpuCoreFinder>|null $finders\n     *\/","617":"\/**\n     * @param positive-int|0    $reservedCpus      Number of CPUs to reserve. This is useful when you want\n     *                                             to reserve some CPUs for other processes. If the main\n     *                                             process is going to be busy still, you may want to set\n     *                                             this value to 1.\n     * @param non-zero-int|null $countLimit        The maximum number of CPUs to return. If not provided, it\n     *                                             may look for a limit in the environment variables, e.g.\n     *                                             KUBERNETES_CPU_LIMIT. If negative, the limit will be\n     *                                             the total number of cores found minus the absolute value.\n     *                                             For instance if the system has 10 cores and countLimit=-2,\n     *                                             then the effective limit considered will be 8.\n     * @param float|null        $loadLimit         Element of [0., 1.]. Percentage representing the\n     *                                             amount of cores that should be used among the available\n     *                                             resources. For instance, if set to 0.7, it will use 70%\n     *                                             of the available cores, i.e. if 1 core is reserved, 11\n     *                                             cores are available and 5 are busy, it will use 70%\n     *                                             of (11-1-5)=5 cores, so 3 cores. Set this parameter to null\n     *                                             to skip this check. Beware that 1 does not mean \"no limit\",\n     *                                             but 100% of the _available_ resources, i.e. with the\n     *                                             previous example, it will return 5 cores. How busy is\n     *                                             the system is determined by the system load average\n     *                                             (see $systemLoadAverage).\n     * @param float|null        $systemLoadAverage The system load average. If passed, it will use\n     *                                             this information to limit the available cores based\n     *                                             on the _available_ resources. For instance, if there\n     *                                             is 10 cores but 3 are busy, then only 7 cores will\n     *                                             be considered for further calculation. If set to\n     *                                             `null`, it will use `sys_getloadavg()` to check the\n     *                                             load of the system in the past minute. You can\n     *                                             otherwise pass an arbitrary value. Should be a\n     *                                             positive float.\n     *\n     * @see https:\/\/php.net\/manual\/en\/function.sys-getloadavg.php\n     *\/","618":"\/**\n     * @throws NumberOfCpuCoreNotFound\n     *\n     * @return positive-int\n     *\/","619":"\/**\n     * @param positive-int $fallback\n     *\n     * @return positive-int\n     *\/","620":"\/**\n     * This method is mostly for debugging purposes.\n     *\/","622":"\/**\n     * @throws NumberOfCpuCoreNotFound\n     *\n     * @return array{CpuCoreFinder, positive-int}\n     *\/","623":"\/**\n     * @return positive-int|null\n     *\/","624":"\/**\n * Utility to debug.\n *\n * @private\n *\/","625":"\/**\n     * Provides an aggregated diagnosis based on each finders diagnosis.\n     *\n     * @param list<CpuCoreFinder> $finders\n     *\/","626":"\/**\n     * Executes each finders.\n     *\n     * @param list<CpuCoreFinder> $finders\n     *\/","627":"\/**\n     * @return array{string, string}|null STDOUT & STDERR tuple\n     *\/","628":"\/**\n * Find the number of logical CPU cores for Windows leveraging the Get-CimInstance\n * cmdlet, which is a newer version that is recommended over Get-WmiObject.\n *\/","630":"\/**\n * Find the number of physical CPU cores for Windows.\n *\n * @see https:\/\/github.com\/paratestphp\/paratest\/blob\/c163539818fd96308ca8dc60f46088461e366ed4\/src\/Runners\/PHPUnit\/Options.php#L912-L916\n *\/","632":"\/**\n     * Provides an explanation which may offer some insight as to what the finder\n     * will be able to find.\n     *\n     * This is practical to have an idea of what each finder will find collect\n     * information for the unit tests, since integration tests are quite complicated\n     * as dependent on complex infrastructures.\n     *\/","633":"\/**\n     * Find the number of CPU cores. If it could not find it, returns null. The\n     * means used to find the cores are at the implementation discretion.\n     *\n     * @return positive-int|null\n     *\/","634":"\/**\n * Find the number of CPU cores looking up at the cpuinfo file which is available\n * on Linux systems and Windows systems with a Linux sub-system.\n *\n * @see https:\/\/github.com\/paratestphp\/paratest\/blob\/c163539818fd96308ca8dc60f46088461e366ed4\/src\/Runners\/PHPUnit\/Options.php#L903-L909\n * @see https:\/\/unix.stackexchange.com\/questions\/146051\/number-of-processors-in-proc-cpuinfo\n *\/","636":"\/**\n     * @internal\n     *\n     * @return positive-int|null\n     *\/","637":"\/**\n * This finder returns whatever value you gave to it. This is useful for testing\n * or as a fallback to avoid to catch the NumberOfCpuCoreNotFound exception.\n *\/","638":"\/**\n     * @var positive-int\n     *\/","639":"\/**\n     * @param positive-int $count\n     *\/","641":"\/**\n     * @param string|false $value\n     *\/","642":"\/**\n     * @return list<CpuCoreFinder> List of all the known finders with all their variants.\n     *\/","643":"\/**\n     * @return list<CpuCoreFinder>\n     *\/","645":"\/**\n * Find the number of logical CPU cores for Linux, BSD and OSX.\n *\n * @see https:\/\/github.com\/paratestphp\/paratest\/blob\/c163539818fd96308ca8dc60f46088461e366ed4\/src\/Runners\/PHPUnit\/Options.php#L903-L909\n * @see https:\/\/opensource.apple.com\/source\/xnu\/xnu-792.2.4\/libkern\/libkern\/sysctl.h.auto.html\n *\/","648":"\/**\n * Find the number of physical CPU cores for Linux, BSD and OSX.\n *\n * @see https:\/\/github.com\/paratestphp\/paratest\/blob\/c163539818fd96308ca8dc60f46088461e366ed4\/src\/Runners\/PHPUnit\/Options.php#L903-L909\n * @see https:\/\/opensource.apple.com\/source\/xnu\/xnu-792.2.4\/libkern\/libkern\/sysctl.h.auto.html\n *\/","651":"\/**\n * The number of logical cores.\n *\n * @see https:\/\/stackoverflow.com\/a\/23378780\/5846754\n *\/","653":"\/**\n * The number of physical processors.\n *\n * @see https:\/\/stackoverflow.com\/a\/23378780\/5846754\n *\/","655":"\/**\n * The number of (logical) cores.\n *\n * @see https:\/\/github.com\/infection\/infection\/blob\/fbd8c44\/src\/Resource\/Processor\/CpuCoresCountProvider.php#L69-L82\n * @see https:\/\/unix.stackexchange.com\/questions\/146051\/number-of-processors-in-proc-cpuinfo\n *\/","657":"\/**\n     * @param bool $all If disabled will give the number of cores available for the current process\n     *                  only. This is disabled by default as it is known to be \"buggy\" on virtual\n     *                  environments as the virtualization tool, e.g. VMWare, might over-commit\n     *                  resources by default.\n     *\/","660":"\/**\n * Find the number of logical CPU cores for FreeSBD, Solaris and the likes.\n *\n * @see https:\/\/twitter.com\/freebsdfrau\/status\/1052016199452700678?s=20&t=M2pHkRqmmna-UF68lfL2hw\n *\/","663":"\/**\n * This finder returns whatever value you gave to it. This is useful for testing.\n *\/","664":"\/**\n     * @var CpuCoreFinder\n     *\/","665":"\/**\n     * @var list<string>\n     *\/","667":"\/**\n     * @param string|list<string> $skippedOSFamilyOrFamilies\n     *\/","668":"\/**\n     * @var ProcessExecutor\n     *\/","674":"\/**\n * Find the number of logical CPU cores for Windows.\n *\n * @see https:\/\/knowledge.informatica.com\/s\/article\/151521\n *\/","676":"\/**\n * Find the number of logical CPU cores for Windows.\n *\n * @see https:\/\/github.com\/paratestphp\/paratest\/blob\/c163539818fd96308ca8dc60f46088461e366ed4\/src\/Runners\/PHPUnit\/Options.php#L912-L916\n *\/","680":"\/**\n * Find the number of logical CPU cores for Linux and the likes.\n *\n * @see https:\/\/twitter.com\/freebsdfrau\/status\/1052016199452700678?s=20&t=M2pHkRqmmna-UF68lfL2hw\n *\/","683":"\/**\n * @readonly\n *\/","684":"\/**\n     * @var positive-int|0\n     *\/","685":"\/**\n     * @var non-zero-int|null\n     *\/","686":"\/**\n     * @var float|null\n     *\/","692":"\/**\n     * @param positive-int|0    $passedReservedCpus\n     * @param non-zero-int|null $passedCountLimit\n     * @param non-zero-int|null $correctedCountLimit\n     * @param positive-int      $totalCoresCount\n     * @param positive-int      $availableCpus\n     *\/","693":"\/**\n * The attribute specifies possible array keys and their types.\n *\n * If applied, an IDE will suggest the specified array keys, infer the specified types, and highlight non-specified keys in array access expressions.\n *\n * Array shapes should be specified with the required $shape parameter whose values should be array literals.<br \/>\n *\n * Example: <br \/>\n * <b>#[ArrayShape([\"f\" => \"int\", \"string\", \"x\" => \"float\"])]<\/b>\n * This usage applied on an element effectively means that the array has 3 dimensions, the keys are \"f\", 1, and \"x\", and the corresponding types are \"int\", \"string\", and \"float\".\n *\/","694":"\/**\n     * Mark element as deprecated\n     *\n     * @param string $reason Reason for deprecation. It will be displayed by PhpStorm via the Deprecated inspection instead of the  default message\n     * @param string $replacement Applicable only to function\/method calls: IDE will suggest replacing a deprecated function call with the provided code template.\n     * The following variables are available in this template:\n     * <ul>\n     * <li>%parametersList%: parameters of the function call. For example, for the \"f(1,2)\" call, %parametersList% will be \"1,2\"<\/li>\n     * <li>%parameter0%,%parameter1%,%parameter2%,...: parameters of the function call. For example, for the \"f(1,2)\" call, %parameter1% will be \"2\"<\/li>\n     * <li>%name%: For \"\\x\\f(1,2)\", %name% will be \"\\x\\f\", for \"$this->ff()\", %name% will be \"ff\"<\/li>\n     * <li>%class%: If the attribute is provided for method \"m\", then for \"$this->f()->m()\", %class% will be \"$this->f()\"<\/li>\n     * <\/ul>\n     * The following example shows how to wrap a function call in another call and swap arguments:<br \/>\n     * \"#[Deprecated(replacement: \"wrappedCall(%name%(%parameter1%, %parameter0%))\")] f($a, $b){}<br \/>\n     * f(1,2) will be replaced with wrappedCall(f(2,1))\n     * @param string $since Element is deprecated starting with the provided PHP language level, applicable only for PhpStorm stubs entries\n     *\/","695":"\/**\n * The attribute specifies the expected values of an entity: return values for functions and arguments' values for methods.\n *\n * If the attribute is applied, PhpStorm assumes that only the arguments specified in the attribute constructor can\n * be passed\/returned. This will affect the following:\n * <ul>\n * <li><i>Code completion<\/i> - expected arguments are displayed on the top of the suggestions list when used in comparison expressions<\/li>\n * <li><i>Inspections [when used in a comparison with a value\/assignment to\/return from method]<\/i> - the element absent from the expected values list produces the inspection warning<\/li>\n * <li><i>Code generation<\/i> - for example, when generating the 'switch' statement, all possible expected values are inserted automatically<\/li>\n * <\/ul>\n *\n * Expected values can be any of the following:\n * <ul>\n * <li>numbers<\/li>\n * <li>string literals<\/li>\n * <li>constant references<\/li>\n * <li>class constant references<\/li>\n * <\/ul>\n *\n * Expected arguments can be specified in any of the following ways:\n * <ul>\n * <li><b>#[ExpectedValues(values: [1,2,3])]<\/b> means that one of the following is expected: `1`, `2`, or `3`<\/li>\n * <li><b>#[ExpectedValues(values: MY_CONST]<\/b> - default value of MY_CONST is expected to be array creation expression, in this case value of MY_CONST will be inlined<\/li>\n * <li><b>#[ExpectedValues(flags: [1,2,3])]<\/b> means that a bitmask of the following is expected: `1`, `2`, or `3`<\/li>\n * <li><b>#[ExpectedValues(valuesFromClass: MyClass::class)]<\/b> means that one of the constants from the class `MyClass` is expected<\/li>\n * <li><b>#[ExpectedValues(flagsFromClass: ExpectedValues::class)]<\/b> means that a bitmask of the constants from the class `MyClass` is expected<\/li>\n * <\/ul>\n *\n * The attribute with the number of provided constructor arguments different from 1 will result in undefined behavior.\n * @since 8.0\n *\/","696":"\/**\n * Mark a property (or all class properties in the case of a class) as immutable.\n * By default, an IDE highlights write accesses on such properties if they are located outside a constructor (this scope is customizable, see below).\n *\n * You can provide a custom allowed write scope by using the following values:\n * <ul>\n * <li>{@link Immutable::CONSTRUCTOR_WRITE_SCOPE}: write is allowed only in containing class constructor (default choice)<\/li>\n * <li>{@link Immutable::PRIVATE_WRITE_SCOPE}: write is allowed only in places where the property would be accessible if it had 'private' visibility modifier<\/li>\n * <li>{@link Immutable::PROTECTED_WRITE_SCOPE}: write is allowed only in places where the property would be accessible if it had 'protected' visibility modifier<\/li>\n * <\/ul>\n * @since 8.0\n *\/","697":"\/**\n * Specifies that the parameter is a string that represents source code in a different language.\n * An IDE will automatically inject the specified language into the passed string literals.\n *\n * @since 8.0\n *\/","698":"\/**\n     * @param string $languageName Language name like \"PHP\", \"SQL\", \"RegExp\", etc...\n     *\/","699":"\/**\n * You can use this facility to mark the function as halting the execution flow.\n * Such marked functions will be treated like die() or exit() calls by control flow inspections.\n * In most cases, just annotation function with 0 arguments will work.\n * To mark the function as the exit point only when it's called with some constant arguments, specify them in $arguments param\n *\n * {@see NoReturn::ANY_ARGUMENT}\n *\/","700":"\/**\n     * Use this constant to skip function argument on the specified position\n     *\/","701":"\/**\n * The attribute specifies possible object field names and their types.\n *\n * If applied, an IDE will suggest the specified field names and infer the specified types.\n *\n * Example:\n * <pre>#[ObjectShape([\"age\" => \"int\", \"name\" => \"string\"])]<\/pre>\n *\n * This usage applied on an element effectively means that the object has 2 fields, the names are <code>\"age\"<\/code> and <code>\"name\"<\/code>, and the corresponding types are <code>\"int\"<\/code> and <code>\"string\"<\/code>.\n *\/","702":"\/**\n * The attribute marks the function that has no impact on the program state or passed parameters used after the function execution.\n * This means that a function call that resolves to such a function can be safely removed if the execution result is not used in code afterwards.\n *\n * @since 8.0\n *\/","703":"\/**\n     * @param bool $mayDependOnGlobalScope Whether the function result may be dependendent on anything except passed variables\n     *\/","704":"\/**\n * @phpstan-import-type ComponentMap from UriInterface\n *\/","707":"\/**\n     * @param UriFactoryInterface|null $uriFactory Deprecated, will be removed in the next major release\n     *\/","708":"\/**\n     * Returns the Unix filesystem path.\n     *\n     * The method will return null if a scheme is present and is not the `file` scheme\n     *\/","709":"\/**\n     * Returns the Windows filesystem path.\n     *\n     * The method will return null if a scheme is present and is not the `file` scheme\n     *\/","710":"\/**\n     * Returns a string representation of a File URI according to RFC8089.\n     *\n     * The method will return null if the URI scheme is not the `file` scheme\n     *\/","711":"\/**\n     * Tells whether the `file` scheme base URI represents a local file.\n     *\/","712":"\/**\n     * Tells whether the URI is opaque or not.\n     *\n     * A URI is opaque if and only if it is absolute\n     * and does not has an authority path.\n     *\/","713":"\/**\n     * Tells whether two URI do not share the same origin.\n     *\/","714":"\/**\n     * Tells whether the URI is absolute.\n     *\/","715":"\/**\n     * Tells whether the URI is a network path.\n     *\/","716":"\/**\n     * Tells whether the URI is an absolute path.\n     *\/","717":"\/**\n     * Tells whether the URI is a relative path.\n     *\/","718":"\/**\n     * Tells whether both URI refers to the same document.\n     *\/","719":"\/**\n     * Tells whether the URI contains an Internationalized Domain Name (IDN).\n     *\/","720":"\/**\n     * Tells whether the URI contains an IPv4 regardless if it is mapped or native.\n     *\/","721":"\/**\n     * Resolves a URI against a base URI using RFC3986 rules.\n     *\n     * This method MUST retain the state of the submitted URI instance, and return\n     * a URI instance of the same type that contains the applied modifications.\n     *\n     * This method MUST be transparent when dealing with error and exceptions.\n     * It MUST not alter or silence them apart from validating its own parameters.\n     *\/","722":"\/**\n     * Relativize a URI according to a base URI.\n     *\n     * This method MUST retain the state of the submitted URI instance, and return\n     * a URI instance of the same type that contains the applied modifications.\n     *\n     * This method MUST be transparent when dealing with error and exceptions.\n     * It MUST not alter of silence them apart from validating its own parameters.\n     *\/","723":"\/**\n     * Normalizes a URI for comparison; this URI string representation is not suitable for usage as per RFC guidelines.\n     *\/","724":"\/**\n     * Input URI normalization to allow Stringable and string URI.\n     *\/","725":"\/**\n     * Remove dot segments from the URI path as per RFC specification.\n     *\/","726":"\/**\n     * Resolves an URI path and query component.\n     *\n     * @return array{0:string, 1:string|null}\n     *\/","727":"\/**\n     * Tells whether the component value from both URI object equals.\n     *\n     * @pqram 'query'|'authority'|'scheme' $property\n     *\/","728":"\/**\n     * Filter the URI object.\n     *\/","729":"\/**\n     * Tells whether the submitted URI object can be relativized.\n     *\/","730":"\/**\n     * Relatives the URI for an authority-less target URI.\n     *\/","731":"\/**\n     * returns the path segments.\n     *\n     * @return string[]\n     *\/","732":"\/**\n     * Formatting the path to keep a valid URI.\n     *\/","733":"\/**\n     * Formatting the path to keep a resolvable URI.\n     *\/","734":"\/**\n     * Returns the host component of the authority.\n     *\/","735":"\/**\n     * Returns the port component of the authority.\n     *\/","736":"\/**\n     * Returns the user information component of the authority.\n     *\/","737":"\/**\n     * Returns an associative array containing all the Authority components.\n     *\n     * The returned a hashmap similar to PHP's parse_url return value\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986\n     *\n     * @return array{user: ?string, pass : ?string, host: ?string, port: ?int}\n     *\/","738":"\/**\n     * Return an instance with the specified host.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified host.\n     *\n     * A null value provided for the host is equivalent to removing the host\n     * information.\n     *\n     * @throws SyntaxError for invalid component or transformations\n     *                     that would result in an object in invalid state.\n     * @throws MissingFeature for component or transformations\n     *                        requiring IDN support when IDN support is not present\n     *                        or misconfigured.\n     *\/","739":"\/**\n     * Return an instance with the specified port.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified port.\n     *\n     * A null value provided for the port is equivalent to removing the port\n     * information.\n     *\n     * @throws SyntaxError for invalid component or transformations\n     *                     that would result in an object in invalid state.\n     *\/","740":"\/**\n     * Return an instance with the specified user information.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified user information.\n     *\n     * Password is optional, but the user information MUST include the\n     * user; a null value for the user is equivalent to removing user\n     * information.\n     *\n     * @throws SyntaxError for invalid component or transformations\n     *                     that would result in an object in invalid state.\n     *\/","741":"\/**\n     * Returns the instance string representation.\n     *\n     * If the instance is defined, the value returned MUST be percent-encoded,\n     * but MUST NOT double-encode any characters. To determine what characters\n     * to encode, please refer to RFC 3986, Sections 2 and 3.\n     *\n     * If the instance is not defined null is returned\n     *\/","742":"\/**\n     * Returns the instance string representation.\n     *\n     * If the instance is defined, the value returned MUST be percent-encoded,\n     * but MUST NOT double-encode any characters. To determine what characters\n     * to encode, please refer to RFC 3986, Sections 2 and 3.\n     *\n     * If the instance is not defined an empty string is returned\n     *\/","744":"\/**\n     * Returns the instance json representation.\n     *\n     * If the instance is defined, the value returned MUST be percent-encoded,\n     * but MUST NOT double-encode any characters. To determine what characters\n     * to encode, please refer to RFC 3986 or RFC 1738.\n     *\n     * If the instance is not defined null is returned\n     *\/","745":"\/**\n     * Returns the instance string representation with its optional URI delimiters.\n     *\n     * The value returned MUST be percent-encoded, but MUST NOT double-encode any\n     * characters. To determine what characters to encode, please refer to RFC 3986,\n     * Sections 2 and 3.\n     *\n     * If the instance is not defined an empty string is returned\n     *\/","746":"\/**\n     * Retrieve the data mime type associated to the URI.\n     *\n     * If no mimetype is present, this method MUST return the default mimetype 'text\/plain'.\n     *\n     * @see http:\/\/tools.ietf.org\/html\/rfc2397#section-2\n     *\/","747":"\/**\n     * Retrieve the parameters associated with the Mime Type of the URI.\n     *\n     * If no parameters is present, this method MUST return the default parameter 'charset=US-ASCII'.\n     *\n     * @see http:\/\/tools.ietf.org\/html\/rfc2397#section-2\n     *\/","748":"\/**\n     * Retrieve the mediatype associated with the URI.\n     *\n     * If no mediatype is present, this method MUST return the default parameter 'text\/plain;charset=US-ASCII'.\n     *\n     * @see http:\/\/tools.ietf.org\/html\/rfc2397#section-3\n     *\n     * @return string The URI scheme.\n     *\/","749":"\/**\n     * Retrieves the data string.\n     *\n     * Retrieves the data part of the path. If no data part is provided return\n     * an empty string\n     *\/","750":"\/**\n     * Tells whether the data is binary safe encoded.\n     *\/","751":"\/**\n     * Save the data to a specific file.\n     *\/","752":"\/**\n     * Returns an instance where the data part is base64 encoded.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance where the data part is base64 encoded\n     *\/","753":"\/**\n     * Returns an instance where the data part is url encoded following RFC3986 rules.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance where the data part is url encoded\n     *\/","754":"\/**\n     * Return an instance with the specified mediatype parameters.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified mediatype parameters.\n     *\n     * Users must provide encoded characters.\n     *\n     * An empty parameters value is equivalent to removing the parameter.\n     *\/","755":"\/**\n     * Returns the decoded path.\n     *\/","756":"\/**\n     * Tells whether the path is absolute or relative.\n     *\/","757":"\/**\n     * Tells whether the path has a trailing slash.\n     *\/","758":"\/**\n     * Returns an instance without dot segments.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the path component normalized by removing\n     * the dot segment.\n     *\n     * @throws SyntaxError for invalid component or transformations\n     *                     that would result in a object in invalid state.\n     *\/","759":"\/**\n     * Returns an instance with a leading slash.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the path component with a leading slash\n     *\n     * @throws SyntaxError for invalid component or transformations\n     *                     that would result in a object in invalid state.\n     *\/","760":"\/**\n     * Returns an instance without a leading slash.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the path component without a leading slash\n     *\n     * @throws SyntaxError for invalid component or transformations\n     *                     that would result in a object in invalid state.\n     *\/","761":"\/**\n     * Returns an instance with a trailing slash.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the path component with a trailing slash\n     *\n     * @throws SyntaxError for invalid component or transformations\n     *                     that would result in a object in invalid state.\n     *\/","762":"\/**\n     * Returns an instance without a trailing slash.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the path component without a trailing slash\n     *\n     * @throws SyntaxError for invalid component or transformations\n     *                     that would result in a object in invalid state.\n     *\/","768":"\/**\n * @extends IteratorAggregate<string>\n *\/","769":"\/**\n     * Returns the labels total number.\n     *\/","770":"\/**\n     * Iterate over the Domain labels.\n     *\n     * @return Iterator<string>\n     *\/","771":"\/**\n     * Retrieves a single host label.\n     *\n     * If the label offset has not been set, returns the null value.\n     *\/","772":"\/**\n     * Returns the associated key for a specific label or all the keys.\n     *\n     * @return int[]\n     *\/","773":"\/**\n     * Tells whether the domain is absolute.\n     *\/","774":"\/**\n     * Prepends a label to the host.\n     *\/","775":"\/**\n     * Appends a label to the host.\n     *\/","776":"\/**\n     * Extracts a slice of $length elements starting at position $offset from the host.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the selected slice.\n     *\n     * If $length is null it returns all elements from $offset to the end of the Domain.\n     *\/","777":"\/**\n     * Returns an instance with its Root label.\n     *\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-3.2.2\n     *\/","778":"\/**\n     * Returns an instance without its Root label.\n     *\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-3.2.2\n     *\/","779":"\/**\n     * Returns an instance with the modified label.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the new label\n     *\n     * If $key is non-negative, the added label will be the label at $key position from the start.\n     * If $key is negative, the added label will be the label at $key position from the end.\n     *\n     * @throws SyntaxError If the key is invalid\n     *\/","780":"\/**\n     * Returns an instance without the specified label.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the modified component\n     *\n     * If $key is non-negative, the removed label will be the label at $key position from the start.\n     * If $key is negative, the removed label will be the label at $key position from the end.\n     *\n     * @throws SyntaxError If the key is invalid\n     *\/","781":"\/**\n     * Returns the ascii representation.\n     *\/","782":"\/**\n     * Returns the unicode representation.\n     *\/","783":"\/**\n     * Returns the IP version.\n     *\n     * If the host is a not an IP this method will return null\n     *\/","784":"\/**\n     * Returns the IP component If the Host is an IP address.\n     *\n     * If the host is a not an IP this method will return null\n     *\/","785":"\/**\n     * Tells whether the host is a domain name.\n     *\/","786":"\/**\n     * Tells whether the host is an IP Address.\n     *\/","787":"\/**\n     * Tells whether the host is a registered name.\n     *\/","793":"\/**\n     * Returns the decoded fragment.\n     *\/","811":"\/**\n     * Tells whether the host is an IPv4 address.\n     *\/","812":"\/**\n     * Tells whether the host is an IPv6 address.\n     *\/","814":"\/**\n     * Tells whether the host has a ZoneIdentifier.\n     *\n     * @see http:\/\/tools.ietf.org\/html\/rfc6874#section-4\n     *\/","815":"\/**\n     * Returns a host without its zone identifier according to RFC6874.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance without the host zone identifier according to RFC6874\n     *\n     * @see http:\/\/tools.ietf.org\/html\/rfc6874#section-4\n     *\/","841":"\/**\n     * Returns the integer representation of the Port.\n     *\/","847":"\/**\n * @extends IteratorAggregate<array{0:string, 1:string|null}>\n *\n * @method self withoutPairByKey(string ...$keys) Returns an instance without pairs with the specified keys.\n * @method self withoutPairByValue(Stringable|string|int|bool|null ...$values) Returns an instance without pairs with the specified values.\n * @method self withoutPairByKeyValue(string $key, Stringable|string|int|bool|null $value) Returns an instance without pairs with the specified key\/value pair\n * @method bool hasPair(string $key, ?string $value) Tells whether the pair exists in the query.\n * @method ?string toFormData() Returns the string representation using the applicat\/www-form-urlencoded rules\n * @method ?string toRFC3986() Returns the string representation using RFC3986 rules\n *\/","848":"\/**\n     * Returns the query separator.\n     *\n     * @return non-empty-string\n     *\/","849":"\/**\n     * Returns the number of key\/value pairs present in the object.\n     *\/","850":"\/**\n     * Returns an iterator allowing to go through all key\/value pairs contained in this object.\n     *\n     * The pair is represented as an array where the first value is the pair key\n     * and the second value the pair value.\n     *\n     * The key of each pair is a string\n     * The value of each pair is a scalar or the null value\n     *\n     * @return Iterator<int, array{0:string, 1:string|null}>\n     *\/","851":"\/**\n     * Returns an iterator allowing to go through all key\/value pairs contained in this object.\n     *\n     * The return type is as an Iterator where its offset is the pair key and its value the pair value.\n     *\n     * The key of each pair is a string\n     * The value of each pair is a scalar or the null value\n     *\n     * @return iterable<string, string|null>\n     *\/","852":"\/**\n     * Tells whether a list of pair with a specific key exists.\n     *\n     * @see https:\/\/url.spec.whatwg.org\/#dom-urlsearchparams-has\n     *\/","853":"\/**\n     * Returns the first value associated to the given pair name.\n     *\n     * If no value is found null is returned\n     *\n     * @see https:\/\/url.spec.whatwg.org\/#dom-urlsearchparams-get\n     *\/","854":"\/**\n     * Returns all the values associated to the given pair name as an array or all\n     * the instance pairs.\n     *\n     * If no value is found an empty array is returned\n     *\n     * @see https:\/\/url.spec.whatwg.org\/#dom-urlsearchparams-getall\n     *\n     * @return array<int, string|null>\n     *\/","855":"\/**\n     * Returns the store PHP variables as elements of an array.\n     *\n     * The result is similar as PHP parse_str when used with its\n     * second argument with the difference that variable names are\n     * not mangled.\n     *\n     * @see http:\/\/php.net\/parse_str\n     * @see https:\/\/wiki.php.net\/rfc\/on_demand_name_mangling\n     *\n     * @return array the collection of stored PHP variables or the empty array if no input is given,\n     *\/","856":"\/**\n     * Returns the value attached to the specific key.\n     *\n     * The result is similar to PHP parse_str with the difference that variable\n     * names are not mangled.\n     *\n     * If a key is submitted it will return the value attached to it or null\n     *\n     * @see http:\/\/php.net\/parse_str\n     * @see https:\/\/wiki.php.net\/rfc\/on_demand_name_mangling\n     *\n     * @return mixed the collection of stored PHP variables or the empty array if no input is given,\n     *               the single value of a stored PHP variable or null if the variable is not present in the collection\n     *\/","857":"\/**\n     * Tells whether a list of variable with specific names exists.\n     *\n     * @see https:\/\/url.spec.whatwg.org\/#dom-urlsearchparams-has\n     *\/","858":"\/**\n     * Returns the RFC1738 encoded query.\n     *\/","859":"\/**\n     * Returns an instance with a different separator.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the query component with a different separator\n     *\/","860":"\/**\n     * Returns an instance with the new pairs set to it.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the modified query\n     *\n     * @see ::withPair\n     *\/","861":"\/**\n     * Returns an instance with the new pairs appended to it.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the modified query\n     *\n     * If the pair already exists the value will be added to it.\n     *\/","862":"\/**\n     * Returns a new instance with a specified key\/value pair appended as a new pair.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the modified query\n     *\/","863":"\/**\n     * Sorts the query string by offset, maintaining offset to data correlations.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the modified query\n     *\n     * @see https:\/\/url.spec.whatwg.org\/#dom-urlsearchparams-sort\n     *\/","864":"\/**\n     * Returns an instance without duplicate key\/value pair.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the query component normalized by removing\n     * duplicate pairs whose key\/value are the same.\n     *\/","865":"\/**\n     * Returns an instance without empty key\/value where the value is the null value.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the query component normalized by removing\n     * empty pairs.\n     *\n     * A pair is considered empty if its value is equal to the null value\n     *\/","866":"\/**\n     * Returns an instance where numeric indices associated to PHP's array like key are removed.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the query component normalized so that numeric indexes\n     * are removed from the pair key value.\n     *\n     * i.e.: toto[3]=bar[3]&foo=bar becomes toto[]=bar[3]&foo=bar\n     *\/","867":"\/**\n     * Returns an instance with a new key\/value pair added to it.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the modified query\n     *\n     * If the pair already exists the value will replace the existing value.\n     *\n     * @see https:\/\/url.spec.whatwg.org\/#dom-urlsearchparams-set\n     *\/","868":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @deprecated Since version 7.3.0\n     * @codeCoverageIgnore\n     * @see QueryInterface::withoutPairByKey()\n     *\n     * Returns an instance without the specified keys.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the modified component\n     *\/","869":"\/**\n     * Returns an instance without the specified params.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the modified component without PHP's value.\n     * PHP's mangled is not taken into account.\n     *\/","876":"\/**\n     * Returns the total number of segments in the path.\n     *\/","877":"\/**\n     * Iterate over the path segment.\n     *\n     * @return Iterator<string>\n     *\/","878":"\/**\n     * Returns parent directory's path.\n     *\/","879":"\/**\n     * Returns the path basename.\n     *\/","880":"\/**\n     * Returns the basename extension.\n     *\/","881":"\/**\n     * Retrieves a single path segment.\n     *\n     * If the segment offset has not been set, returns null.\n     *\/","882":"\/**\n     * Returns the associated key for a specific segment.\n     *\n     * If a value is specified only the keys associated with\n     * the given value will be returned\n     *\n     * @return array<int>\n     *\/","883":"\/**\n     * Appends a segment to the path.\n     *\/","884":"\/**\n     * Extracts a slice of $length elements starting at position $offset from the host.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the selected slice.\n     *\n     * If $length is null it returns all elements from $offset to the end of the Path.\n     *\/","885":"\/**\n     * Prepends a segment to the path.\n     *\/","886":"\/**\n     * Returns an instance with the modified segment.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the new segment\n     *\n     * If $key is non-negative, the added segment will be the segment at $key position from the start.\n     * If $key is negative, the added segment will be the segment at $key position from the end.\n     *\n     * @throws SyntaxError If the key is invalid\n     *\/","887":"\/**\n     * Returns an instance without the specified segment.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the modified component\n     *\n     * If $key is non-negative, the removed segment will be the segment at $key position from the start.\n     * If $key is negative, the removed segment will be the segment at $key position from the end.\n     *\n     * @throws SyntaxError If the key is invalid\n     *\/","888":"\/**\n     * Returns an instance without duplicate delimiters.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the path component normalized by removing\n     * multiple consecutive empty segment\n     *\/","889":"\/**\n     * Returns an instance with the specified parent directory's path.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the extension basename modified.\n     *\/","890":"\/**\n     * Returns an instance with the specified basename.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the extension basename modified.\n     *\/","891":"\/**\n     * Returns an instance with the specified basename extension.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the extension basename modified.\n     *\/","905":"\/**\n     * Returns the RFC3986 string representation of the complete URI.\n     *\/","911":"\/**\n * @phpstan-import-type ComponentMap from UriString\n *\n * @method string|null getUsername() returns the user component of the URI.\n * @method string|null getPassword() returns the scheme-specific information about how to gain authorization to access the resource.\n * @method array toComponents() returns an associative array containing all the URI components.\n *\/","912":"\/**\n     * Returns the string representation as a URI reference.\n     *\n     * @see http:\/\/tools.ietf.org\/html\/rfc3986#section-4.1\n     *\/","914":"\/**\n     * Returns the string representation as a URI reference.\n     *\n     * @see http:\/\/tools.ietf.org\/html\/rfc3986#section-4.1\n     * @see ::__toString\n     *\/","915":"\/**\n     * Retrieve the scheme component of the URI.\n     *\n     * If no scheme is present, this method MUST return a null value.\n     *\n     * The value returned MUST be normalized to lowercase, per RFC 3986\n     * Section 3.1.\n     *\n     * The trailing \":\" character is not part of the scheme and MUST NOT be\n     * added.\n     *\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-3.1\n     *\/","916":"\/**\n     * Retrieve the authority component of the URI.\n     *\n     * If no scheme is present, this method MUST return a null value.\n     *\n     * If the port component is not set or is the standard port for the current\n     * scheme, it SHOULD NOT be included.\n     *\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-3.2\n     *\/","917":"\/**\n     * Retrieve the user information component of the URI.\n     *\n     * If no scheme is present, this method MUST return a null value.\n     *\n     * If a user is present in the URI, this will return that value;\n     * additionally, if the password is also present, it will be appended to the\n     * user value, with a colon (\":\") separating the values.\n     *\n     * The trailing \"@\" character is not part of the user information and MUST\n     * NOT be added.\n     *\/","918":"\/**\n     * Retrieve the host component of the URI.\n     *\n     * If no host is present this method MUST return a null value.\n     *\n     * The value returned MUST be normalized to lowercase, per RFC 3986\n     * Section 3.2.2.\n     *\n     * @see http:\/\/tools.ietf.org\/html\/rfc3986#section-3.2.2\n     *\/","919":"\/**\n     * Retrieve the port component of the URI.\n     *\n     * If a port is present, and it is non-standard for the current scheme,\n     * this method MUST return it as an integer. If the port is the standard port\n     * used with the current scheme, this method SHOULD return null.\n     *\n     * If no port is present, and no scheme is present, this method MUST return\n     * a null value.\n     *\n     * If no port is present, but a scheme is present, this method MAY return\n     * the standard port for that scheme, but SHOULD return null.\n     *\/","920":"\/**\n     * Retrieve the path component of the URI.\n     *\n     * The path can either be empty or absolute (starting with a slash) or\n     * rootless (not starting with a slash). Implementations MUST support all\n     * three syntaxes.\n     *\n     * Normally, the empty path \"\" and absolute path \"\/\" are considered equal as\n     * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically\n     * do this normalization because in contexts with a trimmed base path, e.g.\n     * the front controller, this difference becomes significant. It's the task\n     * of the user to handle both \"\" and \"\/\".\n     *\n     * The value returned MUST be percent-encoded, but MUST NOT double-encode\n     * any characters. To determine what characters to encode, please refer to\n     * RFC 3986, Sections 2 and 3.3.\n     *\n     * As an example, if the value should include a slash (\"\/\") not intended as\n     * delimiter between path segments, that value MUST be passed in encoded\n     * form (e.g., \"%2F\") to the instance.\n     *\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-2\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-3.3\n     *\/","921":"\/**\n     * Retrieve the query string of the URI.\n     *\n     * If no host is present this method MUST return a null value.\n     *\n     * The leading \"?\" character is not part of the query and MUST NOT be\n     * added.\n     *\n     * The value returned MUST be percent-encoded, but MUST NOT double-encode\n     * any characters. To determine what characters to encode, please refer to\n     * RFC 3986, Sections 2 and 3.4.\n     *\n     * As an example, if a value in a key\/value pair of the query string should\n     * include an ampersand (\"&\") not intended as a delimiter between values,\n     * that value MUST be passed in encoded form (e.g., \"%26\") to the instance.\n     *\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-2\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-3.4\n     *\/","922":"\/**\n     * Retrieve the fragment component of the URI.\n     *\n     * If no host is present this method MUST return a null value.\n     *\n     * The leading \"#\" character is not part of the fragment and MUST NOT be\n     * added.\n     *\n     * The value returned MUST be percent-encoded, but MUST NOT double-encode\n     * any characters. To determine what characters to encode, please refer to\n     * RFC 3986, Sections 2 and 3.5.\n     *\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-2\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-3.5\n     *\/","923":"\/**\n     * Returns an associative array containing all the URI components.\n     *\n     * The returned array is similar to PHP's parse_url return value with the following\n     * differences:\n     *\n     * <ul>\n     * <li>All components are present in the returned array<\/li>\n     * <li>Empty and undefined component are treated differently. And empty component is\n     *   set to the empty string while an undefined component is set to the `null` value.<\/li>\n     * <\/ul>\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986\n     *\n     * @return ComponentMap\n     *\/","924":"\/**\n     * Return an instance with the specified scheme.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified scheme.\n     *\n     * A null value provided for the scheme is equivalent to removing the scheme\n     * information.\n     *\n     * @throws SyntaxError for invalid component or transformations\n     *                     that would result in an object in invalid state.\n     *\/","928":"\/**\n     * Return an instance with the specified path.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified path.\n     *\n     * The path can either be empty or absolute (starting with a slash) or\n     * rootless (not starting with a slash). Implementations MUST support all\n     * three syntaxes.\n     *\n     * Users can provide both encoded and decoded path characters.\n     * Implementations ensure the correct encoding as outlined in getPath().\n     *\n     * @throws SyntaxError for invalid component or transformations\n     *                     that would result in an object in invalid state.\n     *\/","929":"\/**\n     * Return an instance with the specified query string.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified query string.\n     *\n     * Users can provide both encoded and decoded query characters.\n     * Implementations ensure the correct encoding as outlined in getQuery().\n     *\n     * A null value provided for the query is equivalent to removing the query\n     * information.\n     *\n     * @throws SyntaxError for invalid component or transformations\n     *                     that would result in an object in invalid state.\n     *\/","930":"\/**\n     * Return an instance with the specified URI fragment.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified URI fragment.\n     *\n     * Users can provide both encoded and decoded fragment characters.\n     * Implementations ensure the correct encoding as outlined in getFragment().\n     *\n     * A null value provided for the fragment is equivalent to removing the fragment\n     * information.\n     *\n     * @throws SyntaxError for invalid component or transformations\n     *                     that would result in an object in invalid state.\n     *\/","931":"\/**\n     * Returns the user component part.\n     *\/","932":"\/**\n     * Returns the pass component part.\n     *\/","933":"\/**\n     * Returns an associative array containing all the User Info components.\n     *\n     * The returned a hashmap similar to PHP's parse_url return value\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986\n     *\n     * @return array{user: ?string, pass : ?string}\n     *\/","934":"\/**\n     * Returns an instance with the specified user and\/or pass.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified new username\n     * otherwise it returns the same instance unchanged.\n     *\n     * A variable equal to null is equivalent to removing the complete user information.\n     *\/","935":"\/**\n     * Returns an instance with the specified user and\/or pass.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified password if the user is specified\n     * otherwise it returns the same instance unchanged.\n     *\n     * An empty user is equivalent to removing the user information.\n     *\/","941":"\/**\n     * Encode User.\n     *\n     * All generic delimiters MUST be encoded\n     *\/","942":"\/**\n     * Encode Password.\n     *\n     * Generic delimiters \":\" MUST NOT be encoded\n     *\/","943":"\/**\n     * Encode Path.\n     *\n     * Generic delimiters \":\", \"@\", and \"\/\" MUST NOT be encoded\n     *\/","944":"\/**\n     * Encode Query or Fragment.\n     *\n     * Generic delimiters \":\", \"@\", \"?\", and \"\/\" MUST NOT be encoded\n     *\/","945":"\/**\n     * Decodes the URI component without decoding the unreserved characters which are already encoded.\n     *\/","946":"\/**\n     * Decodes all the URI component characters.\n     *\/","948":"\/**\n * Allow detecting features needed to make the packages work.\n *\/","949":"\/**\n * @phpstan-import-type InputComponentMap from UriString\n *\/","950":"\/**\n     * PSR-7 UriInterface makes the following normalization.\n     *\n     * Safely stringify input when possible for League UriInterface compatibility.\n     *\n     * Query, Fragment and User Info when undefined are normalized to the empty string\n     *\/","951":"\/**\n     * Create a new instance from a string or a stringable object.\n     *\/","952":"\/**\n     * Create a new instance from a hash of parse_url parts.\n     *\n     * @param InputComponentMap $components a hash representation of the URI similar\n     *                                      to PHP parse_url function result\n     *\/","953":"\/**\n     * Create a new instance from the environment.\n     *\/","954":"\/**\n     * Create a new instance from a URI and a Base URI.\n     *\n     * The returned URI must be absolute.\n     *\/","955":"\/**\n     * Creates a new instance from a template.\n     *\n     * @throws TemplateCanNotBeExpanded if the variables are invalid or missing\n     * @throws UriException if the variables are invalid or missing\n     *\/","956":"\/**\n     * Safely stringify input when possible for League UriInterface compatibility.\n     *\/","957":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @deprecated Since version 7.0.0\n     * @codeCoverageIgnore\n     * @see Http::new()\n     *\n     * Create a new instance from a string.\n     *\/","958":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @deprecated Since version 7.0.0\n     * @codeCoverageIgnore\n     * @see Http::fromComponents()\n     *\n     * Create a new instance from a hash of parse_url parts.\n     *\n     * @param InputComponentMap $components a hash representation of the URI similar\n     *                                      to PHP parse_url function result\n     *\/","959":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @deprecated Since version 7.0.0\n     * @codeCoverageIgnore\n     * @see Http::fromServer()\n     *\n     * Create a new instance from the environment.\n     *\/","960":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @deprecated Since version 7.0.0\n     * @codeCoverageIgnore\n     * @see Http::new()\n     *\n     * Create a new instance from a URI object.\n     *\/","961":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @deprecated Since version 7.0.0\n     * @codeCoverageIgnore\n     * @see Http::fromBaseUri()\n     *\n     * Create a new instance from a URI and a Base URI.\n     *\n     * The returned URI must be absolute.\n     *\/","962":"\/**\n     * Add numbers.\n     *\n     * @param mixed $value1 a number that will be added to $value2\n     * @param mixed $value2 a number that will be added to $value1\n     *\n     * @return mixed the addition result\n     *\/","963":"\/**\n     * Subtract one number from another.\n     *\n     * @param mixed $value1 a number that will be subtracted of $value2\n     * @param mixed $value2 a number that will be subtracted to $value1\n     *\n     * @return mixed the subtraction result\n     *\/","964":"\/**\n     * Multiply numbers.\n     *\n     * @param mixed $value1 a number that will be multiplied by $value2\n     * @param mixed $value2 a number that will be multiplied by $value1\n     *\n     * @return mixed the multiplication result\n     *\/","965":"\/**\n     * Divide numbers.\n     *\n     * @param mixed $value The number being divided.\n     * @param mixed $base The number that $value is being divided by.\n     *\n     * @return mixed the result of the division\n     *\/","966":"\/**\n     * Raise an number to the power of exponent.\n     *\n     * @param mixed $value scalar, the base to use\n     *\n     * @return mixed the value raised to the power of exp.\n     *\/","967":"\/**\n     * Returns the int point remainder (modulo) of the division of the arguments.\n     *\n     * @param mixed $value The dividend\n     * @param mixed $base The divisor\n     *\n     * @return mixed the remainder\n     *\/","968":"\/**\n     * Number comparison.\n     *\n     * @param mixed $value1 the first value\n     * @param mixed $value2 the second value\n     *\n     * @return int Returns < 0 if value1 is less than value2; > 0 if value1 is greater than value2, and 0 if they are equal.\n     *\/","969":"\/**\n     * Get the decimal integer value of a variable.\n     *\n     * @param mixed $value The scalar value being converted to an integer\n     *\n     * @return mixed the integer value\n     *\/","970":"\/**\n     * Returns an instance using a GMP calculator.\n     *\/","971":"\/**\n     * Returns an instance using a Bcmath calculator.\n     *\/","972":"\/**\n     * Returns an instance using a PHP native calculator (requires 64bits PHP).\n     *\/","973":"\/**\n     * Returns an instance using a detected calculator depending on the PHP environment.\n     *\n     * @throws MissingFeature If no Calculator implementing object can be used on the platform\n     *\n     * @codeCoverageIgnore\n     *\/","974":"\/**\n     * Tries to convert a IPv4 hexadecimal or a IPv4 octal notation into a IPv4 dot-decimal notation if possible\n     * otherwise returns null.\n     *\n     * @see https:\/\/url.spec.whatwg.org\/#concept-ipv4-parser\n     *\/","975":"\/**\n     * Converts a domain label into a IPv4 integer part.\n     *\n     * @see https:\/\/url.spec.whatwg.org\/#ipv4-number-parser\n     *\n     * @return mixed returns null if it cannot correctly convert the label\n     *\/","976":"\/**\n     * Generates the dot-decimal notation for IPv4.\n     *\n     * @see https:\/\/url.spec.whatwg.org\/#concept-ipv4-parser\n     *\n     * @param mixed $ipAddress the number representation of the IPV4address\n     *\/","977":"\/**\n     * Significant 10 bits of IP to detect Zone ID regular expression pattern.\n     *\n     * @var string\n     *\/","978":"\/**\n * @see https:\/\/unicode-org.github.io\/icu-docs\/apidoc\/released\/icu4c\/uidna_8h.html\n *\/","979":"\/**\n     * General registered name regular expression.\n     *\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-3.2.2\n     * @see https:\/\/regex101.com\/r\/fptU8V\/1\n     *\/","980":"\/**\n     * Converts the input to its IDNA ASCII form or throw on failure.\n     *\n     * @see Converter::toAscii()\n     *\n     * @throws SyntaxError if the string cannot be converted to UNICODE using IDN UTS46 algorithm\n     * @throws ConversionFailed if the conversion returns error\n     *\/","981":"\/**\n     * Converts the input to its IDNA ASCII form.\n     *\n     * This method returns the string converted to IDN ASCII form\n     *\n     * @throws SyntaxError if the string cannot be converted to ASCII using IDN UTS46 algorithm\n     *\/","982":"\/**\n     * Converts the input to its IDNA UNICODE form or throw on failure.\n     *\n     * @see Converter::toUnicode()\n     *\n     * @throws ConversionFailed if the conversion returns error\n     *\/","983":"\/**\n     * Converts the input to its IDNA UNICODE form.\n     *\n     * This method returns the string converted to IDN UNICODE form\n     *\n     * @throws SyntaxError if the string cannot be converted to UNICODE using IDN UTS46 algorithm\n     *\/","984":"\/**\n     * Tells whether the submitted host is a valid IDN regardless of its format.\n     *\n     * Returns false if the host is invalid or if its conversion yield the same result\n     *\/","985":"\/**\n     * Adapted from https:\/\/github.com\/TRowbotham\/idna.\n     *\n     * @see https:\/\/github.com\/TRowbotham\/idna\/blob\/master\/src\/Idna.php#L236\n     *\/","987":"\/** array<string, int> *\/","989":"\/** @var array<Error> *\/","990":"\/**\n     * @param array{result:string, isTransitionalDifferent:bool, errors:int} $infos\n     *\/","991":"\/**\n     * @return array<Error>\n     *\/","992":"\/**\n     * @param non-empty-string $separator the query string separator\n     * @param array<string> $fromRfc3986 contains all the RFC3986 encoded characters to be converted\n     * @param array<string> $toEncoding contains all the expected encoded characters\n     *\/","993":"\/**\n     * @param non-empty-string $separator\n     *\/","996":"\/**\n     * @param non-empty-string $separator\n     *\n     * @see https:\/\/url.spec.whatwg.org\/#application\/x-www-form-urlencoded\n     *\/","997":"\/**\n     * @return non-empty-string\n     *\/","998":"\/**\n     * @return array<string, string>\n     *\/","999":"\/**\n     * @return array<non-empty-list<string|null>>\n     *\/","1000":"\/**\n     * @param iterable<array{0:string|null, 1:Stringable|string|bool|int|float|null}> $pairs\n     *\/","1002":"\/**\n     * Sets the conversion map.\n     *\n     * Each key from the iterable structure represents the RFC3986 encoded characters as string,\n     * while each value represents the expected output encoded characters\n     *\/","1003":"\/**\n * A class to parse the URI query string.\n *\n * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-3.4\n *\/","1004":"\/**\n     * @codeCoverageIgnore\n     *\/","1005":"\/**\n     * Build a query string from a list of pairs.\n     *\n     * @see QueryString::buildFromPairs()\n     * @see https:\/\/datatracker.ietf.org\/doc\/html\/rfc3986#section-2.2\n     *\n     * @param iterable<array{0:string, 1:string|float|int|bool|null}> $pairs\n     * @param non-empty-string $separator\n     *\n     * @throws SyntaxError If the encoding type is invalid\n     * @throws SyntaxError If a pair is invalid\n     *\/","1006":"\/**\n     * Build a query string from a list of pairs.\n     *\n     * The method expects the return value from Query::parse to build\n     * a valid query string. This method differs from PHP http_build_query as\n     * it does not modify parameters keys.\n     *\n     *  If a reserved character is found in a URI component and\n     *  no delimiting role is known for that character, then it must be\n     *  interpreted as representing the data octet corresponding to that\n     *  character's encoding in US-ASCII.\n     *\n     * @see https:\/\/datatracker.ietf.org\/doc\/html\/rfc3986#section-2.2\n     *\n     * @param iterable<array{0:string, 1:string|float|int|bool|null}> $pairs\n     *\n     * @throws SyntaxError If the encoding type is invalid\n     * @throws SyntaxError If a pair is invalid\n     *\/","1007":"\/**\n     * Parses the query string like parse_str without mangling the results.\n     *\n     * @see QueryString::extractFromValue()\n     * @see http:\/\/php.net\/parse_str\n     * @see https:\/\/wiki.php.net\/rfc\/on_demand_name_mangling\n     *\n     * @param non-empty-string $separator\n     *\n     * @throws SyntaxError\n     *\/","1008":"\/**\n     * Parses the query string like parse_str without mangling the results.\n     *\n     * The result is similar as PHP parse_str when used with its\n     * second argument with the difference that variable names are\n     * not mangled.\n     *\n     * @see http:\/\/php.net\/parse_str\n     * @see https:\/\/wiki.php.net\/rfc\/on_demand_name_mangling\n     *\n     * @throws SyntaxError\n     *\/","1009":"\/**\n     * Parses a query string into a collection of key\/value pairs.\n     *\n     * @param non-empty-string $separator\n     *\n     * @throws SyntaxError\n     *\n     * @return array<int, array{0:string, 1:string|null}>\n     *\/","1010":"\/**\n     * Parses a query string into a collection of key\/value pairs.\n     *\n     * @throws SyntaxError\n     *\n     * @return array<int, array{0:string, 1:string|null}>\n     *\/","1011":"\/**\n     * @param array<non-empty-list<string|null>> $pairs\n     *\n     * @return array<int, array{0:string, 1:string|null}>\n     *\/","1012":"\/**\n     * Converts a collection of key\/value pairs and returns\n     * the store PHP variables as elements of an array.\n     *\/","1013":"\/**\n     * Parses a query pair like parse_str without mangling the results array keys.\n     *\n     * <ul>\n     * <li>empty name are not saved<\/li>\n     * <li>If the value from name is duplicated its corresponding value will be overwritten<\/li>\n     * <li>if no \"[\" is detected the value is added to the return array with the name as index<\/li>\n     * <li>if no \"]\" is detected after detecting a \"[\" the value is added to the return array with the name as index<\/li>\n     * <li>if there's a mismatch in bracket usage the remaining part is dropped<\/li>\n     * <li>\u201c.\u201d and \u201c \u201d are not converted to \u201c_\u201d<\/li>\n     * <li>If there is no \u201c]\u201d, then the first \u201c[\u201d is not converted to becomes an \u201c_\u201d<\/li>\n     * <li>no whitespace trimming is done on the key value<\/li>\n     * <\/ul>\n     *\n     * @see https:\/\/php.net\/parse_str\n     * @see https:\/\/wiki.php.net\/rfc\/on_demand_name_mangling\n     * @see https:\/\/github.com\/php\/php-src\/blob\/master\/ext\/standard\/tests\/strings\/parse_str_basic1.phpt\n     * @see https:\/\/github.com\/php\/php-src\/blob\/master\/ext\/standard\/tests\/strings\/parse_str_basic2.phpt\n     * @see https:\/\/github.com\/php\/php-src\/blob\/master\/ext\/standard\/tests\/strings\/parse_str_basic3.phpt\n     * @see https:\/\/github.com\/php\/php-src\/blob\/master\/ext\/standard\/tests\/strings\/parse_str_basic4.phpt\n     *\n     * @param array $data the submitted array\n     * @param array|string $name the pair key\n     * @param string $value the pair value\n     *\/","1014":"\/**\n * @phpstan-import-type ComponentMap from UriString\n * @phpstan-import-type InputComponentMap from UriString\n *\/","1015":"\/**\n     * RFC3986 invalid characters.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-2.2\n     *\n     * @var string\n     *\/","1016":"\/**\n     * RFC3986 schema regular expression pattern.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-3.1\n     *\n     * @var string\n     *\/","1017":"\/**\n     * RFC3986 host identified by a registered name regular expression pattern.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-3.2.2\n     *\n     * @var string\n     *\/","1018":"\/**\n     * RFC3986 delimiters of the generic URI components regular expression pattern.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-2.2\n     *\n     * @var string\n     *\/","1019":"\/**\n     * RFC3986 IPvFuture regular expression pattern.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-3.2.2\n     *\n     * @var string\n     *\/","1020":"\/**\n     * RFC3986 IPvFuture host and port component.\n     *\n     * @var string\n     *\/","1022":"\/**\n     * Regular expression pattern to for file URI.\n     * <volume> contains the volume but not the volume separator.\n     * The volume separator may be URL-encoded (`|` as `%7C`) by ::formatPath(),\n     * so we account for that here.\n     *\n     * @var string\n     *\/","1023":"\/**\n     * Mimetype regular expression pattern.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc2397\n     *\n     * @var string\n     *\/","1024":"\/**\n     * Base64 content regular expression pattern.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc2397\n     *\n     * @var string\n     *\/","1025":"\/**\n     * Windows file path string regular expression pattern.\n     * <root> contains both the volume and volume separator.\n     *\n     * @var string\n     *\/","1026":"\/**\n     * Supported schemes and corresponding default port.\n     *\n     * @var array<string, int|null>\n     *\/","1027":"\/**\n     * Maximum number of cached items.\n     *\n     * @var int\n     *\/","1028":"\/**\n     * All ASCII letters sorted by typical frequency of occurrence.\n     *\n     * @var string\n     *\/","1029":"\/**\n     * Format the Scheme and Host component.\n     *\n     * @throws SyntaxError if the scheme is invalid\n     *\/","1030":"\/**\n     * Set the UserInfo component.\n     *\/","1031":"\/**\n     * Validate and Format the Host component.\n     *\/","1032":"\/**\n     * Validate and format a registered name.\n     *\n     * The host is converted to its ascii representation if needed\n     *\n     * @throws MissingFeature if the submitted host required missing or misconfigured IDN support\n     * @throws SyntaxError if the submitted host is not a valid registered name\n     * @throws ConversionFailed if the submitted IDN host cannot be converted to a valid ascii form\n     *\/","1033":"\/**\n     * Validate and Format the IPv6\/IPvfuture host.\n     *\n     * @throws SyntaxError if the submitted host is not a valid IP host\n     *\/","1034":"\/**\n     * Format the Port component.\n     *\n     * @throws SyntaxError\n     *\/","1035":"\/**\n     * Create a new instance from a string.\n     *\/","1036":"\/**\n     * Creates a new instance from a URI and a Base URI.\n     *\n     * The returned URI must be absolute.\n     *\/","1037":"\/**\n     * Creates a new instance from a template.\n     *\n     * @throws TemplateCanNotBeExpanded if the variables are invalid or missing\n     * @throws UriException if the resulting expansion cannot be converted to a UriInterface instance\n     *\/","1038":"\/**\n     * Create a new instance from a hash representation of the URI similar\n     * to PHP parse_url function result.\n     *\n     * @param InputComponentMap $components a hash representation of the URI similar to PHP parse_url function result\n     *\/","1039":"\/**\n     * Create a new instance from a data file path.\n     *\n     * @param resource|null $context\n     *\n     * @throws MissingFeature If ext\/fileinfo is not installed\n     * @throws SyntaxError If the file does not exist or is not readable\n     *\/","1040":"\/**\n     * Create a new instance from a data URI string.\n     *\n     * @throws SyntaxError If the parameter syntax is invalid\n     *\/","1041":"\/**\n     * Create a new instance from a Unix path string.\n     *\/","1042":"\/**\n     * Create a new instance from a local Windows path string.\n     *\/","1043":"\/**\n     * Creates a new instance from a RFC8089 compatible URI.\n     *\n     * @see https:\/\/datatracker.ietf.org\/doc\/html\/rfc8089\n     *\/","1045":"\/**\n     * Returns the environment scheme.\n     *\/","1046":"\/**\n     * Returns the environment user info.\n     *\n     * @return non-empty-array{0: ?string, 1: ?string}\n     *\/","1047":"\/**\n     * Returns the environment host.\n     *\n     * @throws SyntaxError If the host cannot be detected\n     *\n     * @return array{0:string|null, 1:int|null}\n     *\/","1048":"\/**\n     * Returns the environment path.\n     *\n     * @return list<?string>\n     *\/","1049":"\/**\n     * Format the Path component.\n     *\/","1050":"\/**\n     * Filter the Path component.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc2397\n     *\n     * @throws SyntaxError If the path is not compliant with RFC2397\n     *\/","1051":"\/**\n     * Assert the path is a compliant with RFC2397.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc2397\n     *\n     * @throws SyntaxError If the mediatype or the data are not compliant with the RFC2397\n     *\/","1052":"\/**\n     * Validate mediatype parameter.\n     *\/","1053":"\/**\n     * Format path component for file scheme.\n     *\/","1054":"\/**\n     * assert the URI internal state is valid.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-3\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-3.3\n     *\n     * @throws SyntaxError if the URI is in an invalid state according to RFC3986\n     * @throws SyntaxError if the URI is in an invalid state according to scheme specific rules\n     *\/","1055":"\/**\n     * URI validation for URI schemes which allows only scheme and path components.\n     *\/","1056":"\/**\n     * URI validation for URI schemes which allows only scheme, host and path components.\n     *\/","1057":"\/**\n     * URI validation for URI schemes which disallow the empty '' host.\n     *\/","1058":"\/**\n     * URI validation for URIs schemes which disallow the empty '' host\n     * and forbids the fragment component.\n     *\/","1059":"\/**\n     * URI validation for URIs schemes which disallow the empty '' host\n     * and forbids fragment and query components.\n     *\/","1062":"\/**\n     * @return ComponentMap\n     *\/","1074":"\/**\n     * Filter a string.\n     *\n     * @throws SyntaxError if the submitted data cannot be converted to string\n     *\/","1075":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @deprecated Since version 7.5.0\n     * @codeCoverageIgnore\n     * @see Uri::toComponents()\n     *\n     * @return ComponentMap\n     *\/","1076":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @deprecated Since version 7.0.0\n     * @codeCoverageIgnore\n     * @see Uri::new()\n     *\/","1077":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @deprecated Since version 7.0.0\n     * @codeCoverageIgnore\n     * @see Uri::fromComponents()\n     *\n     * @param InputComponentMap $components a hash representation of the URI similar to PHP parse_url function result\n     *\/","1078":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @param resource|null $context\n     *\n     * @throws MissingFeature If ext\/fileinfo is not installed\n     * @throws SyntaxError If the file does not exist or is not readable\n     * @see Uri::fromFileContents()\n     *\n     * @deprecated Since version 7.0.0\n     * @codeCoverageIgnore\n     *\/","1079":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @deprecated Since version 7.0.0\n     * @codeCoverageIgnore\n     * @see Uri::fromBaseUri()\n     *\n     * Creates a new instance from a URI and a Base URI.\n     *\n     * The returned URI must be absolute.\n     *\/","1080":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @deprecated Since version 7.0.0\n     * @codeCoverageIgnore\n     * @see Uri::fromUnixPath()\n     *\n     * Create a new instance from a Unix path string.\n     *\/","1081":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @deprecated Since version 7.0.0\n     * @codeCoverageIgnore\n     * @see Uri::fromWindowsPath()\n     *\n     * Create a new instance from a local Windows path string.\n     *\/","1082":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @deprecated Since version 7.0.0\n     * @codeCoverageIgnore\n     * @see Uri::new()\n     *\n     * Create a new instance from a URI object.\n     *\/","1083":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @deprecated Since version 7.0.0\n     * @codeCoverageIgnore\n     * @see Uri::fromServer()\n     *\n     * Create a new instance from the environment.\n     *\/","1084":"\/**\n * @deprecated since version 7.0.0\n * @codeCoverageIgnore\n * @see BaseUri\n *\/","1086":"\/**\n     * Tells whether the URI represents an absolute URI.\n     *\/","1087":"\/**\n     * Tell whether the URI represents a network path.\n     *\/","1088":"\/**\n     * Tells whether the URI represents an absolute path.\n     *\/","1089":"\/**\n     * Tell whether the URI represents a relative path.\n     *\n     *\/","1091":"\/**\n     * Returns the URI origin property as defined by WHATWG URL living standard.\n     *\n     * {@see https:\/\/url.spec.whatwg.org\/#origin}\n     *\n     * For URI without a special scheme the method returns null\n     * For URI with the file scheme the method will return null (as this is left to the implementation decision)\n     * For URI with a special scheme the method returns the scheme followed by its authority (without the userinfo part)\n     *\/","1092":"\/**\n     * Tells whether two URI do not share the same origin.\n     *\n     * @see UriInfo::getOrigin()\n     *\/","1095":"\/**\n     * Relativizes a URI according to a base URI.\n     *\n     * This method MUST retain the state of the submitted URI instance, and return\n     * a URI instance of the same type that contains the applied modifications.\n     *\n     * This method MUST be transparent when dealing with error and exceptions.\n     * It MUST not alter or silence them apart from validating its own parameters.\n     *\/","1096":"\/**\n * A class to parse a URI string according to RFC3986.\n *\n * @link    https:\/\/tools.ietf.org\/html\/rfc3986\n * @package League\\Uri\n * @author  Ignace Nyamagana Butera <nyamsprod@gmail.com>\n * @since   6.0.0\n *\n * @phpstan-type AuthorityMap array{user:?string, pass:?string, host:?string, port:?int}\n * @phpstan-type ComponentMap array{scheme:?string, user:?string, pass:?string, host:?string, port:?int, path:string, query:?string, fragment:?string}\n * @phpstan-type InputComponentMap array{scheme? : ?string, user? : ?string, pass? : ?string, host? : ?string, port? : ?int, path? : ?string, query? : ?string, fragment? : ?string}\n *\/","1097":"\/**\n     * Default URI component values.\n     *\n     * @var ComponentMap\n     *\/","1098":"\/**\n     * Simple URI which do not need any parsing.\n     *\n     * @var array<string, array<string>>\n     *\/","1099":"\/**\n     * Range of invalid characters in URI string.\n     *\n     * @var string\n     *\/","1100":"\/**\n     * RFC3986 regular expression URI splitter.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#appendix-B\n     * @var string\n     *\/","1101":"\/**\n     * URI scheme regular expression.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-3.1\n     * @var string\n     *\/","1102":"\/**\n     * IPvFuture regular expression.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-3.2.2\n     * @var string\n     *\/","1103":"\/**\n     * General registered name regular expression.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-3.2.2\n     * @var string\n     *\/","1104":"\/**\n     * Invalid characters in host regular expression.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-3.2.2\n     * @var string\n     *\/","1105":"\/**\n     * Invalid path for URI without scheme and authority regular expression.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-3.3\n     * @var string\n     *\/","1106":"\/**\n     * Host and Port splitter regular expression.\n     *\n     * @var string\n     *\/","1107":"\/**\n     * IDN Host detector regular expression.\n     *\n     * @var string\n     *\/","1108":"\/**\n     * Only the address block fe80::\/10 can have a Zone ID attach to\n     * let's detect the link local significant 10 bits.\n     *\n     * @var string\n     *\/","1109":"\/**\n     * Maximum number of host cached.\n     *\n     * @var int\n     *\/","1110":"\/**\n     * Generate a URI string representation from its parsed representation\n     * returned by League\\UriString::parse() or PHP's parse_url.\n     *\n     * If you supply your own array, you are responsible for providing\n     * valid components without their URI delimiters.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-5.3\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-7.5\n     *\n     * @param InputComponentMap $components\n     *\/","1111":"\/**\n     * Generate a URI string representation based on RFC3986 algorithm.\n     *\n     * valid URI component MUST be provided without their URI delimiters\n     * but properly encoded.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-5.3\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-7.5\n     *\/","1112":"\/**\n     * Generate a URI authority representation from its parsed representation.\n     *\n     * @param InputComponentMap $components\n     *\/","1113":"\/**\n     * Parse a URI string into its components.\n     *\n     * This method parses a URI and returns an associative array containing any\n     * of the various components of the URI that are present.\n     *\n     * <code>\n     * $components = UriString::parse('http:\/\/foo@test.example.com:42?query#');\n     * var_export($components);\n     * \/\/will display\n     * array(\n     *   'scheme' => 'http',           \/\/ the URI scheme component\n     *   'user' => 'foo',              \/\/ the URI user component\n     *   'pass' => null,               \/\/ the URI pass component\n     *   'host' => 'test.example.com', \/\/ the URI host component\n     *   'port' => 42,                 \/\/ the URI port component\n     *   'path' => '',                 \/\/ the URI path component\n     *   'query' => 'query',           \/\/ the URI query component\n     *   'fragment' => '',             \/\/ the URI fragment component\n     * );\n     * <\/code>\n     *\n     * The returned array is similar to PHP's parse_url return value with the following\n     * differences:\n     *\n     * <ul>\n     * <li>All components are always present in the returned array<\/li>\n     * <li>Empty and undefined component are treated differently. And empty component is\n     *   set to the empty string while an undefined component is set to the `null` value.<\/li>\n     * <li>The path component is never undefined<\/li>\n     * <li>The method parses the URI following the RFC3986 rules, but you are still\n     *   required to validate the returned components against its related scheme specific rules.<\/li>\n     * <\/ul>\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986\n     *\n     * @throws SyntaxError if the URI contains invalid characters\n     * @throws SyntaxError if the URI contains an invalid scheme\n     * @throws SyntaxError if the URI contains an invalid path\n     *\n     * @return ComponentMap\n     *\/","1114":"\/**\n     * Parses the URI authority part.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-3.2\n     *\n     * @throws SyntaxError If the port component is invalid\n     *\n     * @return AuthorityMap\n     *\/","1115":"\/**\n     * Filter and format the port component.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-3.2.2\n     *\n     * @throws SyntaxError if the registered name is invalid\n     *\/","1116":"\/**\n     * Returns whether a hostname is valid.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-3.2.2\n     *\n     * @throws SyntaxError if the registered name is invalid\n     *\/","1117":"\/**\n     * Throws if the host is not a registered name and not a valid IDN host.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-3.2.2\n     *\n     * @throws SyntaxError if the registered name is invalid\n     * @throws MissingFeature if IDN support or ICU requirement are not available or met.\n     * @throws ConversionFailed if the submitted IDN host cannot be converted to a valid ascii form\n     *\/","1118":"\/**\n     * Validates a IPv6\/IPfuture host.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc3986#section-3.2.2\n     * @link https:\/\/tools.ietf.org\/html\/rfc6874#section-2\n     * @link https:\/\/tools.ietf.org\/html\/rfc6874#section-4\n     *\/","1119":"\/**\n * Defines the URI Template syntax and the process for expanding a URI Template into a URI reference.\n *\n * @link    https:\/\/tools.ietf.org\/html\/rfc6570\n * @package League\\Uri\n * @author  Ignace Nyamagana Butera <nyamsprod@gmail.com>\n * @since   6.1.0\n *\/","1120":"\/**\n     * @throws SyntaxError if the template syntax is invalid\n     * @throws TemplateCanNotBeExpanded if the template or the variables are invalid\n     *\/","1121":"\/**\n     * @return array<string>\n     *\/","1122":"\/**\n     * Returns a new instance with the updated default variables.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the modified default variables.\n     *\n     * If present, variables whose name is not part of the current template\n     * possible variable names are removed.\n     *\n     * @throws TemplateCanNotBeExpanded if the variables are invalid\n     *\/","1123":"\/**\n     * @throws TemplateCanNotBeExpanded if the variables are invalid\n     * @throws UriException if the resulting expansion cannot be converted to a UriInterface instance\n     *\/","1124":"\/**\n     * @throws TemplateCanNotBeExpanded if the variables are invalid or missing\n     * @throws UriException if the resulting expansion cannot be converted to a UriInterface instance\n     *\/","1125":"\/**\n * @internal The class exposes the internal representation of an Expression and its usage\n * @link https:\/\/www.rfc-editor.org\/rfc\/rfc6570#section-2.2\n *\/","1126":"\/** @var array<VarSpecifier> *\/","1127":"\/** @var array<string> *\/","1128":"\/**\n     * @throws SyntaxError if the expression is invalid\n     *\/","1129":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @throws SyntaxError if the expression is invalid\n     * @see Expression::new()\n     *\n     * @deprecated Since version 7.0.0\n     * @codeCoverageIgnore\n     *\/","1130":"\/**\n * Processing behavior according to the expression type operator.\n *\n * @internal The class exposes the internal representation of an Operator and its usage\n *\n * @link https:\/\/www.rfc-editor.org\/rfc\/rfc6570#section-2.2\n * @link https:\/\/tools.ietf.org\/html\/rfc6570#appendix-A\n *\/","1131":"\/**\n     * Expression regular expression pattern.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc6570#section-2.2\n     *\/","1132":"\/**\n     * Reserved Operator characters.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc6570#section-2.2\n     *\/","1133":"\/**\n     * Removes percent encoding on reserved characters (used with + and # modifiers).\n     *\/","1134":"\/**\n     * @throws SyntaxError if the expression is invalid\n     * @throws SyntaxError if the operator used in the expression is invalid\n     * @throws SyntaxError if the contained variable specifiers are invalid\n     *\n     * @return array{operator:Operator, variables:string}\n     *\/","1135":"\/**\n     * Replaces an expression with the given variables.\n     *\n     * @throws TemplateCanNotBeExpanded if the variables is an array and a \":\" modifier needs to be applied\n     * @throws TemplateCanNotBeExpanded if the variables contains nested array values\n     *\/","1136":"\/**\n     * @param string|array<string> $value\n     *\n     * @return array{0:string, 1:bool}\n     *\/","1137":"\/**\n     * Expands an expression using a list of values.\n     *\n     * @param array<string> $value\n     *\n     * @throws TemplateCanNotBeExpanded if the variables is an array and a \":\" modifier needs to be applied\n     *\n     * @return array{0:string, 1:bool}\n     *\/","1138":"\/**\n * @internal The class exposes the internal representation of a Template and its usage\n *\/","1139":"\/**\n     * Expression regular expression pattern.\n     *\/","1140":"\/** @var array<Expression> *\/","1142":"\/**\n     * @throws SyntaxError if the template contains invalid expressions\n     * @throws SyntaxError if the template contains invalid variable specification\n     *\/","1143":"\/**\n     * @throws TemplateCanNotBeExpanded if the variables are invalid\n     *\/","1144":"\/**\n     * @throws TemplateCanNotBeExpanded if the variables are invalid or missing\n     *\/","1145":"\/**\n     * DEPRECATION WARNING! This method will be removed in the next major point release.\n     *\n     * @throws SyntaxError if the template contains invalid expressions\n     * @throws SyntaxError if the template contains invalid variable specification\n     * @deprecated Since version 7.0.0\n     * @codeCoverageIgnore\n     * @see Template::new()\n     *\n     * Create a new instance from a string.\n     *\n     *\/","1146":"\/**\n * @internal The class exposes the internal representation of a Var Specifier\n * @link https:\/\/www.rfc-editor.org\/rfc\/rfc6570#section-2.3\n *\/","1147":"\/**\n     * Variables specification regular expression pattern.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc6570#section-2.3\n     *\/","1148":"\/**\n * @internal The class exposes the internal representation of variable bags\n *\n * @phpstan-type InputValue string|bool|int|float|array<string|bool|int|float>\n *\n * @implements ArrayAccess<string, InputValue>\n * @implements IteratorAggregate<string, InputValue>\n *\/","1149":"\/**\n     * @var array<string,string|array<string>>\n     *\/","1150":"\/**\n     * @param iterable<array-key, InputValue> $variables\n     *\/","1151":"\/**\n     * Tells whether the bag is empty or not.\n     *\/","1153":"\/**\n     * Fetches the variable value if none found returns null.\n     *\n     * @return null|string|array<string>\n     *\/","1154":"\/**\n     * @param Stringable|InputValue $value\n     *\/","1155":"\/**\n     * @param Stringable|InputValue $value\n     *\n     * @throws TemplateCanNotBeExpanded if the value contains nested list\n     *\/","1156":"\/**\n     * Replaces elements from passed variables into the current instance.\n     *\/","1157":"\/**\n     * Filters elements using the closure.\n     *\/","1158":"\/**\n     * @deprecated since ICU 56 and removed in PHP 8\n     *\/","1159":"\/**\n * Inspired by https:\/\/github.com\/nikic\/PHP-Parser\/tree\/36a6dcd04e7b0285e8f0868f44bd4927802f7df1\n *\n * Copyright (c) 2011, Nikita Popov\n * All rights reserved.\n *\/","1160":"\/** @var array<string, mixed> *\/","1161":"\/**\n\t * @param mixed $value\n\t *\/","1162":"\/**\n\t * @return mixed\n\t *\/","1163":"\/** @var ConstExprArrayItemNode[] *\/","1165":"\/**\n\t * @param ConstExprArrayItemNode[] $items\n\t *\/","1182":"\/** @var self::SINGLE_QUOTED|self::DOUBLE_QUOTED *\/","1184":"\/**\n\t * @param self::SINGLE_QUOTED|self::DOUBLE_QUOTED $quoteType\n\t *\/","1190":"\/** @var string class name for class constants or empty string for non-class constants *\/","1204":"\/**\n\t * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CHILDREN, child nodes\n\t * of the current node will not be traversed for any visitors.\n\t *\n\t * For subsequent visitors enterNode() will still be called on the current\n\t * node and leaveNode() will also be invoked for the current node.\n\t *\/","1205":"\/**\n\t * If NodeVisitor::enterNode() or NodeVisitor::leaveNode() returns\n\t * STOP_TRAVERSAL, traversal is aborted.\n\t *\n\t * The afterTraverse() method will still be invoked.\n\t *\/","1206":"\/**\n\t * If NodeVisitor::leaveNode() returns REMOVE_NODE for a node that occurs\n\t * in an array, it will be removed from the array.\n\t *\n\t * For subsequent visitors leaveNode() will still be invoked for the\n\t * removed node.\n\t *\/","1207":"\/**\n\t * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CURRENT_AND_CHILDREN, child nodes\n\t * of the current node will not be traversed for any visitors.\n\t *\n\t * For subsequent visitors enterNode() will not be called as well.\n\t * leaveNode() will be invoked for visitors that has enterNode() method invoked.\n\t *\/","1208":"\/** @var list<NodeVisitor> Visitors *\/","1209":"\/** @var bool Whether traversal should be stopped *\/","1210":"\/**\n\t * @param list<NodeVisitor> $visitors\n\t *\/","1211":"\/**\n\t * Traverses an array of nodes using the registered visitors.\n\t *\n\t * @param Node[] $nodes Array of nodes\n\t *\n\t * @return Node[] Traversed array of nodes\n\t *\/","1212":"\/**\n\t * Recursively traverse a node.\n\t *\n\t * @param Node $node Node to traverse.\n\t *\n\t * @return Node Result of traversal (may be original node or new one)\n\t *\/","1213":"\/**\n\t * Recursively traverse array (usually of nodes).\n\t *\n\t * @param mixed[] $nodes Array to traverse\n\t *\n\t * @return mixed[] Result of traversal (may be original array or changed one)\n\t *\/","1215":"\/**\n\t * Called once before traversal.\n\t *\n\t * Return value semantics:\n\t *  * null:      $nodes stays as-is\n\t *  * otherwise: $nodes is set to the return value\n\t *\n\t * @param Node[] $nodes Array of nodes\n\t *\n\t * @return Node[]|null Array of nodes\n\t *\/","1216":"\/**\n\t * Called when entering a node.\n\t *\n\t * Return value semantics:\n\t *  * null\n\t *        => $node stays as-is\n\t *  * array (of Nodes)\n\t *        => The return value is merged into the parent array (at the position of the $node)\n\t *  * NodeTraverser::REMOVE_NODE\n\t *        => $node is removed from the parent array\n\t *  * NodeTraverser::DONT_TRAVERSE_CHILDREN\n\t *        => Children of $node are not traversed. $node stays as-is\n\t *  * NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN\n\t *        => Further visitors for the current node are skipped, and its children are not\n\t *           traversed. $node stays as-is.\n\t *  * NodeTraverser::STOP_TRAVERSAL\n\t *        => Traversal is aborted. $node stays as-is\n\t *  * otherwise\n\t *        => $node is set to the return value\n\t *\n\t * @param Node $node Node\n\t *\n\t * @return Node|Node[]|NodeTraverser::*|null Replacement node (or special return value)\n\t *\/","1217":"\/**\n\t * Called when leaving a node.\n\t *\n\t * Return value semantics:\n\t *  * null\n\t *        => $node stays as-is\n\t *  * NodeTraverser::REMOVE_NODE\n\t *        => $node is removed from the parent array\n\t *  * NodeTraverser::STOP_TRAVERSAL\n\t *        => Traversal is aborted. $node stays as-is\n\t *  * array (of Nodes)\n\t *        => The return value is merged into the parent array (at the position of the $node)\n\t *  * otherwise\n\t *        => $node is set to the return value\n\t *\n\t * @param Node $node Node\n\t *\n\t * @return Node|Node[]|NodeTraverser::REMOVE_NODE|NodeTraverser::STOP_TRAVERSAL|null Replacement node (or special return value)\n\t *\/","1218":"\/**\n\t * Called once after traversal.\n\t *\n\t * Return value semantics:\n\t *  * null:      $nodes stays as-is\n\t *  * otherwise: $nodes is set to the return value\n\t *\n\t * @param Node[] $nodes Array of nodes\n\t *\n\t * @return Node[]|null Array of nodes\n\t *\/","1219":"\/** @var string (may be empty) *\/","1235":"\/** @var list<DoctrineArgument> *\/","1237":"\/**\n\t * @param list<DoctrineArgument> $arguments\n\t *\/","1240":"\/**\n * @phpstan-type ValueType = DoctrineAnnotation|IdentifierTypeNode|DoctrineArray|ConstExprNode\n *\/","1241":"\/** @var ValueType *\/","1243":"\/**\n\t * @param ValueType $value\n\t *\/","1246":"\/** @var list<DoctrineArrayItem> *\/","1248":"\/**\n\t * @param list<DoctrineArrayItem> $items\n\t *\/","1251":"\/**\n * @phpstan-import-type ValueType from DoctrineArgument\n * @phpstan-type KeyType = ConstExprIntegerNode|ConstExprStringNode|IdentifierTypeNode|ConstFetchNode|null\n *\/","1252":"\/** @var KeyType *\/","1255":"\/**\n\t * @param KeyType $key\n\t * @param ValueType $value\n\t *\/","1274":"\/**\n * @property ParserException $exception\n *\/","1276":"\/** @var mixed[] *\/","1280":"\/** @var TemplateTagValueNode[] *\/","1281":"\/** @var MethodTagValueParameterNode[] *\/","1284":"\/**\n\t * @param MethodTagValueParameterNode[] $parameters\n\t * @param TemplateTagValueNode[] $templateTypes\n\t *\/","1316":"\/** @var PhpDocChildNode[] *\/","1318":"\/**\n\t * @param PhpDocChildNode[] $children\n\t *\/","1319":"\/**\n\t * @return PhpDocTagNode[]\n\t *\/","1321":"\/**\n\t * @return VarTagValueNode[]\n\t *\/","1322":"\/**\n\t * @return ParamTagValueNode[]\n\t *\/","1323":"\/**\n\t * @return TypelessParamTagValueNode[]\n\t *\/","1324":"\/**\n\t * @return ParamImmediatelyInvokedCallableTagValueNode[]\n\t *\/","1325":"\/**\n\t * @return ParamLaterInvokedCallableTagValueNode[]\n\t *\/","1326":"\/**\n\t * @return ParamClosureThisTagValueNode[]\n\t *\/","1327":"\/**\n\t * @return PureUnlessCallableIsImpureTagValueNode[]\n\t *\/","1328":"\/**\n\t * @return TemplateTagValueNode[]\n\t *\/","1329":"\/**\n\t * @return ExtendsTagValueNode[]\n\t *\/","1330":"\/**\n\t * @return ImplementsTagValueNode[]\n\t *\/","1331":"\/**\n\t * @return UsesTagValueNode[]\n\t *\/","1332":"\/**\n\t * @return ReturnTagValueNode[]\n\t *\/","1333":"\/**\n\t * @return ThrowsTagValueNode[]\n\t *\/","1334":"\/**\n\t * @return MixinTagValueNode[]\n\t *\/","1335":"\/**\n\t * @return RequireExtendsTagValueNode[]\n\t *\/","1336":"\/**\n\t * @return RequireImplementsTagValueNode[]\n\t *\/","1337":"\/**\n\t * @return DeprecatedTagValueNode[]\n\t *\/","1338":"\/**\n\t * @return PropertyTagValueNode[]\n\t *\/","1341":"\/**\n\t * @return MethodTagValueNode[]\n\t *\/","1342":"\/**\n\t * @return TypeAliasTagValueNode[]\n\t *\/","1343":"\/**\n\t * @return TypeAliasImportTagValueNode[]\n\t *\/","1344":"\/**\n\t * @return AssertTagValueNode[]\n\t *\/","1345":"\/**\n\t * @return AssertTagPropertyValueNode[]\n\t *\/","1346":"\/**\n\t * @return AssertTagMethodValueNode[]\n\t *\/","1347":"\/**\n\t * @return SelfOutTagValueNode[]\n\t *\/","1348":"\/**\n\t * @return ParamOutTagValueNode[]\n\t *\/","1383":"\/** @var non-empty-string *\/","1386":"\/**\n\t * @param non-empty-string $name\n\t *\/","1412":"\/** @var ConstExprIntegerNode|ConstExprStringNode|IdentifierTypeNode|null *\/","1414":"\/**\n\t * @param ConstExprIntegerNode|ConstExprStringNode|IdentifierTypeNode|null $keyName\n\t *\/","1417":"\/** @var ArrayShapeItemNode[] *\/","1418":"\/** @var self::KIND_* *\/","1420":"\/**\n\t * @param ArrayShapeItemNode[] $items\n\t * @param self::KIND_* $kind\n\t *\/","1432":"\/** @var CallableTypeParameterNode[] *\/","1434":"\/**\n\t * @param CallableTypeParameterNode[] $parameters\n\t * @param TemplateTagValueNode[]  $templateTypes\n\t *\/","1450":"\/** @var TypeNode[] *\/","1451":"\/** @var (self::VARIANCE_*)[] *\/","1453":"\/**\n\t * @param TypeNode[] $genericTypes\n\t * @param (self::VARIANCE_*)[] $variances\n\t *\/","1461":"\/**\n\t * @param TypeNode[] $types\n\t *\/","1471":"\/** @var ConstExprStringNode|IdentifierTypeNode *\/","1473":"\/**\n\t * @param ConstExprStringNode|IdentifierTypeNode $keyName\n\t *\/","1476":"\/** @var ObjectShapeItemNode[] *\/","1478":"\/**\n\t * @param ObjectShapeItemNode[] $items\n\t *\/","1494":"\/**\n * Implementation based on Nette Tokenizer (New BSD License; https:\/\/github.com\/nette\/tokenizer)\n *\/","1495":"\/**\n\t * @return list<array{string, int, int}>\n\t *\/","1496":"\/**\n\t * @param array{lines?: bool, indexes?: bool, comments?: bool} $usedAttributes\n\t *\/","1497":"\/**\n\t * @internal\n\t *\/","1498":"\/**\n\t * This method is supposed to be called with TokenIterator after reading TOKEN_DOUBLE_QUOTED_STRING and shifting\n\t * to the next token.\n\t *\/","1499":"\/**\n\t * @template T of Ast\\ConstExpr\\ConstExprNode\n\t * @param T $node\n\t * @return T\n\t *\/","1500":"\/**\n * @phpstan-import-type ValueType from Doctrine\\DoctrineArgument as DoctrineValueType\n *\/","1501":"\/** @phpstan-impure *\/","1502":"\/**\n\t * @template T of Ast\\Node\n\t * @param T $tag\n\t * @return T\n\t *\/","1503":"\/**\n\t * @return list<Doctrine\\DoctrineArgument>\n\t *\/","1504":"\/**\n\t * @return DoctrineValueType\n\t *\/","1505":"\/**\n\t * @return ConstExprIntegerNode|ConstExprStringNode|IdentifierTypeNode|ConstFetchNode\n\t *\/","1506":"\/**\n\t * @return Ast\\PhpDoc\\ParamTagValueNode|Ast\\PhpDoc\\TypelessParamTagValueNode\n\t *\/","1507":"\/**\n\t * @return Ast\\PhpDoc\\AssertTagValueNode|Ast\\PhpDoc\\AssertTagPropertyValueNode|Ast\\PhpDoc\\AssertTagMethodValueNode\n\t *\/","1508":"\/**\n\t * @return array{parameter: string}|array{parameter: string, property: string}|array{parameter: string, method: string}\n\t *\/","1509":"\/**\n\t * @param bool $limitStartToken true should be used when the description immediately follows a parsed type\n\t *\/","1510":"\/**\n\t * Implementation based on https:\/\/github.com\/nikic\/PHP-Parser\/blob\/b0edd4c41111042d43bb45c6c657b2e0db367d9e\/lib\/PhpParser\/Node\/Scalar\/String_.php#L90-L130\n\t *\/","1511":"\/**\n\t * Implementation based on https:\/\/github.com\/nikic\/PHP-Parser\/blob\/b0edd4c41111042d43bb45c6c657b2e0db367d9e\/lib\/PhpParser\/Node\/Scalar\/String_.php#L132-L154\n\t *\/","1512":"\/** @var list<array{string, int, int}> *\/","1513":"\/** @var list<Comment> *\/","1514":"\/** @var list<array{int, list<Comment>}> *\/","1515":"\/** @var list<int> *\/","1516":"\/**\n\t * @param list<array{string, int, int}> $tokens\n\t *\/","1518":"\/**\n\t * @throws ParserException\n\t *\/","1521":"\/**\n\t * @return list<Comment>\n\t *\/","1523":"\/**\n\t * @deprecated Use skipNewLineTokensAndConsumeComments instead (when parsing a type)\n\t *\/","1527":"\/**\n\t * Check whether the position is directly preceded by a certain token type.\n\t *\n\t * During this check TOKEN_HORIZONTAL_WS and TOKEN_PHPDOC_EOL are skipped\n\t *\/","1528":"\/**\n\t * Check whether the position is directly followed by a certain token type.\n\t *\n\t * During this check TOKEN_HORIZONTAL_WS and TOKEN_PHPDOC_EOL are skipped\n\t *\/","1529":"\/**\n\t * Whether the given position is immediately surrounded by parenthesis.\n\t *\/","1532":"\/**\n\t * @internal\n\t * @template T of Ast\\Node\n\t * @param T $type\n\t * @return T\n\t *\/","1544":"\/**\n\t * @phpstan-impure\n\t * @return array{Ast\\Type\\TypeNode, Ast\\Type\\GenericTypeNode::VARIANCE_*}\n\t *\/","1545":"\/**\n\t * @throws ParserException\n\t * @param ?callable(TokenIterator): string $parseDescription\n\t *\/","1547":"\/**\n\t * @return Ast\\PhpDoc\\TemplateTagValueNode[]\n\t *\n\t * @phpstan-impure\n\t *\/","1552":"\/**\n\t * @phpstan-impure\n\t * @param Ast\\Type\\ArrayShapeNode::KIND_* $kind\n\t *\/","1554":"\/**\n\t * @phpstan-impure\n\t * @return Ast\\ConstExpr\\ConstExprIntegerNode|Ast\\ConstExpr\\ConstExprStringNode|Ast\\Type\\IdentifierTypeNode\n\t *\/","1555":"\/**\n\t * @phpstan-impure\n\t *\/","1559":"\/**\n\t * @phpstan-impure\n\t * @return Ast\\ConstExpr\\ConstExprStringNode|Ast\\Type\\IdentifierTypeNode\n\t *\/","1560":"\/**\n * Inspired by https:\/\/github.com\/nikic\/PHP-Parser\/tree\/36a6dcd04e7b0285e8f0868f44bd4927802f7df1\n *\n * Copyright (c) 2011, Nikita Popov\n * All rights reserved.\n *\n * Implements the Myers diff algorithm.\n *\n * @internal\n *\/","1561":"\/** @var self::TYPE_* *\/","1562":"\/** @var mixed Is null for add operations *\/","1563":"\/** @var mixed Is null for remove operations *\/","1564":"\/**\n\t * @param self::TYPE_* $type\n\t * @param mixed $old Is null for add operations\n\t * @param mixed $new Is null for remove operations\n\t *\/","1565":"\/**\n * Inspired by https:\/\/github.com\/nikic\/PHP-Parser\/tree\/36a6dcd04e7b0285e8f0868f44bd4927802f7df1\n *\n * Copyright (c) 2011, Nikita Popov\n * All rights reserved.\n *\n * Implements the Myers diff algorithm.\n *\n * Myers, Eugene W. \"An O (ND) difference algorithm and its variations.\"\n * Algorithmica 1.1 (1986): 251-266.\n *\n * @template T\n * @internal\n *\/","1566":"\/** @var callable(T, T): bool *\/","1567":"\/**\n\t * Create differ over the given equality relation.\n\t *\n\t * @param callable(T, T): bool $isEqual Equality relation\n\t *\/","1568":"\/**\n\t * Calculate diff (edit script) from $old to $new.\n\t *\n\t * @param T[] $old Original array\n\t * @param T[] $new New array\n\t *\n\t * @return DiffElem[] Diff (edit script)\n\t *\/","1569":"\/**\n\t * Calculate diff, including \"replace\" operations.\n\t *\n\t * If a sequence of remove operations is followed by the same number of add operations, these\n\t * will be coalesced into replace operations.\n\t *\n\t * @param T[] $old Original array\n\t * @param T[] $new New array\n\t *\n\t * @return DiffElem[] Diff (edit script), including replace operations\n\t *\/","1570":"\/**\n\t * @param T[] $old\n\t * @param T[] $new\n\t * @return array{array<int, array<int, int>>, int, int}\n\t *\/","1571":"\/**\n\t * @param array<int, array<int, int>> $trace\n\t * @param T[] $old\n\t * @param T[] $new\n\t * @return DiffElem[]\n\t *\/","1572":"\/**\n\t * Coalesce equal-length sequences of remove+add into a replace operation.\n\t *\n\t * @param DiffElem[] $diff\n\t * @return DiffElem[]\n\t *\/","1574":"\/** @var Differ<Node> *\/","1575":"\/**\n\t * Map From \"{$class}->{$subNode}\" to string that should be inserted\n\t * between elements of this list subnode\n\t *\n\t * @var array<string, string>\n\t *\/","1576":"\/**\n\t * [$find, $extraLeft, $extraRight]\n\t *\n\t * @var array<string, array{string|null, string, string}>\n\t *\/","1577":"\/** @var array<string, list<class-string<TypeNode>>> *\/","1579":"\/**\n\t * @param Node[] $nodes\n\t * @param Node[] $originalNodes\n\t *\/","1580":"\/**\n\t * @param list<Comment> $comments\n\t *\/","1581":"\/**\n\t * @param array<Node|null> $nodes\n\t * @return array{bool, string, string}\n\t *\/","1582":"\/**\n * @implements Rule<BooleanAndNode>\n *\/","1583":"\/**\n * @implements Rule<BooleanNot>\n *\/","1584":"\/**\n * @implements Rule<BooleanOrNode>\n *\/","1585":"\/**\n * @implements Rule<ElseIf_>\n *\/","1586":"\/**\n * @implements Rule<If_>\n *\/","1587":"\/**\n * @implements Rule<Ternary>\n *\/","1588":"\/**\n * @implements Rule<Cast>\n *\/","1589":"\/**\n * @implements Rule<ClassMethod>\n *\/","1590":"\/**\n\t * @param ReflectionClass|ReflectionEnum $classReflection\n\t * @return ReflectionClass|false\n\t *\/","1591":"\/**\n * @implements Rule<ShellExec>\n *\/","1592":"\/**\n * @implements Rule<Empty_>\n *\/","1593":"\/**\n * @implements Rule<Assign>\n *\/","1594":"\/**\n * @implements Rule<BinaryOp>\n *\/","1596":"\/**\n * @implements Rule<For_>\n *\/","1597":"\/**\n\t * @return list<IdentifierRuleError>\n\t *\/","1598":"\/**\n * @implements Rule<Foreach_>\n *\/","1600":"\/**\n * @implements Rule<FuncCall>\n *\/","1601":"\/**\n * @implements Rule<Node\\Expr\\Closure>\n *\/","1602":"\/**\n * @implements Rule<Node\\Expr\\MethodCall>\n *\/","1603":"\/**\n * @implements Rule<Node\\Expr\\StaticCall>\n *\/","1604":"\/**\n * @implements Rule<InClassMethodNode>\n *\/","1605":"\/**\n * @phpstan-template TNodeType of PreInc|PreDec|PostInc|PostDec\n * @phpstan-implements Rule<TNodeType>\n *\/","1606":"\/**\n\t * @param TNodeType $node\n\t *\/","1607":"\/**\n\t * @return 'preInc'|'postInc'|'preDec'|'postDec'\n\t *\/","1608":"\/**\n     * @return class-string<TNodeType>\n     *\/","1609":"\/**\n * @phpstan-extends OperandInArithmeticIncrementOrDecrementRule<PostDec>\n *\/","1611":"\/**\n * @phpstan-extends OperandInArithmeticIncrementOrDecrementRule<PostInc>\n *\/","1613":"\/**\n * @phpstan-extends OperandInArithmeticIncrementOrDecrementRule<PreDec>\n *\/","1615":"\/**\n * @phpstan-extends OperandInArithmeticIncrementOrDecrementRule<PreInc>\n *\/","1617":"\/**\n * @implements Rule<Expr>\n *\/","1623":"\/**\n * @implements Rule<MethodCallableNode>\n *\/","1624":"\/**\n * @implements Rule<MethodCall>\n *\/","1627":"\/**\n * @implements Rule<Switch_>\n *\/","1630":"\/**\n * @implements Rule<PropertyFetch>\n *\/","1631":"\/** @var string[] *\/","1632":"\/**\n\t * @param string[] $universalObjectCratesClasses\n\t *\/","1634":"\/**\n * @implements Rule<StaticMethodCallableNode>\n *\/","1635":"\/**\n * @implements Rule<StaticPropertyFetch>\n *\/","1636":"\/**\n * @implements Rule<Variable>\n *\/","1637":"\/**\n * @immutable\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\/","1638":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\/","1642":"\/**\n     * @var class-string\n     *\/","1643":"\/**\n     * @var non-empty-string\n     *\/","1644":"\/**\n     * @param class-string     $className\n     * @param non-empty-string $methodName\n     *\/","1645":"\/**\n     * @return class-string\n     *\/","1648":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This class is not covered by the backward compatibility promise for PHPUnit\n *\/","1650":"\/**\n     * Your own code triggers an issue in third-party code.\n     *\/","1651":"\/**\n     * Your test code triggers an issue.\n     *\n     * @phpstan-assert-if-true TestTrigger $this\n     *\/","1652":"\/**\n     * Your own code triggers an issue in your own code.\n     *\n     * @phpstan-assert-if-true SelfTrigger $this\n     *\/","1653":"\/**\n     * Third-party code triggers an issue either in your own code or in third-party code.\n     *\n     * @phpstan-assert-if-true IndirectTrigger $this\n     *\/","1654":"\/**\n     * @phpstan-assert-if-true UnknownTrigger $this\n     *\/","1656":"\/**\n     * Third-party code triggers an issue either in your own code or in third-party code.\n     *\/","1659":"\/**\n     * Your own code triggers an issue in third-party code.\n     *\n     * @phpstan-assert-if-true DirectTrigger $this\n     *\/","1668":"\/**\n     * Your own code triggers an issue in your own code.\n     *\/","1674":"\/**\n     * Your test code triggers an issue.\n     *\/","1688":"\/**\n     * @param non-empty-string $file\n     *\/","1690":"\/**\n     * @phpstan-assert-if-true TestMethod $this\n     *\/","1696":"\/**\n     * @phpstan-assert-if-true Phpt $this\n     *\/","1699":"\/**\n * @template-implements IteratorAggregate<int, Test>\n *\n * @immutable\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\/","1700":"\/**\n     * @var list<Test>\n     *\/","1701":"\/**\n     * @param list<Test> $tests\n     *\/","1702":"\/**\n     * @return list<Test>\n     *\/","1703":"\/**\n * @template-implements Iterator<int, Test>\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\/","1711":"\/**\n     * @var non-negative-int\n     *\/","1712":"\/**\n     * @param class-string     $className\n     * @param non-empty-string $methodName\n     * @param non-empty-string $file\n     * @param non-negative-int $line\n     *\/","1715":"\/**\n     * @return non-negative-int\n     *\/","1722":"\/**\n     * @throws NoTestCaseObjectOnCallStackException\n     *\/","1725":"\/**\n     * @param class-string $className\n     *\/","1726":"\/**\n     * @throws NoPreviousThrowableException\n     *\/","1728":"\/**\n     * @phpstan-assert-if-true !null $this->previous\n     *\/","1731":"\/**\n     * @throws Exception\n     * @throws NoPreviousThrowableException\n     *\/","1735":"\/**\n     * @var array<class-string, list<Subscriber>>\n     *\/","1736":"\/**\n     * @var list<Tracer\\Tracer>\n     *\/","1737":"\/**\n     * @throws MapError\n     * @throws UnknownSubscriberTypeException\n     *\/","1738":"\/**\n     * @throws Throwable\n     * @throws UnknownEventTypeException\n     *\/","1739":"\/**\n     * @throws Throwable\n     *\/","1740":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This interface is not covered by the backward compatibility promise for PHPUnit\n *\/","1741":"\/**\n     * @throws UnknownEventTypeException\n     *\/","1743":"\/**\n     * @throws InvalidArgumentException\n     * @throws UnknownEventTypeException\n     *\/","1748":"\/**\n     * @param class-string          $className\n     * @param array<string, string> $parameters\n     *\n     * @throws InvalidArgumentException\n     * @throws UnknownEventTypeException\n     *\/","1762":"\/**\n     * @param class-string $testClassName\n     *\n     * @throws InvalidArgumentException\n     * @throws UnknownEventTypeException\n     *\/","1772":"\/**\n     * @param class-string $className\n     *\n     * @throws InvalidArgumentException\n     * @throws UnknownEventTypeException\n     *\/","1774":"\/**\n     * @param list<class-string> $interfaces\n     *\n     * @throws InvalidArgumentException\n     * @throws UnknownEventTypeException\n     *\/","1784":"\/**\n     * @param non-empty-string $message\n     *\n     * @throws InvalidArgumentException\n     * @throws NoTestCaseObjectOnCallStackException\n     * @throws UnknownEventTypeException\n     *\/","1785":"\/**\n     * @param non-empty-string $message\n     * @param non-empty-string $file\n     * @param positive-int     $line\n     *\n     * @throws InvalidArgumentException\n     * @throws UnknownEventTypeException\n     *\/","1786":"\/**\n     * @param non-empty-string $message\n     * @param non-empty-string $file\n     * @param positive-int     $line\n     * @param non-empty-string $stackTrace\n     *\n     * @throws InvalidArgumentException\n     * @throws UnknownEventTypeException\n     *\/","1792":"\/**\n     * @param non-empty-string $message\n     *\n     * @throws InvalidArgumentException\n     * @throws UnknownEventTypeException\n     *\/","1794":"\/**\n     * @param non-empty-string $output\n     *\n     * @throws InvalidArgumentException\n     * @throws UnknownEventTypeException\n     *\/","1813":"\/**\n     * @throws InvalidArgumentException\n     *\/","1815":"\/**\n     * @param class-string          $className\n     * @param array<string, string> $parameters\n     *\/","1816":"\/**\n     * @param class-string $testClassName\n     *\/","1827":"\/**\n     * @param list<class-string> $interfaces\n     *\/","1831":"\/**\n     * @param non-empty-string $message\n     *\/","1833":"\/**\n     * @param non-empty-string $message\n     * @param non-empty-string $file\n     * @param positive-int     $line\n     *\/","1834":"\/**\n     * @param non-empty-string $message\n     * @param non-empty-string $file\n     * @param positive-int     $line\n     * @param non-empty-string $stackTrace\n     *\/","1842":"\/**\n     * @param non-empty-string $output\n     *\/","1854":"\/**\n * @template-implements IteratorAggregate<int, Event>\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\/","1855":"\/**\n     * @var list<Event>\n     *\/","1856":"\/**\n     * @return list<Event>\n     *\/","1857":"\/**\n * @template-implements Iterator<int, Event>\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\/","1861":"\/**\n     * @throws EventFacadeIsSealedException\n     * @throws UnknownSubscriberTypeException\n     *\/","1863":"\/**\n     * @throws EventFacadeIsSealedException\n     *\/","1864":"\/**\n     * @codeCoverageIgnore\n     *\n     * @noinspection PhpUnused\n     *\/","1874":"\/**\n     * @return list<string>\n     *\/","1878":"\/**\n     * @throws UnknownSubscriberTypeException\n     *\/","1904":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This class is not covered by the backward compatibility promise for PHPUnit\n *\n * @codeCoverageIgnore\n *\/","1907":"\/**\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","1908":"\/**\n     * @phpstan-assert-if-true DataFromTestDependency $this\n     *\/","1910":"\/**\n     * @phpstan-assert-if-true DataFromDataProvider $this\n     *\/","1915":"\/**\n * @template-implements IteratorAggregate<int, TestData>\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\/","1916":"\/**\n     * @var list<TestData>\n     *\/","1917":"\/**\n     * @param list<TestData> $data\n     *\/","1918":"\/**\n     * @return list<TestData>\n     *\/","1919":"\/**\n     * @phpstan-assert-if-true !null $this->fromDataProvider\n     *\/","1920":"\/**\n     * @throws NoDataSetFromDataProviderException\n     *\/","1921":"\/**\n * @template-implements Iterator<int, TestData>\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\/","1943":"\/**\n     * @var array<string, string>\n     *\/","1976":"\/**\n     * @param non-empty-string $name\n     *\/","1978":"\/**\n     * @phpstan-assert-if-true TestSuiteWithName $this\n     *\/","1979":"\/**\n     * @phpstan-assert-if-true TestSuiteForTestClass $this\n     *\/","1980":"\/**\n     * @phpstan-assert-if-true TestSuiteForTestMethodWithDataProvider $this\n     *\/","1982":"\/**\n     * @throws RuntimeException\n     *\/","1986":"\/**\n     * @param class-string $name\n     *\/","1994":"\/**\n     * @param non-empty-string $name\n     * @param class-string     $className\n     * @param non-empty-string $methodName\n     *\/","2017":"\/**\n     * @var list<Code\\ClassMethod>\n     *\/","2020":"\/**\n     * @return list<Code\\ClassMethod>\n     *\/","2086":"\/**\n     * @var list<ClassMethod>\n     *\/","2087":"\/**\n     * @return list<ClassMethod>\n     *\/","2097":"\/**\n     * @return positive-int\n     *\/","2112":"\/**\n     * @phpstan-assert-if-true !null $this->comparisonFailure\n     *\/","2113":"\/**\n     * @throws NoComparisonFailureException\n     *\/","2125":"\/**\n     * @var list<class-string>\n     *\/","2127":"\/**\n     * @return list<class-string>\n     *\/","2258":"\/**\n     * @var array<class-string, class-string>\n     *\/","2259":"\/**\n     * @param class-string $subscriberInterface\n     * @param class-string $eventClass\n     *\n     * @throws EventAlreadyAssignedException\n     * @throws InvalidEventException\n     * @throws InvalidSubscriberException\n     * @throws SubscriberTypeAlreadyRegisteredException\n     * @throws UnknownEventException\n     * @throws UnknownSubscriberException\n     *\/","2260":"\/**\n     * @throws MapError\n     *\n     * @return class-string\n     *\/","2261":"\/**\n     * @param class-string $subscriberInterface\n     *\n     * @throws UnknownSubscriberException\n     *\/","2262":"\/**\n     * @param class-string $eventClass\n     *\n     * @throws UnknownEventException\n     *\/","2263":"\/**\n     * @param class-string $subscriberInterface\n     *\n     * @throws InvalidSubscriberException\n     *\/","2264":"\/**\n     * @param class-string $eventClass\n     *\n     * @throws InvalidEventException\n     *\/","2265":"\/**\n     * @param class-string $subscriberInterface\n     *\n     * @throws SubscriberTypeAlreadyRegisteredException\n     *\/","2266":"\/**\n     * @param class-string $eventClass\n     *\n     * @throws EventAlreadyAssignedException\n     *\/","2272":"\/**\n     * @var list<array{file: string, line: int, function: string}>\n     *\/","2273":"\/**\n     * Returns the serializable trace (without 'args').\n     *\n     * @return list<array{file: string, line: int, function: string}>\n     *\/","2275":"\/**\n     * Asserts that two arrays are equal while only considering a list of keys.\n     *\n     * @param array<mixed>              $expected\n     * @param array<mixed>              $actual\n     * @param non-empty-list<array-key> $keysToBeConsidered\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\/","2276":"\/**\n     * Asserts that two arrays are equal while ignoring a list of keys.\n     *\n     * @param array<mixed>              $expected\n     * @param array<mixed>              $actual\n     * @param non-empty-list<array-key> $keysToBeIgnored\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\/","2277":"\/**\n     * Asserts that two arrays are identical while only considering a list of keys.\n     *\n     * @param array<mixed>              $expected\n     * @param array<mixed>              $actual\n     * @param non-empty-list<array-key> $keysToBeConsidered\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\/","2279":"\/**\n     * Asserts that an array has a specified key.\n     *\n     * @param array<mixed>|ArrayAccess<array-key, mixed> $array\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\/","2280":"\/**\n     * Asserts that an array does not have a specified key.\n     *\n     * @param array<mixed>|ArrayAccess<array-key, mixed> $array\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\/","2281":"\/**\n     * @phpstan-assert list<mixed> $array\n     *\n     * @throws ExpectationFailedException\n     *\/","2282":"\/**\n     * Asserts that a haystack contains a needle.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\/","2283":"\/**\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2284":"\/**\n     * Asserts that a haystack does not contain a needle.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\/","2286":"\/**\n     * Asserts that a haystack contains only values of a given type.\n     *\n     * @param 'array'|'bool'|'boolean'|'callable'|'double'|'float'|'int'|'integer'|'iterable'|'null'|'numeric'|'object'|'real'|'resource (closed)'|'resource'|'scalar'|'string' $type\n     * @param iterable<mixed>                                                                                                                                                   $haystack\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @deprecated https:\/\/github.com\/sebastianbergmann\/phpunit\/issues\/6056\n     *\/","2287":"\/**\n     * Asserts that a haystack contains only values of type array.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2288":"\/**\n     * Asserts that a haystack contains only values of type bool.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2289":"\/**\n     * Asserts that a haystack contains only values of type callable.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2290":"\/**\n     * Asserts that a haystack contains only values of type float.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2291":"\/**\n     * Asserts that a haystack contains only values of type int.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2292":"\/**\n     * Asserts that a haystack contains only values of type iterable.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2293":"\/**\n     * Asserts that a haystack contains only values of type null.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2294":"\/**\n     * Asserts that a haystack contains only values of type numeric.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2295":"\/**\n     * Asserts that a haystack contains only values of type object.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2296":"\/**\n     * Asserts that a haystack contains only values of type resource.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2297":"\/**\n     * Asserts that a haystack contains only values of type closed resource.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2298":"\/**\n     * Asserts that a haystack contains only values of type scalar.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2299":"\/**\n     * Asserts that a haystack contains only values of type string.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2300":"\/**\n     * Asserts that a haystack contains only instances of a specified interface or class name.\n     *\n     * @param class-string    $className\n     * @param iterable<mixed> $haystack\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\/","2301":"\/**\n     * Asserts that a haystack does not contain only values of a given type.\n     *\n     * @param 'array'|'bool'|'boolean'|'callable'|'double'|'float'|'int'|'integer'|'iterable'|'null'|'numeric'|'object'|'real'|'resource (closed)'|'resource'|'scalar'|'string' $type\n     * @param iterable<mixed>                                                                                                                                                   $haystack\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @deprecated https:\/\/github.com\/sebastianbergmann\/phpunit\/issues\/6056\n     *\/","2302":"\/**\n     * Asserts that a haystack does not contain only values of type array.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2303":"\/**\n     * Asserts that a haystack does not contain only values of type bool.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2304":"\/**\n     * Asserts that a haystack does not contain only values of type callable.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2305":"\/**\n     * Asserts that a haystack does not contain only values of type float.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2306":"\/**\n     * Asserts that a haystack does not contain only values of type int.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2307":"\/**\n     * Asserts that a haystack does not contain only values of type iterable.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2308":"\/**\n     * Asserts that a haystack does not contain only values of type null.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2309":"\/**\n     * Asserts that a haystack does not contain only values of type numeric.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2310":"\/**\n     * Asserts that a haystack does not contain only values of type object.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2311":"\/**\n     * Asserts that a haystack does not contain only values of type resource.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2312":"\/**\n     * Asserts that a haystack does not contain only values of type closed resource.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2313":"\/**\n     * Asserts that a haystack does not contain only values of type scalar.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2314":"\/**\n     * Asserts that a haystack does not contain only values of type string.\n     *\n     * @param iterable<mixed> $haystack\n     *\n     * @throws ExpectationFailedException\n     *\/","2315":"\/**\n     * Asserts that a haystack does not contain only instances of a specified interface or class name.\n     *\n     * @param class-string    $className\n     * @param iterable<mixed> $haystack\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\/","2316":"\/**\n     * Asserts the number of elements of an array, Countable or Traversable.\n     *\n     * @param Countable|iterable<mixed> $haystack\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     * @throws GeneratorNotSupportedException\n     *\/","2318":"\/**\n     * Asserts that two variables are equal.\n     *\n     * @throws ExpectationFailedException\n     *\/","2319":"\/**\n     * Asserts that two variables are equal (canonicalizing).\n     *\n     * @throws ExpectationFailedException\n     *\/","2320":"\/**\n     * Asserts that two variables are equal (ignoring case).\n     *\n     * @throws ExpectationFailedException\n     *\/","2321":"\/**\n     * Asserts that two variables are equal (with delta).\n     *\n     * @throws ExpectationFailedException\n     *\/","2322":"\/**\n     * Asserts that two variables are not equal.\n     *\n     * @throws ExpectationFailedException\n     *\/","2323":"\/**\n     * Asserts that two variables are not equal (canonicalizing).\n     *\n     * @throws ExpectationFailedException\n     *\/","2324":"\/**\n     * Asserts that two variables are not equal (ignoring case).\n     *\n     * @throws ExpectationFailedException\n     *\/","2325":"\/**\n     * Asserts that two variables are not equal (with delta).\n     *\n     * @throws ExpectationFailedException\n     *\/","2326":"\/**\n     * @throws ExpectationFailedException\n     *\/","2328":"\/**\n     * Asserts that a variable is empty.\n     *\n     * @throws ExpectationFailedException\n     * @throws GeneratorNotSupportedException\n     *\n     * @phpstan-assert empty $actual\n     *\/","2329":"\/**\n     * Asserts that a variable is not empty.\n     *\n     * @throws ExpectationFailedException\n     * @throws GeneratorNotSupportedException\n     *\n     * @phpstan-assert !empty $actual\n     *\/","2330":"\/**\n     * Asserts that a value is greater than another value.\n     *\n     * @throws ExpectationFailedException\n     *\/","2331":"\/**\n     * Asserts that a value is greater than or equal to another value.\n     *\n     * @throws ExpectationFailedException\n     *\/","2332":"\/**\n     * Asserts that a value is smaller than another value.\n     *\n     * @throws ExpectationFailedException\n     *\/","2333":"\/**\n     * Asserts that a value is smaller than or equal to another value.\n     *\n     * @throws ExpectationFailedException\n     *\/","2334":"\/**\n     * Asserts that the contents of one file is equal to the contents of another\n     * file.\n     *\n     * @throws ExpectationFailedException\n     *\/","2335":"\/**\n     * Asserts that the contents of one file is equal to the contents of another\n     * file (canonicalizing).\n     *\n     * @throws ExpectationFailedException\n     *\/","2336":"\/**\n     * Asserts that the contents of one file is equal to the contents of another\n     * file (ignoring case).\n     *\n     * @throws ExpectationFailedException\n     *\/","2337":"\/**\n     * Asserts that the contents of one file is not equal to the contents of\n     * another file.\n     *\n     * @throws ExpectationFailedException\n     *\/","2338":"\/**\n     * Asserts that the contents of one file is not equal to the contents of another\n     * file (canonicalizing).\n     *\n     * @throws ExpectationFailedException\n     *\/","2339":"\/**\n     * Asserts that the contents of one file is not equal to the contents of another\n     * file (ignoring case).\n     *\n     * @throws ExpectationFailedException\n     *\/","2340":"\/**\n     * Asserts that the contents of a string is equal\n     * to the contents of a file.\n     *\n     * @throws ExpectationFailedException\n     *\/","2341":"\/**\n     * Asserts that the contents of a string is equal\n     * to the contents of a file (canonicalizing).\n     *\n     * @throws ExpectationFailedException\n     *\/","2342":"\/**\n     * Asserts that the contents of a string is equal\n     * to the contents of a file (ignoring case).\n     *\n     * @throws ExpectationFailedException\n     *\/","2343":"\/**\n     * Asserts that the contents of a string is not equal\n     * to the contents of a file.\n     *\n     * @throws ExpectationFailedException\n     *\/","2344":"\/**\n     * Asserts that the contents of a string is not equal\n     * to the contents of a file (canonicalizing).\n     *\n     * @throws ExpectationFailedException\n     *\/","2345":"\/**\n     * Asserts that the contents of a string is not equal\n     * to the contents of a file (ignoring case).\n     *\n     * @throws ExpectationFailedException\n     *\/","2346":"\/**\n     * Asserts that a file\/dir is readable.\n     *\n     * @throws ExpectationFailedException\n     *\/","2347":"\/**\n     * Asserts that a file\/dir exists and is not readable.\n     *\n     * @throws ExpectationFailedException\n     *\/","2348":"\/**\n     * Asserts that a file\/dir exists and is writable.\n     *\n     * @throws ExpectationFailedException\n     *\/","2349":"\/**\n     * Asserts that a file\/dir exists and is not writable.\n     *\n     * @throws ExpectationFailedException\n     *\/","2350":"\/**\n     * Asserts that a directory exists.\n     *\n     * @throws ExpectationFailedException\n     *\/","2351":"\/**\n     * Asserts that a directory does not exist.\n     *\n     * @throws ExpectationFailedException\n     *\/","2352":"\/**\n     * Asserts that a directory exists and is readable.\n     *\n     * @throws ExpectationFailedException\n     *\/","2353":"\/**\n     * Asserts that a directory exists and is not readable.\n     *\n     * @throws ExpectationFailedException\n     *\/","2354":"\/**\n     * Asserts that a directory exists and is writable.\n     *\n     * @throws ExpectationFailedException\n     *\/","2355":"\/**\n     * Asserts that a directory exists and is not writable.\n     *\n     * @throws ExpectationFailedException\n     *\/","2356":"\/**\n     * Asserts that a file exists.\n     *\n     * @throws ExpectationFailedException\n     *\/","2357":"\/**\n     * Asserts that a file does not exist.\n     *\n     * @throws ExpectationFailedException\n     *\/","2358":"\/**\n     * Asserts that a file exists and is readable.\n     *\n     * @throws ExpectationFailedException\n     *\/","2359":"\/**\n     * Asserts that a file exists and is not readable.\n     *\n     * @throws ExpectationFailedException\n     *\/","2360":"\/**\n     * Asserts that a file exists and is writable.\n     *\n     * @throws ExpectationFailedException\n     *\/","2361":"\/**\n     * Asserts that a file exists and is not writable.\n     *\n     * @throws ExpectationFailedException\n     *\/","2362":"\/**\n     * Asserts that a condition is true.\n     *\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert true $condition\n     *\/","2363":"\/**\n     * Asserts that a condition is not true.\n     *\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert !true $condition\n     *\/","2364":"\/**\n     * Asserts that a condition is false.\n     *\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert false $condition\n     *\/","2365":"\/**\n     * Asserts that a condition is not false.\n     *\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert !false $condition\n     *\/","2366":"\/**\n     * Asserts that a variable is null.\n     *\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert null $actual\n     *\/","2367":"\/**\n     * Asserts that a variable is not null.\n     *\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert !null $actual\n     *\/","2368":"\/**\n     * Asserts that a variable is finite.\n     *\n     * @throws ExpectationFailedException\n     *\/","2369":"\/**\n     * Asserts that a variable is infinite.\n     *\n     * @throws ExpectationFailedException\n     *\/","2370":"\/**\n     * Asserts that a variable is nan.\n     *\n     * @throws ExpectationFailedException\n     *\/","2371":"\/**\n     * Asserts that an object has a specified property.\n     *\n     * @throws ExpectationFailedException\n     *\/","2372":"\/**\n     * Asserts that an object does not have a specified property.\n     *\n     * @throws ExpectationFailedException\n     *\/","2373":"\/**\n     * Asserts that two variables have the same type and value.\n     * Used on objects, it asserts that two variables reference\n     * the same object.\n     *\n     * @template ExpectedType\n     *\n     * @param ExpectedType $expected\n     *\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert =ExpectedType $actual\n     *\/","2374":"\/**\n     * Asserts that two variables do not have the same type and value.\n     * Used on objects, it asserts that two variables do not reference\n     * the same object.\n     *\n     * @throws ExpectationFailedException\n     *\/","2375":"\/**\n     * Asserts that a variable is of a given type.\n     *\n     * @template ExpectedType of object\n     *\n     * @param class-string<ExpectedType> $expected\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     * @throws UnknownClassOrInterfaceException\n     *\n     * @phpstan-assert =ExpectedType $actual\n     *\/","2376":"\/**\n     * Asserts that a variable is not of a given type.\n     *\n     * @template ExpectedType of object\n     *\n     * @param class-string<ExpectedType> $expected\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert !ExpectedType $actual\n     *\/","2377":"\/**\n     * Asserts that a variable is of type array.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert array<mixed> $actual\n     *\/","2378":"\/**\n     * Asserts that a variable is of type bool.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert bool $actual\n     *\/","2379":"\/**\n     * Asserts that a variable is of type float.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert float $actual\n     *\/","2380":"\/**\n     * Asserts that a variable is of type int.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert int $actual\n     *\/","2381":"\/**\n     * Asserts that a variable is of type numeric.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert numeric $actual\n     *\/","2382":"\/**\n     * Asserts that a variable is of type object.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert object $actual\n     *\/","2383":"\/**\n     * Asserts that a variable is of type resource.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert resource $actual\n     *\/","2384":"\/**\n     * Asserts that a variable is of type resource and is closed.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert resource $actual\n     *\/","2385":"\/**\n     * Asserts that a variable is of type string.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert string $actual\n     *\/","2386":"\/**\n     * Asserts that a variable is of type scalar.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert scalar $actual\n     *\/","2387":"\/**\n     * Asserts that a variable is of type callable.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert callable $actual\n     *\/","2388":"\/**\n     * Asserts that a variable is of type iterable.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert iterable<mixed> $actual\n     *\/","2389":"\/**\n     * Asserts that a variable is not of type array.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert !array<mixed> $actual\n     *\/","2390":"\/**\n     * Asserts that a variable is not of type bool.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert !bool $actual\n     *\/","2391":"\/**\n     * Asserts that a variable is not of type float.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert !float $actual\n     *\/","2392":"\/**\n     * Asserts that a variable is not of type int.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert !int $actual\n     *\/","2393":"\/**\n     * Asserts that a variable is not of type numeric.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert !numeric $actual\n     *\/","2394":"\/**\n     * Asserts that a variable is not of type object.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert !object $actual\n     *\/","2395":"\/**\n     * Asserts that a variable is not of type resource.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert !resource $actual\n     *\/","2397":"\/**\n     * Asserts that a variable is not of type string.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert !string $actual\n     *\/","2398":"\/**\n     * Asserts that a variable is not of type scalar.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert !scalar $actual\n     *\/","2399":"\/**\n     * Asserts that a variable is not of type callable.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert !callable $actual\n     *\/","2400":"\/**\n     * Asserts that a variable is not of type iterable.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\n     * @phpstan-assert !iterable<mixed> $actual\n     *\/","2401":"\/**\n     * Asserts that a string matches a given regular expression.\n     *\n     * @throws ExpectationFailedException\n     *\/","2402":"\/**\n     * Asserts that a string does not match a given regular expression.\n     *\n     * @throws ExpectationFailedException\n     *\/","2403":"\/**\n     * Assert that the size of two arrays (or `Countable` or `Traversable` objects)\n     * is the same.\n     *\n     * @param Countable|iterable<mixed> $expected\n     * @param Countable|iterable<mixed> $actual\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     * @throws GeneratorNotSupportedException\n     *\/","2404":"\/**\n     * Assert that the size of two arrays (or `Countable` or `Traversable` objects)\n     * is not the same.\n     *\n     * @param Countable|iterable<mixed> $expected\n     * @param Countable|iterable<mixed> $actual\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     * @throws GeneratorNotSupportedException\n     *\/","2406":"\/**\n     * Asserts that two strings are equal except for line endings.\n     *\n     * @throws ExpectationFailedException\n     *\/","2407":"\/**\n     * Asserts that a string matches a given format string.\n     *\n     * @throws ExpectationFailedException\n     *\/","2410":"\/**\n     * Asserts that a string matches a given format file.\n     *\n     * @throws ExpectationFailedException\n     *\/","2411":"\/**\n     * Asserts that a string starts with a given prefix.\n     *\n     * @param non-empty-string $prefix\n     *\n     * @throws ExpectationFailedException\n     * @throws InvalidArgumentException\n     *\/","2412":"\/**\n     * Asserts that a string starts not with a given prefix.\n     *\n     * @param non-empty-string $prefix\n     *\n     * @throws ExpectationFailedException\n     * @throws InvalidArgumentException\n     *\/","2417":"\/**\n     * Asserts that a string ends with a given suffix.\n     *\n     * @param non-empty-string $suffix\n     *\n     * @throws ExpectationFailedException\n     * @throws InvalidArgumentException\n     *\/","2418":"\/**\n     * Asserts that a string ends not with a given suffix.\n     *\n     * @param non-empty-string $suffix\n     *\n     * @throws ExpectationFailedException\n     * @throws InvalidArgumentException\n     *\/","2419":"\/**\n     * Asserts that two XML files are equal.\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     * @throws XmlException\n     *\/","2420":"\/**\n     * Asserts that two XML files are not equal.\n     *\n     * @throws \\PHPUnit\\Util\\Exception\n     * @throws ExpectationFailedException\n     *\/","2421":"\/**\n     * Asserts that two XML documents are equal.\n     *\n     * @throws ExpectationFailedException\n     * @throws XmlException\n     *\/","2422":"\/**\n     * Asserts that two XML documents are not equal.\n     *\n     * @throws ExpectationFailedException\n     * @throws XmlException\n     *\/","2425":"\/**\n     * Evaluates a PHPUnit\\Framework\\Constraint matcher object.\n     *\n     * @throws ExpectationFailedException\n     *\/","2426":"\/**\n     * Asserts that a string is a valid JSON string.\n     *\n     * @throws ExpectationFailedException\n     *\/","2427":"\/**\n     * Asserts that two given JSON encoded objects or arrays are equal.\n     *\n     * @throws ExpectationFailedException\n     *\/","2428":"\/**\n     * Asserts that two given JSON encoded objects or arrays are not equal.\n     *\n     * @throws ExpectationFailedException\n     *\/","2429":"\/**\n     * Asserts that the generated JSON encoded object and the content of the given file are equal.\n     *\n     * @throws ExpectationFailedException\n     *\/","2430":"\/**\n     * Asserts that the generated JSON encoded object and the content of the given file are not equal.\n     *\n     * @throws ExpectationFailedException\n     *\/","2431":"\/**\n     * Asserts that two JSON files are equal.\n     *\n     * @throws ExpectationFailedException\n     *\/","2432":"\/**\n     * Asserts that two JSON files are not equal.\n     *\n     * @throws ExpectationFailedException\n     *\/","2433":"\/**\n     * @throws Exception\n     *\/","2434":"\/**\n     * @template CallbackInput of mixed\n     *\n     * @param callable(CallbackInput $callback): bool $callback\n     *\n     * @return Callback<CallbackInput>\n     *\/","2435":"\/**\n     * @param 'array'|'bool'|'boolean'|'callable'|'double'|'float'|'int'|'integer'|'iterable'|'null'|'numeric'|'object'|'real'|'resource (closed)'|'resource'|'scalar'|'string' $type\n     *\n     * @throws Exception\n     *\n     * @deprecated https:\/\/github.com\/sebastianbergmann\/phpunit\/issues\/6060\n     *\/","2436":"\/**\n     * @param class-string $className\n     *\n     * @throws Exception\n     *\/","2437":"\/**\n     * @throws UnknownClassOrInterfaceException\n     *\/","2438":"\/**\n     * @param 'array'|'bool'|'boolean'|'callable'|'double'|'float'|'int'|'integer'|'iterable'|'null'|'numeric'|'object'|'real'|'resource (closed)'|'resource'|'scalar'|'string' $type\n     *\n     * @throws UnknownNativeTypeException\n     *\n     * @deprecated https:\/\/github.com\/sebastianbergmann\/phpunit\/issues\/6053\n     *\/","2439":"\/**\n     * @param non-empty-string $prefix\n     *\n     * @throws InvalidArgumentException\n     *\/","2440":"\/**\n     * @param non-empty-string $suffix\n     *\n     * @throws InvalidArgumentException\n     *\/","2441":"\/**\n     * Fails a test with the given message.\n     *\n     * @throws AssertionFailedError\n     *\/","2442":"\/**\n     * Mark the test as incomplete.\n     *\n     * @throws IncompleteTestError\n     *\/","2443":"\/**\n     * Mark the test as skipped.\n     *\n     * @throws SkippedWithMessageException\n     *\/","2444":"\/**\n     * Return the current assertion count.\n     *\/","2445":"\/**\n     * Reset the assertion counter.\n     *\/","2446":"\/**\n     * @throws UnknownNativeTypeException\n     *\/","2449":"\/**\n     * Wrapper for getMessage() which is declared as final.\n     *\/","2467":"\/**\n     * @param class-string $interfaceName\n     *\/","2471":"\/**\n     * @param non-empty-string $functionName\n     *\/","2481":"\/**\n     * @param non-empty-string $namespace\n     *\/","2485":"\/**\n     * @var trait-string\n     *\/","2486":"\/**\n     * @param trait-string $traitName\n     *\/","2487":"\/**\n     * @return trait-string\n     *\/","2490":"\/**\n     * @param non-empty-string $methodName\n     *\/","2544":"\/**\n     * @param non-empty-string $globalVariableName\n     *\/","2549":"\/**\n     * @param class-string     $className\n     * @param non-empty-string $propertyName\n     *\/","2557":"\/**\n * @immutable\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This class is not covered by the backward compatibility promise for PHPUnit\n *\/","2576":"\/**\n     * @param non-empty-string $regularExpression\n     *\/","2580":"\/**\n     * @param non-empty-string $operatingSystemFamily\n     *\/","2584":"\/**\n     * @param non-empty-string $versionRequirement\n     *\/","2588":"\/**\n     * @var null|non-empty-string\n     *\/","2589":"\/**\n     * @param non-empty-string      $extension\n     * @param null|non-empty-string $versionRequirement\n     *\/","2591":"\/**\n     * @return null|non-empty-string\n     *\/","2597":"\/**\n     * @var class-string<Extension>\n     *\/","2598":"\/**\n     * @param class-string<Extension> $extensionClass\n     *\/","2599":"\/**\n     * @return class-string<Extension>\n     *\/","2603":"\/**\n     * @param non-empty-string $setting\n     * @param non-empty-string $value\n     *\/","2613":"\/**\n     * @param non-empty-string $text\n     *\/","2616":"\/**\n     * @var array<mixed>\n     *\/","2617":"\/**\n     * @var ?non-empty-string\n     *\/","2618":"\/**\n     * @param array<mixed>      $data\n     * @param ?non-empty-string $name\n     *\/","2619":"\/**\n     * @return array<mixed>\n     *\/","2620":"\/**\n     * @return ?non-empty-string\n     *\/","2624":"\/**\n     * @param non-empty-string  $json\n     * @param ?non-empty-string $name\n     *\/","2681":"\/**\n     * Returns a string representation of the constraint.\n     *\/","2682":"\/**\n     * Evaluates the constraint for parameter $other. Returns true if the\n     * constraint is met, false otherwise.\n     *\/","2683":"\/**\n     * Returns the description of the failure.\n     *\n     * The beginning of failure messages is \"Failed asserting that\" in most\n     * cases. This method should return the second part of that sentence.\n     *\/","2684":"\/**\n     * Evaluates the constraint for parameter $other.\n     *\n     * If $returnResult is set to false (the default), an exception is thrown\n     * in case of a failure. null is returned otherwise.\n     *\n     * If $returnResult is true, the result of the evaluation is returned as\n     * a boolean value instead: true in case of success, false in case of a\n     * failure.\n     *\n     * @throws ExpectationFailedException\n     *\/","2685":"\/**\n     * Counts the number of constraint elements.\n     *\/","2686":"\/**\n     * Throws an exception for the given compared value and test description.\n     *\n     * @throws ExpectationFailedException\n     *\/","2687":"\/**\n     * Return additional failure description where needed.\n     *\n     * The function can be overridden to provide additional failure\n     * information like a diff\n     *\/","2688":"\/**\n     * Returns a custom string representation of the constraint object when it\n     * appears in context of an $operator expression.\n     *\n     * The purpose of this method is to provide meaningful descriptive string\n     * in context of operators such as LogicalNot. Native PHPUnit constraints\n     * are supported out of the box by LogicalNot, but externally developed\n     * ones had no way to provide correct strings in this context.\n     *\n     * The method shall return empty string, when it does not handle\n     * customization by itself.\n     *\/","2689":"\/**\n     * Returns the description of the failure when this constraint appears in\n     * context of an $operator expression.\n     *\n     * The purpose of this method is to provide meaningful failure description\n     * in context of operators such as LogicalNot. Native PHPUnit constraints\n     * are supported out of the box by LogicalNot, but externally developed\n     * ones had no way to provide correct messages in this context.\n     *\n     * The method shall return empty string, when it does not handle\n     * customization by itself.\n     *\/","2690":"\/**\n     * Reduces the sub-expression starting at $this by skipping degenerate\n     * sub-expression and returns first descendant constraint that starts\n     * a non-reducible sub-expression.\n     *\n     * Returns $this for terminal constraints and for operators that start\n     * non-reducible sub-expression, or the nearest descendant of $this that\n     * starts a non-reducible sub-expression.\n     *\n     * A constraint expression may be modelled as a tree with non-terminal\n     * nodes (operators) and terminal nodes. For example:\n     *\n     *      LogicalOr           (operator, non-terminal)\n     *      + LogicalAnd        (operator, non-terminal)\n     *      | + IsType('int')   (terminal)\n     *      | + GreaterThan(10) (terminal)\n     *      + LogicalNot        (operator, non-terminal)\n     *        + IsType('array') (terminal)\n     *\n     * A degenerate sub-expression is a part of the tree, that effectively does\n     * not contribute to the evaluation of the expression it appears in. An example\n     * of degenerate sub-expression is a BinaryOperator constructed with single\n     * operand or nested BinaryOperators, each with single operand. An\n     * expression involving a degenerate sub-expression is equivalent to a\n     * reduced expression with the degenerate sub-expression removed, for example\n     *\n     *      LogicalAnd          (operator)\n     *      + LogicalOr         (degenerate operator)\n     *      | + LogicalAnd      (degenerate operator)\n     *      |   + IsType('int') (terminal)\n     *      + GreaterThan(10)   (terminal)\n     *\n     * is equivalent to\n     *\n     *      LogicalAnd          (operator)\n     *      + IsType('int')     (terminal)\n     *      + GreaterThan(10)   (terminal)\n     *\n     * because the subexpression\n     *\n     *      + LogicalOr\n     *        + LogicalAnd\n     *          + -\n     *\n     * is degenerate. Calling reduce() on the LogicalOr object above, as well\n     * as on LogicalAnd, shall return the IsType('int') instance.\n     *\n     * Other specific reductions can be implemented, for example cascade of\n     * LogicalNot operators\n     *\n     *      + LogicalNot\n     *        + LogicalNot\n     *          +LogicalNot\n     *           + IsTrue\n     *\n     * can be reduced to\n     *\n     *      LogicalNot\n     *      + IsTrue\n     *\/","2693":"\/**\n     * @var list<Constraint>\n     *\/","2694":"\/**\n     * Returns the number of operands (constraints).\n     *\/","2697":"\/**\n     * @return list<Constraint>\n     *\/","2698":"\/**\n     * Returns true if the $constraint needs to be wrapped with braces.\n     *\/","2699":"\/**\n     * Reduces the sub-expression starting at $this by skipping degenerate\n     * sub-expression and returns first descendant constraint that starts\n     * a non-reducible sub-expression.\n     *\n     * See Constraint::reduce() for more.\n     *\/","2700":"\/**\n     * Returns string representation of given operand in context of this operator.\n     *\/","2701":"\/**\n     * Returns the name of this operator.\n     *\/","2702":"\/**\n     * Returns this operator's precedence.\n     *\n     * @see https:\/\/www.php.net\/manual\/en\/language.operators.precedence.php\n     *\/","2703":"\/**\n     * Validates $constraint argument.\n     *\/","2705":"\/**\n     * Evaluates the constraint for parameter $other. Returns true if the\n     * constraint is met, false otherwise.\n     *\n     * This method can be overridden to implement the evaluation algorithm.\n     *\/","2708":"\/**\n     * Returns the description of the failure.\n     *\n     * The beginning of failure messages is \"Failed asserting that\" in most\n     * cases. This method should return the second part of that sentence.\n     *\n     * To provide additional failure information additionalFailureDescription\n     * can be used.\n     *\/","2712":"\/**\n * @template CallbackInput of mixed\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\/","2713":"\/**\n     * @var callable(CallbackInput): bool\n     *\/","2714":"\/**\n     * @param callable(CallbackInput $input): bool $callback\n     *\/","2716":"\/**\n     * Evaluates the constraint for parameter $value. Returns true if the\n     * constraint is met, false otherwise.\n     *\n     * @param CallbackInput $other\n     *\/","2737":"\/**\n     * Returns a string representation of the object.\n     *\/","2739":"\/**\n     * Evaluates the constraint for parameter $other. Returns true if the\n     * constraint is met, false otherwise.\n     *\n     * @throws Exception\n     *\/","2741":"\/**\n     * Returns the description of the failure.\n     *\n     * The beginning of failure messages is \"Failed asserting that\" in most\n     * cases. This method should return the second part of that sentence.\n     *\n     * @throws Exception\n     *\/","2765":"\/**\n     * Returns the description of the failure.\n     *\n     * The beginning of failure messages is \"Failed asserting that\" in most\n     * cases. This method should return the second part of that sentence.\n     *\n     * @throws \\PHPUnit\\Framework\\Exception\n     *\/","2796":"\/**\n     * Evaluates the constraint for parameter $other. Returns true if the\n     * constraint is met, false otherwise.\n     *\n     * @throws \\PHPUnit\\Framework\\Exception\n     * @throws Exception\n     *\/","2831":"\/**\n     * Evaluates the constraint for parameter $other.\n     *\n     * If $returnResult is set to false (the default), an exception is thrown\n     * in case of a failure. null is returned otherwise.\n     *\n     * If $returnResult is true, the result of the evaluation is returned as\n     * a boolean value instead: true in case of success, false in case of a\n     * failure.\n     *\/","2952":"\/**\n     * @var 'class'|'interface'\n     *\/","3064":"\/**\n     * Throws an exception for the given compared value and test description.\n     *\n     * @throws ExpectationFailedException\n     * @throws InvalidJsonException\n     *\/","3106":"\/**\n     * Evaluates the constraint for parameter $other. Returns true if the\n     * constraint is met, false otherwise.\n     *\n     * @throws ExpectationFailedException\n     *\/","3107":"\/**\n     * Applies additional transformation to strings returned by toString() or\n     * failureDescription().\n     *\/","3113":"\/**\n     * Provides access to $this->constraint for subclasses.\n     *\/","3114":"\/**\n     * Returns true if the $constraint needs to be wrapped with parentheses.\n     *\/","3142":"\/**\n     * Returns this operator's precedence.\n     *\n     * @see https:\/\/www.php.net\/manual\/en\/language.operators.precedence.php.\n     *\/","3159":"\/**\n     * @throws ActualValueIsNotAnObjectException\n     * @throws ComparisonMethodDoesNotAcceptParameterTypeException\n     * @throws ComparisonMethodDoesNotDeclareBoolReturnTypeException\n     * @throws ComparisonMethodDoesNotDeclareExactlyOneParameterException\n     * @throws ComparisonMethodDoesNotDeclareParameterTypeException\n     * @throws ComparisonMethodDoesNotExistException\n     *\/","3170":"\/**\n     * Evaluates the constraint for parameter $other. Returns true if the\n     * constraint is met, false otherwise.\n     *\n     * @param mixed $other value or object to evaluate\n     *\/","3171":"\/**\n     * Returns the description of the failure.\n     *\n     * The beginning of failure messages is \"Failed asserting that\" in most\n     * cases. This method should return the second part of that sentence.\n     *\n     * @param mixed $other evaluated value or object\n     *\/","3183":"\/**\n     * Returns the number of operands.\n     *\/","3210":"\/**\n     * @param Countable|iterable<mixed> $expected\n     *\n     * @throws Exception\n     *\/","3234":"\/**\n     * @throws EmptyStringException\n     *\/","3317":"\/**\n     * @param class-string $type\n     *\/","3334":"\/**\n     * Transforms string returned by the member constraint's toString() or\n     * failureDescription() such that it reflects constraint's participation in\n     * this expression.\n     *\n     * The method may be overwritten in a subclass to apply default\n     * transformation in case the operand constraint does not provide its own\n     * custom strings via toStringInContext() or failureDescriptionInContext().\n     *\/","3349":"\/**\n     * @var list<ExecutionOrderDependency>\n     *\/","3350":"\/**\n     * @var ?non-empty-list<ExecutionOrderDependency>\n     *\/","3351":"\/**\n     * @param list<ExecutionOrderDependency> $dependencies\n     *\/","3352":"\/**\n     * @return non-empty-list<ExecutionOrderDependency>\n     *\/","3353":"\/**\n     * @return list<ExecutionOrderDependency>\n     *\/","3354":"\/**\n     * Returns the size of each test created using the data provider(s).\n     *\/","3356":"\/**\n     * @param ReflectionClass<TestCase> $class\n     * @param list<non-empty-string>    $groups\n     *\/","3357":"\/**\n     * Adds a test to the suite.\n     *\n     * @param list<non-empty-string> $groups\n     *\/","3358":"\/**\n     * Adds the tests from the given class to the suite.\n     *\n     * @param ReflectionClass<TestCase> $testClass\n     * @param list<non-empty-string>    $groups\n     *\n     * @throws Exception\n     *\/","3359":"\/**\n     * Wraps both <code>addTest()<\/code> and <code>addTestSuite<\/code>\n     * as well as the separate import statements for the user's convenience.\n     *\n     * If the named file cannot be read or there are no new tests that can be\n     * added, a <code>PHPUnit\\Framework\\WarningTestCase<\/code> will be created instead,\n     * leaving the current test run untouched.\n     *\n     * @param list<non-empty-string> $groups\n     *\n     * @throws Exception\n     *\/","3360":"\/**\n     * Wrapper for addTestFile() that adds multiple test files.\n     *\n     * @param iterable<string> $fileNames\n     *\n     * @throws Exception\n     *\/","3361":"\/**\n     * Counts the number of test cases that will be run by this test.\n     *\/","3363":"\/**\n     * @return array<non-empty-string, list<non-empty-string>>\n     *\/","3364":"\/**\n     * @return list<PhptTestCase|TestCase>\n     *\/","3365":"\/**\n     * @throws CodeCoverageException\n     * @throws Event\\RuntimeException\n     * @throws Exception\n     * @throws InvalidArgumentException\n     * @throws NoPreviousThrowableException\n     * @throws UnintentionallyCoveredCodeException\n     *\/","3366":"\/**\n     * Returns the tests as an enumeration.\n     *\n     * @return list<Test>\n     *\/","3367":"\/**\n     * Set tests of the test suite.\n     *\n     * @param list<Test> $tests\n     *\/","3368":"\/**\n     * Mark the test suite as skipped.\n     *\n     * @throws SkippedTestSuiteError\n     *\/","3369":"\/**\n     * Returns an iterator for this test suite.\n     *\/","3370":"\/**\n     * @phpstan-assert-if-true class-string<TestCase> $this->name\n     *\/","3371":"\/**\n     * @param ReflectionClass<TestCase> $class\n     * @param list<non-empty-string>    $groups\n     *\n     * @throws Exception\n     *\/","3375":"\/**\n * Base class for all PHPUnit Framework exceptions.\n *\n * Ensures that exceptions thrown during a test run do not leave stray\n * references behind.\n *\n * Every Exception contains a stack trace. Each stack frame contains the 'args'\n * of the called function. The function arguments can contain references to\n * instantiated objects. The references prevent the objects from being\n * destructed (until test results are eventually printed), so memory cannot be\n * freed up.\n *\n * With enabled process isolation, test results are serialized in the child\n * process and unserialized in the parent process. The stack trace of Exceptions\n * may contain objects that cannot be serialized or unserialized (e.g., PDO\n * connections). Unserializing user-space objects from the child process into\n * the parent would break the intended encapsulation of process isolation.\n *\n * @see http:\/\/fabien.potencier.org\/article\/9\/php-serialization-stack-traces-and-exceptions\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This class is not covered by the backward compatibility promise for PHPUnit\n *\/","3379":"\/**\n     * @param list<ExecutionOrderDependency> $dependencies\n     *\n     * @return list<ExecutionOrderDependency>\n     *\/","3380":"\/**\n     * @param list<ExecutionOrderDependency> $existing\n     * @param list<ExecutionOrderDependency> $additional\n     *\n     * @return list<ExecutionOrderDependency>\n     *\/","3381":"\/**\n     * @param list<ExecutionOrderDependency> $left\n     * @param list<ExecutionOrderDependency> $right\n     *\n     * @return list<ExecutionOrderDependency>\n     *\/","3382":"\/**\n * Exception for expectations which failed their check.\n *\n * The exception contains the error message and optionally a\n * SebastianBergmann\\Comparator\\ComparisonFailure which is used to\n * generate diff output of the failed expectations.\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This class is not covered by the backward compatibility promise for PHPUnit\n *\/","3411":"\/**\n     * Sets the identification of the expectation to $id.\n     *\n     * @note The identifier is unique per mock object.\n     *\/","3413":"\/**\n     * @var list<ConfigurableMethod>\n     *\/","3414":"\/**\n     * @var ?array<string, int>\n     *\/","3415":"\/**\n     * @throws MatcherAlreadyRegisteredException\n     *\n     * @return $this\n     *\/","3416":"\/**\n     * @return $this\n     *\/","3417":"\/**\n     * @throws IncompatibleReturnValueException\n     *\/","3419":"\/**\n     * @throws \\PHPUnit\\Framework\\Exception\n     * @throws MethodNameNotConfiguredException\n     * @throws MethodParametersAlreadyConfiguredException\n     *\n     * @return $this\n     *\/","3420":"\/**\n     * @throws MethodNameNotConfiguredException\n     * @throws MethodParametersAlreadyConfiguredException\n     *\n     * @return $this\n     *\/","3421":"\/**\n     * @throws InvalidArgumentException\n     * @throws MethodCannotBeConfiguredException\n     * @throws MethodNameAlreadyConfiguredException\n     *\n     * @return $this\n     *\/","3422":"\/**\n     * @throws MethodNameNotConfiguredException\n     * @throws MethodParametersAlreadyConfiguredException\n     *\/","3423":"\/**\n     * @param array<mixed> $values\n     *\n     * @throws IncompatibleReturnValueException\n     *\/","3425":"\/**\n     * @param array<int, array<int, mixed>> $valueMap\n     *\/","3427":"\/**\n     * Adds a new method name match and returns the parameter match object for\n     * further matching possibilities.\n     *\/","3428":"\/**\n     * Defines the expectation which must occur before the current is valid.\n     *\/","3429":"\/**\n     * Sets the parameters to match for, each parameter to this function will\n     * be part of match. To perform specific matches or constraints create a\n     * new PHPUnit\\Framework\\Constraint\\Constraint and use it for the parameter.\n     * If the parameter value is not a constraint it will use the\n     * PHPUnit\\Framework\\Constraint\\IsEqual for the value.\n     *\n     * Some examples:\n     * <code>\n     * \/\/ match first parameter with value 2\n     * $b->with(2);\n     * \/\/ match first parameter with value 'smock' and second identical to 42\n     * $b->with('smock', new PHPUnit\\Framework\\Constraint\\IsEqual(42));\n     * <\/code>\n     *\/","3430":"\/**\n     * Sets a rule which allows any kind of parameters.\n     *\n     * Some examples:\n     * <code>\n     * \/\/ match any number of parameters\n     * $b->withAnyParameters();\n     * <\/code>\n     *\/","3431":"\/**\n     * Stubs the matching method with the stub object $stub. Any invocations of\n     * the matched method will now be handled by the stub instead.\n     *\/","3447":"\/**\n     * @var array<int, mixed>\n     *\/","3449":"\/**\n     * @param non-empty-string  $name\n     * @param array<int, mixed> $defaultParameterValues\n     * @param non-negative-int  $numberOfParameters\n     *\/","3451":"\/**\n     * @return array<int, mixed>\n     *\/","3453":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This trait is not covered by the backward compatibility promise for PHPUnit\n *\/","3464":"\/**\n     * @param class-string             $mockName\n     * @param list<ConfigurableMethod> $configurableMethods\n     *\/","3466":"\/**\n     * @return list<ConfigurableMethod>\n     *\/","3472":"\/**\n     * @var array<string,Template>\n     *\/","3473":"\/**\n     * @throws ReflectionException\n     * @throws RuntimeException\n     *\/","3475":"\/**\n     * @param class-string      $className\n     * @param non-empty-string  $methodName\n     * @param array<int, mixed> $defaultParameterValues\n     * @param non-negative-int  $numberOfParameters\n     *\/","3480":"\/**\n     * Returns the parameters of a function or method.\n     *\n     * @throws RuntimeException\n     *\/","3481":"\/**\n     * Returns the parameters of a function or method.\n     *\n     * @throws ReflectionException\n     *\/","3482":"\/**\n     * @throws ReflectionException\n     *\/","3485":"\/**\n     * @var array<string,DoubledMethod>\n     *\/","3486":"\/**\n     * @return list<DoubledMethod>\n     *\/","3489":"\/**\n     * @param list<string> $methods\n     *\/","3493":"\/**\n     * @var non-empty-array<non-empty-string, true>\n     *\/","3494":"\/**\n     * @var array<non-empty-string, DoubledClass>\n     *\/","3496":"\/**\n     * Returns a test double for the specified class.\n     *\n     * @param class-string            $type\n     * @param ?list<non-empty-string> $methods\n     * @param array<mixed>            $arguments\n     *\n     * @throws ClassIsEnumerationException\n     * @throws ClassIsFinalException\n     * @throws DuplicateMethodException\n     * @throws InvalidMethodNameException\n     * @throws NameAlreadyInUseException\n     * @throws ReflectionException\n     * @throws RuntimeException\n     * @throws UnknownTypeException\n     *\/","3497":"\/**\n     * @param list<class-string> $interfaces\n     *\n     * @throws RuntimeException\n     * @throws UnknownTypeException\n     *\/","3498":"\/**\n     * @param class-string            $type\n     * @param ?list<non-empty-string> $methods\n     *\n     * @throws ClassIsEnumerationException\n     * @throws ClassIsFinalException\n     * @throws ReflectionException\n     * @throws RuntimeException\n     *\n     * @todo This method is only public because it is used to test generated code in PHPT tests\n     *\n     * @see https:\/\/github.com\/sebastianbergmann\/phpunit\/issues\/5476\n     *\/","3499":"\/**\n     * @param class-string $className\n     *\n     * @throws ReflectionException\n     *\n     * @return list<DoubledMethod>\n     *\/","3500":"\/**\n     * @param class-string $interfaceName\n     *\n     * @throws ReflectionException\n     *\n     * @return list<ReflectionMethod>\n     *\/","3501":"\/**\n     * @param array<mixed> $arguments\n     *\n     * @throws ReflectionException\n     * @throws RuntimeException\n     *\/","3502":"\/**\n     * @param class-string            $type\n     * @param ?list<non-empty-string> $explicitMethods\n     *\n     * @throws ClassIsEnumerationException\n     * @throws ClassIsFinalException\n     * @throws MethodNamedMethodException\n     * @throws ReflectionException\n     * @throws RuntimeException\n     *\/","3503":"\/**\n     * @param class-string $type\n     *\n     * @return array{className: class-string, originalClassName: class-string, fullClassName: class-string, namespaceName: string}\n     *\/","3504":"\/**\n     * @param array{className: non-empty-string, originalClassName: non-empty-string, fullClassName: non-empty-string, namespaceName: string} $mockClassName\n     * @param list<class-string>                                                                                                              $additionalInterfaces\n     *\/","3505":"\/**\n     * @throws UnknownTypeException\n     *\/","3506":"\/**\n     * @param ?list<non-empty-string> $methods\n     *\n     * @throws DuplicateMethodException\n     * @throws InvalidMethodNameException\n     *\/","3507":"\/**\n     * @throws NameAlreadyInUseException\n     * @throws ReflectionException\n     *\/","3508":"\/**\n     * @param class-string $className\n     *\n     * @throws ReflectionException\n     *\n     * @phpstan-ignore missingType.generics, throws.unusedType\n     *\/","3509":"\/**\n     * @param class-string $classOrInterfaceName\n     *\n     * @throws ReflectionException\n     *\n     * @return list<string>\n     *\/","3510":"\/**\n     * @param class-string $interfaceName\n     *\n     * @throws ReflectionException\n     *\n     * @return list<DoubledMethod>\n     *\/","3511":"\/**\n     * @param list<HookedProperty> $propertiesWithHooks\n     *\n     * @return list<ConfigurableMethod>\n     *\/","3512":"\/**\n     * @param ?ReflectionClass<object> $class\n     *\n     * @return list<HookedProperty>\n     *\/","3517":"\/**\n     * @param class-string         $className\n     * @param list<HookedProperty> $properties\n     *\/","3521":"\/**\n * @internal This class is not covered by the backward compatibility promise for PHPUnit\n *\/","3526":"\/**\n     * @param class-string|trait-string $name\n     *\/","3546":"\/**\n     * @param class-string     $className\n     * @param non-empty-string $methodName\n     * @param array<mixed>     $parameters\n     *\/","3552":"\/**\n     * @var list<Matcher>\n     *\/","3553":"\/**\n     * @var array<string,Matcher>\n     *\/","3555":"\/**\n     * @param list<ConfigurableMethod> $configurableMethods\n     *\/","3556":"\/**\n     * Looks up the match builder with identification $id and returns it.\n     *\/","3557":"\/**\n     * Registers a matcher with the identification $id. The matcher can later be\n     * looked up using lookupMatcher() to figure out if it has been invoked.\n     *\n     * @throws MatcherAlreadyRegisteredException\n     *\/","3558":"\/**\n     * @throws \\PHPUnit\\Framework\\MockObject\\Exception\n     * @throws Exception\n     *\/","3564":"\/**\n     * @throws Exception\n     * @throws ExpectationFailedException\n     * @throws MatchBuilderNotFoundException\n     * @throws MethodNameNotConfiguredException\n     * @throws RuntimeException\n     *\/","3565":"\/**\n     * @throws ExpectationFailedException\n     * @throws MatchBuilderNotFoundException\n     * @throws MethodNameNotConfiguredException\n     * @throws RuntimeException\n     *\/","3566":"\/**\n     * @throws ExpectationFailedException\n     * @throws MethodNameNotConfiguredException\n     *\/","3593":"\/**\n * @template MockedType\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\/","3594":"\/**\n     * @var class-string|trait-string\n     *\/","3595":"\/**\n     * @var list<non-empty-string>\n     *\/","3596":"\/**\n     * @var ?class-string\n     *\/","3598":"\/**\n     * @param class-string|trait-string $type\n     *\/","3599":"\/**\n     * Creates a mock object using a fluent interface.\n     *\n     * @throws ClassIsEnumerationException\n     * @throws ClassIsFinalException\n     * @throws DuplicateMethodException\n     * @throws InvalidArgumentException\n     * @throws InvalidMethodNameException\n     * @throws NameAlreadyInUseException\n     * @throws ReflectionException\n     * @throws RuntimeException\n     * @throws UnknownTypeException\n     *\n     * @return MockedType&MockObject\n     *\/","3600":"\/**\n     * Specifies the subset of methods to mock, requiring each to exist in the class.\n     *\n     * @param list<non-empty-string> $methods\n     *\n     * @throws CannotUseOnlyMethodsException\n     * @throws ReflectionException\n     *\n     * @return $this\n     *\/","3601":"\/**\n     * Specifies the arguments for the constructor.\n     *\n     * @param array<mixed> $arguments\n     *\n     * @return $this\n     *\/","3602":"\/**\n     * Specifies the name for the mock class.\n     *\n     * @param class-string $name\n     *\n     * @return $this\n     *\/","3603":"\/**\n     * Disables the invocation of the original constructor.\n     *\n     * @return $this\n     *\/","3604":"\/**\n     * Enables the invocation of the original constructor.\n     *\n     * @return $this\n     *\/","3605":"\/**\n     * Disables the invocation of the original clone constructor.\n     *\n     * @return $this\n     *\/","3606":"\/**\n     * Enables the invocation of the original clone constructor.\n     *\n     * @return $this\n     *\/","3611":"\/** @noinspection MagicMethodsValidityInspection *\/","3621":"\/**\n     * @param class-string     $className\n     * @param non-empty-string $methodName\n     *\n     * @throws Exception\n     *\/","3622":"\/**\n     * @param non-empty-list<string> $types\n     *\/","3623":"\/**\n     * @param class-string     $className\n     * @param non-empty-string $methodName\n     *\n     * @throws RuntimeException\n     *\/","3624":"\/**\n     * @param class-string     $type\n     * @param class-string     $className\n     * @param non-empty-string $methodName\n     *\n     * @throws RuntimeException\n     *\/","3625":"\/**\n     * @param non-empty-list<string> $types\n     * @param class-string           $className\n     * @param non-empty-string       $methodName\n     *\n     * @throws RuntimeException\n     *\/","3632":"\/**\n     * @var list<BaseInvocation>\n     *\/","3635":"\/**\n     * Verifies that the current expectation is valid. If everything is OK the\n     * code should just return, if not it must throw an exception.\n     *\n     * @throws ExpectationFailedException\n     *\/","3649":"\/**\n     * @param array<mixed> $parameters\n     *\n     * @throws \\PHPUnit\\Framework\\Exception\n     *\/","3651":"\/**\n     * Checks if the invocation $invocation matches the current rules. If it\n     * does the rule will get the invoked() method called which should check\n     * if an expectation is met.\n     *\n     * @throws ExpectationFailedException\n     *\/","3655":"\/**\n     * @throws ExpectationFailedException if the invocation violates the rule\n     *\/","3658":"\/**\n     * @return non-empty-string\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","3659":"\/**\n     * @param non-empty-string $propertyName\n     *\/","3683":"\/**\n     * @param array<mixed> $stack\n     *\/","3684":"\/**\n     * @throws NoMoreReturnValuesConfiguredException\n     *\/","3696":"\/**\n     * @param array<mixed> $valueMap\n     *\/","3698":"\/**\n     * Fakes the processing of the invocation $invocation by returning a\n     * specific value.\n     *\/","3708":"\/**\n     * @var list<array{file: string, line: int, function: string, type: string}>\n     *\/","3710":"\/**\n     * @param list<array{file: string, line: int, function: string, type: string}> $trace\n     *\/","3711":"\/**\n     * @return list<array{file: string, line: int, function: string, type: string}>\n     *\/","3723":"\/**\n     * @throws \\PHPUnit\\Runner\\Exception\n     * @throws \\PHPUnit\\Util\\Exception\n     * @throws Exception\n     * @throws InvalidArgumentException\n     * @throws NoPreviousThrowableException\n     * @throws ProcessIsolationException\n     *\/","3724":"\/**\n     * @throws ProcessIsolationException\n     *\/","3736":"\/**\n     * @param ReflectionClass<TestCase> $theClass\n     * @param non-empty-string          $methodName\n     * @param list<non-empty-string>    $groups\n     *\n     * @throws InvalidDataProviderException\n     *\/","3737":"\/**\n     * @param non-empty-string                                                                                                                                                  $methodName\n     * @param class-string<TestCase>                                                                                                                                            $className\n     * @param array<array<mixed>>                                                                                                                                               $data\n     * @param array{backupGlobals: ?bool, backupGlobalsExcludeList: list<string>, backupStaticProperties: ?bool, backupStaticPropertiesExcludeList: array<string,list<string>>} $backupSettings\n     * @param list<non-empty-string>                                                                                                                                            $groups\n     *\/","3738":"\/**\n     * @param array{backupGlobals: ?bool, backupGlobalsExcludeList: list<string>, backupStaticProperties: ?bool, backupStaticPropertiesExcludeList: array<string,list<string>>} $backupSettings\n     *\/","3739":"\/**\n     * @param class-string<TestCase> $className\n     * @param non-empty-string       $methodName\n     *\n     * @return array{backupGlobals: ?bool, backupGlobalsExcludeList: list<string>, backupStaticProperties: ?bool, backupStaticPropertiesExcludeList: array<string,list<string>>}\n     *\/","3740":"\/**\n     * @param class-string<TestCase> $className\n     * @param non-empty-string       $methodName\n     *\/","3742":"\/**\n     * @param class-string<TestCase> $className\n     *\/","3746":"\/**\n     * @var array<string,list<class-string>>\n     *\/","3747":"\/**\n     * @var list<callable>\n     *\/","3754":"\/**\n     * @var array<non-empty-string, array<mixed>>\n     *\/","3755":"\/**\n     * @var list<MockObjectInternal>\n     *\/","3756":"\/**\n     * @var list<Comparator>\n     *\/","3757":"\/**\n     * @var array<class-string, true>\n     *\/","3760":"\/**\n     * @param non-empty-string $name\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","3761":"\/**\n     * This method is called before the first test of this test class is run.\n     *\n     * @codeCoverageIgnore\n     *\/","3762":"\/**\n     * This method is called after the last test of this test class is run.\n     *\n     * @codeCoverageIgnore\n     *\/","3763":"\/**\n     * This method is called before each test.\n     *\n     * @codeCoverageIgnore\n     *\/","3764":"\/**\n     * Performs assertions shared by all tests of a test case.\n     *\n     * This method is called between setUp() and test.\n     *\n     * @codeCoverageIgnore\n     *\/","3765":"\/**\n     * Performs assertions shared by all tests of a test case.\n     *\n     * This method is called between test and tearDown().\n     *\n     * @codeCoverageIgnore\n     *\/","3766":"\/**\n     * This method is called after each test.\n     *\n     * @codeCoverageIgnore\n     *\/","3767":"\/**\n     * Returns a string representation of the test case.\n     *\n     * @throws Exception\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","3770":"\/**\n     * @throws \\PHPUnit\\Runner\\Exception\n     * @throws \\PHPUnit\\Util\\Exception\n     * @throws \\SebastianBergmann\\CodeCoverage\\InvalidArgumentException\n     * @throws \\SebastianBergmann\\Template\\InvalidArgumentException\n     * @throws CodeCoverageException\n     * @throws Exception\n     * @throws NoPreviousThrowableException\n     * @throws ProcessIsolationException\n     * @throws UnintentionallyCoveredCodeException\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","3771":"\/**\n     * @return list<string>\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","3772":"\/**\n     * @param list<string> $groups\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","3776":"\/**\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\n     * @phpstan-assert-if-true non-empty-string $this->output()\n     *\/","3780":"\/**\n     * @throws Throwable\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","3781":"\/**\n     * @param list<ExecutionOrderDependency> $dependencies\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","3782":"\/**\n     * @param array<non-empty-string, array<mixed>> $dependencyInput\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\n     * @codeCoverageIgnore\n     *\/","3783":"\/**\n     * @return array<non-empty-string, array<mixed>>\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","3786":"\/**\n     * @param list<string> $backupGlobalsExcludeList\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","3788":"\/**\n     * @param array<string,list<class-string>> $backupStaticPropertiesExcludeList\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","3792":"\/**\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\n     * @codeCoverageIgnore\n     *\/","3802":"\/**\n     * @return array<mixed>\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","3804":"\/**\n     * @return list<ExecutionOrderDependency>\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","3806":"\/**\n     * @param array<mixed> $data\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","3809":"\/**\n     * Returns a matcher that matches when the method is executed\n     * zero or more times.\n     *\/","3810":"\/**\n     * Returns a matcher that matches when the method is never executed.\n     *\/","3811":"\/**\n     * Returns a matcher that matches when the method is executed\n     * at least N times.\n     *\/","3812":"\/**\n     * Returns a matcher that matches when the method is executed at least once.\n     *\/","3813":"\/**\n     * Returns a matcher that matches when the method is executed exactly once.\n     *\/","3814":"\/**\n     * Returns a matcher that matches when the method is executed\n     * exactly $count times.\n     *\/","3815":"\/**\n     * Returns a matcher that matches when the method is executed\n     * at most N times.\n     *\/","3816":"\/**\n     * @param class-string<Throwable> $exception\n     *\/","3817":"\/**\n     * Sets up an expectation for an exception to be raised by the code under test.\n     * Information for expected exception class, expected exception message, and\n     * expected exception code are retrieved from a given Exception object.\n     *\/","3818":"\/**\n     * @param non-empty-string $expectedUserDeprecationMessage\n     *\/","3819":"\/**\n     * @param non-empty-string $expectedUserDeprecationMessageRegularExpression\n     *\/","3820":"\/**\n     * Returns a builder object to create mock objects using a fluent interface.\n     *\n     * @template RealInstanceType of object\n     *\n     * @param class-string<RealInstanceType> $className\n     *\n     * @return MockBuilder<RealInstanceType>\n     *\/","3821":"\/**\n     * @param class-string $classOrInterface\n     *\/","3822":"\/**\n     * @throws AssertionFailedError\n     * @throws Exception\n     * @throws ExpectationFailedException\n     * @throws Throwable\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","3823":"\/**\n     * Creates a mock object for the specified interface or class.\n     *\n     * @template RealInstanceType of object\n     *\n     * @param class-string<RealInstanceType> $type\n     *\n     * @throws InvalidArgumentException\n     * @throws MockObjectException\n     * @throws NoPreviousThrowableException\n     *\n     * @return MockObject&RealInstanceType\n     *\/","3824":"\/**\n     * @param list<class-string> $interfaces\n     *\n     * @throws MockObjectException\n     *\/","3825":"\/**\n     * Creates (and configures) a mock object for the specified interface or class.\n     *\n     * @template RealInstanceType of object\n     *\n     * @param class-string<RealInstanceType> $type\n     * @param array<non-empty-string, mixed> $configuration\n     *\n     * @throws InvalidArgumentException\n     * @throws MockObjectException\n     * @throws NoPreviousThrowableException\n     *\n     * @return MockObject&RealInstanceType\n     *\/","3826":"\/**\n     * Creates a partial mock object for the specified interface or class.\n     *\n     * @param class-string<RealInstanceType> $type\n     * @param list<non-empty-string>         $methods\n     *\n     * @template RealInstanceType of object\n     *\n     * @throws InvalidArgumentException\n     * @throws MockObjectException\n     *\n     * @return MockObject&RealInstanceType\n     *\/","3827":"\/**\n     * This method is called when a test method did not execute successfully.\n     *\n     * @throws Throwable\n     *\/","3830":"\/**\n     * @throws SkippedTest\n     *\/","3832":"\/**\n     * @return list<callable>\n     *\/","3834":"\/**\n     * @param array<mixed> $before\n     * @param array<mixed> $after\n     *\/","3836":"\/**\n     * @throws Exception\n     * @throws ExpectationFailedException\n     * @throws NoPreviousThrowableException\n     *\/","3837":"\/**\n     * @param array{beforeClass: HookMethodCollection, before: HookMethodCollection, preCondition: HookMethodCollection, postCondition: HookMethodCollection, after: HookMethodCollection, afterClass: HookMethodCollection} $hookMethods\n     *\n     * @throws Throwable\n     *\n     * @codeCoverageIgnore\n     *\/","3838":"\/**\n     * @param array{beforeClass: HookMethodCollection, before: HookMethodCollection, preCondition: HookMethodCollection, postCondition: HookMethodCollection, after: HookMethodCollection, afterClass: HookMethodCollection} $hookMethods\n     *\n     * @throws Throwable\n     *\/","3843":"\/**\n     * @param 'afterLastTestMethodCalled'|'afterTestMethodCalled'|'beforeFirstTestMethodCalled'|'beforeTestMethodCalled'|'postConditionCalled'|'preConditionCalled'             $calledMethod\n     * @param 'afterLastTestMethodErrored'|'afterTestMethodErrored'|'beforeFirstTestMethodErrored'|'beforeTestMethodErrored'|'postConditionErrored'|'preConditionErrored'       $erroredMethod\n     * @param 'afterLastTestMethodFinished'|'afterTestMethodFinished'|'beforeFirstTestMethodFinished'|'beforeTestMethodFinished'|'postConditionFinished'|'preConditionFinished' $finishedMethod *\n     *\n     * @throws Throwable\n     *\/","3846":"\/**\n     * @throws AssertionFailedError\n     *\/","3848":"\/**\n     * @see https:\/\/github.com\/sebastianbergmann\/phpunit\/issues\/6095\n     *\/","3849":"\/**\n     * Creates a test stub for the specified interface or class.\n     *\n     * @template RealInstanceType of object\n     *\n     * @param class-string<RealInstanceType> $type\n     *\n     * @throws InvalidArgumentException\n     * @throws MockObjectException\n     * @throws NoPreviousThrowableException\n     *\n     * @return RealInstanceType&Stub\n     *\/","3851":"\/**\n     * Creates (and configures) a test stub for the specified interface or class.\n     *\n     * @template RealInstanceType of object\n     *\n     * @param class-string<RealInstanceType> $type\n     * @param array<non-empty-string, mixed> $configuration\n     *\n     * @throws InvalidArgumentException\n     * @throws MockObjectException\n     * @throws NoPreviousThrowableException\n     *\n     * @return RealInstanceType&Stub\n     *\/","4024":"\/**\n     * @throws CodeCoverageException\n     * @throws Exception\n     * @throws InvalidArgumentException\n     * @throws UnintentionallyCoveredCodeException\n     *\/","4027":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This class is not covered by the backward compatibility promise for PHPUnit\n *\n * @immutable\n *\/","4028":"\/**\n     * @phpstan-assert-if-true Unknown $this\n     *\/","4029":"\/**\n     * @phpstan-assert-if-true Small $this\n     *\/","4030":"\/**\n     * @phpstan-assert-if-true Medium $this\n     *\/","4031":"\/**\n     * @phpstan-assert-if-true Large $this\n     *\/","4045":"\/**\n     * @phpstan-assert-if-true Known $this\n     *\/","4057":"\/**\n     * @phpstan-assert-if-true Success $this\n     *\/","4058":"\/**\n     * @phpstan-assert-if-true Skipped $this\n     *\/","4059":"\/**\n     * @phpstan-assert-if-true Incomplete $this\n     *\/","4060":"\/**\n     * @phpstan-assert-if-true Notice $this\n     *\/","4061":"\/**\n     * @phpstan-assert-if-true Failure $this\n     *\/","4062":"\/**\n     * @phpstan-assert-if-true Error $this\n     *\/","4063":"\/**\n     * @phpstan-assert-if-true Warning $this\n     *\/","4064":"\/**\n     * @phpstan-assert-if-true Risky $this\n     *\/","4071":"\/**\n     * @phpstan-assert-if-true Deprecation $this\n     *\/","4179":"\/**\n * @template-implements IteratorAggregate<int, Test>\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This class is not covered by the backward compatibility promise for PHPUnit\n *\/","4181":"\/**\n     * @var array<non-empty-string, list<non-empty-string>>\n     *\/","4182":"\/**\n     * @var ?list<ExecutionOrderDependency>\n     *\/","4205":"\/**\n     * @param list<non-empty-string> $groups\n     *\/","4208":"\/**\n * @template-implements RecursiveIterator<int, Test>\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This class is not covered by the backward compatibility promise for PHPUnit\n *\/","4210":"\/**\n     * @throws NoChildTestSuiteException\n     *\/","4219":"\/**\n     * @var array<int, DOMElement>\n     *\/","4220":"\/**\n     * @var array<int, int>\n     *\/","4225":"\/**\n     * @var array<int, float>\n     *\/","4239":"\/**\n     * @throws InvalidArgumentException\n     *\n     * @phpstan-assert !null $this->currentTestCase\n     *\/","4273":"\/**\n     * @param array<non-empty-string, int|string> $parameters\n     *\/","4296":"\/**\n     * @param array<string, TestResultCollection> $tests\n     *\/","4297":"\/**\n     * @return array<string, 'defect'|'success'>\n     *\/","4299":"\/**\n     * @var array<string, int>\n     *\/","4301":"\/**\n     * @return array<non-empty-string, non-empty-string>\n     *\/","4305":"\/**\n     * @return array<string, ' '|'x'>\n     *\/","4316":"\/**\n     * @phpstan-assert-if-true !null $this->throwable\n     *\/","4317":"\/**\n * @template-implements IteratorAggregate<int, TestResult>\n *\n * @immutable\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This class is not covered by the backward compatibility promise for PHPUnit\n *\/","4318":"\/**\n     * @var list<TestResult>\n     *\/","4319":"\/**\n     * @param list<TestResult> $testResults\n     *\/","4320":"\/**\n     * @return list<TestResult>\n     *\/","4321":"\/**\n * @template-implements Iterator<int, TestResult>\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This class is not covered by the backward compatibility promise for PHPUnit\n *\/","4324":"\/**\n     * @var array<string, list<TestDoxTestMethod>>\n     *\/","4326":"\/**\n     * @return array<string, TestResultCollection>\n     *\/","4340":"\/**\n     * @param int<0, 1> $level\n     *\/","4355":"\/**\n     * @param non-empty-string $groupName\n     *\/","4363":"\/**\n     * @param non-empty-string $operatingSystem\n     *\/","4367":"\/**\n     * @param non-empty-string $extension\n     *\/","4375":"\/**\n     * @param array<array<mixed>> $data\n     * @param ?non-empty-string   $name\n     *\/","4383":"\/**\n     * @phpstan-assert-if-true AfterClass $this\n     *\/","4384":"\/**\n     * @phpstan-assert-if-true BackupGlobals $this\n     *\/","4385":"\/**\n     * @phpstan-assert-if-true BackupStaticProperties $this\n     *\/","4386":"\/**\n     * @phpstan-assert-if-true BeforeClass $this\n     *\/","4387":"\/**\n     * @phpstan-assert-if-true Before $this\n     *\/","4388":"\/**\n     * @phpstan-assert-if-true CoversNamespace $this\n     *\/","4389":"\/**\n     * @phpstan-assert-if-true CoversClass $this\n     *\/","4390":"\/**\n     * @phpstan-assert-if-true CoversClassesThatExtendClass $this\n     *\/","4391":"\/**\n     * @phpstan-assert-if-true CoversClassesThatImplementInterface $this\n     *\/","4392":"\/**\n     * @phpstan-assert-if-true CoversTrait $this\n     *\/","4393":"\/**\n     * @phpstan-assert-if-true CoversFunction $this\n     *\/","4394":"\/**\n     * @phpstan-assert-if-true CoversMethod $this\n     *\/","4395":"\/**\n     * @phpstan-assert-if-true CoversNothing $this\n     *\/","4396":"\/**\n     * @phpstan-assert-if-true DataProvider $this\n     *\/","4397":"\/**\n     * @phpstan-assert-if-true DependsOnClass $this\n     *\/","4398":"\/**\n     * @phpstan-assert-if-true DependsOnMethod $this\n     *\/","4399":"\/**\n     * @phpstan-assert-if-true DisableReturnValueGenerationForTestDoubles $this\n     *\/","4400":"\/**\n     * @phpstan-assert-if-true DoesNotPerformAssertions $this\n     *\/","4401":"\/**\n     * @phpstan-assert-if-true ExcludeGlobalVariableFromBackup $this\n     *\/","4402":"\/**\n     * @phpstan-assert-if-true ExcludeStaticPropertyFromBackup $this\n     *\/","4403":"\/**\n     * @phpstan-assert-if-true Group $this\n     *\/","4404":"\/**\n     * @phpstan-assert-if-true IgnoreDeprecations $this\n     *\/","4405":"\/**\n     * @phpstan-assert-if-true IgnorePhpunitDeprecations $this\n     *\n     * @internal This method is not covered by the backward compatibility promise for PHPUnit\n     *\/","4406":"\/**\n     * @phpstan-assert-if-true RunClassInSeparateProcess $this\n     *\/","4407":"\/**\n     * @phpstan-assert-if-true RunInSeparateProcess $this\n     *\/","4408":"\/**\n     * @phpstan-assert-if-true RunTestsInSeparateProcesses $this\n     *\/","4409":"\/**\n     * @phpstan-assert-if-true Test $this\n     *\/","4410":"\/**\n     * @phpstan-assert-if-true PreCondition $this\n     *\/","4411":"\/**\n     * @phpstan-assert-if-true PostCondition $this\n     *\/","4412":"\/**\n     * @phpstan-assert-if-true PreserveGlobalState $this\n     *\/","4413":"\/**\n     * @phpstan-assert-if-true RequiresMethod $this\n     *\/","4414":"\/**\n     * @phpstan-assert-if-true RequiresFunction $this\n     *\/","4415":"\/**\n     * @phpstan-assert-if-true RequiresOperatingSystem $this\n     *\/","4416":"\/**\n     * @phpstan-assert-if-true RequiresOperatingSystemFamily $this\n     *\/","4417":"\/**\n     * @phpstan-assert-if-true RequiresPhp $this\n     *\/","4418":"\/**\n     * @phpstan-assert-if-true RequiresPhpExtension $this\n     *\/","4419":"\/**\n     * @phpstan-assert-if-true RequiresPhpunit $this\n     *\/","4420":"\/**\n     * @phpstan-assert-if-true RequiresPhpunitExtension $this\n     *\/","4421":"\/**\n     * @phpstan-assert-if-true RequiresEnvironmentVariable $this\n     *\/","4422":"\/**\n     * @phpstan-assert-if-true RequiresSetting $this\n     *\/","4423":"\/**\n     * @phpstan-assert-if-true TestDox $this\n     *\/","4424":"\/**\n     * @phpstan-assert-if-true TestWith $this\n     *\/","4425":"\/**\n     * @phpstan-assert-if-true UsesNamespace $this\n     *\/","4426":"\/**\n     * @phpstan-assert-if-true UsesClass $this\n     *\/","4427":"\/**\n     * @phpstan-assert-if-true UsesClassesThatExtendClass $this\n     *\/","4428":"\/**\n     * @phpstan-assert-if-true UsesClassesThatImplementInterface $this\n     *\/","4429":"\/**\n     * @phpstan-assert-if-true UsesTrait $this\n     *\/","4430":"\/**\n     * @phpstan-assert-if-true UsesFunction $this\n     *\/","4431":"\/**\n     * @phpstan-assert-if-true UsesMethod $this\n     *\/","4432":"\/**\n     * @phpstan-assert-if-true WithoutErrorHandler $this\n     *\/","4477":"\/**\n     * @phpstan-assert-if-true After $this\n     *\/","4532":"\/**\n     * @param class-string     $className\n     * @param non-empty-string $methodName\n     *\n     * @throws InvalidDataProviderException\n     *\n     * @return ?array<array<mixed>>\n     *\/","4533":"\/**\n     * @param class-string     $className\n     * @param non-empty-string $methodName\n     *\n     * @throws InvalidDataProviderException\n     *\n     * @return array<array<mixed>>\n     *\/","4534":"\/**\n     * @return array<array<mixed>>\n     *\/","4536":"\/**\n     * @param class-string     $className\n     * @param non-empty-string $methodName\n     *\n     * @return list<ExecutionOrderDependency>\n     *\/","4538":"\/**\n     * @var array<string, list<non-empty-string>>\n     *\/","4539":"\/**\n     * @param class-string     $className\n     * @param non-empty-string $methodName\n     *\n     * @return list<non-empty-string>\n     *\/","4542":"\/**\n     * @var array<class-string, array{beforeClass: HookMethodCollection, before: HookMethodCollection, preCondition: HookMethodCollection, postCondition: HookMethodCollection, after: HookMethodCollection, afterClass: HookMethodCollection}>\n     *\/","4543":"\/**\n     * @param class-string<TestCase> $className\n     *\n     * @return array{beforeClass: HookMethodCollection, before: HookMethodCollection, preCondition: HookMethodCollection, postCondition: HookMethodCollection, after: HookMethodCollection, afterClass: HookMethodCollection}\n     *\/","4544":"\/**\n     * @return array{beforeClass: HookMethodCollection, before: HookMethodCollection, preCondition: HookMethodCollection, postCondition: HookMethodCollection, after: HookMethodCollection, afterClass: HookMethodCollection}\n     *\/","4546":"\/**\n     * @param class-string     $className\n     * @param non-empty-string $methodName\n     *\n     * @return list<string>\n     *\/","4925":"\/**\n     * @param int<0, 1>    $level\n     * @param class-string $className\n     *\/","5117":"\/**\n     * @param int<0, 1>    $level\n     * @param class-string $interfaceName\n     *\/","5213":"\/**\n     * @param int<0, 1>        $level\n     * @param non-empty-string $functionName\n     *\/","5310":"\/**\n     * @param int<0, 1>        $level\n     * @param class-string     $className\n     * @param non-empty-string $methodName\n     *\/","5407":"\/**\n     * @param int<0, 1>        $level\n     * @param non-empty-string $namespace\n     *\/","5597":"\/**\n     * @param 0|1          $level\n     * @param trait-string $traitName\n     *\/","6173":"\/**\n     * @param int<0, 1>        $level\n     * @param non-empty-string $globalVariableName\n     *\/","6270":"\/**\n     * @param int<0, 1>        $level\n     * @param class-string     $className\n     * @param non-empty-string $propertyName\n     *\/","6367":"\/**\n     * @param int<0, 1>        $level\n     * @param non-empty-string $groupName\n     *\/","6650":"\/**\n     * @param non-empty-string $attributeName\n     * @param non-empty-string $target\n     * @param non-empty-string $file\n     * @param positive-int     $line\n     * @param non-empty-string $message\n     *\/","6652":"\/**\n     * @var int<0, 1>\n     *\/","6747":"\/**\n * @template-implements IteratorAggregate<int, Metadata>\n *\n * @immutable\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\/","6748":"\/**\n     * @var list<Metadata>\n     *\/","6749":"\/**\n     * @param list<Metadata> $metadata\n     *\/","6750":"\/**\n     * @return list<Metadata>\n     *\/","6752":"\/**\n * @template-implements Iterator<int, Metadata>\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\/","6758":"\/**\n     * @param non-empty-string  $groupName\n     * @param class-string      $testClassName\n     * @param ?non-empty-string $testMethodName\n     *\/","6760":"\/**\n     * @var array<class-string, MetadataCollection>\n     *\/","6761":"\/**\n     * @var array<non-empty-string, MetadataCollection>\n     *\/","6770":"\/**\n * Attribute information is static within a single PHP process.\n * It is therefore okay to use a Singleton registry here.\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This class is not covered by the backward compatibility promise for PHPUnit\n *\/","7342":"\/**\n     * @param int<0, 1>        $level\n     * @param non-empty-string $operatingSystem\n     *\/","7438":"\/**\n     * @param int<0, 1>        $level\n     * @param non-empty-string $operatingSystemFamily\n     *\/","7628":"\/**\n     * @param int<0, 1>        $level\n     * @param non-empty-string $extension\n     *\/","7630":"\/**\n     * @phpstan-assert-if-true !null $this->versionRequirement\n     *\/","7631":"\/**\n     * @throws NoVersionRequirementException\n     *\/","7917":"\/**\n     * @param int<0, 1>        $level\n     * @param non-empty-string $setting\n     * @param non-empty-string $value\n     *\/","8390":"\/**\n     * @param int<0, 1>        $level\n     * @param non-empty-string $text\n     *\/","8485":"\/**\n     * @var array<array<mixed>>\n     *\/","8487":"\/**\n     * @param int<0, 1>           $level\n     * @param array<array<mixed>> $data\n     * @param ?non-empty-string   $name\n     *\/","8489":"\/**\n     * @phpstan-assert-if-true !null $this->name\n     *\/","9258":"\/**\n     * @throws InvalidVersionOperatorException\n     * @throws InvalidVersionRequirementException\n     *\/","9358":"\/**\n     * @var array<non-empty-string, array<positive-int, list<Issue>>>\n     *\/","9359":"\/**\n     * @return array<string, array<positive-int, list<Issue>>>\n     *\/","9364":"\/**\n     * @throws FileDoesNotExistException\n     * @throws FileDoesNotHaveLineException\n     *\/","9370":"\/**\n     * @param non-empty-string  $file\n     * @param positive-int      $line\n     * @param ?non-empty-string $hash\n     * @param non-empty-string  $description\n     *\n     * @throws FileDoesNotExistException\n     * @throws FileDoesNotHaveLineException\n     *\/","9371":"\/**\n     * @param non-empty-string $file\n     * @param positive-int     $line\n     * @param non-empty-string $hash\n     * @param non-empty-string $description\n     *\/","9376":"\/**\n     * @param non-empty-string $file\n     * @param positive-int     $line\n     *\n     * @throws FileDoesNotExistException\n     * @throws FileDoesNotHaveLineException\n     *\n     * @return non-empty-string\n     *\/","9378":"\/**\n     * @param non-empty-string $baselineFile\n     *\n     * @throws CannotLoadBaselineException\n     *\/","9379":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This class is not covered by the backward compatibility promise for PHPUnit\n *\n * @see Copied from https:\/\/github.com\/phpstan\/phpstan-src\/blob\/1.10.33\/src\/File\/ParentDirectoryRelativePathHelper.php\n *\/","9381":"\/**\n     * @param non-empty-string $baselineDirectory\n     *\/","9382":"\/**\n     * @param non-empty-string $filename\n     *\n     * @return non-empty-string\n     *\/","9383":"\/**\n     * @param non-empty-string $filename\n     *\n     * @return list<non-empty-string>\n     *\/","9398":"\/**\n     * @param non-empty-string $baselineFile\n     *\/","9403":"\/**\n     * @phpstan-assert-if-true !null $this->instance\n     *\/","9404":"\/**\n     * @throws NoActiveTimerException\n     *\/","9410":"\/**\n     * @return list<non-empty-string>\n     *\/","9414":"\/**\n     * @throws EventFacadeIsSealedException\n     * @throws UnknownSubscriberTypeException\n     *\n     * @return list<non-empty-string>\n     *\/","9423":"\/**\n     * @var ?array{functions: list<non-empty-string>, methods: list<array{className: class-string, methodName: non-empty-string}>}\n     *\/","9425":"\/**\n     * @param array{functions: list<non-empty-string>, methods: list<array{className: class-string, methodName: non-empty-string}>} $deprecationTriggers\n     *\/","9426":"\/**\n     * @param non-empty-string $file\n     * @param positive-int     $line\n     * @param non-empty-string $description\n     *\/","9427":"\/**\n     * @return list<array{file: string, line: int, class?: string, function?: string, type: string}>\n     *\/","9428":"\/**\n     * @return ?array{file: non-empty-string, line: positive-int}\n     *\/","9429":"\/**\n     * @return list<array{file: string, line: ?int, class?: class-string, function?: string, type: string}>\n     *\/","9430":"\/**\n     * @param array{class? : class-string, function?: non-empty-string} $frame\n     * @param non-empty-string                                          $function\n     *\/","9431":"\/**\n     * @param array{class? : class-string, function?: non-empty-string}    $frame\n     * @param array{className: class-string, methodName: non-empty-string} $method\n     *\/","9436":"\/**\n     * @param non-empty-string      $className\n     * @param array<string, string> $parameters\n     *\/","9443":"\/**\n     * @param array<string, string> $parameters\n     *\/","9445":"\/**\n     * @throws ParameterDoesNotExistException\n     *\/","9447":"\/**\n     * @param non-empty-string $directory\n     *\n     * @return list<string>\n     *\/","9450":"\/**\n     * @param non-empty-string       $id\n     * @param list<non-empty-string> $groupTests\n     *\/","9451":"\/**\n     * @param RecursiveIterator<int, Test> $iterator\n     * @param list<non-empty-string>       $groups\n     *\/","9453":"\/**\n     * @param RecursiveIterator<int, Test> $iterator\n     * @param non-empty-string             $filter\n     *\/","9455":"\/**\n     * @var list<array{className: class-string<FilterIterator<int, Test, Iterator<int, Test>>>, argument: list<non-empty-string>|non-empty-string}>\n     *\/","9456":"\/**\n     * @param list<non-empty-string> $testIds\n     *\/","9461":"\/**\n     * @param Iterator<int, Test> $iterator\n     *\n     * @return FilterIterator<int, Test, Iterator<int, Test>>\n     *\/","9474":"\/**\n     * @param non-empty-string $filter\n     *\n     * @return array{regularExpression: non-empty-string, dataSetMinimum: ?int, dataSetMaximum: ?int}\n     *\/","9476":"\/**\n     * @var non-empty-list<non-empty-string>\n     *\/","9477":"\/**\n     * @param RecursiveIterator<int, Test>     $iterator\n     * @param non-empty-list<non-empty-string> $testIds\n     *\/","9479":"\/**\n     * @throws \\PHPUnit\\Framework\\InvalidArgumentException\n     * @throws InvalidArgumentException\n     *\/","9493":"\/**\n     * @var non-empty-list<HookMethod>\n     *\/","9499":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This class is not covered by the backward compatibility promise for PHPUnit\n *\n * @see https:\/\/qa.php.net\/phpt_details.php\n *\/","9501":"\/**\n     * Constructs a test case with the given filename.\n     *\n     * @param non-empty-string $filename\n     *\/","9502":"\/**\n     * Counts the number of test cases executed by run(TestResult result).\n     *\/","9503":"\/**\n     * Runs a test and collects its result in a TestResult instance.\n     *\n     * @throws \\PHPUnit\\Framework\\Exception\n     * @throws \\SebastianBergmann\\Template\\InvalidArgumentException\n     * @throws Exception\n     * @throws InvalidArgumentException\n     * @throws NoPreviousThrowableException\n     * @throws ReflectionException\n     * @throws TestIdMissingException\n     * @throws UnintentionallyCoveredCodeException\n     *\n     * @noinspection RepetitiveMethodCallsInspection\n     *\/","9504":"\/**\n     * Returns the name of the test case.\n     *\/","9505":"\/**\n     * Returns a string representation of the test case.\n     *\/","9509":"\/**\n     * @param array<string>|string                                              $content\n     * @param array<non-empty-string, array<non-empty-string>|non-empty-string> $ini\n     *\n     * @return array<non-empty-string, array<non-empty-string>|non-empty-string>\n     *\/","9511":"\/**\n     * @param array<non-empty-string, non-empty-string> $sections\n     *\n     * @throws Exception\n     * @throws ExpectationFailedException\n     *\/","9512":"\/**\n     * @param array<non-empty-string, non-empty-string>                         $sections\n     * @param array<non-empty-string, array<non-empty-string>|non-empty-string> $settings\n     *\/","9513":"\/**\n     * @param array<non-empty-string, non-empty-string> $sections\n     *\/","9515":"\/**\n     * @throws Exception\n     *\n     * @return array<non-empty-string, non-empty-string>\n     *\/","9516":"\/**\n     * @param array<non-empty-string, non-empty-string> $sections\n     *\n     * @throws Exception\n     *\/","9518":"\/**\n     * @param non-empty-string $code\n     *\n     * @return non-empty-string\n     *\/","9519":"\/**\n     * @return array{coverage: non-empty-string, job: non-empty-string}\n     *\/","9520":"\/**\n     * @param non-empty-string $job\n     *\n     * @param-out non-empty-string $job\n     *\n     * @throws \\SebastianBergmann\\Template\\InvalidArgumentException\n     *\/","9521":"\/**\n     * @param array<non-empty-string, array<non-empty-string>|non-empty-string> $ini\n     *\n     * @return list<non-empty-string>\n     *\/","9522":"\/**\n     * @param array<non-empty-string, non-empty-string> $sections\n     *\n     * @return non-empty-list<array{file: non-empty-string, line: int}>\n     *\/","9526":"\/**\n     * @var array<string, TestStatus>\n     *\/","9527":"\/**\n     * @var array<string, float>\n     *\/","9533":"\/**\n     * @throws \\PHPUnit\\Event\\InvalidArgumentException\n     * @throws InvalidArgumentException\n     *\/","9551":"\/**\n     * @var array<non-empty-string, list<class-string>>\n     *\/","9552":"\/**\n     * @throws Exception\n     *\n     * @return ReflectionClass<TestCase>\n     *\/","9553":"\/**\n     * @return array<class-string>\n     *\/","9555":"\/**\n     * @var non-empty-array<non-empty-string, positive-int>\n     *\/","9556":"\/**\n     * @var array<string, int> Associative array of (string => DEFECT_SORT_WEIGHT) elements\n     *\/","9557":"\/**\n     * @var array<string> A list of normalized names of tests before reordering\n     *\/","9558":"\/**\n     * @var array<string> A list of normalized names of tests affected by reordering\n     *\/","9562":"\/**\n     * @param list<Test> $tests\n     *\n     * @return list<Test>\n     *\/","9567":"\/**\n     * Comparator callback function to sort tests for \"reach failure as fast as possible\".\n     *\n     * 1. sort tests by defect weight defined in self::DEFECT_SORT_WEIGHT\n     * 2. when tests are equally defective, sort the fastest to the front\n     * 3. do not reorder successful tests\n     *\/","9568":"\/**\n     * Compares test duration for sorting tests by duration ascending.\n     *\/","9569":"\/**\n     * Compares test size for sorting tests small->medium->large->unknown.\n     *\/","9570":"\/**\n     * Reorder Tests within a TestCase in such a way as to resolve as many dependencies as possible.\n     * The algorithm will leave the tests in original running order when it can.\n     * For more details see the documentation for test dependencies.\n     *\n     * Short description of algorithm:\n     * 1. Pick the next Test from remaining tests to be checked for dependencies.\n     * 2. If the test has no dependencies: mark done, start again from the top\n     * 3. If the test has dependencies but none left to do: mark done, start again from the top\n     * 4. When we reach the end add any leftover tests to the end. These will be marked 'skipped' during execution.\n     *\n     * @param array<TestCase> $tests\n     *\n     * @return array<TestCase>\n     *\/","9583":"\/**\n     * @var list<AfterLastTestMethodErrored|BeforeFirstTestMethodErrored|Errored>\n     *\/","9584":"\/**\n     * @var list<Failed>\n     *\/","9585":"\/**\n     * @var list<MarkedIncomplete>\n     *\/","9586":"\/**\n     * @var list<TestSuiteSkipped>\n     *\/","9587":"\/**\n     * @var list<TestSkipped>\n     *\/","9588":"\/**\n     * @var array<string,list<ConsideredRisky>>\n     *\/","9589":"\/**\n     * @var array<string,list<PhpunitDeprecationTriggered>>\n     *\/","9590":"\/**\n     * @var array<string,list<PhpunitErrorTriggered>>\n     *\/","9591":"\/**\n     * @var array<string,list<PhpunitWarningTriggered>>\n     *\/","9592":"\/**\n     * @var list<TestRunnerWarningTriggered>\n     *\/","9593":"\/**\n     * @var list<TestRunnerDeprecationTriggered>\n     *\/","9594":"\/**\n     * @var array<non-empty-string, Issue>\n     *\/","9613":"\/**\n     * @var non-empty-array<non-empty-string, array{test: Test, count: int}>\n     *\/","9620":"\/**\n     * @return non-empty-array<non-empty-string, array{test: Test, count: int}>\n     *\/","9621":"\/**\n     * @phpstan-assert-if-true !null $this->stackTrace\n     *\/","9625":"\/**\n     * @var array<string,array{returnValue: mixed, size: TestSize}>\n     *\/","9647":"\/**\n     * @var list<Issue>\n     *\/","9655":"\/**\n     * @param list<AfterLastTestMethodErrored|BeforeFirstTestMethodErrored|Errored> $testErroredEvents\n     * @param list<Failed>                                                          $testFailedEvents\n     * @param array<string,list<ConsideredRisky>>                                   $testConsideredRiskyEvents\n     * @param list<TestSuiteSkipped>                                                $testSuiteSkippedEvents\n     * @param list<TestSkipped>                                                     $testSkippedEvents\n     * @param list<MarkedIncomplete>                                                $testMarkedIncompleteEvents\n     * @param array<string,list<PhpunitDeprecationTriggered>>                       $testTriggeredPhpunitDeprecationEvents\n     * @param array<string,list<PhpunitErrorTriggered>>                             $testTriggeredPhpunitErrorEvents\n     * @param array<string,list<PhpunitWarningTriggered>>                           $testTriggeredPhpunitWarningEvents\n     * @param list<TestRunnerDeprecationTriggered>                                  $testRunnerTriggeredDeprecationEvents\n     * @param list<TestRunnerWarningTriggered>                                      $testRunnerTriggeredWarningEvents\n     * @param list<Issue>                                                           $errors\n     * @param list<Issue>                                                           $deprecations\n     * @param list<Issue>                                                           $notices\n     * @param list<Issue>                                                           $warnings\n     * @param list<Issue>                                                           $phpDeprecations\n     * @param list<Issue>                                                           $phpNotices\n     * @param list<Issue>                                                           $phpWarnings\n     * @param non-negative-int                                                      $numberOfIssuesIgnoredByBaseline\n     *\/","9656":"\/**\n     * @return list<AfterLastTestMethodErrored|BeforeFirstTestMethodErrored|Errored>\n     *\/","9657":"\/**\n     * @return list<Failed>\n     *\/","9658":"\/**\n     * @return array<string,list<ConsideredRisky>>\n     *\/","9659":"\/**\n     * @return list<TestSuiteSkipped>\n     *\/","9660":"\/**\n     * @return list<TestSkipped>\n     *\/","9661":"\/**\n     * @return list<MarkedIncomplete>\n     *\/","9662":"\/**\n     * @return array<string,list<PhpunitDeprecationTriggered>>\n     *\/","9663":"\/**\n     * @return array<string,list<PhpunitErrorTriggered>>\n     *\/","9664":"\/**\n     * @return array<string,list<PhpunitWarningTriggered>>\n     *\/","9665":"\/**\n     * @return list<TestRunnerDeprecationTriggered>\n     *\/","9666":"\/**\n     * @return list<TestRunnerWarningTriggered>\n     *\/","9667":"\/**\n     * @return list<Issue>\n     *\/","9692":"\/**\n     * @param list<string> $argv\n     *\/","9694":"\/**\n     * @return array{requiresCodeCoverageCollection: bool, replacesOutput: bool, replacesProgressOutput: bool, replacesResultOutput: bool}\n     *\/","9695":"\/**\n     * @param ?list<string> $pharExtensions\n     *\/","9705":"\/**\n     * @var array<string, non-negative-int>\n     *\/","9706":"\/**\n     * @param list<string> $parameters\n     *\n     * @throws Exception\n     *\/","9707":"\/**\n     * @param non-empty-string $option\n     *\/","9710":"\/**\n     * @var ?non-empty-list<non-empty-string>\n     *\/","9716":"\/**\n     * @var ?non-empty-array<non-empty-string, non-empty-string>\n     *\/","9719":"\/**\n     * @param list<non-empty-string>                               $arguments\n     * @param ?non-empty-list<non-empty-string>                    $excludeGroups\n     * @param ?non-empty-list<non-empty-string>                    $groups\n     * @param ?non-empty-list<non-empty-string>                    $testsCovering\n     * @param ?non-empty-list<non-empty-string>                    $testsUsing\n     * @param ?non-empty-list<non-empty-string>                    $testsRequiringPhpExtension\n     * @param ?non-empty-array<non-empty-string, non-empty-string> $iniSettings\n     * @param ?non-empty-list<non-empty-string>                    $testSuffixes\n     * @param ?non-empty-list<non-empty-string>                    $coverageFilter\n     * @param ?non-empty-list<non-empty-string>                    $extensions\n     *\/","9721":"\/**\n     * @phpstan-assert-if-true !null $this->atLeastVersion\n     *\/","9723":"\/**\n     * @phpstan-assert-if-true !null $this->backupGlobals\n     *\/","9725":"\/**\n     * @phpstan-assert-if-true !null $this->backupStaticProperties\n     *\/","9727":"\/**\n     * @phpstan-assert-if-true !null $this->beStrictAboutChangesToGlobalState\n     *\/","9729":"\/**\n     * @phpstan-assert-if-true !null $this->bootstrap\n     *\/","9731":"\/**\n     * @phpstan-assert-if-true !null $this->cacheDirectory\n     *\/","9733":"\/**\n     * @phpstan-assert-if-true !null $this->cacheResult\n     *\/","9735":"\/**\n     * @phpstan-assert-if-true !null $this->colors\n     *\/","9737":"\/**\n     * @phpstan-assert-if-true !null $this->columns\n     *\/","9739":"\/**\n     * @phpstan-assert-if-true !null $this->configurationFile\n     *\/","9741":"\/**\n     * @phpstan-assert-if-true !null $this->coverageFilter\n     *\/","9742":"\/**\n     * @throws Exception\n     *\n     * @return non-empty-list<non-empty-string>\n     *\/","9743":"\/**\n     * @phpstan-assert-if-true !null $this->coverageClover\n     *\/","9745":"\/**\n     * @phpstan-assert-if-true !null $this->coverageCobertura\n     *\/","9747":"\/**\n     * @phpstan-assert-if-true !null $this->coverageCrap4J\n     *\/","9749":"\/**\n     * @phpstan-assert-if-true !null $this->coverageHtml\n     *\/","9751":"\/**\n     * @phpstan-assert-if-true !null $this->coveragePhp\n     *\/","9753":"\/**\n     * @phpstan-assert-if-true !null $this->coverageText\n     *\/","9755":"\/**\n     * @phpstan-assert-if-true !null $this->coverageTextShowUncoveredFiles\n     *\/","9757":"\/**\n     * @phpstan-assert-if-true !null $this->coverageTextShowOnlySummary\n     *\/","9759":"\/**\n     * @phpstan-assert-if-true !null $this->coverageXml\n     *\/","9761":"\/**\n     * @phpstan-assert-if-true !null $this->pathCoverage\n     *\/","9763":"\/**\n     * @phpstan-assert-if-true !null $this->defaultTimeLimit\n     *\/","9765":"\/**\n     * @phpstan-assert-if-true !null $this->disableCodeCoverageIgnore\n     *\/","9767":"\/**\n     * @phpstan-assert-if-true !null $this->disallowTestOutput\n     *\/","9769":"\/**\n     * @phpstan-assert-if-true !null $this->enforceTimeLimit\n     *\/","9771":"\/**\n     * @phpstan-assert-if-true !null $this->excludeGroups\n     *\/","9773":"\/**\n     * @phpstan-assert-if-true !null $this->executionOrder\n     *\/","9775":"\/**\n     * @phpstan-assert-if-true !null $this->executionOrderDefects\n     *\/","9777":"\/**\n     * @phpstan-assert-if-true !null $this->failOnDeprecation\n     *\/","9779":"\/**\n     * @phpstan-assert-if-true !null $this->failOnPhpunitDeprecation\n     *\/","9781":"\/**\n     * @phpstan-assert-if-true !null $this->failOnEmptyTestSuite\n     *\/","9783":"\/**\n     * @phpstan-assert-if-true !null $this->failOnIncomplete\n     *\/","9785":"\/**\n     * @phpstan-assert-if-true !null $this->failOnNotice\n     *\/","9787":"\/**\n     * @phpstan-assert-if-true !null $this->failOnRisky\n     *\/","9789":"\/**\n     * @phpstan-assert-if-true !null $this->failOnSkipped\n     *\/","9791":"\/**\n     * @phpstan-assert-if-true !null $this->failOnWarning\n     *\/","9793":"\/**\n     * @phpstan-assert-if-true !null $this->stopOnDefect\n     *\/","9795":"\/**\n     * @phpstan-assert-if-true !null $this->stopOnDeprecation\n     *\/","9797":"\/**\n     * @phpstan-assert-if-true !null $this->specificDeprecationToStopOn\n     *\/","9799":"\/**\n     * @phpstan-assert-if-true !null $this->stopOnError\n     *\/","9801":"\/**\n     * @phpstan-assert-if-true !null $this->stopOnFailure\n     *\/","9803":"\/**\n     * @phpstan-assert-if-true !null $this->stopOnIncomplete\n     *\/","9805":"\/**\n     * @phpstan-assert-if-true !null $this->stopOnNotice\n     *\/","9807":"\/**\n     * @phpstan-assert-if-true !null $this->stopOnRisky\n     *\/","9809":"\/**\n     * @phpstan-assert-if-true !null $this->stopOnSkipped\n     *\/","9811":"\/**\n     * @phpstan-assert-if-true !null $this->stopOnWarning\n     *\/","9813":"\/**\n     * @phpstan-assert-if-true !null $this->excludeFilter\n     *\/","9815":"\/**\n     * @phpstan-assert-if-true !null $this->filter\n     *\/","9817":"\/**\n     * @phpstan-assert-if-true !null $this->generateBaseline\n     *\/","9819":"\/**\n     * @phpstan-assert-if-true !null $this->useBaseline\n     *\/","9821":"\/**\n     * @phpstan-assert-if-true !null $this->groups\n     *\/","9823":"\/**\n     * @phpstan-assert-if-true !null $this->testsCovering\n     *\/","9825":"\/**\n     * @phpstan-assert-if-true !null $this->testsUsing\n     *\/","9827":"\/**\n     * @phpstan-assert-if-true !null $this->testsRequiringPhpExtension\n     *\/","9829":"\/**\n     * @phpstan-assert-if-true !null $this->includePath\n     *\/","9831":"\/**\n     * @phpstan-assert-if-true !null $this->iniSettings\n     *\/","9832":"\/**\n     * @throws Exception\n     *\n     * @return non-empty-array<non-empty-string, non-empty-string>\n     *\/","9833":"\/**\n     * @phpstan-assert-if-true !null $this->junitLogfile\n     *\/","9835":"\/**\n     * @phpstan-assert-if-true !null $this->listTestsXml\n     *\/","9837":"\/**\n     * @phpstan-assert-if-true !null $this->noCoverage\n     *\/","9839":"\/**\n     * @phpstan-assert-if-true !null $this->noExtensions\n     *\/","9841":"\/**\n     * @phpstan-assert-if-true !null $this->noOutput\n     *\/","9843":"\/**\n     * @phpstan-assert-if-true !null $this->noProgress\n     *\/","9845":"\/**\n     * @phpstan-assert-if-true !null $this->noResults\n     *\/","9847":"\/**\n     * @phpstan-assert-if-true !null $this->noLogging\n     *\/","9849":"\/**\n     * @phpstan-assert-if-true !null $this->processIsolation\n     *\/","9851":"\/**\n     * @phpstan-assert-if-true !null $this->randomOrderSeed\n     *\/","9853":"\/**\n     * @phpstan-assert-if-true !null $this->reportUselessTests\n     *\/","9855":"\/**\n     * @phpstan-assert-if-true !null $this->resolveDependencies\n     *\/","9857":"\/**\n     * @phpstan-assert-if-true !null $this->reverseList\n     *\/","9859":"\/**\n     * @phpstan-assert-if-true !null $this->stderr\n     *\/","9861":"\/**\n     * @phpstan-assert-if-true !null $this->strictCoverage\n     *\/","9863":"\/**\n     * @phpstan-assert-if-true !null $this->teamcityLogfile\n     *\/","9865":"\/**\n     * @phpstan-assert-if-true !null $this->teamCityPrinter\n     *\/","9867":"\/**\n     * @phpstan-assert-if-true !null $this->testdoxHtmlFile\n     *\/","9869":"\/**\n     * @phpstan-assert-if-true !null $this->testdoxTextFile\n     *\/","9871":"\/**\n     * @phpstan-assert-if-true !null $this->testdoxPrinter\n     *\/","9873":"\/**\n     * @phpstan-assert-if-true !null $this->testdoxPrinterSummary\n     *\/","9875":"\/**\n     * @phpstan-assert-if-true !null $this->testSuffixes\n     *\/","9877":"\/**\n     * @phpstan-assert-if-true !null $this->testSuite\n     *\/","9879":"\/**\n     * @phpstan-assert-if-true !null $this->excludeTestSuite\n     *\/","9881":"\/**\n     * @phpstan-assert-if-true !null $this->displayDetailsOnIncompleteTests\n     *\/","9883":"\/**\n     * @phpstan-assert-if-true !null $this->displayDetailsOnSkippedTests\n     *\/","9885":"\/**\n     * @phpstan-assert-if-true !null $this->displayDetailsOnTestsThatTriggerDeprecations\n     *\/","9887":"\/**\n     * @phpstan-assert-if-true !null $this->displayDetailsOnPhpunitDeprecations\n     *\/","9889":"\/**\n     * @phpstan-assert-if-true !null $this->displayDetailsOnTestsThatTriggerErrors\n     *\/","9891":"\/**\n     * @phpstan-assert-if-true !null $this->displayDetailsOnTestsThatTriggerNotices\n     *\/","9893":"\/**\n     * @phpstan-assert-if-true !null $this->displayDetailsOnTestsThatTriggerWarnings\n     *\/","9895":"\/**\n     * @phpstan-assert-if-true !null $this->logEventsText\n     *\/","9897":"\/**\n     * @phpstan-assert-if-true !null $this->logEventsVerboseText\n     *\/","9899":"\/**\n     * @phpstan-assert-if-true !null $this->extensions\n     *\/","9907":"\/**\n     * @var list<PhptTestCase|TestCase>\n     *\/","9908":"\/**\n     * @param list<PhptTestCase|TestCase> $tests\n     *\/","9926":"\/**\n     * @throws NoActiveTimerException\n     * @throws NoCoverageCacheDirectoryException\n     *\/","9927":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @codeCoverageIgnore\n *\/","9928":"\/**\n     * @param list<string> $argv\n     *\n     * @throws ConfigurationCannotBeBuiltException\n     *\/","9929":"\/**\n * CLI options and XML configuration are static within a single PHPUnit process.\n * It is therefore okay to use a Singleton registry here.\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This class is not covered by the backward compatibility promise for PHPUnit\n *\/","9937":"\/**\n     * @var list<array{className: non-empty-string, parameters: array<string, string>}>\n     *\/","9946":"\/**\n     * @param list<non-empty-string>                                                      $cliArguments\n     * @param ?non-empty-string                                                           $pharExtensionDirectory\n     * @param list<array{className: non-empty-string, parameters: array<string, string>}> $extensionBootstrappers\n     * @param ?non-empty-list<non-empty-string>                                           $testsCovering\n     * @param ?non-empty-list<non-empty-string>                                           $testsUsing\n     * @param ?non-empty-list<non-empty-string>                                           $testsRequiringPhpExtension\n     * @param list<non-empty-string>                                                      $groups\n     * @param list<non-empty-string>                                                      $excludeGroups\n     * @param non-empty-list<non-empty-string>                                            $testSuffixes\n     * @param null|non-empty-string                                                       $generateBaseline\n     * @param non-negative-int                                                            $shortenArraysForExportThreshold\n     *\/","9947":"\/**\n     * @phpstan-assert-if-true !empty $this->cliArguments\n     *\/","9950":"\/**\n     * @throws NoConfigurationFileException\n     *\/","9952":"\/**\n     * @throws NoBootstrapException\n     *\/","9954":"\/**\n     * @throws NoCacheDirectoryException\n     *\/","9955":"\/**\n     * @phpstan-assert-if-true !null $this->coverageCacheDirectory\n     *\/","9956":"\/**\n     * @throws NoCoverageCacheDirectoryException\n     *\/","9958":"\/**\n     * @throws CodeCoverageReportNotConfiguredException\n     *\/","9961":"\/**\n     * @phpstan-assert-if-true !null $this->coverageCrap4j\n     *\/","9965":"\/**\n     * @phpstan-assert-if-true !null $this->coverageHtmlCustomCssFile\n     *\/","9966":"\/**\n     * @throws NoCustomCssFileException\n     *\/","9974":"\/**\n     * @throws SpecificDeprecationToStopOnNotConfiguredException\n     *\/","9975":"\/**\n     * @phpstan-assert-if-true !null $this->pharExtensionDirectory\n     *\/","9976":"\/**\n     * @throws NoPharExtensionDirectoryException\n     *\n     * @return non-empty-string\n     *\/","9977":"\/**\n     * @return list<array{className: non-empty-string, parameters: array<string, string>}>\n     *\/","9978":"\/**\n     * @phpstan-assert-if-true !null $this->logfileTeamcity\n     *\/","9979":"\/**\n     * @throws LoggingNotConfiguredException\n     *\/","9980":"\/**\n     * @phpstan-assert-if-true !null $this->logfileJunit\n     *\/","9982":"\/**\n     * @phpstan-assert-if-true !null $this->logfileTestdoxHtml\n     *\/","9984":"\/**\n     * @phpstan-assert-if-true !null $this->logfileTestdoxText\n     *\/","9990":"\/**\n     * @phpstan-assert-if-true !empty $this->testsCovering\n     *\/","9991":"\/**\n     * @throws FilterNotConfiguredException\n     *\n     * @return list<string>\n     *\/","9992":"\/**\n     * @phpstan-assert-if-true !empty $this->testsUsing\n     *\/","9994":"\/**\n     * @phpstan-assert-if-true !empty $this->testsRequiringPhpExtension\n     *\/","9995":"\/**\n     * @throws FilterNotConfiguredException\n     *\n     * @return non-empty-list<non-empty-string>\n     *\/","9997":"\/**\n     * @throws FilterNotConfiguredException\n     *\/","10000":"\/**\n     * @phpstan-assert-if-true !empty $this->groups\n     *\/","10002":"\/**\n     * @phpstan-assert-if-true !empty $this->excludeGroups\n     *\/","10004":"\/**\n     * @phpstan-assert-if-true !null $this->defaultTestSuite\n     *\/","10005":"\/**\n     * @throws NoDefaultTestSuiteException\n     *\/","10006":"\/**\n     * @return non-empty-list<non-empty-string>\n     *\/","10008":"\/**\n     * @throws NoBaselineException\n     *\n     * @return non-empty-string\n     *\/","10011":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @immutable\n *\/","10012":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @immutable\n *\n * @template-implements IteratorAggregate<int, Constant>\n *\/","10013":"\/**\n     * @var list<Constant>\n     *\/","10014":"\/**\n     * @param list<Constant> $constants\n     *\/","10015":"\/**\n     * @return list<Constant>\n     *\/","10016":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @template-implements Iterator<int, Constant>\n *\/","10019":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @immutable\n *\n * @template-implements IteratorAggregate<int, Directory>\n *\/","10020":"\/**\n     * @var list<Directory>\n     *\/","10021":"\/**\n     * @param list<Directory> $directories\n     *\/","10022":"\/**\n     * @return list<Directory>\n     *\/","10023":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @template-implements Iterator<int, Directory>\n *\/","10028":"\/**\n     * @var array<string,string>\n     *\/","10029":"\/**\n     * @param non-empty-string     $className\n     * @param array<string,string> $parameters\n     *\/","10031":"\/**\n     * @return array<string,string>\n     *\/","10032":"\/**\n * @template-implements IteratorAggregate<int, ExtensionBootstrap>\n *\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @immutable\n *\/","10033":"\/**\n     * @var list<ExtensionBootstrap>\n     *\/","10034":"\/**\n     * @param list<ExtensionBootstrap> $extensionBootstraps\n     *\/","10035":"\/**\n     * @return list<ExtensionBootstrap>\n     *\/","10036":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @template-implements Iterator<int, ExtensionBootstrap>\n *\/","10040":"\/**\n     * @param non-empty-string $path\n     *\/","10042":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @immutable\n *\n * @template-implements IteratorAggregate<int, File>\n *\/","10043":"\/**\n     * @var list<File>\n     *\/","10044":"\/**\n     * @param list<File> $files\n     *\/","10045":"\/**\n     * @return list<File>\n     *\/","10046":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @template-implements Iterator<int, File>\n *\/","10052":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @immutable\n *\n * @template-implements IteratorAggregate<int, FilterDirectory>\n *\/","10053":"\/**\n     * @var list<FilterDirectory>\n     *\/","10054":"\/**\n     * @param list<FilterDirectory> $directories\n     *\/","10055":"\/**\n     * @return list<FilterDirectory>\n     *\/","10056":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @template-implements Iterator<int, FilterDirectory>\n *\/","10060":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @immutable\n *\n * @template-implements IteratorAggregate<int, Group>\n *\/","10061":"\/**\n     * @var list<Group>\n     *\/","10062":"\/**\n     * @param list<Group> $groups\n     *\/","10063":"\/**\n     * @return list<Group>\n     *\/","10065":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @template-implements Iterator<int, Group>\n *\/","10068":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @immutable\n *\n * @template-implements IteratorAggregate<int, IniSetting>\n *\/","10069":"\/**\n     * @var list<IniSetting>\n     *\/","10070":"\/**\n     * @param list<IniSetting> $iniSettings\n     *\/","10071":"\/**\n     * @return list<IniSetting>\n     *\/","10072":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @template-implements Iterator<int, IniSetting>\n *\/","10076":"\/**\n     * @throws \\PHPUnit\\TextUI\\XmlConfiguration\\Exception\n     * @throws Exception\n     * @throws NoCustomCssFileException\n     *\/","10088":"\/**\n     * This method is used by the \"run test(s) in separate process\" templates.\n     *\n     * @noinspection PhpUnused\n     *\n     * @codeCoverageIgnore\n     *\/","10092":"\/**\n     * @var array{functions: list<non-empty-string>, methods: list<non-empty-string>}\n     *\/","10093":"\/**\n     * @param non-empty-string                                                          $baseline\n     * @param array{functions: list<non-empty-string>, methods: list<non-empty-string>} $deprecationTriggers\n     *\/","10094":"\/**\n     * @phpstan-assert-if-true !null $this->baseline\n     *\/","10097":"\/**\n     * @return array{functions: list<non-empty-string>, methods: list<non-empty-string>}\n     *\/","10099":"\/**\n     * @var array<non-empty-string, true>\n     *\/","10100":"\/**\n     * @param array<non-empty-string, true> $map\n     *\/","10102":"\/**\n     * @var ?SplObjectStorage<Source, array<non-empty-string, true>>\n     *\/","10103":"\/**\n     * @return array<non-empty-string, true>\n     *\/","10104":"\/**\n     * @return array<string,array{list<string>,list<string>}>\n     *\/","10109":"\/**\n     * @param non-empty-string       $path\n     * @param list<non-empty-string> $groups\n     *\/","10112":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @immutable\n *\n * @template-implements IteratorAggregate<int, TestDirectory>\n *\/","10113":"\/**\n     * @var list<TestDirectory>\n     *\/","10114":"\/**\n     * @param list<TestDirectory> $directories\n     *\/","10115":"\/**\n     * @return list<TestDirectory>\n     *\/","10116":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @template-implements Iterator<int, TestDirectory>\n *\/","10124":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @immutable\n *\n * @template-implements IteratorAggregate<int, TestFile>\n *\/","10125":"\/**\n     * @var list<TestFile>\n     *\/","10126":"\/**\n     * @param list<TestFile> $files\n     *\/","10127":"\/**\n     * @return list<TestFile>\n     *\/","10128":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @template-implements Iterator<int, TestFile>\n *\/","10135":"\/**\n     * @throws \\PHPUnit\\Framework\\Exception\n     * @throws RuntimeException\n     * @throws TestDirectoryNotFoundException\n     * @throws TestFileNotFoundException\n     *\/","10136":"\/**\n     * @param non-empty-string       $path\n     * @param list<non-empty-string> $suffixes\n     *\n     * @throws \\PHPUnit\\Framework\\Exception\n     *\/","10137":"\/**\n     * @param list<non-empty-string> $paths\n     * @param list<non-empty-string> $suffixes\n     *\n     * @throws \\PHPUnit\\Framework\\Exception\n     *\/","10138":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @immutable\n *\n * @template-implements IteratorAggregate<int, TestSuite>\n *\/","10139":"\/**\n     * @var list<TestSuite>\n     *\/","10140":"\/**\n     * @param list<TestSuite> $testSuites\n     *\/","10141":"\/**\n     * @return list<TestSuite>\n     *\/","10142":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @template-implements Iterator<int, TestSuite>\n *\/","10145":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @immutable\n *\n * @template-implements IteratorAggregate<int, Variable>\n *\/","10146":"\/**\n     * @var list<Variable>\n     *\/","10147":"\/**\n     * @param list<Variable> $variables\n     *\/","10148":"\/**\n     * @return list<Variable>\n     *\/","10149":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @template-implements Iterator<int, Variable>\n *\/","10153":"\/**\n     * @return array<non-empty-string, non-empty-list<array{arg: non-empty-string, desc: non-empty-string}|array{spacer: ''}|array{text: non-empty-string}>>\n     *\/","10156":"\/**\n     * @var closed-resource|resource\n     *\/","10157":"\/**\n     * @throws CannotOpenSocketException\n     * @throws DirectoryDoesNotExistException\n     * @throws InvalidSocketException\n     *\/","10184":"\/**\n     * @param non-empty-string $type\n     * @param list<Issue>      $issues\n     *\/","10185":"\/**\n     * @param list<array{title: string, body: string}> $elements\n     *\/","10186":"\/**\n     * @param array<string,list<ConsideredRisky|DeprecationTriggered|ErrorTriggered|NoticeTriggered|PhpDeprecationTriggered|PhpNoticeTriggered|PhpunitDeprecationTriggered|PhpunitErrorTriggered|PhpunitWarningTriggered|PhpWarningTriggered|WarningTriggered>> $events\n     *\n     * @return array{numberOfTestsWithIssues: int, numberOfIssues: int, elements: list<array{title: string, body: string}>}\n     *\/","10190":"\/**\n     * @param ?array<string, TestResultCollection> $testDoxResult\n     *\/","10199":"\/**\n     * @return array{message: string, diff: string}\n     *\/","10200":"\/**\n     * @param 'default'|'diff'|'last'|'message'|'start'|'trace' $type\n     *\/","10201":"\/**\n     * @param 'after-last-test'|'before-first-test'                                            $type\n     * @param array<non-empty-string, AfterLastTestMethodErrored|BeforeFirstTestMethodErrored> $errors\n     *\/","10209":"\/**\n     * @throws Event\\RuntimeException\n     * @throws FilterNotConfiguredException\n     *\/","10212":"\/**\n     * @phpstan-assert-if-true !null $this->clover\n     *\/","10214":"\/**\n     * @phpstan-assert-if-true !null $this->cobertura\n     *\/","10216":"\/**\n     * @phpstan-assert-if-true !null $this->crap4j\n     *\/","10218":"\/**\n     * @phpstan-assert-if-true !null $this->html\n     *\/","10220":"\/**\n     * @phpstan-assert-if-true !null $this->php\n     *\/","10222":"\/**\n     * @phpstan-assert-if-true !null $this->text\n     *\/","10224":"\/**\n     * @phpstan-assert-if-true !null $this->xml\n     *\/","10230":"\/**\n     * @phpstan-assert-if-true !null $this->customCssFile\n     *\/","10236":"\/**\n     * @phpstan-assert-if-true DefaultConfiguration $this\n     *\/","10237":"\/**\n     * @phpstan-assert-if-true LoadedFromFileConfiguration $this\n     *\/","10240":"\/**\n     * @throws MigrationException\n     *\/","10241":"\/**\n     * @param list<non-empty-string> $attributes\n     *\/","10261":"\/**\n     * @phpstan-assert-if-true SuccessfulSchemaDetectionResult $this\n     *\/","10262":"\/**\n     * @throws XmlException\n     *\/","10270":"\/**\n     * @param non-empty-string $filename\n     *\/","10276":"\/**\n     * @return list<DOMElement>\n     *\/","10291":"\/**\n     * @var non-empty-array<non-empty-string, non-empty-list<class-string>>\n     *\/","10292":"\/**\n     * @return non-empty-list<Migration>\n     *\/","10295":"\/**\n     * @throws Exception\n     * @throws MigrationException\n     * @throws XmlException\n     *\/","10309":"\/**\n     * @param ?non-empty-string $extensionsDirectory\n     * @param non-negative-int  $shortenArraysForExportThreshold\n     *\/","10314":"\/**\n     * @phpstan-assert-if-true !null $this->extensionsDirectory\n     *\/","10315":"\/**\n     * @throws Exception\n     *\n     * @return non-empty-string\n     *\/","10350":"\/**\n     * @throws CannotFindSchemaException\n     *\/","10351":"\/**\n * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit\n *\n * @internal This class is not covered by the backward compatibility promise for PHPUnit\n *\n * @template-implements IteratorAggregate<int, DOMNode>\n *\/","10352":"\/**\n     * @var list<DOMNode>\n     *\/","10353":"\/**\n     * @param DOMNodeList<DOMNode> $list\n     *\/","10354":"\/**\n     * @return ArrayIterator<int, DOMNode>\n     *\/","10357":"\/**\n     * @param non-empty-string $version\n     *\/","10360":"\/**\n     * @param non-empty-string $xmlConfigurationFile,\n     *\n     * @throws RuntimeException\n     * @throws TestDirectoryNotFoundException\n     * @throws TestFileNotFoundException\n     *\/","10363":"\/**\n     * @var array<int, list<string>>\n     *\/","10364":"\/**\n     * @param array<int, LibXMLError> $errors\n     *\/","10365":"\/**\n     * @param array<int, list<string>> $validationErrors\n     *\/","10368":"\/**\n     * @var non-empty-array<non-empty-string, non-empty-string>\n     *\/","10373":"\/**\n     * @var non-empty-array<class-string, positive-int>\n     *\/","10375":"\/**\n     * @param non-empty-string $directory\n     *\n     * @throws InvalidDirectoryException\n     *\/","10378":"\/**\n     * @param array<mixed> $data\n     *\/","10380":"\/**\n     * @param non-empty-string $path\n     *\n     * @return false|non-empty-string\n     *\/","10383":"\/**\n     * @param list<array{file: string, line: ?int, class?: class-string, function?: string, type: string}> $frames\n     *\/","10384":"\/**\n     * @param array{file?: non-empty-string} $frame\n     *\/","10385":"\/**\n     * @param list<array{file?: non-empty-string, line?: int}> $trace\n     *\/","10388":"\/**\n     * @var non-empty-array<non-empty-string, non-empty-array<non-empty-string, true>>\n     *\/","10390":"\/**\n     * @param list<string> $files\n     *\n     * @throws Exception\n     *\/","10391":"\/**\n     * @param array<mixed> $array\n     *\/","10393":"\/**\n     * @param non-empty-string $url\n     *\/","10400":"\/**\n     * @throws InvalidJsonException\n     *\/","10401":"\/**\n     * Element 0 is true and element 1 is null when JSON decoding did not work.\n     * * Element 0 is false and element 1 has the decoded value when JSON decoding did work.\n     * * This is used to avoid ambiguity with JSON strings consisting entirely of 'null' or 'false'.\n     *\n     * @return array{0: false, 1: mixed}|array{0: true, 1: null}\n     *\/","10402":"\/**\n     * JSON object keys are unordered while PHP array keys are ordered.\n     *\n     * Sort all array keys to ensure both the expected and actual values have\n     * their keys in the same order.\n     *\/","10404":"\/**\n     * @throws PhpProcessException\n     *\/","10405":"\/**\n     * @param ?non-empty-string $temporaryFile\n     *\n     * @throws PhpProcessException\n     *\/","10406":"\/**\n     * @return non-empty-list<string>\n     *\/","10407":"\/**\n     * @param list<string> $settings\n     *\n     * @return list<string>\n     *\/","10408":"\/**\n     * @param non-empty-string $processResultFile\n     *\/","10415":"\/**\n     * @param non-empty-string       $code\n     * @param list<string>           $phpSettings\n     * @param array<string, string>  $environmentVariables\n     * @param list<non-empty-string> $arguments\n     * @param ?non-empty-string      $input\n     *\/","10418":"\/**\n     * @phpstan-assert-if-true !empty $this->environmentVariables\n     *\/","10420":"\/**\n     * @phpstan-assert-if-true !empty $this->arguments\n     *\/","10422":"\/**\n     * @phpstan-assert-if-true !empty $this->input\n     *\/","10423":"\/**\n     * @throws PhpProcessException\n     *\n     * @return non-empty-string\n     *\/","10431":"\/**\n     * @param class-string     $className\n     * @param non-empty-string $methodName\n     *\n     * @return array{file: non-empty-string, line: non-negative-int}\n     *\/","10432":"\/**\n     * @param ReflectionClass<TestCase> $class\n     *\n     * @return list<ReflectionMethod>\n     *\/","10439":"\/**\n     * @var '!='|'<'|'<='|'<>'|'='|'=='|'>'|'>='|'eq'|'ge'|'gt'|'le'|'lt'|'ne'\n     *\/","10440":"\/**\n     * @param '!='|'<'|'<='|'<>'|'='|'=='|'>'|'>='|'eq'|'ge'|'gt'|'le'|'lt'|'ne' $operator\n     *\n     * @throws InvalidVersionOperatorException\n     *\/","10441":"\/**\n     * @return '!='|'<'|'<='|'<>'|'='|'=='|'>'|'>='|'eq'|'ge'|'gt'|'le'|'lt'|'ne'\n     *\/","10444":"\/**\n     * Escapes a string for the use in XML documents.\n     *\n     * Any Unicode character is allowed, excluding the surrogate blocks, FFFE,\n     * and FFFF (not even as character reference).\n     *\n     * @see https:\/\/www.w3.org\/TR\/xml\/#charsets\n     *\/","10449":"\/** @psalm-assert-if-true Library $this *\/","10450":"\/** @psalm-assert-if-true Extension $this *\/","10453":"\/** @var null|Email *\/","10454":"\/**\n     * @psalm-assert-if-true Email $this->email\n     *\/","10455":"\/** @template-implements IteratorAggregate<int,Author> *\/","10456":"\/** @var Author[] *\/","10457":"\/**\n     * @return Author[]\n     *\/","10458":"\/** @template-implements Iterator<int,Author> *\/","10462":"\/** @var Version *\/","10463":"\/** @template-implements IteratorAggregate<int,BundledComponent> *\/","10464":"\/** @var BundledComponent[] *\/","10465":"\/**\n     * @return BundledComponent[]\n     *\/","10466":"\/** @template-implements Iterator<int,BundledComponent> *\/","10469":"\/** @var AuthorCollection *\/","10470":"\/** @var License *\/","10471":"\/** @template-implements Iterator<int,DOMElement> *\/","10472":"\/** @var DOMElement[] *\/","10475":"\/** @var ApplicationName *\/","10476":"\/** @var VersionConstraint *\/","10477":"\/** @psalm-assert-if-true Application $this *\/","10482":"\/** @var Url *\/","10485":"\/** @var Type *\/","10486":"\/** @var CopyrightInformation *\/","10487":"\/** @var RequirementCollection *\/","10488":"\/** @var BundledComponentCollection *\/","10489":"\/** @var DOMDocument *\/","10490":"\/** @var LibXMLError[] *\/","10491":"\/**\n     * ManifestDocumentLoadingException constructor.\n     *\n     * @param LibXMLError[] $libxmlErrors\n     *\/","10492":"\/**\n     * @return LibXMLError[]\n     *\/","10493":"\/** @var DOMElement *\/","10494":"\/** @psalm-suppress MissingConstructor *\/","10495":"\/** @var XMLWriter *\/","10498":"\/** @template-implements IteratorAggregate<int,Requirement> *\/","10499":"\/** @var Requirement[] *\/","10500":"\/**\n     * @return Requirement[]\n     *\/","10501":"\/** @template-implements Iterator<int,Requirement> *\/","10508":"\/**\n     * @throws InvalidUrlException\n     *\/","10510":"\/** @var VersionConstraint[] *\/","10511":"\/**\n     * @param VersionConstraint[] $constraints\n     *\/","10515":"\/**\n     * @param string              $originalValue\n     * @param VersionConstraint[] $constraints\n     *\/","10520":"\/**\n     * @throws InvalidPreReleaseSuffixException\n     *\/","10525":"\/** @var VersionNumber *\/","10528":"\/** @var null|PreReleaseSuffix *\/","10529":"\/** @var null|BuildMetaData *\/","10530":"\/**\n     * @throws NoPreReleaseSuffixException\n     *\/","10531":"\/**\n     * @psalm-assert-if-true BuildMetaData $this->buildMetadata\n     * @psalm-assert-if-true BuildMetaData $this->getBuildMetaData()\n     *\/","10532":"\/**\n     * @throws NoBuildMetaDataException\n     *\/","10533":"\/**\n     * @param string[] $matches\n     *\n     * @throws InvalidPreReleaseSuffixException\n     *\/","10534":"\/**\n     * @param string $version\n     *\n     * @throws InvalidVersionException\n     *\/","10535":"\/**\n     * @throws UnsupportedVersionConstraintException\n     *\/","10542":"\/** @var ?int *\/","10543":"\/**\n     * @return array<string,mixed>\n     *\/","10544":"\/**\n     * @return array<string, array<string, array<int,mixed>>>\n     *\/","10545":"\/**\n     * @return array<string, int|string|null>\n     *\/","10546":"\/**\n * @implements IteratorAggregate<AssertionResult>\n *\/","10547":"\/**\n     * @var array<AssertionResult>\n     *\/","10548":"\/**\n     * @param array<AssertionResult> $results\n     *\/","10549":"\/**\n     * @return ArrayIterator<int,AssertionResult>\n     *\/","10550":"\/**\n     * @return AssertionResult[]\n     *\/","10552":"\/**\n     * @return self<AssertionResult>\n     *\/","10554":"\/**\n     * @var string[]\n     *\/","10555":"\/**\n     * @param string|string[] $methods\n     *\/","10566":"\/**\n     * @var array<string,mixed>\n     *\/","10567":"\/**\n     * @param array<string,mixed> $config\n     *\/","10569":"\/**\n     * @param string[] $groups\n     *\/","10570":"\/**\n     * @var int[]\n     *\/","10571":"\/**\n     * @param int|int[] $iterations\n     *\/","10574":"\/**\n     * @var int\n     *\/","10576":"\/**\n     * @param string|string[] $providers\n     *\/","10578":"\/**\n     * @param int|int[] $revs\n     *\/","10581":"\/**\n * Class providing some static methods which are used\n * to provide base line measurements.\n *\n *\/","10582":"\/**\n     * Do nothing.\n     *\n     * @param int $revs\n     *\/","10583":"\/**\n     * Calculate an md5 hash.\n     *\n     * @param int $revs\n     *\/","10584":"\/**\n     * Open a file, write a string to it $revs times, then\n     * read each line back.\n     *\n     * @param int $revs\n     *\/","10585":"\/**\n * This class finds a benchmark (or benchmarks depending on the path), loads\n * their metadata and builds a collection of BenchmarkMetadata instances.\n *\/","10586":"\/**\n     * @param array<string> $paths\n     * @param array<string> $subjectFilter\n     * @param array<string> $groupFilter\n     *\n     * @return Generator<BenchmarkMetadata>\n     *\/","10587":"\/**\n     * @param string[] $paths\n     *\n     * @return Generator<SplFileInfo>\n     *\/","10588":"\/**\n * @implements Iterator<ParameterSet>\n *\/","10589":"\/**\n     * @var array<int,ArrayIterator<string, ParameterSet>>\n     *\/","10590":"\/**\n     * @var array<string, ParameterContainer>\n     *\/","10591":"\/**\n * Annotation reader.\n *\/","10592":"\/** @var array<class-string, array<string, class-string>> *\/","10593":"\/** @var array<string, class-string> *\/","10594":"\/** @var array<string, bool> *\/","10595":"\/**\n     * Set import use to true in order to use imported annotations, otherwise\n     * import the PHPBench annotations directly.\n     *\n     *\/","10596":"\/**\n     * Return annotations for the given class.\n     *\n     * @return list<object>\n     *\/","10597":"\/**\n     * @return list<object>\n     *\/","10598":"\/**\n     * @return array<string, class-string>\n     *\/","10600":"\/**\n     * Delegates to the doctrine DocParser but catches annotation not found errors and throws\n     * something useful.\n     *\n     * @see DocParser\n     *\n     * @return list<object>\n     *\/","10601":"\/**\n * @Attributes({\n *\n *    @Attribute(\"extend\", required = true, type=\"boolean\"),\n * })\n *\/","10602":"\/**\n     * @param array{extend?: bool} $params\n     *\/","10604":"\/**\n * @Taget({\"METHOD\", \"CLASS\"})\n *\n * @Attributes({\n *\n *    @Attribute(\"value\", required = true,  type = \"array\"),\n * })\n *\/","10606":"\/**\n     * @param array{value: string[]} $params\n     *\/","10609":"\/**\n * @Annotation()\n *\/","10617":"\/**\n * @Annotation\n *\n * @Taget({\"METHOD\", \"CLASS\"})\n *\n * @Attributes({\n *\n *    @Attribute(\"value\", required = true, type=\"string\")\n * })\n *\/","10618":"\/**\n     * @param array{value: string} $params\n     *\/","10619":"\/**\n * @Annotation\n *\n * @Taget({\"CLASS\"})\n *\n * @Attributes({\n *\n *    @Attribute(\"value\", required = true,  type = \"array\"),\n * })\n *\/","10627":"\/**\n * @Annotation\n *\n * @Taget({\"METHOD\", \"CLASS\"})\n *\/","10630":"\/**\n     * @return array<string, mixed>\n     *\/","10633":"\/**\n * @Annotation\n *\n * @Taget({\"METHOD\", \"CLASS\"})\n *\n * @Attributes({\n *\n *    @Attribute(\"value\", required = true, type=\"array\"),\n * })\n *\/","10638":"\/**\n * @Annotation\n *\n * @Taget({\"METHOD\", \"CLASS\"})\n *\n * @Attributes({\n *\n *    @Attribute(\"value\", required = true, type=\"mixed\")\n * })\n *\/","10640":"\/**\n     * @param array{value: int[]} $params\n     *\/","10641":"\/**\n     * @return int[]\n     *\/","10645":"\/**\n * @Annotation\n *\n * @Taget({\"METHOD\", \"CLASS\"})\n *\n * @Attributes({\n *\n *    @Attribute(\"value\", required = true, type=\"string\"),\n *    @Attribute(\"precision\", required = false, type=\"integer\")\n * })\n *\/","10646":"\/**\n     * @param array{value: string, precision?: int} $timeUnit\n     *\/","10648":"\/**\n     * @return ?int\n     *\/","10654":"\/**\n * @Annotation\n *\n * @Taget({\"METHOD\", \"CLASS\"})\n *\n * @Attributes({\n *\n *    @Attribute(\"value\", required = true, type=\"float\")\n * })\n *\/","10655":"\/**\n     * @param array{value: float} $params\n     *\/","10656":"\/**\n * @Annotation\n *\n * @Taget({\"METHOD\", \"CLASS\"})\n *\n * @Attributes({\n *\n *    @Attribute(\"value\", required = true, type=\"mixed\"),\n * })\n *\/","10658":"\/**\n     * @param array{value: int[]} $revs\n     *\/","10661":"\/**\n * @Annotation\n *\n * @Taget({\"METHOD\", \"CLASS\"})\n *\n * @Attributes({\n *\n *    @Attribute(\"value\", required = true, type=\"integer\")\n * })\n *\/","10662":"\/**\n     * @param array{value: int} $params\n     *\/","10663":"\/**\n * @Annotation\n *\n * @Taget({\"METHOD\"})\n *\/","10670":"\/**\n * @deprecated\n *\n * @todo seems this class is not used so we can drop it\n *\/","10671":"\/**\n     * @param mixed[] $config\n     *\/","10672":"\/**\n     * @return mixed[]\n     *\/","10673":"\/**\n * Benchmark metadata class.\n *\/","10674":"\/** @var array<string, SubjectMetadata> indexed by subject name *\/","10677":"\/**\n     * Get the file path of this benchmark.\n     *\/","10678":"\/**\n     * Get or create a new SubjectMetadata instance with the given name.\n     *\n     *\/","10679":"\/**\n     * Get the subject metadata instances for this benchmark metadata.\n     *\n     * @return array<string, SubjectMetadata> indexed by subject name\n     *\/","10680":"\/**\n     * Remove all subjects whose name is not in the given list.\n     *\n     * @param string[] $filters\n     *\/","10681":"\/**\n     * Remove all the subjects which are not contained in the given list of groups.\n     *\n     * @param string[] $groups\n     *\/","10682":"\/**\n     * Return true if there are subjects in this benchmark metadata, false if not.\n     *\/","10683":"\/**\n     * Return the benchmark class.\n     *\/","10684":"\/**\n     * Return any methods that should be called before the benchmark class is executed.\n     *\n     * @return string[]\n     *\/","10685":"\/**\n     * Set any methods that should be called before the benchmark class is executed.\n     *\n     * @param string[] $beforeClassMethods\n     *\/","10686":"\/**\n     * Return any methods that should be called after the benchmark class is executed.\n     *\n     * @return string[]\n     *\/","10687":"\/**\n     * Set any methods that should be called after the benchmark class is executed.\n     *\n     * @param string[] $afterClassMethods\n     *\/","10688":"\/**\n     * @return array<string, SubjectMetadata>\n     *\/","10689":"\/**\n * Interface for metadata drivers.\n *\/","10690":"\/**\n     * Return the metadata for the given class FQN.\n     *\/","10691":"\/**\n     * @param string $subjectPattern\n     *\/","10692":"\/**\n     * @param object[] $annotations\n     *\/","10693":"\/**\n     * @param string[] $currentValues\n     * @param string[] $annotationValues\n     *\n     * @return string[]\n     *\/","10694":"\/**\n     * @param object[] $attributes\n     *\/","10695":"\/**\n     * @param object $attribute\n     *\/","10697":"\/**\n     * @param DriverInterface[] $drivers\n     *\/","10699":"\/**\n     * @param string[]|null $assert\n     * @param int[]|null $iterations\n     * @param int[]|null $revs\n     * @param int[]|null $warmup\n     *\/","10701":"\/**\n     * @param array<string, mixed> $config\n     *\/","10704":"\/**\n * Benchmark Metadata Factory.\n *\/","10705":"\/**\n     * Return a Benchmark instance for the given file or NULL if the\n     * given file contains no classes, or the class in the given file is\n     * abstract.\n     *\/","10706":"\/**\n * Metadata for benchmarkMetadata subjects.\n *\/","10707":"\/**\n     * @var string[]|null\n     *\/","10711":"\/**\n     * @var null|int[]\n     *\/","10714":"\/**\n     * @var null|array<string>\n     *\/","10715":"\/**\n     * Return the method name of this subject.\n     *\/","10716":"\/**\n     * Set the parameter sets for this subject.\n     *\/","10717":"\/**\n     * Return the parameter sets for this subject.\n     *\/","10718":"\/**\n     * Return the benchmarkMetadata metadata for this subject.\n     *\/","10723":"\/**\n     * @param string[] $beforeMethods\n     *\/","10725":"\/**\n     * @param string[] $afterMethods\n     *\/","10727":"\/**\n     * @param string[] $paramProviders\n     *\/","10728":"\/**\n     * @return int[]|null\n     *\/","10729":"\/**\n     * @param int[] $iterations\n     *\/","10731":"\/**\n     * @param int[] $revs\n     *\/","10733":"\/**\n     * @param int[] $warmup\n     *\/","10734":"\/**\n     * @param array<string> $assertions\n     *\/","10736":"\/**\n * The benchmark runner.\n *\/","10737":"\/**\n         * @var ConfigurableRegistry<covariant BenchmarkExecutorInterface>\n         *\/","10738":"\/**\n     * Set the progress logger to use.\n     *\n     *\/","10739":"\/**\n     * Run all benchmarks (or all applicable benchmarks) in the given path.\n     *\n     * The $name argument will set the \"name\" attribute on the \"suite\" element.\n     *\n     * @param iterable<BenchmarkMetadata> $benchmarkMetadatas\n     *\/","10740":"\/**\n * The benchmark runner context.\n *\/","10741":"\/** @var string|array<string,mixed> *\/","10750":"\/**\n     * Return the name to assign to this suite.\n     *\/","10751":"\/**\n     * Override the number of iterations to execute.\n     *\n     * @param int[] $default\n     *\n     * @return int[]\n     *\/","10752":"\/**\n     * Get the number of rev(olutions) to run.\n     *\n     * @param int[] $default\n     *\n     * @return int[]\n     *\/","10753":"\/**\n     * Return the number of warmup revolutions that should be exectuted.\n     *\n     * @param int[] $default\n     *\n     * @return int[]\n     *\/","10754":"\/**\n     * Override parameters.\n     *\n     * @param mixed[] $default\n     *\n     * @return mixed[]\n     *\/","10755":"\/**\n     * Override the sleep interval (in microseconds).\n     *\n     * @param ?int $default\n     *\n     * @return ?int\n     *\/","10756":"\/**\n     * Get the deviation threshold beyond which the iteration should\n     * be retried.\n     *\n     * A value of NULL will disable retry.\n     *\/","10757":"\/**\n     * @deprecated as not used\n     * Return the output time unit.\n     *\/","10758":"\/**\n     * Return the output time precision.\n     *\n     * @deprecated as not used\n     *\n     * @return int|string|null\n     *\/","10759":"\/**\n     * Return either an executor configuration name or an actual configuration.\n     *\n     * @return string|array<string,mixed>\n     *\/","10760":"\/**\n     * Return true if the runner should exit on the first exception encountered.\n     *\n     * @retrun bool\n     *\/","10761":"\/**\n     * Return assertions (which will override any metadata based assertions).\n     *\n     * @return array<string>\n     *\/","10762":"\/**\n     * @param string|array<string, mixed>|null $executor\n     *\/","10763":"\/**\n     * @deprecated as not used\n     *\n     * @param string[] $filters\n     *\/","10764":"\/**\n     * @deprecated as not used\n     *\n     * @param string[] $groups\n     *\/","10766":"\/**\n     * @param int[] $revolutions\n     *\/","10767":"\/**\n     * @param mixed[] $parameters\n     *\/","10769":"\/**\n     * @deprecated as not used\n     *\/","10771":"\/**\n     * @param string[] $assertions\n     *\/","10772":"\/**\n     * @param string[] $variantFilters\n     *\/","10774":"\/**\n     * @param int[] $values\n     *\/","10775":"\/**\n * The sampler manager is responsible for collecting and executing\n * sampler benchmarks.\n *\n * Baseline benchmarks are standard microbenchmarks which can be used to\n * determine the \"sampler\" performance of the test platform.\n *\n * These measurements can be used to establish a sampler speed for the system,\n * or to provide counterweights to iteration measurements (and so attempt to\n * cancel out any fluctuations of the test platforms performance).\n *\/","10776":"\/**\n     * @var array<string, callable(int):mixed>\n     *\/","10777":"\/**\n     * Add a sampler callable. The callable can be any\n     * callable accepted by call_user_func.\n     *\n     * Throws an invalid argument exception if the name has\n     * already been registered.\n     *\n     * @param callable(int):mixed $callable\n     *\n     * @throws InvalidArgumentException\n     *\/","10778":"\/**\n     * Return mean time taken to execute the named sampler\n     * callable in microseconds.\n     *\n     * @param string $name\n     * @param int $revs\n     *\/","10779":"\/** final *\/","10780":"\/**\n     * @return array{int,int,int}\n     *\/","10782":"\/**\n     * @var Color[]\n     *\/","10783":"\/**\n     * @return Color[]\n     *\/","10784":"\/**\n     * @return static\n     *\/","10786":"\/**\n     * @var array<int, array{string, int}>\n     *\/","10787":"\/**\n     * @var array<string, Gradient>\n     *\/","10788":"\/**\n     * @param array<string,string> $infoMap\n     *\/","10789":"\/**\n     * @throws LintError\n     *\/","10790":"\/**\n     * @param  ConfigProcessor[] $processors\n     *\/","10792":"\/**\n     * @param array<mixed> $value\n     *\/","10793":"\/**\n     * @param array<string, mixed> $config\n     *\n     * @return array<string, mixed>\n     *\/","10795":"\/**\n * PhpBench application.\n *\n * @author Daniel Leech <daniel@dantleech.com>\n *\/","10797":"\/**\n     * @final\n     *\/","10798":"\/**\n     * Sets the interval to schedule a SIGALRM signal in seconds.\n     *\/","10799":"\/**\n     * Gets the interval in seconds on which a SIGALRM signal is dispatched.\n     *\/","10800":"\/**\n     * Runs the current application.\n     *\n     * @return int 0 if everything went fine, or an error code\n     *\n     * @throws \\Exception When running fails. Bypass this when {@link setCatchExceptions()}.\n     *\/","10801":"\/**\n     * Runs the current application.\n     *\n     * @return int 0 if everything went fine, or an error code\n     *\/","10802":"\/**\n     * Get the helper set associated with the command.\n     *\/","10803":"\/**\n     * Gets the InputDefinition related to this Application.\n     *\/","10804":"\/**\n     * Adds suggestions to $suggestions for the current completion input (e.g. option or argument).\n     *\/","10805":"\/**\n     * Gets the help message.\n     *\/","10806":"\/**\n     * Gets whether to catch exceptions or not during commands execution.\n     *\/","10807":"\/**\n     * Sets whether to catch exceptions or not during commands execution.\n     *\/","10808":"\/**\n     * Sets whether to catch errors or not during commands execution.\n     *\/","10809":"\/**\n     * Gets whether to automatically exit after a command execution or not.\n     *\/","10810":"\/**\n     * Sets whether to automatically exit after a command execution or not.\n     *\/","10811":"\/**\n     * Gets the name of the application.\n     *\/","10812":"\/**\n     * Sets the application name.\n     *\/","10813":"\/**\n     * Gets the application version.\n     *\/","10814":"\/**\n     * Sets the application version.\n     *\/","10815":"\/**\n     * Returns the long version of the application.\n     *\/","10816":"\/**\n     * Registers a new command.\n     *\/","10817":"\/**\n     * Adds an array of command objects.\n     *\n     * If a Command is not enabled it will not be added.\n     *\n     * @param Command[] $commands An array of commands\n     *\/","10818":"\/**\n     * Adds a command object.\n     *\n     * If a command with the same name already exists, it will be overridden.\n     * If the command is not enabled it will not be added.\n     *\/","10819":"\/**\n     * Returns a registered command by name or alias.\n     *\n     * @throws CommandNotFoundException When given command name does not exist\n     *\/","10820":"\/**\n     * Returns true if the command exists, false otherwise.\n     *\/","10821":"\/**\n     * Returns an array of all unique namespaces used by currently registered commands.\n     *\n     * It does not return the global namespace which always exists.\n     *\n     * @return string[]\n     *\/","10822":"\/**\n     * Finds a registered namespace by a name or an abbreviation.\n     *\n     * @throws NamespaceNotFoundException When namespace is incorrect or ambiguous\n     *\/","10823":"\/**\n     * Finds a command by name or alias.\n     *\n     * Contrary to get, this command tries to find the best\n     * match if you give it an abbreviation of a name or alias.\n     *\n     * @throws CommandNotFoundException When command name is incorrect or ambiguous\n     *\/","10824":"\/**\n     * Gets the commands (registered in the given namespace if provided).\n     *\n     * The array keys are the full names and the values the command instances.\n     *\n     * @return Command[]\n     *\/","10825":"\/**\n     * Returns an array of possible abbreviations given a set of names.\n     *\n     * @return string[][]\n     *\/","10826":"\/**\n     * Configures the input and output instances based on the user arguments and options.\n     *\/","10827":"\/**\n     * Runs the current command.\n     *\n     * If an event dispatcher has been attached to the application,\n     * events are also dispatched during the life-cycle of the command.\n     *\n     * @return int 0 if everything went fine, or an error code\n     *\/","10828":"\/**\n     * Gets the name of the command based on input.\n     *\/","10829":"\/**\n     * Gets the default commands that should always be available.\n     *\n     * @return Command[]\n     *\/","10830":"\/**\n     * Gets the default helper set with the helpers that should always be available.\n     *\/","10831":"\/**\n     * Returns the namespace part of the command name.\n     *\n     * This method is not part of public API and should not be used directly.\n     *\/","10832":"\/**\n     * Sets the default Command name.\n     *\n     * @return $this\n     *\/","10833":"\/**\n     * @internal\n     *\/","10834":"\/**\n     * If readline is installed, then prevent the user having to\n     * press <return> in order to paginate.\n     *\/","10835":"\/**\n     * Wait for a single character input and return it.\n     *\n     *\/","10836":"\/**\n     * Ignores validation errors.\n     *\n     * This is mainly useful for the help command.\n     *\/","10837":"\/**\n     * Gets the helper set.\n     *\/","10838":"\/**\n     * Gets the application instance for this command.\n     *\/","10839":"\/**\n     * Checks whether the command is enabled or not in the current environment.\n     *\n     * Override this to check for x or y and return false if the command cannot\n     * run properly under the current conditions.\n     *\/","10840":"\/**\n     * Interacts with the user.\n     *\n     * This method is executed before the InputDefinition is validated.\n     * This means that this is the only place where the command can\n     * interactively ask for values of missing required arguments.\n     *\n     * @return void\n     *\/","10841":"\/**\n     * Initializes the command after the input has been bound and before the input\n     * is validated.\n     *\n     * This is mainly useful when a lot of commands extends one main command\n     * where some things need to be initialized based on the input arguments and options.\n     *\n     * @see InputInterface::bind()\n     * @see InputInterface::validate()\n     *\n     * @return void\n     *\/","10842":"\/**\n     * Runs the command.\n     *\n     * The code to execute is either defined directly with the\n     * setCode() method or by overriding the execute() method\n     * in a sub-class.\n     *\n     * @return int The command exit code\n     *\n     * @throws ExceptionInterface When input binding fails. Bypass this by calling {@link ignoreValidationErrors()}.\n     *\n     * @see setCode()\n     * @see execute()\n     *\/","10843":"\/**\n     * Supplies suggestions when resolving possible completion options for input (e.g. option or argument).\n     *\/","10844":"\/**\n     * Sets the code to execute when running this command.\n     *\n     * If this method is used, it overrides the code defined\n     * in the execute() method.\n     *\n     * @param callable $code A callable(InputInterface $input, OutputInterface $output)\n     *\n     * @return $this\n     *\n     * @throws InvalidArgumentException\n     *\n     * @see execute()\n     *\/","10845":"\/**\n     * Merges the application definition with the command definition.\n     *\n     * This method is not part of public API and should not be used directly.\n     *\n     * @param bool $mergeArgs Whether to merge or not the Application definition arguments to Command definition arguments\n     *\n     * @internal\n     *\/","10846":"\/**\n     * Sets an array of argument and option instances.\n     *\n     * @return $this\n     *\/","10847":"\/**\n     * Gets the InputDefinition attached to this Command.\n     *\/","10848":"\/**\n     * Gets the InputDefinition to be used to create representations of this Command.\n     *\n     * Can be overridden to provide the original command representation when it would otherwise\n     * be changed by merging with the application InputDefinition.\n     *\n     * This method is not part of public API and should not be used directly.\n     *\/","10849":"\/**\n     * Adds an argument.\n     *\n     * @param                                                                               $mode            The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL\n     * @param                                                                               $default         The default value (for InputArgument::OPTIONAL mode only)\n     * @param array|\\Closure(CompletionInput,CompletionSuggestions):list<string|Suggestion> $suggestedValues The values used for input completion\n     *\n     * @return $this\n     *\n     * @throws InvalidArgumentException When argument mode is not valid\n     *\/","10850":"\/**\n     * Adds an option.\n     *\n     * @param                                                                               $shortcut        The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts\n     * @param                                                                               $mode            The option mode: One of the InputOption::VALUE_* constants\n     * @param                                                                               $default         The default value (must be null for InputOption::VALUE_NONE)\n     * @param array|\\Closure(CompletionInput,CompletionSuggestions):list<string|Suggestion> $suggestedValues The values used for input completion\n     *\n     * @return $this\n     *\n     * @throws InvalidArgumentException If option mode is invalid or incompatible\n     *\/","10851":"\/**\n     * Sets the name of the command.\n     *\n     * This method can set both the namespace and the name if\n     * you separate them by a colon (:)\n     *\n     *     $command->setName('foo:bar');\n     *\n     * @return $this\n     *\n     * @throws InvalidArgumentException When the name is invalid\n     *\/","10852":"\/**\n     * Sets the process title of the command.\n     *\n     * This feature should be used only when creating a long process command,\n     * like a daemon.\n     *\n     * @return $this\n     *\/","10853":"\/**\n     * Returns the command name.\n     *\/","10854":"\/**\n     * @param bool $hidden Whether or not the command should be hidden from the list of commands\n     *\n     * @return $this\n     *\/","10855":"\/**\n     * @return bool whether the command should be publicly shown or not\n     *\/","10856":"\/**\n     * Sets the description for the command.\n     *\n     * @return $this\n     *\/","10857":"\/**\n     * Returns the description for the command.\n     *\/","10858":"\/**\n     * Sets the help for the command.\n     *\n     * @return $this\n     *\/","10859":"\/**\n     * Returns the help for the command.\n     *\/","10860":"\/**\n     * Returns the processed help for the command replacing the %command.name% and\n     * %command.full_name% patterns with the real values dynamically.\n     *\/","10861":"\/**\n     * Sets the aliases for the command.\n     *\n     * @param string[] $aliases An array of aliases for the command\n     *\n     * @return $this\n     *\n     * @throws InvalidArgumentException When an alias is invalid\n     *\/","10862":"\/**\n     * Returns the aliases for the command.\n     *\/","10863":"\/**\n     * Returns the synopsis for the command.\n     *\n     * @param bool $short Whether to show the short version of the synopsis (with options folded) or not\n     *\/","10864":"\/**\n     * Add a command usage example, it'll be prefixed with the command name.\n     *\n     * @return $this\n     *\/","10865":"\/**\n     * Returns alternative usages of the command.\n     *\/","10866":"\/**\n     * Gets a helper instance by name.\n     *\n     * @throws LogicException           if no HelperSet is defined\n     * @throws InvalidArgumentException if the helper is not defined\n     *\/","10992":"\/**\n         * @var array<string>\n         *\/","10993":"\/**\n     * @param Registry<DriverInterface> $storage\n     *\/","10994":"\/**\n     * @param string[] $lines\n     *\/","11120":"\/**\n * Command to show\/report on a specific run.\n *\/","11155":"\/**\n * @implements IteratorAggregate<Row>\n * @implements ArrayAccess<string,mixed[]>\n *\/","11156":"\/**\n     * @var Series[]\n     *\/","11158":"\/**\n     * @param Series[] $rows\n     * @param string[] $columns\n     *\/","11159":"\/**\n     * @param array<int, array<int|string,mixed>> $rows\n     * @param array<string|int> $columns\n     *\/","11160":"\/**\n     * @param array<int, array<mixed>> $records\n     *\/","11161":"\/**\n     * @return array<array<string, mixed>>\n     *\/","11162":"\/**\n     * @param int|string $index\n     *\/","11164":"\/**\n     * @return Row[]\n     *\/","11165":"\/**\n     * @return array<scalar|null>\n     *\/","11166":"\/**\n     * @return ArrayIterator<int, Row>\n     *\/","11168":"\/**\n     * @return DataFrames<DataFrame>\n     *\/","11169":"\/**\n     * @return array<string, array<scalar|null>>\n     *\/","11170":"\/**\n     * @return array<string, scalar[]>\n     *\/","11175":"\/**\n     * @param Closure(Row):bool $closure\n     *\/","11176":"\/**\n * @implements IteratorAggregate<DataFrame>\n *\/","11177":"\/**\n     * @param DataFrame[] $dataFrames\n     *\/","11178":"\/**\n     * @return ArrayIterator<array-key, DataFrame>\n     *\/","11179":"\/**\n     * @return array<array-key, array<array<string, mixed>>>\n     *\/","11180":"\/**\n     * @param Closure(Row $row): string $hasher\n     *\/","11181":"\/**\n * @implements IteratorAggregate<string, scalar|null>\n * @implements ArrayAccess<string, scalar|null>\n *\/","11182":"\/**\n     * @param array<string, scalar|null> $map\n     *\/","11183":"\/**\n     * @return scalar|null\n     *\/","11184":"\/**\n     * @return ArrayIterator<string,mixed>\n     *\/","11185":"\/**\n     * @return array<string, scalar|null>\n     *\/","11186":"\/**\n     * @param string[] $resolvedNames\n     *\/","11191":"\/**\n     * @param array<int, scalar|null> $values\n     *\/","11192":"\/**\n     * @return array<int, scalar|null>\n     *\/","11195":"\/**\n * PHPBench Container.\n *\n * This is a simple, extendable, closure based dependency injection container.\n *\/","11196":"\/**\n     * @var array<string,Callable>\n     *\/","11197":"\/**\n     * @var array<string, mixed>\n     *\/","11198":"\/**\n     * @var array<string,array<string,mixed>>\n     *\/","11200":"\/**\n     * @var array<string>\n     *\/","11201":"\/**\n     * @param array<string,mixed> $config\n     * @param array<string> $extensionClasses\n     *\/","11202":"\/**\n     * Configure the container. This method will call the `configure()` method\n     * on each extension. Extensions must use this opportunity to register their\n     * services and define any default config.\n     *\n     * This method must be called before `build()`.\n     *\/","11203":"\/**\n     * Instantiate and return the service with the given ID.\n     * Note that this method will return the same instance on subsequent calls.\n     *\n     * @param string $serviceId\n     *\/","11204":"\/**\n     * @param string $serviceId\n     *\/","11205":"\/**\n     * Set a service instance.\n     *\n     * @param mixed $instance\n     *\/","11206":"\/**\n     * Return services IDs for the given tag.\n     *\n     * @return array<string, array<string, mixed>>\n     *\/","11207":"\/**\n     * Register a service with the given ID and instantiator.\n     *\n     * The instantiator is a closure which accepts an instance of this container and\n     * returns a new instance of the service class.\n     *\n     * @param array<string, array<string, mixed>> $tags\n     *\/","11208":"\/**\n     * Set the value of the parameter with the given name.\n     *\n     * @param mixed $value\n     *\/","11209":"\/**\n     * @param array<mixed> $values\n     *\/","11210":"\/**\n     * Return the parameter with the given name.\n     *\n     * @param string $name\n     *\n     * @throws \\InvalidArgumentException\n     *\n     * @return mixed\n     *\/","11211":"\/**\n     * @return array<mixed,mixed>\n     *\/","11212":"\/**\n     * Return true if the named parameter exists.\n     *\n     * @param string $name\n     *\n     * @return bool\n     *\/","11213":"\/**\n     * @return class-string[]\n     *\/","11214":"\/**\n     * Register services with the container.\n     *\n     * @param Container $container\n     *\/","11215":"\/**\n     * Configure the parameters which can be accessed by the extension.\n     *\/","11216":"\/**\n     * @param class-string[] $extensions\n     *\/","11218":"\/**\n     * @param string[] $types\n     *\n     * @return string[]\n     *\/","11219":"\/**\n     * @param array<string, string> $typeToRegistryMap\n     *\/","11220":"\/**\n     * @return Generator<string,string>\n     *\/","11221":"\/**\n     * @param Registry<RegistrableInterface> $registry\n     *\n     * @return Generator<string, string>\n     *\/","11222":"\/**\n * Wrapper for the \\DOMDocument class.\n *\/","11223":"\/**\n     * @var XPath|null\n     *\/","11224":"\/**\n     * @param string $version\n     * @param string $encoding\n     *\/","11225":"\/**\n     * Create and return a root DOM element.\n     *\n     * @param string $name\n     *\n     *\/","11226":"\/**\n     * Return the XPath object bound to this document.\n     *\n     *\/","11227":"\/**\n     * @return DOMNodeList<DOMNode>\n     *\/","11229":"\/**\n     * @return mixed\n     *\/","11230":"\/**\n     * Return a formatted string representation of the document.\n     *\n     *\/","11231":"\/**\n * Wrapper for the \\DOMElement class.\n *\/","11232":"\/**\n     * Create and append a text-node with the given name and value.\n     *\/","11233":"\/**\n     * Create and append an element with the given name and optionally given value.\n     *\n     * Note: The value will not be escaped. Use DOMDocument::createTextNode() to create a text node with escaping support.\n     *\/","11236":"\/**\n     * Dump the current node\n     *\/","11237":"\/**\n * Wrapper for the \\DOMXPath class.\n *\/","11238":"\/**\n     * {@inheritdoc}\n     *\n     * @param mixed $contextnode\n     * @param bool $registerNodeNS\n     *\/","11239":"\/**\n     * @param bool $registerNodeNS\n     * @param mixed $contextnode\n     *\n     * @return DOMNodeList<DOMNode>\n     *\/","11240":"\/**\n     * Execute the given xpath method and cactch any errors.\n     *\n     * @param mixed $contextEl\n     *\n     * @return mixed\n     *\/","11241":"\/**\n     * Perform an xpath query on this document, optionally with\n     * the given context node.\n     *\n     * If this interface is applied to an Element, then the element\n     * should be used as the context if no context is given.\n     *\n     * @param string   $query\n     *\n     * @return DOMNodeList<DOMNode>\n     *\/","11242":"\/**\n     * As with XPathAware::query but return a single node or NULL if no node was found.\n     *\n     * @param string   $query\n     *\n     * @return Element|null\n     *\/","11243":"\/**\n     * Evaluate an XPath expression on this document, optionally\n     * with the given context node.\n     *\n     * If this interface is applied to an Element, then the element\n     * should be used as the context if no context is given.\n     *\n     * @param string   $expression\n     *\n     * @return mixed\n     *\/","11244":"\/**\n * Represents information about the VCS system used by the current working\n * directory.\n *\n * @immutable\n *\n * @implements ArrayAccess<string, mixed>\n * @implements IteratorAggregate<string, mixed>\n *\/","11245":"\/** @var array<string, scalar|null>  *\/","11246":"\/**\n     * @param array<string, mixed> $information\n     *\/","11247":"\/**\n     * Return the name of this information, it should represent the domain of\n     * the infomration, e.g. \"vcs\", \"uname\".\n     *\n     * If an information is mutually exclusive then it should use a standard\n     * name representing the category of the thing (e.g. \"vcs\"). This allows\n     * reports and such things to reference it reliably.\n     *\/","11252":"\/**\n     * @return ArrayIterator<string, scalar|null>\n     *\/","11254":"\/**\n     * @param array<string, mixed> $information\n     *\n     * @return array<string, scalar|null>\n     *\/","11255":"\/**\n * Implementors of this interface provide information about\n * a specific feature of the environment, e.g. VCS, OS, etc.\n *\/","11256":"\/**\n     * Return true if the instance detects a VCS repository\n     * in the current CWD.\n     *\/","11257":"\/**\n     * Return information about the detected VCS repository.\n     *\/","11259":"\/**\n * Return information about the git environment.\n *\/","11260":"\/**\n     * @param string $exeName\n     *\/","11263":"\/**\n * Return PHP information.\n *\/","11265":"\/**\n * Runs basic micro-benchmarks via. the BaselineManager to determine some baseline\n * characteristics of the underlying system under test.\n *\/","11266":"\/**\n     * @param string[] $enabled\n     *\/","11271":"\/**\n * Return the OS information (windows and unix).\n *\/","11272":"\/**\n * Return the load average for unix systems (1, 5, and 15 minute intervals).\n *\/","11273":"\/**\n * Supplies information from the current environment.\n *\n * Indidual \"information\" is provided by \"providers\", which are responsible for\n * saying if they can provide any information in the current environment, for\n * example: if there is a .git directory, then the GIT provider will return\n * some information.\n *\/","11274":"\/**\n     * @var ProviderInterface[]\n     *\/","11275":"\/**\n     * Add a provider.\n     *\n     *\/","11276":"\/**\n     * Return information from the current environment.\n     *\n     * @return Information[]\n     *\/","11277":"\/**\n * VCS specific information. All VCS providers should\n * return this object to ensure they all provide the same\n * information.\n *\/","11278":"\/**\n     * @param string $branch\n     * @param ?string $version\n     *\/","11286":"\/**\n     * @throws ExecutionError\n     *\/","11287":"\/**\n * This executor for testing purposes. It always returns constant times, it\n * does not actually execute any benchmarking.\n *\/","11291":"\/**\n     * @return object\n     *\/","11297":"\/**\n     * @var array<ExecutionContext>\n     *\/","11302":"\/**\n     * @param array<string> $methods\n     *\/","11303":"\/**\n     * @param ParameterSet|array<string,mixed>|null $parameters The type array is deprecated and will be removed in 2.0\n     * @param string[] $beforeMethods\n     * @param string[] $afterMethods\n     *\/","11304":"\/**\n     * @deprecated Use getParameterSet will be removed in PHPBench 2.0\n     *\n     * @return parameters\n     *\/","11307":"\/**\n * @implements IteratorAggregate<int, ResultInterface>\n *\/","11308":"\/**\n     * @var array<int,ResultInterface>\n     *\/","11309":"\/**\n     * @return ArrayIterator<int,ResultInterface>\n     *\/","11311":"\/**\n     * This method should throw an exception if the executor cannot be used in\n     * the current environment.\n     *\/","11313":"\/**\n     * @param class-string $benchmarkClass\n     *\/","11317":"\/**\n     * @param Node[] $nodes\n     *\/","11318":"\/**\n     * @return Node[]\n     *\/","11321":"\/**\n     * @return list<Node>\n     *\/","11322":"\/**\n     *\/","11338":"\/**\n     * @return float|integer\n     *\/","11340":"\/**\n         * @var Node[]\n         *\/","11348":"\/**\n * @template T\n *\/","11349":"\/**\n     * @return array<class-string, string|Closure(T):string>\n     *\/","11350":"\/**\n     * @template T of Node\n     *\n     * @param class-string<T> $expectedType\n     * @param parameters $params\n     *\n     * @return T\n     *\/","11351":"\/**\n     * @param parameters $params\n     *\/","11358":"\/**\n * @deprecated Will be removed in PHPBench 2.0. For use in reports use the ExpressionBridge.\n *\/","11360":"\/**\n     * @return scalar|scalar[]\n     *\n     * @param parameters $params\n     *\/","11361":"\/**\n     * Render expressions in a string delimtied by `{{` and `}}`\n     *\n     * @param parameters $params\n     *\/","11362":"\/**\n     * @var array<string,callable>\n     *\/","11363":"\/**\n     * @param array<string, callable> $functionMap\n     *\/","11365":"\/**\n     * @param mixed[] $args\n     *\/","11366":"\/**\n     * @var array<string, Node>\n     *\/","11367":"\/**\n     * @param string[] $unitNames\n     *\/","11370":"\/**\n        * @param parameters $params\n     *\/","11371":"\/**\n     * @return scalar[]\n     *\/","11372":"\/**\n     * @return int|string\n     *\n     * @param parameters $params\n     *\/","11375":"\/**\n     * @param int|float $leftValue\n     * @param int|float $rightValue\n     *\n     * @return int|float\n     *\/","11377":"\/**\n     * @param string|int|float $leftValue\n     * @param string|int|float $rightValue\n     *\/","11379":"\/**\n     * @param parameters $params\n     *\n     * @return mixed\n     *\/","11382":"\/**\n     * @return array<Node>\n     *\/","11390":"\/**\n     * Return time in microseconds\n     *\/","11391":"\/**\n     * Return memory in bytes\n     *\/","11393":"\/**\n     * @return mixed\n     *\n     * @param parameters $params\n     *\/","11394":"\/**\n     * @param NodeEvaluator[] $evaluators\n     *\/","11403":"\/**\n     * @param ColorMap<Node> $colorMap\n     *\/","11408":"\/**\n     * @param NodePrinter[] $printers\n     *\/","11410":"\/**\n * @template T of Parselet\n *\/","11411":"\/**\n     * @var array<string,T>\n     *\/","11412":"\/**\n     * @param T[] $parselets\n     *\/","11413":"\/**\n     * @param PrefixParselet[] $parselets\n     *\n     * @return self<PrefixParselet>\n     *\/","11414":"\/**\n     * @param InfixParselet[] $parselets\n     *\n     * @return self<InfixParselet>\n     *\/","11415":"\/**\n     * @param SuffixParselet[] $parselets\n     *\n     * @return self<SuffixParselet>\n     *\/","11416":"\/**\n     * @return T\n     *\/","11417":"\/**\n     * @return T|null\n     *\/","11418":"\/**\n     * @param Parselets<PrefixParselet> $prefixParselets\n     * @param Parselets<InfixParselet> $infixParselets\n     * @param Parselets<SuffixParselet> $suffixParselets\n     *\/","11420":"\/**\n * Returns the bare, undecorated PHP values of the _given_ node if applicable.\n *\/","11422":"\/**\n     * @param array<class-string<Node>> $nodeClasses\n     * @param parameters $params\n     *\/","11424":"\/**\n * @template T\n *\n * @implements ColorMap<T>\n *\/","11425":"\/**\n     * @param array<class-string<T>, string|Closure(T):string> $map\n     *\/","11427":"\/**\n * @implements ColorMap<Node>\n *\/","11428":"\/**\n * Colors based on https:\/\/github.com\/altercation\/solarized\n *\n * @implements ColorMap<Node>\n *\/","11429":"\/**\n     * @var Gradient|null\n     *\/","11430":"\/**\n * @deprecated to be removed in 2.0\n *\/","11436":"\/**\n * @implements IteratorAggregate<int, Token>\n *\/","11437":"\/**\n     * @param Token[] $tokens\n     *\/","11438":"\/**\n     * @return Token[]\n     *\/","11439":"\/**\n     * @return ArrayIterator<int,Token>\n     *\/","11440":"\/**\n     * Return the current token and move the position ahead.\n     *\/","11445":"\/**\n     * This configuration has been removed as it did not do anything. If this\n     * setting is given it will be ignored, and in 2.0 an exception will be\n     * raised used.\n     *\/","11448":"\/**\n     * @var Filesystem\n     *\/","11450":"\/**\n     * @var RunnerHandler\n     *\/","11451":"\/**\n     * @var OutputDirHandler\n     *\/","11452":"\/**\n     * @var XDebugUtil\n     *\/","11484":"\/**\n     * @var TemplateExecutor\n     *\/","11489":"\/**\n     * @var string|false\n     *\/","11491":"\/**\n     * @param string|false     $xdebugVersion\n     *\/","11492":"\/**\n     * @param string $extension\n     *\/","11493":"\/**\n * Decodes JSON to an array.\n *\n * Accepts non-strict \"JSON\":\n *\n *     - {this: [\"is\": {where: \"sparta\"}]} # quoteless keys are allowed\n *     - this: [\"is\": {where: \"sparta\"}]   # enclosing braces can be omitted\n *\n * Lints the JSON using the JsonParser.\n *\/","11494":"\/**\n     * Normalize, parse and decode the given JSON(ish) encoded string into\n     * an array.\n     *\n     *\/","11495":"\/**\n     * Allow \"non-strict\" JSON - i.e. if no quotes are provided then try and\n     * add them.\n     *\/","11496":"\/**\n     * @param mixed $level\n     * @param string $message\n     * @param mixed[] $context\n     *\/","11497":"\/**\n     * System is unusable.\n     *\/","11498":"\/**\n     * Action must be taken immediately.\n     *\n     * Example: Entire website down, database unavailable, etc. This should\n     * trigger the SMS alerts and wake you up.\n     *\/","11499":"\/**\n     * Critical conditions.\n     *\n     * Example: Application component unavailable, unexpected exception.\n     *\/","11500":"\/**\n     * Runtime errors that do not require immediate action but should typically\n     * be logged and monitored.\n     *\/","11501":"\/**\n     * Exceptional occurrences that are not errors.\n     *\n     * Example: Use of deprecated APIs, poor use of an API, undesirable things\n     * that are not necessarily wrong.\n     *\/","11502":"\/**\n     * Normal but significant events.\n     *\/","11503":"\/**\n     * Interesting events.\n     *\n     * Example: User logs in, SQL logs.\n     *\/","11504":"\/**\n     * Detailed debug information.\n     *\/","11505":"\/**\n * Represents a population of samples.\n *\n * Lazily Provides summary statistics, also traversable.\n *\n * @implements IteratorAggregate<string, float|int>\n * @implements ArrayAccess<string, float|int>\n *\n * @phpstan-type Stats array{min: float|int, max: float|int, sum: float|int, stdev: float|int, mean: float|int, mode: float|int, variance: float|int, rstdev: float|int }\n * @phpstan-type Closures array{min: callable():(float|int), max: callable():(float|int), sum: callable():(float|int), stdev: callable():(float|int), mean: callable():(float|int), mode: callable():(float|int), variance: callable():(float|int), rstdev: callable():(float|int) }\n *\/","11506":"\/** @var Closures *\/","11507":"\/**\n     * @param array<float|int> $samples\n     * @param array{min?: float|int, max?: float|int, sum?: float|int, stdev?: float|int, mean?: float|int, mode?: float|int, variance?: float|int, rstdev?: float|int } $stats\n     *\/","11508":"\/**\n     * @return float|int\n     *\/","11516":"\/**\n     * @return ArrayIterator<string, float|int>\n     *\/","11517":"\/**\n     * @return Stats\n     *\/","11518":"\/**\n     * @param key-of<Closures> $name\n     *\/","11520":"\/**\n     * {@inheritdoc}\n     *\n     * @param key-of<Closures> $offset\n     *\/","11523":"\/**\n * Define classes for (uni\/multi)-variate kernel density estimation.\n *\n * Currently, only Gaussian kernels are implemented.\n *\n * Original Python version by: Robert Kern\n *\n * Date: 2004-08-09\n *\n * Modified: 2005-02-10 by Robert Kern.\n *             Contributed to Scipy\n *           2005-10-07 by Robert Kern.\n *             Some fixes to match the new scipy_core\n *\n * Copyright 2004-2005 by Enthought, Inc.\n * Copyright 2003-2013 SciPy Developers.\n *   All rights reserved.\n *\/","11524":"\/**\n     * @var float\n     *\/","11526":"\/**\n     * Representation of a kernel-density estimate using Gaussian kernels.\n     *\n     * Kernel density estimation is a way to estimate the probability density\n     * function (PDF) of a random variable in a non-parametric way.\n     *\n     * `gaussian_kde` works for both uni-variate and multi-variate data.   It\n     * includes automatic bandwidth determination.  The estimation works best for\n     * a unimodal distribution; bimodal or multi-modal distributions tend to be\n     * oversmoothed.\n     *\n     * Note:\n     *\n     *   Bandwidth selection strongly influences the estimate obtained from the KDE\n     *   (much more so than the actual shape of the kernel).  Bandwidth selection\n     *   can be done by a \"rule of thumb\", by cross-validation, by \"plug-in\n     *   methods\" or by other means; see [3]_, [4]_ for reviews.  `gaussian_kde`\n     *   uses a rule of thumb, the default is Scott's Rule.\n     *   Scott's Rule [1]_, implemented as `scotts_factor`, is::\n     *       n**(-1.\/(d+4)),\n     *   with ``n`` the number of data points and ``d`` the number of dimensions.\n     *   Silverman's Rule [2]_, implemented as `silverman_factor`, is::\n     *       (n * (d + 2) \/ 4.)**(-1. \/ (d + 4)).\n     *   Good general descriptions of kernel density estimation can be found in [1]_\n     *   and [2]_, the mathematics for this multi-dimensional implementation can be\n     *   found in [1]_.\n     *\n     * References\n     *\n     *   .. [1] D.W. Scott, \"Multivariate Density Estimation: Theory, Practice, and\n     *          Visualization\", John Wiley & Sons, New York, Chicester, 1992.\n     *   .. [2] B.W. Silverman, \"Density Estimation for Statistics and Data\n     *          Analysis\", Vol. 26, Monographs on Statistics and Applied Probability,\n     *          Chapman and Hall, London, 1986.\n     *   .. [3] B.A. Turlach, \"Bandwidth Selection in Kernel Density Estimation: A\n     *          Review\", CORE and Institut de Statistique, Vol. 19, pp. 1-33, 1993.\n     *   .. [4] D.M. Bashtannyk and R.J. Hyndman, \"Bandwidth selection for kernel\n     *          conditional density estimation\", Computational Statistics & Data\n     *          Analysis, Vol. 36, pp. 279-298, 2001.\n     *\n     * @param array<float> $dataset Array of univariate data points.\n     * @param string|'scott'|'silverman'|float|null $bwMethod\n     *\/","11527":"\/**\n     * Evaluate the estimated pdf on a set of points.\n     *\n     * @param array<float> $points 1-D array of points on to which we will map the kde\n     *\n     * @return array<float>\n     *\/","11528":"\/**\n     * Compute the estimator bandwidth with given method.\n     *\n     * The new bandwidth calculated after a call to `setBandwidth` is used\n     * for subsequent evaluations of the estimated density.\n     *\n     * @param string|'scott'|'silverman'|float|null $bwMethod\n     *\/","11529":"\/**\n     * Computes the covariance matrix for each Gaussian kernel using\n     * coVarianceFactor().\n     *\/","11530":"\/**\n * Static class containing functions related to statistics.\n *\/","11531":"\/**\n     * Return the standard deviation of a given population.\n     *\n     * @param array<int|float> $values\n     *\/","11532":"\/**\n     * Return the variance for a given population.\n     *\n     * @param array<int|float> $values\n     *\n     * @return int|float\n     *\/","11533":"\/**\n     * Return the mean (average) value of the given values.\n     *\n     * @param array<int|float> $values\n     *\n     * @return int|float\n     *\/","11534":"\/**\n     * Return the mode using the kernel density estimator using the normal\n     * distribution.\n     *\n     * The mode is the point in the kernel density estimate with the highest\n     * frequency, i.e. the time which correlates with the highest peak.\n     *\n     * If there are two or more modes (i.e. bimodal, trimodal, etc) then we\n     * could take the average of these modes.\n     *\n     * NOTE: If the kde estimate of the population is multi-modal (it has two\n     * points with exactly the same value) then the mean mode is returned. This\n     * is potentially misleading, but When benchmarking this should be a very\n     * rare occurance.\n     *\n     * @param array<int|float> $population\n     *\/","11535":"\/**\n     * Return an array populated with $num numbers from $min to $max.\n     *\n     *\n     * @return float[]\n     *\/","11536":"\/**\n     * Generate a histogram.\n     *\n     * Note this is not a great function, and should not be relied upon\n     * for serious use.\n     *\n     * For a better implementation copy:\n     *   http:\/\/docs.scipy.org\/doc\/numpy-1.10.1\/reference\/generated\/numpy.histogram.html\n     *\n     * @param array<int|float> $values\n     *\n     * @return array<string|int, int>\n     *\/","11537":"\/**\n     * @param (int|float)[] $values\n     *\/","11538":"\/**\n * Benchmark metadata class.\n *\n * @implements IteratorAggregate<Subject>\n *\/","11539":"\/** @var Subject[] *\/","11540":"\/**\n     * Create and add a subject.\n     *\n     *\/","11541":"\/**\n     * Get the subject metadata instances for this benchmark metadata.\n     *\n     * @return array<Subject>\n     *\/","11543":"\/**\n     * Return the suite to which this benchmark belongs.\n     *\/","11544":"\/**\n     * @return ArrayIterator<array-key, Subject>\n     *\/","11545":"\/**\n     * @param string[] $subjectPatterns\n     * @param string[] $variantPatterns\n     *\/","11546":"\/**\n * Represents an Error. Typically this is\n * a serializable representation of an Exception.\n *\/","11547":"\/**\n     * @param string $message\n     * @param string $class\n     * @param int $code\n     * @param string $file\n     * @param int $line\n     * @param string $trace\n     *\/","11548":"\/**\n     * @return int\n     *\/","11554":"\/**\n * Essentially this class represents a single exception (the \"top\"\n * exception) and any parent exceptions of it.\n *\n * It is also linked to the variant which encountered the error.\n *\n * @implements IteratorAggregate<Error>\n *\/","11555":"\/**\n     * @param Error[] $errors\n     *\/","11556":"\/**\n     * @return Error[]\n     *\/","11557":"\/**\n     * @return false|Error\n     *\/","11558":"\/**\n     * @return ArrayIterator<array-key, Error>\n     *\/","11560":"\/**\n * Represents the data required to execute a single iteration.\n *\/","11562":"\/**\n     * Return the Variant that this\n     * iteration belongs to.\n     *\/","11563":"\/**\n     * Return the index of this iteration.\n     *\/","11564":"\/**\n     * Add a result to the collection.\n     *\n     * Only one result per class is permitted.\n     *\n     *\/","11565":"\/**\n     * Return true if there is a result for the given class name.\n     *\n     * @param class-string<ResultInterface> $class\n     *\/","11566":"\/**\n     * Return the result of the given class, throw an exception\n     * if it does not exist.\n     *\n     * @template T of ResultInterface\n     *\n     * @param class-string<T> $class\n     *\n     * @return T\n     *\n     * @throws RuntimeException\n     *\/","11567":"\/**\n     * Return the named metric for the given result class.\n     *\n     * @param class-string<ResultInterface> $class\n     *\n     * @return float|int\n     *\n     * @throws InvalidArgumentException\n     *\/","11568":"\/**\n     * Return the named metric or the default value if the *result class* has\n     * not been set.\n     *\n     * If the metric does not exist but the class *does* exist then there is\n     * clearly a problem and we should allow an error to be thrown.\n     *\n     * @template TDefault\n     *\n     * @param class-string<ResultInterface> $class\n     * @param TDefault $default\n     *\n     * @return int|float|TDefault\n     *\/","11569":"\/**\n     * Return all results.\n     *\n     * @return array<class-string<ResultInterface>, ResultInterface>\n     *\/","11571":"\/**\n     * @param array<string,ParameterContainer> $parameters\n     *\/","11572":"\/**\n     * @deprecated use getName instead\n     *\/","11573":"\/**\n     * @return array<string,ParameterContainer>\n     *\/","11574":"\/**\n     * @param array<string, ParameterContainer> $parameterContainers\n     *\/","11575":"\/**\n     * @param array<string> $parameters\n     *\/","11576":"\/**\n     * @param array<string,mixed> $parameters\n     *\/","11577":"\/**\n     * @return array<array-key,mixed>\n     *\/","11579":"\/**\n     * @param string[] $patterns\n     *\/","11580":"\/**\n * @implements IteratorAggregate<string, ParameterSet>\n *\/","11581":"\/**\n     * @param array<string, ParameterSet> $parameterSets\n     *\/","11582":"\/**\n     * @param array<array<string>> $parameterSets\n     *\/","11583":"\/**\n     * @param array<string,array<string,mixed>> $parameterSets\n     *\/","11584":"\/**\n     * @return ArrayIterator<string, ParameterSet>\n     *\/","11586":"\/**\n     * @return array<string, array<string, mixed>>\n     *\/","11587":"\/**\n * @implements IteratorAggregate<int, ParameterSets>\n *\/","11588":"\/**\n     * @var ParameterSets[]\n     *\/","11589":"\/**\n     * @param array<array<array<string>>> $parameterSets\n     *\/","11590":"\/**\n     * @param array<int,array<string,array<string,mixed>>> $parameterSets\n     *\/","11591":"\/**\n     * @return ArrayIterator<int, ParameterSets>\n     *\/","11593":"\/**\n     * @return array<int, array<string, array<string, mixed>>>\n     *\/","11594":"\/**\n * Represents the result of a single iteration executed by an executor.\n *\/","11595":"\/**\n     * @var array<class-string<ResultInterface>, ResultInterface>\n     *\/","11596":"\/**\n     * @param ResultInterface[] $results\n     *\/","11603":"\/**\n * Marker interface for iteration results.\n *\n * Implementations should reflect a particular domain of information, e.g.\n * time, memory, xdebug..\n *\/","11604":"\/**\n     * Return a new instance based using the given array values.\n     *\n     * @param array<string,mixed> $values\n     *\/","11605":"\/**\n     * Return a key value set representing the metrics in this result.\n     *\n     * This set will be used to serialize the results, f.e. as attributes in an\n     * XML element.\n     *\n     * ```\n     * [\n     *     'stat_1' => 1234,\n     *     'stat_2' => 5678,\n     * ]\n     * ```\n     *\n     * If the key of this result is \"foo\" then the set might be serialized as:\n     *\n     * ```\n     * <iteration foo-stat-1=\"1234\" foo-stat-2=\"5678\"\/>\n     * ```\n     *\n     * @return array<string, float|int>\n     *\/","11606":"\/**\n     * Return a short key which should represent this result, f.e. `time`.\n     * This key must be unique in the set of all result classes.\n     *\/","11607":"\/**\n * Metrics calculated relative to the iteration set of the iteration to which\n * this result belongs.\n *\/","11612":"\/**\n     * Return the ZValue - the number of standard\n     * deviations away from the mean of the iteration\n     * set to which the iteration of this result belongs.\n     *\/","11613":"\/**\n     * Return the percentage deviation from the mean of the\n     * iteration set of the iteration to which this result\n     * belongs.\n     *\/","11614":"\/**\n * Represents the memory reported at the end of the benchmark script.\n *\/","11617":"\/**\n     * Return peak memory usage as gathered by\n     * `memory_get_peak_usage`.\n     *\n     * @see http:\/\/php.net\/manual\/en\/function.memory-get-peak-usage.php\n     *\/","11618":"\/**\n     * Return real memory usage at the end of the script\n     * as gathered by `memory_get_usage(true)`.\n     *\n     * @see http:\/\/php.net\/manual\/en\/function.memory-get-usage.php\n     *\/","11619":"\/**\n     * Get memory usage at the end of the script.\n     *\n     * @see http:\/\/php.net\/manual\/en\/function.memory-get-usage.php\n     *\/","11624":"\/**\n * Represents the net time taken by a single iteration (all revolutions).\n *\/","11625":"\/**\n     * Return the net-time for this iteration.\n     *\/","11626":"\/**\n     * Return the time for the given number of revolutions.\n     *\n     *\n     * @throws OutOfBoundsException If revs <= 0\n     *\n     * @return float\n     *\/","11629":"\/**\n * Subject representation.\n *\n * It represents the result rather than the details of\n * how to create that result.\n *\/","11631":"\/**\n     * @var Variant[]\n     *\/","11634":"\/**\n     * Create and add a new variant based on this subject.\n     *\n     * @param array<string,mixed> $computedStats\n     *\/","11635":"\/**\n     * @deprecated Use addVariant. To be removed in 2.0\n     *\/","11636":"\/**\n     * @return Variant[]\n     *\/","11637":"\/**\n     * Return the (containing) benchmark for this subject.\n     *\/","11641":"\/**\n     * Returns the _first_ variant that matches the given parameter set name.\n     * Note that there may be multiple variants with the same parameter set as\n     * they can also vary by the number of revs\/iterations.\n     *\/","11642":"\/**\n     * @deprecated use getVariantByParameterSetName. will be removed in 2.0\n     *\/","11643":"\/**\n     * @param string[] $variantPatterns\n     *\/","11645":"\/**\n * Represents a Suite.\n *\n * This is the base of the object graph created by the Runner.\n *\n * @implements IteratorAggregate<array-key, Benchmark>\n *\/","11646":"\/**\n     * __construct.\n     *\n     * @param Information[] $envInformations\n     * @param Benchmark[] $benchmarks\n     * @param string|null $uuid\n     *\/","11647":"\/**\n     * @return array<Benchmark>\n     *\/","11649":"\/**\n     * Create and add a benchmark.\n     *\n     *\/","11650":"\/**\n     * @return ArrayIterator<array-key, Benchmark>\n     *\/","11651":"\/**\n     * @return list<Iteration>\n     *\/","11652":"\/**\n     * @return Subject[]\n     *\/","11653":"\/**\n     * @return array<Variant>\n     *\/","11654":"\/**\n     * @return list<ErrorStack>\n     *\/","11655":"\/**\n     * @return VariantAssertionResults[]\n     *\/","11656":"\/**\n     * @param Information[] $envInformations\n     *\/","11657":"\/**\n     * @return Information[]\n     *\/","11658":"\/**\n     * The uuid uniquely identifies this suite.\n     *\n     * The uuid is determined by the storage driver, and may be empty\n     * only when dynamically generating reports on-the-fly.\n     *\n     *\/","11659":"\/**\n     * Generate a universally unique identifier.\n     *\n     * The first 7 characters are the year month and in hex, the rest is a\n     * truncated sha1 string encoding the environmental information, the\n     * microtime and the configuration path.\n     *\/","11660":"\/**\n     * @deprecated use findVariantByParameterSetName. will be removed in 2.0\n     *\/","11661":"\/**\n * @final\n *\n * @implements IteratorAggregate<array-key, Suite>\n *\/","11662":"\/**\n     * @param Suite[] $suites\n     *\/","11663":"\/**\n     * Return the suites.\n     *\n     * @return Suite[]\n     *\/","11664":"\/**\n     * Add a suite to the collection.\n     *\n     *\/","11665":"\/**\n     * Merge another collection into this one.\n     *\/","11666":"\/**\n     * @return ArrayIterator<string,Suite>\n     *\/","11668":"\/**\n * Provides summary statistics for the entires suite.\n *\n * @phpstan-type Stats array{stdev: array<int|float>, mean: array<int|float>, mode: array<int|float>, rstdev: array<int|float>, variance: array<int|float>, min: array<int|float>, max: array<int|float>, sum: array<int|float>}\n *\/","11669":"\/** @var Stats *\/","11670":"\/**\n     * @var string|null\n     *\/","11673":"\/**\n     * @return int|float\n     *\/","11680":"\/**\n * Stores Iterations and calculates the deviations and rejection\n * status for each based on the given rejection threshold.\n *\n * @implements IteratorAggregate<int, Iteration>\n * @implements ArrayAccess<int, Iteration>\n *\/","11681":"\/** @var list<Iteration> *\/","11683":"\/**\n     * @param array<string, int|float> $computedStats\n     *\/","11684":"\/**\n     * Generate $nbIterations and add them to the variant.\n     *\n     *\/","11685":"\/**\n     * Create and add a new iteration.\n     *\n     * @param array<ResultInterface> $results\n     *\/","11686":"\/**\n     * Return the iteration at the given index.\n     *\n     * @param int $index\n     *\/","11687":"\/**\n     * Add an iteration.\n     *\n     *\/","11688":"\/**\n     * @return ArrayIterator<int,Iteration>\n     *\/","11689":"\/**\n     * Return result values by class and metric name.\n     *\n     * e.g.\n     *\n     * ```\n     * $variant->getMetricValues(ComputedResult::class, 'z_value');\n     * ```\n     *\n     * @return array<int|float>\n     *\/","11690":"\/**\n     * Return the average metric values by revolution.\n     *\n     * @return mixed[]\n     *\/","11691":"\/**\n     * Calculate and set the deviation from the mean time for each iteration. If\n     * the deviation is greater than the rejection threshold, then mark the iteration as\n     * rejected.\n     *\/","11692":"\/**\n     * Return the number of rejected iterations.\n     *\n     *\/","11693":"\/**\n     * Return all rejected iterations.\n     *\n     * @return Iteration[]\n     *\/","11694":"\/**\n     * Return statistics about this iteration collection.\n     *\n     * See self::$stats.\n     *\n     * TODO: Rename to getDistribution\n     *\n     *\/","11695":"\/**\n     * Return true if the collection has been computed (i.e. stats have been s\n     * set and rejects identified).\n     *\/","11696":"\/**\n     * Return the parameter set.\n     *\/","11697":"\/**\n     * Return the subject metadata.\n     *\/","11698":"\/**\n     * Return true if any of the iterations in this set encountered\n     * an error.\n     *\/","11699":"\/**\n     * Should be called when rebuiling the object graph.\n     *\/","11700":"\/**\n     * Create an error stack from an Exception.\n     *\n     * Should be called when an Exception is encountered during\n     * the execution of any of the iteration processes.\n     *\n     * After an exception is encountered the results from this iteration\n     * set are invalid.\n     *\n     *\/","11701":"\/**\n     * Create and set the error stack from a list of Error instances.\n     *\n     * @param Error[] $errors\n     *\/","11702":"\/**\n     * Return the number of revolutions for this variant.\n     *\/","11703":"\/**\n     * Return the number of warmup revolutions.\n     *\/","11704":"\/**\n     * Return all the iterations.\n     *\n     * @return Iteration[]\n     *\/","11705":"\/**\n     * Return number of iterations.\n     *\/","11707":"\/**\n * @deprecated\n * NOTE: This class is copied as the class was \"moved\" from a dedicated package\n * to be part of the symfony\/filesystem package which is not available in the\n * current version constraints.\n *\n * Contains utility methods for handling path strings.\n *\n * The methods in this class are able to deal with both UNIX and Windows paths\n * with both forward and backward slashes. All methods return normalized parts\n * containing only forward slashes and no excess \".\" and \"..\" segments.\n *\n * @author Bernhard Schussek <bschussek@gmail.com>\n * @author Thomas Schulz <mail@king2500.net>\n * @author Th\u00e9o Fidry <theo.fidry@gmail.com>\n *\/","11708":"\/**\n     * The number of buffer entries that triggers a cleanup operation.\n     *\/","11709":"\/**\n     * The buffer size after the cleanup operation.\n     *\/","11710":"\/**\n     * Buffers input\/output of {@link canonicalize()}.\n     *\n     * @var array<string, string>\n     *\/","11711":"\/**\n     * Canonicalizes the given path.\n     *\n     * During normalization, all slashes are replaced by forward slashes (\"\/\").\n     * Furthermore, all \".\" and \"..\" segments are removed as far as possible.\n     * \"..\" segments at the beginning of relative paths are not removed.\n     *\n     * ```php\n     * echo Path::canonicalize(\"\\symfony\\puli\\..\\css\\style.css\");\n     * \/\/ => \/symfony\/css\/style.css\n     *\n     * echo Path::canonicalize(\"..\/css\/.\/style.css\");\n     * \/\/ => ..\/css\/style.css\n     * ```\n     *\n     * This method is able to deal with both UNIX and Windows paths.\n     *\/","11712":"\/**\n     * Normalizes the given path.\n     *\n     * During normalization, all slashes are replaced by forward slashes (\"\/\").\n     * Contrary to {@link canonicalize()}, this method does not remove invalid\n     * or dot path segments. Consequently, it is much more efficient and should\n     * be used whenever the given path is known to be a valid, absolute system\n     * path.\n     *\n     * This method is able to deal with both UNIX and Windows paths.\n     *\/","11713":"\/**\n     * Returns the directory part of the path.\n     *\n     * This method is similar to PHP's dirname(), but handles various cases\n     * where dirname() returns a weird result:\n     *\n     *  - dirname() does not accept backslashes on UNIX\n     *  - dirname(\"C:\/symfony\") returns \"C:\", not \"C:\/\"\n     *  - dirname(\"C:\/\") returns \".\", not \"C:\/\"\n     *  - dirname(\"C:\") returns \".\", not \"C:\/\"\n     *  - dirname(\"symfony\") returns \".\", not \"\"\n     *  - dirname() does not canonicalize the result\n     *\n     * This method fixes these shortcomings and behaves like dirname()\n     * otherwise.\n     *\n     * The result is a canonical path.\n     *\n     * @return string The canonical directory part. Returns the root directory\n     *                if the root directory is passed. Returns an empty string\n     *                if a relative path is passed that contains no slashes.\n     *                Returns an empty string if an empty string is passed.\n     *\/","11714":"\/**\n     * Returns canonical path of the user's home directory.\n     *\n     * Supported operating systems:\n     *\n     *  - UNIX\n     *  - Windows8 and upper\n     *\n     * If your operating system or environment isn't supported, an exception is thrown.\n     *\n     * The result is a canonical path.\n     *\n     * @throws RuntimeException If your operating system or environment isn't supported\n     *\/","11715":"\/**\n     * Returns the root directory of a path.\n     *\n     * The result is a canonical path.\n     *\n     * @return string The canonical root directory. Returns an empty string if\n     *                the given path is relative or empty.\n     *\/","11716":"\/**\n     * Returns the file name without the extension from a file path.\n     *\n     * @param string|null $extension if specified, only that extension is cut\n     *                               off (may contain leading dot)\n     *\/","11717":"\/**\n     * Returns the extension from a file path (without leading dot).\n     *\n     * @param bool $forceLowerCase forces the extension to be lower-case\n     *\/","11718":"\/**\n     * Returns whether the path has an (or the specified) extension.\n     *\n     * @param string               $path       the path string\n     * @param string|string[]|null $extensions if null or not provided, checks if\n     *                                         an extension exists, otherwise\n     *                                         checks for the specified extension\n     *                                         or array of extensions (with or\n     *                                         without leading dot)\n     * @param bool                 $ignoreCase whether to ignore case-sensitivity\n     *\/","11719":"\/**\n     * Changes the extension of a path string.\n     *\n     * @param string $path      The path string with filename.ext to change.\n     * @param string $extension new extension (with or without leading dot)\n     *\n     * @return string the path string with new file extension\n     *\/","11720":"\/**\n     * Turns a relative path into an absolute path in canonical form.\n     *\n     * Usually, the relative path is appended to the given base path. Dot\n     * segments (\".\" and \"..\") are removed\/collapsed and all slashes turned\n     * into forward slashes.\n     *\n     * ```php\n     * echo Path::makeAbsolute(\"..\/style.css\", \"\/symfony\/puli\/css\");\n     * \/\/ => \/symfony\/puli\/style.css\n     * ```\n     *\n     * If an absolute path is passed, that path is returned unless its root\n     * directory is different than the one of the base path. In that case, an\n     * exception is thrown.\n     *\n     * ```php\n     * Path::makeAbsolute(\"\/style.css\", \"\/symfony\/puli\/css\");\n     * \/\/ => \/style.css\n     *\n     * Path::makeAbsolute(\"C:\/style.css\", \"C:\/symfony\/puli\/css\");\n     * \/\/ => C:\/style.css\n     *\n     * Path::makeAbsolute(\"C:\/style.css\", \"\/symfony\/puli\/css\");\n     * \/\/ InvalidArgumentException\n     * ```\n     *\n     * If the base path is not an absolute path, an exception is thrown.\n     *\n     * The result is a canonical path.\n     *\n     * @param string $basePath an absolute base path\n     *\n     * @throws InvalidArgumentException if the base path is not absolute or if\n     *                                  the given path is an absolute path with\n     *                                  a different root than the base path\n     *\/","11721":"\/**\n     * Turns a path into a relative path.\n     *\n     * The relative path is created relative to the given base path:\n     *\n     * ```php\n     * echo Path::makeRelative(\"\/symfony\/style.css\", \"\/symfony\/puli\");\n     * \/\/ => ..\/style.css\n     * ```\n     *\n     * If a relative path is passed and the base path is absolute, the relative\n     * path is returned unchanged:\n     *\n     * ```php\n     * Path::makeRelative(\"style.css\", \"\/symfony\/puli\/css\");\n     * \/\/ => style.css\n     * ```\n     *\n     * If both paths are relative, the relative path is created with the\n     * assumption that both paths are relative to the same directory:\n     *\n     * ```php\n     * Path::makeRelative(\"style.css\", \"symfony\/puli\/css\");\n     * \/\/ => ..\/..\/..\/style.css\n     * ```\n     *\n     * If both paths are absolute, their root directory must be the same,\n     * otherwise an exception is thrown:\n     *\n     * ```php\n     * Path::makeRelative(\"C:\/symfony\/style.css\", \"\/symfony\/puli\");\n     * \/\/ InvalidArgumentException\n     * ```\n     *\n     * If the passed path is absolute, but the base path is not, an exception\n     * is thrown as well:\n     *\n     * ```php\n     * Path::makeRelative(\"\/symfony\/style.css\", \"symfony\/puli\");\n     * \/\/ InvalidArgumentException\n     * ```\n     *\n     * If the base path is not an absolute path, an exception is thrown.\n     *\n     * The result is a canonical path.\n     *\n     * @throws InvalidArgumentException if the base path is not absolute or if\n     *                                  the given path has a different root\n     *                                  than the base path\n     *\/","11722":"\/**\n     * Returns whether the given path is on the local filesystem.\n     *\/","11723":"\/**\n     * Returns the longest common base path in canonical form of a set of paths or\n     * `null` if the paths are on different Windows partitions.\n     *\n     * Dot segments (\".\" and \"..\") are removed\/collapsed and all slashes turned\n     * into forward slashes.\n     *\n     * ```php\n     * $basePath = Path::getLongestCommonBasePath(\n     *     '\/symfony\/css\/style.css',\n     *     '\/symfony\/css\/..'\n     * );\n     * \/\/ => \/symfony\n     * ```\n     *\n     * The root is returned if no common base path can be found:\n     *\n     * ```php\n     * $basePath = Path::getLongestCommonBasePath(\n     *     '\/symfony\/css\/style.css',\n     *     '\/puli\/css\/..'\n     * );\n     * \/\/ => \/\n     * ```\n     *\n     * If the paths are located on different Windows partitions, `null` is\n     * returned.\n     *\n     * ```php\n     * $basePath = Path::getLongestCommonBasePath(\n     *     'C:\/symfony\/css\/style.css',\n     *     'D:\/symfony\/css\/..'\n     * );\n     * \/\/ => null\n     * ```\n     *\/","11724":"\/**\n     * Joins two or more path strings into a canonical path.\n     *\/","11725":"\/**\n     * Returns whether a path is a base path of another path.\n     *\n     * Dot segments (\".\" and \"..\") are removed\/collapsed and all slashes turned\n     * into forward slashes.\n     *\n     * ```php\n     * Path::isBasePath('\/symfony', '\/symfony\/css');\n     * \/\/ => true\n     *\n     * Path::isBasePath('\/symfony', '\/symfony');\n     * \/\/ => true\n     *\n     * Path::isBasePath('\/symfony', '\/symfony\/..');\n     * \/\/ => false\n     *\n     * Path::isBasePath('\/symfony', '\/puli');\n     * \/\/ => false\n     * ```\n     *\/","11726":"\/**\n     * @return non-empty-string[]\n     *\/","11727":"\/**\n     * Splits a canonical path into its root directory and the remainder.\n     *\n     * If the path has no root directory, an empty root directory will be\n     * returned.\n     *\n     * If the root directory is a Windows style partition, the resulting root\n     * will always contain a trailing slash.\n     *\n     * list ($root, $path) = Path::split(\"C:\/symfony\")\n     * \/\/ => [\"C:\/\", \"symfony\"]\n     *\n     * list ($root, $path) = Path::split(\"C:\")\n     * \/\/ => [\"C:\/\", \"\"]\n     *\n     * @return array{string, string} an array with the root directory and the remaining relative path\n     *\/","11729":"\/**\n     * Log the end of a benchmark.\n     *\n     * @return void\n     *\/","11730":"\/**\n     * Log the start of a benchmark.\n     *\n     *  @return void\n     *\/","11731":"\/**\n     * Log the end of a benchmarking subject.\n     *\n     *  @return void\n     *\/","11732":"\/**\n     * Log the end of a benchmarking subject.\n     *\n     * @return void\n     *\/","11733":"\/**\n     * Log the end of an an iteration run.\n     *\n     * Errors should be checked using Variant->hasException()\n     *\n     * @return void\n     *\/","11734":"\/**\n     * Log the start of an iteration run.\n     *\n     * @return void\n     *\/","11735":"\/**\n     * Log the end of an iteration.\n     *\n     * @return void\n     *\/","11736":"\/**\n     * Log the start of an iteration.\n     *\n     * @return void\n     *\/","11737":"\/**\n     * Log the number of retries to be made.\n     *\n     * @return void\n     *\/","11738":"\/**\n     * Called at the start of the suite run.\n     *\n     * @return void\n     *\/","11739":"\/**\n     * Called at the end of the suite run.\n     *\n     * @return void\n     *\/","11740":"\/** @var array<string, LoggerInterface> *\/","11741":"\/**\n     * @param string $name\n     *\/","11742":"\/**\n     * @param string $name\n     *\n     * @return LoggerInterface\n     *\/","11743":"\/**\n     * @var TimeUnit\n     *\/","11744":"\/**\n     * @var OutputInterface\n     *\/","11754":"\/**\n     * Number of measurements to show per row.\n     *\/","11755":"\/**\n     * Track rejected iterations.\n     *\n     * @var bool[]\n     *\/","11756":"\/**\n     * Current number of rows in the time display.\n     *\n     * @var int\n     *\/","11757":"\/**\n     * Column width.\n     *\/","11767":"\/**\n     * @param array<int, mixed> $specials\n     *\/","11789":"\/**\n     * @param array<int|null> $freqs\n     *\/","11839":"\/**\n * @template T of object\n *\/","11840":"\/**\n     * @param class-string<T> $name\n     * @param mixed[] $args\n     *\/","11842":"\/**\n * @todo make $class not nullable\n *\/","11843":"\/** @var object[] *\/","11845":"\/** @var list<string> *\/","11846":"\/** @var class-string|null *\/","11849":"\/** @var string|false *\/","11850":"\/** @var array<string, ReflectionMethod> *\/","11851":"\/**\n     * @param class-string|null $class\n     *\/","11853":"\/**\n * Contains a reflected class (the \"top\" class) and all it's ancestors.\n *\n * @implements IteratorAggregate<int,ReflectionClass>\n *\/","11854":"\/**\n     * @param list<ReflectionClass> $reflectionClasses\n     *\/","11855":"\/**\n     * Add a reflection class.\n     *\n     *\/","11856":"\/**\n     * @return ArrayObject<int,ReflectionClass>\n     *\/","11857":"\/**\n     * Return the \"top\" class.\n     *\n     * @throws InvalidArgumentException\n     *\/","11858":"\/**\n     * Return true if the class hierarchy contains the named method.\n     *\n     *\/","11859":"\/**\n     * Return true if the class hierarchy contains the named static method.\n     *\n     *\/","11860":"\/**\n     * Return true if there are no reflection classes here.\n     *\/","11865":"\/**\n     * @var ReflectionClass\n     *\/","11867":"\/**\n     * Return an array of ReflectionClass instances for the given file. The\n     * first ReflectionClass is the class contained in the given file (there\n     * may be only one) additional ReflectionClass instances are the ancestors\n     * of this first class.\n     *\/","11868":"\/**\n     * Return the parameter sets for the benchmark container in the given file.\n     *\n     * @param array<string> $paramProviders\n     *\/","11869":"\/**\n * Reflector for remote classes.\n *\/","11871":"\/**\n     * Return an array of ReflectionClass instances for the given file. The\n     * first ReflectionClass is the class contained in the given file (there\n     * may be only one) additional ReflectionClass instances are the ancestors\n     * of this first class.\n     *\n     *\/","11872":"\/**\n     * Return the parameter sets for the benchmark container in the given file.\n     *\n     * @param string[] $paramProviders\n     *\/","11873":"\/**\n     * Return the class name from a file.\n     *\n     * Taken from http:\/\/stackoverflow.com\/questions\/7153000\/get-class-name-from-file\n     *\n     * @return class-string|null\n     *\/","11874":"\/**\n     * @param array<array{name: class-string, args: mixed[]}> $attributes\n     *\n     * @return object[]\n     *\/","11875":"\/**\n * Configuration storage.\n * Throws exceptions when accessing undefined offsets.\n *\n * @extends ArrayObject<string,mixed>\n *\/","11876":"\/**\n     * All names must satisfy this regex.\n     *\/","11878":"\/**\n     * @param string $name\n     * @param array<string, mixed> $config\n     *\/","11880":"\/**\n * Registry that adds configuration capabilities to the service\n * registry class.\n *\n * TODO: Coupling configuration to the registry is convenient but the two are\n *       effectively unrelated and could be decoupled.\n *\n * ```\n * $config = $reg->getConfig('foobar');\n * ```\n *\n * @template T of object\n *\n * @extends Registry<T>\n *\/","11883":"\/**\n     * @var array<string,T|null>\n     *\/","11884":"\/**\n     * @param array<string,string> $nameToServiceIdMap\n     *\/","11885":"\/**\n     * Return the named configuration.\n     *\n     * @param string|mixed[] $name\n     *\/","11887":"\/**\n     * Set a named configuration.\n     *\n     * Note that all configurations must be associated with a named service\n     * via a configuration key equal to the configuration service type of this registry.\n     *\n     * @param array<string, mixed> $config\n     *\n     *\/","11888":"\/**\n     * Recursively merge configs (having the \"extends\" key) which extend\n     * another report.\n     *\n     *\/","11889":"\/**\n     * Process raw configuration as received from the CLI, for example:.\n     *\n     * ````\n     * {\"generator\": \"table\", \"sort\": [\"time\"]}\n     * ````\n     *\n     * Or simply the name of a pre-configured configuration to use:\n     *\n     * ````\n     * table\n     * ````\n     *\n     *\/","11890":"\/**\n     * Register a service ID with against the given name.\n     *\n     *\/","11891":"\/**\n     * Directly set a named service.\n     *\n     * @param T $object\n     *\/","11892":"\/**\n     * Return the named service, lazily creating it from the container\n     * if it has not yet been accessed.\n     *\n     *\n     * @return T\n     *\/","11894":"\/**\n     * @param array<string,Registry<object>> $registries\n     *\/","11895":"\/**\n     * @return Registry<object>\n     *\/","11896":"\/**\n * Service and configuration registry.\n *\n * Lazily instantiates tagged services which are associated with a name\n * and stores configurations which are relevant to these services.\n *\n * ```\n * $reg->getService($config['renderer']);\n * $reg->render($something, $config);\n * ```\n *\n * @template T of object\n *\/","11899":"\/**\n     * @param string $serviceType\n     * @param string $defaultService\n     *\/","11904":"\/**\n * Thrown in the case of an error in the remote script.\n *\/","11905":"\/**\n     * @param array<string, scalar|scalar[]> $config\n     *\/","11906":"\/**\n * Build and execute tokenized scripts in separate processes.\n * The scripts should return a JSON encoded string.\n *\/","11907":"\/**\n     * @param array<string, scalar|scalar[]> $phpConfig\n     *\/","11908":"\/**\n     * @param string $template\n     * @param array<string, string|null> $tokens\n     *\/","11909":"\/**\n * Class representing the context from which a script can be generated and executed by a PHP binary.\n *\/","11910":"\/**\n     * Wrapper for PHP binary, e.g. \"blackfire\".\n     *\/","11911":"\/**\n     * Associative array of PHP INI settings.\n     *\n     * @var array<string, scalar|scalar[]>\n     *\/","11912":"\/**\n     * Path to PHP binary.\n     *\/","11913":"\/**\n         * Path to script template.\n         *\/","11914":"\/**\n     * Create a new Payload object with the given script template.\n     * The template must be the path to a script template.\n     *\n     * @param array<string, string|null> $tokens\n     *\/","11915":"\/**\n     * @param string $wrapper\n     *\/","11919":"\/**\n     * @param array<string, string|null> $tokens\n     *\/","11920":"\/**\n     * @param string[]|null $env\n     *\/","11924":"\/**\n     * @param string[] $expressions\n     *\/","11927":"\/**\n     *\n     * @param parameters $config\n     *\/","11928":"\/**\n     * @param string[] $partitionColumns\n     *\/","11929":"\/**\n     * @param array<string, ColumnProcessorInterface> $columnProcessors\n     *\/","11932":"\/**\n     * @param array<string,mixed> $row\n     * @param array<string,mixed> $definition\n     *\n     * @return parameters\n     *\/","11933":"\/**\n     * @param parameters $definitions\n     *\n     * @return parameters\n     *\/","11934":"\/**\n     * @param array<string, array<int,mixed>> $colDefs\n     * @param array<string,array{cols: string[]}> $groupDefs\n     *\n     * @return TableColumnGroup[]\n     *\/","11935":"\/**\n     * @param array<string,array{cols: string[]}> $groupDefs\n     *\n     * @return array<string, string>\n     *\/","11936":"\/**\n     * @param parameters $params\n     * @param tableRowArray $row\n     * @param tableColumnDefinition $definition\n     *\n     * @return tableRowArray $row\n     *\/","11939":"\/**\n     * @param tableRowArray $row\n     * @param tableColumnDefinition $definition\n     * @param parameters $params\n     *\n     * @return tableRowArray $row\n     *\/","11941":"\/**\n     * @param array<string,int> $colSizes Ordered column definition sizes\n     * @param array<string,string> $groupNameByColumn\n     *\n     * @return list<array{string,int}>\n     *\/","11944":"\/**\n     * @var ObjectRendererInterface[]\n     *\/","11945":"\/**\n     * @param scalar[] $xSeries\n     *\n     * @return Generator<string>\n     *\/","11946":"\/**\n     * @return Generator<string>\n     *\/","11949":"\/**\n     * @return array<array<string,mixed>>\n     *\/","11951":"\/**\n     * @param array<array-key, int|string> $axis\n     * @param list<array<int|float>> $rows\n     *\n     * @return list<list<int>>\n     *\/","11952":"\/**\n     * Generate the report document from the suite result document.\n     *\n     *\/","11955":"\/**\n     * @param ConfigurableRegistry<ComponentGeneratorInterface> $registry\n     *\/","11959":"\/**\n     * @param parameters $config\n     *\/","11960":"\/**\n * Report generator which is a composite of other named reports.\n *\/","11964":"\/**\n * Report generator for environmental information.\n *\n * NOTE: The Table report generator could probably be improved to be able to incorporate\n *       this report somehow.\n *\/","11969":"\/**\n     * @param array<string, string> $exprMap\n     * @param array<string, string> $baselineExprMap\n     *\n     * @return Generator<int,array<string,Node>>\n     *\/","11970":"\/**\n     * @param array<string,array<int,array<string,Node>>> $tables\n     *\/","11971":"\/**\n     * @param array<array<string,Node>> $table\n     * @param string[] $breakCols\n     *\n     * @return array<string,array<int,array<string,Node>>>\n     *\/","11973":"\/**\n     * @param string[] $visibleCols\n     *\n     * @return array<string,string>\n     *\/","11976":"\/**\n     * @param BarChartDataSet[] $dataSets\n     * @param scalar[] $xLabels\n     *\/","11977":"\/**\n     * @return number[]\n     *\/","11979":"\/**\n     * @return BarChartDataSet[]\n     *\/","11982":"\/**\n     * @var scalar[]\n     *\/","11983":"\/**\n     * @var number[]\n     *\/","11985":"\/**\n     * @param scalar[] $xSeries\n     * @param number[] $ySeries\n     * @param number[] $errorMargins\n     *\/","11988":"\/**\n     * @return number[]|null\n     *\/","11989":"\/**\n     * @return number\n     *\/","11990":"\/**\n     * @var ComponentInterface[]\n     *\/","11991":"\/**\n     * @var string[] $tabLabels\n     *\/","11992":"\/**\n     * @param string[] $labels\n     *\/","11993":"\/**\n     * @var TableRow[]\n     *\/","11994":"\/**\n     * @deprecated\n     *\n     * @var Node[]\n     *\/","11995":"\/**\n     * @var TableColumnGroup[]\n     *\/","11996":"\/**\n     * @deprecated\n     *\n     * @param string[] $headers\n     *\/","11997":"\/**\n     * @param tableRowArray[] $rows\n     *\/","11998":"\/**\n     * @param tableRowArray $row\n     *\/","11999":"\/**\n     * @param TableColumnGroup[] $groups\n     *\/","12000":"\/**\n     * @internal Use the ReportBuilder\n     *\n     * @param ComponentInterface[] $objects\n     * @param string[] $tabLabels\n     *\/","12001":"\/**\n     * @deprecated to be removed in 2.0. Use ReportBuilder\n     *\n     * @param ComponentInterface[] $objects\n     *\/","12002":"\/**\n     * @deprecated to be removed in 2.0. Use ReportBuilder\n     *\/","12003":"\/**\n     * @return object[]\n     *\/","12004":"\/**\n     * @deprecated use objects() to be removed in 2.0\n     *\n     * @return Table[]\n     *\/","12006":"\/**\n * @implements IteratorAggregate<int,Report>\n *\/","12007":"\/**\n     * @param Report[] $reports\n     *\/","12008":"\/**\n     * @return ArrayIterator<int, Report>\n     *\/","12009":"\/**\n     * @return Table[]\n     *\/","12010":"\/**\n * @implements IteratorAggregate<TableRow>\n *\/","12011":"\/**\n     * @param Node[]|null $headers\n     * @param TableRow[] $rows\n     * @param TableColumnGroup[] $columnGroups\n     *\/","12012":"\/**\n     * @deprecated to be removed in 2.0. Use TableBuilder.\n     *\n     * @param tableRowArray[] $rows\n     *\/","12013":"\/**\n     * @return ArrayIterator<array-key, TableRow>\n     *\/","12015":"\/**\n     * @return TableRow[]\n     *\/","12016":"\/**\n     * @deprecated\n     *\n     * @return Node[]|null\n     *\/","12017":"\/**\n     * @return TableColumnGroup[]\n     *\/","12018":"\/**\n * @implements IteratorAggregate<Node>\n *\/","12019":"\/**\n     * @param array<string, Node> $cells\n     *\/","12020":"\/**\n     * @param array<string, Node> $row\n     *\/","12021":"\/**\n     * @return ArrayIterator<string, Node>\n     *\/","12023":"\/**\n     * @return array<string, Node>\n     *\/","12025":"\/**\n * Implementors render the DOM Document generated by a generator to some visual medium.\n *\n * This might be either direct output (e.g. to the console, streaming markup) or to a file.\n *\n * Example implementors might be XsltRenderer, ConsoleRenderer, etc\n *\/","12027":"\/**\n     * Render the table.\n     *\n     *\/","12029":"\/**\n * Renders the report as a delimited list.\n *\/","12031":"\/**\n     * @param Config $config\n     *\/","12034":"\/**\n * Manage report configuration and generation.\n *\/","12035":"\/**\n     * @param ConfigurableRegistry<GeneratorInterface> $generatorRegistry\n     * @param ConfigurableRegistry<RendererInterface> $rendererRegistry\n     *\/","12036":"\/**\n     * @param string[] $reportNames\n     *\/","12037":"\/**\n     * @param string[] $reportNames\n     * @param string[] $outputNames\n     *\/","12039":"\/**\n     * @deprecated will be removed in 2.0, use `suiteToFrame`.\n     *\n     * @return array<int,array<string,mixed>>\n     *\/","12040":"\/**\n     * @return Generator<array<string, mixed>>\n     *\/","12042":"\/**\n     * @param array<int,array<string,mixed>> $table\n     *\n     * @return array<int,array<string,mixed>>\n     *\/","12045":"\/**\n * Encodes the Suite object graph into an XML document.\n *\/","12046":"\/**\n     * Decode a PHPBench XML document into a SuiteCollection.\n     *\n     *\/","12047":"\/**\n     * Return a SuiteCollection from a number of PHPBench xml files.\n     *\n     * @param string[] $files\n     *\/","12050":"\/**\n     * Encode a Suite object into a XML document.\n     *\n     *\/","12051":"\/**\n     * @param scalar $value\n     *\/","12052":"\/**\n * Archivers handle archiving and retoring the contents of the configured\n * storage driver.\n *\n * @deprecated\n *\/","12053":"\/**\n     * Archive all suites in the configured storage driver.\n     *\n     * In the case that a given record already exists in the archive,\n     * then that record should be skipped.\n     *\n     * Progress should be written to the given console output class.\n     *\n     * @return void\n     *\/","12054":"\/**\n     * Restore the archive to storage. If a given record exists in\n     * the storage, it should be skipped.\n     *\n     * Progress should be written to the given console output class.\n     *\n     * @return void\n     *\/","12055":"\/**\n * Storage driver interface.\n *\/","12056":"\/**\n     * Store the given SuiteCollection.\n     *\n     * Optionally return a message which should be displayed\n     * by the CLI interface after successful storage.\n     *\n     *\n     *\/","12057":"\/**\n     * Return the suite collection with the given run ID.\n     * If no suite is found an exception will be thrown.\n     *\n     * @throws InvalidArgumentException\n     *\/","12058":"\/**\n     * Return true if the driver has the given run ID.\n     *\n     * @param string $runId\n     *\n     * @return bool\n     *\/","12059":"\/**\n     * Return a history iterator of HistoryEntries in descending\n     * chronological order.\n     *\/","12060":"\/** @var ArrayIterator<array-key, HistoryEntry> *\/","12066":"\/**\n * XML file history iterator.\n *\n * This command will iterate over the suite collections created by the XML\n * storage driver.\n *\/","12067":"\/** @var ArrayIterator<int, string> *\/","12070":"\/** @var ArrayIterator<int, HistoryEntry> *\/","12071":"\/**\n     * @param string $path\n     *\/","12077":"\/**\n     * Return an iterator for the history entries.\n     *\n     * We hydrate all of the entries for the \"current\" day.\n     *\n     * @return ArrayIterator<int, HistoryEntry>\n     *\/","12078":"\/**\n     * Hydrate and return the history entry for the given path.\n     *\n     * The summary *should* used pre-calculated values from the XML\n     * therefore reducing the normal overhead, however this code\n     * is still quite expensive as we are creating the entire object\n     * graph for each suite run.\n     *\n     *\/","12079":"\/**\n     * Return the iterator for a specific path (years, months, days).\n     *\n     * We sort by date in descending order.\n     *\n     * @return ArrayIterator<int, string>\n     *\/","12080":"\/**\n * XML storage driver.\n *\n * The collections are sharded by year, month and day in order that we can\n * effectively sort them without hydrating all of the results.\n *\/","12085":"\/**\n * Represents a summary of a run. Used when listing the history.\n *\/","12086":"\/**\n     * @param ?string $runId\n     * @param ?string $tag\n     * @param ?string $branch\n     * @param int $nbSubjects\n     * @param int $nbIterations\n     * @param int $nbRevolutions\n     * @param int|float $minTime\n     * @param int|float $maxTime\n     * @param int|float $meanTime\n     * @param int|float $meanRelStDev\n     * @param int|float $totalTime\n     *\/","12087":"\/**\n     * @return string|null\n     *\/","12097":"\/**\n * Iterator interface which must be implemented by storage drivers.\n *\n * Each element should be an instance of HistoryEntry.\n *\n * @extends Iterator<array-key, HistoryEntry>\n *\/","12098":"\/**\n * @extends Registry<DriverInterface>\n *\/","12104":"\/**\n * Wrapper class for the UUID resolver interface which will always return the\n * UUID\n *\/","12105":"\/**\n     * @param UuidResolverInterface[] $resolvers\n     *\/","12106":"\/**\n     * @param Registry<DriverInterface> $driverRegistry\n     *\/","12107":"\/**\n     * @return array{int, Tag}\n     *\/","12111":"\/**\n         * @var ObjectPathResolver[]\n         *\/","12113":"\/**\n     * @param array<class-string, string> $map\n     *\/","12114":"\/**\n     * @param array<string,string> $prefixMap\n     *\/","12116":"\/**\n     * @param string[] $templatePaths\n     *\/","12118":"\/**\n     * @param array<string, class-string<object>> $serviceMap\n     *\/","12119":"\/**\n     * @param array<string, object> $serviceMap\n     *\/","12120":"\/**\n     * @param scalar|null $value\n     *\/","12123":"\/**\n     * @param mixed[] $values\n     *\n     * @return string[]\n     *\/","12125":"\/** @var array<string, string> *\/","12128":"\/**\n     * Resolve a binary unit\n     *\/","12129":"\/**\n     * Resolve an SI unit\n     *\/","12130":"\/**\n     * Similar to the built-in number_format but meaningless zeros after the\n     * decimal place are trimmed.\n     *\/","12131":"\/**\n     * @param string[] $paths\n     *\n     * @return string[]\n     *\/","12133":"\/**\n * Utility class for representing and converting time units.\n *\/","12134":"\/** @var array<string, positive-int> *\/","12138":"\/**\n     * Convert instance value to given unit.\n     *\n     * @return float\n     *\/","12139":"\/**\n     * Override the destination unit.\n     *\n     *\/","12140":"\/**\n     * Override the mode.\n     *\n     *\/","12141":"\/**\n     * Override the precision.\n     *\n     *\/","12142":"\/**\n     * Return the destination unit.\n     *\n     *\/","12143":"\/**\n     * Utility method, if the dest unit is overridden, return the overridden\n     * value.\n     *\n     * @param string $unit\n     *\n     * @return string\n     *\/","12144":"\/**\n     * Utility method, if the mode is overridden, return the overridden\n     * value.\n     *\n     * @param string $mode\n     *\n     * @return string\n     *\/","12145":"\/**\n     * Utility method, if the precision is overridden, return the overridden\n     * value.\n     *\n     * @param ?int $precision\n     *\/","12146":"\/**\n     * Return the destination mode.\n     *\/","12147":"\/**\n     * Return the destination unit suffix.\n     *\/","12148":"\/**\n     * Return a human readable representation of the unit including the suffix.\n     *\/","12149":"\/**\n     * Convert given time in given unit to given destination unit in given mode.\n     *\n     * @return float\n     *\/","12150":"\/**\n     * Convert a given time INTO the given unit. That is, how many times the\n     * given time will fit into the the destination unit. i.e. `x` per unit.\n     *\n     * @return float\n     *\/","12151":"\/**\n     * Convert the given time from the given unit to the given destination\n     * unit.\n     *\/","12152":"\/**\n     * Return the suffix for a given unit.\n     *\n     * @static\n     *\n     * @return string\n     *\/","12153":"\/**\n * @internal\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  ignored_tags?: list<string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  ignored_tags: list<string>\n * }\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\/","12154":"\/**\n     * @var array<int, array{classIndex: int, token: Token, type: string}>\n     *\/","12155":"\/**\n     * Fixes Doctrine annotations from the given PHPDoc style comment.\n     *\/","12156":"\/**\n     * Returns the definition of the fixer.\n     *\/","12157":"\/**\n     * Set configuration.\n     *\n     * New configuration must override current one, not patch it.\n     * Using empty array makes fixer to use default configuration\n     * (or reset configuration from previously configured back to default one).\n     *\n     * Some fixers may have no configuration, then - simply don't implement this interface.\n     * Other ones may have configuration that will change behavior of fixer,\n     * eg `php_unit_strict` fixer allows to configure which methods should be fixed.\n     * Finally, some fixers need configuration to work, eg `header_comment`.\n     *\n     * @param TFixerInputConfig $configuration configuration depends on Fixer\n     *\n     * @throws InvalidFixerConfigurationException\n     *\/","12158":"\/**\n     * Defines the available configuration options of the fixer.\n     *\/","12159":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","12160":"\/**\n     * Check if the fixer is a candidate for given Tokens collection.\n     *\n     * Fixer is a candidate when the collection contains tokens that may be fixed\n     * during fixer work. This could be considered as some kind of bloom filter.\n     * When this method returns true then to the Tokens collection may or may not\n     * need a fixing, but when this method returns false then the Tokens collection\n     * need no fixing for sure.\n     *\/","12162":"\/**\n * @internal\n *\/","12163":"\/**\n     * Looks up Tokens sequence for suitable candidates and delivers boundaries information,\n     * which can be supplied by other methods in this abstract class.\n     *\n     * @return ?array{int, int, int} returns $functionName, $openParenthesis, $closeParenthesis packed into array\n     *\/","12165":"\/**\n * @internal\n *\n * @author Vladimir Reznichenko <kalessil@gmail.com>\n *\/","12168":"\/**\n     * Return the first and last token index of the previous block.\n     *\n     * [0] First is either T_IF, T_ELSE or T_ELSEIF\n     * [1] Last is either '}' or ';' \/ T_CLOSE_TAG for short notation blocks\n     *\n     * @param int $index T_IF, T_ELSE, T_ELSEIF\n     *\n     * @return array{int, int}\n     *\/","12169":"\/**\n     * @param int $index           Index of the token to check\n     * @param int $lowerLimitIndex Lower limit index. Since the token to check will always be in a conditional we must stop checking at this index\n     *\/","12170":"\/**\n     * For internal use only, as it is not perfect.\n     *\n     * Returns if the token at given index is part of an if\/elseif\/else statement\n     * without {}. Assumes not passing the last `;`\/close tag of the statement, not\n     * out of range index, etc.\n     *\n     * @param int $index Index of the token to check\n     *\/","12173":"\/**\n * @internal\n *\n * @phpstan-type _CommonTypeInfo array{commonType: string, isNullable: bool}\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  scalar_types?: bool,\n *  types_map?: array<string, string>,\n *  union_types?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  scalar_types: bool,\n *  types_map: array<string, string>,\n *  union_types: bool\n * }\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\/","12174":"\/** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> *\/","12176":"\/**\n     * @var array<string, bool>\n     *\/","12178":"\/**\n     * @var null|TFixerComputedConfig\n     *\/","12179":"\/**\n     * @param int $index The index of the function token\n     *\/","12180":"\/**\n     * @return list<Annotation>\n     *\/","12181":"\/**\n     * @return list<Token>\n     *\/","12182":"\/**\n     * Each fixer inheriting from this class must define a way of creating token collection representing type\n     * gathered from phpDoc, e.g. `Foo|Bar` should be transformed into 3 tokens (`Foo`, `|` and `Bar`).\n     * This can't be standardised, because some types may be allowed in one place, and invalid in others.\n     *\n     * @param string $type Type determined (and simplified) from phpDoc\n     *\/","12183":"\/**\n     * @return ?_CommonTypeInfo\n     *\/","12186":"\/**\n     * @param TFixerInputConfig $configuration\n     *\/","12187":"\/**\n     * One can override me.\n     *\n     * @param TFixerInputConfig $configuration\n     *\/","12188":"\/**\n     * One can override me.\n     *\/","12189":"\/**\n * This abstract fixer provides a base for fixers to fix types in PHPDoc.\n *\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n *\n * @internal\n *\/","12190":"\/**\n     * The annotation tags search inside.\n     *\n     * @var list<string>\n     *\/","12191":"\/**\n     * Actually normalize the given type.\n     *\/","12192":"\/**\n     * Fix the type at the given line.\n     *\n     * We must be super careful not to modify parts of words.\n     *\n     * This will be nicely handled behind the scenes for us by the annotation class.\n     *\/","12195":"\/**\n     * @var array<string, FixerInterface>\n     *\/","12196":"\/**\n     * @return list<FixerInterface>\n     *\/","12198":"\/**\n * @author Andreas M\u00f6ller <am@localheinz.com>\n *\n * @internal\n *\/","12200":"\/**\n     * @throws \\InvalidArgumentException\n     *\/","12204":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @readonly\n *\n * @internal\n *\/","12205":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","12206":"\/**\n * Class supports caching information about state of fixing files.\n *\n * Cache is supported only for phar version and version installed via composer.\n *\n * File will be processed by PHP CS Fixer only if any of the following conditions is fulfilled:\n *  - cache is corrupt\n *  - fixer version changed\n *  - rules changed\n *  - file is new\n *  - file changed\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","12207":"\/**\n     * This class is not intended to be serialized,\n     * and cannot be deserialized (see __wakeup method).\n     *\/","12208":"\/**\n     * Disable the deserialization of the class to prevent attacker executing\n     * code by leveraging the __destruct method.\n     *\n     * @see https:\/\/owasp.org\/www-community\/vulnerabilities\/PHP_Object_Injection\n     *\/","12209":"\/**\n * @author Andreas M\u00f6ller <am@localheinz.com>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","12212":"\/**\n * @author Andreas M\u00f6ller <am@localheinz.com>\n *\n * @readonly\n *\n * @internal\n *\/","12213":"\/**\n     * @var array<string, array<string, mixed>|bool>\n     *\/","12214":"\/**\n     * @param array<string, array<string, mixed>|bool> $rules\n     *\/","12215":"\/**\n     * @param array<string, array<string, mixed>|bool> $data\n     *\n     * @return array<string, array<string, mixed>|bool>\n     *\/","12217":"\/**\n     * @return array<string, array<string, mixed>|bool>\n     *\/","12218":"\/**\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Katsuhiro Ogawa <ko.fivestar@gmail.com>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","12220":"\/**\n     * @var list<FixerInterface>\n     *\/","12221":"\/**\n     * @var null|iterable<\\SplFileInfo>\n     *\/","12224":"\/**\n     * @TODO: 4.0 - update to @PER\n     *\n     * @var array<string, array<string, mixed>|bool>\n     *\/","12226":"\/**\n     * @return Finder\n     *\/","12227":"\/**\n     * @param non-empty-string $cacheFile\n     *\/","12228":"\/**\n     * @param non-empty-string $indent\n     *\/","12229":"\/**\n     * @param non-empty-string $lineEnding\n     *\/","12230":"\/**\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","12231":"\/**\n     * Returns the path to the cache file.\n     *\n     * @return null|non-empty-string Returns null if not using cache\n     *\/","12232":"\/**\n     * Returns the custom fixers to use.\n     *\n     * @return list<FixerInterface>\n     *\/","12233":"\/**\n     * Returns files to scan.\n     *\n     * @return iterable<\\SplFileInfo>\n     *\/","12234":"\/**\n     * Returns true if progress should be hidden.\n     *\/","12237":"\/**\n     * Returns the name of the configuration.\n     *\n     * The name must be all lowercase and without any spaces.\n     *\n     * @return string The name of the configuration\n     *\/","12238":"\/**\n     * Get configured PHP executable, if any.\n     *\n     * @deprecated\n     *\n     * @TODO 4.0 remove me\n     *\/","12239":"\/**\n     * Check if it is allowed to run risky fixers.\n     *\/","12240":"\/**\n     * Get rules.\n     *\n     * Keys of array are names of fixers\/sets, values are true\/false.\n     *\n     * @return array<string, array<string, mixed>|bool>\n     *\/","12241":"\/**\n     * Returns true if caching should be enabled.\n     *\/","12242":"\/**\n     * Adds a suite of custom fixers.\n     *\n     * Name of custom fixer should follow `VendorName\/rule_name` convention.\n     *\n     * @param iterable<FixerInterface> $fixers\n     *\/","12243":"\/**\n     * Sets the path to the cache file.\n     *\n     * @param non-empty-string $cacheFile\n     *\/","12244":"\/**\n     * @param iterable<\\SplFileInfo> $finder\n     *\/","12247":"\/**\n     * Set PHP executable.\n     *\n     * @deprecated\n     *\n     * @TODO 4.0 remove me\n     *\/","12248":"\/**\n     * Set if it is allowed to run risky fixers.\n     *\/","12249":"\/**\n     * Set rules.\n     *\n     * Keys of array are names of fixers or sets.\n     * Value for set must be bool (turn it on or off).\n     * Value for fixer may be bool (turn it on or off) or array of configuration\n     * (turn it on and contains configuration for FixerInterface::configure method).\n     *\n     * @param array<string, array<string, mixed>|bool> $rules\n     *\/","12250":"\/**\n * Exceptions of this type are thrown on misconfiguration of the Fixer.\n *\n * @internal\n *\n * @final Only internal extending this class is supported\n *\/","12251":"\/**\n * Exception thrown by Fixers on misconfiguration.\n *\n * @internal\n *\n * @final Only internal extending this class is supported\n *\/","12254":"\/**\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","12255":"\/**\n     * @readonly\n     *\/","12258":"\/**\n     * @throws \\Throwable\n     *\/","12288":"\/**\n     * Gets the default input definition.\n     *\/","12293":"\/**\n * @author Greg Korba <greg@codito.dev>\n *\n * @internal\n *\/","12325":"\/**\n     * @var ?list<string>\n     *\/","12326":"\/**\n     * @var null|array<string, FixerInterface>\n     *\/","12327":"\/**\n     * @return array<string, FixerInterface>\n     *\/","12329":"\/**\n     * @param string $type 'rule'|'set'\n     *\/","12362":"\/**\n     * 'rule'|'set'.\n     *\/","12395":"\/**\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @final\n *\n * @internal\n *\/","12396":"\/**\n     * {@inheritdoc}\n     *\n     * Override here to only generate the help copy when used.\n     *\/","12429":"\/**\n     * Returns the allowed values of the given option that can be converted to a string.\n     *\n     * @return null|list<AllowedValueSubset|mixed>\n     *\/","12430":"\/**\n     * @param string|null $name The name of the command; passing null means it must be set in configure()\n     *\n     * @throws LogicException When the command name is empty\n     *\/","12461":"\/**\n * @author Markus Staab <markus.staab@redaxo.org>\n *\n * @internal\n *\/","12526":"\/**\n * @author Igor Wiedler <igor@wiedler.ch>\n * @author Stephane PY <py.stephane1@gmail.com>\n * @author Gr\u00e9goire Pineau <lyrixx@lyrixx.info>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","12559":"\/** @var string Prefix used before JSON-encoded error printed in the worker's process *\/","12560":"\/** @var list<FileProcessed> *\/","12592":"\/**\n * The resolver that resolves configuration to use by command line options and config.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Katsuhiro Ogawa <ko.fivestar@gmail.com>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\n * @phpstan-type _Options array{\n *      allow-risky: null|string,\n *      cache-file: null|string,\n *      config: null|string,\n *      diff: null|string,\n *      dry-run: null|bool,\n *      format: null|string,\n *      path: list<string>,\n *      path-mode: self::PATH_MODE_*,\n *      rules: null|string,\n *      sequential: null|string,\n *      show-progress: null|string,\n *      stop-on-violation: null|bool,\n *      using-cache: null|string,\n *      verbosity: null|string,\n *  }\n *\/","12593":"\/**\n     * @var null|list<FixerInterface>\n     *\/","12594":"\/**\n     * @var _Options\n     *\/","12596":"\/**\n     * @var null|list<string>\n     *\/","12597":"\/**\n     * @var null|ProgressOutputType::*\n     *\/","12598":"\/**\n     * @param array<string, mixed> $options\n     *\/","12600":"\/**\n     * Returns path.\n     *\n     * @return list<string>\n     *\/","12601":"\/**\n     * @return ProgressOutputType::*\n     *\n     * @throws InvalidConfigurationException\n     *\/","12602":"\/**\n     * Returns rules.\n     *\n     * @return array<string, array<string, mixed>|bool>\n     *\/","12603":"\/**\n     * @return iterable<\\SplFileInfo>\n     *\/","12604":"\/**\n     * Returns dry-run flag.\n     *\/","12605":"\/**\n     * Compute file candidates for config file.\n     *\n     * @return list<string>\n     *\/","12606":"\/**\n     * @template T\n     *\n     * @param iterable<T> $iterable\n     *\n     * @return \\Traversable<T>\n     *\/","12608":"\/**\n     * @param array<string, mixed> $rules\n     *\n     * @throws InvalidConfigurationException\n     *\/","12609":"\/**\n     * Apply path on config instance.\n     *\n     * @return iterable<\\SplFileInfo>\n     *\/","12610":"\/**\n     * Set option that will be resolved.\n     *\n     * @param mixed $value\n     *\/","12611":"\/**\n     * @param key-of<_Options> $optionName\n     *\/","12612":"\/**\n * @readonly\n *\n * @internal\n *\/","12613":"\/**\n     * @param list<Error> $errors\n     *\/","12614":"\/**\n     * @param array{\n     *     function?: string,\n     *     line?: int,\n     *     file?: string,\n     *     class?: class-string,\n     *     type?: '::'|'->',\n     *     args?: mixed[],\n     *     object?: object,\n     * } $trace\n     *\/","12616":"\/**\n * Output writer to show the progress of a FixCommand using dots and meaningful letters.\n *\n * @internal\n *\/","12617":"\/**\n     * File statuses map.\n     *\n     * @var array<FileProcessed::STATUS_*, array{symbol: string, format: string, description: string}>\n     *\/","12618":"\/** @readonly *\/","12622":"\/**\n * Output writer to show the progress of a FixCommand using progress bar (percentage).\n *\n * @readonly\n *\n * @internal\n *\/","12627":"\/**\n     * @var array<ProgressOutputType::*, class-string<ProgressOutputInterface>>\n     *\/","12628":"\/**\n     * @param ProgressOutputType::* $outputType\n     *\/","12631":"\/**\n     * @return list<ProgressOutputType::*>\n     *\/","12632":"\/**\n * @author K\u00e9vin Gomez <contact@kevingomez.fr>\n *\n * @readonly\n *\n * @internal\n *\/","12633":"\/**\n * Generates a report according to gitlabs subset of codeclimate json files.\n *\n * @see https:\/\/github.com\/codeclimate\/platform\/blob\/master\/spec\/analyzers\/SPEC.md#data-types\n *\n * @author Hans-Christian Otto <c.otto@suora.com>\n *\n * @readonly\n *\n * @internal\n *\/","12634":"\/**\n     * Process changed files array. Returns generated report.\n     *\/","12635":"\/**\n     * @param list<Diff> $diffs\n     *\n     * @return array{begin: int, end: int}\n     *\/","12636":"\/**\n * @author Boris Gorbylev <ekho@ekho.name>\n *\n * @readonly\n *\n * @internal\n *\/","12638":"\/**\n     * @param array{appliedFixers: list<string>, diff: string} $fixResult\n     *\/","12640":"\/**\n     * @var array<string, array{appliedFixers: list<string>, diff: string}>\n     *\/","12641":"\/**\n     * @param array<string, array{appliedFixers: list<string>, diff: string}> $changed\n     * @param int                                                             $time    duration in milliseconds\n     * @param int                                                             $memory  memory usage in bytes\n     *\/","12642":"\/**\n     * @return array<string, array{appliedFixers: list<string>, diff: string}>\n     *\/","12643":"\/**\n * @author Boris Gorbylev <ekho@ekho.name>\n *\n * @internal\n *\/","12644":"\/** @var array<string, ReporterInterface> *\/","12650":"\/**\n     * @param list<string> $appliedFixers\n     *\/","12655":"\/**\n     * @var list<RuleSetDescriptionInterface>\n     *\/","12656":"\/**\n     * @param list<RuleSetDescriptionInterface> $sets\n     *\/","12657":"\/**\n     * @return list<RuleSetDescriptionInterface>\n     *\/","12659":"\/**\n     * @var array<string, ReporterInterface>\n     *\/","12670":"\/**\n     * Returns the tag of the latest version.\n     *\/","12671":"\/**\n     * Returns the tag of the latest minor\/patch version of the given major version.\n     *\/","12672":"\/**\n     * Returns -1, 0, or 1 if the first version is respectively less than,\n     * equal to, or greater than the second.\n     *\/","12678":"\/**\n     * Create diff.\n     *\/","12681":"\/**\n * This represents an entire annotation from a docblock.\n *\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","12682":"\/**\n     * All the annotation tag names with types.\n     *\n     * @var list<string>\n     *\/","12683":"\/**\n     * The lines that make up the annotation.\n     *\n     * @var array<int, Line>\n     *\/","12684":"\/**\n     * The position of the first line of the annotation in the docblock.\n     *\/","12685":"\/**\n     * The position of the last line of the annotation in the docblock.\n     *\/","12686":"\/**\n     * The associated tag.\n     *\/","12687":"\/**\n     * Lazy loaded, cached types content.\n     *\/","12688":"\/**\n     * The cached types.\n     *\n     * @var null|list<string>\n     *\/","12689":"\/**\n     * @var list<NamespaceUseAnalysis>\n     *\/","12690":"\/**\n     * Create a new line instance.\n     *\n     * @param array<int, Line>           $lines\n     * @param null|NamespaceAnalysis     $namespace\n     * @param list<NamespaceUseAnalysis> $namespaceUses\n     *\/","12691":"\/**\n     * Get the string representation of object.\n     *\/","12692":"\/**\n     * Get all the annotation tag names with types.\n     *\n     * @return list<string>\n     *\/","12693":"\/**\n     * Get the start position of this annotation.\n     *\/","12694":"\/**\n     * Get the end position of this annotation.\n     *\/","12695":"\/**\n     * Get the associated tag.\n     *\/","12698":"\/**\n     * Get the types associated with this annotation.\n     *\n     * @return list<string>\n     *\/","12699":"\/**\n     * Set the types associated with this annotation.\n     *\n     * @param list<string> $types\n     *\/","12700":"\/**\n     * Get the normalized types associated with this annotation, so they can easily be compared.\n     *\n     * @return list<string>\n     *\/","12701":"\/**\n     * Remove this annotation by removing all its lines.\n     *\/","12702":"\/**\n     * Get the annotation content.\n     *\/","12703":"\/**\n     * Get the current types content.\n     *\n     * Be careful modifying the underlying line as that won't flush the cache.\n     *\/","12704":"\/**\n * This class represents a docblock.\n *\n * It internally splits it up into \"lines\" that we can manipulate.\n *\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n *\/","12705":"\/**\n     * @var list<Line>\n     *\/","12706":"\/**\n     * @var null|list<Annotation>\n     *\/","12708":"\/**\n     * @param list<NamespaceUseAnalysis> $namespaceUses\n     *\/","12709":"\/**\n     * Get this docblock's lines.\n     *\n     * @return list<Line>\n     *\/","12710":"\/**\n     * Get a single line.\n     *\/","12711":"\/**\n     * Get this docblock's annotations.\n     *\n     * @return list<Annotation>\n     *\/","12712":"\/**\n     * Take a one line doc block, and turn it into a multi line doc block.\n     *\/","12713":"\/**\n     * Get specific types of annotations only.\n     *\n     * @param list<string>|string $types\n     *\n     * @return list<Annotation>\n     *\/","12714":"\/**\n     * Get the actual content of this docblock.\n     *\/","12715":"\/**\n * This represents a line of a docblock.\n *\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n *\/","12716":"\/**\n     * The content of this line.\n     *\/","12717":"\/**\n     * Create a new line instance.\n     *\/","12719":"\/**\n     * Get the content of this line.\n     *\/","12720":"\/**\n     * Does this line contain useful content?\n     *\n     * If the line contains text or tags, then this is true.\n     *\/","12721":"\/**\n     * Does the line contain a tag?\n     *\n     * If this is true, then it must be the first line of an annotation.\n     *\/","12722":"\/**\n     * Is the line the start of a docblock?\n     *\/","12723":"\/**\n     * Is the line the end of a docblock?\n     *\/","12724":"\/**\n     * Set the content of this line.\n     *\/","12725":"\/**\n     * Remove this line by clearing its contents.\n     *\n     * Note that this method technically brakes the internal state of the\n     * docblock, but is useful when we need to retain the indices of lines\n     * during the execution of an algorithm.\n     *\/","12726":"\/**\n     * Append a blank docblock line to this line's contents.\n     *\n     * Note that this method technically brakes the internal state of the\n     * docblock, but is useful when we need to retain the indices of lines\n     * during the execution of an algorithm.\n     *\/","12727":"\/**\n * This class represents a short description (aka summary) of a docblock.\n *\n * @readonly\n *\n * @internal\n *\/","12728":"\/**\n     * The docblock containing the short description.\n     *\/","12729":"\/**\n     * Get the line index of the line containing the end of the short\n     * description, if present.\n     *\/","12730":"\/**\n * This represents a tag, as defined by the proposed PSR PHPDoc standard.\n *\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n * @author Jakub Kwa\u015bniewski <jakub@zero-85.pl>\n *\/","12731":"\/**\n     * All the tags defined by the proposed PSR PHPDoc standard.\n     *\/","12732":"\/**\n     * The line containing the tag.\n     *\/","12733":"\/**\n     * The cached tag name.\n     *\/","12734":"\/**\n     * Create a new tag instance.\n     *\/","12735":"\/**\n     * Get the tag name.\n     *\n     * This may be \"param\", or \"return\", etc.\n     *\/","12736":"\/**\n     * Set the tag name.\n     *\n     * This will also be persisted to the upstream line and annotation.\n     *\/","12737":"\/**\n     * Is the tag a known tag?\n     *\n     * This is defined by if it exists in the proposed PSR PHPDoc standard.\n     *\/","12738":"\/**\n * This class is responsible for comparing tags to see if they should be kept\n * together, or kept apart.\n *\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n * @author Jakub Kwa\u015bniewski <jakub@zero-85.pl>\n *\n * @deprecated\n *\/","12739":"\/**\n     * Groups of tags that should be allowed to immediately follow each other.\n     *\n     * @var list<list<string>>\n     *\n     * @internal\n     *\/","12740":"\/**\n     * Should the given tags be kept together, or kept apart?\n     *\n     * @param list<list<string>> $groups\n     *\/","12741":"\/**\n * @author Michael Vorisek <https:\/\/github.com\/mvorisek>\n *\n * @internal\n *\/","12742":"\/**\n     * Regex to match any PHP identifier.\n     *\n     * @internal\n     *\/","12743":"\/**\n     * Regex to match any PHPDoc type.\n     *\n     * @internal\n     *\/","12744":"\/**\n     * Based on:\n     * - https:\/\/github.com\/phpstan\/phpdoc-parser\/blob\/1.26.0\/doc\/grammars\/type.abnf fuzzing grammar\n     * - and https:\/\/github.com\/phpstan\/phpdoc-parser\/blob\/1.26.0\/src\/Parser\/PhpDocParser.php parser impl.\n     *\/","12745":"\/** @var null|'&'|'|' *\/","12746":"\/** @var list<array{start_index: int, expression: self}> *\/","12747":"\/** @var list<NamespaceUseAnalysis> *\/","12750":"\/**\n     * Determines if type expression is a composite type (union or intersection).\n     *\/","12751":"\/**\n     * @return null|'&'|'|'\n     *\/","12752":"\/**\n     * @param \\Closure(self): self $callback\n     *\/","12753":"\/**\n     * @param \\Closure(self): void $callback\n     *\/","12754":"\/**\n     * @param \\Closure(self, self): (-1|0|1) $compareCallback\n     *\/","12756":"\/**\n * Copyright (c) 2006-2013 Doctrine Project.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and\/or sell copies\n * of the Software, and to permit persons to whom the Software is furnished to do\n * so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * @internal\n *\/","12757":"\/** @var array<string, self::T_*> *\/","12758":"\/** @var list<Token> *\/","12761":"\/**\n     * @return self::T_*\n     *\/","12762":"\/**\n * A Doctrine annotation token.\n *\n * @internal\n *\/","12763":"\/**\n     * @param int    $type    The type\n     * @param string $content The content\n     *\/","12764":"\/**\n     * Returns whether the token type is one of the given types.\n     *\n     * @param int|list<int> $types\n     *\/","12765":"\/**\n     * Overrides the content with an empty string.\n     *\/","12766":"\/**\n * A list of Doctrine annotation tokens.\n *\n * @internal\n *\n * @extends \\SplFixedArray<Token>\n *\/","12767":"\/**\n     * @param list<string> $ignoredTags\n     *\n     * @throws \\InvalidArgumentException\n     *\/","12768":"\/**\n     * Create token collection from array.\n     *\n     * @param array<int, Token> $array       the array to import\n     * @param ?bool             $saveIndices save the numeric indices used in the original array, default is yes\n     *\/","12769":"\/**\n     * Returns the index of the closest next token that is neither a comment nor a whitespace token.\n     *\/","12770":"\/**\n     * Returns the index of the closest previous token that is neither a comment nor a whitespace token.\n     *\/","12771":"\/**\n     * Returns the index of the last token that is part of the annotation at the given index.\n     *\/","12772":"\/**\n     * Returns the code from the tokens.\n     *\/","12773":"\/**\n     * Inserts a token at the given index.\n     *\/","12774":"\/**\n     * @param mixed $index\n     *\n     * @throws \\OutOfBoundsException\n     *\/","12777":"\/**\n     * @internal\n     *\n     * @return array<string, null|array<string, mixed>>\n     *\/","12778":"\/**\n     * @param list<FixerInterface> $fixers\n     *\/","12782":"\/**\n     * @param array<string, RuleSetDescriptionInterface> $setDefinitions\n     *\/","12783":"\/**\n * An abstraction for errors that can occur before and during fixing.\n *\n * @author Andreas M\u00f6ller <am@localheinz.com>\n *\n * @readonly\n *\n * @internal\n *\/","12784":"\/**\n     * Error which has occurred in linting phase, before applying any fixers.\n     *\/","12785":"\/**\n     * Error which has occurred during fixing phase.\n     *\/","12786":"\/**\n     * Error which has occurred in linting phase, after applying any fixers.\n     *\/","12789":"\/**\n     * @param self::TYPE_* $type\n     * @param list<string> $appliedFixers\n     *\/","12791":"\/**\n     * @return array{\n     *     type: self::TYPE_*,\n     *     filePath: string,\n     *     source: null|array{class: class-string, message: string, code: int, file: string, line: int},\n     *     appliedFixers: list<string>,\n     *     diff: null|string\n     * }\n     *\/","12792":"\/**\n * Manager of errors that occur during fixing.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","12793":"\/**\n     * @var list<Error>\n     *\/","12794":"\/**\n     * Returns errors reported during linting before fixing.\n     *\n     * @return list<Error>\n     *\/","12795":"\/**\n     * Returns errors reported during fixing.\n     *\n     * @return list<Error>\n     *\/","12796":"\/**\n     * Returns errors reported during linting after fixing.\n     *\n     * @return list<Error>\n     *\/","12797":"\/**\n     * Returns errors reported for specified path.\n     *\n     * @return list<Error>\n     *\/","12798":"\/**\n     * Returns true if no errors were reported.\n     *\/","12800":"\/**\n     * @param array{class: class-string<\\Throwable>, message: string, code: int, file: string, line: int} $error\n     *\/","12802":"\/**\n     * @template T\n     *\n     * @param callable(): T $callback\n     *\n     * @return T\n     *\n     * @throws ExecutorWithoutErrorHandlerException\n     *\/","12804":"\/**\n * File reader that unify access to regular file and stdin-alike file.\n *\n * Regular file could be read multiple times with `file_get_contents`, but file provided on stdin cannot.\n * Consecutive try will provide empty content for stdin-alike file.\n * This reader unifies access to them.\n *\n * @internal\n *\/","12805":"\/**\n * Handles files removal with possibility to remove them on shutdown.\n *\n * @author Adam Klva\u010d <adam@klva.cz>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","12806":"\/**\n     * List of observed files to be removed.\n     *\n     * @var array<string, true>\n     *\/","12809":"\/**\n     * Adds a file to be removed.\n     *\/","12810":"\/**\n     * Removes a file from shutdown removal.\n     *\/","12811":"\/**\n     * Removes attached files.\n     *\/","12813":"\/**\n     * Creates a new Finder.\n     *\/","12814":"\/**\n     * Restricts the matching to directories only.\n     *\n     * @return $this\n     *\/","12815":"\/**\n     * Restricts the matching to files only.\n     *\n     * @return $this\n     *\/","12816":"\/**\n     * Adds tests for the directory depth.\n     *\n     * Usage:\n     *\n     *     $finder->depth('> 1') \/\/ the Finder will start matching at level 1.\n     *     $finder->depth('< 3') \/\/ the Finder will descend at most 3 levels of directories below the starting point.\n     *     $finder->depth(['>= 1', '< 3'])\n     *\n     * @param string|int|string[]|int[] $levels The depth level expression or an array of depth levels\n     *\n     * @return $this\n     *\n     * @see DepthRangeFilterIterator\n     * @see NumberComparator\n     *\/","12817":"\/**\n     * Adds tests for file dates (last modified).\n     *\n     * The date must be something that strtotime() is able to parse:\n     *\n     *     $finder->date('since yesterday');\n     *     $finder->date('until 2 days ago');\n     *     $finder->date('> now - 2 hours');\n     *     $finder->date('>= 2005-10-15');\n     *     $finder->date(['>= 2005-10-15', '<= 2006-05-27']);\n     *\n     * @param string|string[] $dates A date range string or an array of date ranges\n     *\n     * @return $this\n     *\n     * @see strtotime\n     * @see DateRangeFilterIterator\n     * @see DateComparator\n     *\/","12818":"\/**\n     * Adds rules that files must match.\n     *\n     * You can use patterns (delimited with \/ sign), globs or simple strings.\n     *\n     *     $finder->name('\/\\.php$\/')\n     *     $finder->name('*.php') \/\/ same as above, without dot files\n     *     $finder->name('test.php')\n     *     $finder->name(['test.py', 'test.php'])\n     *\n     * @param string|string[] $patterns A pattern (a regexp, a glob, or a string) or an array of patterns\n     *\n     * @return $this\n     *\n     * @see FilenameFilterIterator\n     *\/","12819":"\/**\n     * Adds rules that files must not match.\n     *\n     * @param string|string[] $patterns A pattern (a regexp, a glob, or a string) or an array of patterns\n     *\n     * @return $this\n     *\n     * @see FilenameFilterIterator\n     *\/","12820":"\/**\n     * Adds tests that file contents must match.\n     *\n     * Strings or PCRE patterns can be used:\n     *\n     *     $finder->contains('Lorem ipsum')\n     *     $finder->contains('\/Lorem ipsum\/i')\n     *     $finder->contains(['dolor', '\/ipsum\/i'])\n     *\n     * @param string|string[] $patterns A pattern (string or regexp) or an array of patterns\n     *\n     * @return $this\n     *\n     * @see FilecontentFilterIterator\n     *\/","12821":"\/**\n     * Adds tests that file contents must not match.\n     *\n     * Strings or PCRE patterns can be used:\n     *\n     *     $finder->notContains('Lorem ipsum')\n     *     $finder->notContains('\/Lorem ipsum\/i')\n     *     $finder->notContains(['lorem', '\/dolor\/i'])\n     *\n     * @param string|string[] $patterns A pattern (string or regexp) or an array of patterns\n     *\n     * @return $this\n     *\n     * @see FilecontentFilterIterator\n     *\/","12822":"\/**\n     * Adds rules that filenames must match.\n     *\n     * You can use patterns (delimited with \/ sign) or simple strings.\n     *\n     *     $finder->path('some\/special\/dir')\n     *     $finder->path('\/some\\\/special\\\/dir\/') \/\/ same as above\n     *     $finder->path(['some dir', 'another\/dir'])\n     *\n     * Use only \/ as dirname separator.\n     *\n     * @param string|string[] $patterns A pattern (a regexp or a string) or an array of patterns\n     *\n     * @return $this\n     *\n     * @see FilenameFilterIterator\n     *\/","12823":"\/**\n     * Adds rules that filenames must not match.\n     *\n     * You can use patterns (delimited with \/ sign) or simple strings.\n     *\n     *     $finder->notPath('some\/special\/dir')\n     *     $finder->notPath('\/some\\\/special\\\/dir\/') \/\/ same as above\n     *     $finder->notPath(['some\/file.txt', 'another\/file.log'])\n     *\n     * Use only \/ as dirname separator.\n     *\n     * @param string|string[] $patterns A pattern (a regexp or a string) or an array of patterns\n     *\n     * @return $this\n     *\n     * @see FilenameFilterIterator\n     *\/","12824":"\/**\n     * Adds tests for file sizes.\n     *\n     *     $finder->size('> 10K');\n     *     $finder->size('<= 1Ki');\n     *     $finder->size(4);\n     *     $finder->size(['> 10K', '< 20K'])\n     *\n     * @param string|int|string[]|int[] $sizes A size range string or an integer or an array of size ranges\n     *\n     * @return $this\n     *\n     * @see SizeRangeFilterIterator\n     * @see NumberComparator\n     *\/","12825":"\/**\n     * Excludes directories.\n     *\n     * Directories passed as argument must be relative to the ones defined with the `in()` method. For example:\n     *\n     *     $finder->in(__DIR__)->exclude('ruby');\n     *\n     * @param string|array $dirs A directory path or an array of directories\n     *\n     * @return $this\n     *\n     * @see ExcludeDirectoryFilterIterator\n     *\/","12826":"\/**\n     * Excludes \"hidden\" directories and files (starting with a dot).\n     *\n     * This option is enabled by default.\n     *\n     * @return $this\n     *\n     * @see ExcludeDirectoryFilterIterator\n     *\/","12827":"\/**\n     * Forces the finder to ignore version control directories.\n     *\n     * This option is enabled by default.\n     *\n     * @return $this\n     *\n     * @see ExcludeDirectoryFilterIterator\n     *\/","12828":"\/**\n     * Forces Finder to obey .gitignore and ignore files based on rules listed there.\n     *\n     * This option is disabled by default.\n     *\n     * @return $this\n     *\/","12829":"\/**\n     * Adds VCS patterns.\n     *\n     * @see ignoreVCS()\n     *\n     * @param string|string[] $pattern VCS patterns to ignore\n     *\/","12830":"\/**\n     * Sorts files and directories by an anonymous function.\n     *\n     * The anonymous function receives two \\SplFileInfo instances to compare.\n     *\n     * This can be slow as all the matching files and directories must be retrieved for comparison.\n     *\n     * @return $this\n     *\n     * @see SortableIterator\n     *\/","12831":"\/**\n     * Sorts files and directories by extension.\n     *\n     * This can be slow as all the matching files and directories must be retrieved for comparison.\n     *\n     * @return $this\n     *\n     * @see SortableIterator\n     *\/","12832":"\/**\n     * Sorts files and directories by name.\n     *\n     * This can be slow as all the matching files and directories must be retrieved for comparison.\n     *\n     * @return $this\n     *\n     * @see SortableIterator\n     *\/","12833":"\/**\n     * Sorts files and directories by name case insensitive.\n     *\n     * This can be slow as all the matching files and directories must be retrieved for comparison.\n     *\n     * @return $this\n     *\n     * @see SortableIterator\n     *\/","12834":"\/**\n     * Sorts files and directories by size.\n     *\n     * This can be slow as all the matching files and directories must be retrieved for comparison.\n     *\n     * @return $this\n     *\n     * @see SortableIterator\n     *\/","12835":"\/**\n     * Sorts files and directories by type (directories before files), then by name.\n     *\n     * This can be slow as all the matching files and directories must be retrieved for comparison.\n     *\n     * @return $this\n     *\n     * @see SortableIterator\n     *\/","12836":"\/**\n     * Sorts files and directories by the last accessed time.\n     *\n     * This is the time that the file was last accessed, read or written to.\n     *\n     * This can be slow as all the matching files and directories must be retrieved for comparison.\n     *\n     * @return $this\n     *\n     * @see SortableIterator\n     *\/","12837":"\/**\n     * Reverses the sorting.\n     *\n     * @return $this\n     *\/","12838":"\/**\n     * Sorts files and directories by the last inode changed time.\n     *\n     * This is the time that the inode information was last modified (permissions, owner, group or other metadata).\n     *\n     * On Windows, since inode is not available, changed time is actually the file creation time.\n     *\n     * This can be slow as all the matching files and directories must be retrieved for comparison.\n     *\n     * @return $this\n     *\n     * @see SortableIterator\n     *\/","12839":"\/**\n     * Sorts files and directories by the last modified time.\n     *\n     * This is the last time the actual contents of the file were last modified.\n     *\n     * This can be slow as all the matching files and directories must be retrieved for comparison.\n     *\n     * @return $this\n     *\n     * @see SortableIterator\n     *\/","12840":"\/**\n     * Filters the iterator with an anonymous function.\n     *\n     * The anonymous function receives a \\SplFileInfo and must return false\n     * to remove files.\n     *\n     * @param \\Closure(SplFileInfo): bool $closure\n     * @param bool                        $prune   Whether to skip traversing directories further\n     *\n     * @return $this\n     *\n     * @see CustomFilterIterator\n     *\/","12841":"\/**\n     * Forces the following of symlinks.\n     *\n     * @return $this\n     *\/","12842":"\/**\n     * Tells finder to ignore unreadable directories.\n     *\n     * By default, scanning unreadable directories content throws an AccessDeniedException.\n     *\n     * @return $this\n     *\/","12843":"\/**\n     * Searches files and directories which match defined rules.\n     *\n     * @param string|string[] $dirs A directory path or an array of directories\n     *\n     * @return $this\n     *\n     * @throws DirectoryNotFoundException if one of the directories does not exist\n     *\/","12844":"\/**\n     * Returns an Iterator for the current Finder configuration.\n     *\n     * This method implements the IteratorAggregate interface.\n     *\n     * @return \\Iterator<string, SplFileInfo>\n     *\n     * @throws \\LogicException if the in() method has not been called\n     *\/","12845":"\/**\n     * Appends an existing set of files\/directories to the finder.\n     *\n     * The set can be another Finder, an Iterator, an IteratorAggregate, or even a plain array.\n     *\n     * @return $this\n     *\/","12846":"\/**\n     * Check if any results were found.\n     *\/","12847":"\/**\n     * Counts all the results collected by the iterators.\n     *\/","12848":"\/**\n * @author ntzm\n *\n * @readonly\n *\n * @internal\n *\/","12849":"\/**\n * @author ntzm\n *\n * @internal\n *\/","12850":"\/**\n     * @param mixed $default\n     *\/","12851":"\/**\n     * @param list<string> $allowedTypes\n     *\/","12852":"\/**\n     * @param list<null|(callable(mixed): bool)|scalar> $allowedValues\n     *\/","12855":"\/**\n     * @param list<string> $allowedValues\n     *\/","12856":"\/**\n     * Checks whether the given values are a subset of the allowed ones.\n     *\n     * @param mixed $values the value to validate\n     *\/","12860":"\/**\n     * @return mixed\n     *\n     * @throws \\LogicException when no default value is defined\n     *\/","12861":"\/**\n     * @return null|list<string>\n     *\/","12862":"\/**\n     * @return null|list<null|(callable(mixed): bool)|scalar>\n     *\/","12864":"\/**\n     * @var list<FixerOptionInterface>\n     *\n     * @readonly\n     *\/","12865":"\/**\n     * @param iterable<FixerOptionInterface> $options\n     *\/","12866":"\/**\n     * @param iterable<FixerOptionInterface> $options\n     *\n     * @throws \\LogicException when the option is already defined\n     *\/","12867":"\/**\n     * @return list<FixerOptionInterface>\n     *\/","12868":"\/**\n     * @param array<string, mixed> $configuration\n     *\n     * @return array<string, mixed>\n     *\/","12870":"\/**\n     * @var mixed\n     *\/","12872":"\/**\n     * @var null|list<null|(callable(mixed): bool)|scalar>\n     *\/","12873":"\/**\n     * @param mixed                                          $default\n     * @param null|list<string>                              $allowedTypes\n     * @param null|list<null|(callable(mixed): bool)|scalar> $allowedValues\n     *\/","12875":"\/**\n     * Unbinds the given closure to avoid memory leaks.\n     *\n     * The closures provided to this class were probably defined in a fixer\n     * class and thus bound to it by default. The configuration will then be\n     * stored in {@see AbstractFixer::$configurationDefinition}, leading to the\n     * following cyclic reference:\n     *\n     *     fixer -> configuration definition -> options -> closures -> fixer\n     *\n     * This cyclic reference prevent the garbage collector to free memory as\n     * all elements are still referenced.\n     *\n     * See {@see https:\/\/bugs.php.net\/bug.php?id=69639 Bug #69639} for details.\n     *\/","12876":"\/**\n     * @var null|mixed\n     *\/","12879":"\/**\n     * @param mixed $default\n     *\n     * @return $this\n     *\/","12880":"\/**\n     * @param list<string> $allowedTypes\n     *\n     * @return $this\n     *\/","12881":"\/**\n     * @param list<null|(callable(mixed): bool)|scalar> $allowedValues\n     *\n     * @return $this\n     *\/","12888":"\/**\n     * @param iterable<FixerOptionInterface> $options\n     *\n     * @return list<FixerOptionInterface>\n     *\/","12890":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @readonly\n *\/","12891":"\/**\n     * @var null|array<string, mixed>\n     *\/","12892":"\/**\n     * @param null|array<string, mixed> $configuration\n     *\/","12894":"\/**\n     * @return null|array<string, mixed>\n     *\/","12900":"\/**\n     * @var list<CodeSampleInterface>\n     *\/","12901":"\/**\n     * Description of Fixer and benefit of using it.\n     *\/","12902":"\/**\n     * Description why Fixer is risky.\n     *\/","12903":"\/**\n     * @param list<CodeSampleInterface> $codeSamples      array of samples, where single sample is [code, configuration]\n     * @param null|string               $riskyDescription null for non-risky fixer\n     *\/","12905":"\/**\n     * @return null|string null for non-risky fixer\n     *\/","12906":"\/**\n     * Array of samples, where single sample is [code, configuration].\n     *\n     * @return list<CodeSampleInterface>\n     *\/","12907":"\/**\n * @author Andreas M\u00f6ller <am@localheinz.com>\n *\n * @readonly\n *\/","12909":"\/**\n * @author Andreas Moeller <am@localheinz.com>\n *\/","12912":"\/**\n     * @var null|int<1, max>\n     *\/","12914":"\/**\n     * @param null|int<1, max> $minimum\n     * @param null|int<1, max> $maximum\n     *\n     * @throws \\InvalidArgumentException\n     *\/","12915":"\/**\n * @author Andreas M\u00f6ller <am@localheinz.com>\n *\/","12916":"\/**\n * Class provides a way to create a group of fixers.\n *\n * Fixers may be registered (made the factory aware of them) by\n * registering a custom fixer and default, built in fixers.\n * Then, one can attach Config instance to fixer instances.\n *\n * Finally factory creates a ready to use group of fixers.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","12921":"\/**\n     * @param iterable<FixerInterface> $fixers\n     *\n     * @return $this\n     *\/","12923":"\/**\n     * Apply RuleSet on fixers to filter out all unwanted fixers.\n     *\n     * @return $this\n     *\/","12924":"\/**\n     * Check if fixer exists.\n     *\/","12926":"\/**\n     * @param array<string, list<string>> $fixerConflicts\n     *\/","12931":"\/**\n     * @param list<string>       $preventingAnnotations\n     * @param list<class-string> $preventingAttributes\n     *\/","12932":"\/**\n     * @return iterable<array{\n     *     index: int,\n     *     loweredName: string,\n     *     openBraceIndex: int,\n     *     closeBraceIndex: int,\n     * }>\n     *\/","12933":"\/**\n     * @param list<string> $preventingAnnotations\n     *\/","12934":"\/**\n     * @param list<class-string> $preventingAttributes\n     *\/","12935":"\/**\n     * @return list<Line>\n     *\/","12938":"\/**\n     * @param array{start: int, end: int} $assignRange\n     * @param array{start: int, end: int} $operatorRange\n     *\/","12939":"\/**\n     * @return array{start: int, end: int}\n     *\/","12941":"\/**\n     * @param array{start: int, end: int} $range\n     *\/","12944":"\/**\n     * @param int $endIndex boundary, i.e. tokens index of `)`\n     *\/","12945":"\/**\n * @author Filippo Tessarotto <zoeslam@gmail.com>\n *\/","12946":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before ExplicitStringVariableFixer, NativeFunctionInvocationFixer, SingleQuoteFixer.\n     *\/","12947":"\/**\n     * Override backtick code with corresponding double-quoted string.\n     *\n     * @param array<int, Token> $backtickTokens\n     *\/","12948":"\/**\n * @author Matteo Beccati <matteo@beccati.com>\n *\/","12949":"\/**\n     * @var list<array<int, string>> the list of the ext\/ereg function names, their preg equivalent and the preg modifier(s), if any\n     *                               all condensed in an array of arrays\n     *\/","12950":"\/**\n     * @var list<string> the list of preg delimiters, in order of preference\n     *\/","12951":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after NoUselessConcatOperatorFixer.\n     *\/","12952":"\/**\n     * Check the validity of a PCRE.\n     *\n     * @param string $pattern the regular expression\n     *\/","12953":"\/**\n     * Get the delimiter that would require the least escaping in a regular expression.\n     *\n     * @param string $pattern the regular expression\n     *\n     * @return string the preg delimiter\n     *\/","12955":"\/**\n     * list of the string-related function names and their mb_ equivalent.\n     *\n     * @var array<\n     *     string,\n     *     array{\n     *         alternativeName: string,\n     *         argumentCount: list<int>,\n     *     },\n     * >\n     *\/","12956":"\/**\n     * @var array<\n     *     string,\n     *     array{\n     *         alternativeName: string,\n     *         argumentCount: list<int>,\n     *     },\n     * >\n     *\/","12957":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NativeFunctionInvocationFixer.\n     *\/","12959":"\/**\n * @author Alexander M. Turek <me@derrabus.de>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  modernize_stripos?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  modernize_stripos: bool\n * }\n *\/","12962":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BinaryOperatorSpacesFixer, NoExtraBlankLinesFixer, NoSpacesInsideParenthesisFixer, NoTrailingWhitespaceFixer, NotOperatorWithSpaceFixer, NotOperatorWithSuccessorSpaceFixer, PhpUnitDedicateAssertFixer, SingleSpaceAfterConstructFixer, SingleSpaceAroundConstructFixer, SpacesInsideParenthesesFixer.\n     * Must run after StrictComparisonFixer.\n     *\/","12963":"\/**\n     * @param array{operator_index: int, operand_index: int} $operatorIndices\n     *\/","12964":"\/**\n     * @param -1|1 $direction\n     *\n     * @return null|array{operator_index: int, operand_index: int}\n     *\/","12967":"\/**\n * @author Vladimir Reznichenko <kalessil@gmail.com>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  sets?: list<'@all'|'@exif'|'@ftp'|'@IMAP'|'@internal'|'@ldap'|'@mbreg'|'@mysqli'|'@oci'|'@odbc'|'@openssl'|'@pcntl'|'@pg'|'@posix'|'@snmp'|'@sodium'|'@time'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  sets: list<'@all'|'@exif'|'@ftp'|'@IMAP'|'@internal'|'@ldap'|'@mbreg'|'@mysqli'|'@oci'|'@odbc'|'@openssl'|'@pcntl'|'@pg'|'@posix'|'@snmp'|'@sodium'|'@time'>\n * }\n *\/","12969":"\/**\n     * @var array<string, array{string, int}|string> stores alias (key) - master (value) functions mapping\n     *\/","12971":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before ImplodeCallFixer, PhpUnitDedicateAssertFixer.\n     *\/","12974":"\/**\n * @author Sullivan Senechal <soullivaneuh@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  use?: 'echo'|'print'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  use: 'echo'|'print'\n * }\n *\/","12975":"\/**\n     * @var T_ECHO|T_PRINT\n     *\/","12977":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after EchoTagSyntaxFixer.\n     *\/","12980":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BinaryOperatorSpacesFixer, MethodArgumentSpaceFixer, NativeFunctionCasingFixer, NoSpacesAfterFunctionNameFixer, NoSpacesInsideParenthesisFixer, SpacesInsideParenthesesFixer.\n     *\/","12981":"\/**\n     * @return list<array{int, int, int}>\n     *\/","12982":"\/**\n     * @param array<int, int> $arguments\n     *\n     * @return int number of tokens added to the collection\n     *\/","12983":"\/**\n     * @return list<int>\n     *\/","12985":"\/**\n * @author Vladimir Reznichenko <kalessil@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  replacements?: array<string, string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  replacements: array<string, string>\n * }\n *\/","12986":"\/**\n     * @var array<string, array<int, int>>\n     *\/","12992":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after NoBinaryStringFixer, NoUselessConcatOperatorFixer.\n     *\/","12993":"\/**\n     * @return list<list<int>>\n     *\/","12995":"\/**\n * @author Gregor Harlan <gharlan@web.de>\n * @author Sebastiaan Stok <s.stok@rollerscapes.net>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  syntax?: 'long'|'short'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  syntax: 'long'|'short'\n * }\n *\/","12996":"\/**\n     * @var CT::T_ARRAY_SQUARE_BRACE_OPEN|T_ARRAY\n     *\/","12998":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BinaryOperatorSpacesFixer, SingleSpaceAfterConstructFixer, SingleSpaceAroundConstructFixer, TernaryOperatorSpacesFixer.\n     *\/","13001":"\/**\n * @author Carlos Cirello <carlos.cirello.nl@gmail.com>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n *\/","13002":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BinaryOperatorSpacesFixer, MethodArgumentSpaceFixer.\n     *\/","13003":"\/**\n * @deprecated\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n * @author Sebastiaan Stok <s.stok@rollerscapes.net>\n *\/","13005":"\/**\n * @author Adam Marczuk <adam@marczuk.info>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  after_heredoc?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  after_heredoc: bool\n * }\n *\/","13008":"\/**\n     * Method to fix spacing in array declaration.\n     *\/","13009":"\/**\n     * Method to move index over the non-array elements like function calls or function declarations.\n     *\/","13014":"\/**\n * @author Kuba Wer\u0142os <werlos@gmail.com>\n *\/","13015":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before YieldFromArrayToYieldsFixer.\n     * Must run after PhpUnitDataProviderReturnTypeFixer, PhpdocToReturnTypeFixer.\n     *\/","13016":"\/**\n * @author Jared Henderson <jared@netrivet.com>\n *\/","13017":"\/**\n     * Method to trim leading\/trailing whitespace within single line arrays.\n     *\/","13018":"\/**\n * @author Adam Marczuk <adam@marczuk.info>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  ensure_single_space?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  ensure_single_space: bool\n * }\n *\/","13021":"\/**\n     * Method to move index over the non-array elements like function calls or function declarations.\n     *\n     * @return int New index\n     *\/","13026":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BlankLineBeforeStatementFixer, NoExtraBlankLinesFixer, NoMultipleStatementsPerLineFixer, NoWhitespaceInBlankLineFixer, StatementIndentationFixer.\n     * Must run after ReturnToYieldFromFixer.\n     *\/","13027":"\/**\n     * @return iterable<int, array{int, int}>\n     *\/","13028":"\/**\n     * @return iterable<int>\n     *\/","13029":"\/**\n * @author HypeMC <hypemc@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  use_parentheses?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  use_parentheses: bool\n * }\n *\/","13035":"\/**\n * @author Raffaele Carelle <raffaele.carelle@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-import-type _AttributeItems from AttributeAnalysis\n * @phpstan-import-type _AttributeItem from AttributeAnalysis\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  attributes?: list<class-string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  attributes: list<class-string>\n * }\n *\/","13041":"\/**\n * @author HypeMC <hypemc@gmail.com>\n *\n * @phpstan-import-type _AttributeItems from AttributeAnalysis\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  order?: list<string>,\n *  sort_algorithm?: 'alpha'|'custom'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  order: array<string, int>,\n *  sort_algorithm: 'alpha'|'custom'\n * }\n *\/","13044":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after FullyQualifiedStrictTypesFixer.\n     *\/","13045":"\/**\n     * @param _AttributeItems $attributes\n     *\/","13046":"\/**\n     * @param _AttributeItems $elements\n     *\n     * @return _AttributeItems\n     *\/","13047":"\/**\n     * @param _AttributeItems $elements\n     *\/","13051":"\/**\n * Fixer for rules defined in PSR2 \u00b64.1, \u00b64.4, \u00b65.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @deprecated\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  allow_single_line_anonymous_class_with_empty_body?: bool,\n *  allow_single_line_closure?: bool,\n *  position_after_anonymous_constructs?: 'next'|'same',\n *  position_after_control_structures?: 'next'|'same',\n *  position_after_functions_and_oop_constructs?: 'next'|'same'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  allow_single_line_anonymous_class_with_empty_body: bool,\n *  allow_single_line_closure: bool,\n *  position_after_anonymous_constructs: 'next'|'same',\n *  position_after_control_structures: 'next'|'same',\n *  position_after_functions_and_oop_constructs: 'next'|'same'\n * }\n *\/","13056":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before HeredocIndentationFixer.\n     * Must run after ClassAttributesSeparationFixer, ClassDefinitionFixer, EmptyLoopBodyFixer, NoAlternativeSyntaxFixer, NoEmptyStatementFixer, NoUselessElseFixer, SingleLineThrowFixer, SingleSpaceAfterConstructFixer, SingleSpaceAroundConstructFixer, SingleTraitInsertPerStatementFixer.\n     *\/","13057":"\/**\n     * @return BracesPositionFixer::NEXT_LINE_UNLESS_NEWLINE_AT_SIGNATURE_END|BracesPositionFixer::SAME_LINE\n     *\/","13060":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  allow_single_line_anonymous_functions?: bool,\n *  allow_single_line_empty_anonymous_classes?: bool,\n *  anonymous_classes_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line',\n *  anonymous_functions_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line',\n *  classes_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line',\n *  control_structures_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line',\n *  functions_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  allow_single_line_anonymous_functions: bool,\n *  allow_single_line_empty_anonymous_classes: bool,\n *  anonymous_classes_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line',\n *  anonymous_functions_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line',\n *  classes_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line',\n *  control_structures_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line',\n *  functions_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line'\n * }\n *\/","13064":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before SingleLineEmptyBodyFixer, StatementIndentationFixer.\n     * Must run after ControlStructureBracesFixer, NoMultipleStatementsPerLineFixer.\n     *\/","13065":"\/** @protected *\/","13069":"\/**\n * @deprecated\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  allow_single_line_anonymous_functions?: bool,\n *  allow_single_line_empty_anonymous_classes?: bool,\n *  anonymous_classes_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line',\n *  anonymous_functions_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line',\n *  classes_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line',\n *  control_structures_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line',\n *  functions_opening_brace?: 'next_line_unless_newline_at_signature_end'|'same_line'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  allow_single_line_anonymous_functions: bool,\n *  allow_single_line_empty_anonymous_classes: bool,\n *  anonymous_classes_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line',\n *  anonymous_functions_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line',\n *  classes_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line',\n *  control_structures_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line',\n *  functions_opening_brace: 'next_line_unless_newline_at_signature_end'|'same_line'\n * }\n *\/","13075":"\/**\n     * @param _AutogeneratedInputConfiguration $configuration\n     *\/","13078":"\/**\n * Fixer for rules defined in PSR1 \u00b62.2.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","13079":"\/**\n * Fixer for rules defined in PSR2 \u00b62.3 Lines: There must not be more than one statement per line.\n *\/","13080":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BracesPositionFixer, CurlyBracesPositionFixer.\n     * Must run after ControlStructureBracesFixer, NoEmptyStatementFixer, YieldFromArrayToYieldsFixer.\n     *\/","13081":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  elements?: list<'arguments'|'array'|'array_destructuring'|'group_import'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  elements: list<'arguments'|'array'|'array_destructuring'|'group_import'>\n * }\n *\/","13087":"\/**\n * Removes Zero-width space (ZWSP), Non-breaking space (NBSP) and other invisible unicode symbols.\n *\n * @author Ivan Boprzenkov <ivan.borzenkov@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  use_escape_sequences_in_strings?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  use_escape_sequences_in_strings: bool\n * }\n *\/","13088":"\/**\n     * @var list<int>\n     *\/","13089":"\/**\n     * @var array<string, array{string, string}>\n     *\/","13094":"\/**\n * Let's you add underscores to numeric literals.\n *\n * Inspired by:\n * - {@link https:\/\/github.com\/kubawerlos\/php-cs-fixer-custom-fixers\/blob\/main\/src\/Fixer\/NumericLiteralSeparatorFixer.php}\n * - {@link https:\/\/github.com\/sindresorhus\/eslint-plugin-unicorn\/blob\/main\/rules\/numeric-separators-style.js}\n *\n * @author Marvin Heilemann <marvin.heilemann+github@googlemail.com>\n * @author Greg Korba <greg@codito.dev>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  override_existing?: bool,\n *  strategy?: 'no_separator'|'use_separator'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  override_existing: bool,\n *  strategy: 'no_separator'|'use_separator'\n * }\n *\/","13100":"\/**\n * @author Jordi Boggiano <j.boggiano@seld.be>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n * @author Bram Gotink <bram@gotink.me>\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n * @author Kuba Wer\u0142os <werlos@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  dir?: null|string\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  dir: null|string\n * }\n *\/","13103":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before SelfAccessorFixer.\n     *\/","13106":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after BracesPositionFixer, ClassDefinitionFixer, CurlyBracesPositionFixer, NoUselessReturnFixer.\n     *\/","13108":"\/**\n * Fixer for constants case.\n *\n * @author Pol Dellaiera <pol.dellaiera@protonmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  case?: 'lower'|'upper'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  case: 'lower'|'upper'\n * }\n *\/","13109":"\/**\n     * Hold the function that will be used to convert the constants.\n     *\n     * @var callable\n     *\/","13113":"\/**\n * Fixer for rules defined in PSR2 \u00b62.5.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","13115":"\/**\n * @author ntzm\n *\/","13116":"\/**\n     * @return array<int, string>\n     *\/","13119":"\/**\n     * @phpstan-assert-if-true key-of<self::MAGIC_NAMES> $name\n     *\/","13120":"\/**\n     * @param key-of<self::MAGIC_NAMES> $name name of a magic method\n     *\n     * @return value-of<self::MAGIC_NAMES>\n     *\/","13121":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after FunctionToConstantFixer, NoUselessSprintfFixer, PowToExponentiationFixer.\n     *\/","13123":"\/**\n * @deprecated in favor of NativeTypeDeclarationCasingFixer\n *\/","13125":"\/**\n     * https:\/\/secure.php.net\/manual\/en\/functions.arguments.php#functions.arguments.type-declaration.\n     *\n     * self     PHP 5.0\n     * array    PHP 5.1\n     * callable PHP 5.4\n     * bool     PHP 7.0\n     * float    PHP 7.0\n     * int      PHP 7.0\n     * string   PHP 7.0\n     * iterable PHP 7.1\n     * void     PHP 7.1\n     * object   PHP 7.2\n     * static   PHP 8.0 (return type only)\n     * mixed    PHP 8.0\n     * false    PHP 8.0 (union return type only)\n     * null     PHP 8.0 (union return type only)\n     * never    PHP 8.1 (return type only)\n     * true     PHP 8.2 (standalone type: https:\/\/wiki.php.net\/rfc\/true-type)\n     * false    PHP 8.2 (standalone type: https:\/\/wiki.php.net\/rfc\/null-false-standalone-types)\n     * null     PHP 8.2 (standalone type: https:\/\/wiki.php.net\/rfc\/null-false-standalone-types)\n     *\n     * @var array<string, true>\n     *\/","13126":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  space?: 'none'|'single'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  space: 'none'|'single'\n * }\n *\/","13129":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after NoShortBoolCastFixer.\n     *\/","13133":"\/**\n * @author Vladimir Reznichenko <kalessil@gmail.com>\n *\/","13134":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoUnneededControlParenthesesFixer.\n     *\/","13136":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before CastSpacesFixer.\n     *\/","13137":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BinaryOperatorSpacesFixer.\n     *\/","13138":"\/**\n * Make sure there is one blank line above and below class elements.\n *\n * The exception is when an element is the first or last item in a 'classy'.\n *\n * @phpstan-type _Class array{\n *      index: int,\n *      open: int,\n *      close: int,\n *      elements: non-empty-list<_Element>\n *  }\n * @phpstan-type _Element array{token: Token, type: string, index: int, start?: int, end?: int}\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  elements?: array<string, string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  elements: array<string, string>\n * }\n *\/","13143":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BracesFixer, IndentationTypeFixer, NoExtraBlankLinesFixer, StatementIndentationFixer.\n     * Must run after OrderedClassElementsFixer, PhpUnitDataProviderMethodOrderFixer, SingleClassElementPerStatementFixer, VisibilityRequiredFixer.\n     *\/","13144":"\/**\n     * Fix spacing above an element of a class, interface or trait.\n     *\n     * Deals with comments, PHPDocs and spaces above the element with respect to the position of the\n     * element within the class, interface or trait.\n     *\n     * @param _Class $class\n     *\/","13145":"\/**\n     * @param _Class $class\n     *\/","13147":"\/**\n     * @TODO Introduce proper DTO instead of an array\n     *\n     * @return \\Generator<_Class>\n     *\/","13148":"\/**\n     * including trailing single line comments if belonging to the class element.\n     *\n     * @param _Class   $class\n     * @param _Element $element\n     *\/","13152":"\/**\n * Fixer for part of the rules defined in PSR2 \u00b64.1 Extends and Implements and PSR12 \u00b68. Anonymous Classes.\n *\n * @phpstan-type _ClassExtendsInfo array{start: int, numberOfExtends: int, multiLine: bool}\n * @phpstan-type _ClassImplementsInfo array{start: int, numberOfImplements: int, multiLine: bool}\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  inline_constructor_arguments?: bool,\n *  multi_line_extends_each_single_line?: bool,\n *  single_item_single_line?: bool,\n *  single_line?: bool,\n *  space_before_parenthesis?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  inline_constructor_arguments: bool,\n *  multi_line_extends_each_single_line: bool,\n *  single_item_single_line: bool,\n *  single_line: bool,\n *  space_before_parenthesis: bool\n * }\n *\/","13155":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BracesFixer, SingleLineEmptyBodyFixer.\n     * Must run after NewWithBracesFixer, NewWithParenthesesFixer.\n     *\/","13156":"\/**\n     * @param int $classyIndex Class definition token start index\n     *\/","13157":"\/**\n     * @param _ClassExtendsInfo $classExtendsInfo\n     *\n     * @return _ClassExtendsInfo\n     *\/","13158":"\/**\n     * @param _ClassImplementsInfo $classImplementsInfo\n     *\n     * @return _ClassImplementsInfo\n     *\/","13159":"\/**\n     * @param array{\n     *      start: int,\n     *      classy: int,\n     *      open: int,\n     *      extends: false|_ClassExtendsInfo,\n     *      implements: false|_ClassImplementsInfo,\n     *      anonymousClass: bool,\n     *      final: false|int,\n     *      abstract: false|int,\n     *      readonly: false|int,\n     *  } $classDefInfo\n     *\/","13160":"\/**\n     * @return array{\n     *     start: int,\n     *     classy: int,\n     *     open: int,\n     *     extends: false|_ClassExtendsInfo,\n     *     implements: false|_ClassImplementsInfo,\n     *     anonymousClass: bool,\n     *     final: false|int,\n     *     abstract: false|int,\n     *     readonly: false|int,\n     * }\n     *\/","13161":"\/**\n     * @return array<string, 1>|array{start: int, multiLine: bool}\n     *\/","13162":"\/**\n     * @param array{\n     *     final: false|int,\n     *     abstract: false|int,\n     *     readonly: false|int,\n     * } $classDefInfo\n     *\/","13168":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before ProtectedToPrivateFixer, SelfStaticAccessorFixer.\n     *\/","13169":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  annotation_exclude?: list<string>,\n *  annotation_include?: list<string>,\n *  consider_absent_docblock_as_internal_class?: bool,\n *  exclude?: list<string>,\n *  include?: list<string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  annotation_exclude: array<string, string>,\n *  annotation_include: array<string, string>,\n *  consider_absent_docblock_as_internal_class: bool,\n *  exclude: array<string, string>,\n *  include: array<string, string>\n * }\n *\/","13172":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before ProtectedToPrivateFixer, SelfStaticAccessorFixer.\n     * Must run after PhpUnitInternalClassFixer.\n     *\/","13173":"\/**\n     * @param int $index T_CLASS index\n     *\/","13174":"\/**\n     * @param array<string, bool> $attributes\n     *\/","13178":"\/**\n     * @var array<string, true>\n     *\/","13179":"\/**\n * @author Ceeram <ceeram@cakephp.org>\n *\/","13180":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after OrderedClassElementsFixer, PhpUnitDataProviderMethodOrderFixer.\n     *\/","13181":"\/**\n     * Cleanup a whitespace token.\n     *\/","13184":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before OrderedClassElementsFixer.\n     *\/","13185":"\/**\n     * Fix constructor within a class, if possible.\n     *\n     * @param Tokens $tokens     the Tokens instance\n     * @param string $className  the class name\n     * @param int    $classStart the class start index\n     * @param int    $classEnd   the class end index\n     *\/","13186":"\/**\n     * Fix calls to the parent constructor within a class.\n     *\n     * @param Tokens $tokens     the Tokens instance\n     * @param int    $classStart the class start index\n     * @param int    $classEnd   the class end index\n     *\/","13187":"\/**\n     * Fix a particular infinite recursion issue happening when the parent class has __construct and the child has only\n     * a PHP4 constructor that calls the parent constructor as $this->__construct().\n     *\n     * @param Tokens $tokens the Tokens instance\n     * @param int    $start  the PHP4 constructor body start\n     * @param int    $end    the PHP4 constructor body end\n     *\/","13188":"\/**\n     * Generate the sequence of tokens necessary for the body of a wrapper method that simply\n     * calls $this->{$method}( [args...] ) with the same arguments as its own signature.\n     *\n     * @param Tokens $tokens     the Tokens instance\n     * @param string $method     the wrapped method name\n     * @param int    $startIndex function\/method start index\n     * @param int    $bodyIndex  function\/method body index\n     *\n     * @return array{list<list<array{int, string}|int|string>>, array{3: false}}\n     *\/","13189":"\/**\n     * Find a function or method matching a given name within certain bounds.\n     *\n     * Returns:\n     * - nameIndex (int): The index of the function\/method name.\n     * - startIndex (int): The index of the function\/method start.\n     * - endIndex (int): The index of the function\/method end.\n     * - bodyIndex (int): The index of the function\/method body.\n     * - modifiers (array): The modifiers as array keys and their index as the values, e.g. array(T_PUBLIC => 10)\n     *\n     * @param Tokens $tokens     the Tokens instance\n     * @param string $name       the function\/Method name\n     * @param int    $startIndex the search start index\n     * @param int    $endIndex   the search end index\n     *\n     * @return null|array{\n     *     nameIndex: int,\n     *     startIndex: int,\n     *     endIndex: int,\n     *     bodyIndex: int,\n     *     modifiers: list<int>,\n     * }\n     *\/","13190":"\/**\n * @author Filippo Tessarotto <zoeslam@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  private_methods?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  private_methods: bool\n * }\n *\/","13193":"\/**\n     * @return \\Generator<array{\n     *     classIndex: int,\n     *     token: Token,\n     *     type: string,\n     *     class_is_final?: bool,\n     *     method_final_index: int|null,\n     *     method_is_constructor?: bool,\n     *     method_is_private: bool,\n     *     method_of_enum: bool\n     * }>\n     *\/","13197":"\/**\n * @author Gregor Harlan <gharlan@web.de>\n *\n * @phpstan-type _ClassElement array{\n *  start: int,\n *  visibility: string,\n *  abstract: bool,\n *  static: bool,\n *  readonly: bool,\n *  type: string,\n *  name: string,\n *  end: int,\n * }\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  case_sensitive?: bool,\n *  order?: list<string>,\n *  sort_algorithm?: 'alpha'|'none'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  case_sensitive: bool,\n *  order: list<string>,\n *  sort_algorithm: 'alpha'|'none'\n * }\n *\/","13200":"\/**\n     * @var array<string, null|list<string>> Array containing all class element base types (keys) and their parent types (values)\n     *\/","13201":"\/**\n     * @var array<string, null> Array containing special method types\n     *\/","13202":"\/**\n     * @var array<string, int> Resolved configuration array (type => position)\n     *\/","13204":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before ClassAttributesSeparationFixer, NoBlankLinesAfterClassOpeningFixer, PhpUnitDataProviderMethodOrderFixer, SpaceAfterSemicolonFixer.\n     * Must run after NoPhp4ConstructorFixer, ProtectedToPrivateFixer.\n     *\/","13205":"\/**\n     * @return list<_ClassElement>\n     *\/","13206":"\/**\n     * @return list<string>|string type or array of type and name\n     *\/","13207":"\/**\n     * @param list<_ClassElement> $elements\n     *\n     * @return list<_ClassElement>\n     *\/","13208":"\/**\n     * @param _ClassElement $a\n     * @param _ClassElement $b\n     *\/","13209":"\/**\n     * @param list<_ClassElement> $elements\n     *\/","13212":"\/**\n * @author Dave van der Brugge <dmvdbrugge@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  case_sensitive?: bool,\n *  direction?: 'ascend'|'descend',\n *  order?: 'alpha'|'length'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  case_sensitive: bool,\n *  direction: 'ascend'|'descend',\n *  order: 'alpha'|'length'\n * }\n *\/","13219":"\/**\n     * Array of supported directions in configuration.\n     *\n     * @var list<string>\n     *\/","13220":"\/**\n     * Array of supported orders in configuration.\n     *\n     * @var list<string>\n     *\/","13223":"\/**\n     * @return array<int, list<Token>>\n     *\/","13227":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  case_sensitive?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  case_sensitive: bool\n * }\n *\/","13230":"\/**\n     * @return iterable<array<int, Tokens>>\n     *\/","13231":"\/**\n     * @param array<int, Tokens> $uses\n     *\/","13232":"\/**\n     * @param array<int, Tokens> $elements\n     *\/","13236":"\/**\n * @author John Paul E. Balandan, CPA <paulbalandan@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  case_sensitive?: bool,\n *  null_adjustment?: 'always_first'|'always_last'|'none',\n *  sort_algorithm?: 'alpha'|'none'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  case_sensitive: bool,\n *  null_adjustment: 'always_first'|'always_last'|'none',\n *  sort_algorithm: 'alpha'|'none'\n * }\n *\/","13239":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before TypesSpacesFixer.\n     * Must run after NullableTypeDeclarationFixer, NullableTypeDeclarationForDefaultNullValueFixer.\n     *\/","13240":"\/**\n     * @return array<int, string>\n     *\n     * @phpstan-return array<int, 'catch'|'method'|'property'>\n     *\/","13241":"\/**\n     * @return array{0: list<list<string>|string>, 1: string}\n     *\/","13242":"\/**\n     * @return array{0: list<string>, 1: string}\n     *\/","13243":"\/**\n     * @param list<list<string>|string> $types\n     *\n     * @return ($types is list<string> ? list<string> : list<list<string>>)\n     *\/","13244":"\/**\n     * @param list<list<string>|string> $types\n     *\n     * @return list<Token>\n     *\/","13248":"\/**\n * @author Marcel Behrmann <marcel@behrmann.dev>\n *\/","13249":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoEmptyPhpdocFixer, NoExtraBlankLinesFixer, PhpdocAlignFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","13251":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before OrderedClassElementsFixer.\n     * Must run after FinalClassFixer, FinalInternalClassFixer.\n     *\/","13252":"\/**\n     * Consider symbol as candidate for fixing if it's:\n     *   - an Enum (PHP8.1+)\n     *   - a class, which:\n     *     - is not anonymous\n     *     - is final\n     *     - does not use traits\n     *     - does not extend other class.\n     *\/","13253":"\/**\n * @author Gregor Harlan <gharlan@web.de>\n *\/","13254":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after PsrAutoloadingFixer.\n     *\/","13255":"\/**\n     * Replace occurrences of the name of the classy element by \"self\" (if possible).\n     *\/","13256":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after FinalClassFixer, FinalInternalClassFixer, FunctionToConstantFixer, PhpUnitTestCaseStaticMethodCallsFixer.\n     *\/","13257":"\/**\n * Fixer for rules defined in PSR2 \u00b64.2.\n *\n * @author Javier Spagnoletti <phansys@gmail.com>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  elements?: list<'const'|'property'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  elements: list<'const'|'property'>\n * }\n *\/","13260":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before ClassAttributesSeparationFixer.\n     *\/","13265":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BracesFixer, SpaceAfterSemicolonFixer.\n     *\/","13266":"\/**\n     * @param list<int> $candidates ',' indices to fix\n     *\/","13268":"\/**\n * Fixer for rules defined in PSR2 \u00b64.3, \u00b64.5.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  elements?: list<'const'|'method'|'property'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  elements: list<'const'|'method'|'property'>\n * }\n *\/","13276":"\/**\n * @author Kuba Wer\u0142os <werlos@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  ignored_tags?: list<string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  ignored_tags: list<string>\n * }\n *\/","13279":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocArrayTypeFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocListTypeFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToCommentFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer.\n     * Must run after AlignMultilineCommentFixer.\n     *\/","13280":"\/**\n     * @param list<int> $indices\n     *\/","13281":"\/**\n     * @param non-empty-list<int> $indices\n     *\/","13285":"\/**\n * @author Antonio J. Garc\u00eda Lagar <aj@garcialagar.es>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  comment_type?: 'PHPDoc'|'comment',\n *  header: string,\n *  location?: 'after_declare_strict'|'after_open',\n *  separate?: 'both'|'bottom'|'none'|'top',\n *  validator?: null|string\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  comment_type: 'PHPDoc'|'comment',\n *  header: string,\n *  location: 'after_declare_strict'|'after_open',\n *  separate: 'both'|'bottom'|'none'|'top',\n *  validator: null|string\n * }\n *\/","13289":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BlankLinesBeforeNamespaceFixer, SingleBlankLineBeforeNamespaceFixer, SingleLineCommentStyleFixer.\n     * Must run after DeclareStrictTypesFixer, NoBlankLinesAfterPhpdocFixer.\n     *\/","13290":"\/**\n     * Enclose the given text in a comment block.\n     *\/","13291":"\/**\n     * Find the index where the header comment must be inserted.\n     *\/","13296":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoExtraBlankLinesFixer, NoTrailingWhitespaceFixer, NoWhitespaceInBlankLineFixer.\n     * Must run after PhpdocToCommentFixer.\n     *\/","13297":"\/**\n     * Return the start index, end index and a flag stating if the comment block is empty.\n     *\n     * @param int $index T_COMMENT index\n     *\n     * @return array{blockStart: int, blockEnd: int, isEmpty: bool}\n     *\/","13299":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after PhpdocNoUselessInheritdocFixer.\n     *\/","13300":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after PhpdocToCommentFixer.\n     *\/","13301":"\/**\n * @author Filippo Tessarotto <zoeslam@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  comment_types?: list<'asterisk'|'hash'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  comment_types: list<'asterisk'|'hash'>\n * }\n *\/","13304":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after HeaderCommentFixer, NoUselessReturnFixer, PhpdocToCommentFixer.\n     *\/","13307":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @template TFixerInputConfig of array<string, mixed>\n * @template TFixerComputedConfig of array<string, mixed>\n *\/","13311":"\/**\n     * Check if fixer is risky or not.\n     *\n     * Risky fixer could change code behavior!\n     *\/","13312":"\/**\n     * Fixes a file.\n     *\n     * @param \\SplFileInfo $file   A \\SplFileInfo instance\n     * @param Tokens       $tokens Tokens collection\n     *\/","13314":"\/**\n     * Returns the name of the fixer.\n     *\n     * The name must be all lowercase and without any spaces.\n     *\n     * @return string The name of the fixer\n     *\/","13315":"\/**\n     * Returns the priority of the fixer.\n     *\n     * The default priority is 0 and higher priorities are executed first.\n     *\/","13316":"\/**\n     * Returns true if the file is supported by this fixer.\n     *\n     * @return bool true if the file is supported by this fixer, false otherwise\n     *\/","13317":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\n * @template TFixerInputConfig of array<string, mixed>\n * @template TFixerComputedConfig of array<string, mixed>\n *\/","13322":"\/**\n * @author Filippo Tessarotto <zoeslam@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  exclude?: list<string>,\n *  fix_built_in?: bool,\n *  include?: list<string>,\n *  scope?: 'all'|'namespaced',\n *  strict?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  exclude: list<string>,\n *  fix_built_in: bool,\n *  include: list<string>,\n *  scope: 'all'|'namespaced',\n *  strict: bool\n * }\n *\/","13326":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before GlobalNamespaceImportFixer.\n     * Must run after FunctionToConstantFixer.\n     *\/","13329":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BracesPositionFixer, ControlStructureContinuationPositionFixer, CurlyBracesPositionFixer, NoMultipleStatementsPerLineFixer.\n     *\/","13333":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  position?: 'next_line'|'same_line'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  position: 'next_line'|'same_line'\n * }\n *\/","13337":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after ControlStructureBracesFixer.\n     *\/","13341":"\/**\n * Fixer for rules defined in PSR2 \u00b65.1.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","13342":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after NoAlternativeSyntaxFixer.\n     *\/","13343":"\/**\n     * Replace all `else if` (T_ELSE T_IF) with `elseif` (T_ELSEIF).\n     *\n     * {@inheritdoc}\n     *\/","13344":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  style?: 'braces'|'semicolon'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  style: 'braces'|'semicolon'\n * }\n *\/","13347":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BracesFixer, NoExtraBlankLinesFixer, NoTrailingWhitespaceFixer.\n     * Must run after NoEmptyStatementFixer.\n     *\/","13351":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  style?: 'for'|'while'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  style: 'for'|'while'\n * }\n *\/","13354":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoExtraBlankLinesFixer, NoTrailingWhitespaceFixer.\n     *\/","13355":"\/**\n     * @param list<Token> $replacement\n     *\/","13359":"\/**\n * @author Sebastiaan Stok <s.stok@rollerscapes.net>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n * @author Kuba Wer\u0142os <werlos@gmail.com>\n *\/","13360":"\/**\n     * @param array<int, array{begin: int, braces: ?array{open: int, close: int}, end: int}> $includies\n     *\/","13361":"\/**\n     * @return array<int, array{begin: int, braces: ?array{open: int, close: int}, end: int}>\n     *\/","13362":"\/**\n * @author Eddilbert Macharia <edd.cowan@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  fix_non_monolithic_code?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  fix_non_monolithic_code: bool\n * }\n *\/","13365":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BracesFixer, ElseifFixer, NoSuperfluousElseifFixer, NoUnneededControlParenthesesFixer, NoUselessElseFixer, SwitchContinueToBreakFixer.\n     *\/","13366":"\/**\n     * Handle both extremes of the control structures.\n     * e.g. if(): or endif;.\n     *\n     * @param int    $index  the index of the token being processed\n     * @param Token  $token  the token being processed\n     * @param Tokens $tokens the collection of tokens\n     *\/","13367":"\/**\n     * Handle the else: cases.\n     *\n     * @param int    $index  the index of the token being processed\n     * @param Token  $token  the token being processed\n     * @param Tokens $tokens the collection of tokens\n     *\/","13368":"\/**\n     * Handle the elsif(): cases.\n     *\n     * @param int    $index  the index of the token being processed\n     * @param Token  $token  the token being processed\n     * @param Tokens $tokens the collection of tokens\n     *\/","13369":"\/**\n     * Add opening and closing braces to the else: and elseif: cases.\n     *\n     * @param Tokens $tokens     the tokens collection\n     * @param Token  $token      the current token\n     * @param int    $index      the current token index\n     * @param int    $colonIndex the index of the colon\n     *\/","13373":"\/**\n * Fixer for rule defined in PSR2 \u00b65.2.\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  comment_text?: string\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  comment_text: string\n * }\n *\/","13376":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after NoUselessElseFixer.\n     *\/","13377":"\/**\n     * @return int The newline token position\n     *\/","13382":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before SimplifiedIfReturnFixer.\n     * Must run after NoAlternativeSyntaxFixer.\n     *\/","13383":"\/**\n * @deprecated\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","13385":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  namespaces?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  namespaces: bool\n * }\n *\/","13388":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoUselessElseFixer, NoUselessReturnFixer, ReturnAssignmentFixer, SimplifiedIfReturnFixer.\n     *\/","13389":"\/**\n     * @param int $openIndex  index of `{` token\n     * @param int $closeIndex index of `}` token\n     *\/","13391":"\/**\n     * @param int $index index of `{` token\n     *\/","13395":"\/**\n * @author Sullivan Senechal <soullivaneuh@gmail.com>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n * @author Gregor Harlan <gharlan@web.de>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  statements?: list<'break'|'clone'|'continue'|'echo_print'|'negative_instanceof'|'others'|'return'|'switch_case'|'yield'|'yield_from'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  statements: list<'break'|'clone'|'continue'|'echo_print'|'negative_instanceof'|'others'|'return'|'switch_case'|'yield'|'yield_from'>\n * }\n *\/","13397":"\/**\n     * @var list<array{int}|string>\n     *\/","13399":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before ConcatSpaceFixer, NoTrailingWhitespaceFixer.\n     * Must run after ModernizeTypesCastingFixer, NoAlternativeSyntaxFixer.\n     *\/","13400":"\/**\n     * @return null|array{type: Tokens::BLOCK_TYPE_*, isStart: bool}\n     *\/","13404":"\/**\n * @deprecated\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  namespaces?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  namespaces: bool\n * }\n *\/","13412":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BlankLineBeforeStatementFixer, BracesFixer, CombineConsecutiveUnsetsFixer, NoBreakCommentFixer, NoExtraBlankLinesFixer, NoTrailingWhitespaceFixer, NoUselessReturnFixer, NoWhitespaceInBlankLineFixer, SimplifiedIfReturnFixer, StatementIndentationFixer.\n     * Must run after NoAlternativeSyntaxFixer, NoEmptyStatementFixer, NoUnneededBracesFixer, NoUnneededCurlyBracesFixer.\n     *\/","13413":"\/**\n     * Remove tokens part of an `else` statement if not empty (i.e. no meaningful tokens inside).\n     *\n     * @param int $index T_ELSE index\n     *\/","13414":"\/**\n     * @param int $index index of T_ELSE\n     *\/","13416":"\/**\n     * @var list<array{isNegative: bool, sequence: non-empty-list<array{0: int, 1?: string}|string>}>\n     *\/","13417":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before MultilineWhitespaceBeforeSemicolonsFixer, NoSinglelineWhitespaceBeforeSemicolonsFixer.\n     * Must run after NoSuperfluousElseifFixer, NoUnneededBracesFixer, NoUnneededCurlyBracesFixer, NoUselessElseFixer, SemicolonAfterInstructionFixer.\n     *\/","13418":"\/**\n * Fixer for rules defined in PSR2 \u00b65.2.\n *\/","13419":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after NoEmptyStatementFixer.\n     *\/","13420":"\/**\n * Fixer for rules defined in PSR2 \u00b65.2.\n *\n * @author Sullivan Senechal <soullivaneuh@gmail.com>\n *\/","13423":"\/**\n     * @param int $depth >= 0\n     *\/","13424":"\/**\n * @author Sebastiaan Stok <s.stok@rollerscapes.net>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n * @author Kuba Wer\u0142os <werlos@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  after_heredoc?: bool,\n *  elements?: list<'arguments'|'array_destructuring'|'arrays'|'match'|'parameters'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  after_heredoc: bool,\n *  elements: list<'arguments'|'array_destructuring'|'arrays'|'match'|'parameters'>\n * }\n *\/","13432":"\/**\n * @author Bram Gotink <bram@gotink.me>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  always_move_variable?: bool,\n *  equal?: bool|null,\n *  identical?: bool|null,\n *  less_and_greater?: bool|null\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  always_move_variable: bool,\n *  equal: bool|null,\n *  identical: bool|null,\n *  less_and_greater: bool|null\n * }\n *\/","13433":"\/**\n     * @var array<int|string, Token>\n     *\/","13434":"\/**\n     * @var array<int|string, null|bool>\n     *\/","13435":"\/**\n     * @var list<int|string>\n     *\/","13437":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after IsNullFixer.\n     *\/","13438":"\/**\n     * Finds the end of the right-hand side of the comparison at the given\n     * index.\n     *\n     * The right-hand side ends when an operator with a lower precedence is\n     * encountered or when the block level for `()`, `{}` or `[]` goes below\n     * zero.\n     *\n     * @param Tokens $tokens The token list\n     * @param int    $index  The index of the comparison\n     *\n     * @return int The last index of the right-hand side of the comparison\n     *\/","13439":"\/**\n     * Finds the start of the left-hand side of the comparison at the given\n     * index.\n     *\n     * The left-hand side ends when an operator with a lower precedence is\n     * encountered or when the block level for `()`, `{}` or `[]` goes below\n     * zero.\n     *\n     * @param Tokens $tokens The token list\n     * @param int    $index  The index of the comparison\n     *\n     * @return int The first index of the left-hand side of the comparison\n     *\/","13440":"\/**\n     * Fixes the comparison at the given index.\n     *\n     * A comparison is considered fixed when\n     * - both sides are a variable (e.g. $a === $b)\n     * - neither side is a variable (e.g. self::CONST === 3)\n     * - only the right-hand side is a variable (e.g. 3 === self::$var)\n     *\n     * If the left-hand side and right-hand side of the given comparison are\n     * swapped, this function runs recursively on the previous left-hand-side.\n     *\n     * @return int an upper bound for all non-fixed comparisons\n     *\/","13441":"\/**\n     * @return null|array{left: array{start: int, end: int}, right: array{start: int, end: int}}\n     *\/","13444":"\/**\n     * Checks whether the given token has a lower precedence than `T_IS_EQUAL`\n     * or `T_IS_IDENTICAL`.\n     *\n     * @param Token $token The token to check\n     *\n     * @return bool Whether the token has a lower precedence\n     *\/","13445":"\/**\n     * Checks whether the given assignment token has a lower precedence than `T_IS_EQUAL`\n     * or `T_IS_IDENTICAL`.\n     *\/","13446":"\/**\n     * Checks whether the tokens between the given start and end describe a\n     * variable.\n     *\n     * @param Tokens $tokens The token list\n     * @param int    $start  The first index of the possible variable\n     * @param int    $end    The last index of the possible variable\n     * @param bool   $strict Enable strict variable detection\n     *\n     * @return bool Whether the tokens describe a variable\n     *\/","13450":"\/**\n     * Returns names of fixers to use instead, if any.\n     *\n     * @return list<string>\n     *\/","13458":"\/**\n * Forces the configured operator for assignment in arrays in Doctrine Annotations.\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  ignored_tags?: list<string>,\n *  operator?: ':'|'='\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  ignored_tags: list<string>,\n *  operator: ':'|'='\n * }\n *\/","13461":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before DoctrineAnnotationSpacesFixer.\n     *\/","13465":"\/**\n * Adds braces to Doctrine annotations when missing.\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  ignored_tags?: list<string>,\n *  syntax?: 'with_braces'|'without_braces'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  ignored_tags: list<string>,\n *  syntax: 'with_braces'|'without_braces'\n * }\n *\/","13471":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  ignored_tags?: list<string>,\n *  indent_mixed_lines?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  ignored_tags: list<string>,\n *  indent_mixed_lines: bool\n * }\n *\/","13474":"\/**\n     * @return array{int, int}\n     *\/","13475":"\/**\n     * @param list<array{int, int}> $annotationPositions Pairs of begin and end indices of main annotations\n     *\/","13479":"\/**\n * Fixes spaces around commas and assignment operators in Doctrine annotations.\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  after_argument_assignments?: bool|null,\n *  after_array_assignments_colon?: bool|null,\n *  after_array_assignments_equals?: bool|null,\n *  around_commas?: bool,\n *  around_parentheses?: bool,\n *  before_argument_assignments?: bool|null,\n *  before_array_assignments_colon?: bool|null,\n *  before_array_assignments_equals?: bool|null,\n *  ignored_tags?: list<string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  after_argument_assignments: bool|null,\n *  after_array_assignments_colon: bool|null,\n *  after_array_assignments_equals: bool|null,\n *  around_commas: bool,\n *  around_parentheses: bool,\n *  before_argument_assignments: bool|null,\n *  before_array_assignments_colon: bool|null,\n *  before_array_assignments_equals: bool|null,\n *  ignored_tags: list<string>\n * }\n *\/","13482":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after DoctrineAnnotationArrayAssignmentFixer.\n     *\/","13494":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n * @author Fabien Potencier <fabien@symfony.com>\n *\/","13502":"\/**\n * @author Gregor Harlan\n *\/","13503":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before MethodArgumentSpaceFixer, NoSpacesInsideParenthesisFixer, SpacesInsideParenthesesFixer.\n     * Must run after DirConstantFixer.\n     *\/","13504":"\/**\n     * @param int      $index                 Index of `dirname`\n     * @param null|int $firstArgumentEndIndex Index of last token of first argument of `dirname` call\n     *\n     * @return array{indices: list<int>, secondArgument?: int, levels: int, end: int}|false `false` when it is not a (supported) `dirname` call, an array with info about the dirname call otherwise\n     *\/","13505":"\/**\n     * @param non-empty-list<array{indices: list<int>, secondArgument?: int, levels: int, end: int}> $dirnameInfoArray\n     *\/","13507":"\/**\n     * @param array<int, int> $arguments\n     *\/","13508":"\/**\n     * @param list<string> $flags\n     *\n     * @return list<string>\n     *\/","13510":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  b_mode?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  b_mode: bool\n * }\n *\/","13517":"\/**\n * Fixer for rules defined in PSR2 generally (\u00b61 and \u00b66).\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  closure_fn_spacing?: 'none'|'one',\n *  closure_function_spacing?: 'none'|'one',\n *  trailing_comma_single_line?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  closure_fn_spacing: 'none'|'one',\n *  closure_function_spacing: 'none'|'one',\n *  trailing_comma_single_line: bool\n * }\n *\/","13521":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before MethodArgumentSpaceFixer.\n     * Must run after SingleSpaceAfterConstructFixer, SingleSpaceAroundConstructFixer, UseArrowFunctionsFixer.\n     *\/","13525":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @deprecated\n *\/","13528":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before MethodArgumentSpaceFixer.\n     * Must run after NoAliasFunctionsFixer.\n     *\/","13529":"\/**\n     * @return array<int, int> In the format: startIndex => endIndex\n     *\/","13530":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before MethodArgumentSpaceFixer, NoSpacesInsideParenthesisFixer, SpacesInsideParenthesesFixer.\n     *\/","13531":"\/**\n     * @param array<string, int> $imports\n     *\n     * @return array<string, int>\n     *\/","13532":"\/**\n     * @param array<string, int> $imports\n     * @param array<int, int>    $arguments\n     *\n     * @return array<string, int>\n     *\/","13533":"\/**\n     * @return false|int\n     *\/","13534":"\/**\n     * @param array<int, int> $arguments\n     *\n     * @return array<string, int>\n     *\/","13535":"\/**\n     * @param array<string, int> $imports\n     *\/","13536":"\/**\n     * Remove `use` and all imported variables.\n     *\/","13537":"\/**\n * @author Kuanhung Chen <ericj.tw@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  after_heredoc?: bool,\n *  attribute_placement?: 'ignore'|'same_line'|'standalone',\n *  keep_multiple_spaces_after_comma?: bool,\n *  on_multiline?: 'ensure_fully_multiline'|'ensure_single_line'|'ignore'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  after_heredoc: bool,\n *  attribute_placement: 'ignore'|'same_line'|'standalone',\n *  keep_multiple_spaces_after_comma: bool,\n *  on_multiline: 'ensure_fully_multiline'|'ensure_single_line'|'ignore'\n * }\n *\/","13540":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before ArrayIndentationFixer, StatementIndentationFixer.\n     * Must run after CombineNestedDirnameFixer, FunctionDeclarationFixer, ImplodeCallFixer, LambdaNotUsedImportFixer, NoMultilineWhitespaceAroundDoubleArrowFixer, NoUselessSprintfFixer, PowToExponentiationFixer, StrictParamFixer.\n     *\/","13541":"\/**\n     * Fix arguments spacing for given function.\n     *\n     * @param Tokens $tokens             Tokens to handle\n     * @param int    $startFunctionIndex Start parenthesis position\n     *\n     * @return bool whether the function is multiline\n     *\/","13542":"\/**\n     * @return bool Whether newlines were removed from the whitespace token\n     *\/","13543":"\/**\n     * Method to insert newline after comma, attribute or opening parenthesis.\n     *\n     * @param int    $index       index of a comma\n     * @param string $indentation the indentation that should be used\n     * @param bool   $override    whether to override the existing character or not\n     *\/","13544":"\/**\n     * Method to insert space after comma and remove space before comma.\n     *\/","13545":"\/**\n     * Check if last item of current line is a comment.\n     *\n     * @param Tokens $tokens tokens to handle\n     * @param int    $index  index of token\n     *\/","13546":"\/**\n     * Checks if token is new line.\n     *\/","13550":"\/**\n * @author Andreas M\u00f6ller <am@localheinz.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  exclude?: list<string>,\n *  include?: list<string>,\n *  scope?: 'all'|'namespaced',\n *  strict?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  exclude: list<string>,\n *  include: list<string>,\n *  scope: 'all'|'namespaced',\n *  strict: bool\n * }\n *\/","13552":"\/**\n     * Subset of SET_INTERNAL.\n     *\n     * Change function call to functions known to be optimized by the Zend engine.\n     * For details:\n     * - @see https:\/\/github.com\/php\/php-src\/blob\/php-7.2.6\/Zend\/zend_compile.c \"zend_try_compile_special_func\"\n     * - @see https:\/\/github.com\/php\/php-src\/blob\/php-7.2.6\/ext\/opcache\/Optimizer\/pass1_5.c\n     *\n     * @internal\n     *\/","13556":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before GlobalNamespaceImportFixer.\n     * Must run after BacktickToShellExecFixer, MbStrFunctionsFixer, RegularCallableCallFixer, StrictParamFixer.\n     *\/","13557":"\/**\n     * @return array<string, true> normalized function names of which the PHP compiler optimizes\n     *\/","13558":"\/**\n     * @return array<string, true> normalized function names of all internal defined functions\n     *\/","13559":"\/**\n     * @param list<string> $functionNames\n     *\n     * @return array<string, true> all function names lower cased\n     *\/","13562":"\/**\n * Fixer for rules defined in PSR2 \u00b64.6.\n *\n * @author Varga Bence <vbence@czentral.org>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","13563":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before FunctionToConstantFixer, GetClassToClassKeywordFixer.\n     * Must run after PowToExponentiationFixer.\n     *\/","13564":"\/**\n     * Fixes whitespaces around braces of a function(y) call.\n     *\n     * @param Tokens $tokens tokens to handle\n     * @param int    $index  index of token\n     *\/","13565":"\/**\n     * @return list<array{int}|string>\n     *\/","13566":"\/**\n     * Gets the token kinds which can work as function calls.\n     *\n     * @return list<int> Token names\n     *\/","13567":"\/**\n     * Gets the token kinds of actually language construction.\n     *\n     * @return list<int>\n     *\/","13568":"\/**\n * @deprecated\n *\/","13570":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoSpacesInsideParenthesisFixer.\n     *\/","13571":"\/**\n * @author Mark Scherer\n * @author Lucas Manzke <lmanzke@outlook.com>\n * @author Gregor Harlan <gharlan@web.de>\n *\/","13572":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after NullableTypeDeclarationForDefaultNullValueFixer.\n     *\/","13573":"\/**\n     * @param int $index Index of \"=\"\n     *\/","13574":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before MethodArgumentSpaceFixer, NativeFunctionCasingFixer, NoEmptyStatementFixer, NoExtraBlankLinesFixer, NoSpacesInsideParenthesisFixer, SpacesInsideParenthesesFixer.\n     *\/","13575":"\/**\n * @author HypeMC <hypemc@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  use_nullable_type_declaration?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  use_nullable_type_declaration: bool\n * }\n *\/","13578":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoUnreachableDefaultArgumentValueFixer, NullableTypeDeclarationFixer, OrderedTypesFixer.\n     *\/","13579":"\/**\n     * @param array<string, ArgumentAnalysis> $arguments\n     *\/","13583":"\/**\n * @author Jan Gantzert <jan@familie-gantzert.de>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  scalar_types?: bool,\n *  types_map?: array<string, string>,\n *  union_types?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  scalar_types: bool,\n *  types_map: array<string, string>,\n *  union_types: bool\n * }\n *\/","13584":"\/**\n     * @var list<array{int, string}>\n     *\/","13587":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoSuperfluousPhpdocTagsFixer, PhpdocAlignFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","13588":"\/**\n     * Determine whether the function already has a param type hint.\n     *\n     * @param int $index The index of the end of the function definition line, EG at { or ;\n     *\/","13596":"\/**\n * @phpstan-import-type _CommonTypeInfo from AbstractPhpdocToTypeDeclarationFixer\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  scalar_types?: bool,\n *  types_map?: array<string, string>,\n *  union_types?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  scalar_types: bool,\n *  types_map: array<string, string>,\n *  union_types: bool\n * }\n *\/","13599":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before FullyQualifiedStrictTypesFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAlignFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","13600":"\/**\n     * @return array<string, int>\n     *\/","13601":"\/**\n     * @param array<string, int> $propertyIndices\n     * @param list<Annotation>   $annotations\n     *\n     * @return ?_CommonTypeInfo\n     *\/","13609":"\/**\n * @author Filippo Tessarotto <zoeslam@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  scalar_types?: bool,\n *  types_map?: array<string, string>,\n *  union_types?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  scalar_types: bool,\n *  types_map: array<string, string>,\n *  union_types: bool\n * }\n *\/","13610":"\/**\n     * @var array<int, array<int, int|string>>\n     *\/","13613":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before FullyQualifiedStrictTypesFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAlignFixer, ReturnToYieldFromFixer, ReturnTypeDeclarationFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","13614":"\/**\n     * Determine whether the function already has a return type hint.\n     *\n     * @param int $index The index of the end of the function definition line, EG at { or ;\n     *\/","13623":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NativeFunctionInvocationFixer.\n     * Must run after NoBinaryStringFixer, NoUselessConcatOperatorFixer.\n     *\/","13624":"\/**\n     * @param non-empty-array<int, int> $arguments\n     *\/","13625":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  space_before?: 'none'|'one'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  space_before: 'none'|'one'\n * }\n *\/","13628":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after PhpUnitDataProviderReturnTypeFixer, PhpdocToReturnTypeFixer, VoidReturnFixer.\n     *\/","13633":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BracesFixer, ConcatSpaceFixer.\n     *\/","13634":"\/**\n     * Returns 'true' if there is a possible reference to '$this' within the given tokens index range.\n     *\/","13636":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before FunctionDeclarationFixer.\n     *\/","13637":"\/**\n * @author Mark Nielsen\n *\/","13638":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpdocNoEmptyReturnFixer, ReturnTypeDeclarationFixer.\n     * Must run after NoSuperfluousPhpdocTagsFixer, SimplifiedNullReturnFixer.\n     *\/","13639":"\/**\n     * Determine whether there is a non-void return annotation in the function's PHPDoc comment.\n     *\n     * @param int $index The index of the function token\n     *\/","13640":"\/**\n     * Determine whether there is a void return annotation in the function's PHPDoc comment.\n     *\n     * @param int $index The index of the function token\n     *\/","13642":"\/**\n     * Determine whether the function has a void return.\n     *\n     * @param int $startIndex Start of function body\n     * @param int $endIndex   End of function body\n     *\/","13643":"\/**\n     * @param int $index The index of the end of the function definition line, EG at { or ;\n     *\/","13644":"\/**\n     * Find all the return annotations in the function's PHPDoc comment.\n     *\n     * @param int $index The index of the function token\n     *\n     * @return list<Annotation>\n     *\/","13645":"\/**\n * @author VeeWee <toonverwerft@gmail.com>\n * @author Tomas Jadrny <developer@tomasjadrny.cz>\n * @author Greg Korba <greg@codito.dev>\n * @author SpacePossum <possumfromspace@gmail.com>\n * @author Michael Vorisek <https:\/\/github.com\/mvorisek>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  import_symbols?: bool,\n *  leading_backslash_in_global_namespace?: bool,\n *  phpdoc_tags?: list<string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  import_symbols: bool,\n *  leading_backslash_in_global_namespace: bool,\n *  phpdoc_tags: list<string>\n * }\n * @phpstan-type _Uses array{\n *   constant?: array<class-string, string>,\n *   class?: array<class-string, string>,\n *   function?: array<class-string, string>\n * }\n *\n * @phpstan-import-type _ImportType from \\PhpCsFixer\\Tokenizer\\Analyzer\\Analysis\\NamespaceUseAnalysis\n *\/","13647":"\/**\n     * @var array{\n     *     constant?: list<class-string>,\n     *     class?: list<class-string>,\n     *     function?: list<class-string>\n     * }|null\n     *\/","13648":"\/**\n     * @var array{\n     *     constant?: array<string, class-string>,\n     *     class?: array<string, class-string>,\n     *     function?: array<string, class-string>\n     * }\n     *\/","13649":"\/**\n     * @var array<int<0, max>, array<string, true>>\n     *\/","13650":"\/**\n     * @var array{\n     *     constant?: array<string, string>,\n     *     class?: array<string, string>,\n     *     function?: array<string, string>\n     * }\n     *\/","13652":"\/** @var _Uses *\/","13654":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoSuperfluousPhpdocTagsFixer, OrderedAttributesFixer, OrderedImportsFixer, OrderedInterfacesFixer, StatementIndentationFixer.\n     * Must run after ClassKeywordFixer, PhpUnitAttributesFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer.\n     *\/","13655":"\/**\n     * @param _Uses $uses\n     *\/","13656":"\/**\n     * Resolve absolute or relative symbol to normalized FQCN.\n     *\n     * @param _ImportType $importKind\n     * @param _Uses       $uses\n     *\n     * @return class-string\n     *\/","13657":"\/**\n     * Shorten normalized FQCN as much as possible.\n     *\n     * @param _ImportType $importKind\n     * @param _Uses       $uses\n     *\/","13669":"\/**\n     * Determines short type based on FQCN, current namespace and imports (`use` declarations).\n     *\n     * @param class-string $typeName\n     * @param _ImportType  $importKind\n     * @param _Uses        $uses\n     *\n     * @return null|list<Token>\n     *\/","13670":"\/**\n     * @return iterable<array{int, int}>\n     *\/","13672":"\/**\n     * We need to create import processor dynamically (not in costructor), because actual whitespace configuration\n     * is set later, not when fixer's instance is created.\n     *\/","13676":"\/**\n * @author Gregor Harlan <gharlan@web.de>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  import_classes?: bool|null,\n *  import_constants?: bool|null,\n *  import_functions?: bool|null\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  import_classes: bool|null,\n *  import_constants: bool|null,\n *  import_functions: bool|null\n * }\n *\/","13679":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoUnusedImportsFixer, OrderedImportsFixer, StatementIndentationFixer.\n     * Must run after NativeConstantInvocationFixer, NativeFunctionInvocationFixer.\n     *\/","13680":"\/**\n     * @param list<NamespaceUseAnalysis> $useDeclarations\n     *\n     * @return array<string, class-string>\n     *\/","13683":"\/**\n     * Removes the leading slash at the given indices (when the name is not already used).\n     *\n     * @param list<int>                  $indices\n     * @param array<string, string|true> $global\n     * @param array<string, true>        $other\n     *\n     * @return array<string, class-string> array keys contain the names that must be imported\n     *\/","13684":"\/**\n     * @param list<NamespaceUseAnalysis> $useDeclarations\n     *\/","13687":"\/**\n     * @param list<NamespaceUseAnalysis> $declarations\n     *\n     * @return array{0: array<string, string|true>, 1: array<string, true>}\n     *\/","13688":"\/**\n     * @return iterable<string>\n     *\/","13692":"\/**\n * @author Volodymyr Kupriienko <vldmr.kuprienko@gmail.com>\n * @author Greg Korba <greg@codito.dev>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  group_types?: list<string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  group_types: list<string>\n * }\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\/","13697":"\/**\n     * Gets namespace use analyzers with same namespaces.\n     *\n     * @return array<NamespaceUseAnalysis::TYPE_*, list<NamespaceUseAnalysis>>\n     *\/","13698":"\/**\n     * @param list<NamespaceUseAnalysis> $statements\n     *\/","13700":"\/**\n     * Insert use with alias to the group.\n     *\/","13701":"\/**\n     * Creates new use statement group.\n     *\/","13702":"\/**\n     * Check if namespace use analyses are different.\n     *\/","13706":"\/**\n * @author Carlos Cirello <carlos.cirello.nl@gmail.com>\n *\/","13707":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before OrderedImportsFixer.\n     * Must run after NoUnusedImportsFixer, SingleImportPerStatementFixer.\n     *\/","13708":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoSinglelineWhitespaceBeforeSemicolonsFixer.\n     *\/","13710":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BlankLineAfterNamespaceFixer, NoExtraBlankLinesFixer, NoLeadingImportSlashFixer, SingleLineAfterImportsFixer.\n     * Must run after ClassKeywordRemoveFixer, GlobalNamespaceImportFixer, PhpUnitDedicateAssertFixer, PhpUnitFqcnAnnotationFixer.\n     *\/","13711":"\/**\n     * @param array<int, int> $ignoredIndices indices of the use statements themselves that should not be checked as being \"used\"\n     *\/","13713":"\/**\n     * Returns tuple with the index of first token with whitespace containing new line char\n     * and a flag if any non-empty token was found along the way.\n     *\n     * @param -1|1 $direction\n     *\n     * @return array{0: null|int, 1: bool}\n     *\/","13714":"\/**\n * @author Sebastiaan Stok <s.stok@rollerscapes.net>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n * @author Darius Matulionis <darius@matulionis.lt>\n * @author Adriano Pilger <adriano.pilger@gmail.com>\n *\n * @phpstan-type _UseImportInfo array{\n *  namespace: non-empty-string,\n *  startIndex: int,\n *  endIndex: int,\n *  importType: self::IMPORT_TYPE_*,\n *  group: bool,\n * }\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  case_sensitive?: bool,\n *  imports_order?: list<string>|null,\n *  sort_algorithm?: 'alpha'|'length'|'none'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  case_sensitive: bool,\n *  imports_order: list<string>|null,\n *  sort_algorithm: 'alpha'|'length'|'none'\n * }\n *\/","13719":"\/**\n     * @TODO 4.0 remove the possibility to sort by length\n     *\n     * @internal\n     *\/","13721":"\/**\n     * Array of supported sort types in configuration.\n     *\n     * @var list<string>\n     *\/","13722":"\/**\n     * Array of supported sort algorithms in configuration.\n     *\n     * @var list<string>\n     *\/","13724":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BlankLineBetweenImportGroupsFixer.\n     * Must run after FullyQualifiedStrictTypesFixer, GlobalNamespaceImportFixer, NoLeadingImportSlashFixer.\n     *\/","13725":"\/**\n     * This method is used for sorting the uses in a namespace.\n     *\n     * @param _UseImportInfo $first\n     * @param _UseImportInfo $second\n     *\/","13726":"\/**\n     * This method is used for sorting the uses statements in a namespace by length.\n     *\n     * @param _UseImportInfo $first\n     * @param _UseImportInfo $second\n     *\/","13727":"\/**\n     * @param list<int> $uses\n     *\n     * @return array<int, _UseImportInfo>\n     *\/","13728":"\/**\n     * @param array<int, _UseImportInfo> $indices\n     *\n     * @return array<int, _UseImportInfo>\n     *\/","13729":"\/**\n     * @param array<int, _UseImportInfo> $usesOrder\n     *\/","13733":"\/**\n * Fixer for rules defined in PSR2 \u00b63.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  group_to_single_imports?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  group_to_single_imports: bool\n * }\n *\/","13736":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before MultilineWhitespaceBeforeSemicolonsFixer, NoLeadingImportSlashFixer, NoSinglelineWhitespaceBeforeSemicolonsFixer, SpaceAfterSemicolonFixer.\n     *\/","13737":"\/**\n     * @return array{string, ?int, int, string}\n     *\/","13742":"\/**\n * Fixer for rules defined in PSR2 \u00b63.\n *\n * @author Ceeram <ceeram@cakephp.org>\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n *\/","13743":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after NoUnusedImportsFixer.\n     *\/","13754":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before FullyQualifiedStrictTypesFixer.\n     *\/","13755":"\/**\n * @deprecated\n *\n * @author Sullivan Senechal <soullivaneuh@gmail.com>\n *\/","13756":"\/**\n     * @var array<array-key, string>\n     *\/","13757":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoUnusedImportsFixer.\n     *\/","13758":"\/**\n     * @param false|string $classImport\n     *\/","13759":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before MultilineWhitespaceBeforeSemicolonsFixer, NoSinglelineWhitespaceBeforeSemicolonsFixer, NoSpacesInsideParenthesisFixer, NoTrailingWhitespaceFixer, NoWhitespaceInBlankLineFixer, SpacesInsideParenthesesFixer.\n     *\/","13761":"\/**\n     * @param int $index of T_ISSET\n     *\n     * @return list<int> indices of meaningful tokens belonging to the isset statement\n     *\/","13762":"\/**\n     * @param list<int> $indices\n     *\n     * @return list<Token>\n     *\/","13763":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoExtraBlankLinesFixer, NoTrailingWhitespaceFixer, NoWhitespaceInBlankLineFixer, SpaceAfterSemicolonFixer.\n     * Must run after NoEmptyStatementFixer, NoUnsetOnPropertyFixer, NoUselessElseFixer.\n     *\/","13765":"\/**\n     * Find a previous call to unset directly before the index.\n     *\n     * Returns an array with\n     * * unset index\n     * * opening brace index\n     * * closing brace index\n     * * end semicolon index\n     *\n     * Or the index to where the method looked for a call.\n     *\n     * @return array{int, int, int, int}|int\n     *\/","13766":"\/**\n     * @param int $start Index previous of the first token to move\n     * @param int $end   Index of the last token to move\n     * @param int $to    Upper boundary index\n     *\n     * @return int Number of tokens inserted\n     *\/","13770":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after DeclareStrictTypesFixer.\n     *\/","13771":"\/**\n     * @param int $index of `=` token\n     *\/","13777":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before CombineNestedDirnameFixer.\n     *\/","13779":"\/**\n * @author Jules Pietri <jules@heahprod.com>\n * @author Kuba Wer\u0142os <werlos@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  mute_deprecation_error?: bool,\n *  noise_remaining_usages?: bool,\n *  noise_remaining_usages_exclude?: list<string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  mute_deprecation_error: bool,\n *  noise_remaining_usages: bool,\n *  noise_remaining_usages_exclude: list<string>\n * }\n *\/","13788":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  functions?: list<'get_called_class'|'get_class'|'get_class_this'|'php_sapi_name'|'phpversion'|'pi'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  functions: list<'get_called_class'|'get_class'|'get_class_this'|'php_sapi_name'|'phpversion'|'pi'>\n * }\n *\/","13789":"\/**\n     * @var null|array<string, list<Token>>\n     *\/","13790":"\/**\n     * @var array<string, list<Token>>\n     *\/","13792":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NativeConstantInvocationFixer, NativeFunctionCasingFixer, NoExtraBlankLinesFixer, NoSinglelineWhitespaceBeforeSemicolonsFixer, NoTrailingWhitespaceFixer, NoWhitespaceInBlankLineFixer, SelfStaticAccessorFixer.\n     * Must run after NoSpacesAfterFunctionNameFixer, NoSpacesInsideParenthesisFixer, SpacesInsideParenthesesFixer.\n     *\/","13793":"\/**\n     * @param list<Token> $replacements\n     *\/","13794":"\/**\n     * @return ?array{int, int, list<Token>}\n     *\/","13796":"\/**\n     * @return array{int, int, list<Token>}\n     *\/","13799":"\/**\n * @author John Paul E. Balandan, CPA <paulbalandan@gmail.com>\n *\/","13800":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before MultilineWhitespaceBeforeSemicolonsFixer.\n     * Must run after NoSpacesAfterFunctionNameFixer, NoSpacesInsideParenthesisFixer, SpacesInsideParenthesesFixer.\n     *\/","13803":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before YodaStyleFixer.\n     *\/","13804":"\/**\n * @author Gert de Pagter <BackEndTea@gmail.com>\n *\/","13805":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before CombineConsecutiveUnsetsFixer.\n     *\/","13806":"\/**\n     * @return list<array<string, bool|int>>\n     *\/","13807":"\/**\n     * @param list<array<string, bool|int>> $unsetsInfo\n     *\/","13808":"\/**\n     * @param array<string, bool|int> $unsetInfo\n     *\/","13809":"\/**\n * @author John Paul E. Balandan, CPA <paulbalandan@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  syntax?: 'question_mark'|'union'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  syntax: 'question_mark'|'union'\n * }\n *\/","13812":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before OrderedTypesFixer, TypesSpacesFixer.\n     * Must run after NullableTypeDeclarationForDefaultNullValueFixer.\n     *\/","13813":"\/**\n     * @return array<int, string>\n     *\n     * @phpstan-return array<int, 'function'|'property'>\n     *\/","13816":"\/**\n     * @param list<string> $types\n     *\n     * @return list<Token>\n     *\/","13819":"\/**\n * @author Andreas M\u00f6ller <am@localheinz.com>\n *\n * @deprecated\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  constructs?: list<'abstract'|'as'|'attribute'|'break'|'case'|'catch'|'class'|'clone'|'comment'|'const'|'const_import'|'continue'|'do'|'echo'|'else'|'elseif'|'enum'|'extends'|'final'|'finally'|'for'|'foreach'|'function'|'function_import'|'global'|'goto'|'if'|'implements'|'include'|'include_once'|'instanceof'|'insteadof'|'interface'|'match'|'named_argument'|'namespace'|'new'|'open_tag_with_echo'|'php_doc'|'php_open'|'print'|'private'|'protected'|'public'|'readonly'|'require'|'require_once'|'return'|'static'|'switch'|'throw'|'trait'|'try'|'type_colon'|'use'|'use_lambda'|'use_trait'|'var'|'while'|'yield'|'yield_from'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  constructs: list<'abstract'|'as'|'attribute'|'break'|'case'|'catch'|'class'|'clone'|'comment'|'const'|'const_import'|'continue'|'do'|'echo'|'else'|'elseif'|'enum'|'extends'|'final'|'finally'|'for'|'foreach'|'function'|'function_import'|'global'|'goto'|'if'|'implements'|'include'|'include_once'|'instanceof'|'insteadof'|'interface'|'match'|'named_argument'|'namespace'|'new'|'open_tag_with_echo'|'php_doc'|'php_open'|'print'|'private'|'protected'|'public'|'readonly'|'require'|'require_once'|'return'|'static'|'switch'|'throw'|'trait'|'try'|'type_colon'|'use'|'use_lambda'|'use_trait'|'var'|'while'|'yield'|'yield_from'>\n * }\n *\/","13820":"\/**\n     * @var array<string, null|int>\n     *\/","13823":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BracesFixer, FunctionDeclarationFixer.\n     * Must run after ArraySyntaxFixer, ModernizeStrposFixer.\n     *\/","13826":"\/**\n * @author Andreas M\u00f6ller <am@localheinz.com>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  constructs_contain_a_single_space?: list<'yield_from'>,\n *  constructs_followed_by_a_single_space?: list<'abstract'|'as'|'attribute'|'break'|'case'|'catch'|'class'|'clone'|'comment'|'const'|'const_import'|'continue'|'do'|'echo'|'else'|'elseif'|'enum'|'extends'|'final'|'finally'|'for'|'foreach'|'function'|'function_import'|'global'|'goto'|'if'|'implements'|'include'|'include_once'|'instanceof'|'insteadof'|'interface'|'match'|'named_argument'|'namespace'|'new'|'open_tag_with_echo'|'php_doc'|'php_open'|'print'|'private'|'protected'|'public'|'readonly'|'require'|'require_once'|'return'|'static'|'switch'|'throw'|'trait'|'try'|'type_colon'|'use'|'use_lambda'|'use_trait'|'var'|'while'|'yield'|'yield_from'>,\n *  constructs_preceded_by_a_single_space?: list<'as'|'else'|'elseif'|'use_lambda'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  constructs_contain_a_single_space: list<'yield_from'>,\n *  constructs_followed_by_a_single_space: list<'abstract'|'as'|'attribute'|'break'|'case'|'catch'|'class'|'clone'|'comment'|'const'|'const_import'|'continue'|'do'|'echo'|'else'|'elseif'|'enum'|'extends'|'final'|'finally'|'for'|'foreach'|'function'|'function_import'|'global'|'goto'|'if'|'implements'|'include'|'include_once'|'instanceof'|'insteadof'|'interface'|'match'|'named_argument'|'namespace'|'new'|'open_tag_with_echo'|'php_doc'|'php_open'|'print'|'private'|'protected'|'public'|'readonly'|'require'|'require_once'|'return'|'static'|'switch'|'throw'|'trait'|'try'|'type_colon'|'use'|'use_lambda'|'use_trait'|'var'|'while'|'yield'|'yield_from'>,\n *  constructs_preceded_by_a_single_space: list<'as'|'else'|'elseif'|'use_lambda'>\n * }\n *\/","13837":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  syntax?: 'long'|'short'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  syntax: 'long'|'short'\n * }\n *\/","13840":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BinaryOperatorSpacesFixer, TernaryOperatorSpacesFixer.\n     *\/","13843":"\/**\n * Fixer for rules defined in PSR2 \u00b63.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","13845":"\/**\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n * @author Greg Korba <greg@codito.dev>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  max_line_breaks?: int,\n *  min_line_breaks?: int\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  max_line_breaks: int,\n *  min_line_breaks: int\n * }\n *\/","13848":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after BlankLineAfterOpeningTagFixer, HeaderCommentFixer.\n     *\/","13849":"\/**\n     * Make sure # of line breaks prefixing namespace is within given range.\n     *\n     * @param int $expectedMin min. # of line breaks\n     * @param int $expectedMax max. # of line breaks\n     *\/","13853":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpUnitDataProviderReturnTypeFixer.\n     *\/","13854":"\/**\n     * @param int $index start of namespace\n     *\/","13855":"\/**\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n *\n * @deprecated Use `blank_lines_before_namespace` with config: ['min_line_breaks' => 0, 'max_line_breaks' => 1]\n *\/","13857":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after BlankLineAfterOpeningTagFixer.\n     *\/","13858":"\/**\n * @author Bram Gotink <bram@gotink.me>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","13859":"\/**\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n *\n * @deprecated Use `blank_lines_before_namespace` with config: ['min_line_breaks' => 2, 'max_line_breaks' => 2] (default)\n *\/","13861":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after HeaderCommentFixer.\n     *\/","13862":"\/**\n * @author Fred Cox <mcfedr@gmail.com>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","13863":"\/**\n     * Used the program https:\/\/github.com\/mcfedr\/homoglyph-download\n     * to generate this list from\n     * http:\/\/homoglyphs.net\/?text=abcdefghijklmnopqrstuvwxyz&lang=en&exc7=1&exc8=1&exc13=1&exc14=1.\n     *\n     * Symbols replaced include\n     * - Latin homoglyphs\n     * - IPA extensions\n     * - Greek and Coptic\n     * - Cyrillic\n     * - Cyrillic Supplement\n     * - Letterlike Symbols\n     * - Latin Numbers\n     * - Fullwidth Latin\n     *\n     * This is not the complete list of unicode homographs, but limited\n     * to those you are more likely to have typed\/copied by accident\n     *\n     * @var array<string, string>\n     *\/","13864":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BinaryOperatorSpacesFixer, NoWhitespaceInBlankLineFixer.\n     * Must run after TernaryToNullCoalescingFixer.\n     *\/","13865":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  default?: 'align'|'align_by_scope'|'align_single_space'|'align_single_space_by_scope'|'align_single_space_minimal'|'align_single_space_minimal_by_scope'|'at_least_single_space'|'no_space'|'single_space'|null,\n *  operators?: array<string, ?string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  default: 'align'|'align_by_scope'|'align_single_space'|'align_single_space_by_scope'|'align_single_space_minimal'|'align_single_space_minimal_by_scope'|'at_least_single_space'|'no_space'|'single_space'|null,\n *  operators: array<string, ?string>\n * }\n *\/","13875":"\/**\n     * @internal\n     *\n     * @const Placeholder used as anchor for right alignment.\n     *\/","13877":"\/**\n     * @var list<null|string>\n     *\/","13878":"\/**\n     * Keep track of the deepest level ever achieved while\n     * parsing the code. Used later to replace alignment\n     * placeholders with spaces.\n     *\/","13879":"\/**\n     * Level counter of the current nest level.\n     * So one level alignments are not mixed with\n     * other level ones.\n     *\/","13883":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after ArrayIndentationFixer, ArraySyntaxFixer, AssignNullCoalescingToCoalesceEqualFixer, ListSyntaxFixer, LongToShorthandOperatorFixer, ModernizeStrposFixer, NoMultilineWhitespaceAroundDoubleArrowFixer, NoUnsetCastFixer, PowToExponentiationFixer, StandardizeNotEqualsFixer, StrictComparisonFixer.\n     *\/","13884":"\/**\n     * @return false|int index of T_DECLARE where the `=` belongs to or `false`\n     *\/","13886":"\/**\n     * @param array<string, string> $toAlign\n     *\/","13887":"\/**\n     * Look for group of placeholders and provide vertical alignment.\n     *\/","13890":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  spacing?: 'none'|'one'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  spacing: 'none'|'one'\n * }\n *\/","13893":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after NoUnneededControlParenthesesFixer, SingleLineThrowFixer.\n     *\/","13894":"\/**\n     * @param int $index index of concatenation '.' token\n     *\/","13896":"\/**\n     * @param int $index  index of concatenation '.' token\n     * @param int $offset 1 or -1\n     *\/","13900":"\/**\n * @author Gregor Harlan <gharlan@web.de>\n * @author Kuba Wer\u0142os <werlos@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  style?: 'post'|'pre'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  style: 'post'|'pre'\n * }\n *\/","13904":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoSpacesInsideParenthesisFixer, SpacesInsideParenthesesFixer.\n     * Must run after StandardizeIncrementFixer.\n     *\/","13908":"\/**\n * @author Haralan Dobrev <hkdobrev@gmail.com>\n *\/","13909":"\/**\n     * @var array<string, array{int, string}>\n     *\/","13911":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BinaryOperatorSpacesFixer, NoExtraBlankLinesFixer, NoSinglelineWhitespaceBeforeSemicolonsFixer, StandardizeIncrementFixer.\n     *\/","13912":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @deprecated\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  anonymous_class?: bool,\n *  named_class?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  anonymous_class: bool,\n *  named_class: bool\n * }\n *\/","13916":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before ClassDefinitionFixer.\n     *\/","13920":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  anonymous_class?: bool,\n *  named_class?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  anonymous_class: bool,\n *  named_class: bool\n * }\n *\/","13928":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before MethodChainingIndentationFixer.\n     *\/","13929":"\/**\n     * @param -1|1 $direction\n     *\/","13930":"\/**\n * @phpstan-type _ConcatOperandType array{\n *     start: int,\n *     end: int,\n *     type: self::STR_*,\n * }\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  juggle_simple_strings?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  juggle_simple_strings: bool\n * }\n *\/","13933":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before DateTimeCreateFromFormatCallFixer, EregToPregFixer, PhpUnitDedicateAssertInternalTypeFixer, RegularCallableCallFixer, SetTypeToCastFixer.\n     * Must run after ExplicitStringVariableFixer, NoBinaryStringFixer, SingleQuoteFixer.\n     *\/","13934":"\/**\n     * @param _ConcatOperandType $firstOperand\n     * @param _ConcatOperandType $secondOperand\n     *\/","13935":"\/**\n     * @param -1|1 $direction\n     *\n     * @return null|_ConcatOperandType\n     *\/","13942":"\/**\n * @author Javier Spagnoletti <phansys@gmail.com>\n *\/","13943":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after ModernizeStrposFixer, UnaryOperatorSpacesFixer.\n     *\/","13947":"\/**\n * @author Kuba Wer\u0142os <werlos@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  only_booleans?: bool,\n *  position?: 'beginning'|'end'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  only_booleans: bool,\n *  position: 'beginning'|'end'\n * }\n *\/","13951":"\/**\n     * @param non-empty-list<int> $operatorIndices\n     *\/","13959":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before IncrementStyleFixer.\n     * Must run after LongToShorthandOperatorFixer.\n     *\/","13960":"\/**\n     * Clear tokens in the given range unless they are comments.\n     *\/","13964":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after ArraySyntaxFixer, ListSyntaxFixer, TernaryToElvisOperatorFixer.\n     *\/","13965":"\/**\n     * Lower precedence and other valid preceding tokens.\n     *\n     * Ordered by most common types first.\n     *\n     * @var list<array{int}|string>\n     *\/","13966":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoTrailingWhitespaceFixer, TernaryOperatorSpacesFixer.\n     *\/","13967":"\/**\n     * @return ?array{start: int, end: int} null if contains ++\/-- operator\n     *\/","13971":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before AssignNullCoalescingToCoalesceEqualFixer.\n     *\/","13972":"\/**\n     * @param int $index of `T_ISSET` token\n     *\/","13973":"\/**\n     * Get the sequence of meaningful tokens and returns a new Tokens instance.\n     *\n     * @param int $start start index\n     * @param int $end   end index\n     *\/","13974":"\/**\n     * Check if the requested token is an operator computed\n     * before the ternary operator along with the `isset()`.\n     *\/","13975":"\/**\n     * Check if the `isset()` content may change if called multiple times.\n     *\n     * @param Tokens $tokens The original token list\n     *\/","13976":"\/**\n * @author Gregor Harlan <gharlan@web.de>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  only_dec_inc?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  only_dec_inc: bool\n * }\n *\/","13979":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NotOperatorWithSpaceFixer, NotOperatorWithSuccessorSpaceFixer.\n     *\/","13984":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BlankLinesBeforeNamespaceFixer, NoBlankLinesBeforeNamespaceFixer.\n     * Must run after DeclareStrictTypesFixer.\n     *\/","13985":"\/**\n * @author Michele Locati <michele@locati.it>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  format?: 'long'|'short',\n *  long_function?: 'echo'|'print',\n *  shorten_simple_statements_only?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  format: 'long'|'short',\n *  long_function: 'echo'|'print',\n *  shorten_simple_statements_only: bool\n * }\n *\/","13994":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoMixedEchoPrintFixer.\n     *\/","13995":"\/**\n     * Check if $tokens, starting at $index, contains \"complex code\", that is, the content\n     * of the echo tag contains more than a simple \"echo something\".\n     *\n     * This is done by a very quick test: if the tag contains non-whitespace tokens after\n     * a semicolon, we consider it as \"complex\".\n     *\n     * @example `<?php echo 1 ?>` is false (not complex)\n     * @example `<?php echo 'hello' . 'world'; ?>` is false (not \"complex\")\n     * @example `<?php echo 2; $set = 3 ?>` is true (\"complex\")\n     *\/","13996":"\/**\n     * Builds the list of tokens that replace a long echo sequence.\n     *\n     * @return list<Token>\n     *\/","14000":"\/**\n * Fixer for rules defined in PSR1 \u00b62.1.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","14002":"\/**\n * Fixer for rules defined in PSR2 \u00b62.2.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","14003":"\/**\n * @author Krzysztof Ciszewski <krzysztof@ciszew.ski>\n *\/","14004":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after PhpUnitDedicateAssertFixer.\n     *\/","14005":"\/**\n     * @param array{\n     *     index: int,\n     *     loweredName: string,\n     *     openBraceIndex: int,\n     *     closeBraceIndex: int,\n     * } $assertCall\n     *\/","14008":"\/**\n * @author Kuba Wer\u0142os <werlos@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  keep_annotations?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  keep_annotations: bool\n * }\n *\/","14011":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before FullyQualifiedStrictTypesFixer, NoEmptyPhpdocFixer, PhpdocSeparationFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer.\n     * Must run after PhpUnitDataProviderNameFixer, PhpUnitDataProviderReturnTypeFixer, PhpUnitDataProviderStaticFixer, PhpUnitSizeClassFixer, PhpUnitTestClassRequiresCoversFixer.\n     *\/","14012":"\/**\n     * @param list<Token> $tokensToInsert\n     *\/","14024":"\/**\n     * @param class-string $name\n     *\n     * @return list<Token>\n     *\/","14030":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  assertions?: list<'assertEquals'|'assertNotEquals'|'assertNotSame'|'assertSame'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  assertions: list<'assertEquals'|'assertNotEquals'|'assertNotSame'|'assertSame'>\n * }\n *\/","14033":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpUnitDedicateAssertFixer.\n     *\/","14034":"\/**\n     * @uses fixAssertNegative()\n     * @uses fixAssertPositive()\n     *\/","14035":"\/**\n     * @param array<string, string> $map\n     *\/","14041":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  placement?: 'after'|'before'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  placement: 'after'|'before'\n * }\n *\n * @phpstan-import-type _ClassElement from OrderedClassElementsFixer\n *\/","14044":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before ClassAttributesSeparationFixer, NoBlankLinesAfterClassOpeningFixer.\n     * Must run after OrderedClassElementsFixer.\n     *\/","14048":"\/**\n     * @return list<array{\n     *   array{int, string},\n     *   non-empty-list<array{int, string, int}>\n     * }>\n     *\/","14049":"\/**\n     * @param list<array{\n     *   array{int, string},\n     *   non-empty-list<array{int, string, int}>\n     * }> $dataProvidersWithUsagePairs\n     *\n     * @return list<array{string, string}>\n     *\/","14055":"\/**\n * @author Kuba Wer\u0142os <werlos@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  prefix?: string,\n *  suffix?: string\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  prefix: string,\n *  suffix: string\n * }\n *\/","14058":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpUnitAttributesFixer.\n     *\/","14065":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpUnitAttributesFixer, ReturnToYieldFromFixer, ReturnTypeDeclarationFixer.\n     * Must run after CleanNamespaceFixer.\n     *\/","14068":"\/**\n * @author Kuba Wer\u0142os <werlos@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  force?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  force: bool\n * }\n *\/","14077":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  target?: '3.0'|'3.5'|'5.0'|'5.6'|'newest'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  target: '3.0'|'3.5'|'5.0'|'5.6'|'newest'\n * }\n *\/","14078":"\/**\n     * @var array<string, array{positive: string, negative: false|string, argument_count?: int, swap_arguments?: true}|true>\n     *\/","14081":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoUnusedImportsFixer, PhpUnitAssertNewNamesFixer, PhpUnitDedicateAssertInternalTypeFixer.\n     * Must run after ModernizeStrposFixer, NoAliasFunctionsFixer, PhpUnitConstructFixer.\n     *\/","14085":"\/**\n     * @param array<int, int> $argumentsIndices\n     *\/","14091":"\/**\n * @author Filippo Tessarotto <zoeslam@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  target?: '7.5'|'newest'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  target: '7.5'|'newest'\n * }\n *\/","14094":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after NoBinaryStringFixer, NoUselessConcatOperatorFixer, PhpUnitDedicateAssertFixer.\n     *\/","14100":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  target?: '5.2'|'5.6'|'8.4'|'newest'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  target: '5.2'|'5.6'|'8.4'|'newest'\n * }\n *\/","14103":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after PhpUnitNoExpectationAnnotationFixer.\n     *\/","14108":"\/**\n * @author Roland Franssen <franssen.roland@gmail.com>\n *\/","14109":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoUnusedImportsFixer, PhpdocOrderByValueFixer.\n     *\/","14112":"\/**\n * @author Gert de Pagter <BackEndTea@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  types?: list<'abstract'|'final'|'normal'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  types: list<'abstract'|'final'|'normal'>\n * }\n *\/","14115":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before FinalInternalClassFixer, PhpdocSeparationFixer.\n     *\/","14121":"\/**\n * @author Filippo Tessarotto <zoeslam@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  case?: 'camel_case'|'snake_case'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  case: 'camel_case'|'snake_case'\n * }\n *\/","14125":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after PhpUnitTestAnnotationFixer.\n     *\/","14131":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  target?: '5.4'|'5.5'|'newest'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  target: '5.4'|'5.5'|'newest'\n * }\n *\/","14138":"\/**\n * @author Micha\u0142 Adamski <michal.adamski@gmail.com>\n * @author Kuba Wer\u0142os <werlos@gmail.com>\n *\/","14141":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  target?: '4.8'|'5.7'|'6.0'|'newest'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  target: '4.8'|'5.7'|'6.0'|'newest'\n * }\n *\/","14143":"\/**\n     * Class Mappings.\n     *\n     *  * [original classname => new classname] Some classes which match the\n     *    original class regular expression do not have a same-compound name-\n     *    space class and need a dedicated translation table. This trans-\n     *    lation table is defined in @see configure.\n     *\n     * @var array<string, string> Class Mappings\n     *\/","14147":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  target?: '3.2'|'4.3'|'newest',\n *  use_class_const?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  target: '3.2'|'4.3'|'newest',\n *  use_class_const: bool\n * }\n *\/","14150":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoEmptyPhpdocFixer, PhpUnitExpectationFixer.\n     *\/","14151":"\/**\n     * @param array<string, string> $annotations\n     *\n     * @return list<string>\n     *\/","14156":"\/**\n * @author Gert de Pagter\n *\/","14159":"\/**\n * @author Jefersson Nathan <malukenho.dev@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  group?: 'large'|'medium'|'small'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  group: 'large'|'medium'|'small'\n * }\n *\/","14162":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpUnitAttributesFixer, PhpdocSeparationFixer.\n     *\/","14168":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  assertions?: list<'assertAttributeEquals'|'assertAttributeNotEquals'|'assertEquals'|'assertNotEquals'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  assertions: list<'assertAttributeEquals'|'assertAttributeNotEquals'|'assertEquals'|'assertNotEquals'>\n * }\n *\/","14177":"\/**\n * @author Gert de Pagter\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  style?: 'annotation'|'prefix'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  style: 'annotation'|'prefix'\n * }\n *\/","14180":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoEmptyPhpdocFixer, PhpUnitMethodCasingFixer, PhpdocTrimFixer.\n     *\/","14182":"\/**\n     * @param list<Line> $lines\n     *\n     * @return list<Line>\n     *\/","14183":"\/**\n     * Take a one line doc block, and turn it into a multi line doc block.\n     *\n     * @param non-empty-list<Line> $lines\n     *\n     * @return list<Line>\n     *\/","14184":"\/**\n     * @todo check whether it's doable to use \\PhpCsFixer\\DocBlock\\DocBlock::getSingleLineDocBlockEntry instead\n     *\n     * @param non-empty-list<Line> $lines\n     *\/","14185":"\/**\n     * Updates the depends tag on the current doc block.\n     *\/","14186":"\/**\n     * Helps to find where the function name in the doc block starts.\n     *\n     * @param list<string> $line\n     *\/","14193":"\/**\n * @author Filippo Tessarotto <zoeslam@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  call_type?: 'self'|'static'|'this',\n *  methods?: array<string, string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  call_type: 'self'|'static'|'this',\n *  methods: array<string, string>\n * }\n *\/","14199":"\/**\n     * @var array<string, list<array{int, string}>>\n     *\/","14201":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before SelfStaticAccessorFixer.\n     *\/","14211":"\/**\n * @author Filippo Tessarotto <zoeslam@gmail.com>\n * @author Julien Falque <julien.falque@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  comment_type?: 'all_multiline'|'phpdocs_like'|'phpdocs_only'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  comment_type: 'all_multiline'|'phpdocs_like'|'phpdocs_only'\n * }\n *\/","14212":"\/**\n     * @var null|list<int>\n     *\/","14214":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocArrayTypeFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocListTypeFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer.\n     * Must run after ArrayIndentationFixer.\n     *\/","14217":"\/**\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  annotations?: list<string>,\n *  case_sensitive?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  annotations: list<string>,\n *  case_sensitive: bool\n * }\n *\/","14220":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoEmptyPhpdocFixer, PhpdocAlignFixer, PhpdocLineSpanFixer, PhpdocSeparationFixer, PhpdocTrimFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14225":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  case_sensitive?: bool,\n *  fix_annotation?: bool,\n *  fix_inline?: bool,\n *  replacements?: array<string, string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  case_sensitive: bool,\n *  fix_annotation: bool,\n *  fix_inline: bool,\n *  replacements: array<string, string>\n * }\n *\/","14228":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14232":"\/**\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n *\/","14233":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before HeaderCommentFixer, PhpdocAlignFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14235":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoExtraBlankLinesFixer, NoTrailingWhitespaceFixer, PhpdocAlignFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, NoSuperfluousPhpdocTagsFixer, PhpUnitAttributesFixer, PhpUnitNoExpectationAnnotationFixer, PhpUnitTestAnnotationFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocIndentFixer, PhpdocNoAccessFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14236":"\/**\n * @phpstan-type _TypeInfo array{\n *   types: list<string>,\n *   allows_null: bool,\n * }\n * @phpstan-type _DocumentElement array{\n *   index: int,\n *   type: 'classy'|'function'|'property',\n *   modifiers: array<int, Token>,\n *   types: array<int, Token>,\n * }\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  allow_hidden_params?: bool,\n *  allow_mixed?: bool,\n *  allow_unused_params?: bool,\n *  remove_inheritdoc?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  allow_hidden_params: bool,\n *  allow_mixed: bool,\n *  allow_unused_params: bool,\n *  remove_inheritdoc: bool\n * }\n *\/","14237":"\/** @var _TypeInfo *\/","14239":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoEmptyPhpdocFixer, PhpdocAlignFixer, VoidReturnFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, FullyQualifiedStrictTypesFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocIndentFixer, PhpdocLineSpanFixer, PhpdocReturnSelfReferenceFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTypesFixer.\n     *\/","14240":"\/**\n     * @return null|_DocumentElement\n     *\/","14241":"\/**\n     * @param _DocumentElement&array{type: 'function'} $element\n     * @param null|non-empty-string                    $namespace\n     * @param array<string, string>                    $shortNames\n     *\/","14242":"\/**\n     * @param _DocumentElement&array{type: 'property'} $element\n     * @param null|non-empty-string                    $namespace\n     * @param array<string, string>                    $shortNames\n     *\/","14243":"\/**\n     * @param _DocumentElement&array{type: 'classy'} $element\n     *\/","14244":"\/**\n     * @return array<non-empty-string, _TypeInfo>\n     *\/","14245":"\/**\n     * @return _TypeInfo\n     *\/","14246":"\/**\n     * @param int $index The index of the first token of the type hint\n     *\n     * @return _TypeInfo\n     *\/","14247":"\/**\n     * @param _TypeInfo             $info\n     * @param null|non-empty-string $namespace\n     * @param array<string, string> $symbolShortNames\n     *\/","14248":"\/**\n     * Normalizes types to make them comparable.\n     *\n     * Converts given types to lowercase, replaces imports aliases with\n     * their matching FQCN, and finally sorts the result.\n     *\n     * @param list<string>          $types            The types to normalize\n     * @param null|non-empty-string $namespace\n     * @param array<string, string> $symbolShortNames The imports aliases\n     *\n     * @return list<string> The normalized types\n     *\/","14249":"\/**\n     * @param _DocumentElement $element\n     *\/","14253":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  only_untyped?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  only_untyped: bool\n * }\n *\/","14256":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAlignFixer, PhpdocOrderFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, GeneralPhpdocTagRenameFixer, PhpdocIndentFixer, PhpdocNoAliasTagFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14257":"\/**\n     * @return array{default: string, name: string, type: string}\n     *\/","14261":"\/**\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Jordi Boggiano <j.boggiano@seld.be>\n * @author Sebastiaan Stok <s.stok@rollerscapes.net>\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n * @author Jakub Kwa\u015bniewski <jakub@zero-85.pl>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  align?: 'left'|'vertical',\n *  spacing?: array<string, int>|int,\n *  tags?: list<string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  align: 'left'|'vertical',\n *  spacing: array<string, int>|int,\n *  tags: list<string>\n * }\n *\/","14264":"\/**\n     * same spacing for all or specific for different tags.\n     *\n     * @var array<string, int>|int\n     *\/","14266":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAnnotationWithoutDotFixer, PhpdocArrayTypeFixer, PhpdocIndentFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocListTypeFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocScalarFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToCommentFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer.\n     *\/","14267":"\/**\n     * @TODO Introduce proper DTO instead of an array\n     *\n     * @return null|array{indent: null|string, tag: null|string, hint: string, var: null|string, static: string, desc?: null|string}\n     *\/","14268":"\/**\n     * @param non-empty-list<array{indent: null|string, tag: null|string, hint: string, var: null|string, static: string, desc?: null|string}> $items\n     *\/","14269":"\/**\n     * Get indent for sentence.\n     *\/","14274":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpdocAlignFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocToCommentFixer.\n     *\/","14276":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpdocAlignFixer, PhpdocListTypeFixer, PhpdocTypesOrderFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14277":"\/**\n * @author Ceeram <ceeram@cakephp.org>\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n *\/","14278":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocArrayTypeFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocListTypeFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer.\n     * Must run after IndentationTypeFixer, PhpdocToCommentFixer.\n     *\/","14279":"\/**\n     * Fix indentation of Docblock.\n     *\n     * @param string $content Docblock contents\n     * @param string $indent  Indentation to apply\n     *\n     * @return string Dockblock contents including correct indentation\n     *\/","14280":"\/**\n     * @param string $content Whitespace before Docblock\n     * @param string $indent  Indentation of the documented subject\n     *\n     * @return string Whitespace including correct indentation for Dockblock after this whitespace\n     *\/","14281":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  tags?: list<string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  tags: list<string>\n * }\n *\/","14284":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpdocAlignFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14288":"\/**\n * @author Gert de Pagter <BackEndTea@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  const?: 'multi'|'single'|null,\n *  method?: 'multi'|'single'|null,\n *  property?: 'multi'|'single'|null\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  const: 'multi'|'single'|null,\n *  method: 'multi'|'single'|null,\n *  property: 'multi'|'single'|null\n * }\n *\/","14291":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoSuperfluousPhpdocTagsFixer, PhpdocAlignFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14296":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpdocAlignFixer, PhpdocTypesOrderFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocArrayTypeFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14297":"\/**\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","14299":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoEmptyPhpdocFixer, PhpdocAlignFixer, PhpdocSeparationFixer, PhpdocTrimFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14300":"\/**\n * Case-sensitive tag replace fixer (does not process inline tags like {@inheritdoc}).\n *\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  replacements?: array<string, string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  replacements: array<string, string>\n * }\n *\/","14304":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocSingleLineVarSpacingFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14308":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoEmptyPhpdocFixer, PhpdocAlignFixer, PhpdocOrderFixer, PhpdocSeparationFixer, PhpdocTrimFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer, VoidReturnFixer.\n     *\/","14309":"\/**\n     * Remove `return void` or `return null` annotations.\n     *\/","14313":"\/**\n * Remove inheritdoc tags from classy that does not inherit.\n *\/","14314":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoEmptyPhpdocFixer, NoTrailingWhitespaceInCommentFixer, PhpdocAlignFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14315":"\/**\n * @author Filippo Tessarotto <zoeslam@gmail.com>\n * @author Andreas M\u00f6ller <am@localheinz.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  annotations?: list<'author'|'covers'|'coversNothing'|'dataProvider'|'depends'|'group'|'internal'|'method'|'mixin'|'property'|'property-read'|'property-write'|'requires'|'throws'|'uses'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  annotations: array{'author'?: 'author', 'covers'?: 'covers', 'coversNothing'?: 'coversnothing', 'dataProvider'?: 'dataprovider', 'depends'?: 'depends', 'group'?: 'group', 'internal'?: 'internal', 'method'?: 'method', 'mixin'?: 'mixin', 'property'?: 'property', 'property-read'?: 'property-read', 'property-write'?: 'property-write', 'requires'?: 'requires', 'throws'?: 'throws', 'uses'?: 'uses'}\n * }\n *\/","14318":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpdocAlignFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpUnitFqcnAnnotationFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14322":"\/**\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n * @author Jakub Kwa\u015bniewski <jakub@zero-85.pl>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  order?: list<string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  order: list<string>\n * }\n *\/","14323":"\/**\n     * @const string[]\n     *\n     * @TODO: 4.0 - change default to ['param', 'return', 'throws']\n     *\/","14325":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpdocAlignFixer, PhpdocSeparationFixer, PhpdocTrimFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocIndentFixer, PhpdocNoEmptyReturnFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14326":"\/**\n     * Move all given annotations in before given set of annotations.\n     *\n     * @param string       $move   Tag of annotations that should be moved\n     * @param list<string> $before Tags of annotations that should moved annotations be placed before\n     *\/","14327":"\/**\n     * Move all given annotations after given set of annotations.\n     *\n     * @param string       $move  Tag of annotations that should be moved\n     * @param list<string> $after Tags of annotations that should moved annotations be placed after\n     *\/","14331":"\/**\n * @author Jonathan Gruber <gruberjonathan@gmail.com>\n *\/","14334":"\/**\n     * Overwrite the param annotations in order.\n     *\n     * @param list<Token>      $paramNames\n     * @param list<Annotation> $paramAnnotations\n     *\/","14335":"\/**\n     * Sort the param annotations according to the function parameters.\n     *\n     * @param list<Token>      $funcParamNames\n     * @param list<Annotation> $paramAnnotations\n     *\n     * @return list<string>\n     *\/","14336":"\/**\n     * Fetch all annotations except the param ones.\n     *\n     * @param list<Annotation> $paramAnnotations\n     *\n     * @return list<string>\n     *\/","14337":"\/**\n     * Return the indices of the lines of a specific parameter annotation.\n     *\n     * @param list<Annotation> $paramAnnotations\n     *\n     * @return ?list<int>\n     *\/","14338":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  replacements?: array<string, string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  replacements: array<string, string>\n * }\n *\/","14345":"\/**\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  types?: list<'boolean'|'callback'|'double'|'integer'|'real'|'str'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  types: list<'boolean'|'callback'|'double'|'integer'|'real'|'str'>\n * }\n *\/","14346":"\/**\n     * The types to fix.\n     *\/","14349":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocArrayTypeFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocListTypeFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer.\n     * Must run after PhpdocTypesFixer.\n     *\/","14353":"\/**\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n * @author Jakub Kwa\u015bniewski <jakub@zero-85.pl>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  groups?: list<list<string>>,\n *  skip_unlisted_annotations?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  groups: list<list<string>>,\n *  skip_unlisted_annotations: bool\n * }\n *\/","14354":"\/**\n     * @internal\n     *\n     * @var list<list<string>>\n     *\/","14355":"\/**\n     * @var list<list<string>>\n     *\/","14357":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpdocAlignFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, PhpUnitAttributesFixer, PhpUnitInternalClassFixer, PhpUnitSizeClassFixer, PhpUnitTestClassRequiresCoversFixer, PhpdocIndentFixer, PhpdocNoAccessFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocOrderFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14358":"\/**\n     * Make sure the description is separated from the annotations.\n     *\/","14359":"\/**\n     * Make sure the annotations are correctly separated.\n     *\/","14360":"\/**\n     * Force the given annotations to immediately follow each other.\n     *\/","14361":"\/**\n     * Force the given annotations to have one empty line between each other.\n     *\/","14362":"\/**\n     * @param list<list<string>> $groups\n     *\/","14363":"\/**\n     * @param list<string> $group\n     *\/","14366":"\/**\n * Fixer for part of rule defined in PSR5 \u00b67.22.\n *\/","14367":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpdocAlignFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocIndentFixer, PhpdocNoAliasTagFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14370":"\/**\n     * Is the last line of the short description correctly formatted?\n     *\/","14378":"\/**\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  tags?: array<string, 'annotation'|'inline'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  tags: array<string, 'annotation'|'inline'>\n * }\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\/","14382":"\/**\n     * @param array<int,string> $parts\n     *\/","14386":"\/**\n * @author Ceeram <ceeram@cakephp.org>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  allow_before_return_statement?: bool,\n *  ignored_tags?: list<string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  allow_before_return_statement: bool,\n *  ignored_tags: list<string>\n * }\n *\/","14389":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyCommentFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocAnnotationWithoutDotFixer, PhpdocArrayTypeFixer, PhpdocIndentFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocListTypeFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer, SingleLineCommentSpacingFixer, SingleLineCommentStyleFixer.\n     * Must run after CommentToPhpdocFixer.\n     *\/","14392":"\/**\n * @author Nobu Funaki <nobu.funaki@gmail.com>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","14393":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpdocAlignFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpUnitAttributesFixer, PhpdocIndentFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14395":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpdocAlignFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, GeneralPhpdocAnnotationRemoveFixer, PhpUnitAttributesFixer, PhpUnitTestAnnotationFixer, PhpdocIndentFixer, PhpdocNoAccessFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocOrderFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14396":"\/**\n     * Make sure the first useful line starts immediately after the first line.\n     *\/","14397":"\/**\n     * Make sure the last useful line is immediately before the final line.\n     *\/","14398":"\/**\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  groups?: list<'alias'|'meta'|'simple'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  groups: list<'alias'|'meta'|'simple'>\n * }\n *\/","14399":"\/**\n     * Available types, grouped.\n     *\n     * @var array<string, list<string>>\n     *\/","14400":"\/** @var array<string, true> *\/","14403":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before GeneralPhpdocAnnotationRemoveFixer, GeneralPhpdocTagRenameFixer, NoBlankLinesAfterPhpdocFixer, NoEmptyPhpdocFixer, NoSuperfluousPhpdocTagsFixer, PhpdocAddMissingParamAnnotationFixer, PhpdocAlignFixer, PhpdocArrayTypeFixer, PhpdocInlineTagNormalizerFixer, PhpdocLineSpanFixer, PhpdocListTypeFixer, PhpdocNoAccessFixer, PhpdocNoAliasTagFixer, PhpdocNoEmptyReturnFixer, PhpdocNoPackageFixer, PhpdocNoUselessInheritdocFixer, PhpdocOrderByValueFixer, PhpdocOrderFixer, PhpdocParamOrderFixer, PhpdocReadonlyClassCommentToKeywordFixer, PhpdocReturnSelfReferenceFixer, PhpdocScalarFixer, PhpdocSeparationFixer, PhpdocSingleLineVarSpacingFixer, PhpdocSummaryFixer, PhpdocTagCasingFixer, PhpdocTagTypeFixer, PhpdocToParamTypeFixer, PhpdocToPropertyTypeFixer, PhpdocToReturnTypeFixer, PhpdocTrimConsecutiveBlankLineSeparationFixer, PhpdocTrimFixer, PhpdocTypesOrderFixer, PhpdocVarAnnotationCorrectOrderFixer, PhpdocVarWithoutNameFixer.\n     * Must run after PhpdocIndentFixer.\n     *\/","14406":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  case_sensitive?: bool,\n *  null_adjustment?: 'always_first'|'always_last'|'none',\n *  sort_algorithm?: 'alpha'|'none'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  case_sensitive: bool,\n *  null_adjustment: 'always_first'|'always_last'|'none',\n *  sort_algorithm: 'alpha'|'none'\n * }\n *\/","14409":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpdocAlignFixer.\n     * Must run after AlignMultilineCommentFixer, CommentToPhpdocFixer, PhpdocArrayTypeFixer, PhpdocIndentFixer, PhpdocListTypeFixer, PhpdocScalarFixer, PhpdocToCommentFixer, PhpdocTypesFixer.\n     *\/","14416":"\/**\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n * @author Dave van der Brugge <dmvdbrugge@gmail.com>\n *\/","14418":"\/**\n     * @return array<int, Line>\n     *\/","14419":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BlankLineBeforeStatementFixer, NoExtraBlankLinesFixer, NoWhitespaceInBlankLineFixer, SingleLineCommentStyleFixer, SingleLineEmptyBodyFixer.\n     * Must run after NoEmptyStatementFixer, NoUnneededBracesFixer, NoUnneededCurlyBracesFixer, NoUselessElseFixer, SimplifiedNullReturnFixer.\n     *\/","14420":"\/**\n     * @param int $start Token index of the opening brace token of the function\n     * @param int $end   Token index of the closing brace token of the function\n     *\/","14421":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BlankLineBeforeStatementFixer.\n     * Must run after NoEmptyStatementFixer, NoUnneededBracesFixer, NoUnneededCurlyBracesFixer.\n     *\/","14422":"\/**\n     * @param int $functionIndex      token index of T_FUNCTION\n     * @param int $functionOpenIndex  token index of the opening brace token of the function\n     * @param int $functionCloseIndex token index of the closing brace token of the function\n     *\n     * @return int >= 0 number of tokens inserted into the Tokens collection\n     *\/","14423":"\/**\n     * @return int >= 0 number of tokens inserted into the Tokens collection\n     *\/","14424":"\/**\n     * @param int $index open brace index\n     *\n     * @return null|int index of the first token of a definition (lambda, anonymous class or match) or `null` if not an anonymous\n     *\/","14425":"\/**\n     * @param int $index open brace index\n     *\n     * @return null|int index of T_NEW of anonymous class or `null` if not an anonymous\n     *\/","14426":"\/**\n     * @param int $index open brace index\n     *\n     * @return null|int index of T_FUNCTION or T_STATIC of lambda or `null` if not a lambda\n     *\/","14427":"\/**\n     * @param int $index open brace index\n     *\n     * @return null|int index of T_MATCH or `null` if not a `match`\n     *\/","14429":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoUselessReturnFixer, VoidReturnFixer.\n     *\/","14430":"\/**\n     * Clear the return statement located at a given index.\n     *\/","14431":"\/**\n     * Does the return statement located at a given index need fixing?\n     *\/","14432":"\/**\n     * Is the return within a function with a non-void or nullable return type?\n     *\n     * @param int $returnIndex Current return token index\n     *\/","14433":"\/**\n     * Should we clear the specific token?\n     *\n     * We'll leave it alone if\n     * - token is a comment\n     * - token is whitespace that is immediately before a comment\n     * - token is whitespace that is immediately before the PHP close tag\n     * - token is whitespace that is immediately after a comment and before a semicolon\n     *\/","14434":"\/**\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n * @author Egidijus Gir\u010dys <e.gircys@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  strategy?: 'new_line_for_chained_calls'|'no_multi_line'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  strategy: 'new_line_for_chained_calls'|'no_multi_line'\n * }\n *\/","14438":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before SpaceAfterSemicolonFixer.\n     * Must run after CombineConsecutiveIssetsFixer, GetClassToClassKeywordFixer, NoEmptyStatementFixer, SimplifiedIfReturnFixer, SingleImportPerStatementFixer.\n     *\/","14439":"\/**\n     * Find the index for the next new line. Return the given index when there's no new line.\n     *\/","14440":"\/**\n     * Find the index for the previous significant token. Return the given index when there's no significant token.\n     *\/","14441":"\/**\n     * Checks if the semicolon closes a multiline call and returns the whitespace of the first call at $index.\n     * i.e. it will return the whitespace marked with '____' in the example underneath.\n     *\n     * ..\n     * ____$this->methodCall()\n     *          ->anotherCall();\n     * ..\n     *\/","14446":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BracesFixer, CombineConsecutiveUnsetsFixer, EmptyLoopBodyFixer, MultilineWhitespaceBeforeSemicolonsFixer, NoExtraBlankLinesFixer, NoMultipleStatementsPerLineFixer, NoSinglelineWhitespaceBeforeSemicolonsFixer, NoTrailingWhitespaceFixer, NoUselessElseFixer, NoUselessReturnFixer, NoWhitespaceInBlankLineFixer, ReturnAssignmentFixer, SpaceAfterSemicolonFixer, SwitchCaseSemicolonToColonFixer.\n     * Must run after NoUselessSprintfFixer.\n     *\/","14447":"\/**\n     * Fix semicolon after closing curly brace if needed.\n     *\n     * Test for the following cases\n     * - just '{' '}' block (following open tag or ';')\n     * - if, else, elseif\n     * - interface, trait, class (but not anonymous)\n     * - catch, finally (but not try)\n     * - for, foreach, while (but not 'do - while')\n     * - switch\n     * - function (declaration, but not lambda)\n     * - declare (with '{' '}')\n     * - namespace (with '{' '}')\n     *\n     * @param int $index Semicolon index\n     *\/","14449":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after CombineConsecutiveIssetsFixer, FunctionToConstantFixer, LongToShorthandOperatorFixer, NoEmptyStatementFixer, NoUnneededImportAliasFixer, SimplifiedIfReturnFixer, SingleImportPerStatementFixer.\n     *\/","14450":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before SimplifiedIfReturnFixer.\n     *\/","14451":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  remove_in_empty_for_expressions?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  remove_in_empty_for_expressions: bool\n * }\n *\/","14454":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after CombineConsecutiveUnsetsFixer, MultilineWhitespaceBeforeSemicolonsFixer, NoEmptyStatementFixer, OrderedClassElementsFixer, SingleImportPerStatementFixer, SingleTraitInsertPerStatementFixer.\n     *\/","14458":"\/**\n * @author Jordi Boggiano <j.boggiano@seld.be>\n *\/","14459":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BlankLineAfterOpeningTagFixer, DeclareEqualNormalizeFixer, HeaderCommentFixer.\n     *\/","14460":"\/**\n     * @param array<int, Token> $sequence\n     *\/","14462":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BinaryOperatorSpacesFixer, ModernizeStrposFixer.\n     *\/","14464":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before MethodArgumentSpaceFixer, NativeFunctionInvocationFixer.\n     *\/","14465":"\/**\n     * @param list<?Token> $functionParams\n     *\/","14466":"\/**\n * @author Filippo Tessarotto <zoeslam@gmail.com>\n * @author Michael Vorisek <https:\/\/github.com\/mvorisek>\n *\n * @deprecated Use `string_implicit_backslashes` with config: ['single_quoted' => 'ignore', 'double_quoted' => 'escape', 'heredoc' => 'escape'] (default)\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  double_quoted?: bool,\n *  heredoc_syntax?: bool,\n *  single_quoted?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  double_quoted: bool,\n *  heredoc_syntax: bool,\n *  single_quoted: bool\n * }\n *\/","14470":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before HeredocToNowdocFixer, SingleQuoteFixer.\n     * Must run after MultilineStringToHeredocFixer.\n     *\/","14474":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoUselessConcatOperatorFixer.\n     * Must run after BacktickToShellExecFixer.\n     *\/","14475":"\/**\n     * Check if token is a part of a string.\n     *\n     * @param Token $token The token to check\n     *\/","14476":"\/**\n * @author Michael Vorisek <https:\/\/github.com\/mvorisek>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  closing_marker?: string,\n *  explicit_heredoc_style?: bool,\n *  reserved_closing_markers?: list<string>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  closing_marker: string,\n *  explicit_heredoc_style: bool,\n *  reserved_closing_markers: list<string>\n * }\n *\/","14479":"\/**\n     * @return array{Token, Token}\n     *\/","14484":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after EscapeImplicitBackslashesFixer, StringImplicitBackslashesFixer.\n     *\/","14485":"\/**\n     * Transforms the heredoc start token to nowdoc notation.\n     *\/","14486":"\/**\n * @author Michael Vorisek <https:\/\/github.com\/mvorisek>\n *\/","14487":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before EscapeImplicitBackslashesFixer, HeredocIndentationFixer, StringImplicitBackslashesFixer.\n     *\/","14489":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoUselessConcatOperatorFixer, PhpUnitDedicateAssertInternalTypeFixer, RegularCallableCallFixer, SetTypeToCastFixer.\n     *\/","14491":"\/**\n * @author Dave van der Brugge <dmvdbrugge@gmail.com>\n *\/","14492":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after ExplicitStringVariableFixer.\n     *\/","14493":"\/**\n * @author Gregor Harlan <gharlan@web.de>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  strings_containing_single_quote_chars?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  strings_containing_single_quote_chars: bool\n * }\n *\/","14496":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoUselessConcatOperatorFixer.\n     * Must run after BacktickToShellExecFixer, EscapeImplicitBackslashesFixer, StringImplicitBackslashesFixer.\n     *\/","14500":"\/**\n * @author Filippo Tessarotto <zoeslam@gmail.com>\n * @author Michael Vorisek <https:\/\/github.com\/mvorisek>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  double_quoted?: 'escape'|'ignore'|'unescape',\n *  heredoc?: 'escape'|'ignore'|'unescape',\n *  single_quoted?: 'escape'|'ignore'|'unescape'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  double_quoted: 'escape'|'ignore'|'unescape',\n *  heredoc: 'escape'|'ignore'|'unescape',\n *  single_quoted: 'escape'|'ignore'|'unescape'\n * }\n *\/","14507":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before NoExtraBlankLinesFixer, NoTrailingWhitespaceFixer.\n     * Must run after NoSpacesInsideParenthesisFixer, SpacesInsideParenthesesFixer.\n     *\/","14509":"\/**\n * Fixes the line endings in multi-line strings.\n *\n * @author Ilija Tovilo <ilija.tovilo@me.com>\n *\/","14510":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before AlignMultilineCommentFixer, BinaryOperatorSpacesFixer.\n     * Must run after MethodArgumentSpaceFixer.\n     *\/","14511":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n * @author Andreas M\u00f6ller <am@localheinz.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  statements?: list<'break'|'case'|'continue'|'declare'|'default'|'do'|'exit'|'for'|'foreach'|'goto'|'if'|'include'|'include_once'|'phpdoc'|'require'|'require_once'|'return'|'switch'|'throw'|'try'|'while'|'yield'|'yield_from'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  statements: list<'break'|'case'|'continue'|'declare'|'default'|'do'|'exit'|'for'|'foreach'|'goto'|'if'|'include'|'include_once'|'phpdoc'|'require'|'require_once'|'return'|'switch'|'throw'|'try'|'while'|'yield'|'yield_from'>\n * }\n *\/","14515":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after NoExtraBlankLinesFixer, NoUselessElseFixer, NoUselessReturnFixer, ReturnAssignmentFixer, YieldFromArrayToYieldsFixer.\n     *\/","14518":"\/**\n * @author Sander Verkuil <s.verkuil@pm.me>\n *\/","14519":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after OrderedImportsFixer.\n     *\/","14520":"\/**\n     * @param list<int> $uses\n     *\/","14521":"\/**\n * @author Jack Cherng <jfcherng@gmail.com>\n *\/","14522":"\/**\n * @author Jack Cherng <jfcherng@gmail.com>\n *\n * @deprecated\n *\/","14524":"\/**\n * @author Gregor Harlan\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  indentation?: 'same_as_start'|'start_plus_one'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  indentation: 'same_as_start'|'start_plus_one'\n * }\n *\/","14527":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after BracesFixer, MultilineStringToHeredocFixer, StatementIndentationFixer.\n     *\/","14531":"\/**\n * Fixer for rules defined in PSR2 \u00b62.4.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","14532":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before PhpdocIndentFixer.\n     * Must run after ClassAttributesSeparationFixer.\n     *\/","14533":"\/**\n     * @return string mixed\n     *\/","14534":"\/**\n * Fixer for rules defined in PSR2 \u00b62.2.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","14535":"\/**\n * @author Vladimir Boliev <voff.web@gmail.com>\n *\/","14536":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after NoSpaceAroundDoubleColonFixer.\n     *\/","14537":"\/**\n     * @param int $index index of the first token on the line to indent\n     *\/","14538":"\/**\n     * @param int $index position of the object operator token (\"->\" or \"?->\")\n     *\/","14539":"\/**\n     * @param int $index index of the indentation token\n     *\/","14540":"\/**\n     * @param int $start index of first meaningful token on previous line\n     * @param int $end   index of last token on previous line\n     *\/","14541":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  tokens?: list<'attribute'|'break'|'case'|'continue'|'curly_brace_block'|'default'|'extra'|'parenthesis_brace_block'|'return'|'square_brace_block'|'switch'|'throw'|'use'|'use_trait'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  tokens: list<'attribute'|'break'|'case'|'continue'|'curly_brace_block'|'default'|'extra'|'parenthesis_brace_block'|'return'|'square_brace_block'|'switch'|'throw'|'use'|'use_trait'>\n * }\n *\/","14543":"\/**\n     * @var array<int, callable(int): void> key is token id\n     *\/","14544":"\/**\n     * @var array<string, callable(int): void> key is token's content\n     *\/","14546":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before BlankLineBeforeStatementFixer.\n     * Must run after ClassAttributesSeparationFixer, CombineConsecutiveUnsetsFixer, EmptyLoopBodyFixer, EmptyLoopConditionFixer, FunctionToConstantFixer, LongToShorthandOperatorFixer, ModernizeStrposFixer, NoEmptyCommentFixer, NoEmptyPhpdocFixer, NoEmptyStatementFixer, NoUnusedImportsFixer, NoUselessElseFixer, NoUselessReturnFixer, NoUselessSprintfFixer, PhpdocReadonlyClassCommentToKeywordFixer, StringLengthToEmptyFixer, YieldFromArrayToYieldsFixer.\n     *\/","14548":"\/**\n     * @uses fixAfterToken()\n     * @uses fixAfterCaseToken()\n     * @uses fixAfterThrowToken()\n     * @uses fixStructureOpenCloseIfMultiLine()\n     * @uses removeBetweenUse()\n     * @uses removeMultipleBlankLines()\n     *\/","14549":"\/**\n     * Remove white line(s) after the index of a block type,\n     * but only if the block is not on one line.\n     *\n     * @param int $index body start\n     *\/","14551":"\/**\n * @author Javier Spagnoletti <phansys@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  positions?: list<'inside'|'outside'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  positions: list<'inside'|'outside'>\n * }\n *\/","14557":"\/**\n * Fixer for rules defined in PSR2 \u00b64.3, \u00b64.6, \u00b65.\n *\n * @author Marc Aub\u00e9\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @deprecated in favor of SpacesInsideParenthesisFixer\n *\/","14559":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before FunctionToConstantFixer, GetClassToClassKeywordFixer, StringLengthToEmptyFixer.\n     * Must run after CombineConsecutiveIssetsFixer, CombineNestedDirnameFixer, IncrementStyleFixer, LambdaNotUsedImportFixer, ModernizeStrposFixer, NoUselessSprintfFixer, PowToExponentiationFixer.\n     *\/","14560":"\/**\n * Fixer for rules defined in PSR2 \u00b62.3.\n *\n * Don't add trailing spaces at the end of non-blank lines.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","14561":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after CombineConsecutiveIssetsFixer, CombineConsecutiveUnsetsFixer, EmptyLoopBodyFixer, EmptyLoopConditionFixer, FunctionToConstantFixer, ModernizeStrposFixer, NoEmptyCommentFixer, NoEmptyPhpdocFixer, NoEmptyStatementFixer, NoUnneededControlParenthesesFixer, NoUselessElseFixer, StringLengthToEmptyFixer, TernaryToElvisOperatorFixer.\n     *\/","14563":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after AssignNullCoalescingToCoalesceEqualFixer, CombineConsecutiveIssetsFixer, CombineConsecutiveUnsetsFixer, FunctionToConstantFixer, NoEmptyCommentFixer, NoEmptyStatementFixer, NoUselessElseFixer, NoUselessReturnFixer, YieldFromArrayToYieldsFixer.\n     *\/","14564":"\/**\n * A file must always end with a line endings character.\n *\n * Fixer for rules defined in PSR2 \u00b62.2.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","14565":"\/**\n * Fixer for rules defined in PSR2 \u00b64.3, \u00b64.6, \u00b65.\n *\n * @author Marc Aub\u00e9\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  space?: 'none'|'single'\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  space: 'none'|'single'\n * }\n *\/","14569":"\/**\n     * Remove spaces from token at a given index.\n     *\/","14574":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  stick_comment_to_next_continuous_control_statement?: bool\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  stick_comment_to_next_continuous_control_statement: bool\n * }\n *\/","14577":"\/**\n     * {@inheritdoc}\n     *\n     * Must run before HeredocIndentationFixer.\n     * Must run after BracesPositionFixer, ClassAttributesSeparationFixer, CurlyBracesPositionFixer, FullyQualifiedStrictTypesFixer, GlobalNamespaceImportFixer, MethodArgumentSpaceFixer, NoUselessElseFixer, YieldFromArrayToYieldsFixer.\n     *\/","14578":"\/**\n     * @return array{int, bool}\n     *\/","14579":"\/**\n     * Returns whether the token at given index is the last token in a property\n     * declaration before the type or the name of that property.\n     *\/","14580":"\/**\n     * Returns whether the token at given index is a comment whose indentation\n     * can be fixed.\n     *\n     * Indentation of a comment is not changed when the comment is part of a\n     * multi-line message whose lines are all single-line comments and at least\n     * one line has meaningful content.\n     *\/","14584":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n * @author John Paul E. Balandan, CPA <paulbalandan@gmail.com>\n *\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  elements?: list<'constant'|'function'|'property'>\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  elements: list<'constant'|'function'|'property'>\n * }\n *\/","14587":"\/**\n     * @return array<int, string>\n     *\n     * @phpstan-return array<int, 'method'|'property'|'const'>\n     *\/","14591":"\/**\n * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>\n *\n * @phpstan-type _AutogeneratedInputConfiguration array{\n *  space?: 'none'|'single',\n *  space_multiple_catch?: 'none'|'single'|null\n * }\n * @phpstan-type _AutogeneratedComputedConfiguration array{\n *  space: 'none'|'single',\n *  space_multiple_catch: 'none'|'single'|null\n * }\n *\/","14594":"\/**\n     * {@inheritdoc}\n     *\n     * Must run after NullableTypeDeclarationFixer, OrderedTypesFixer.\n     *\/","14606":"\/**\n     * Returns an indices of PHPUnit classes in reverse appearance order.\n     * Order is important - it's reverted, so if we inject tokens into collection,\n     * we do it for bottom of file first, and then to the top of the file, so we\n     * mitigate risk of not visiting whole collections (final indices).\n     *\n     * @return iterable<array{0: int, 1: int}> array of [int start, int end] indices from later to earlier classes\n     *\/","14608":"\/**\n     * @var array<string, LintingResultInterface>\n     *\/","14609":"\/**\n * Handle PHP code linting process.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @readonly\n *\n * @internal\n *\/","14610":"\/**\n * Interface for PHP code linting process manager.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","14611":"\/**\n     * Lint PHP file.\n     *\/","14612":"\/**\n     * Lint PHP code.\n     *\/","14613":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @final\n *\n * @TODO 4.0 make class \"final\"\n *\/","14615":"\/**\n     * Check if linting process was successful and raise LintingException if not.\n     *\/","14616":"\/**\n * Handle PHP code linting using separated process of `php -l _file_`.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","14617":"\/**\n     * Temporary file for code linting.\n     *\/","14618":"\/**\n     * @param null|string $executable PHP executable, null for autodetection\n     *\/","14621":"\/**\n     * @param string $path path to file\n     *\/","14622":"\/**\n     * Create process that lint PHP code.\n     *\n     * @param string $source code\n     *\/","14624":"\/**\n     * @param string $executable PHP executable\n     *\/","14626":"\/**\n * Handle PHP code linting.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @readonly\n *\n * @internal\n *\/","14628":"\/**\n * Exception that is thrown when the chosen linter is not available on the environment.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @final\n *\n * @TODO 4.0 make class \"final\"\n *\/","14629":"\/**\n * @author Greg Korba <greg@codito.dev>\n *\n * @TODO 4.0 Include parallel runner config in main ConfigInterface\n *\/","14651":"\/**\n     * @return null|string the invalidity reason if any, null otherwise\n     *\/","14652":"\/**\n * This class replaces preg_* functions to better handling UTF8 strings,\n * ensuring no matter \"u\" modifier is present or absent subject will be handled correctly.\n *\n * @author Kuba Wer\u0142os <werlos@gmail.com>\n *\n * @internal\n *\/","14653":"\/**\n     * @param array<array-key, mixed>                               $matches\n     * @param int-mask<PREG_OFFSET_CAPTURE, PREG_UNMATCHED_AS_NULL> $flags\n     *\n     * @param-out ($flags is PREG_OFFSET_CAPTURE\n     *     ? array<array-key, array{string, 0|positive-int}|array{'', -1}>\n     *     : ($flags is PREG_UNMATCHED_AS_NULL\n     *         ? array<array-key, string|null>\n     *         : ($flags is int-mask<PREG_OFFSET_CAPTURE, PREG_UNMATCHED_AS_NULL>&768\n     *             ? array<array-key, array{string, 0|positive-int}|array{null, -1}>\n     *             : array<array-key, string>\n     *         )\n     *     )\n     * ) $matches\n     *\n     * @throws PregException\n     *\/","14654":"\/**\n     * @param array<array-key, mixed>                                                                   $matches\n     * @param int-mask<PREG_PATTERN_ORDER, PREG_SET_ORDER, PREG_OFFSET_CAPTURE, PREG_UNMATCHED_AS_NULL> $flags\n     *\n     * @param-out ($flags is PREG_PATTERN_ORDER\n     *     ? array<list<string>>\n     *     : ($flags is PREG_SET_ORDER\n     *         ? list<array<string>>\n     *         : ($flags is int-mask<PREG_PATTERN_ORDER, PREG_OFFSET_CAPTURE>&(256|257)\n     *             ? array<list<array{string, int}>>\n     *             : ($flags is int-mask<PREG_SET_ORDER, PREG_OFFSET_CAPTURE>&258\n     *                 ? list<array<array{string, int}>>\n     *                 : ($flags is int-mask<PREG_PATTERN_ORDER, PREG_UNMATCHED_AS_NULL>&(512|513)\n     *                     ? array<list<?string>>\n     *                     : ($flags is int-mask<PREG_SET_ORDER, PREG_UNMATCHED_AS_NULL>&514\n     *                         ? list<array<?string>>\n     *                         : ($flags is int-mask<PREG_SET_ORDER, PREG_OFFSET_CAPTURE, PREG_UNMATCHED_AS_NULL>&770\n     *                             ? list<array<array{?string, int}>>\n     *                             : ($flags is 0 ? array<list<string>> : array<mixed>)\n     *                         )\n     *                     )\n     *                 )\n     *             )\n     *         )\n     *     )\n     * ) $matches\n     *\n     * @throws PregException\n     *\/","14655":"\/**\n     * @param array<array-key, string>|string $subject\n     *\n     * @param-out int $count\n     *\n     * @throws PregException\n     *\/","14656":"\/**\n     * @param-out int $count\n     *\n     * @throws PregException\n     *\/","14657":"\/**\n     * @return list<string>\n     *\n     * @throws PregException\n     *\/","14658":"\/**\n     * Create the generic PregException message and tell more about such kind of error in the message.\n     *\/","14659":"\/**\n * Exception that is thrown when PCRE function encounters an error.\n *\n * @author Kuba Wer\u0142os <werlos@gmail.com>\n *\n * @internal\n *\/","14661":"\/**\n     * Get all rules from rules set.\n     *\n     * @return array<string, array<string, mixed>|bool>\n     *\/","14664":"\/**\n * @author Greg Korba <greg@codito.dev>\n *\/","14665":"\/**\n     * Returns names of rule sets to use instead, if any.\n     *\n     * @return list<string>\n     *\/","14667":"\/**\n * Set of rules to be used by fixer.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @readonly\n *\n * @internal\n *\/","14668":"\/**\n     * Group of rules generated from input set.\n     *\n     * The key is name of rule, value is configuration array or true.\n     * The key must not point to any set.\n     *\n     * @var array<string, array<string, mixed>|true>\n     *\/","14669":"\/**\n     * Resolve input set into group of rules.\n     *\n     * @param array<string, array<string, mixed>|bool> $rules\n     *\n     * @return array<string, array<string, mixed>|true>\n     *\/","14670":"\/**\n     * Resolve set rules as part of another set.\n     *\n     * If set value is false then disable all fixers in set,\n     * if not then get value from set item.\n     *\n     * @return array<string, array<string, mixed>|bool>\n     *\/","14673":"\/**\n * Set of rules to be used by fixer.\n *\n * Example of set: [\"@PSR2\" => true, \"@PSR1\" => false, \"strict\" => true].\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\/","14674":"\/**\n     * @param array<string, array<string, mixed>|bool> $set\n     *\/","14675":"\/**\n     * Get configuration for given rule.\n     *\n     * @return null|array<string, mixed>\n     *\/","14676":"\/**\n     * Get all rules from rules set.\n     *\n     * @return array<string, array<string, mixed>|true>\n     *\/","14677":"\/**\n     * Check given rule is in rules set.\n     *\/","14678":"\/**\n * Set of rule sets to be used by fixer.\n *\n * @internal\n *\/","14679":"\/**\n     * @var null|array<string, RuleSetDescriptionInterface>\n     *\/","14680":"\/**\n     * @return array<string, RuleSetDescriptionInterface>\n     *\/","14683":"\/**\n * @internal\n *\n * PER Coding Style v1.0.\n *\n * @see https:\/\/github.com\/php-fig\/per-coding-style\/blob\/1.0.0\/spec.md\n *\/","14685":"\/**\n * @internal\n *\n * PER Coding Style v2.0.\n *\n * @see https:\/\/github.com\/php-fig\/per-coding-style\/blob\/2.0.0\/spec.md\n *\/","14689":"\/**\n * @internal\n *\n * @deprecated use `@PER-CS:risky` instead\n *\n * @TODO 4.0 remove me\n *\n * Last updated to PER Coding Style v2.0.\n *\/","14690":"\/**\n * @internal\n *\n * @deprecated use `@PER-CS` instead\n *\n * @TODO 4.0 remove me\n *\n * Last updated to PER Coding Style v2.0.\n *\/","14731":"\/**\n * Event that is fired when Fixer starts analysis.\n *\n * @author Greg Korba <greg@codito.dev>\n *\n * @internal\n *\/","14732":"\/** @var self::MODE_* *\/","14733":"\/**\n     * @param self::MODE_* $mode\n     *\/","14734":"\/**\n     * Stops the propagation of the event to further event listeners.\n     *\n     * If multiple event listeners are connected to the same event, no\n     * further event listener will be triggered once any trigger calls\n     * stopPropagation().\n     *\/","14735":"\/**\n * Event that is fired when file was processed by Fixer.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","14736":"\/**\n     * Event name.\n     *\/","14737":"\/**\n     * @var self::STATUS_*\n     *\/","14738":"\/**\n     * @param self::STATUS_* $status\n     *\/","14739":"\/**\n     * @return self::STATUS_*\n     *\/","14741":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\n * @extends \\CachingIterator<mixed, \\SplFileInfo, \\Iterator<mixed, \\SplFileInfo>>\n *\/","14742":"\/**\n     * @param \\Iterator<mixed, \\SplFileInfo> $iterator\n     *\/","14743":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\n * @extends \\FilterIterator<mixed, \\SplFileInfo, \\Iterator<mixed, \\SplFileInfo>>\n *\/","14745":"\/**\n     * @param \\Traversable<\\SplFileInfo> $iterator\n     *\/","14746":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\n * @extends \\IteratorIterator<mixed, \\SplFileInfo, \\Traversable<\\SplFileInfo>>\n *\/","14748":"\/**\n * @author Greg Korba <greg@codito.dev>\n *\n * @internal\n *\n * @extends \\Iterator<mixed, \\SplFileInfo>\n *\/","14750":"\/**\n * @author Greg Korba <greg@codito.dev>\n *\n * @readonly\n *\/","14753":"\/**\n     * @param positive-int $maxProcesses\n     * @param positive-int $filesPerProcess\n     * @param positive-int $processTimeout\n     *\/","14755":"\/**\n     * @param null|positive-int $filesPerProcess\n     * @param null|positive-int $processTimeout\n     * @param null|positive-int $maxProcesses\n     *\/","14756":"\/**\n * Common exception for all the errors related to parallelisation.\n *\n * @author Greg Korba <greg@codito.dev>\n *\n * @internal\n *\/","14757":"\/**\n * Represents single process that is handled within parallel run.\n * Inspired by:\n *   - https:\/\/github.com\/phpstan\/phpstan-src\/blob\/9ce425bca5337039fb52c0acf96a20a2b8ace490\/src\/Parallel\/Process.php\n *   - https:\/\/github.com\/phpstan\/phpstan-src\/blob\/1477e752b4b5893f323b6d2c43591e68b3d85003\/src\/Process\/ProcessHelper.php.\n *\n * @author Greg Korba <greg@codito.dev>\n *\n * @internal\n *\/","14758":"\/** @var resource *\/","14760":"\/** @var callable(array<array-key, mixed>): void *\/","14761":"\/** @var callable(\\Throwable): void *\/","14762":"\/**\n     * @param callable(array<array-key, mixed> $json): void  $onData  callback to be called when data is received from the parallelisation operator\n     * @param callable(\\Throwable $exception): void          $onError callback to be called when an exception occurs\n     * @param callable(?int $exitCode, string $output): void $onExit  callback to be called when the process exits\n     *\/","14763":"\/**\n     * Handles requests from parallelisation operator to its worker (spawned process).\n     *\n     * @param array<array-key, mixed> $data\n     *\/","14764":"\/**\n * @author Greg Korba <greg@codito.dev>\n *\n * @readonly\n *\n * @internal\n *\/","14765":"\/**\n     * @private\n     *\n     * @return list<string>\n     *\/","14766":"\/**\n * Represents identifier of single process that is handled within parallel run.\n *\n * @author Greg Korba <greg@codito.dev>\n *\n * @readonly\n *\n * @internal\n *\/","14767":"\/**\n * Represents collection of active processes that are being run in parallel.\n * Inspired by {@see https:\/\/github.com\/phpstan\/phpstan-src\/blob\/ed68345a82992775112acc2c2bd639d1bd3a1a02\/src\/Parallel\/ProcessPool.php}.\n *\n * @author Greg Korba <greg@codito.dev>\n *\n * @internal\n *\/","14769":"\/**\n     * @var null|(callable(): void)\n     *\n     * @readonly\n     *\/","14770":"\/**\n     * @var array<string, Process>\n     *\/","14771":"\/**\n     * @param null|(callable(): void) $onServerClose\n     *\/","14772":"\/**\n * @author Greg Korba <gre@codito.dev>\n *\n * @internal\n *\/","14773":"\/**\n     * @param array{\n     *     class: class-string<Throwable>,\n     *     message: string,\n     *     file: string,\n     *     line: int,\n     *     code: int,\n     *     trace: string\n     * } $data\n     *\/","14774":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n * @author Greg Korba <greg@codito.dev>\n *\n * @phpstan-type _RunResult array<string, array{appliedFixers: list<string>, diff: string}>\n *\/","14775":"\/**\n     * Buffer size used in the NDJSON decoder for communication between main process and workers.\n     *\n     * @see https:\/\/github.com\/PHP-CS-Fixer\/PHP-CS-Fixer\/pull\/8068\n     *\/","14776":"\/**\n     * @var null|\\Traversable<array-key, \\SplFileInfo>\n     *\/","14778":"\/**\n     * @param null|\\Traversable<array-key, \\SplFileInfo> $fileIterator\n     * @param list<FixerInterface>                       $fixers\n     *\/","14779":"\/**\n     * @TODO consider to drop this method and make iterator parameter obligatory in constructor,\n     * more in https:\/\/github.com\/PHP-CS-Fixer\/PHP-CS-Fixer\/pull\/7777\/files#r1590447581\n     *\n     * @param \\Traversable<array-key, \\SplFileInfo> $fileIterator\n     *\/","14780":"\/**\n     * @return _RunResult\n     *\/","14781":"\/**\n     * Heavily inspired by {@see https:\/\/github.com\/phpstan\/phpstan-src\/blob\/9ce425bca5337039fb52c0acf96a20a2b8ace490\/src\/Parallel\/ParallelAnalyser.php}.\n     *\n     * @return _RunResult\n     *\/","14783":"\/**\n     * @return null|array{appliedFixers: list<string>, diff: string}\n     *\/","14784":"\/**\n     * Process an exception that occurred.\n     *\/","14786":"\/**\n * @author Davi Koscianski Vidal <davividal@gmail.com>\n *\n * @internal\n *\/","14787":"\/**\n     * @param null|class-string<\\SplFileInfo> $class\n     *\/","14790":"\/**\n     * Return minimal required PHP version id to transform the code.\n     *\n     * Custom Token kinds from Transformers are always registered, but sometimes\n     * there is no need to analyse the Tokens if for sure we cannot find examined\n     * token kind, e.g. transforming `T_FUNCTION` in `<?php use function Foo\\\\bar;`\n     * code.\n     *\/","14791":"\/**\n     * Process Token to transform it into custom token when needed.\n     *\/","14793":"\/**\n     * @param array{0: int, 1: string}|string $originalToken\n     *\/","14796":"\/**\n * @internal\n *\n * @TODO 4.0 remove this analyzer and move this logic into a transformer\n *\/","14799":"\/**\n     * The name of the argument.\n     *\/","14800":"\/**\n     * The index where the name is located in the supplied Tokens object.\n     *\/","14801":"\/**\n     * The default value of the argument.\n     *\/","14802":"\/**\n     * The type analysis of the argument.\n     *\/","14803":"\/**\n * @readonly\n *\n * @internal\n *\n * @phpstan-type _AttributeItem array{start: int, end: int, name: string}\n * @phpstan-type _AttributeItems non-empty-list<_AttributeItem>\n *\/","14804":"\/**\n     * @var _AttributeItems\n     *\/","14806":"\/**\n     * @return _AttributeItems\n     *\/","14807":"\/**\n * @author Kuba Wer\u0142os <werlos@gmail.com>\n *\n * @readonly\n *\n * @internal\n *\/","14808":"\/**\n * @internal\n *\n * @readonly\n *\/","14809":"\/** @var non-empty-list<array{int, int}> *\/","14810":"\/**\n     * @param non-empty-list<array{int, int}> $usageIndices\n     *\/","14811":"\/**\n     * @return non-empty-list<array{int, int}>\n     *\/","14814":"\/**\n     * @var list<CaseAnalysis>\n     *\/","14815":"\/**\n     * @param list<CaseAnalysis> $cases\n     *\/","14816":"\/**\n     * @return list<CaseAnalysis>\n     *\/","14819":"\/**\n     * The fully qualified namespace name.\n     *\/","14820":"\/**\n     * The short version of the namespace.\n     *\/","14821":"\/**\n     * The start index of the namespace declaration in the analyzed Tokens.\n     *\/","14822":"\/**\n     * The end index of the namespace declaration in the analyzed Tokens.\n     *\/","14823":"\/**\n     * The start index of the scope of the namespace in the analyzed Tokens.\n     *\/","14824":"\/**\n     * The end index of the scope of the namespace in the analyzed Tokens.\n     *\/","14825":"\/**\n * @author VeeWee <toonverwerft@gmail.com>\n * @author Greg Korba <greg@codito.dev>\n *\n * @readonly\n *\n * @internal\n *\n * @phpstan-type _ImportType 'class'|'constant'|'function'\n *\/","14826":"\/**\n     * The fully qualified use namespace.\n     *\n     * @var class-string\n     *\/","14827":"\/**\n     * The short version of use namespace or the alias name in case of aliased use statements.\n     *\/","14828":"\/**\n     * Is the use statement part of multi-use (`use A, B, C;`, `use A\\{B, C};`)?\n     *\/","14829":"\/**\n     * Is the use statement being aliased?\n     *\/","14832":"\/**\n     * The start index of the single import in the multi-use statement.\n     *\/","14833":"\/**\n     * The end index of the single import in the multi-use statement.\n     *\/","14834":"\/**\n     * The type of import: class, function or constant.\n     *\n     * @var self::TYPE_*\n     *\/","14835":"\/**\n     * @param self::TYPE_* $type\n     * @param class-string $fullName\n     *\/","14837":"\/**\n     * @return self::TYPE_*\n     *\/","14838":"\/**\n     * @return _ImportType\n     *\/","14840":"\/**\n     * The start index of the analyzed subject inside of the Tokens.\n     *\/","14841":"\/**\n     * The end index of the analyzed subject inside of the Tokens.\n     *\/","14847":"\/**\n     * This list contains soft and hard reserved types that can be used or will be used by PHP at some point.\n     *\n     * More info:\n     *\n     * @see https:\/\/php.net\/manual\/en\/functions.arguments.php#functions.arguments.type-declaration.types\n     * @see https:\/\/php.net\/manual\/en\/reserved.other-reserved-words.php\n     *\n     * @var list<string>\n     *\/","14848":"\/**\n     * @param ($startIndex is null ? null : int) $endIndex\n     *\/","14849":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n * @author Vladimir Reznichenko <kalessil@gmail.com>\n *\n * @internal\n *\/","14850":"\/**\n     * Count amount of parameters in a function\/method reference.\n     *\/","14851":"\/**\n     * Returns start and end token indices of arguments.\n     *\n     * Returns an array with each key being the first token of an\n     * argument and the value the last. Including non-function tokens\n     * such as comments and white space tokens, but without the separation\n     * tokens like '(', ',' and ')'.\n     *\n     * @return array<int, int>\n     *\/","14852":"\/**\n * @internal\n *\n * @phpstan-import-type _AttributeItems from AttributeAnalysis\n *\/","14853":"\/**\n     * Check if given index is an attribute declaration.\n     *\/","14854":"\/**\n     * Find all consecutive elements that start with #[ and end with ] and the attributes inside.\n     *\n     * @return list<AttributeAnalysis>\n     *\/","14855":"\/**\n     * Find one element that starts with #[ and ends with ] and the attributes inside.\n     *\/","14857":"\/**\n * @author Kuba Wer\u0142os <werlos@gmail.com>\n *\n * @internal\n *\/","14858":"\/**\n     * @return Tokens::BLOCK_TYPE_*\n     *\/","14861":"\/**\n     * Check if comment at given index precedes structural element.\n     *\n     * @see https:\/\/github.com\/php-fig\/fig-standards\/blob\/master\/proposed\/phpdoc.md#3-definitions\n     *\/","14862":"\/**\n     * Check if comment at given index precedes return statement.\n     *\/","14863":"\/**\n     * Return array of indices that are part of a comment started at given index.\n     *\n     * @param int $index T_COMMENT index\n     *\n     * @return non-empty-list<int>\n     *\/","14864":"\/**\n     * @see https:\/\/github.com\/phpDocumentor\/fig-standards\/blob\/master\/proposed\/phpdoc.md#3-definitions\n     *\/","14865":"\/**\n     * Checks control structures (for, foreach, if, switch, while) for correct docblock usage.\n     *\n     * @param Token $docsToken    docs Token\n     * @param int   $controlIndex index of control structure Token\n     *\/","14866":"\/**\n     * Checks variable assignments through `list()`, `print()` etc. calls for correct docblock usage.\n     *\n     * @param Token $docsToken              docs Token\n     * @param int   $languageConstructIndex index of variable Token\n     *\/","14867":"\/**\n     * Checks variable assignments for correct docblock usage.\n     *\n     * @param int $index index of variable Token\n     *\/","14868":"\/**\n     * @param list<int> $types Token types of interest of which analyzes must be returned\n     *\n     * @return \\Generator<int, AbstractControlCaseStructuresAnalysis>\n     *\/","14869":"\/**\n     * @param array{\n     *     kind: int,\n     *     index: int,\n     *     open: int,\n     *     end: int,\n     *     cases: list<array{index: int, open: int}>,\n     *     default: null|array{index: int, open: int},\n     * } $analysis\n     *\/","14872":"\/**\n     * @return list<DataProviderAnalysis>\n     *\/","14875":"\/**\n     * @var list<NamespaceAnalysis>\n     *\/","14876":"\/**\n     * @var array<int, list<NamespaceUseAnalysis>>\n     *\/","14877":"\/**\n     * @param NamespaceUseAnalysis::TYPE_* $importType\n     *\/","14880":"\/**\n     * @var array{tokens: string, imports: list<NamespaceUseAnalysis>, declarations: list<int>}\n     *\/","14881":"\/**\n     * Important: risky because of the limited (file) scope of the tool.\n     *\/","14882":"\/**\n     * @return array<string, ArgumentAnalysis>\n     *\/","14884":"\/**\n * @author VeeWee <toonverwerft@gmail.com>\n * @author Greg Korba <greg@codito.dev>\n *\n * @internal\n *\n * @TODO Drop `allowMultiUses` opt-in flag when all fixers are updated and can handle multi-use statements.\n *\/","14885":"\/**\n     * @return list<NamespaceUseAnalysis>\n     *\/","14887":"\/**\n     * @param list<int> $useIndices\n     *\n     * @return list<NamespaceUseAnalysis>\n     *\/","14889":"\/**\n     * @return NamespaceUseAnalysis::TYPE_*\n     *\/","14890":"\/**\n     * @return array{fullName: class-string, shortName: string, aliased: bool, afterIndex: int}\n     *\/","14892":"\/**\n     * @return list<NamespaceAnalysis>\n     *\/","14893":"\/**\n     * @return array{NamespaceAnalysis, array<string, NamespaceUseAnalysis>}\n     *\/","14895":"\/**\n     * Meaningful compare of tokens within ranges.\n     *\n     * @param array{start: int, end: int} $range1\n     * @param array{start: int, end: int} $range2\n     *\/","14898":"\/** @var array<non-empty-string, list<int>> *\/","14902":"\/**\n     * Get name for custom token.\n     *\n     * @param int $value custom token value\n     *\n     * @return non-empty-string\n     *\/","14903":"\/**\n     * Check if given custom token exists.\n     *\n     * @param int $value custom token value\n     *\/","14904":"\/**\n     * @return array<self::T_*, non-empty-string>\n     *\/","14906":"\/**\n     * Calculate hash for code.\n     *\n     * @return non-empty-string\n     *\/","14908":"\/**\n     * @param array{\n     *     const?: array<int|string, class-string>,\n     *     class?: array<int|string, class-string>,\n     *     function?: array<int|string, class-string>\n     * } $imports\n     *\/","14910":"\/**\n * Representation of single token.\n * As a token prototype you should understand a single element generated by token_get_all.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @readonly\n *\/","14911":"\/**\n     * Content of token prototype.\n     *\/","14912":"\/**\n     * ID of token prototype, if available.\n     *\/","14913":"\/**\n     * If token prototype is an array.\n     *\/","14914":"\/**\n     * @param array{int, string}|string $token token prototype\n     *\/","14916":"\/**\n     * Get classy tokens kinds: T_CLASS, T_INTERFACE and T_TRAIT.\n     *\n     * @return list<int>\n     *\/","14917":"\/**\n     * Get object operator tokens kinds: T_OBJECT_OPERATOR and (if available) T_NULLSAFE_OBJECT_OPERATOR.\n     *\n     * @return list<int>\n     *\/","14918":"\/**\n     * Check if token is equals to given one.\n     *\n     * If tokens are arrays, then only keys defined in parameter token are checked.\n     *\n     * @param array{0: int, 1?: string}|string|Token $other         token or it's prototype\n     * @param bool                                   $caseSensitive perform a case sensitive comparison\n     *\/","14919":"\/**\n     * Check if token is equals to one of given.\n     *\n     * @param list<array{0: int, 1?: string}|string|Token> $others        array of tokens or token prototypes\n     * @param bool                                         $caseSensitive perform a case sensitive comparison\n     *\/","14920":"\/**\n     * A helper method used to find out whether a certain input token has to be case-sensitively matched.\n     *\n     * @param array<int, bool>|bool $caseSensitive global case sensitiveness or an array of booleans, whose keys should match\n     *                                             the ones used in $sequence. If any is missing, the default case-sensitive\n     *                                             comparison is used\n     * @param int                   $key           the key of the token that has to be looked up\n     *\n     * @deprecated\n     *\/","14921":"\/**\n     * @return array{int, non-empty-string}|string\n     *\/","14922":"\/**\n     * Get token's content.\n     *\n     * It shall be used only for getting the content of token, not for checking it against excepted value.\n     *\/","14923":"\/**\n     * Get token's id.\n     *\n     * It shall be used only for getting the internal id of token, not for checking it against excepted value.\n     *\/","14924":"\/**\n     * Get token's name.\n     *\n     * It shall be used only for getting the name of token, not for checking it against excepted value.\n     *\n     * @return null|non-empty-string token name\n     *\/","14926":"\/**\n     * Generate array containing all keywords that exists in PHP version in use.\n     *\n     * @return list<int>\n     *\/","14927":"\/**\n     * Generate array containing all predefined constants that exists in PHP version in use.\n     *\n     * @see https:\/\/php.net\/manual\/en\/language.constants.predefined.php\n     *\n     * @return array<int, int>\n     *\/","14928":"\/**\n     * Check if token prototype is an array.\n     *\n     * @return bool is array\n     *\n     * @phpstan-assert-if-true !=null $this->getId()\n     * @phpstan-assert-if-true !='' $this->getContent()\n     *\/","14929":"\/**\n     * Check if token is one of type cast tokens.\n     *\n     * @phpstan-assert-if-true !='' $this->getContent()\n     *\/","14930":"\/**\n     * Check if token is one of classy tokens: T_CLASS, T_INTERFACE, T_TRAIT or T_ENUM.\n     *\n     * @phpstan-assert-if-true !='' $this->getContent()\n     *\/","14931":"\/**\n     * Check if token is one of comment tokens: T_COMMENT or T_DOC_COMMENT.\n     *\n     * @phpstan-assert-if-true !='' $this->getContent()\n     *\/","14932":"\/**\n     * Check if token is one of object operator tokens: T_OBJECT_OPERATOR or T_NULLSAFE_OBJECT_OPERATOR.\n     *\n     * @phpstan-assert-if-true !='' $this->getContent()\n     *\/","14933":"\/**\n     * Check if token is one of given kind.\n     *\n     * @param int|list<int> $possibleKind kind or array of kinds\n     *\n     * @phpstan-assert-if-true !='' $this->getContent()\n     *\/","14934":"\/**\n     * Check if token is a keyword.\n     *\n     * @phpstan-assert-if-true !='' $this->getContent()\n     *\/","14935":"\/**\n     * Check if token is a native PHP constant: true, false or null.\n     *\n     * @phpstan-assert-if-true !='' $this->getContent()\n     *\/","14936":"\/**\n     * Returns if the token is of a Magic constants type.\n     *\n     * @phpstan-assert-if-true !='' $this->getContent()\n     *\n     * @see https:\/\/php.net\/manual\/en\/language.constants.predefined.php\n     *\/","14937":"\/**\n     * Check if token is whitespace.\n     *\n     * @param null|string $whitespaces whitespace characters, default is \" \\t\\n\\r\\0\\x0B\"\n     *\/","14938":"\/**\n     * @return array{\n     *     id: int|null,\n     *     name: non-empty-string|null,\n     *     content: string,\n     *     isArray: bool,\n     *     changed: bool,\n     * }\n     *\/","14940":"\/**\n     * @param list<string> $tokenNames\n     *\n     * @return array<int, int>\n     *\/","14941":"\/**\n * Collection of code tokens.\n *\n * Its role is to provide the ability to manage collection and navigate through it.\n *\n * As a token prototype you should understand a single element generated by token_get_all.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @extends \\SplFixedArray<Token>\n *\n * @method Token offsetGet($offset)\n *\n * @final\n *\/","14942":"\/**\n     * Static class cache.\n     *\n     * @var array<non-empty-string, self>\n     *\/","14943":"\/**\n     * Cache of block starts. Any change in collection will invalidate it.\n     *\n     * @var array<int, int>\n     *\/","14944":"\/**\n     * Cache of block ends. Any change in collection will invalidate it.\n     *\n     * @var array<int, int>\n     *\/","14945":"\/**\n     * An MD5 hash of the code string.\n     *\n     * @var ?non-empty-string\n     *\/","14946":"\/**\n     * An hash of the collection items.\n     *\n     * @var ?non-empty-string\n     *\/","14947":"\/**\n     * Flag is collection was changed.\n     *\n     * It doesn't know about change of collection's items. To check it run `isChanged` method.\n     *\/","14948":"\/**\n     * Set of found token kinds.\n     *\n     * When the token kind is present in this set it means that given token kind\n     * was ever seen inside the collection (but may not be part of it any longer).\n     * The key is token kind and the value is the number of occurrences.\n     *\n     * @var array<int|string, int<0, max>>\n     *\/","14949":"\/**\n     * @var null|list<NamespaceAnalysis>\n     *\/","14950":"\/**\n     * Clone tokens collection.\n     *\/","14951":"\/**\n     * Clear cache - one position or all of them.\n     *\n     * @param null|non-empty-string $key position to clear, when null clear all\n     *\/","14952":"\/**\n     * Detect type of block.\n     *\n     * @return null|array{type: self::BLOCK_TYPE_*, isStart: bool}\n     *\/","14954":"\/**\n     * Create token collection directly from code.\n     *\n     * @param string $code PHP code\n     *\/","14955":"\/**\n     * @return array<self::BLOCK_TYPE_*, array{start: array{int, string}|string, end: array{int, string}|string}>\n     *\/","14956":"\/**\n     * Set new size of collection.\n     *\n     * @param int $size\n     *\/","14957":"\/**\n     * Unset collection item.\n     *\n     * @param int $index\n     *\/","14958":"\/**\n     * Set collection item.\n     *\n     * Warning! `$newval` must not be typehinted to be compatible with `ArrayAccess::offsetSet` method.\n     *\n     * @param int   $index\n     * @param Token $newval\n     *\/","14959":"\/**\n     * Clear internal flag if collection was changed and flag for all collection's items.\n     *\/","14960":"\/**\n     * Clear empty tokens.\n     *\n     * Empty tokens can occur e.g. after calling clear on item of collection.\n     *\/","14961":"\/**\n     * Ensure that on given index is a whitespace with given kind.\n     *\n     * If there is a whitespace then it's content will be modified.\n     * If not - the new Token will be added.\n     *\n     * @param int    $index       index\n     * @param int    $indexOffset index offset for Token insertion\n     * @param string $whitespace  whitespace to set\n     *\n     * @return bool if new Token was added\n     *\/","14962":"\/**\n     * @param self::BLOCK_TYPE_* $type        type of block\n     * @param int                $searchIndex index of opening brace\n     *\n     * @return int<0, max> index of closing brace\n     *\/","14963":"\/**\n     * @param self::BLOCK_TYPE_* $type        type of block\n     * @param int                $searchIndex index of closing brace\n     *\n     * @return int<0, max> index of opening brace\n     *\/","14964":"\/**\n     * @param int|non-empty-list<int> $possibleKind kind or array of kinds\n     * @param int                     $start        optional offset\n     * @param null|int                $end          optional limit\n     *\n     * @return ($possibleKind is int ? array<int<0, max>, Token> : array<int, array<int<0, max>, Token>>)\n     *\/","14965":"\/**\n     * Generate code from tokens between given indices.\n     *\n     * @param int $start start index\n     * @param int $end   end index\n     *\/","14966":"\/**\n     * Get hash of code.\n     *\/","14967":"\/**\n     * @return non-empty-string\n     *\n     * @internal\n     *\/","14968":"\/**\n     * Get index for closest next token which is non whitespace.\n     *\n     * This method is shorthand for getNonWhitespaceSibling method.\n     *\n     * @param int         $index       token index\n     * @param null|string $whitespaces whitespaces characters for Token::isWhitespace\n     *\/","14969":"\/**\n     * Get index for closest next token of given kind.\n     *\n     * This method is shorthand for getTokenOfKindSibling method.\n     *\n     * @param int                           $index         token index\n     * @param list<array{int}|string|Token> $tokens        possible tokens\n     * @param bool                          $caseSensitive perform a case sensitive comparison\n     *\/","14970":"\/**\n     * Get index for closest sibling token which is non whitespace.\n     *\n     * @param int         $index       token index\n     * @param -1|1        $direction\n     * @param null|string $whitespaces whitespaces characters for Token::isWhitespace\n     *\/","14971":"\/**\n     * Get index for closest previous token which is non whitespace.\n     *\n     * This method is shorthand for getNonWhitespaceSibling method.\n     *\n     * @param int         $index       token index\n     * @param null|string $whitespaces whitespaces characters for Token::isWhitespace\n     *\/","14972":"\/**\n     * Get index for closest previous token of given kind.\n     * This method is shorthand for getTokenOfKindSibling method.\n     *\n     * @param int                           $index         token index\n     * @param list<array{int}|string|Token> $tokens        possible tokens\n     * @param bool                          $caseSensitive perform a case sensitive comparison\n     *\/","14973":"\/**\n     * Get index for closest sibling token of given kind.\n     *\n     * @param int                           $index         token index\n     * @param -1|1                          $direction\n     * @param list<array{int}|string|Token> $tokens        possible tokens\n     * @param bool                          $caseSensitive perform a case sensitive comparison\n     *\/","14974":"\/**\n     * Get index for closest sibling token not of given kind.\n     *\n     * @param int                           $index     token index\n     * @param -1|1                          $direction\n     * @param list<array{int}|string|Token> $tokens    possible tokens\n     *\/","14975":"\/**\n     * Get index for closest sibling token not of given kind.\n     *\n     * @param int       $index     token index\n     * @param -1|1      $direction\n     * @param list<int> $kinds     possible tokens kinds\n     *\/","14976":"\/**\n     * Get index for closest sibling token that is not a whitespace, comment or attribute.\n     *\n     * @param int  $index     token index\n     * @param -1|1 $direction\n     *\/","14977":"\/**\n     * Get index for closest sibling token which is not empty.\n     *\n     * @param int  $index     token index\n     * @param -1|1 $direction\n     *\/","14978":"\/**\n     * Get index for closest next token that is not a whitespace or comment.\n     *\n     * @param int $index token index\n     *\/","14979":"\/**\n     * Get index for closest previous token that is not a whitespace or comment.\n     *\n     * @param int $index token index\n     *\/","14980":"\/**\n     * Find a sequence of meaningful tokens and returns the array of their locations.\n     *\n     * @param non-empty-list<array{0: int, 1?: string}|string|Token> $sequence      an array of token (kinds)\n     * @param int                                                    $start         start index, defaulting to the start of the file\n     * @param null|int                                               $end           end index, defaulting to the end of the file\n     * @param array<int, bool>|bool                                  $caseSensitive global case sensitiveness or a list of booleans, whose keys should match\n     *                                                                              the ones used in $sequence. If any is missing, the default case-sensitive\n     *                                                                              comparison is used\n     *\n     * @return null|non-empty-array<int<0, max>, Token> an array containing the tokens matching the sequence elements, indexed by their position\n     *\/","14981":"\/**\n     * Insert instances of Token inside collection.\n     *\n     * @param int                      $index start inserting index\n     * @param list<Token>|Token|Tokens $items instances of Token to insert\n     *\/","14982":"\/**\n     * Insert a slices or individual Tokens into multiple places in a single run.\n     *\n     * This approach is kind-of an experiment - it's proven to improve performance a lot for big files that needs plenty of new tickets to be inserted,\n     * like edge case example of 3.7h vs 4s (https:\/\/github.com\/PHP-CS-Fixer\/PHP-CS-Fixer\/issues\/3996#issuecomment-455617637),\n     * yet at same time changing a logic of fixers in not-always easy way.\n     *\n     * To be discussed:\n     * - should we always aim to use this method?\n     * - should we deprecate `insertAt` method ?\n     *\n     * The `$slices` parameter is an assoc array, in which:\n     * - index: starting point for inserting of individual slice, with indices being relatives to original array collection before any Token inserted\n     * - value under index: a slice of Tokens to be inserted\n     *\n     * @internal\n     *\n     * @param array<int, list<Token>|Token|Tokens> $slices\n     *\/","14983":"\/**\n     * Check if collection was change: collection itself (like insert new tokens) or any of collection's elements.\n     *\/","14984":"\/**\n     * Override tokens at given range.\n     *\n     * @param int                      $indexStart start overriding index\n     * @param int                      $indexEnd   end overriding index\n     * @param array<int, Token>|Tokens $items      tokens to insert\n     *\/","14985":"\/**\n     * @param null|string $whitespaces optional whitespaces characters for Token::isWhitespace\n     *\/","14987":"\/**\n     * Set code. Clear all current content and replace it by new Token items generated from code directly.\n     *\n     * @param string $code PHP code\n     *\/","14988":"\/**\n     * Check if all token kinds given as argument are found.\n     *\n     * @param list<int|string> $tokenKinds\n     *\/","14989":"\/**\n     * Check if any token kind given as argument is found.\n     *\n     * @param list<int|string> $tokenKinds\n     *\/","14990":"\/**\n     * Check if token kind given as argument is found.\n     *\n     * @param int|string $tokenKind\n     *\/","14991":"\/**\n     * @param int|string $tokenKind\n     *\/","14992":"\/**\n     * Clear tokens in the given range.\n     *\/","14993":"\/**\n     * Checks for monolithic PHP code.\n     *\n     * Checks that the code is pure PHP code, in a single code block, starting\n     * with an open tag.\n     *\/","14994":"\/**\n     * @param int $start start index\n     * @param int $end   end index\n     *\/","14995":"\/**\n     * @internal This is performance-related workaround for lack of proper DI, may be removed at some point\n     *\n     * @return list<NamespaceAnalysis>\n     *\/","14998":"\/**\n     * @param self::BLOCK_TYPE_* $type        type of block\n     * @param int                $searchIndex index of starting brace\n     * @param bool               $findEnd     if method should find block's end or start\n     *\n     * @return int<0, max> index of opposite brace\n     *\/","15000":"\/**\n     * Get cache value for given key.\n     *\n     * @param non-empty-string $key item key\n     *\/","15001":"\/**\n     * Check if given key exists in cache.\n     *\n     * @param non-empty-string $key item key\n     *\/","15002":"\/**\n     * @param non-empty-string $key   item key\n     * @param Tokens           $value item value\n     *\/","15003":"\/**\n     * Change code hash.\n     *\n     * Remove old cache and set new one.\n     *\n     * @param non-empty-string $codeHash new code hash\n     *\/","15004":"\/**\n     * Register token as found.\n     *\/","15005":"\/**\n     * Unregister token as not found.\n     *\/","15006":"\/**\n     * @param array{int}|string|Token $token token prototype\n     *\n     * @return int|string\n     *\/","15007":"\/**\n     * @param int                 $index     token index\n     * @param -1|1                $direction\n     * @param callable(int): bool $filter\n     *\/","15008":"\/**\n     * A helper method used to find out whether a certain input token has to be case-sensitively matched.\n     *\n     * @param array<int, bool>|bool $caseSensitive global case sensitiveness or an array of booleans, whose keys should match\n     *                                             the ones used in $sequence. If any is missing, the default case-sensitive\n     *                                             comparison is used\n     * @param int                   $key           the key of the token that has to be looked up\n     *\/","15009":"\/**\n * Analyzer of Tokens collection.\n *\n * Its role is to provide the ability to analyze collection.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n * @author Gregor Harlan <gharlan@web.de>\n *\n * @internal\n *\n * @phpstan-type _ClassyElementType 'case'|'const'|'method'|'property'|'trait_import'\n *\/","15010":"\/**\n     * Tokens collection instance.\n     *\/","15012":"\/**\n     * Get indices of methods and properties in classy code (classes, interfaces and traits).\n     *\n     * @return array<int, array{classIndex: int, token: Token, type: _ClassyElementType}>\n     *\/","15013":"\/**\n     * Get indices of modifiers of a classy code (classes, interfaces and traits).\n     *\n     * @return array{\n     *     final: int|null,\n     *     abstract: int|null,\n     *     readonly: int|null\n     * }\n     *\/","15014":"\/**\n     * Get indices of namespace uses.\n     *\n     * @param bool $perNamespace Return namespace uses per namespace\n     *\n     * @return ($perNamespace is true ? array<int, list<int>> : list<int>)\n     *\/","15015":"\/**\n     * Check if there is an array at given index.\n     *\/","15016":"\/**\n     * Check if the array at index is multiline.\n     *\n     * This only checks the root-level of the array.\n     *\/","15017":"\/**\n     * @param int $index Index of the T_FUNCTION token\n     *\n     * @return array{visibility: null|T_PRIVATE|T_PROTECTED|T_PUBLIC, static: bool, abstract: bool, final: bool}\n     *\/","15018":"\/**\n     * Check if there is an anonymous class under given index.\n     *\/","15019":"\/**\n     * Check if the function under given index is a lambda.\n     *\/","15020":"\/**\n     * Check if the T_STRING under given index is a constant invocation.\n     *\/","15021":"\/**\n     * Checks if there is a unary successor operator under given index.\n     *\/","15022":"\/**\n     * Checks if there is a unary predecessor operator under given index.\n     *\/","15023":"\/**\n     * Checks if there is a binary operator under given index.\n     *\/","15024":"\/**\n     * Check if `T_WHILE` token at given index is `do { ... } while ();` syntax\n     * and not `while () { ...}`.\n     *\/","15025":"\/**\n     * @throws \\LogicException when provided index does not point to token containing T_CASE\n     *\/","15026":"\/**\n     * Find classy elements.\n     *\n     * Searches in tokens from the classy (start) index till the end (index) of the classy.\n     * Returns an array; first value is the index until the method has analysed (int), second the found classy elements (array).\n     *\n     * @param int $classIndex classy index\n     *\n     * @return array{int, array<int, array{classIndex: int, token: Token, type: _ClassyElementType}>}\n     *\/","15027":"\/**\n * Interface for Transformer class.\n *\n * Transformer role is to register custom tokens and transform Tokens collection to use them.\n *\n * Custom token is a user defined token type and is used to separate different meaning of original token type.\n * For example T_ARRAY is a token for both creating new array and typehinting a parameter. This two meaning should have two token types.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","15028":"\/**\n     * Get tokens created by Transformer.\n     *\n     * @return list<int>\n     *\/","15029":"\/**\n     * Return the name of the transformer.\n     *\n     * The name must be all lowercase and without any spaces.\n     *\n     * @return string The name of the fixer\n     *\/","15030":"\/**\n     * Returns the priority of the transformer.\n     *\n     * The default priority is 0 and higher priorities are executed first.\n     *\/","15033":"\/**\n * Transform `array` typehint from T_ARRAY into CT::T_ARRAY_TYPEHINT.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","15034":"\/**\n * Transforms attribute related Tokens.\n *\n * @internal\n *\/","15035":"\/**\n * Transform braced class instantiation braces in `(new Foo())` into CT::T_BRACE_CLASS_INSTANTIATION_OPEN\n * and CT::T_BRACE_CLASS_INSTANTIATION_CLOSE.\n *\n * @author Sebastiaans Stok <s.stok@rollerscapes.net>\n *\n * @internal\n *\/","15036":"\/**\n * Transform discriminate overloaded curly braces tokens.\n *\n * Performed transformations:\n * - closing `}` for T_CURLY_OPEN into CT::T_CURLY_CLOSE,\n * - closing `}` for T_DOLLAR_OPEN_CURLY_BRACES into CT::T_DOLLAR_CLOSE_CURLY_BRACES,\n * - in `$foo->{$bar}` into CT::T_DYNAMIC_PROP_BRACE_OPEN and CT::T_DYNAMIC_PROP_BRACE_CLOSE,\n * - in `${$foo}` into CT::T_DYNAMIC_VAR_BRACE_OPEN and CT::T_DYNAMIC_VAR_BRACE_CLOSE,\n * - in `$array{$index}` into CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN and CT::T_ARRAY_INDEX_CURLY_BRACE_CLOSE,\n * - in `use some\\a\\{ClassA, ClassB, ClassC as C}` into CT::T_GROUP_IMPORT_BRACE_OPEN, CT::T_GROUP_IMPORT_BRACE_CLOSE,\n * - in `class PropertyHooks { public string $bar _{_ set(string $value) { } _}_` into CT::T_PROPERTY_HOOK_BRACE_OPEN, CT::T_PROPERTY_HOOK_BRACE_CLOSE.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","15037":"\/**\n     * Transform closing `}` for T_CURLY_OPEN into CT::T_CURLY_CLOSE.\n     *\n     * This should be done at very beginning of curly braces transformations.\n     *\/","15038":"\/**\n     * We do not want to rely on `$tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $index)` here,\n     * as it relies on block types that are assuming that `}` tokens are already transformed to Custom Tokens that are allowing to distinguish different block types.\n     * As we are just about to transform `{` and `}` into Custom Tokens by this transformer, thus we need to compare those tokens manually by content without using `Tokens::findBlockEnd`.\n     *\/","15039":"\/**\n * Transform `class` class' constant from T_CLASS into CT::T_CLASS_CONSTANT.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","15040":"\/**\n * Transforms for Constructor Property Promotion.\n *\n * Transform T_PUBLIC, T_PROTECTED and T_PRIVATE of Constructor Property Promotion into custom tokens.\n *\n * @internal\n *\/","15041":"\/**\n * Transform DNF parentheses into CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_OPEN and CT::T_DISJUNCTIVE_NORMAL_FORM_TYPE_PARENTHESIS_CLOSE.\n *\n * @see https:\/\/wiki.php.net\/rfc\/dnf_types\n *\n * @internal\n *\/","15043":"\/**\n * Transform const\/function import tokens.\n *\n * Performed transformations:\n * - T_CONST into CT::T_CONST_IMPORT\n * - T_FUNCTION into CT::T_FUNCTION_IMPORT\n *\n * @author Gregor Harlan <gharlan@web.de>\n *\n * @internal\n *\/","15044":"\/**\n * Transform NAME_QUALIFIED, T_NAME_FULLY_QUALIFIED and T_NAME_RELATIVE into T_NAMESPACE T_NS_SEPARATOR T_STRING.\n *\n * @internal\n *\/","15045":"\/**\n * Transform named argument tokens.\n *\n * @internal\n *\/","15046":"\/**\n * Transform `namespace` operator from T_NAMESPACE into CT::T_NAMESPACE_OPERATOR.\n *\n * @author Gregor Harlan <gharlan@web.de>\n *\n * @internal\n *\/","15047":"\/**\n * Transform `?` operator into CT::T_NULLABLE_TYPE in `function foo(?Bar $b) {}`.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","15048":"\/**\n * Transform `&` operator into CT::T_RETURN_REF in `function & foo() {}`.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","15049":"\/**\n * Transform discriminate overloaded square braces tokens.\n *\n * Performed transformations:\n * - in `[1, 2, 3]` into CT::T_ARRAY_SQUARE_BRACE_OPEN and CT::T_ARRAY_SQUARE_BRACE_CLOSE,\n * - in `[$a, &$b, [$c]] = array(1, 2, array(3))` into CT::T_DESTRUCTURING_SQUARE_BRACE_OPEN and CT::T_DESTRUCTURING_SQUARE_BRACE_CLOSE.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","15050":"\/**\n     * Check if token under given index is short array opening.\n     *\/","15051":"\/**\n * Transform `|` operator into CT::T_TYPE_ALTERNATION in `function foo(Type1 | Type2 $x) {`\n * or `} catch (ExceptionType1 | ExceptionType2 $e) {`.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","15053":"\/**\n * Transform `:` operator into CT::T_TYPE_COLON in `function foo() : int {}`.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","15054":"\/**\n * Transform `&` operator into CT::T_TYPE_INTERSECTION in `function foo(Type1 & Type2 $x) {`\n * or `} catch (ExceptionType1 & ExceptionType2 $e) {`.\n *\n * @internal\n *\/","15056":"\/**\n * Transform T_USE into:\n * - CT::T_USE_TRAIT for imports,\n * - CT::T_USE_LAMBDA for lambda variable uses.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","15057":"\/**\n     * Check if token under given index is `use` statement for lambda function.\n     *\/","15058":"\/**\n * Move trailing whitespaces from comments and docs into following T_WHITESPACE token.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","15059":"\/**\n * Collection of Transformer classes.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","15060":"\/**\n     * The registered transformers.\n     *\n     * @var list<TransformerInterface>\n     *\/","15061":"\/**\n     * Register built in Transformers.\n     *\/","15062":"\/**\n     * Transform given Tokens collection through all Transformer classes.\n     *\n     * @param Tokens $tokens Tokens collection\n     *\/","15063":"\/**\n     * @param TransformerInterface $transformer Transformer\n     *\/","15064":"\/**\n     * @return \\Generator<TransformerInterface>\n     *\/","15065":"\/**\n * Obtain information about using version of tool.\n *\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n *\n * @internal\n *\/","15066":"\/**\n     * @var null|array{name: string, version: string, dist: array{reference?: string}}\n     *\/","15067":"\/**\n     * Determines if the tool is run inside our pre-built Docker image.\n     * The `\/fixer\/` path comes from our Dockerfile, tool is installed there and added to global PATH via symlinked binary.\n     *\/","15069":"\/**\n     * @return array{name: string, version: string, dist: array{reference?: string}}\n     *\/","15070":"\/**\n * @author Dariusz Rumi\u0144ski <dariusz.ruminski@gmail.com>\n * @author Graham Campbell <hello@gjcampbell.co.uk>\n * @author Od\u00edn del R\u00edo <odin.drp@gmail.com>\n *\n * @internal\n *\n * @deprecated This is a God Class anti-pattern. Don't expand it. It is fine to use logic that is already here (that's why we don't trigger deprecation warnings), but over time logic should be moved to dedicated, single-responsibility classes.\n *\/","15072":"\/**\n     * Converts a camel cased string to a snake cased string.\n     *\/","15073":"\/**\n     * Calculate the trailing whitespace.\n     *\n     * What we're doing here is grabbing everything after the final newline.\n     *\/","15074":"\/**\n     * Perform stable sorting using provided comparison function.\n     *\n     * Stability is ensured by using Schwartzian transform.\n     *\n     * @template T\n     * @template R\n     *\n     * @param list<T>             $elements\n     * @param callable(T): R      $getComparedValue a callable that takes a single element and returns the value to compare\n     * @param callable(R, R): int $compareValues    a callable that compares two values\n     *\n     * @return list<T>\n     *\/","15075":"\/**\n     * Sort fixers by their priorities.\n     *\n     * @param list<FixerInterface> $fixers\n     *\n     * @return list<FixerInterface>\n     *\/","15076":"\/**\n     * Join names in natural language using specified wrapper (double quote by default).\n     *\n     * @param list<string> $names\n     *\n     * @throws \\InvalidArgumentException\n     *\/","15077":"\/**\n     * Join names in natural language wrapped in backticks, e.g. `a`, `b` and `c`.\n     *\n     * @param list<string> $names\n     *\n     * @throws \\InvalidArgumentException\n     *\/","15079":"\/**\n     * @param mixed $value\n     *\/","15081":"\/**\n     * @param array<array-key, mixed> $value\n     *\/","15085":"\/**\n     * @param non-empty-string $indent\n     * @param non-empty-string $lineEnding\n     *\/","15090":"\/**\n     * @param list<string> $candidates\n     *\/","15091":"\/**\n     * Returns the built node.\n     *\n     * @return Node The built node\n     *\/","15092":"\/**\n     * Creates an attribute node.\n     *\n     * @param string|Name $name Name of the attribute\n     * @param array $args Attribute named arguments\n     *\/","15093":"\/**\n     * Creates a namespace builder.\n     *\n     * @param null|string|Node\\Name $name Name of the namespace\n     *\n     * @return Builder\\Namespace_ The created namespace builder\n     *\/","15094":"\/**\n     * Creates a class builder.\n     *\n     * @param string $name Name of the class\n     *\n     * @return Builder\\Class_ The created class builder\n     *\/","15095":"\/**\n     * Creates an interface builder.\n     *\n     * @param string $name Name of the interface\n     *\n     * @return Builder\\Interface_ The created interface builder\n     *\/","15096":"\/**\n     * Creates a trait builder.\n     *\n     * @param string $name Name of the trait\n     *\n     * @return Builder\\Trait_ The created trait builder\n     *\/","15097":"\/**\n     * Creates an enum builder.\n     *\n     * @param string $name Name of the enum\n     *\n     * @return Builder\\Enum_ The created enum builder\n     *\/","15098":"\/**\n     * Creates a trait use builder.\n     *\n     * @param Node\\Name|string ...$traits Trait names\n     *\n     * @return Builder\\TraitUse The created trait use builder\n     *\/","15099":"\/**\n     * Creates a trait use adaptation builder.\n     *\n     * @param Node\\Name|string|null $trait Trait name\n     * @param Node\\Identifier|string $method Method name\n     *\n     * @return Builder\\TraitUseAdaptation The created trait use adaptation builder\n     *\/","15100":"\/**\n     * Creates a method builder.\n     *\n     * @param string $name Name of the method\n     *\n     * @return Builder\\Method The created method builder\n     *\/","15101":"\/**\n     * Creates a parameter builder.\n     *\n     * @param string $name Name of the parameter\n     *\n     * @return Builder\\Param The created parameter builder\n     *\/","15102":"\/**\n     * Creates a property builder.\n     *\n     * @param string $name Name of the property\n     *\n     * @return Builder\\Property The created property builder\n     *\/","15103":"\/**\n     * Creates a function builder.\n     *\n     * @param string $name Name of the function\n     *\n     * @return Builder\\Function_ The created function builder\n     *\/","15104":"\/**\n     * Creates a namespace\/class use builder.\n     *\n     * @param Node\\Name|string $name Name of the entity (namespace or class) to alias\n     *\n     * @return Builder\\Use_ The created use builder\n     *\/","15105":"\/**\n     * Creates a function use builder.\n     *\n     * @param Node\\Name|string $name Name of the function to alias\n     *\n     * @return Builder\\Use_ The created use function builder\n     *\/","15106":"\/**\n     * Creates a constant use builder.\n     *\n     * @param Node\\Name|string $name Name of the const to alias\n     *\n     * @return Builder\\Use_ The created use const builder\n     *\/","15107":"\/**\n     * Creates a class constant builder.\n     *\n     * @param string|Identifier $name Name\n     * @param Node\\Expr|bool|null|int|float|string|array $value Value\n     *\n     * @return Builder\\ClassConst The created use const builder\n     *\/","15108":"\/**\n     * Creates an enum case builder.\n     *\n     * @param string|Identifier $name Name\n     *\n     * @return Builder\\EnumCase The created use const builder\n     *\/","15109":"\/**\n     * Creates node a for a literal value.\n     *\n     * @param Expr|bool|null|int|float|string|array|\\UnitEnum $value $value\n     *\/","15110":"\/**\n     * Creates variable node.\n     *\n     * @param string|Expr $name Name\n     *\/","15111":"\/**\n     * Normalizes an argument list.\n     *\n     * Creates Arg nodes for all arguments and converts literal values to expressions.\n     *\n     * @param array $args List of arguments to normalize\n     *\n     * @return list<Arg>\n     *\/","15112":"\/**\n     * Creates a function call node.\n     *\n     * @param string|Name|Expr $name Function name\n     * @param array $args Function arguments\n     *\/","15113":"\/**\n     * Creates a method call node.\n     *\n     * @param Expr $var Variable the method is called on\n     * @param string|Identifier|Expr $name Method name\n     * @param array $args Method arguments\n     *\/","15114":"\/**\n     * Creates a static method call node.\n     *\n     * @param string|Name|Expr $class Class name\n     * @param string|Identifier|Expr $name Method name\n     * @param array $args Method arguments\n     *\/","15115":"\/**\n     * Creates an object creation node.\n     *\n     * @param string|Name|Expr $class Class name\n     * @param array $args Constructor arguments\n     *\/","15116":"\/**\n     * Creates a constant fetch node.\n     *\n     * @param string|Name $name Constant name\n     *\/","15117":"\/**\n     * Creates a property fetch node.\n     *\n     * @param Expr $var Variable holding object\n     * @param string|Identifier|Expr $name Property name\n     *\/","15118":"\/**\n     * Creates a class constant fetch node.\n     *\n     * @param string|Name|Expr $class Class name\n     * @param string|Identifier|Expr $name Constant name\n     *\/","15119":"\/**\n     * Creates nested Concat nodes from a list of expressions.\n     *\n     * @param Expr|string ...$exprs Expressions or literal strings\n     *\/","15120":"\/**\n     * @param string|Expr $expr\n     *\/","15121":"\/**\n * This class defines helpers used in the implementation of builders. Don't use it directly.\n *\n * @internal\n *\/","15122":"\/**\n     * Normalizes a node: Converts builder objects to nodes.\n     *\n     * @param Node|Builder $node The node to normalize\n     *\n     * @return Node The normalized node\n     *\/","15123":"\/**\n     * Normalizes a node to a statement.\n     *\n     * Expressions are wrapped in a Stmt\\Expression node.\n     *\n     * @param Node|Builder $node The node to normalize\n     *\n     * @return Stmt The normalized statement node\n     *\/","15124":"\/**\n     * Normalizes strings to Identifier.\n     *\n     * @param string|Identifier $name The identifier to normalize\n     *\n     * @return Identifier The normalized identifier\n     *\/","15125":"\/**\n     * Normalizes strings to Identifier, also allowing expressions.\n     *\n     * @param string|Identifier|Expr $name The identifier to normalize\n     *\n     * @return Identifier|Expr The normalized identifier or expression\n     *\/","15126":"\/**\n     * Normalizes a name: Converts string names to Name nodes.\n     *\n     * @param Name|string $name The name to normalize\n     *\n     * @return Name The normalized name\n     *\/","15127":"\/**\n     * Normalizes a name: Converts string names to Name nodes, while also allowing expressions.\n     *\n     * @param Expr|Name|string $name The name to normalize\n     *\n     * @return Name|Expr The normalized name or expression\n     *\/","15128":"\/**\n     * Normalizes a type: Converts plain-text type names into proper AST representation.\n     *\n     * In particular, builtin types become Identifiers, custom types become Names and nullables\n     * are wrapped in NullableType nodes.\n     *\n     * @param string|Name|Identifier|ComplexType $type The type to normalize\n     *\n     * @return Name|Identifier|ComplexType The normalized type\n     *\/","15129":"\/**\n     * Normalizes a value: Converts nulls, booleans, integers,\n     * floats, strings and arrays into their respective nodes\n     *\n     * @param Node\\Expr|bool|null|int|float|string|array|\\UnitEnum $value The value to normalize\n     *\n     * @return Expr The normalized value\n     *\/","15130":"\/**\n     * Normalizes a doc comment: Converts plain strings to PhpParser\\Comment\\Doc.\n     *\n     * @param Comment\\Doc|string $docComment The doc comment to normalize\n     *\n     * @return Comment\\Doc The normalized doc comment\n     *\/","15131":"\/**\n     * Normalizes a attribute: Converts attribute to the Attribute Group if needed.\n     *\n     * @param Node\\Attribute|Node\\AttributeGroup $attribute\n     *\n     * @return Node\\AttributeGroup The Attribute Group\n     *\/","15132":"\/**\n     * Adds a modifier and returns new modifier bitmask.\n     *\n     * @param int $modifiers Existing modifiers\n     * @param int $modifier Modifier to set\n     *\n     * @return int New modifiers\n     *\/","15133":"\/**\n     * Adds a modifier and returns new modifier bitmask.\n     * @return int New modifiers\n     *\/","15135":"\/** @var list<Const_> *\/","15136":"\/** @var list<Node\\AttributeGroup> *\/","15137":"\/** @var Identifier|Node\\Name|Node\\ComplexType|null *\/","15138":"\/**\n     * Creates a class constant builder\n     *\n     * @param string|Identifier $name Name\n     * @param Node\\Expr|bool|null|int|float|string|array|\\UnitEnum $value Value\n     *\/","15139":"\/**\n     * Add another constant to const group\n     *\n     * @param string|Identifier $name Name\n     * @param Node\\Expr|bool|null|int|float|string|array|\\UnitEnum $value Value\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15140":"\/**\n     * Makes the constant public.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15141":"\/**\n     * Makes the constant protected.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15142":"\/**\n     * Makes the constant private.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15143":"\/**\n     * Makes the constant final.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15144":"\/**\n     * Sets doc comment for the constant.\n     *\n     * @param PhpParser\\Comment\\Doc|string $docComment Doc comment to set\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15145":"\/**\n     * Adds an attribute group.\n     *\n     * @param Node\\Attribute|Node\\AttributeGroup $attribute\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15146":"\/**\n     * Sets the constant type.\n     *\n     * @param string|Node\\Name|Identifier|Node\\ComplexType $type\n     *\n     * @return $this\n     *\/","15147":"\/**\n     * Returns the built class node.\n     *\n     * @return Stmt\\ClassConst The built constant node\n     *\/","15148":"\/** @var list<Name> *\/","15149":"\/** @var list<Stmt\\TraitUse> *\/","15150":"\/** @var list<Stmt\\ClassConst> *\/","15151":"\/** @var list<Stmt\\Property> *\/","15152":"\/** @var list<Stmt\\ClassMethod> *\/","15155":"\/**\n     * Creates a class builder.\n     *\n     * @param string $name Name of the class\n     *\/","15156":"\/**\n     * Extends a class.\n     *\n     * @param Name|string $class Name of class to extend\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15157":"\/**\n     * Implements one or more interfaces.\n     *\n     * @param Name|string ...$interfaces Names of interfaces to implement\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15158":"\/**\n     * Makes the class abstract.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15159":"\/**\n     * Makes the class final.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15160":"\/**\n     * Makes the class readonly.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15161":"\/**\n     * Adds a statement.\n     *\n     * @param Stmt|PhpParser\\Builder $stmt The statement to add\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15163":"\/**\n     * Returns the built class node.\n     *\n     * @return Stmt\\Class_ The built class node\n     *\/","15164":"\/**\n     * Adds multiple statements.\n     *\n     * @param (PhpParser\\Node\\Stmt|PhpParser\\Builder)[] $stmts The statements to add\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15165":"\/**\n     * Sets doc comment for the declaration.\n     *\n     * @param PhpParser\\Comment\\Doc|string $docComment Doc comment to set\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15167":"\/**\n     * Adds a statement.\n     *\n     * @param PhpParser\\Node\\Stmt|PhpParser\\Builder $stmt The statement to add\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15171":"\/** @var Identifier|string *\/","15174":"\/**\n     * Creates an enum case builder.\n     *\n     * @param string|Identifier $name Name\n     *\/","15175":"\/**\n     * Sets the value.\n     *\n     * @param Node\\Expr|string|int $value\n     *\n     * @return $this\n     *\/","15178":"\/**\n     * Returns the built enum case node.\n     *\n     * @return Stmt\\EnumCase The built constant node\n     *\/","15181":"\/** @var list<Stmt\\EnumCase> *\/","15186":"\/**\n     * Creates an enum builder.\n     *\n     * @param string $name Name of the enum\n     *\/","15187":"\/**\n     * Sets the scalar type.\n     *\n     * @param string|Identifier $scalarType\n     *\n     * @return $this\n     *\/","15191":"\/**\n     * Returns the built class node.\n     *\n     * @return Stmt\\Enum_ The built enum node\n     *\/","15194":"\/** @var Node\\Param[] *\/","15195":"\/** @var Node\\Identifier|Node\\Name|Node\\ComplexType|null *\/","15197":"\/**\n     * Make the function return by reference.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15198":"\/**\n     * Adds a parameter.\n     *\n     * @param Node\\Param|Param $param The parameter to add\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15199":"\/**\n     * Adds multiple parameters.\n     *\n     * @param (Node\\Param|Param)[] $params The parameters to add\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15200":"\/**\n     * Sets the return type for PHP 7.\n     *\n     * @param string|Node\\Name|Node\\Identifier|Node\\ComplexType $type\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15205":"\/** @var list<Stmt> *\/","15210":"\/**\n     * Creates a function builder.\n     *\n     * @param string $name Name of the function\n     *\/","15211":"\/**\n     * Adds a statement.\n     *\n     * @param Node|PhpParser\\Builder $stmt The statement to add\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15213":"\/**\n     * Returns the built function node.\n     *\n     * @return Stmt\\Function_ The built function node\n     *\/","15225":"\/**\n     * Creates an interface builder.\n     *\n     * @param string $name Name of the interface\n     *\/","15226":"\/**\n     * Extends one or more interfaces.\n     *\n     * @param Name|string ...$interfaces Names of interfaces to extend\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15229":"\/**\n     * Returns the built interface node.\n     *\n     * @return Stmt\\Interface_ The built interface node\n     *\/","15232":"\/** @var list<Stmt>|null *\/","15237":"\/**\n     * Creates a method builder.\n     *\n     * @param string $name Name of the method\n     *\/","15238":"\/**\n     * Makes the method public.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15239":"\/**\n     * Makes the method protected.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15240":"\/**\n     * Makes the method private.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15241":"\/**\n     * Makes the method static.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15242":"\/**\n     * Makes the method abstract.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15243":"\/**\n     * Makes the method final.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15246":"\/**\n     * Returns the built method node.\n     *\n     * @return Stmt\\ClassMethod The built method node\n     *\/","15253":"\/** @var Stmt[] *\/","15255":"\/**\n     * Creates a namespace builder.\n     *\n     * @param Node\\Name|string|null $name Name of the namespace\n     *\/","15257":"\/**\n     * Returns the built node.\n     *\n     * @return Stmt\\Namespace_ The built node\n     *\/","15262":"\/**\n     * Creates a parameter builder.\n     *\n     * @param string $name Name of the parameter\n     *\/","15263":"\/**\n     * Sets default value for the parameter.\n     *\n     * @param mixed $value Default value to use\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15264":"\/**\n     * Sets type for the parameter.\n     *\n     * @param string|Node\\Name|Node\\Identifier|Node\\ComplexType $type Parameter type\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15265":"\/**\n     * Make the parameter accept the value by reference.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15266":"\/**\n     * Make the parameter variadic\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15267":"\/**\n     * Makes the (promoted) parameter public.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15268":"\/**\n     * Makes the (promoted) parameter protected.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15269":"\/**\n     * Makes the (promoted) parameter private.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15270":"\/**\n     * Makes the (promoted) parameter readonly.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15271":"\/**\n     * Gives the promoted property private(set) visibility.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15272":"\/**\n     * Gives the promoted property protected(set) visibility.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15274":"\/**\n     * Returns the built parameter node.\n     *\n     * @return Node\\Param The built parameter node\n     *\/","15276":"\/** @var null|Identifier|Name|ComplexType *\/","15278":"\/** @var list<Node\\PropertyHook> *\/","15279":"\/**\n     * Creates a property builder.\n     *\n     * @param string $name Name of the property\n     *\/","15280":"\/**\n     * Makes the property public.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15281":"\/**\n     * Makes the property protected.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15282":"\/**\n     * Makes the property private.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15283":"\/**\n     * Makes the property static.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15284":"\/**\n     * Makes the property readonly.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15285":"\/**\n     * Makes the property abstract. Requires at least one property hook to be specified as well.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15286":"\/**\n     * Makes the property final.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15287":"\/**\n     * Gives the property private(set) visibility.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15288":"\/**\n     * Gives the property protected(set) visibility.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15289":"\/**\n     * Sets default value for the property.\n     *\n     * @param mixed $value Default value to use\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15290":"\/**\n     * Sets doc comment for the property.\n     *\n     * @param PhpParser\\Comment\\Doc|string $docComment Doc comment to set\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15291":"\/**\n     * Sets the property type for PHP 7.4+.\n     *\n     * @param string|Name|Identifier|ComplexType $type\n     *\n     * @return $this\n     *\/","15293":"\/**\n     * Adds a property hook.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15294":"\/**\n     * Returns the built class node.\n     *\n     * @return Stmt\\Property The built property node\n     *\/","15295":"\/** @var Node\\Name[] *\/","15296":"\/** @var Stmt\\TraitUseAdaptation[] *\/","15297":"\/**\n     * Creates a trait use builder.\n     *\n     * @param Node\\Name|string ...$traits Names of used traits\n     *\/","15298":"\/**\n     * Adds used trait.\n     *\n     * @param Node\\Name|string $trait Trait name\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15299":"\/**\n     * Adds trait adaptation.\n     *\n     * @param Stmt\\TraitUseAdaptation|Builder\\TraitUseAdaptation $adaptation Trait adaptation\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15302":"\/**\n     * Creates a trait use adaptation builder.\n     *\n     * @param Node\\Name|string|null $trait Name of adapted trait\n     * @param Node\\Identifier|string $method Name of adapted method\n     *\/","15303":"\/**\n     * Sets alias of method.\n     *\n     * @param Node\\Identifier|string $alias Alias for adapted method\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15304":"\/**\n     * Sets adapted method public.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15305":"\/**\n     * Sets adapted method protected.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15306":"\/**\n     * Sets adapted method private.\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15307":"\/**\n     * Adds overwritten traits.\n     *\n     * @param Node\\Name|string ...$traits Traits for overwrite\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15318":"\/**\n     * Returns the built trait node.\n     *\n     * @return Stmt\\Trait_ The built interface node\n     *\/","15321":"\/** @var Stmt\\Use_::TYPE_* *\/","15322":"\/**\n     * Creates a name use (alias) builder.\n     *\n     * @param Node\\Name|string $name Name of the entity (namespace, class, function, constant) to alias\n     * @param Stmt\\Use_::TYPE_* $type One of the Stmt\\Use_::TYPE_* constants\n     *\/","15323":"\/**\n     * Sets alias for used name.\n     *\n     * @param string $alias Alias to use (last component of full name by default)\n     *\n     * @return $this The builder instance (for fluid interface)\n     *\/","15324":"\/**\n     * Returns the built node.\n     *\n     * @return Stmt\\Use_ The built node\n     *\/","15325":"\/**\n     * Constructs a comment node.\n     *\n     * @param string $text Comment text (including comment delimiters like \/*)\n     * @param int $startLine Line number the comment started on\n     * @param int $startFilePos File offset the comment started on\n     * @param int $startTokenPos Token offset the comment started on\n     *\/","15326":"\/**\n     * Gets the comment text.\n     *\n     * @return string The comment text (including comment delimiters like \/*)\n     *\/","15327":"\/**\n     * Gets the line number the comment started on.\n     *\n     * @return int Line number (or -1 if not available)\n     * @phpstan-return -1|positive-int\n     *\/","15328":"\/**\n     * Gets the file offset the comment started on.\n     *\n     * @return int File offset (or -1 if not available)\n     *\/","15329":"\/**\n     * Gets the token offset the comment started on.\n     *\n     * @return int Token offset (or -1 if not available)\n     *\/","15330":"\/**\n     * Gets the line number the comment ends on.\n     *\n     * @return int Line number (or -1 if not available)\n     * @phpstan-return -1|positive-int\n     *\/","15331":"\/**\n     * Gets the file offset the comment ends on.\n     *\n     * @return int File offset (or -1 if not available)\n     *\/","15332":"\/**\n     * Gets the token offset the comment ends on.\n     *\n     * @return int Token offset (or -1 if not available)\n     *\/","15334":"\/**\n     * Gets the reformatted comment text.\n     *\n     * \"Reformatted\" here means that we try to clean up the whitespace at the\n     * starts of the lines. This is necessary because we receive the comments\n     * without leading whitespace on the first line, but with leading whitespace\n     * on all subsequent lines.\n     *\n     * Additionally, this normalizes CRLF newlines to LF newlines.\n     *\/","15335":"\/**\n     * Get length of shortest whitespace prefix (at the start of a line).\n     *\n     * If there is a line with no prefix whitespace, 0 is a valid return value.\n     *\n     * @param string $str String to check\n     * @return int Length in characters. Tabs count as single characters.\n     *\/","15336":"\/**\n     * @return array{nodeType:string, text:mixed, line:mixed, filePos:mixed}\n     *\/","15348":"\/**\n * Evaluates constant expressions.\n *\n * This evaluator is able to evaluate all constant expressions (as defined by PHP), which can be\n * evaluated without further context. If a subexpression is not of this type, a user-provided\n * fallback evaluator is invoked. To support all constant expressions that are also supported by\n * PHP (and not already handled by this class), the fallback evaluator must be able to handle the\n * following node types:\n *\n *  * All Scalar\\MagicConst\\* nodes.\n *  * Expr\\ConstFetch nodes. Only null\/false\/true are already handled by this class.\n *  * Expr\\ClassConstFetch nodes.\n *\n * The fallback evaluator should throw ConstExprEvaluationException for nodes it cannot evaluate.\n *\n * The evaluation is dependent on runtime configuration in two respects: Firstly, floating\n * point to string conversions are affected by the precision ini setting. Secondly, they are also\n * affected by the LC_NUMERIC locale.\n *\/","15349":"\/** @var callable|null *\/","15350":"\/**\n     * Create a constant expression evaluator.\n     *\n     * The provided fallback evaluator is invoked whenever a subexpression cannot be evaluated. See\n     * class doc comment for more information.\n     *\n     * @param callable|null $fallbackEvaluator To call if subexpression cannot be evaluated\n     *\/","15351":"\/**\n     * Silently evaluates a constant expression into a PHP value.\n     *\n     * Thrown Errors, warnings or notices will be converted into a ConstExprEvaluationException.\n     * The original source of the exception is available through getPrevious().\n     *\n     * If some part of the expression cannot be evaluated, the fallback evaluator passed to the\n     * constructor will be invoked. By default, if no fallback is provided, an exception of type\n     * ConstExprEvaluationException is thrown.\n     *\n     * See class doc comment for caveats and limitations.\n     *\n     * @param Expr $expr Constant expression to evaluate\n     * @return mixed Result of evaluation\n     *\n     * @throws ConstExprEvaluationException if the expression cannot be evaluated or an error occurred\n     *\/","15352":"\/**\n     * Directly evaluates a constant expression into a PHP value.\n     *\n     * May generate Error exceptions, warnings or notices. Use evaluateSilently() to convert these\n     * into a ConstExprEvaluationException.\n     *\n     * If some part of the expression cannot be evaluated, the fallback evaluator passed to the\n     * constructor will be invoked. By default, if no fallback is provided, an exception of type\n     * ConstExprEvaluationException is thrown.\n     *\n     * See class doc comment for caveats and limitations.\n     *\n     * @param Expr $expr Constant expression to evaluate\n     * @return mixed Result of evaluation\n     *\n     * @throws ConstExprEvaluationException if the expression cannot be evaluated\n     *\/","15353":"\/** @return mixed *\/","15358":"\/**\n     * Creates an Exception signifying a parse error.\n     *\n     * @param string $message Error message\n     * @param array<string, mixed> $attributes Attributes of node\/token where error occurred\n     *\/","15359":"\/**\n     * Gets the error message\n     *\n     * @return string Error message\n     *\/","15360":"\/**\n     * Gets the line the error starts in.\n     *\n     * @return int Error start line\n     * @phpstan-return -1|positive-int\n     *\/","15361":"\/**\n     * Gets the line the error ends in.\n     *\n     * @return int Error end line\n     * @phpstan-return -1|positive-int\n     *\/","15362":"\/**\n     * Gets the attributes of the node\/token the error occurred at.\n     *\n     * @return array<string, mixed>\n     *\/","15363":"\/**\n     * Sets the attributes of the node\/token the error occurred at.\n     *\n     * @param array<string, mixed> $attributes\n     *\/","15364":"\/**\n     * Sets the line of the PHP file the error occurred in.\n     *\n     * @param string $message Error message\n     *\/","15365":"\/**\n     * Sets the line the error starts in.\n     *\n     * @param int $line Error start line\n     *\/","15366":"\/**\n     * Returns whether the error has start and end column information.\n     *\n     * For column information enable the startFilePos and endFilePos in the lexer options.\n     *\/","15367":"\/**\n     * Gets the start column (1-based) into the line where the error started.\n     *\n     * @param string $code Source code of the file\n     *\/","15368":"\/**\n     * Gets the end column (1-based) into the line where the error ended.\n     *\n     * @param string $code Source code of the file\n     *\/","15369":"\/**\n     * Formats message including line and column information.\n     *\n     * @param string $code Source code associated with the error, for calculation of the columns\n     *\n     * @return string Formatted message\n     *\/","15370":"\/**\n     * Converts a file offset into a column.\n     *\n     * @param string $code Source code that $pos indexes into\n     * @param int $pos 0-based position in $code\n     *\n     * @return int 1-based column (relative to start of line)\n     *\/","15371":"\/**\n     * Updates the exception message after a change to rawMessage or rawLine.\n     *\/","15372":"\/**\n     * Handle an error generated during lexing, parsing or some other operation.\n     *\n     * @param Error $error The error that needs to be handled\n     *\/","15373":"\/**\n * Error handler that collects all errors into an array.\n *\n * This allows graceful handling of errors.\n *\/","15374":"\/** @var Error[] Collected errors *\/","15375":"\/**\n     * Get collected errors.\n     *\n     * @return Error[]\n     *\/","15376":"\/**\n     * Check whether there are any errors.\n     *\/","15377":"\/**\n     * Reset\/clear collected errors.\n     *\/","15378":"\/**\n * Error handler that handles all errors by throwing them.\n *\n * This is the default strategy used by all components.\n *\/","15380":"\/** @var int One of the TYPE_* constants *\/","15383":"\/**\n     * @param int $type One of the TYPE_* constants\n     * @param mixed $old Is null for add operations\n     * @param mixed $new Is null for remove operations\n     *\/","15384":"\/**\n * Implements the Myers diff algorithm.\n *\n * Myers, Eugene W. \"An O (ND) difference algorithm and its variations.\"\n * Algorithmica 1.1 (1986): 251-266.\n *\n * @template T\n * @internal\n *\/","15386":"\/**\n     * Create differ over the given equality relation.\n     *\n     * @param callable(T, T): bool $isEqual Equality relation\n     *\/","15387":"\/**\n     * Calculate diff (edit script) from $old to $new.\n     *\n     * @param T[] $old Original array\n     * @param T[] $new New array\n     *\n     * @return DiffElem[] Diff (edit script)\n     *\/","15388":"\/**\n     * Calculate diff, including \"replace\" operations.\n     *\n     * If a sequence of remove operations is followed by the same number of add operations, these\n     * will be coalesced into replace operations.\n     *\n     * @param T[] $old Original array\n     * @param T[] $new New array\n     *\n     * @return DiffElem[] Diff (edit script), including replace operations\n     *\/","15389":"\/**\n     * @param T[] $old\n     * @param T[] $new\n     * @return array{array<int, array<int, int>>, int, int}\n     *\/","15390":"\/**\n     * @param array<int, array<int, int>> $trace\n     * @param T[] $old\n     * @param T[] $new\n     * @return DiffElem[]\n     *\/","15391":"\/**\n     * Coalesce equal-length sequences of remove+add into a replace operation.\n     *\n     * @param DiffElem[] $diff\n     * @return DiffElem[]\n     *\/","15392":"\/**\n * This node is used internally by the format-preserving pretty printer to print anonymous classes.\n *\n * The normal anonymous class structure violates assumptions about the order of token offsets.\n * Namely, the constructor arguments are part of the Expr\\New_ node and follow the class node, even\n * though they are actually interleaved with them. This special node type is used temporarily to\n * restore a sane token offset order.\n *\n * @internal\n *\/","15393":"\/** @var Node\\AttributeGroup[] PHP attribute groups *\/","15394":"\/** @var int Modifiers *\/","15395":"\/** @var (Node\\Arg|Node\\VariadicPlaceholder)[] Arguments *\/","15396":"\/** @var null|Node\\Name Name of extended class *\/","15397":"\/** @var Node\\Name[] Names of implemented interfaces *\/","15398":"\/** @var Node\\Stmt[] Statements *\/","15399":"\/** @var array<string, mixed> Attributes *\/","15400":"\/**\n     * @param Node\\AttributeGroup[] $attrGroups PHP attribute groups\n     * @param (Node\\Arg|Node\\VariadicPlaceholder)[] $args Arguments\n     * @param Node\\Name|null $extends Name of extended class\n     * @param Node\\Name[] $implements Names of implemented interfaces\n     * @param Node\\Stmt[] $stmts Statements\n     * @param array<string, mixed> $attributes Attributes\n     *\/","15401":"\/**\n     * Gets line the node started in (alias of getStartLine).\n     *\n     * @return int Start line (or -1 if not available)\n     * @phpstan-return -1|positive-int\n     *\/","15402":"\/**\n     * Gets line the node started in.\n     *\n     * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default).\n     *\n     * @return int Start line (or -1 if not available)\n     * @phpstan-return -1|positive-int\n     *\/","15403":"\/**\n     * Gets the line the node ended in.\n     *\n     * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default).\n     *\n     * @return int End line (or -1 if not available)\n     * @phpstan-return -1|positive-int\n     *\/","15404":"\/**\n     * Gets the token offset of the first token that is part of this node.\n     *\n     * The offset is an index into the array returned by Lexer::getTokens().\n     *\n     * Requires the 'startTokenPos' attribute to be enabled in the lexer (DISABLED by default).\n     *\n     * @return int Token start position (or -1 if not available)\n     *\/","15405":"\/**\n     * Gets the token offset of the last token that is part of this node.\n     *\n     * The offset is an index into the array returned by Lexer::getTokens().\n     *\n     * Requires the 'endTokenPos' attribute to be enabled in the lexer (DISABLED by default).\n     *\n     * @return int Token end position (or -1 if not available)\n     *\/","15406":"\/**\n     * Gets the file offset of the first character that is part of this node.\n     *\n     * Requires the 'startFilePos' attribute to be enabled in the lexer (DISABLED by default).\n     *\n     * @return int File start position (or -1 if not available)\n     *\/","15407":"\/**\n     * Gets the file offset of the last character that is part of this node.\n     *\n     * Requires the 'endFilePos' attribute to be enabled in the lexer (DISABLED by default).\n     *\n     * @return int File end position (or -1 if not available)\n     *\/","15408":"\/**\n     * Gets all comments directly preceding this node.\n     *\n     * The comments are also available through the \"comments\" attribute.\n     *\n     * @return Comment[]\n     *\/","15409":"\/**\n     * Gets the doc comment of the node.\n     *\n     * @return null|Comment\\Doc Doc comment object or null\n     *\/","15410":"\/**\n     * Sets the doc comment of the node.\n     *\n     * This will either replace an existing doc comment or add it to the comments array.\n     *\n     * @param Comment\\Doc $docComment Doc comment to set\n     *\/","15412":"\/**\n * Provides operations on token streams, for use by pretty printer.\n *\n * @internal\n *\/","15413":"\/** @var Token[] Tokens (in PhpToken::tokenize() format) *\/","15414":"\/** @var int[] Map from position to indentation *\/","15415":"\/**\n     * Create token stream instance.\n     *\n     * @param Token[] $tokens Tokens in PhpToken::tokenize() format\n     *\/","15416":"\/**\n     * Whether the given position is immediately surrounded by parenthesis.\n     *\n     * @param int $startPos Start position\n     * @param int $endPos End position\n     *\/","15417":"\/**\n     * Whether the given position is immediately surrounded by braces.\n     *\n     * @param int $startPos Start position\n     * @param int $endPos End position\n     *\/","15418":"\/**\n     * Check whether the position is directly preceded by a certain token type.\n     *\n     * During this check whitespace and comments are skipped.\n     *\n     * @param int $pos Position before which the token should occur\n     * @param int|string $expectedTokenType Token to check for\n     *\n     * @return bool Whether the expected token was found\n     *\/","15419":"\/**\n     * Check whether the position is directly followed by a certain token type.\n     *\n     * During this check whitespace and comments are skipped.\n     *\n     * @param int $pos Position after which the token should occur\n     * @param int|string $expectedTokenType Token to check for\n     *\n     * @return bool Whether the expected token was found\n     *\/","15420":"\/** @param int|string|(int|string)[] $skipTokenType *\/","15422":"\/**\n     * Return first non-whitespace token position smaller or equal to passed position.\n     *\n     * @param int $pos Token position\n     * @return int Non-whitespace token position\n     *\/","15423":"\/**\n     * Return first non-whitespace position greater or equal to passed position.\n     *\n     * @param int $pos Token position\n     * @return int Non-whitespace token position\n     *\/","15424":"\/** @param int|string|(int|string)[] $findTokenType *\/","15425":"\/**\n     * Whether the given position range contains a certain token type.\n     *\n     * @param int $startPos Starting position (inclusive)\n     * @param int $endPos Ending position (exclusive)\n     * @param int|string $tokenType Token type to look for\n     * @return bool Whether the token occurs in the given range\n     *\/","15426":"\/**\n     * Get indentation before token position.\n     *\n     * @param int $pos Token position\n     *\n     * @return int Indentation depth (in spaces)\n     *\/","15427":"\/**\n     * Get the code corresponding to a token offset range, optionally adjusted for indentation.\n     *\n     * @param int $from Token start position (inclusive)\n     * @param int $to Token end position (exclusive)\n     * @param int $indent By how much the code should be indented (can be negative as well)\n     *\n     * @return string Code corresponding to token range, adjusted for indentation\n     *\/","15428":"\/**\n     * Precalculate the indentation at every token position.\n     *\n     * @return int[] Token position to indentation map\n     *\/","15429":"\/** @var \\ReflectionClass<Node>[] Node type to reflection class map *\/","15431":"\/**\n     * @param mixed $value\n     * @return mixed\n     *\/","15432":"\/** @return \\ReflectionClass<Node> *\/","15433":"\/** @return class-string<Node> *\/","15434":"\/**\n     * Tokenize the provided source code.\n     *\n     * The token array is in the same format as provided by the PhpToken::tokenize() method in\n     * PHP 8.0. The tokens are instances of PhpParser\\Token, to abstract over a polyfill\n     * implementation in earlier PHP version.\n     *\n     * The token array is terminated by a sentinel token with token ID 0.\n     * The token array does not discard any tokens (i.e. whitespace and comments are included).\n     * The token position attributes are against this token array.\n     *\n     * @param string $code The source code to tokenize.\n     * @param ErrorHandler|null $errorHandler Error handler to use for lexing errors. Defaults to\n     *                                        ErrorHandler\\Throwing.\n     * @return Token[] Tokens\n     *\/","15435":"\/**\n     * @param list<Token> $tokens\n     *\/","15436":"\/** @var array{int, string, string}[] Patches used to reverse changes introduced in the code *\/","15437":"\/** @var list<TokenEmulator> *\/","15438":"\/**\n     * @param PhpVersion|null $phpVersion PHP version to emulate. Defaults to newest supported.\n     *\/","15439":"\/**\n     * @param list<Token> $tokens\n     * @return list<Token>\n     *\/","15440":"\/**\n     * Fixup line and position information in errors.\n     *\n     * @param Error[] $errors\n     *\/","15442":"\/** @param Token[] $tokens *\/","15444":"\/** @param array{int, string, string}[] $patches *\/","15458":"\/**\n * Reverses emulation direction of the inner emulator.\n *\/","15459":"\/** @var TokenEmulator Inner emulator *\/","15461":"\/**\n     * @param Token[] $tokens Original tokens\n     * @return Token[] Modified Tokens\n     *\/","15464":"\/**\n * Modifiers used (as a bit mask) by various flags subnodes, for example on classes, functions,\n * properties and constants.\n *\/","15467":"\/** @var null|Name Current namespace *\/","15468":"\/** @var Name[][] Map of format [aliasType => [aliasName => originalName]] *\/","15469":"\/** @var Name[][] Same as $aliases but preserving original case *\/","15470":"\/** @var ErrorHandler Error handler *\/","15471":"\/**\n     * Create a name context.\n     *\n     * @param ErrorHandler $errorHandler Error handling used to report errors\n     *\/","15472":"\/**\n     * Start a new namespace.\n     *\n     * This also resets the alias table.\n     *\n     * @param Name|null $namespace Null is the global namespace\n     *\/","15473":"\/**\n     * Add an alias \/ import.\n     *\n     * @param Name $name Original name\n     * @param string $aliasName Aliased name\n     * @param Stmt\\Use_::TYPE_* $type One of Stmt\\Use_::TYPE_*\n     * @param array<string, mixed> $errorAttrs Attributes to use to report an error\n     *\/","15474":"\/**\n     * Get current namespace.\n     *\n     * @return null|Name Namespace (or null if global namespace)\n     *\/","15475":"\/**\n     * Get resolved name.\n     *\n     * @param Name $name Name to resolve\n     * @param Stmt\\Use_::TYPE_* $type One of Stmt\\Use_::TYPE_{FUNCTION|CONSTANT}\n     *\n     * @return null|Name Resolved name, or null if static resolution is not possible\n     *\/","15476":"\/**\n     * Get resolved class name.\n     *\n     * @param Name $name Class ame to resolve\n     *\n     * @return Name Resolved name\n     *\/","15477":"\/**\n     * Get possible ways of writing a fully qualified name (e.g., by making use of aliases).\n     *\n     * @param string $name Fully-qualified name (without leading namespace separator)\n     * @param Stmt\\Use_::TYPE_* $type One of Stmt\\Use_::TYPE_*\n     *\n     * @return Name[] Possible representations of the name\n     *\/","15478":"\/**\n     * Get shortest representation of this fully-qualified name.\n     *\n     * @param string $name Fully-qualified name (without leading namespace separator)\n     * @param Stmt\\Use_::TYPE_* $type One of Stmt\\Use_::TYPE_*\n     *\n     * @return Name Shortest representation\n     *\/","15479":"\/**\n     * Gets the type of the node.\n     *\n     * @psalm-return non-empty-string\n     * @return string Type of the node\n     *\/","15480":"\/**\n     * Gets the names of the sub nodes.\n     *\n     * @return string[] Names of sub nodes\n     *\/","15481":"\/**\n     * Gets line the node started in (alias of getStartLine).\n     *\n     * @return int Start line (or -1 if not available)\n     * @phpstan-return -1|positive-int\n     *\n     * @deprecated Use getStartLine() instead\n     *\/","15491":"\/**\n     * Sets an attribute on a node.\n     *\n     * @param mixed $value\n     *\/","15492":"\/**\n     * Returns whether an attribute exists.\n     *\/","15493":"\/**\n     * Returns the value of an attribute.\n     *\n     * @param mixed $default\n     *\n     * @return mixed\n     *\/","15494":"\/**\n     * Returns all the attributes of this node.\n     *\n     * @return array<string, mixed>\n     *\/","15495":"\/**\n     * Replaces all the attributes of this node.\n     *\n     * @param array<string, mixed> $attributes\n     *\/","15497":"\/**\n     * Creates a Node.\n     *\n     * @param array<string, mixed> $attributes Array of attributes\n     *\/","15511":"\/**\n     * Constructs a NodeDumper.\n     *\n     * Supported options:\n     *  * bool dumpComments: Whether comments should be dumped.\n     *  * bool dumpPositions: Whether line\/offset information should be dumped. To dump offset\n     *                        information, the code needs to be passed to dump().\n     *  * bool dumpOtherAttributes: Whether non-comment, non-position attributes should be dumped.\n     *\n     * @param array $options Options (see description)\n     *\/","15512":"\/**\n     * Dumps a node or array.\n     *\n     * @param array|Node $node Node or array to dump\n     * @param string|null $code Code corresponding to dumped AST. This only needs to be passed if\n     *                          the dumpPositions option is enabled and the dumping of node offsets\n     *                          is desired.\n     *\n     * @return string Dumped value\n     *\/","15513":"\/** @param mixed $node *\/","15514":"\/** @param array<int, string> $map *\/","15515":"\/**\n     * Dump node position, if possible.\n     *\n     * @param Node $node Node for which to dump position\n     *\n     * @return string|null Dump of position, or null if position information not available\n     *\/","15516":"\/**\n     * Find all nodes satisfying a filter callback.\n     *\n     * @param Node|Node[] $nodes Single node or array of nodes to search in\n     * @param callable $filter Filter callback: function(Node $node) : bool\n     *\n     * @return Node[] Found nodes satisfying the filter callback\n     *\/","15517":"\/**\n     * Find all nodes that are instances of a certain class.\n\n     * @template TNode as Node\n     *\n     * @param Node|Node[] $nodes Single node or array of nodes to search in\n     * @param class-string<TNode> $class Class name\n     *\n     * @return TNode[] Found nodes (all instances of $class)\n     *\/","15518":"\/**\n     * Find first node satisfying a filter callback.\n     *\n     * @param Node|Node[] $nodes Single node or array of nodes to search in\n     * @param callable $filter Filter callback: function(Node $node) : bool\n     *\n     * @return null|Node Found node (or null if none found)\n     *\/","15519":"\/**\n     * Find first node that is an instance of a certain class.\n     *\n     * @template TNode as Node\n     *\n     * @param Node|Node[] $nodes Single node or array of nodes to search in\n     * @param class-string<TNode> $class Class name\n     *\n     * @return null|TNode Found node, which is an instance of $class (or null if none found)\n     *\/","15520":"\/**\n     * @deprecated Use NodeVisitor::DONT_TRAVERSE_CHILDREN instead.\n     *\/","15521":"\/**\n     * @deprecated Use NodeVisitor::STOP_TRAVERSAL instead.\n     *\/","15522":"\/**\n     * @deprecated Use NodeVisitor::REMOVE_NODE instead.\n     *\/","15523":"\/**\n     * @deprecated Use NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN instead.\n     *\/","15526":"\/**\n     * Create a traverser with the given visitors.\n     *\n     * @param NodeVisitor ...$visitors Node visitors\n     *\/","15527":"\/**\n     * Adds a visitor.\n     *\n     * @param NodeVisitor $visitor Visitor to add\n     *\/","15528":"\/**\n     * Removes an added visitor.\n     *\/","15529":"\/**\n     * Traverses an array of nodes using the registered visitors.\n     *\n     * @param Node[] $nodes Array of nodes\n     *\n     * @return Node[] Traversed array of nodes\n     *\/","15530":"\/**\n     * Recursively traverse a node.\n     *\n     * @param Node $node Node to traverse.\n     *\/","15531":"\/**\n     * Recursively traverse array (usually of nodes).\n     *\n     * @param array $nodes Array to traverse\n     *\n     * @return array Result of traversal (may be original array or changed one)\n     *\/","15535":"\/**\n     * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CHILDREN, child nodes\n     * of the current node will not be traversed for any visitors.\n     *\n     * For subsequent visitors enterNode() will still be called on the current\n     * node and leaveNode() will also be invoked for the current node.\n     *\/","15536":"\/**\n     * If NodeVisitor::enterNode() or NodeVisitor::leaveNode() returns\n     * STOP_TRAVERSAL, traversal is aborted.\n     *\n     * The afterTraverse() method will still be invoked.\n     *\/","15537":"\/**\n     * If NodeVisitor::leaveNode() returns REMOVE_NODE for a node that occurs\n     * in an array, it will be removed from the array.\n     *\n     * For subsequent visitors leaveNode() will still be invoked for the\n     * removed node.\n     *\/","15538":"\/**\n     * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CURRENT_AND_CHILDREN, child nodes\n     * of the current node will not be traversed for any visitors.\n     *\n     * For subsequent visitors enterNode() will not be called as well.\n     * leaveNode() will be invoked for visitors that has enterNode() method invoked.\n     *\/","15539":"\/**\n     * If NodeVisitor::enterNode() or NodeVisitor::leaveNode() returns REPLACE_WITH_NULL,\n     * the node will be replaced with null. This is not a legal return value if the node is part\n     * of an array, rather than another node.\n     *\/","15540":"\/**\n     * Called once before traversal.\n     *\n     * Return value semantics:\n     *  * null:      $nodes stays as-is\n     *  * otherwise: $nodes is set to the return value\n     *\n     * @param Node[] $nodes Array of nodes\n     *\n     * @return null|Node[] Array of nodes\n     *\/","15541":"\/**\n     * Called when entering a node.\n     *\n     * Return value semantics:\n     *  * null\n     *        => $node stays as-is\n     *  * array (of Nodes)\n     *        => The return value is merged into the parent array (at the position of the $node)\n     *  * NodeVisitor::REMOVE_NODE\n     *        => $node is removed from the parent array\n     *  * NodeVisitor::REPLACE_WITH_NULL\n     *        => $node is replaced with null\n     *  * NodeVisitor::DONT_TRAVERSE_CHILDREN\n     *        => Children of $node are not traversed. $node stays as-is\n     *  * NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN\n     *        => Further visitors for the current node are skipped, and its children are not\n     *           traversed. $node stays as-is.\n     *  * NodeVisitor::STOP_TRAVERSAL\n     *        => Traversal is aborted. $node stays as-is\n     *  * otherwise\n     *        => $node is set to the return value\n     *\n     * @param Node $node Node\n     *\n     * @return null|int|Node|Node[] Replacement node (or special return value)\n     *\/","15542":"\/**\n     * Called when leaving a node.\n     *\n     * Return value semantics:\n     *  * null\n     *        => $node stays as-is\n     *  * NodeVisitor::REMOVE_NODE\n     *        => $node is removed from the parent array\n     *  * NodeVisitor::REPLACE_WITH_NULL\n     *        => $node is replaced with null\n     *  * NodeVisitor::STOP_TRAVERSAL\n     *        => Traversal is aborted. $node stays as-is\n     *  * array (of Nodes)\n     *        => The return value is merged into the parent array (at the position of the $node)\n     *  * otherwise\n     *        => $node is set to the return value\n     *\n     * @param Node $node Node\n     *\n     * @return null|int|Node|Node[] Replacement node (or special return value)\n     *\/","15543":"\/**\n     * Called once after traversal.\n     *\n     * Return value semantics:\n     *  * null:      $nodes stays as-is\n     *  * otherwise: $nodes is set to the return value\n     *\n     * @param Node[] $nodes Array of nodes\n     *\n     * @return null|Node[] Array of nodes\n     *\/","15544":"\/**\n * @codeCoverageIgnore\n *\/","15550":"\/**\n * Visitor cloning all nodes and linking to the original nodes using an attribute.\n *\n * This visitor is required to perform format-preserving pretty prints.\n *\/","15561":"\/** @var int Last seen token start position *\/","15562":"\/** @var Token[] Token array *\/","15563":"\/** @var list<int> Token positions of comments *\/","15564":"\/**\n     * Create a comment annotation visitor.\n     *\n     * @param Token[] $tokens Token array\n     *\/","15565":"\/**\n * This visitor can be used to find and collect all nodes satisfying some criterion determined by\n * a filter callback.\n *\/","15571":"\/** @var callable Filter callback *\/","15572":"\/** @var Node[] Found nodes *\/","15573":"\/**\n     * Get found nodes satisfying the filter callback.\n     *\n     * Nodes are returned in pre-order.\n     *\n     * @return Node[] Found nodes\n     *\/","15574":"\/**\n * This visitor can be used to find the first node satisfying some criterion determined by\n * a filter callback.\n *\/","15581":"\/** @var null|Node Found node *\/","15582":"\/**\n     * Get found node satisfying the filter callback.\n     *\n     * Returns null if no node satisfies the filter callback.\n     *\n     * @return null|Node Found node (or null if not found)\n     *\/","15588":"\/** @var NameContext Naming context *\/","15589":"\/** @var bool Whether to preserve original names *\/","15590":"\/** @var bool Whether to replace resolved nodes in place, or to add resolvedNode attributes *\/","15591":"\/**\n     * Constructs a name resolution visitor.\n     *\n     * Options:\n     *  * preserveOriginalNames (default false): An \"originalName\" attribute will be added to\n     *    all name nodes that underwent resolution.\n     *  * replaceNodes (default true): Resolved names are replaced in-place. Otherwise, a\n     *    resolvedName attribute is added. (Names that cannot be statically resolved receive a\n     *    namespacedName attribute, as usual.)\n     *\n     * @param ErrorHandler|null $errorHandler Error handler\n     * @param array{preserveOriginalNames?: bool, replaceNodes?: bool} $options Options\n     *\/","15592":"\/**\n     * Get name resolution context.\n     *\/","15593":"\/** @param Stmt\\Use_::TYPE_* $type *\/","15594":"\/** @param Stmt\\Function_|Stmt\\ClassMethod|Expr\\Closure|Expr\\ArrowFunction $node *\/","15595":"\/**\n     * @template T of Node\\Identifier|Name|Node\\ComplexType|null\n     * @param T $node\n     * @return T\n     *\/","15596":"\/**\n     * Resolve name, according to name resolver options.\n     *\n     * @param Name $name Function or constant name to resolve\n     * @param Stmt\\Use_::TYPE_* $type One of Stmt\\Use_::TYPE_*\n     *\n     * @return Name Resolved name, or original name with attribute\n     *\/","15597":"\/**\n * Visitor that connects a child node to its parent node\n * as well as its sibling nodes.\n *\n * On the child node, the parent node can be accessed through\n * <code>$node->getAttribute('parent')<\/code>, the previous\n * node can be accessed through <code>$node->getAttribute('previous')<\/code>,\n * and the next node can be accessed through <code>$node->getAttribute('next')<\/code>.\n *\/","15603":"\/**\n     * @var Node[]\n     *\/","15604":"\/**\n     * @var ?Node\n     *\/","15605":"\/**\n * Visitor that connects a child node to its parent node.\n *\n * On the child node, the parent node can be accessed through\n * <code>$node->getAttribute('parent')<\/code>.\n *\/","15612":"\/** @var Identifier|null Parameter name (for named parameters) *\/","15613":"\/** @var Expr Value to pass *\/","15614":"\/** @var bool Whether to pass by ref *\/","15615":"\/** @var bool Whether to unpack the argument *\/","15617":"\/**\n     * Constructs a function call argument node.\n     *\n     * @param Expr $value Value to pass\n     * @param bool $byRef Whether to pass by ref\n     * @param bool $unpack Whether to unpack the argument\n     * @param array<string, mixed> $attributes Additional attributes\n     * @param Identifier|null $name Parameter name (for named parameters)\n     *\/","15629":"\/** @var null|Expr Key *\/","15630":"\/** @var Expr Value *\/","15631":"\/** @var bool Whether to assign by reference *\/","15634":"\/**\n     * Constructs an array item node.\n     *\n     * @param Expr $value Value\n     * @param null|Expr $key Key\n     * @param bool $byRef Whether to assign by reference\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","15646":"\/** @var Name Attribute name *\/","15647":"\/** @var list<Arg> Attribute arguments *\/","15649":"\/**\n     * @param Node\\Name $name Attribute name\n     * @param list<Arg> $args Attribute arguments\n     * @param array<string, mixed> $attributes Additional node attributes\n     *\/","15661":"\/** @var Attribute[] Attributes *\/","15663":"\/**\n     * @param Attribute[] $attrs PHP attributes\n     * @param array<string, mixed> $attributes Additional node attributes\n     *\/","15675":"\/** @var Expr\\Variable Variable to use *\/","15676":"\/** @var bool Whether to use by reference *\/","15678":"\/**\n     * Constructs a closure use node.\n     *\n     * @param Expr\\Variable $var Variable to use\n     * @param bool $byRef Whether to use by reference\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","15690":"\/**\n * This is a base class for complex types, including nullable types and union types.\n *\n * It does not provide any shared behavior and exists only for type-checking purposes.\n *\/","15706":"\/** @var Identifier Name *\/","15708":"\/** @var Name|null Namespaced name (if using NameResolver) *\/","15710":"\/**\n     * Constructs a const node for use in class const and const statements.\n     *\n     * @param string|Identifier $name Name\n     * @param Expr $value Value\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","15722":"\/** @var Node\\Identifier Key *\/","15723":"\/** @var Node\\Expr Value *\/","15725":"\/**\n     * Constructs a declare key=>value pair node.\n     *\n     * @param string|Node\\Identifier $key Key\n     * @param Node\\Expr $value Value\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","15752":"\/** @var Expr Variable *\/","15753":"\/** @var null|Expr Array index \/ dim *\/","15755":"\/**\n     * Constructs an array index fetch node.\n     *\n     * @param Expr $var Variable\n     * @param null|Expr $dim Array index \/ dim\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","15784":"\/** @var ArrayItem[] Items *\/","15786":"\/**\n     * Constructs an array node.\n     *\n     * @param ArrayItem[] $items Items of the array\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","15798":"\/** @var bool Whether the closure is static *\/","15799":"\/** @var bool Whether to return by reference *\/","15801":"\/** @var null|Node\\Identifier|Node\\Name|Node\\ComplexType *\/","15802":"\/** @var Expr Expression body *\/","15803":"\/** @var Node\\AttributeGroup[] *\/","15805":"\/**\n     * @param array{\n     *     expr: Expr,\n     *     static?: bool,\n     *     byRef?: bool,\n     *     params?: Node\\Param[],\n     *     returnType?: null|Node\\Identifier|Node\\Name|Node\\ComplexType,\n     *     attrGroups?: Node\\AttributeGroup[]\n     * } $subNodes Array of the following subnodes:\n     *             'expr'                  : Expression body\n     *             'static'     => false   : Whether the closure is static\n     *             'byRef'      => false   : Whether to return by reference\n     *             'params'     => array() : Parameters\n     *             'returnType' => null    : Return type\n     *             'attrGroups' => array() : PHP attribute groups\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","15806":"\/**\n     * @return Node\\Stmt\\Return_[]\n     *\/","15819":"\/** @var Expr Expression *\/","15821":"\/**\n     * Constructs an assignment node.\n     *\n     * @param Expr $var Variable\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","15836":"\/**\n     * Constructs a compound assignment operation node.\n     *\n     * @param Expr $var Variable\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16044":"\/** @var Expr Variable reference is assigned to *\/","16045":"\/** @var Expr Variable which is referenced *\/","16059":"\/** @var Expr The left hand side expression *\/","16060":"\/** @var Expr The right hand side expression *\/","16062":"\/**\n     * Constructs a binary operator node.\n     *\n     * @param Expr $left The left hand side expression\n     * @param Expr $right The right hand side expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16063":"\/**\n     * Get the operator sigil for this binary operation.\n     *\n     * In the case there are multiple possible sigils for an operator, this method does not\n     * necessarily return the one used in the parsed code.\n     *\/","16483":"\/**\n     * Constructs a bitwise not node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16497":"\/**\n     * Constructs a boolean not node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16510":"\/**\n     * Return raw arguments, which may be actual Args, or VariadicPlaceholders for first-class\n     * callables.\n     *\n     * @return array<Arg|VariadicPlaceholder>\n     *\/","16511":"\/**\n     * Returns whether this call expression is actually a first class callable.\n     *\/","16512":"\/**\n     * Assert that this is not a first-class callable and return only ordinary Args.\n     *\n     * @return Arg[]\n     *\/","16529":"\/**\n     * Constructs a cast node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16640":"\/** @var Name|Expr Class name *\/","16641":"\/** @var Identifier|Expr|Error Constant name *\/","16643":"\/**\n     * Constructs a class const fetch node.\n     *\n     * @param Name|Expr $class Class name\n     * @param string|Identifier|Expr|Error $name Constant name\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16657":"\/**\n     * Constructs a clone node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16671":"\/** @var Node\\Param[] Parameters *\/","16672":"\/** @var ClosureUse[] use()s *\/","16673":"\/** @var null|Node\\Identifier|Node\\Name|Node\\ComplexType Return type *\/","16677":"\/**\n     * Constructs a lambda function node.\n     *\n     * @param array{\n     *     static?: bool,\n     *     byRef?: bool,\n     *     params?: Node\\Param[],\n     *     uses?: ClosureUse[],\n     *     returnType?: null|Node\\Identifier|Node\\Name|Node\\ComplexType,\n     *     stmts?: Node\\Stmt[],\n     *     attrGroups?: Node\\AttributeGroup[],\n     * } $subNodes Array of the following optional subnodes:\n     *             'static'     => false  : Whether the closure is static\n     *             'byRef'      => false  : Whether to return by reference\n     *             'params'     => array(): Parameters\n     *             'uses'       => array(): use()s\n     *             'returnType' => null   : Return type\n     *             'stmts'      => array(): Statements\n     *             'attrGroups' => array(): PHP attributes groups\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16678":"\/** @return Node\\Stmt[] *\/","16705":"\/** @var Name Constant name *\/","16707":"\/**\n     * Constructs a const fetch node.\n     *\n     * @param Name $name Constant name\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16721":"\/**\n     * Constructs an empty() node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16733":"\/**\n * Error node used during parsing with error recovery.\n *\n * An error node may be placed at a position where an expression is required, but an error occurred.\n * Error nodes will not be present if the parser is run in throwOnError mode (the default).\n *\/","16735":"\/**\n     * Constructs an error node.\n     *\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16749":"\/**\n     * Constructs an error suppress node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16763":"\/**\n     * Constructs an eval() node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16775":"\/** @var null|Expr Expression *\/","16777":"\/**\n     * Constructs an exit() node.\n     *\n     * @param null|Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16789":"\/** @var Node\\Name|Expr Function name *\/","16790":"\/** @var array<Node\\Arg|Node\\VariadicPlaceholder> Arguments *\/","16792":"\/**\n     * Constructs a function call node.\n     *\n     * @param Node\\Name|Expr $name Function name\n     * @param array<Node\\Arg|Node\\VariadicPlaceholder> $args Arguments\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16807":"\/** @var int Type of include *\/","16809":"\/**\n     * Constructs an include node.\n     *\n     * @param Expr $expr Expression\n     * @param int $type Type of include\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16824":"\/**\n     * Constructs an instanceof check node.\n     *\n     * @param Expr $expr Expression\n     * @param Name|Expr $class Class name\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16836":"\/** @var Expr[] Variables *\/","16838":"\/**\n     * Constructs an array node.\n     *\n     * @param Expr[] $vars Variables\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16850":"\/** @var (ArrayItem|null)[] List of items to assign to *\/","16852":"\/**\n     * Constructs a list() destructuring node.\n     *\n     * @param (ArrayItem|null)[] $items List of items to assign to\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16864":"\/** @var Node\\Expr Condition *\/","16865":"\/** @var MatchArm[] *\/","16867":"\/**\n     * @param Node\\Expr $cond Condition\n     * @param MatchArm[] $arms\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16879":"\/** @var Expr Variable holding object *\/","16880":"\/** @var Identifier|Expr Method name *\/","16881":"\/** @var array<Arg|VariadicPlaceholder> Arguments *\/","16883":"\/**\n     * Constructs a function call node.\n     *\n     * @param Expr $var Variable holding object\n     * @param string|Identifier|Expr $name Method name\n     * @param array<Arg|VariadicPlaceholder> $args Arguments\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16897":"\/** @var Node\\Name|Expr|Node\\Stmt\\Class_ Class name *\/","16900":"\/**\n     * Constructs a function call node.\n     *\n     * @param Node\\Name|Expr|Node\\Stmt\\Class_ $class Class name (or class node for anonymous classes)\n     * @param array<Arg|VariadicPlaceholder> $args Arguments\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16918":"\/**\n     * Constructs a nullsafe method call node.\n     *\n     * @param Expr $var Variable holding object\n     * @param string|Identifier|Expr $name Method name\n     * @param array<Arg|VariadicPlaceholder> $args Arguments\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16933":"\/** @var Identifier|Expr Property name *\/","16935":"\/**\n     * Constructs a nullsafe property fetch node.\n     *\n     * @param Expr $var Variable holding object\n     * @param string|Identifier|Expr $name Property name\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16949":"\/**\n     * Constructs a post decrement node.\n     *\n     * @param Expr $var Variable\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16963":"\/**\n     * Constructs a post increment node.\n     *\n     * @param Expr $var Variable\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16977":"\/**\n     * Constructs a pre decrement node.\n     *\n     * @param Expr $var Variable\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","16991":"\/**\n     * Constructs a pre increment node.\n     *\n     * @param Expr $var Variable\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17005":"\/**\n     * Constructs an print() node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17020":"\/**\n     * Constructs a function call node.\n     *\n     * @param Expr $var Variable holding object\n     * @param string|Identifier|Expr $name Property name\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17032":"\/** @var (Expr|InterpolatedStringPart)[] Interpolated string array *\/","17034":"\/**\n     * Constructs a shell exec (backtick) node.\n     *\n     * @param (Expr|InterpolatedStringPart)[] $parts Interpolated string array\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17046":"\/** @var Node\\Name|Expr Class name *\/","17050":"\/**\n     * Constructs a static method call node.\n     *\n     * @param Node\\Name|Expr $class Class name\n     * @param string|Identifier|Expr $name Method name\n     * @param array<Arg|VariadicPlaceholder> $args Arguments\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17065":"\/** @var VarLikeIdentifier|Expr Property name *\/","17067":"\/**\n     * Constructs a static property fetch node.\n     *\n     * @param Name|Expr $class Class name\n     * @param string|VarLikeIdentifier|Expr $name Property name\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17079":"\/** @var Expr Condition *\/","17080":"\/** @var null|Expr Expression for true *\/","17081":"\/** @var Expr Expression for false *\/","17083":"\/**\n     * Constructs a ternary operator node.\n     *\n     * @param Expr $cond Condition\n     * @param null|Expr $if Expression for true\n     * @param Expr $else Expression for false\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17095":"\/** @var Node\\Expr Expression *\/","17097":"\/**\n     * Constructs a throw expression node.\n     *\n     * @param Node\\Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17111":"\/**\n     * Constructs a unary minus node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17125":"\/**\n     * Constructs a unary plus node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17137":"\/** @var string|Expr Name *\/","17139":"\/**\n     * Constructs a variable node.\n     *\n     * @param string|Expr $name Name\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17151":"\/** @var Expr Expression to yield from *\/","17153":"\/**\n     * Constructs an \"yield from\" node.\n     *\n     * @param Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17165":"\/** @var null|Expr Key expression *\/","17166":"\/** @var null|Expr Value expression *\/","17168":"\/**\n     * Constructs a yield expression node.\n     *\n     * @param null|Expr $value Value expression\n     * @param null|Expr $key Key expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17180":"\/**\n     * Whether to return by reference\n     *\/","17181":"\/**\n     * List of parameters\n     *\n     * @return Param[]\n     *\/","17182":"\/**\n     * Get the declared return type or null\n     *\n     * @return null|Identifier|Name|ComplexType\n     *\/","17183":"\/**\n     * The function body\n     *\n     * @return Stmt[]|null\n     *\/","17184":"\/**\n     * Get PHP attribute groups.\n     *\n     * @return AttributeGroup[]\n     *\/","17202":"\/**\n * Represents a non-namespaced name. Namespaced names are represented using Name nodes.\n *\/","17203":"\/**\n     * @psalm-var non-empty-string\n     * @var string Identifier as string\n     *\/","17206":"\/**\n     * Constructs an identifier node.\n     *\n     * @param string $name Identifier as string\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17207":"\/**\n     * Get identifier as string.\n     *\n     * @psalm-return non-empty-string\n     * @return string Identifier as string.\n     *\/","17208":"\/**\n     * Get lowercased identifier as string.\n     *\n     * @psalm-return non-empty-string&lowercase-string\n     * @return string Lowercased identifier as string\n     *\/","17209":"\/**\n     * Checks whether the identifier is a special class name (self, parent or static).\n     *\n     * @return bool Whether identifier is a special class name\n     *\/","17210":"\/**\n     * Get identifier as string.\n     *\n     * @psalm-return non-empty-string\n     * @return string Identifier as string\n     *\/","17222":"\/** @var string String value *\/","17224":"\/**\n     * Constructs a node representing a string part of an interpolated string.\n     *\n     * @param string $value String value\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17236":"\/** @var (Identifier|Name)[] Types *\/","17238":"\/**\n     * Constructs an intersection type.\n     *\n     * @param (Identifier|Name)[] $types Types\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17250":"\/** @var null|list<Node\\Expr> *\/","17251":"\/** @var Node\\Expr *\/","17253":"\/**\n     * @param null|list<Node\\Expr> $conds\n     *\/","17265":"\/**\n     * @psalm-var non-empty-string\n     * @var string Name as string\n     *\/","17268":"\/**\n     * Constructs a name node.\n     *\n     * @param string|string[]|self $name Name as string, part array or Name instance (copy ctor)\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17269":"\/**\n     * Get parts of name (split by the namespace separator).\n     *\n     * @psalm-return non-empty-list<string>\n     * @return string[] Parts of name\n     *\/","17270":"\/**\n     * Gets the first part of the name, i.e. everything before the first namespace separator.\n     *\n     * @return string First part of the name\n     *\/","17271":"\/**\n     * Gets the last part of the name, i.e. everything after the last namespace separator.\n     *\n     * @return string Last part of the name\n     *\/","17272":"\/**\n     * Checks whether the name is unqualified. (E.g. Name)\n     *\n     * @return bool Whether the name is unqualified\n     *\/","17273":"\/**\n     * Checks whether the name is qualified. (E.g. Name\\Name)\n     *\n     * @return bool Whether the name is qualified\n     *\/","17274":"\/**\n     * Checks whether the name is fully qualified. (E.g. \\Name)\n     *\n     * @return bool Whether the name is fully qualified\n     *\/","17275":"\/**\n     * Checks whether the name is explicitly relative to the current namespace. (E.g. namespace\\Name)\n     *\n     * @return bool Whether the name is relative\n     *\/","17276":"\/**\n     * Returns a string representation of the name itself, without taking the name type into\n     * account (e.g., not including a leading backslash for fully qualified names).\n     *\n     * @psalm-return non-empty-string\n     * @return string String representation\n     *\/","17277":"\/**\n     * Returns a string representation of the name as it would occur in code (e.g., including\n     * leading backslash for fully qualified names.\n     *\n     * @psalm-return non-empty-string\n     * @return string String representation\n     *\/","17278":"\/**\n     * Returns lowercased string representation of the name, without taking the name type into\n     * account (e.g., no leading backslash for fully qualified names).\n     *\n     * @psalm-return non-empty-string&lowercase-string\n     * @return string Lowercased string representation\n     *\/","17280":"\/**\n     * Returns a string representation of the name by imploding the namespace parts with the\n     * namespace separator.\n     *\n     * @psalm-return non-empty-string\n     * @return string String representation\n     *\/","17281":"\/**\n     * Gets a slice of a name (similar to array_slice).\n     *\n     * This method returns a new instance of the same type as the original and with the same\n     * attributes.\n     *\n     * If the slice is empty, null is returned. The null value will be correctly handled in\n     * concatenations using concat().\n     *\n     * Offset and length have the same meaning as in array_slice().\n     *\n     * @param int $offset Offset to start the slice at (may be negative)\n     * @param int|null $length Length of the slice (may be negative)\n     *\n     * @return static|null Sliced name\n     *\/","17282":"\/**\n     * Concatenate two names, yielding a new Name instance.\n     *\n     * The type of the generated instance depends on which class this method is called on, for\n     * example Name\\FullyQualified::concat() will yield a Name\\FullyQualified instance.\n     *\n     * If one of the arguments is null, a new instance of the other name will be returned. If both\n     * arguments are null, null will be returned. As such, writing\n     *     Name::concat($namespace, $shortName)\n     * where $namespace is a Name node or null will work as expected.\n     *\n     * @param string|string[]|self|null $name1 The first name\n     * @param string|string[]|self|null $name2 The second name\n     * @param array<string, mixed> $attributes Attributes to assign to concatenated name\n     *\n     * @return static|null Concatenated name\n     *\/","17283":"\/**\n     * Prepares a (string, array or Name node) name for use in name changing methods by converting\n     * it to a string.\n     *\n     * @param string|string[]|self $name Name to prepare\n     *\n     * @psalm-return non-empty-string\n     * @return string Prepared name\n     *\/","17349":"\/** @var Identifier|Name Type *\/","17351":"\/**\n     * Constructs a nullable type (wrapping another type).\n     *\n     * @param Identifier|Name $type Type\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17363":"\/** @var null|Identifier|Name|ComplexType Type declaration *\/","17364":"\/** @var bool Whether parameter is passed by reference *\/","17365":"\/** @var bool Whether this is a variadic argument *\/","17366":"\/** @var Expr\\Variable|Expr\\Error Parameter variable *\/","17367":"\/** @var null|Expr Default value *\/","17368":"\/** @var int Optional visibility flags *\/","17369":"\/** @var AttributeGroup[] PHP attribute groups *\/","17370":"\/** @var PropertyHook[] Property hooks for promoted properties *\/","17372":"\/**\n     * Constructs a parameter node.\n     *\n     * @param Expr\\Variable|Expr\\Error $var Parameter variable\n     * @param null|Expr $default Default value\n     * @param null|Identifier|Name|ComplexType $type Type declaration\n     * @param bool $byRef Whether is passed by reference\n     * @param bool $variadic Whether this is a variadic argument\n     * @param array<string, mixed> $attributes Additional attributes\n     * @param int $flags Optional visibility flags\n     * @param list<AttributeGroup> $attrGroups PHP attribute groups\n     * @param PropertyHook[] $hooks Property hooks for promoted properties\n     *\/","17373":"\/**\n     * Whether this parameter uses constructor property promotion.\n     *\/","17374":"\/**\n     * Whether the promoted property has explicit public(set) visibility.\n     *\/","17375":"\/**\n     * Whether the promoted property has explicit protected(set) visibility.\n     *\/","17376":"\/**\n     * Whether the promoted property has explicit private(set) visibility.\n     *\/","17390":"\/** @var bool Whether hook returns by reference *\/","17391":"\/** @var Identifier Hook name *\/","17392":"\/** @var Param[] Parameters *\/","17393":"\/** @var null|Expr|Stmt[] Hook body *\/","17395":"\/**\n     * Constructs a property hook node.\n     *\n     * @param string|Identifier $name Hook name\n     * @param null|Expr|Stmt[] $body Hook body\n     * @param array{\n     *     flags?: int,\n     *     byRef?: bool,\n     *     params?: Param[],\n     *     attrGroups?: AttributeGroup[],\n     * } $subNodes Array of the following optional subnodes:\n     *             'flags       => 0      : Flags\n     *             'byRef'      => false  : Whether hook returns by reference\n     *             'params'     => array(): Parameters\n     *             'attrGroups' => array(): PHP attribute groups\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17396":"\/**\n     * Whether the property hook is final.\n     *\/","17408":"\/** @var Node\\VarLikeIdentifier Name *\/","17409":"\/** @var null|Node\\Expr Default *\/","17411":"\/**\n     * Constructs a class property item node.\n     *\n     * @param string|Node\\VarLikeIdentifier $name Name\n     * @param null|Node\\Expr $default Default value\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17438":"\/** @var float Number value *\/","17440":"\/**\n     * Constructs a float number scalar node.\n     *\n     * @param float $value Value of the number\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17441":"\/**\n     * @param mixed[] $attributes\n     *\/","17442":"\/**\n     * @internal\n     *\n     * Parses a DNUMBER token like PHP would.\n     *\n     * @param string $str A string number\n     *\n     * @return float The parsed number\n     *\/","17454":"\/** @var (Expr|InterpolatedStringPart)[] list of string parts *\/","17456":"\/**\n     * Constructs an interpolated string node.\n     *\n     * @param (Expr|InterpolatedStringPart)[] $parts Interpolated string parts\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17498":"\/** @var int Number value *\/","17500":"\/**\n     * Constructs an integer number scalar node.\n     *\n     * @param int $value Value of the number\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17501":"\/**\n     * Constructs an Int node from a string number literal.\n     *\n     * @param string $str String number literal (decimal, octal, hex or binary)\n     * @param array<string, mixed> $attributes Additional attributes\n     * @param bool $allowInvalidOctal Whether to allow invalid octal numbers (PHP 5)\n     *\n     * @return Int_ The constructed LNumber, including kind attribute\n     *\/","17543":"\/**\n     * Constructs a magic constant node.\n     *\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17544":"\/**\n     * Get name of magic constant.\n     *\n     * @return string Name of magic constant\n     *\/","17675":"\/** @var array<string, string> Escaped character to its decoded value *\/","17677":"\/**\n     * Constructs a string scalar node.\n     *\n     * @param string $value Value of the string\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17678":"\/**\n     * @param array<string, mixed> $attributes\n     * @param bool $parseUnicodeEscape Whether to parse PHP 7 \\u escapes\n     *\/","17679":"\/**\n     * @internal\n     *\n     * Parses a string token.\n     *\n     * @param string $str String token content\n     * @param bool $parseUnicodeEscape Whether to parse PHP 7 \\u escapes\n     *\n     * @return string The parsed string\n     *\/","17680":"\/**\n     * @internal\n     *\n     * Parses escape sequences in strings (all string types apart from single quoted).\n     *\n     * @param string $str String without quotes\n     * @param null|string $quote Quote type\n     * @param bool $parseUnicodeEscape Whether to parse PHP 7 \\u escapes\n     *\n     * @return string String with escape sequences parsed\n     *\/","17681":"\/**\n     * Converts a Unicode code point to its UTF-8 encoded representation.\n     *\n     * @param int $num Code point\n     *\n     * @return string UTF-8 representation of code point\n     *\/","17693":"\/** @var Expr\\Variable Variable *\/","17694":"\/** @var null|Node\\Expr Default value *\/","17696":"\/**\n     * Constructs a static variable node.\n     *\n     * @param Expr\\Variable $var Name\n     * @param null|Node\\Expr $default Default value\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17723":"\/** @var Stmt[] Statements *\/","17725":"\/**\n     * A block of statements.\n     *\n     * @param Stmt[] $stmts Statements\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17737":"\/** @var null|Node\\Expr Number of loops to break *\/","17739":"\/**\n     * Constructs a break node.\n     *\n     * @param null|Node\\Expr $num Number of loops to break\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17751":"\/** @var null|Node\\Expr Condition (null for default) *\/","17754":"\/**\n     * Constructs a case node.\n     *\n     * @param null|Node\\Expr $cond Condition (null for default)\n     * @param Node\\Stmt[] $stmts Statements\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17766":"\/** @var Node\\Name[] Types of exceptions to catch *\/","17767":"\/** @var Expr\\Variable|null Variable for exception *\/","17770":"\/**\n     * Constructs a catch node.\n     *\n     * @param Node\\Name[] $types Types of exceptions to catch\n     * @param Expr\\Variable|null $var Variable for exception\n     * @param Node\\Stmt[] $stmts Statements\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17783":"\/** @var Node\\Const_[] Constant declarations *\/","17785":"\/** @var Node\\Identifier|Node\\Name|Node\\ComplexType|null Type declaration *\/","17787":"\/**\n     * Constructs a class const list node.\n     *\n     * @param Node\\Const_[] $consts Constant declarations\n     * @param int $flags Modifiers\n     * @param array<string, mixed> $attributes Additional attributes\n     * @param list<Node\\AttributeGroup> $attrGroups PHP attribute groups\n     * @param null|Node\\Identifier|Node\\Name|Node\\ComplexType $type Type declaration\n     *\/","17788":"\/**\n     * Whether constant is explicitly or implicitly public.\n     *\/","17789":"\/**\n     * Whether constant is protected.\n     *\/","17790":"\/**\n     * Whether constant is private.\n     *\/","17791":"\/**\n     * Whether constant is final.\n     *\/","17803":"\/** @var Node\\Identifier|null Name *\/","17806":"\/** @var Node\\Name|null Namespaced name (if using NameResolver) *\/","17808":"\/**\n     * @return TraitUse[]\n     *\/","17809":"\/**\n     * @return ClassConst[]\n     *\/","17810":"\/**\n     * @return Property[]\n     *\/","17811":"\/**\n     * Gets property with the given name defined directly in this class\/interface\/trait.\n     *\n     * @param string $name Name of the property\n     *\n     * @return Property|null Property node or null if the property does not exist\n     *\/","17812":"\/**\n     * Gets all methods defined directly in this class\/interface\/trait\n     *\n     * @return ClassMethod[]\n     *\/","17813":"\/**\n     * Gets method with the given name defined directly in this class\/interface\/trait.\n     *\n     * @param string $name Name of the method (compared case-insensitively)\n     *\n     * @return ClassMethod|null Method node or null if the method does not exist\n     *\/","17828":"\/** @var int Flags *\/","17830":"\/** @var Node\\Identifier Name *\/","17833":"\/** @var Node\\Stmt[]|null Statements *\/","17837":"\/**\n     * Constructs a class method node.\n     *\n     * @param string|Node\\Identifier $name Name\n     * @param array{\n     *     flags?: int,\n     *     byRef?: bool,\n     *     params?: Node\\Param[],\n     *     returnType?: null|Node\\Identifier|Node\\Name|Node\\ComplexType,\n     *     stmts?: Node\\Stmt[]|null,\n     *     attrGroups?: Node\\AttributeGroup[],\n     * } $subNodes Array of the following optional subnodes:\n     *             'flags       => 0              : Flags\n     *             'byRef'      => false          : Whether to return by reference\n     *             'params'     => array()        : Parameters\n     *             'returnType' => null           : Return type\n     *             'stmts'      => array()        : Statements\n     *             'attrGroups' => array()        : PHP attribute groups\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17838":"\/**\n     * Whether the method is explicitly or implicitly public.\n     *\/","17839":"\/**\n     * Whether the method is protected.\n     *\/","17840":"\/**\n     * Whether the method is private.\n     *\/","17841":"\/**\n     * Whether the method is abstract.\n     *\/","17842":"\/**\n     * Whether the method is final.\n     *\/","17843":"\/**\n     * Whether the method is static.\n     *\/","17844":"\/**\n     * Whether the method is magic.\n     *\/","17856":"\/** @deprecated Use Modifiers::PUBLIC instead *\/","17857":"\/** @deprecated Use Modifiers::PROTECTED instead *\/","17858":"\/** @deprecated Use Modifiers::PRIVATE instead *\/","17859":"\/** @deprecated Use Modifiers::STATIC instead *\/","17860":"\/** @deprecated Use Modifiers::ABSTRACT instead *\/","17861":"\/** @deprecated Use Modifiers::FINAL instead *\/","17862":"\/** @deprecated Use Modifiers::READONLY instead *\/","17863":"\/** @deprecated Use Modifiers::VISIBILITY_MASK instead *\/","17872":"\/**\n     * Constructs a class node.\n     *\n     * @param string|Node\\Identifier|null $name Name\n     * @param array{\n     *     flags?: int,\n     *     extends?: Node\\Name|null,\n     *     implements?: Node\\Name[],\n     *     stmts?: Node\\Stmt[],\n     *     attrGroups?: Node\\AttributeGroup[],\n     * } $subNodes Array of the following optional subnodes:\n     *             'flags'       => 0      : Flags\n     *             'extends'     => null   : Name of extended class\n     *             'implements'  => array(): Names of implemented interfaces\n     *             'stmts'       => array(): Statements\n     *             'attrGroups'  => array(): PHP attribute groups\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17873":"\/**\n     * Whether the class is explicitly abstract.\n     *\/","17874":"\/**\n     * Whether the class is final.\n     *\/","17875":"\/**\n     * Whether the class is anonymous.\n     *\/","17895":"\/**\n     * Constructs a const list node.\n     *\n     * @param Node\\Const_[] $consts Constant declarations\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17907":"\/** @var null|Node\\Expr Number of loops to continue *\/","17909":"\/**\n     * Constructs a continue node.\n     *\n     * @param null|Node\\Expr $num Number of loops to continue\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17936":"\/** @var DeclareItem[] List of declares *\/","17939":"\/**\n     * Constructs a declare node.\n     *\n     * @param DeclareItem[] $declares List of declares\n     * @param Node\\Stmt[]|null $stmts Statements\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17954":"\/**\n     * Constructs a do while node.\n     *\n     * @param Node\\Expr $cond Condition\n     * @param Node\\Stmt[] $stmts Statements\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17966":"\/** @var Node\\Expr[] Expressions *\/","17968":"\/**\n     * Constructs an echo node.\n     *\n     * @param Node\\Expr[] $exprs Expressions\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17983":"\/**\n     * Constructs an elseif node.\n     *\n     * @param Node\\Expr $cond Condition\n     * @param Node\\Stmt[] $stmts Statements\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","17997":"\/**\n     * Constructs an else node.\n     *\n     * @param Node\\Stmt[] $stmts Statements\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18009":"\/** @var Node\\Identifier Enum case name *\/","18010":"\/** @var Node\\Expr|null Enum case expression *\/","18013":"\/**\n     * @param string|Node\\Identifier $name Enum case name\n     * @param Node\\Expr|null $expr Enum case expression\n     * @param list<AttributeGroup> $attrGroups PHP attribute groups\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18025":"\/** @var null|Node\\Identifier Scalar Type *\/","18032":"\/**\n     * @param string|Node\\Identifier|null $name Name\n     * @param array{\n     *     scalarType?: Node\\Identifier|null,\n     *     implements?: Node\\Name[],\n     *     stmts?: Node\\Stmt[],\n     *     attrGroups?: Node\\AttributeGroup[],\n     * } $subNodes Array of the following optional subnodes:\n     *             'scalarType'  => null    : Scalar type\n     *             'implements'  => array() : Names of implemented interfaces\n     *             'stmts'       => array() : Statements\n     *             'attrGroups'  => array() : PHP attribute groups\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18050":"\/**\n * Represents statements of type \"expr;\"\n *\/","18053":"\/**\n     * Constructs an expression statement.\n     *\n     * @param Node\\Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18067":"\/**\n     * Constructs a finally node.\n     *\n     * @param Node\\Stmt[] $stmts Statements\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18079":"\/** @var Node\\Expr[] Init expressions *\/","18080":"\/** @var Node\\Expr[] Loop conditions *\/","18081":"\/** @var Node\\Expr[] Loop expressions *\/","18084":"\/**\n     * Constructs a for loop node.\n     *\n     * @param array{\n     *     init?: Node\\Expr[],\n     *     cond?: Node\\Expr[],\n     *     loop?: Node\\Expr[],\n     *     stmts?: Node\\Stmt[],\n     * } $subNodes Array of the following optional subnodes:\n     *             'init'  => array(): Init expressions\n     *             'cond'  => array(): Loop conditions\n     *             'loop'  => array(): Loop expressions\n     *             'stmts' => array(): Statements\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18096":"\/** @var Node\\Expr Expression to iterate *\/","18097":"\/** @var null|Node\\Expr Variable to assign key to *\/","18098":"\/** @var bool Whether to assign value by reference *\/","18099":"\/** @var Node\\Expr Variable to assign value to *\/","18102":"\/**\n     * Constructs a foreach node.\n     *\n     * @param Node\\Expr $expr Expression to iterate\n     * @param Node\\Expr $valueVar Variable to assign value to\n     * @param array{\n     *     keyVar?: Node\\Expr|null,\n     *     byRef?: bool,\n     *     stmts?: Node\\Stmt[],\n     * } $subNodes Array of the following optional subnodes:\n     *             'keyVar' => null   : Variable to assign key to\n     *             'byRef'  => false  : Whether to assign value by reference\n     *             'stmts'  => array(): Statements\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18114":"\/** @var bool Whether function returns by reference *\/","18122":"\/**\n     * Constructs a function node.\n     *\n     * @param string|Node\\Identifier $name Name\n     * @param array{\n     *     byRef?: bool,\n     *     params?: Node\\Param[],\n     *     returnType?: null|Node\\Identifier|Node\\Name|Node\\ComplexType,\n     *     stmts?: Node\\Stmt[],\n     *     attrGroups?: Node\\AttributeGroup[],\n     * } $subNodes Array of the following optional subnodes:\n     *             'byRef'      => false  : Whether to return by reference\n     *             'params'     => array(): Parameters\n     *             'returnType' => null   : Return type\n     *             'stmts'      => array(): Statements\n     *             'attrGroups' => array(): PHP attribute groups\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18135":"\/** @var Node\\Expr[] Variables *\/","18137":"\/**\n     * Constructs a global variables list node.\n     *\n     * @param Node\\Expr[] $vars Variables to unset\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18149":"\/** @var Identifier Name of label to jump to *\/","18151":"\/**\n     * Constructs a goto node.\n     *\n     * @param string|Identifier $name Name of label to jump to\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18163":"\/**\n     * @var Use_::TYPE_* Type of group use\n     *\/","18164":"\/** @var Name Prefix for uses *\/","18165":"\/** @var UseItem[] Uses *\/","18167":"\/**\n     * Constructs a group use node.\n     *\n     * @param Name $prefix Prefix for uses\n     * @param UseItem[] $uses Uses\n     * @param Use_::TYPE_* $type Type of group use\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18179":"\/** @var string Remaining text after halt compiler statement. *\/","18181":"\/**\n     * Constructs a __halt_compiler node.\n     *\n     * @param string $remaining Remaining text after halt compiler statement.\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18193":"\/** @var Node\\Expr Condition expression *\/","18195":"\/** @var ElseIf_[] Elseif clauses *\/","18196":"\/** @var null|Else_ Else clause *\/","18198":"\/**\n     * Constructs an if node.\n     *\n     * @param Node\\Expr $cond Condition\n     * @param array{\n     *     stmts?: Node\\Stmt[],\n     *     elseifs?: ElseIf_[],\n     *     else?: Else_|null,\n     * } $subNodes Array of the following optional subnodes:\n     *             'stmts'   => array(): Statements\n     *             'elseifs' => array(): Elseif clauses\n     *             'else'    => null   : Else clause\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18210":"\/** @var string String *\/","18212":"\/**\n     * Constructs an inline HTML node.\n     *\n     * @param string $value String\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18224":"\/** @var Node\\Name[] Extended interfaces *\/","18230":"\/**\n     * Constructs a class node.\n     *\n     * @param string|Node\\Identifier $name Name\n     * @param array{\n     *     extends?: Node\\Name[],\n     *     stmts?: Node\\Stmt[],\n     *     attrGroups?: Node\\AttributeGroup[],\n     * } $subNodes Array of the following optional subnodes:\n     *             'extends'    => array(): Name of extended interfaces\n     *             'stmts'      => array(): Statements\n     *             'attrGroups' => array(): PHP attribute groups\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18250":"\/**\n     * Constructs a label node.\n     *\n     * @param string|Identifier $name Name\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18262":"\/** @var null|Node\\Name Name *\/","18265":"\/**\n     * Constructs a namespace node.\n     *\n     * @param null|Node\\Name $name Name\n     * @param null|Node\\Stmt[] $stmts Statements\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18277":"\/** Nop\/empty statement (;). *\/","18292":"\/** @var PropertyItem[] Properties *\/","18295":"\/** @var Node\\PropertyHook[] Property hooks *\/","18297":"\/**\n     * Constructs a class property list node.\n     *\n     * @param int $flags Modifiers\n     * @param PropertyItem[] $props Properties\n     * @param array<string, mixed> $attributes Additional attributes\n     * @param null|Identifier|Name|ComplexType $type Type declaration\n     * @param Node\\AttributeGroup[] $attrGroups PHP attribute groups\n     * @param Node\\PropertyHook[] $hooks Property hooks\n     *\/","18298":"\/**\n     * Whether the property is explicitly or implicitly public.\n     *\/","18299":"\/**\n     * Whether the property is protected.\n     *\/","18300":"\/**\n     * Whether the property is private.\n     *\/","18301":"\/**\n     * Whether the property is static.\n     *\/","18302":"\/**\n     * Whether the property is readonly.\n     *\/","18303":"\/**\n     * Whether the property is abstract.\n     *\/","18304":"\/**\n     * Whether the property is final.\n     *\/","18305":"\/**\n     * Whether the property has explicit public(set) visibility.\n     *\/","18306":"\/**\n     * Whether the property has explicit protected(set) visibility.\n     *\/","18307":"\/**\n     * Whether the property has explicit private(set) visibility.\n     *\/","18334":"\/** @var null|Node\\Expr Expression *\/","18336":"\/**\n     * Constructs a return node.\n     *\n     * @param null|Node\\Expr $expr Expression\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18363":"\/** @var StaticVar[] Variable definitions *\/","18365":"\/**\n     * Constructs a static variables list node.\n     *\n     * @param StaticVar[] $vars Variable definitions\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18378":"\/** @var Case_[] Case list *\/","18380":"\/**\n     * Constructs a case node.\n     *\n     * @param Node\\Expr $cond Condition\n     * @param Case_[] $cases Case list\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18392":"\/** @var Node\\Name[] Traits *\/","18393":"\/** @var TraitUseAdaptation[] Adaptations *\/","18395":"\/**\n     * Constructs a trait use node.\n     *\n     * @param Node\\Name[] $traits Traits\n     * @param TraitUseAdaptation[] $adaptations Adaptations\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18407":"\/** @var Node\\Name|null Trait name *\/","18408":"\/** @var Node\\Identifier Method name *\/","18424":"\/** @var null|int New modifier *\/","18425":"\/** @var null|Node\\Identifier New name *\/","18429":"\/**\n     * Constructs a trait use precedence adaptation node.\n     *\n     * @param null|Node\\Name $trait Trait name\n     * @param string|Node\\Identifier $method Method name\n     * @param null|int $newModifier New modifier\n     * @param null|string|Node\\Identifier $newName New name\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18441":"\/** @var Node\\Name[] Overwritten traits *\/","18445":"\/**\n     * Constructs a trait use precedence adaptation node.\n     *\n     * @param Node\\Name $trait Trait name\n     * @param string|Node\\Identifier $method Method name\n     * @param Node\\Name[] $insteadof Overwritten traits\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18462":"\/**\n     * Constructs a trait node.\n     *\n     * @param string|Node\\Identifier $name Name\n     * @param array{\n     *     stmts?: Node\\Stmt[],\n     *     attrGroups?: Node\\AttributeGroup[],\n     * } $subNodes Array of the following optional subnodes:\n     *             'stmts'      => array(): Statements\n     *             'attrGroups' => array(): PHP attribute groups\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18481":"\/** @var Catch_[] Catches *\/","18482":"\/** @var null|Finally_ Optional finally node *\/","18484":"\/**\n     * Constructs a try catch node.\n     *\n     * @param Node\\Stmt[] $stmts Statements\n     * @param Catch_[] $catches Catches\n     * @param null|Finally_ $finally Optional finally node\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18496":"\/** @var Node\\Expr[] Variables to unset *\/","18498":"\/**\n     * Constructs an unset node.\n     *\n     * @param Node\\Expr[] $vars Variables to unset\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18510":"\/**\n     * @var Use_::TYPE_* One of the Stmt\\Use_::TYPE_* constants. Will only differ from TYPE_UNKNOWN for mixed group uses\n     *\/","18511":"\/** @var Node\\Name Namespace, class, function or constant to alias *\/","18512":"\/** @var Identifier|null Alias *\/","18514":"\/**\n     * Constructs an alias (use) item node.\n     *\n     * @param Node\\Name $name Namespace\/Class to alias\n     * @param null|string|Identifier $alias Alias\n     * @param Use_::TYPE_* $type Type of the use element (for mixed group use only)\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18515":"\/**\n     * Get alias. If not explicitly given this is the last component of the used name.\n     *\/","18527":"\/**\n     * Unknown type. Both Stmt\\Use_ \/ Stmt\\GroupUse and Stmt\\UseUse have a $type property, one of them will always be\n     * TYPE_UNKNOWN while the other has one of the three other possible types. For normal use statements the type on the\n     * Stmt\\UseUse is unknown. It's only the other way around for mixed group use declarations.\n     *\/","18528":"\/** Class or namespace import *\/","18529":"\/** Function import *\/","18530":"\/** Constant import *\/","18531":"\/** @var self::TYPE_* Type of alias *\/","18532":"\/** @var UseItem[] Aliases *\/","18534":"\/**\n     * Constructs an alias (use) list node.\n     *\n     * @param UseItem[] $uses Aliases\n     * @param Stmt\\Use_::TYPE_* $type Type of alias\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18549":"\/**\n     * Constructs a while node.\n     *\n     * @param Node\\Expr $cond Condition\n     * @param Node\\Stmt[] $stmts Statements\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18561":"\/** @var (Identifier|Name|IntersectionType)[] Types *\/","18563":"\/**\n     * Constructs a union type.\n     *\n     * @param (Identifier|Name|IntersectionType)[] $types Types\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18592":"\/**\n * Represents a name that is written in source code with a leading dollar,\n * but is not a proper variable. The leading dollar is not stored as part of the name.\n *\n * Examples: Names in property declarations are formatted as variables. Names in static property\n * lookups are also formatted as variables.\n *\/","18611":"\/**\n * Represents the \"...\" in \"foo(...)\" of the first-class callable syntax.\n *\/","18613":"\/**\n     * Create a variadic argument placeholder (first-class callable syntax).\n     *\n     * @param array<string, mixed> $attributes Additional attributes\n     *\/","18625":"\/**\n     * Parses PHP code into a node tree.\n     *\n     * @param string $code The source code to parse\n     * @param ErrorHandler|null $errorHandler Error handler to use for lexer\/parser errors, defaults\n     *                                        to ErrorHandler\\Throwing.\n     *\n     * @return Node\\Stmt[]|null Array of statements (or null non-throwing error handler is used and\n     *                          the parser was unable to recover from an error).\n     *\/","18626":"\/**\n     * Return tokens for the last parse.\n     *\n     * @return Token[]\n     *\/","18627":"\/** @var Lexer Lexer that is used when parsing *\/","18628":"\/** @var PhpVersion PHP version to target on a best-effort basis *\/","18629":"\/** @var int Size of $tokenToSymbol map *\/","18630":"\/** @var int Size of $action table *\/","18631":"\/** @var int Size of $goto table *\/","18632":"\/** @var int Symbol number signifying an invalid token *\/","18633":"\/** @var int Symbol number of error recovery token *\/","18634":"\/** @var int Action number signifying default action *\/","18635":"\/** @var int Rule number signifying that an unexpected token was encountered *\/","18636":"\/** @var int Number of non-leaf states *\/","18637":"\/** @var int[] Map of PHP token IDs to internal symbols *\/","18638":"\/** @var array<int, bool> Map of PHP token IDs to drop *\/","18639":"\/** @var int[] Map of external symbols (static::T_*) to internal symbols *\/","18640":"\/** @var string[] Map of symbols to their names *\/","18641":"\/** @var array<int, string> Names of the production rules (only necessary for debugging) *\/","18642":"\/** @var int[] Map of states to a displacement into the $action table. The corresponding action for this\n     *             state\/symbol pair is $action[$actionBase[$state] + $symbol]. If $actionBase[$state] is 0, the\n     *             action is defaulted, i.e. $actionDefault[$state] should be used instead. *\/","18643":"\/** @var int[] Table of actions. Indexed according to $actionBase comment. *\/","18644":"\/** @var int[] Table indexed analogously to $action. If $actionCheck[$actionBase[$state] + $symbol] != $symbol\n     *             then the action is defaulted, i.e. $actionDefault[$state] should be used instead. *\/","18645":"\/** @var int[] Map of states to their default action *\/","18646":"\/** @var callable[] Semantic action callbacks *\/","18647":"\/** @var int[] Map of non-terminals to a displacement into the $goto table. The corresponding goto state for this\n     *             non-terminal\/state pair is $goto[$gotoBase[$nonTerminal] + $state] (unless defaulted) *\/","18648":"\/** @var int[] Table of states to goto after reduction. Indexed according to $gotoBase comment. *\/","18649":"\/** @var int[] Table indexed analogously to $goto. If $gotoCheck[$gotoBase[$nonTerminal] + $state] != $nonTerminal\n     *             then the goto state is defaulted, i.e. $gotoDefault[$nonTerminal] should be used. *\/","18650":"\/** @var int[] Map of non-terminals to the default state to goto after their reduction *\/","18651":"\/** @var int[] Map of rules to the non-terminal on their left-hand side, i.e. the non-terminal to use for\n     *             determining the state to goto after reduction. *\/","18652":"\/** @var int[] Map of rules to the length of their right-hand side, which is the number of elements that have to\n     *             be popped from the stack(s) on reduction. *\/","18653":"\/** @var mixed Temporary value containing the result of last semantic action (reduction) *\/","18654":"\/** @var mixed[] Semantic value stack (contains values of tokens and semantic action results) *\/","18655":"\/** @var int[] Token start position stack *\/","18656":"\/** @var int[] Token end position stack *\/","18658":"\/** @var int Error state, used to avoid error floods *\/","18659":"\/** @var \\SplObjectStorage<Array_, null>|null Array nodes created during parsing, for postprocessing of empty elements. *\/","18660":"\/** @var Token[] Tokens for the current parse *\/","18661":"\/** @var int Current position in token array *\/","18662":"\/**\n     * Initialize $reduceCallbacks map.\n     *\/","18663":"\/**\n     * Creates a parser instance.\n     *\n     * Options:\n     *  * phpVersion: ?PhpVersion,\n     *\n     * @param Lexer $lexer A lexer\n     * @param PhpVersion $phpVersion PHP version to target, defaults to latest supported. This\n     *                               option is best-effort: Even if specified, parsing will generally assume the latest\n     *                               supported version and only adjust behavior in minor ways, for example by omitting\n     *                               errors in older versions and interpreting type hints as a name or identifier depending\n     *                               on version.\n     *\/","18664":"\/**\n     * Parses PHP code into a node tree.\n     *\n     * If a non-throwing error handler is used, the parser will continue parsing after an error\n     * occurred and attempt to build a partial AST.\n     *\n     * @param string $code The source code to parse\n     * @param ErrorHandler|null $errorHandler Error handler to use for lexer\/parser errors, defaults\n     *                                        to ErrorHandler\\Throwing.\n     *\n     * @return Node\\Stmt[]|null Array of statements (or null non-throwing error handler is used and\n     *                          the parser was unable to recover from an error).\n     *\/","18665":"\/** @return Stmt[]|null *\/","18666":"\/**\n     * Format error message including expected tokens.\n     *\n     * @param int $symbol Unexpected symbol\n     * @param int $state State at time of error\n     *\n     * @return string Formatted error message\n     *\/","18667":"\/**\n     * Get limited number of expected tokens in given state.\n     *\n     * @param int $state State\n     *\n     * @return string[] Expected tokens. If too many, an empty array is returned.\n     *\/","18668":"\/**\n     * Get attributes for a node with the given start and end token positions.\n     *\n     * @param int $tokenStartPos Token position the node starts at\n     * @param int $tokenEndPos Token position the node ends at\n     * @return array<string, mixed> Attributes\n     *\/","18669":"\/**\n     * Get attributes for a single token at the given token position.\n     *\n     * @return array<string, mixed> Attributes\n     *\/","18670":"\/**\n     * Moves statements of semicolon-style namespaces into $ns->stmts and checks various error conditions.\n     *\n     * @param Node\\Stmt[] $stmts\n     * @return Node\\Stmt[]\n     *\/","18671":"\/** @return array<string, mixed> *\/","18672":"\/**\n     * Determine namespacing style (semicolon or brace)\n     *\n     * @param Node[] $stmts Top-level statements.\n     *\n     * @return null|string One of \"semicolon\", \"brace\" or null (no namespaces)\n     *\/","18673":"\/** @return Name|Identifier *\/","18674":"\/**\n     * Get combined start and end attributes at a stack location\n     *\n     * @param int $stackPos Stack location\n     *\n     * @return array<string, mixed> Combined start and end attributes\n     *\/","18675":"\/** @param array<string, mixed> $attributes *\/","18676":"\/**\n     * Parse a T_NUM_STRING token into either an integer or string node.\n     *\n     * @param string $str Number string\n     * @param array<string, mixed> $attributes Attributes\n     *\n     * @return Int_|String_ Integer or string node.\n     *\/","18678":"\/**\n     * @param string|(Expr|InterpolatedStringPart)[] $contents\n     * @param array<string, mixed> $attributes\n     * @param array<string, mixed> $endTokenAttributes\n     *\/","18679":"\/**\n     * Get last comment before the given token position, if any\n     *\/","18680":"\/**\n     * Create a zero-length nop to capture preceding comments, if any.\n     *\/","18682":"\/** @param ElseIf_|Else_ $node *\/","18683":"\/** @param Name[] $interfaces *\/","18684":"\/** @param PropertyHook[] $hooks *\/","18685":"\/**\n     * @param Property|Param $node\n     *\/","18686":"\/** @param array<Node\\Arg|Node\\VariadicPlaceholder> $args *\/","18687":"\/**\n     * @param array<Node\\Arg|Node\\VariadicPlaceholder> $args\n     * @param array<string, mixed> $attrs\n     *\/","18688":"\/**\n     * Creates the token map.\n     *\n     * The token map maps the PHP internal token identifiers\n     * to the identifiers used by the Parser. Additionally it\n     * maps T_OPEN_TAG_WITH_ECHO to T_ECHO and T_CLOSE_TAG to ';'.\n     *\n     * @return array<int, int> The token map\n     *\/","18689":"\/**\n     * Create a parser targeting the given version on a best-effort basis. The parser will generally\n     * accept code for the newest supported version, but will try to accommodate code that becomes\n     * invalid in newer versions or changes in interpretation.\n     *\/","18690":"\/**\n     * Create a parser targeting the newest version supported by this library. Code for older\n     * versions will be accepted if there have been no relevant backwards-compatibility breaks in\n     * PHP.\n     *\/","18691":"\/**\n     * Create a parser targeting the host PHP version, that is the PHP version we're currently\n     * running on. This parser will not use any token emulation.\n     *\/","18766":"\/**\n * A PHP version, representing only the major and minor version components.\n *\/","18767":"\/** @var int[] Minimum versions for builtin types *\/","18768":"\/** @var int Version ID in PHP_VERSION_ID format *\/","18769":"\/**\n     * Create a PhpVersion object from major and minor version components.\n     *\/","18770":"\/**\n     * Get the newest PHP version supported by this library. Support for this version may be partial,\n     * if it is still under development.\n     *\/","18771":"\/**\n     * Get the host PHP version, that is the PHP version we're currently running on.\n     *\/","18772":"\/**\n     * Parse the version from a string like \"8.1\".\n     *\/","18773":"\/**\n     * Check whether two versions are the same.\n     *\/","18774":"\/**\n     * Check whether this version is greater than or equal to the argument.\n     *\/","18775":"\/**\n     * Check whether this version is older than the argument.\n     *\/","18776":"\/**\n     * Check whether this is the host PHP version.\n     *\/","18777":"\/**\n     * Check whether this PHP version supports the given builtin type. Type name must be lowercase.\n     *\/","18778":"\/**\n     * Whether this version supports [] array literals.\n     *\/","18779":"\/**\n     * Whether this version supports [] for destructuring.\n     *\/","18780":"\/**\n     * Whether this version supports flexible heredoc\/nowdoc.\n     *\/","18781":"\/**\n     * Whether this version supports trailing commas in parameter lists.\n     *\/","18782":"\/**\n     * Whether this version allows \"$var =& new Obj\".\n     *\/","18783":"\/**\n     * Whether this version allows invalid octals like \"08\".\n     *\/","18784":"\/**\n     * Whether this version allows DEL (\\x7f) to occur in identifiers.\n     *\/","18785":"\/**\n     * Whether this version supports yield in expression context without parentheses.\n     *\/","18786":"\/**\n     * Whether this version supports unicode escape sequences in strings.\n     *\/","18787":"\/**\n     * Pretty prints an array of statements.\n     *\n     * @param Node[] $stmts Array of statements\n     *\n     * @return string Pretty printed statements\n     *\/","18788":"\/**\n     * Pretty prints an expression.\n     *\n     * @param Expr $node Expression node\n     *\n     * @return string Pretty printed node\n     *\/","18789":"\/**\n     * Pretty prints a file of statements (includes the opening <?php tag if it is required).\n     *\n     * @param Node[] $stmts Array of statements\n     *\n     * @return string Pretty printed statements\n     *\/","18790":"\/**\n     * Perform a format-preserving pretty print of an AST.\n     *\n     * The format preservation is best effort. For some changes to the AST the formatting will not\n     * be preserved (at least not locally).\n     *\n     * In order to use this method a number of prerequisites must be satisfied:\n     *  * The startTokenPos and endTokenPos attributes in the lexer must be enabled.\n     *  * The CloningVisitor must be run on the AST prior to modification.\n     *  * The original tokens must be provided, using the getTokens() method on the lexer.\n     *\n     * @param Node[] $stmts Modified AST with links to original AST\n     * @param Node[] $origStmts Original AST with token offset information\n     * @param Token[] $origTokens Tokens of the original code\n     *\/","18791":"\/** @var array<class-string, array{int, int, int}> *\/","18792":"\/** @var int Current indentation level. *\/","18793":"\/** @var string String for single level of indentation *\/","18794":"\/** @var int Width in spaces to indent by. *\/","18795":"\/** @var bool Whether to use tab indentation. *\/","18796":"\/** @var int Width in spaces of one tab. *\/","18797":"\/** @var string Newline style. Does not include current indentation. *\/","18798":"\/** @var string Newline including current indentation. *\/","18799":"\/** @var string|null Token placed at end of doc string to ensure it is followed by a newline.\n     *                   Null if flexible doc strings are used. *\/","18800":"\/** @var bool Whether semicolon namespaces can be used (i.e. no global namespace is used) *\/","18801":"\/** @var bool Whether to use short array syntax if the node specifies no preference *\/","18802":"\/** @var PhpVersion PHP version to target *\/","18803":"\/** @var TokenStream|null Original tokens for use in format-preserving pretty print *\/","18804":"\/** @var Internal\\Differ<Node> Differ for node lists *\/","18805":"\/** @var array<string, bool> Map determining whether a certain character is a label character *\/","18806":"\/**\n     * @var array<string, array<string, int>> Map from token classes and subnode names to FIXUP_* constants.\n     *                                        This is used during format-preserving prints to place additional parens\/braces if necessary.\n     *\/","18807":"\/**\n     * @var array<string, array{left?: int|string, right?: int|string}> Map from \"{$node->getType()}->{$subNode}\"\n     *                                                                  to ['left' => $l, 'right' => $r], where $l and $r specify the token type that needs to be stripped\n     *                                                                  when removing this node.\n     *\/","18808":"\/**\n     * @var array<string, array{int|string|null, bool, string|null, string|null}> Map from\n     *                                                                            \"{$node->getType()}->{$subNode}\" to [$find, $beforeToken, $extraLeft, $extraRight].\n     *                                                                            $find is an optional token after which the insertion occurs. $extraLeft\/Right\n     *                                                                            are optionally added before\/after the main insertions.\n     *\/","18809":"\/**\n     * @var array<string, string> Map From \"{$class}->{$subNode}\" to string that should be inserted\n     *                            between elements of this list subnode.\n     *\/","18810":"\/**\n     * @var array<string, array{int|string|null, string, string}>\n     *\/","18811":"\/** @var array<string, array{string, int}> Map from \"{$class}->{$subNode}\" to [$printFn, $token]\n     *       where $printFn is the function to print the modifiers and $token is the token before which\n     *       the modifiers should be reprinted. *\/","18812":"\/**\n     * Creates a pretty printer instance using the given options.\n     *\n     * Supported options:\n     *  * PhpVersion $phpVersion: The PHP version to target (default to PHP 7.4). This option\n     *                            controls compatibility of the generated code with older PHP\n     *                            versions in cases where a simple stylistic choice exists (e.g.\n     *                            array() vs []). It is safe to pretty-print an AST for a newer\n     *                            PHP version while specifying an older target (but the result will\n     *                            of course not be compatible with the older version in that case).\n     *  * string $newline:        The newline style to use. Should be \"\\n\" (default) or \"\\r\\n\".\n     *  * string $indent:         The indentation to use. Should either be all spaces or a single\n     *                            tab. Defaults to four spaces (\"    \").\n     *  * bool $shortArraySyntax: Whether to use [] instead of array() as the default array\n     *                            syntax, if the node does not specify a format. Defaults to whether\n     *                            the phpVersion support short array syntax.\n     *\n     * @param array{\n     *     phpVersion?: PhpVersion, newline?: string, indent?: string, shortArraySyntax?: bool\n     * } $options Dictionary of formatting options\n     *\/","18813":"\/**\n     * Reset pretty printing state.\n     *\/","18814":"\/**\n     * Set indentation level\n     *\n     * @param int $level Level in number of spaces\n     *\/","18815":"\/**\n     * Increase indentation level.\n     *\/","18816":"\/**\n     * Decrease indentation level.\n     *\/","18820":"\/**\n     * Preprocesses the top-level nodes to initialize pretty printer state.\n     *\n     * @param Node[] $nodes Array of nodes\n     *\/","18821":"\/**\n     * Handles (and removes) doc-string-end tokens.\n     *\/","18822":"\/**\n     * Pretty prints an array of nodes (statements) and indents them optionally.\n     *\n     * @param Node[] $nodes Array of nodes\n     * @param bool $indent Whether to indent the printed nodes\n     *\n     * @return string Pretty printed statements\n     *\/","18823":"\/**\n     * Pretty-print an infix operation while taking precedence into account.\n     *\n     * @param string $class Node class of operator\n     * @param Node $leftNode Left-hand side node\n     * @param string $operatorString String representation of the operator\n     * @param Node $rightNode Right-hand side node\n     * @param int $precedence Precedence of parent operator\n     * @param int $lhsPrecedence Precedence for unary operator on LHS of binary operator\n     *\n     * @return string Pretty printed infix operation\n     *\/","18824":"\/**\n     * Pretty-print a prefix operation while taking precedence into account.\n     *\n     * @param string $class Node class of operator\n     * @param string $operatorString String representation of the operator\n     * @param Node $node Node\n     * @param int $precedence Precedence of parent operator\n     * @param int $lhsPrecedence Precedence for unary operator on LHS of binary operator\n     *\n     * @return string Pretty printed prefix operation\n     *\/","18825":"\/**\n     * Pretty-print a postfix operation while taking precedence into account.\n     *\n     * @param string $class Node class of operator\n     * @param string $operatorString String representation of the operator\n     * @param Node $node Node\n     * @param int $precedence Precedence of parent operator\n     * @param int $lhsPrecedence Precedence for unary operator on LHS of binary operator\n     *\n     * @return string Pretty printed postfix operation\n     *\/","18826":"\/**\n     * Pretty prints an array of nodes and implodes the printed values.\n     *\n     * @param Node[] $nodes Array of Nodes to be printed\n     * @param string $glue Character to implode with\n     *\n     * @return string Imploded pretty printed nodes> $pre\n     *\/","18827":"\/**\n     * Pretty prints an array of nodes and implodes the printed values with commas.\n     *\n     * @param Node[] $nodes Array of Nodes to be printed\n     *\n     * @return string Comma separated pretty printed nodes\n     *\/","18828":"\/**\n     * Pretty prints a comma-separated list of nodes in multiline style, including comments.\n     *\n     * The result includes a leading newline and one level of indentation (same as pStmts).\n     *\n     * @param Node[] $nodes Array of Nodes to be printed\n     * @param bool $trailingComma Whether to use a trailing comma\n     *\n     * @return string Comma separated pretty printed nodes in multiline style\n     *\/","18829":"\/**\n     * Prints reformatted text of the passed comments.\n     *\n     * @param Comment[] $comments List of comments\n     *\n     * @return string Reformatted text of comments\n     *\/","18831":"\/**\n     * Pretty prints a node.\n     *\n     * This method also handles formatting preservation for nodes.\n     *\n     * @param Node $node Node to be pretty printed\n     * @param int $precedence Precedence of parent operator\n     * @param int $lhsPrecedence Precedence for unary operator on LHS of binary operator\n     * @param bool $parentFormatPreserved Whether parent node has preserved formatting\n     *\n     * @return string Pretty printed node\n     *\/","18832":"\/**\n     * Perform a format-preserving pretty print of an array.\n     *\n     * @param Node[] $nodes New nodes\n     * @param Node[] $origNodes Original nodes\n     * @param int $pos Current token position (updated by reference)\n     * @param int $indentAdjustment Adjustment for indentation\n     * @param string $parentNodeClass Class of the containing node.\n     * @param string $subNodeName Name of array subnode.\n     * @param null|int $fixup Fixup information for array item nodes\n     *\n     * @return null|string Result of pretty print or null if cannot preserve formatting\n     *\/","18833":"\/**\n     * Print node with fixups.\n     *\n     * Fixups here refer to the addition of extra parentheses, braces or other characters, that\n     * are required to preserve program semantics in a certain context (e.g. to maintain precedence\n     * or because only certain expressions are allowed in certain places).\n     *\n     * @param int $fixup Fixup type\n     * @param Node $subNode Subnode to print\n     * @param string|null $parentClass Class of parent node\n     * @param int $subStartPos Original start pos of subnode\n     * @param int $subEndPos Original end pos of subnode\n     *\n     * @return string Result of fixed-up print of subnode\n     *\/","18834":"\/**\n     * Appends to a string, ensuring whitespace between label characters.\n     *\n     * Example: \"echo\" and \"$x\" result in \"echo$x\", but \"echo\" and \"x\" result in \"echo x\".\n     * Without safeAppend the result would be \"echox\", which does not preserve semantics.\n     *\/","18835":"\/**\n     * Determines whether the LHS of a call must be wrapped in parenthesis.\n     *\n     * @param Node $node LHS of a call\n     *\n     * @return bool Whether parentheses are required\n     *\/","18836":"\/**\n     * Determines whether the LHS of an array\/object operation must be wrapped in parentheses.\n     *\n     * @param Node $node LHS of dereferencing operation\n     *\n     * @return bool Whether parentheses are required\n     *\/","18837":"\/**\n     * Determines whether the LHS of a static operation must be wrapped in parentheses.\n     *\n     * @param Node $node LHS of dereferencing operation\n     *\n     * @return bool Whether parentheses are required\n     *\/","18838":"\/**\n     * Determines whether an expression used in \"new\" or \"instanceof\" requires parentheses.\n     *\n     * @param Node $node New or instanceof operand\n     *\n     * @return bool Whether parentheses are required\n     *\/","18839":"\/**\n     * Print modifiers, including trailing whitespace.\n     *\n     * @param int $modifiers Modifier mask to print\n     *\n     * @return string Printed modifiers\n     *\/","18840":"\/**\n     * Determine whether a list of nodes uses multiline formatting.\n     *\n     * @param (Node|null)[] $nodes Node list\n     *\n     * @return bool Whether multiline formatting is used\n     *\/","18841":"\/**\n     * Lazily initializes label char map.\n     *\n     * The label char map determines whether a certain character may occur in a label.\n     *\/","18842":"\/**\n     * Lazily initializes node list differ.\n     *\n     * The node list differ is used to determine differences between two array subnodes.\n     *\/","18843":"\/**\n     * Lazily initializes fixup map.\n     *\n     * The fixup map is used to determine whether a certain subnode of a certain node may require\n     * some kind of \"fixup\" operation, e.g. the addition of parenthesis or braces.\n     *\/","18844":"\/**\n     * Lazily initializes the removal map.\n     *\n     * The removal map is used to determine which additional tokens should be removed when a\n     * certain node is replaced by null.\n     *\/","18862":"\/** @param (Expr|Node\\InterpolatedStringPart)[] $encapsList *\/","18863":"\/** @param (Expr|Node\\InterpolatedStringPart)[] $parts *\/","18865":"\/** @param Node[] $nodes *\/","18866":"\/** @param Node\\AttributeGroup[] $nodes *\/","18900":"\/**\n * A PHP token. On PHP 8.0 this extends from PhpToken.\n *\/","18901":"\/** Get (exclusive) zero-based end position of the token. *\/","18902":"\/** Get 1-based end line number of the token. *\/","18905":"\/**\n     * @var list<TokenInterface>\n     *\/","18906":"\/**\n     * @var int<0, max>\n     *\/","18909":"\/**\n     * @param iterable<int<0, max>, TokenInterface> $stream\n     *\/","18910":"\/**\n     * @param iterable<int<0, max>, TokenInterface> $tokens\n     *\n     * @return list<TokenInterface>\n     *\/","18911":"\/**\n     * @param array<TokenInterface> $data\n     *\/","18917":"\/**\n     * Return the current token.\n     *\n     * @link https:\/\/php.net\/manual\/en\/iterator.current.php\n     *\n     * @see \\Iterator::current()\n     *\/","18918":"\/**\n     * Checks if current position is valid and iterator not completed.\n     *\n     * @link https:\/\/php.net\/manual\/en\/iterator.valid.php\n     *\n     * @see \\Iterator::valid()\n     *\/","18919":"\/**\n     * Move forward to next token element.\n     *\n     * @link https:\/\/php.net\/manual\/en\/iterator.next.php\n     *\n     * @see \\Iterator::next()\n     *\/","18920":"\/**\n * @template-extends \\SeekableIterator<int<0, max>, TokenInterface>\n *\/","18921":"\/**\n     * Rewind the BufferInterface to the target token element.\n     *\n     * @link https:\/\/php.net\/manual\/en\/seekableiterator.seek.php\n     *\n     * @see \\SeekableIterator::seek()\n     *\n     * @param int<0, max> $offset\n     *\/","18923":"\/**\n     * Return the ordinal id of the current token element.\n     *\n     * @link https:\/\/php.net\/manual\/en\/iterator.key.php\n     *\n     * @see \\Iterator::key()\n     *\n     * @return int<0, max>\n     *\/","18925":"\/**\n     * Rewind the BufferInterface to the first token element.\n     *\n     * @link https:\/\/php.net\/manual\/en\/iterator.rewind.php\n     *\n     * @see \\Iterator::rewind()\n     *\/","18928":"\/**\n     * @var int<1, max>\n     *\/","18931":"\/**\n         * @var int<1, max>\n         *\/","18932":"\/**\n     * @var array<TokenInterface>\n     *\/","18933":"\/**\n     * @var \\Generator<int<0, max>, TokenInterface, mixed, mixed>\n     *\/","18936":"\/**\n     * @param iterable<TokenInterface> $stream\n     *\/","18937":"\/**\n     * @return int<1, max>\n     *\/","18938":"\/**\n     * @return int<0, max>\n     *\/","18940":"\/**\n     * @param iterable<int<0, max>, TokenInterface> $tokens\n     * @param int<0, max>|null $size\n     *\/","18948":"\/**\n     * @param iterable<TokenInterface> $stream\n     *\n     * @return \\Generator<mixed, TokenInterface, mixed, mixed>\n     *\/","18951":"\/**\n * This class is decorator for BufferInterface.\n * It adds methods for direct read\/write elements of buffer.\n *\/","18952":"\/**\n     * @var array<int<0, max>, TokenInterface>\n     *\/","18953":"\/**\n     * @param int<0, max> $offset\n     *\/","18956":"\/**\n * An abstract node representation. Each node of the tree denotes a\n * construct occurring in the source code.\n *\n * The NodeInterface provided by an abstract syntax trees (AST) are\n * data structures widely used in compilers to represent the structure of\n * program code. An AST is usually the result of the syntax analysis phase\n * of a compiler.\n *\n * It often serves as an intermediate representation of the program\n * through several stages that the parser\\compiler requires, and has a\n * strong impact on the final output of the parser\\compiler.\n *\n * @template-extends \\IteratorAggregate<array-key, object|iterable<array-key, object>>\n *\/","18957":"\/**\n     * Returns the list of children nodes.\n     *\/","18958":"\/**\n * @deprecated since phplrt 3.6 and will be removed in 4.0, please use specific\n *             exception interfaces instead.\n *\/","18959":"\/**\n * This exception interface describing any lexer\n * errors (including internal ones).\n *\/","18960":"\/**\n * An interface that is an abstract implementation of a lexer.\n *\/","18961":"\/**\n     * Returns a set of token objects from the passed source.\n     *\n     * @psalm-immutable This method may not be pure, but it does not change\n     *                  the internal state of the lexer and can be used in\n     *                  asynchronous and parallel computing.\n     *\n     * @return iterable<array-key, TokenInterface> list of analyzed tokens\n     * @throws LexerExceptionInterface an error occurs before source processing\n     *         starts, when the given source cannot be recognized or if the\n     *         lexer settings contain errors\n     * @throws LexerRuntimeExceptionInterface an exception that occurs after\n     *         starting the lexical analysis and indicates problems in the\n     *         analyzed source\n     *\/","18962":"\/**\n * An exception that occurs after starting the lexical analysis and indicates\n * problems in the analyzed source.\n *\/","18963":"\/**\n     * Returns the source object in which the error occurred.\n     *\/","18964":"\/**\n     * Returns the token on which the error occurred.\n     *\/","18965":"\/**\n * The lexical token that returns from LexerInterface\n *\/","18966":"\/**\n     * Name of the token that marks the end of the incoming data.\n     *\n     * @var non-empty-string\n     *\n     * @deprecated since 3.6 and will be removed in 4.0.\n     *             Please use vendor-specific token names instead,\n     *             like {@see \\Phplrt\\Lexer\\Token\\EndOfInput::DEFAULT_TOKEN_NAME}.\n     *\/","18967":"\/**\n     * Returns a token name.\n     *\n     * @return non-empty-string\n     *\/","18968":"\/**\n     * Token position in bytes\n     *\n     * @return int<0, max>\n     *\/","18969":"\/**\n     * Returns the value of the captured subgroup\n     *\/","18970":"\/**\n     * The token value size in bytes\n     *\n     * @return int<0, max>\n     *\/","18971":"\/**\n * This exception interface describing any parser\n * errors (including internal ones).\n *\/","18972":"\/**\n * An interface that implements methods for parsing source code.\n *\n * @template TNode of object\n *\/","18973":"\/**\n     * Parses sources into an abstract source tree (AST) or list of AST nodes.\n     *\n     * @return iterable<array-key, TNode>\n     * @throws ParserExceptionInterface an error occurs before source processing\n     *         starts, when the given source cannot be recognized or if the\n     *         parser settings contain errors\n     * @throws ParserRuntimeExceptionInterface an exception that occurs after\n     *         starting the parsing and indicates problems in the analyzed\n     *         source\n     *\/","18974":"\/**\n * An exception that occurs after starting the parsing and indicates\n * problems in the analyzed source.\n *\/","18977":"\/**\n * @deprecated since phplrt 3.4 and will be removed in 4.0.\n *\/","18978":"\/**\n     * Returns initial position.\n     *\/","18979":"\/**\n     * Returns final position.\n     *\/","18980":"\/**\n     * Returns delta from initial and final position in bytes.\n     *\n     * @return int<0, max>\n     *\/","18981":"\/**\n     * Creates a {@see PositionInterface} object with zero offset.\n     *\/","18982":"\/**\n     * Creates a {@see PositionInterface} object with the end (maximum) position\n     * of the passed {@see ReadableInterface} source object.\n     *\/","18983":"\/**\n     * Creates a {@see PositionInterface} object based on the passed {@see $offset}\n     * and the {@see ReadableInterface} source object.\n     *\n     * Note that in case of logical errors in the arguments (for example, the\n     * maximum number of bytes in the file is less than the {@see $offset}\n     * argument passed) such errors SHOULD be automatically corrected.\n     *\n     * This note does not apply to incorrect arguments (for example, if\n     * the {@see $offset} value is string or negative). In this case, any\n     * exceptions are allowed, such as {@see \\TypeError} for internal PHP\n     * behaviour compatibility or {@see \\InvalidArgumentException}.\n     *\n     * The interface does not mark such exceptions in any way through the\n     * \"@throws\" annotation, because this is a design error, breach of contract.\n     *\n     * @param ReadableInterface $source the source object from which to get the\n     *        position object\n     * @param int<0, max> $offset offset value in bytes, relative to which the\n     *        position will be calculated\n     *\/","18984":"\/**\n     * Creates a {@see PositionInterface} object based on the\n     * passed {@see $line}, {@see $column} and the {@see ReadableInterface}\n     * source object.\n     *\n     * Note that in case of logical errors in the arguments (for example, the\n     * maximum number of lines in the file is less than the {@see $line}\n     * argument passed) such errors SHOULD be automatically corrected.\n     *\n     * This note does not apply to incorrect arguments (for example, if\n     * the {@see $line} value is string or non-positive). In this case, any\n     * exceptions are allowed, such as {@see \\TypeError} for internal PHP\n     * behaviour compatibility or {@see \\InvalidArgumentException}.\n     *\n     * The interface does not mark such exceptions in any way through the\n     * \"@throws\" annotation, because this is a design error, breach of contract.\n     *\n     * @param ReadableInterface $source the source object from which to get the\n     *        position object\n     * @param int<1, max> $line\n     * @param int<1, max> $column\n     *\/","18988":"\/**\n     * Returns offset in bytes.\n     *\n     * Equivalent to the amount from a line and a column.\n     *\n     * @return int<0, max>\n     *\/","18989":"\/**\n     * Returns the position line.\n     *\n     * @return int<1, max>\n     *\/","18990":"\/**\n     * Returns the position column.\n     *\n     * @return int<1, max>\n     *\/","18991":"\/**\n     * Returns the physical path to the source file.\n     *\n     * @return non-empty-string\n     *\/","18992":"\/**\n     * Returns the resource stream of the source.\n     *\n     * @return resource returns the streaming contents of a file\n     * @throws SourceExceptionInterface may occur during the inability to\n     *         open or some operations with the resource stream\n     *\/","18993":"\/**\n     * Returns the contents of the source.\n     *\n     * @return string returns the string contents of a file\n     * @throws SourceExceptionInterface may occur when it is not possible to\n     *         read source's data and\/or convert it to a string\n     *\/","18994":"\/**\n     * Returns the identifier (hash) of the source object.\n     *\n     * If the value of the source content changes, the hash value will\n     * also be changed.\n     *\n     * @return non-empty-string returns hash of a file\n     * @throws SourceExceptionInterface may occur when it is not possible to\n     *         convert object state information into a hash\n     *\/","18998":"\/**\n * The exception that can be thrown in case of unexpected problems while\n * processing source data.\n *\/","18999":"\/**\n     * @param mixed $source arbitrary source reference from which you can\n     *        create a {@see ReadableInterface} instance\n     *\n     * @throws SourceExceptionInterface in case of an error in creating the\n     *         source object\n     *\/","19003":"\/**\n     * @var array<int<0, max>, string>\n     *\/","19004":"\/**\n     * @param int<1, max> $line\n     *\/","19005":"\/**\n     * @param int<1, max> $from\n     * @param int<1, max> $to\n     *\n     * @return iterable<int<1, max>, string>\n     *\/","19006":"\/**\n * @internal This class can be used for internal representation of exceptions\n *\/","19008":"\/**\n * @deprecated since phplrt 3.6 and will be removed in 4.0.\n *\n * @internal this is an internal library interface, please do not use it in your code\n * @psalm-internal Phplrt\\Lexer\n *\/","19009":"\/**\n     * @param array<non-empty-string, non-empty-string> $tokens\n     *\n     * @return non-empty-string\n     *\/","19010":"\/**\n * @deprecated since phplrt 3.6 and will be removed in 4.0.\n *\n * @internal this is an internal library class, please do not use it in your code\n * @psalm-internal Phplrt\\Lexer\n *\/","19013":"\/**\n     * If this modifier is set, letters in the pattern match both upper\n     * and lower case letters.\n     *\n     * @var string\n     *\/","19014":"\/**\n     * By default, PCRE treats the subject string as consisting of a single\n     * \"line\" of characters (even if it actually contains several newlines).\n     *\n     * The \"start of line\" metacharacter (^) matches only at the start of the\n     * string, while the \"end of line\" metacharacter ($) matches only at the\n     * end of the string, or before a terminating newline (unless D modifier\n     * is set). This is the same as Perl. When this modifier is set, the\n     * \"start of line\" and \"end of line\" constructs match immediately following\n     * or immediately before any newline in the subject string, respectively,\n     * as well as at the very start and end. This is equivalent to Perl's \/m\n     * modifier. If there are no \"\\n\" characters in a subject string, or no\n     * occurrences of ^ or $ in a pattern, setting this modifier has no effect.\n     *\n     * @var string\n     *\/","19015":"\/**\n     * If this modifier is set, a dot metacharacter in the pattern matches\n     * all characters, including newlines. Without it, newlines are excluded.\n     * This modifier is equivalent to Perl's \/s modifier. A negative class\n     * such as [^a] always matches a newline character, independent of the\n     * setting of this modifier.\n     *\n     * @var string\n     *\/","19016":"\/**\n     * If this modifier is set, whitespace data characters in the pattern are\n     * totally ignored except when escaped or inside a character class, and\n     * characters between an unescaped # outside a character class and the\n     * next newline character, inclusive, are also ignored. This is equivalent\n     * to Perl's \/x modifier, and makes it possible to include commentary\n     * inside complicated patterns. Note, however, that this applies only to\n     * data characters. Whitespace characters may never appear within special\n     * character sequences in a pattern, for example within the sequence\n     * (?( which introduces a conditional subpattern.\n     *\n     * @var string\n     *\/","19017":"\/**\n     * If this modifier is set, the pattern is forced to be \"anchored\", that is,\n     * it is constrained to match only at the start of the string which is\n     * being searched (the \"subject string\"). This effect can also be achieved\n     * by appropriate constructs in the pattern itself, which is the only way\n     * to do it in Perl.\n     *\n     * @var string\n     *\/","19018":"\/**\n     * If this modifier is set, a dollar metacharacter in the pattern matches\n     * only at the end of the subject string. Without this modifier, a dollar\n     * also matches immediately before the final character if it is a newline\n     * (but not before any other newlines). This modifier is ignored if m\n     * modifier is set. There is no equivalent to this modifier in Perl.\n     *\n     * @var string\n     *\/","19019":"\/**\n     * When a pattern is going to be used several times, it is worth spending\n     * more time analyzing it in order to speed up the time taken for matching.\n     * If this modifier is set, then this extra analysis is performed. At\n     * present, studying a pattern is useful only for non-anchored patterns\n     * that do not have a single fixed starting character.\n     *\n     * @var string\n     *\/","19020":"\/**\n     * This modifier inverts the \"greediness\" of the quantifiers so that they\n     * are not greedy by default, but become greedy if followed by ?. It is\n     * not compatible with Perl. It can also be set by a (?U) modifier setting\n     * within the pattern or by a question mark behind a quantifier (e.g. .*?).\n     *\n     * @var string\n     *\/","19021":"\/**\n     * This modifier turns on additional functionality of PCRE that is\n     * incompatible with Perl. Any backslash in a pattern that is followed by\n     * a letter that has no special meaning causes an error, thus reserving\n     * these combinations for future expansion. By default, as in Perl, a\n     * backslash followed by a letter with no special meaning is treated as a\n     * literal. There are at present no other features controlled by this\n     * modifier.\n     *\n     * @var string\n     *\/","19022":"\/**\n     * The (?J) internal option setting changes the local PCRE_DUPNAMES option.\n     * Allow duplicate names for subpatterns. As of PHP 7.2.0 J is supported\n     * as modifier as well.\n     *\n     * @var string\n     *\/","19023":"\/**\n     * This modifier turns on additional functionality of PCRE that is\n     * incompatible with Perl. Pattern and subject strings are treated as UTF-8.\n     * An invalid subject will cause the preg_* function to match nothing; an\n     * invalid pattern will trigger an error of level E_WARNING. Five and six\n     * octet UTF-8 sequences are regarded as invalid since PHP 5.3.4\n     * (resp. PCRE 7.3 2007-08-28); formerly those have been regarded as\n     * valid UTF-8.\n     *\n     * @var string\n     *\/","19024":"\/**\n     * Default pcre delimiter.\n     *\n     * @var string\n     *\/","19025":"\/**\n     * @var non-empty-array<PCRECompiler::FLAG_*>\n     *\/","19026":"\/**\n     * @var array<PCRECompiler::FLAG_*>\n     *\/","19027":"\/**\n     * @param array<array-key, string> $chunks\n     *\n     * @return non-empty-string\n     *\/","19028":"\/**\n     * @param non-empty-string $name\n     * @param non-empty-string $pattern\n     *\n     * @return non-empty-string\n     *\/","19029":"\/**\n     * @param array<PCRECompiler::FLAG_*>|null $flags\n     *\/","19030":"\/**\n     * @param array<non-empty-string, non-empty-string> $tokens\n     *\n     * @return non-empty-string\n     * @throws CompilationException\n     *\/","19031":"\/**\n     * @param non-empty-string $name\n     *\n     * @return non-empty-string\n     *\/","19032":"\/**\n     * @param non-empty-string $pattern\n     *\n     * @return non-empty-string\n     *\/","19033":"\/**\n     * @param non-empty-string $pattern\n     * @param non-empty-string|null $original\n     *\/","19034":"\/**\n     * @param non-empty-string $pcre\n     *\n     * @return non-empty-string\n     *\/","19052":"\/**\n     * @param array<non-empty-string> $chunks\n     *\n     * @return non-empty-string\n     *\/","19053":"\/**\n     * @param array<non-empty-string, non-empty-string> $tokens\n     *\n     * @return array<non-empty-string>\n     *\/","19059":"\/**\n * A handler called while processing a token.\n *\/","19060":"\/**\n     * The method itself, which is executed while processing a token.\n     *\n     * @throws LexerRuntimeExceptionInterface may throw an exception while handling the token\n     *\/","19061":"\/**\n * Handler that returns nothing.\n *\/","19062":"\/**\n * Handler that returns the token \"as is\".\n *\/","19065":"\/**\n * Handler that throws an unknown token exception in case of any call.\n *\/","19068":"\/**\n     * @var non-empty-string|null\n     *\/","19071":"\/**\n     * @param array<array-key, non-empty-string> $tokens\n     * @param int<0, max> $offset\n     *\n     * @return iterable<TokenInterface>\n     *\/","19078":"\/**\n     * @param array<array-key, non-empty-string> $tokens\n     * @param int<0, max> $offset\n     *\n     * @return iterable<array-key, TokenInterface>\n     * @throws SourceExceptionInterface\n     *\/","19079":"\/**\n     * @param non-empty-string $pattern\n     * @param int<0, max> $offset\n     *\n     * @return array<array<int<0, max>, array{string, int}>|array{MARK: non-empty-string}>\n     *\/","19080":"\/**\n     * @param non-empty-string $name\n     * @param array<array{string, int<0, max>}> $payload\n     *\/","19081":"\/**\n     * @param non-empty-string $name\n     * @param non-empty-array<array-key, array{string, int<0, max>}> $payload\n     *\n     * @return non-empty-array<int, TokenInterface>\n     *\/","19084":"\/**\n     * @param array-key $state\n     *\/","19086":"\/**\n     * Default token name for unidentified tokens.\n     *\n     * @var non-empty-string\n     *\/","19087":"\/**\n     * Default token name for end of input.\n     *\n     * @var non-empty-string\n     *\/","19088":"\/**\n         * List of token names\/identifiers and its patterns.\n         *\n         * @var array<array-key, non-empty-string>\n         *\/","19089":"\/**\n         * List of hidden token names\/identifiers.\n         *\n         * @var list<array-key>\n         *\/","19090":"\/**\n         * The identifier that marks each unknown token inside the executor\n         * (internal runtime). This parameter only needs to be changed if the\n         * name is already in use in the user's token set (in the {@see $tokens}\n         * parameter), otherwise it makes no sense.\n         *\n         * @var non-empty-string\n         *\/","19091":"\/**\n         * @var non-empty-string\n         *\/","19092":"\/**\n     * @param HandlerInterface $onUnknownToken This setting is responsible for\n     *        the behavior of the lexer in case of detection of unrecognized\n     *        tokens.\n     *\n     *        See {@see OnUnknownToken} for more details.\n     *\n     *        Note that you can also define your own {@see HandlerInterface} to\n     *        override behavior.\n     * @param HandlerInterface $onHiddenToken This setting is responsible for\n     *        the behavior of the lexer in case of detection of hidden\/skipped\n     *        tokens.\n     *\n     *        See {@see OnHiddenToken} for more details.\n     *\n     *        Note that you can also define your own {@see HandlerInterface} to\n     *        override behavior.\n     * @param HandlerInterface $onEndOfInput This setting is responsible for the\n     *        operation of the terminal token ({@see EndOfInput}).\n     *\n     *        See also {@see OnEndOfInput} for more details.\n     *\n     *        Note that you can also define your own {@see HandlerInterface} to\n     *        override behavior.\n     *\/","19093":"\/**\n     * @deprecated since phplrt 3.6 and will be removed in 4.0. Please use\n     *             \"$onUnknownToken\" argument of the {@see __construct()}\n     *             or {@see Lexer::withUnknownTokenHandler()} method instead.\n     *\/","19094":"\/**\n     * @psalm-immutable This method returns a new {@see LexerInterface} instance\n     *                  and does not change the current state of the lexer.\n     *\n     * @api\n     *\n     * @param HandlerInterface $handler a handler that defines the behavior of\n     *        the lexer in the case of a \"hidden\" token\n     *\/","19095":"\/**\n     * @psalm-immutable This method returns a new {@see LexerInterface} instance\n     *                  and does not change the current state of the lexer.\n     *\n     * @api\n     *\n     * @param HandlerInterface $handler a handler that defines the behavior of\n     *        the lexer in the case of an \"unknown\" token\n     *\/","19096":"\/**\n     * @psalm-immutable This method returns a new {@see LexerInterface} instance\n     *                  and does not change the current state of the lexer.\n     *\n     * @api\n     *\n     * @param HandlerInterface $handler a handler that defines the behavior of\n     *        the lexer in the case of an \"end of input\" token\n     *\/","19097":"\/**\n     * @deprecated since phplrt 3.6 and will be removed in 4.0.\n     *\n     * @api\n     *\/","19099":"\/**\n     * Returns a set of token objects from the passed source.\n     *\n     * @psalm-immutable This method may not be pure, but it does not change\n     *                  the internal state of the lexer and can be used in\n     *                  asynchronous and parallel computing.\n     *\n     * @param mixed $source any source supported by the {@see SourceFactoryInterface::create()}\n     * @param int<0, max> $offset offset, starting from which you should\n     *         start analyzing the source\n     *\n     * @return iterable<array-key, TokenInterface> list of analyzed tokens\n     * @throws LexerExceptionInterface an error occurs before source processing\n     *         starts, when the given source cannot be recognized or if the\n     *         lexer settings contain errors\n     * @throws LexerRuntimeExceptionInterface an exception that occurs after\n     *         starting the lexical analysis and indicates problems in the\n     *         analyzed source\n     *\/","19100":"\/**\n     * @throws LexerRuntimeExceptionInterface\n     *\/","19101":"\/**\n     * @param non-empty-list<TokenInterface> $tokens\n     *\/","19102":"\/**\n     * @param non-empty-list<TokenInterface> $tokens\n     *\n     * @throws LexerRuntimeExceptionInterface\n     *\/","19104":"\/**\n     * @var array<array-key, PositionalLexerInterface>\n     *\/","19105":"\/**\n         * @var array<array-key, array<non-empty-string, array-key>>\n         *\/","19106":"\/**\n         * @var array-key|null\n         *\/","19107":"\/**\n     * @param array<array-key, PositionalLexerInterface> $states\n     * @param HandlerInterface $onEndOfInput This setting is responsible for the\n     *        operation of the terminal token ({@see EndOfInput}).\n     *\n     *        See also {@see OnEndOfInput} for more details.\n     *\n     *        Note that you can also define your own {@see HandlerInterface} to\n     *        override behavior.\n     *\/","19108":"\/**\n     * @api\n     *\n     * @param array-key|null $state\n     *\/","19109":"\/**\n     * @api\n     *\n     * @param array-key $name\n     * @param array<non-empty-string, non-empty-string>|PositionalLexerInterface $data\n     *\/","19110":"\/**\n     * @api\n     *\n     * @param array-key $name\n     *\/","19111":"\/**\n     * @api\n     *\n     * @param non-empty-string $token\n     * @param array-key $in\n     * @param array-key $then\n     *\/","19113":"\/**\n     * @param non-empty-string $token\n     * @param non-empty-string $pattern\n     *\n     * @return MutableLexerInterface|$this\n     *\/","19114":"\/**\n     * @param array<non-empty-string, non-empty-string> $tokens\n     *\n     * @return MutableLexerInterface|$this\n     *\/","19117":"\/**\n     * @param non-empty-string ...$tokens\n     *\n     * @return MutableLexerInterface|$this\n     *\/","19119":"\/**\n * Provides a lexer that allows you to analyze source tokens\n * starting from a specified offset.\n *\/","19120":"\/**\n     *  Returns a set of token objects from the passed source.\n     *\n     * @psalm-immutable This method may not be pure, but it does not change\n     *                   the internal state of the lexer and can be used in\n     *                   asynchronous and parallel computing.\n     *\n     * @param int<0, max> $offset offset, starting from which you should\n     *         start analyzing the source\n     *\n     * @return iterable<array-key, TokenInterface> list of analyzed tokens\n     * @throws LexerExceptionInterface an error occurs before source processing\n     *          starts, when the given source cannot be recognized or if the\n     *          lexer settings contain errors\n     * @throws LexerRuntimeExceptionInterface an exception that occurs after\n     *          starting the lexical analysis and indicates problems in the\n     *          analyzed source\n     *\/","19122":"\/**\n     * @var int<0, max>|null\n     *\/","19127":"\/**\n     * @param array-key $name\n     * @param int<0, max> $offset\n     * @param array<int, TokenInterface> $children\n     *\/","19128":"\/**\n     * @param non-empty-array<int, TokenInterface> $tokens\n     *\/","19129":"\/**\n     * @param int $offset\n     *\/","19131":"\/**\n     * @param int $offset\n     * @param TokenInterface $value\n     *\/","19133":"\/**\n * @template-extends \\IteratorAggregate<int, TokenInterface>\n * @template-extends \\ArrayAccess<int, TokenInterface>\n *\/","19140":"\/**\n     * Name of the token that marks the end of the incoming data.\n     *\n     * @var non-empty-string\n     *\/","19142":"\/**\n     * @param int<0, max> $offset\n     * @param array-key $name\n     *\/","19146":"\/**\n     * @var array\n     *\/","19148":"\/**\n     * @var array{array<non-empty-string>, array<non-empty-string>}\n     *\/","19151":"\/**\n     * @var array-key\n     *\/","19152":"\/**\n     * @param array-key $name\n     * @param int<0, max> $offset\n     *\/","19153":"\/**\n     * Name of the token that marks the unknown data.\n     *\n     * @var non-empty-string\n     *\/","19156":"\/**\n     * Note: Native type hints will be added in phplrt 4.0, as adding them\n     *       clearly breaks backward compatibility with inheritance.\n     *\n     * @param NodeInterface|TokenInterface|iterable<NodeInterface|TokenInterface> $result\n     *\/","19157":"\/**\n * @template TNode of object\n * @template-extends ParserInterface<TNode>\n *\/","19158":"\/**\n     * Parses sources into an abstract source tree (AST) or list of AST nodes.\n     *\n     * @param array<non-empty-string, mixed> $options list of additional\n     *        runtime options for the parser (parsing context)\n     *\n     * @return iterable<array-key, TNode>\n     * @throws ParserExceptionInterface an error occurs before source processing\n     *         starts, when the given source cannot be recognized or if the\n     *         parser settings contain errors\n     * @throws ParserRuntimeExceptionInterface an exception that occurs after\n     *         starting the parsing and indicates problems in the analyzed\n     *         source\n     *\/","19159":"\/**\n * This is an internal implementation of parser mechanisms and modifying the\n * value of fields outside can disrupt the operation of parser's algorithms.\n *\n * The presence of public modifiers in fields is required only to speed up the\n * parser, since direct access is several times faster than using methods of\n * setting values or creating a new class at each step of the parser.\n *\n * @property-read ReadableInterface $source\n * @property-read BufferInterface $buffer\n *\n * @final marked as final since phplrt 3.4 and will be final since 4.0\n *\/","19160":"\/**\n     * Contains the most recent token object in the token list\n     * (buffer) which was last successfully processed in the rules chain.\n     *\n     * It is required so that in case of errors it is possible to report that\n     * it was on it that the problem arose.\n     *\n     * Please note that this value contains the last in the list of processed\n     * ones, and not the last in time that was processed.\n     *\/","19161":"\/**\n     * Contains the token object which was last successfully processed\n     * in the rules chain.\n     *\n     * Please note that this value contains the last token in time, and not\n     * the last in order in the buffer, unlike the value of \"$lastOrdinalToken\".\n     *\/","19162":"\/**\n     * Contains the node object which was last successfully\n     * processed while parsing.\n     *\/","19163":"\/**\n     * Contains the parser's current rule.\n     *\/","19164":"\/**\n         * Contains a buffer of tokens that were collected from lexical analysis.\n         *\/","19165":"\/**\n         * Contains information about the processed source.\n         *\/","19166":"\/**\n         * Contains the identifier of the current state of the parser.\n         *\n         * Note: This is a stateful data and may cause a race condition error. In\n         * the future, it is necessary to delete this data with a replacement for\n         * the stateless structure.\n         *\n         * @var array-key\n         *\/","19167":"\/**\n     * @var array<non-empty-string, mixed>\n     *\/","19168":"\/**\n     * @param array<non-empty-string, mixed> $options\n     *\/","19169":"\/**\n     * @return array<non-empty-string, mixed>\n     *\/","19170":"\/**\n * Interface provides full information about execution context.\n *\n * @deprecated since phplrt 3.4 and will be removed in 4.0, please use {@see Context} instead.\n *\/","19171":"\/**\n     * Returns the source being processed.\n     *\/","19172":"\/**\n     * Returns a lexer's buffer.\n     *\/","19173":"\/**\n     * Returns the parser's current state identifier.\n     *\n     * Note: Please note that this value is mutable and may change over time.\n     *\n     * @return array-key\n     *\/","19174":"\/**\n     * Returns the parser's current state rule.\n     *\n     * Note: Please note that this value is mutable and may change over time.\n     *\/","19175":"\/**\n     * Returns the parser's current AST node.\n     *\n     * If the parser does not contain any nodes of the abstract syntax tree,\n     * then the method will return NULL.\n     *\n     * Note: Please note that this value is mutable and may change over time.\n     *\/","19176":"\/**\n     * Returns the current parsing token.\n     *\n     * Note: Please note that this value is mutable and may change over time.\n     *\/","19177":"\/**\n     * Returns arbitrary execution context options which were passed as\n     * arguments to the parsing method.\n     *\n     * @return array<non-empty-string, mixed>\n     *\/","19178":"\/**\n     * Get the specified option value or $default argument instead.\n     *\n     * @template TArgDefault of mixed\n     *\n     * @param non-empty-string $name\n     * @param TArgDefault $default\n     *\n     * @return TArgDefault|mixed\n     *\/","19179":"\/**\n     * Determine if the given option value exists.\n     *\n     * @param non-empty-string $name\n     *\/","19180":"\/**\n * @deprecated since phplrt 3.4 and will be removed in 4.0, please\n *             use {@see ContextOptionsProviderInterface} instead.\n *\/","19187":"\/**\n * @psalm-require-implements ContextOptionsProviderInterface\n *\n * @mixin ContextOptionsProviderInterface\n *\/","19190":"\/**\n * @internal this is an internal library class, please do not use it in your code\n * @psalm-internal Phplrt\\Parser\n *\/","19191":"\/**\n     * @var array<array-key, callable(Context, mixed):mixed>\n     *\/","19192":"\/**\n     * @param iterable<array-key, callable(Context, mixed):mixed> $reducers\n     *\/","19193":"\/**\n     * @var list<SelectorInterface>\n     *\/","19194":"\/**\n     * Factory \"prepared\" state.\n     *\/","19195":"\/**\n     * @param list<SelectorInterface>|null $selectors\n     *\/","19196":"\/**\n     * @return list<SelectorInterface>\n     *\/","19197":"\/**\n     * Disables environment restrictions for the {@see Parser} to work.\n     *\/","19198":"\/**\n     * Resets all environment settings\/restrictions to default.\n     *\/","19199":"\/**\n     * A value that may be required for the parser to work.\n     *\n     * In the vast majority of cases, this restriction will\n     * be sufficient.\n     *\n     * @var int<0, max>\n     *\/","19200":"\/**\n     * A value containing the current nesting depth state\n     * defined by Xdebug extension.\n     *\n     * This value must first be set from the global environment\n     * (PHP configuration) for its subsequent restoration after\n     * the end of the parser.\n     *\/","19201":"\/**\n     * The value contains {@see true} if the Xdebug extension\n     * is available in the environment and controls the nesting\n     * of the recursion depth.\n     *\/","19202":"\/**\n         * @var int<0, max>\n         *\/","19203":"\/**\n     * Disables Xdebug restrictions for the {@see Parser} to work.\n     *\/","19204":"\/**\n     * Resets all Xdebug settings\/restrictions to default.\n     *\/","19205":"\/**\n     * @param list<non-empty-string> $expected\n     *\/","19206":"\/**\n     * @param list<non-empty-string> $tokens\n     *\n     * @return ($tokens is non-empty-list<non-empty-string> ? non-empty-string : string)\n     *\/","19207":"\/**\n * @deprecated since phplrt 3.4 and will be removed in 4.0, please\n *             use {@see UnexpectedTokenException} exception instead.\n *\/","19209":"\/**\n * @final marked as final since phplrt 3.4 and will be final since 4.0\n *\/","19210":"\/**\n         * @var list<array-key>\n         *\/","19211":"\/**\n     * @param list<NodeInterface|TokenInterface> $children\n     * @param NodeInterface|TokenInterface|array $result\n     *\n     * @return list<NodeInterface|TokenInterface>\n     *\/","19212":"\/**\n * @template-implements \\IteratorAggregate<array-key, RuleInterface>\n *\/","19213":"\/**\n     * @var array<array-key, RuleInterface>\n     *\/","19214":"\/**\n     * @param \\Closure():\\Generator|null $generator\n     *\/","19215":"\/**\n     * ```\n     *  $builder->extend(function () {\n     *      \/\/ Example with named rule\n     *      $name = yield 'RuleName' => new Concatenation([1, 2, 3])\n     *  });\n     * ```\n     *\n     * @param \\Closure():\\Generator $rules\n     *\/","19216":"\/**\n     * @param array-key ...$of\n     *\/","19218":"\/**\n     * @param non-empty-string $named\n     *\/","19219":"\/**\n     * @param array-key $of\n     *\/","19220":"\/**\n     * @param non-empty-list<array-key> $args\n     *\n     * @return array-key\n     *\/","19222":"\/**\n     * @param array-key|null $id\n     *\n     * @return array-key\n     *\/","19227":"\/**\n         * @var non-empty-string|int\n         *\/","19229":"\/**\n         * @var array-key\n         *\/","19232":"\/**\n     * @param array<array-key, RuleInterface> $rules\n     *\n     * @return iterable<TerminalInterface>\n     *\/","19233":"\/**\n     * Returns a successful (non-null) result if the current buffer state\n     * is correctly processed. Otherwise, if the rule does not match the\n     * required one, it returns null.\n     *\n     * Second \"Closure\" argument returns the result of the execution\n     * of the passed state.\n     *\n     * An example of \"Optional\" (like ebnf \"Some?\") rule implementation, where\n     * ebnf \"Some\" defined as state 42\n     *\n     * ```\n     *  public function reduce(BufferInterface $buffer, \\Closure $reduce)\n     *  {\n     *      \/\/ When result of state 42 return non-null result then we\n     *      \/\/ return this result.\n     *      if (($resultOfState = $reduce(42)) !== null) {\n     *          return $resultOfState;\n     *      }\n     *\n     *      \/\/ Otherwise return an empty array.\n     *      \/\/ An \"Optional\" rule always returns a non-null result.\n     *      return [];\n     *  }\n     * ```\n     *\n     * @return mixed|iterable|null\n     *\/","19234":"\/**\n * Interface denoting a production (that is a non-terminal) rule.\n *\/","19238":"\/**\n     * @var int<0, max>|float\n     *\/","19241":"\/**\n     * @param int<0, max> $gte\n     * @param int<0, max>|float $lte\n     *\/","19242":"\/**\n     * @param int<0, max> $times\n     *\/","19246":"\/**\n * The base interface of all parser rules.\n *\/","19248":"\/**\n     * Returns a matched token if the current buffer state is correctly\n     * processed. Otherwise, if the rule does not match the required one,\n     * it returns null.\n     *\/","19249":"\/**\n * Interface denoting a leaf (that is a terminal) rule.\n *\/","19252":"\/**\n * A recurrence recursive descent parser implementation.\n *\n * Is a kind of top-down parser built from a set of mutually recursive methods\n * defined in:\n *  - Phplrt\\Parser\\Rule\\ProductionInterface::reduce()\n *  - Phplrt\\Parser\\Rule\\TerminalInterface::reduce()\n *\n * Where each such class implements one of the terminals or productions of the\n * grammar. Thus the structure of the resulting program closely mirrors that\n * of the grammar it recognizes.\n *\n * A \"recurrence\" means that instead of predicting, the parser simply tries to\n * apply all the alternative rules in order, until one of the attempts succeeds.\n *\n * Such a parser may require exponential work time, and does not always\n * guarantee completion, depending on the grammar.\n *\n * NOTE: Vulnerable to left recursion, like:\n *\n * <code>\n *      Digit = \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\" ;\n *      Operator = \"+\" | \"-\" | \"*\" | \"\/\" ;\n *      Number = Digit { Digit } ;\n *\n *      Expression = Number | Number Operator ;\n *      (*           ^^^^^^   ^^^^^^\n *          In this case, the grammar is incorrect and should be replaced by:\n *\n *          Expression = Number { Operator } ;\n *      *)\n * <\/code>\n *\n * @template TNode of object\n * @template-implements ConfigurableParserInterface<TNode>\n *\/","19254":"\/**\n     * The initial state (initial rule identifier) of the parser\n     * configuration option key.\n     *\n     * @var non-empty-string\n     *\/","19255":"\/**\n     * An abstract syntax tree builder instance configuration option key.\n     *\n     * @var non-empty-string\n     *\/","19256":"\/**\n     * Configuration option key for an implementation of tokens buffer\n     * (subclass of \\Phplrt\\Contracts\\Lexer\\BufferInterface).\n     *\n     * @var non-empty-string\n     *\/","19257":"\/**\n     * Configuration option key for token indicating the end of parsing.\n     *\n     * @var non-empty-string\n     *\/","19259":"\/**\n     * @var non-empty-string\n     *\n     * @deprecated since phplrt 3.4 and will be removed in 4.0. Now this option\n     *             has no effect.\n     *\/","19261":"\/**\n     * The {@see SelectorInterface} is responsible for preparing\n     * and analyzing the PHP environment for the parser to work.\n     *\/","19262":"\/**\n     * The {@see BuilderInterface} is responsible for building the Abstract\n     * Syntax Tree.\n     *\n     * @readonly will contain the PHP readonly attribute starting with phplrt 4.0.\n     *\n     * @psalm-readonly-allow-private-mutation\n     *\/","19263":"\/**\n     * Sources factory.\n     *\/","19264":"\/**\n     * The initial state (initial rule identifier) of the parser.\n     *\n     * @var array-key\n     *\/","19265":"\/**\n     * Array of transition rules for the parser.\n     *\n     * @var array<array-key, RuleInterface>\n     *\/","19266":"\/**\n         * The lexer instance.\n         *\/","19267":"\/**\n     * A buffer class that allows you to iterate over the stream of tokens and\n     * return to the selected position.\n     *\n     * Initialized by the generator with tokens during parser launch.\n     *\n     * @var class-string\n     *\/","19268":"\/**\n     * Token indicating the end of parsing.\n     *\n     * @var non-empty-string\n     *\/","19269":"\/**\n     * Possible tokens searching (enable if it is {@see true}).\n     *\n     * @deprecated since phplrt 3.4 and will be removed in 4.0. Now this option\n     *             has no effect.\n     *\/","19270":"\/**\n     * @deprecated since phplrt 3.4 and will be removed in 4.0. Now this option\n     *             has no effect.\n     *\/","19271":"\/**\n     * Enables support for trailing tokens after a completed grammar.\n     *\/","19272":"\/**\n     * Step reducer.\n     *\n     * @var (\\Closure(Context, (\\Closure(): mixed)): mixed)|null\n     *\/","19273":"\/**\n     * @param iterable<array-key, RuleInterface> $grammar an iterable of the\n     *        transition rules for the parser\n     * @param array<ParserConfigsInterface::CONFIG_*, mixed> $options\n     *\/","19274":"\/**\n     * @param array{\n     *     builder?: BuilderInterface|iterable<int|non-empty-string, \\Closure(Context,mixed):mixed>|null\n     * } $options\n     *\/","19275":"\/**\n     * @param iterable<array-key, RuleInterface> $grammar\n     *\n     * @return array<array-key, RuleInterface>\n     *\/","19276":"\/**\n     * The method is responsible for initializing the initial\n     * state of the grammar.\n     *\n     * @param array{\n     *     initial?: array-key|null\n     * } $options\n     * @param array<array-key, RuleInterface> $grammar\n     *\n     * @return array-key\n     *\/","19277":"\/**\n     * Sets an initial state (initial rule identifier) of the parser.\n     *\n     * @param array-key $initial\n     *\n     * @deprecated since phplrt 3.4 and will be removed in 4.0\n     *\/","19278":"\/**\n     * Sets an abstract syntax tree builder.\n     *\n     * @deprecated since phplrt 3.4 and will be removed in 4.0\n     *\/","19279":"\/**\n     * Parses sources into an abstract source tree (AST) or list of AST nodes.\n     *\n     * @param mixed $source any source supported by the {@see SourceFactoryInterface::create()}\n     * @param array<non-empty-string, mixed> $options list of additional\n     *        runtime options for the parser (parsing context)\n     *\n     * @return iterable<array-key, TNode>\n     * @throws ParserExceptionInterface an error occurs before source processing\n     *         starts, when the given source cannot be recognized or if the\n     *         parser settings contain errors\n     * @throws ParserRuntimeExceptionInterface an exception that occurs after\n     *         starting the parsing and indicates problems in the analyzed\n     *         source\n     *\/","19280":"\/**\n     * @throws ParserRuntimeExceptionInterface\n     *\/","19281":"\/**\n     * @throws ParserRuntimeException\n     *\/","19283":"\/**\n     * Matches a token identifier that marks the end of the source.\n     *\/","19284":"\/**\n     * Returns last execution context.\n     *\n     * Typically used in conjunction with the \"tolerant\" mode of the parser.\n     *\n     * ```\n     *  $parser = new Parser(..., [Parser::CONFIG_ALLOW_TRAILING_TOKENS => true]);\n     *  $parser->parse('...');\n     *\n     *  $context = $parser->getLastExecutionContext();\n     *  var_dump($context->buffer->current()); \/\/ Returns the token where the parser stopped\n     * ```\n     *\n     * @api\n     *\/","19285":"\/**\n     * Initialize parser's configuration options.\n     *\/","19286":"\/**\n     * Sets a token name indicating the end of parsing.\n     *\n     * @param non-empty-string $token\n     *\/","19287":"\/**\n     * Allows to add an interceptor to each step of the parser. May be required\n     * for debugging.\n     *\n     * <code>\n     *  $parser->eachStepThrough(function (Context $ctx, \\Closure $next) {\n     *      echo $ctx->getState() . ':' . $ctx->getToken() . \"\\n\";\n     *\n     *      return $next($ctx);\n     *  });\n     * <\/code>\n     *\n     * @param (callable(Context, (\\Closure(): mixed)): mixed)|null $step\n     *\/","19288":"\/**\n     * Sets a tokens buffer class.\n     *\n     * @param class-string<BufferInterface> $class\n     *\/","19289":"\/**\n     * Turn on\/off for possible tokens searching.\n     *\n     * @deprecated since phplrt 3.4 and will be removed in 4.0. Now this option\n     *             has no effect.\n     *\/","19297":"\/**\n * @mixin ParserConfigsInterface\n *\/","19309":"\/**\n * @deprecated since phplrt 3.4 and will be removed in 4.0\n *\/","19311":"\/**\n     * @param int<0, max> $offset\n     * @param int<0, max> $length\n     *\n     * @throws SourceExceptionInterface\n     *\/","19312":"\/**\n     * @param int<1, max> $line\n     * @param int<1, max> $column\n     * @param int<0, max> $length\n     *\n     * @throws SourceExceptionInterface\n     *\/","19322":"\/**\n     * @param int<0, max> $offset\n     * @param int<1, max> $line\n     * @param int<1, max> $column\n     *\/","19323":"\/**\n     * An alternative factory function of the\n     * {@see PositionFactoryInterface::createFromPosition()} method.\n     *\n     * @param int<1, max> $line expected line value of the position in the\n     *        passed source instance\n     * @param int<1, max> $column expected column value of the position in the\n     *        passed source instance\n     *\n     * @throws SourceExceptionInterface in case of an error in creating the\n     *         source object\n     *\/","19324":"\/**\n     * An alternative factory function of the\n     * {@see PositionFactoryInterface::createAtStarting()} method.\n     *\/","19325":"\/**\n     * An alternative factory function of the\n     * {@see PositionFactoryInterface::createAtEnding()} method.\n     *\n     * @throws SourceExceptionInterface in case of an error in creating the\n     *         source object\n     *\/","19326":"\/**\n     * An alternative factory function of the\n     * {@see PositionFactoryInterface::createFromOffset()} method.\n     *\n     * @param int<0, max> $offset expected offset of the position in the passed\n     *        source instance\n     *\n     * @throws SourceExceptionInterface in case of an error in creating the\n     *         source object\n     *\/","19327":"\/**\n     * Default chunk size value.\n     *\n     * @var int<1, max>\n     *\/","19329":"\/**\n         * The chunk size used while non-blocking reading the file inside\n         * the {@see \\Fiber} context.\n         *\n         * @var int<1, max>\n         *\/","19330":"\/**\n     * @throws SourceExceptionInterface\n     * @throws \\FiberError\n     * @throws \\Throwable\n     *\/","19332":"\/**\n     * @throws SourceExceptionInterface\n     *\/","19333":"\/**\n     * @return int<0, max>\n     * @throws SourceExceptionInterface\n     *\/","19338":"\/**\n * @deprecated since phplrt 3.2 and will be removed in 4.0, use {@see PositionContract} instead.\n *\/","19346":"\/**\n * The exception that occurs in case of file access errors, like \"Permission Denied\".\n *\/","19349":"\/**\n * Error that occurs when a {@see ReadableInterface} object cannot be created.\n *\/","19353":"\/**\n * The exception that occurs in the absence of a file in the file system.\n *\/","19360":"\/**\n     * @psalm-taint-sink file $pathname\n     * @param non-empty-string $pathname\n     *\n     * @return static\n     *\/","19361":"\/**\n     * @psalm-taint-sink file $filename\n     * @param non-empty-string $filename\n     *\n     * @return static\n     *\/","19365":"\/**\n     * @param resource $stream\n     *\n     * @return static\n     *\/","19366":"\/**\n * An exception that occurs when there is no read access to the file,\n * such as \"Access Denied\".\n *\/","19378":"\/**\n         * Hashing algorithm for the source.\n         *\n         * @var non-empty-string\n         *\/","19379":"\/**\n         * The chunk size used while non-blocking reading the file inside\n         * the {@see \\Fiber}.\n         *\n         * @var int<1, max>\n         *\/","19380":"\/**\n     * @psalm-taint-sink file $filename\n     *\/","19382":"\/**\n     * @throws \\ErrorException\n     *\/","19383":"\/**\n     * @throws NotReadableException\n     *\/","19384":"\/**\n     * @throws HashCalculationException\n     *\/","19385":"\/**\n     * @return ($source is \\SplFileInfo\n     *     ? FileInterface\n     *     : ($source is FileInterface\n     *         ? FileInterface\n     *         : ReadableInterface)\n     * )\n     * @throws SourceExceptionInterface\n     *\/","19386":"\/**\n     * @psalm-taint-sink file $pathname\n     * @param non-empty-string|null $pathname\n     *\n     * @return ($pathname is null ? ReadableInterface : FileInterface)\n     * @throws SourceExceptionInterface\n     *\/","19389":"\/**\n     * @param non-empty-string $pathname\n     *\n     * @throws SourceExceptionInterface\n     *\/","19390":"\/**\n     * @param non-empty-string|null $pathname\n     *\n     * @return ($pathname is null ? ReadableInterface : FileInterface)\n     * @throws SourceExceptionInterface\n     *\n     * @deprecated since phplrt 3.4 and will be removed in 4.0, use {@see fromResource()} instead.\n     *\/","19391":"\/**\n     * @param resource $resource\n     * @param non-empty-string|null $pathname\n     *\n     * @return ($pathname is null ? ReadableInterface : FileInterface)\n     * @throws SourceExceptionInterface\n     *\/","19393":"\/**\n * This interface means that it is preferable to read the source entirely as\n * text (for example, the source's content is already in memory), instead of\n * reading the stream.\n *\/","19394":"\/**\n     * @param mixed $source arbitrary source reference from which you can\n     *        create a {@see ReadableInterface} instance\n     *\n     * @return ReadableInterface|null returns {@see null} in case of the object\n     *         cannot be created\n     * @throws SourceExceptionInterface in case of an error in creating the\n     *         source object\n     *\/","19405":"\/**\n     * Content hash value.\n     *\n     * @var non-empty-string|null\n     *\/","19406":"\/**\n     * @var resource|null\n     *\/","19408":"\/**\n         * The name of the temporary stream, which is used as a resource during\n         * the reading of the source.\n         *\n         * @var non-empty-string\n         *\/","19409":"\/**\n     * @psalm-taint-sink file $temp\n     *\/","19410":"\/**\n     * @throws NotAccessibleException\n     *\/","19420":"\/**\n     * Default hashing algorithm value.\n     *\n     * @var non-empty-string\n     *\/","19421":"\/**\n     * Default name of the temporary streams.\n     *\n     * @var non-empty-string\n     *\/","19422":"\/**\n     * @var list<SourceProviderInterface>\n     *\/","19423":"\/**\n         * Hashing algorithm for the sources.\n         *\n         * @var non-empty-string\n         *\/","19424":"\/**\n         * The name of the temporary stream, which is used as a resource\n         * during the reading of the source.\n         *\n         * @var non-empty-string\n         *\/","19425":"\/**\n         * The chunk size used while non-blocking reading the file\n         * inside the {@see \\Fiber} context.\n         *\n         * @var int<1, max>\n         *\/","19426":"\/**\n     * @param list<SourceProviderInterface> $providers list of source providers\n     *\/","19427":"\/**\n     * Appends a new provider to the END of providers list.\n     *\n     * @psalm-immutable\n     *\/","19428":"\/**\n     * Prepends a new provider to the START of providers list.\n     *\n     * @psalm-immutable\n     *\/","19437":"\/**\n     * Initial offset of the stream to return to the specified offset after\n     * reading the data.\n     *\n     * @var int<0, max>\n     *\/","19438":"\/**\n         * @var resource\n         *\/","19443":"\/**\n     * @throws HashCalculationException\n     * @throws SourceExceptionInterface\n     *\/","19445":"\/**\n     * @param array<non-empty-string, mixed> $data\n     *\n     * @throws \\ErrorException\n     *\/","19454":"\/**\n     * @psalm-taint-sink file $filename\n     * @psalm-taint-sink file $temp\n     * @param non-empty-string $algo\n     * @param non-empty-string $temp\n     *\/","19464":"\/**\n * This interface means that this source object was created with a known\n * name and may not exist physically.\n *\/","19470":"\/**\n     * @psalm-taint-sink file $filename\n     * @param resource $stream\n     * @param non-empty-string $algo\n     * @param int<1, max> $chunkSize\n     *\/","19481":"\/**\n * Exception interface for all exceptions thrown by an Implementing Library.\n *\/","19482":"\/**\n * CacheItemInterface defines an interface for interacting with objects inside a cache.\n *\n * Each Item object MUST be associated with a specific key, which can be set\n * according to the implementing system and is typically passed by the\n * Cache\\CacheItemPoolInterface object.\n *\n * The Cache\\CacheItemInterface object encapsulates the storage and retrieval of\n * cache items. Each Cache\\CacheItemInterface is generated by a\n * Cache\\CacheItemPoolInterface object, which is responsible for any required\n * setup as well as associating the object with a unique Key.\n * Cache\\CacheItemInterface objects MUST be able to store and retrieve any type\n * of PHP value defined in the Data section of the specification.\n *\n * Calling Libraries MUST NOT instantiate Item objects themselves. They may only\n * be requested from a Pool object via the getItem() method.  Calling Libraries\n * SHOULD NOT assume that an Item created by one Implementing Library is\n * compatible with a Pool from another Implementing Library.\n *\/","19483":"\/**\n     * Returns the key for the current cache item.\n     *\n     * The key is loaded by the Implementing Library, but should be available to\n     * the higher level callers when needed.\n     *\n     * @return string\n     *   The key string for this cache item.\n     *\/","19484":"\/**\n     * Retrieves the value of the item from the cache associated with this object's key.\n     *\n     * The value returned must be identical to the value originally stored by set().\n     *\n     * If isHit() returns false, this method MUST return null. Note that null\n     * is a legitimate cached value, so the isHit() method SHOULD be used to\n     * differentiate between \"null value was found\" and \"no value was found.\"\n     *\n     * @return mixed\n     *   The value corresponding to this cache item's key, or null if not found.\n     *\/","19485":"\/**\n     * Confirms if the cache item lookup resulted in a cache hit.\n     *\n     * Note: This method MUST NOT have a race condition between calling isHit()\n     * and calling get().\n     *\n     * @return bool\n     *   True if the request resulted in a cache hit. False otherwise.\n     *\/","19486":"\/**\n     * Sets the value represented by this cache item.\n     *\n     * The $value argument may be any item that can be serialized by PHP,\n     * although the method of serialization is left up to the Implementing\n     * Library.\n     *\n     * @param mixed $value\n     *   The serializable value to be stored.\n     *\n     * @return static\n     *   The invoked object.\n     *\/","19487":"\/**\n     * Sets the expiration time for this cache item.\n     *\n     * @param ?\\DateTimeInterface $expiration\n     *   The point in time after which the item MUST be considered expired.\n     *   If null is passed explicitly, a default value MAY be used. If none is set,\n     *   the value should be stored permanently or for as long as the\n     *   implementation allows.\n     *\n     * @return static\n     *   The called object.\n     *\/","19488":"\/**\n     * Sets the expiration time for this cache item.\n     *\n     * @param int|\\DateInterval|null $time\n     *   The period of time from the present after which the item MUST be considered\n     *   expired. An integer parameter is understood to be the time in seconds until\n     *   expiration. If null is passed explicitly, a default value MAY be used.\n     *   If none is set, the value should be stored permanently or for as long as the\n     *   implementation allows.\n     *\n     * @return static\n     *   The called object.\n     *\/","19489":"\/**\n * CacheItemPoolInterface generates CacheItemInterface objects.\n *\n * The primary purpose of Cache\\CacheItemPoolInterface is to accept a key from\n * the Calling Library and return the associated Cache\\CacheItemInterface object.\n * It is also the primary point of interaction with the entire cache collection.\n * All configuration and initialization of the Pool is left up to an\n * Implementing Library.\n *\/","19490":"\/**\n     * Returns a Cache Item representing the specified key.\n     *\n     * This method must always return a CacheItemInterface object, even in case of\n     * a cache miss. It MUST NOT return null.\n     *\n     * @param string $key\n     *   The key for which to return the corresponding Cache Item.\n     *\n     * @throws InvalidArgumentException\n     *   If the $key string is not a legal value a \\Psr\\Cache\\InvalidArgumentException\n     *   MUST be thrown.\n     *\n     * @return CacheItemInterface\n     *   The corresponding Cache Item.\n     *\/","19491":"\/**\n     * Returns a traversable set of cache items.\n     *\n     * @param string[] $keys\n     *   An indexed array of keys of items to retrieve.\n     *\n     * @throws InvalidArgumentException\n     *   If any of the keys in $keys are not a legal value a \\Psr\\Cache\\InvalidArgumentException\n     *   MUST be thrown.\n     *\n     * @return iterable\n     *   An iterable collection of Cache Items keyed by the cache keys of\n     *   each item. A Cache item will be returned for each key, even if that\n     *   key is not found. However, if no keys are specified then an empty\n     *   traversable MUST be returned instead.\n     *\/","19492":"\/**\n     * Confirms if the cache contains specified cache item.\n     *\n     * Note: This method MAY avoid retrieving the cached value for performance reasons.\n     * This could result in a race condition with CacheItemInterface::get(). To avoid\n     * such situation use CacheItemInterface::isHit() instead.\n     *\n     * @param string $key\n     *   The key for which to check existence.\n     *\n     * @throws InvalidArgumentException\n     *   If the $key string is not a legal value a \\Psr\\Cache\\InvalidArgumentException\n     *   MUST be thrown.\n     *\n     * @return bool\n     *   True if item exists in the cache, false otherwise.\n     *\/","19493":"\/**\n     * Deletes all items in the pool.\n     *\n     * @return bool\n     *   True if the pool was successfully cleared. False if there was an error.\n     *\/","19494":"\/**\n     * Removes the item from the pool.\n     *\n     * @param string $key\n     *   The key to delete.\n     *\n     * @throws InvalidArgumentException\n     *   If the $key string is not a legal value a \\Psr\\Cache\\InvalidArgumentException\n     *   MUST be thrown.\n     *\n     * @return bool\n     *   True if the item was successfully removed. False if there was an error.\n     *\/","19495":"\/**\n     * Removes multiple items from the pool.\n     *\n     * @param string[] $keys\n     *   An array of keys that should be removed from the pool.\n     *\n     * @throws InvalidArgumentException\n     *   If any of the keys in $keys are not a legal value a \\Psr\\Cache\\InvalidArgumentException\n     *   MUST be thrown.\n     *\n     * @return bool\n     *   True if the items were successfully removed. False if there was an error.\n     *\/","19496":"\/**\n     * Persists a cache item immediately.\n     *\n     * @param CacheItemInterface $item\n     *   The cache item to save.\n     *\n     * @return bool\n     *   True if the item was successfully persisted. False if there was an error.\n     *\/","19497":"\/**\n     * Sets a cache item to be persisted later.\n     *\n     * @param CacheItemInterface $item\n     *   The cache item to save.\n     *\n     * @return bool\n     *   False if the item could not be queued or if a commit was attempted and failed. True otherwise.\n     *\/","19498":"\/**\n     * Persists any deferred cache items.\n     *\n     * @return bool\n     *   True if all not-yet-saved items were successfully saved or there were none. False otherwise.\n     *\/","19499":"\/**\n * Exception interface for invalid cache arguments.\n *\n * Any time an invalid argument is passed into a method it must throw an\n * exception class which implements Psr\\Cache\\InvalidArgumentException.\n *\/","19500":"\/**\n * Base interface representing a generic exception in a container.\n *\/","19501":"\/**\n * Describes the interface of a container that exposes methods to read its entries.\n *\/","19502":"\/**\n     * Finds an entry of the container by its identifier and returns it.\n     *\n     * @param string $id Identifier of the entry to look for.\n     *\n     * @throws NotFoundExceptionInterface  No entry was found for **this** identifier.\n     * @throws ContainerExceptionInterface Error while retrieving the entry.\n     *\n     * @return mixed Entry.\n     *\/","19503":"\/**\n     * Returns true if the container can return an entry for the given identifier.\n     * Returns false otherwise.\n     *\n     * `has($id)` returning true does not mean that `get($id)` will not throw an exception.\n     * It does however mean that `get($id)` will not throw a `NotFoundExceptionInterface`.\n     *\n     * @param string $id Identifier of the entry to look for.\n     *\n     * @return bool\n     *\/","19504":"\/**\n * No entry was found in the container.\n *\/","19505":"\/**\n * Defines a dispatcher for events.\n *\/","19506":"\/**\n     * Provide all relevant listeners with an event to process.\n     *\n     * @param object $event\n     *   The object to process.\n     *\n     * @return object\n     *   The Event that was passed, now modified by listeners.\n     *\/","19507":"\/**\n * Mapper from an event to the listeners that are applicable to that event.\n *\/","19508":"\/**\n     * @param object $event\n     *   An event for which to return the relevant listeners.\n     * @return iterable[callable]\n     *   An iterable (array, iterator, or generator) of callables.  Each\n     *   callable MUST be type-compatible with $event.\n     *\/","19509":"\/**\n * An Event whose processing may be interrupted when the event has been handled.\n *\n * A Dispatcher implementation MUST check to determine if an Event\n * is marked as stopped after each listener is called.  If it is then it should\n * return immediately without calling any further Listeners.\n *\/","19510":"\/**\n     * Is propagation stopped?\n     *\n     * This will typically only be used by the Dispatcher to determine if the\n     * previous listener halted propagation.\n     *\n     * @return bool\n     *   True if the Event is complete and no further listeners should be called.\n     *   False to continue calling listeners.\n     *\/","19511":"\/**\n * HTTP messages consist of requests from a client to a server and responses\n * from a server to a client. This interface defines the methods common to\n * each.\n *\n * Messages are considered immutable; all methods that might change state MUST\n * be implemented such that they retain the internal state of the current\n * message and return an instance that contains the changed state.\n *\n * @link http:\/\/www.ietf.org\/rfc\/rfc7230.txt\n * @link http:\/\/www.ietf.org\/rfc\/rfc7231.txt\n *\/","19512":"\/**\n     * Retrieves the HTTP protocol version as a string.\n     *\n     * The string MUST contain only the HTTP version number (e.g., \"1.1\", \"1.0\").\n     *\n     * @return string HTTP protocol version.\n     *\/","19513":"\/**\n     * Return an instance with the specified HTTP protocol version.\n     *\n     * The version string MUST contain only the HTTP version number (e.g.,\n     * \"1.1\", \"1.0\").\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * new protocol version.\n     *\n     * @param string $version HTTP protocol version\n     * @return static\n     *\/","19514":"\/**\n     * Retrieves all message header values.\n     *\n     * The keys represent the header name as it will be sent over the wire, and\n     * each value is an array of strings associated with the header.\n     *\n     *     \/\/ Represent the headers as a string\n     *     foreach ($message->getHeaders() as $name => $values) {\n     *         echo $name . \": \" . implode(\", \", $values);\n     *     }\n     *\n     *     \/\/ Emit headers iteratively:\n     *     foreach ($message->getHeaders() as $name => $values) {\n     *         foreach ($values as $value) {\n     *             header(sprintf('%s: %s', $name, $value), false);\n     *         }\n     *     }\n     *\n     * While header names are not case-sensitive, getHeaders() will preserve the\n     * exact case in which headers were originally specified.\n     *\n     * @return string[][] Returns an associative array of the message's headers. Each\n     *     key MUST be a header name, and each value MUST be an array of strings\n     *     for that header.\n     *\/","19515":"\/**\n     * Checks if a header exists by the given case-insensitive name.\n     *\n     * @param string $name Case-insensitive header field name.\n     * @return bool Returns true if any header names match the given header\n     *     name using a case-insensitive string comparison. Returns false if\n     *     no matching header name is found in the message.\n     *\/","19516":"\/**\n     * Retrieves a message header value by the given case-insensitive name.\n     *\n     * This method returns an array of all the header values of the given\n     * case-insensitive header name.\n     *\n     * If the header does not appear in the message, this method MUST return an\n     * empty array.\n     *\n     * @param string $name Case-insensitive header field name.\n     * @return string[] An array of string values as provided for the given\n     *    header. If the header does not appear in the message, this method MUST\n     *    return an empty array.\n     *\/","19517":"\/**\n     * Retrieves a comma-separated string of the values for a single header.\n     *\n     * This method returns all of the header values of the given\n     * case-insensitive header name as a string concatenated together using\n     * a comma.\n     *\n     * NOTE: Not all header values may be appropriately represented using\n     * comma concatenation. For such headers, use getHeader() instead\n     * and supply your own delimiter when concatenating.\n     *\n     * If the header does not appear in the message, this method MUST return\n     * an empty string.\n     *\n     * @param string $name Case-insensitive header field name.\n     * @return string A string of values as provided for the given header\n     *    concatenated together using a comma. If the header does not appear in\n     *    the message, this method MUST return an empty string.\n     *\/","19518":"\/**\n     * Return an instance with the provided value replacing the specified header.\n     *\n     * While header names are case-insensitive, the casing of the header will\n     * be preserved by this function, and returned from getHeaders().\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * new and\/or updated header and value.\n     *\n     * @param string $name Case-insensitive header field name.\n     * @param string|string[] $value Header value(s).\n     * @return static\n     * @throws \\InvalidArgumentException for invalid header names or values.\n     *\/","19519":"\/**\n     * Return an instance with the specified header appended with the given value.\n     *\n     * Existing values for the specified header will be maintained. The new\n     * value(s) will be appended to the existing list. If the header did not\n     * exist previously, it will be added.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * new header and\/or value.\n     *\n     * @param string $name Case-insensitive header field name to add.\n     * @param string|string[] $value Header value(s).\n     * @return static\n     * @throws \\InvalidArgumentException for invalid header names or values.\n     *\/","19520":"\/**\n     * Return an instance without the specified header.\n     *\n     * Header resolution MUST be done without case-sensitivity.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that removes\n     * the named header.\n     *\n     * @param string $name Case-insensitive header field name to remove.\n     * @return static\n     *\/","19521":"\/**\n     * Gets the body of the message.\n     *\n     * @return StreamInterface Returns the body as a stream.\n     *\/","19522":"\/**\n     * Return an instance with the specified message body.\n     *\n     * The body MUST be a StreamInterface object.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return a new instance that has the\n     * new body stream.\n     *\n     * @param StreamInterface $body Body.\n     * @return static\n     * @throws \\InvalidArgumentException When the body is not valid.\n     *\/","19523":"\/**\n     * Create a new request.\n     *\n     * @param string $method The HTTP method associated with the request.\n     * @param UriInterface|string $uri The URI associated with the request. If\n     *     the value is a string, the factory MUST create a UriInterface\n     *     instance based on it.\n     *\n     * @return RequestInterface\n     *\/","19524":"\/**\n * Representation of an outgoing, client-side request.\n *\n * Per the HTTP specification, this interface includes properties for\n * each of the following:\n *\n * - Protocol version\n * - HTTP method\n * - URI\n * - Headers\n * - Message body\n *\n * During construction, implementations MUST attempt to set the Host header from\n * a provided URI if no Host header is provided.\n *\n * Requests are considered immutable; all methods that might change state MUST\n * be implemented such that they retain the internal state of the current\n * message and return an instance that contains the changed state.\n *\/","19525":"\/**\n     * Retrieves the message's request target.\n     *\n     * Retrieves the message's request-target either as it will appear (for\n     * clients), as it appeared at request (for servers), or as it was\n     * specified for the instance (see withRequestTarget()).\n     *\n     * In most cases, this will be the origin-form of the composed URI,\n     * unless a value was provided to the concrete implementation (see\n     * withRequestTarget() below).\n     *\n     * If no URI is available, and no request-target has been specifically\n     * provided, this method MUST return the string \"\/\".\n     *\n     * @return string\n     *\/","19526":"\/**\n     * Return an instance with the specific request-target.\n     *\n     * If the request needs a non-origin-form request-target \u2014 e.g., for\n     * specifying an absolute-form, authority-form, or asterisk-form \u2014\n     * this method may be used to create an instance with the specified\n     * request-target, verbatim.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * changed request target.\n     *\n     * @link http:\/\/tools.ietf.org\/html\/rfc7230#section-5.3 (for the various\n     *     request-target forms allowed in request messages)\n     * @param string $requestTarget\n     * @return static\n     *\/","19527":"\/**\n     * Retrieves the HTTP method of the request.\n     *\n     * @return string Returns the request method.\n     *\/","19528":"\/**\n     * Return an instance with the provided HTTP method.\n     *\n     * While HTTP method names are typically all uppercase characters, HTTP\n     * method names are case-sensitive and thus implementations SHOULD NOT\n     * modify the given string.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * changed request method.\n     *\n     * @param string $method Case-sensitive method.\n     * @return static\n     * @throws \\InvalidArgumentException for invalid HTTP methods.\n     *\/","19529":"\/**\n     * Retrieves the URI instance.\n     *\n     * This method MUST return a UriInterface instance.\n     *\n     * @link http:\/\/tools.ietf.org\/html\/rfc3986#section-4.3\n     * @return UriInterface Returns a UriInterface instance\n     *     representing the URI of the request.\n     *\/","19530":"\/**\n     * Returns an instance with the provided URI.\n     *\n     * This method MUST update the Host header of the returned request by\n     * default if the URI contains a host component. If the URI does not\n     * contain a host component, any pre-existing Host header MUST be carried\n     * over to the returned request.\n     *\n     * You can opt-in to preserving the original state of the Host header by\n     * setting `$preserveHost` to `true`. When `$preserveHost` is set to\n     * `true`, this method interacts with the Host header in the following ways:\n     *\n     * - If the Host header is missing or empty, and the new URI contains\n     *   a host component, this method MUST update the Host header in the returned\n     *   request.\n     * - If the Host header is missing or empty, and the new URI does not contain a\n     *   host component, this method MUST NOT update the Host header in the returned\n     *   request.\n     * - If a Host header is present and non-empty, this method MUST NOT update\n     *   the Host header in the returned request.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * new UriInterface instance.\n     *\n     * @link http:\/\/tools.ietf.org\/html\/rfc3986#section-4.3\n     * @param UriInterface $uri New request URI to use.\n     * @param bool $preserveHost Preserve the original state of the Host header.\n     * @return static\n     *\/","19542":"\/**\n     * Create a new response.\n     *\n     * @param int $code HTTP status code; defaults to 200\n     * @param string $reasonPhrase Reason phrase to associate with status code\n     *     in generated response; if none is provided implementations MAY use\n     *     the defaults as suggested in the HTTP specification.\n     *\n     * @return ResponseInterface\n     *\/","19543":"\/**\n * Representation of an outgoing, server-side response.\n *\n * Per the HTTP specification, this interface includes properties for\n * each of the following:\n *\n * - Protocol version\n * - Status code and reason phrase\n * - Headers\n * - Message body\n *\n * Responses are considered immutable; all methods that might change state MUST\n * be implemented such that they retain the internal state of the current\n * message and return an instance that contains the changed state.\n *\/","19544":"\/**\n     * Gets the response status code.\n     *\n     * The status code is a 3-digit integer result code of the server's attempt\n     * to understand and satisfy the request.\n     *\n     * @return int Status code.\n     *\/","19545":"\/**\n     * Return an instance with the specified status code and, optionally, reason phrase.\n     *\n     * If no reason phrase is specified, implementations MAY choose to default\n     * to the RFC 7231 or IANA recommended reason phrase for the response's\n     * status code.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated status and reason phrase.\n     *\n     * @link http:\/\/tools.ietf.org\/html\/rfc7231#section-6\n     * @link http:\/\/www.iana.org\/assignments\/http-status-codes\/http-status-codes.xhtml\n     * @param int $code The 3-digit integer result code to set.\n     * @param string $reasonPhrase The reason phrase to use with the\n     *     provided status code; if none is provided, implementations MAY\n     *     use the defaults as suggested in the HTTP specification.\n     * @return static\n     * @throws \\InvalidArgumentException For invalid status code arguments.\n     *\/","19546":"\/**\n     * Gets the response reason phrase associated with the status code.\n     *\n     * Because a reason phrase is not a required element in a response\n     * status line, the reason phrase value MAY be null. Implementations MAY\n     * choose to return the default RFC 7231 recommended reason phrase (or those\n     * listed in the IANA HTTP Status Code Registry) for the response's\n     * status code.\n     *\n     * @link http:\/\/tools.ietf.org\/html\/rfc7231#section-6\n     * @link http:\/\/www.iana.org\/assignments\/http-status-codes\/http-status-codes.xhtml\n     * @return string Reason phrase; must return an empty string if none present.\n     *\/","19558":"\/**\n     * Create a new server request.\n     *\n     * Note that server-params are taken precisely as given - no parsing\/processing\n     * of the given values is performed, and, in particular, no attempt is made to\n     * determine the HTTP method or URI, which must be provided explicitly.\n     *\n     * @param string $method The HTTP method associated with the request.\n     * @param UriInterface|string $uri The URI associated with the request. If\n     *     the value is a string, the factory MUST create a UriInterface\n     *     instance based on it.\n     * @param array $serverParams Array of SAPI parameters with which to seed\n     *     the generated request instance.\n     *\n     * @return ServerRequestInterface\n     *\/","19559":"\/**\n * Representation of an incoming, server-side HTTP request.\n *\n * Per the HTTP specification, this interface includes properties for\n * each of the following:\n *\n * - Protocol version\n * - HTTP method\n * - URI\n * - Headers\n * - Message body\n *\n * Additionally, it encapsulates all data as it has arrived to the\n * application from the CGI and\/or PHP environment, including:\n *\n * - The values represented in $_SERVER.\n * - Any cookies provided (generally via $_COOKIE)\n * - Query string arguments (generally via $_GET, or as parsed via parse_str())\n * - Upload files, if any (as represented by $_FILES)\n * - Deserialized body parameters (generally from $_POST)\n *\n * $_SERVER values MUST be treated as immutable, as they represent application\n * state at the time of request; as such, no methods are provided to allow\n * modification of those values. The other values provide such methods, as they\n * can be restored from $_SERVER or the request body, and may need treatment\n * during the application (e.g., body parameters may be deserialized based on\n * content type).\n *\n * Additionally, this interface recognizes the utility of introspecting a\n * request to derive and match additional parameters (e.g., via URI path\n * matching, decrypting cookie values, deserializing non-form-encoded body\n * content, matching authorization headers to users, etc). These parameters\n * are stored in an \"attributes\" property.\n *\n * Requests are considered immutable; all methods that might change state MUST\n * be implemented such that they retain the internal state of the current\n * message and return an instance that contains the changed state.\n *\/","19560":"\/**\n     * Retrieve server parameters.\n     *\n     * Retrieves data related to the incoming request environment,\n     * typically derived from PHP's $_SERVER superglobal. The data IS NOT\n     * REQUIRED to originate from $_SERVER.\n     *\n     * @return array\n     *\/","19561":"\/**\n     * Retrieve cookies.\n     *\n     * Retrieves cookies sent by the client to the server.\n     *\n     * The data MUST be compatible with the structure of the $_COOKIE\n     * superglobal.\n     *\n     * @return array\n     *\/","19562":"\/**\n     * Return an instance with the specified cookies.\n     *\n     * The data IS NOT REQUIRED to come from the $_COOKIE superglobal, but MUST\n     * be compatible with the structure of $_COOKIE. Typically, this data will\n     * be injected at instantiation.\n     *\n     * This method MUST NOT update the related Cookie header of the request\n     * instance, nor related values in the server params.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated cookie values.\n     *\n     * @param array $cookies Array of key\/value pairs representing cookies.\n     * @return static\n     *\/","19563":"\/**\n     * Retrieve query string arguments.\n     *\n     * Retrieves the deserialized query string arguments, if any.\n     *\n     * Note: the query params might not be in sync with the URI or server\n     * params. If you need to ensure you are only getting the original\n     * values, you may need to parse the query string from `getUri()->getQuery()`\n     * or from the `QUERY_STRING` server param.\n     *\n     * @return array\n     *\/","19564":"\/**\n     * Return an instance with the specified query string arguments.\n     *\n     * These values SHOULD remain immutable over the course of the incoming\n     * request. They MAY be injected during instantiation, such as from PHP's\n     * $_GET superglobal, or MAY be derived from some other value such as the\n     * URI. In cases where the arguments are parsed from the URI, the data\n     * MUST be compatible with what PHP's parse_str() would return for\n     * purposes of how duplicate query parameters are handled, and how nested\n     * sets are handled.\n     *\n     * Setting query string arguments MUST NOT change the URI stored by the\n     * request, nor the values in the server params.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated query string arguments.\n     *\n     * @param array $query Array of query string arguments, typically from\n     *     $_GET.\n     * @return static\n     *\/","19565":"\/**\n     * Retrieve normalized file upload data.\n     *\n     * This method returns upload metadata in a normalized tree, with each leaf\n     * an instance of Psr\\Http\\Message\\UploadedFileInterface.\n     *\n     * These values MAY be prepared from $_FILES or the message body during\n     * instantiation, or MAY be injected via withUploadedFiles().\n     *\n     * @return array An array tree of UploadedFileInterface instances; an empty\n     *     array MUST be returned if no data is present.\n     *\/","19566":"\/**\n     * Create a new instance with the specified uploaded files.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated body parameters.\n     *\n     * @param array $uploadedFiles An array tree of UploadedFileInterface instances.\n     * @return static\n     * @throws \\InvalidArgumentException if an invalid structure is provided.\n     *\/","19567":"\/**\n     * Retrieve any parameters provided in the request body.\n     *\n     * If the request Content-Type is either application\/x-www-form-urlencoded\n     * or multipart\/form-data, and the request method is POST, this method MUST\n     * return the contents of $_POST.\n     *\n     * Otherwise, this method may return any results of deserializing\n     * the request body content; as parsing returns structured content, the\n     * potential types MUST be arrays or objects only. A null value indicates\n     * the absence of body content.\n     *\n     * @return null|array|object The deserialized body parameters, if any.\n     *     These will typically be an array or object.\n     *\/","19568":"\/**\n     * Return an instance with the specified body parameters.\n     *\n     * These MAY be injected during instantiation.\n     *\n     * If the request Content-Type is either application\/x-www-form-urlencoded\n     * or multipart\/form-data, and the request method is POST, use this method\n     * ONLY to inject the contents of $_POST.\n     *\n     * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of\n     * deserializing the request body content. Deserialization\/parsing returns\n     * structured data, and, as such, this method ONLY accepts arrays or objects,\n     * or a null value if nothing was available to parse.\n     *\n     * As an example, if content negotiation determines that the request data\n     * is a JSON payload, this method could be used to create a request\n     * instance with the deserialized parameters.\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated body parameters.\n     *\n     * @param null|array|object $data The deserialized body data. This will\n     *     typically be in an array or object.\n     * @return static\n     * @throws \\InvalidArgumentException if an unsupported argument type is\n     *     provided.\n     *\/","19569":"\/**\n     * Retrieve attributes derived from the request.\n     *\n     * The request \"attributes\" may be used to allow injection of any\n     * parameters derived from the request: e.g., the results of path\n     * match operations; the results of decrypting cookies; the results of\n     * deserializing non-form-encoded message bodies; etc. Attributes\n     * will be application and request specific, and CAN be mutable.\n     *\n     * @return array Attributes derived from the request.\n     *\/","19570":"\/**\n     * Retrieve a single derived request attribute.\n     *\n     * Retrieves a single derived request attribute as described in\n     * getAttributes(). If the attribute has not been previously set, returns\n     * the default value as provided.\n     *\n     * This method obviates the need for a hasAttribute() method, as it allows\n     * specifying a default value to return if the attribute is not found.\n     *\n     * @see getAttributes()\n     * @param string $name The attribute name.\n     * @param mixed $default Default value to return if the attribute does not exist.\n     * @return mixed\n     *\/","19571":"\/**\n     * Return an instance with the specified derived request attribute.\n     *\n     * This method allows setting a single derived request attribute as\n     * described in getAttributes().\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that has the\n     * updated attribute.\n     *\n     * @see getAttributes()\n     * @param string $name The attribute name.\n     * @param mixed $value The value of the attribute.\n     * @return static\n     *\/","19572":"\/**\n     * Return an instance that removes the specified derived request attribute.\n     *\n     * This method allows removing a single derived request attribute as\n     * described in getAttributes().\n     *\n     * This method MUST be implemented in such a way as to retain the\n     * immutability of the message, and MUST return an instance that removes\n     * the attribute.\n     *\n     * @see getAttributes()\n     * @param string $name The attribute name.\n     * @return static\n     *\/","19590":"\/**\n     * Create a new stream from a string.\n     *\n     * The stream SHOULD be created with a temporary resource.\n     *\n     * @param string $content String content with which to populate the stream.\n     *\n     * @return StreamInterface\n     *\/","19591":"\/**\n     * Create a stream from an existing file.\n     *\n     * The file MUST be opened using the given mode, which may be any mode\n     * supported by the `fopen` function.\n     *\n     * The `$filename` MAY be any string supported by `fopen()`.\n     *\n     * @param string $filename Filename or stream URI to use as basis of stream.\n     * @param string $mode Mode with which to open the underlying filename\/stream.\n     *\n     * @return StreamInterface\n     * @throws \\RuntimeException If the file cannot be opened.\n     * @throws \\InvalidArgumentException If the mode is invalid.\n     *\/","19592":"\/**\n     * Create a new stream from an existing resource.\n     *\n     * The stream MUST be readable and may be writable.\n     *\n     * @param resource $resource PHP resource to use as basis of stream.\n     *\n     * @return StreamInterface\n     *\/","19593":"\/**\n * Describes a data stream.\n *\n * Typically, an instance will wrap a PHP stream; this interface provides\n * a wrapper around the most common operations, including serialization of\n * the entire stream to a string.\n *\/","19594":"\/**\n     * Reads all data from the stream into a string, from the beginning to end.\n     *\n     * This method MUST attempt to seek to the beginning of the stream before\n     * reading data and read the stream until the end is reached.\n     *\n     * Warning: This could attempt to load a large amount of data into memory.\n     *\n     * This method MUST NOT raise an exception in order to conform with PHP's\n     * string casting operations.\n     *\n     * @see http:\/\/php.net\/manual\/en\/language.oop5.magic.php#object.tostring\n     * @return string\n     *\/","19595":"\/**\n     * Closes the stream and any underlying resources.\n     *\n     * @return void\n     *\/","19596":"\/**\n     * Separates any underlying resources from the stream.\n     *\n     * After the stream has been detached, the stream is in an unusable state.\n     *\n     * @return resource|null Underlying PHP stream, if any\n     *\/","19597":"\/**\n     * Get the size of the stream if known.\n     *\n     * @return int|null Returns the size in bytes if known, or null if unknown.\n     *\/","19598":"\/**\n     * Returns the current position of the file read\/write pointer\n     *\n     * @return int Position of the file pointer\n     * @throws \\RuntimeException on error.\n     *\/","19599":"\/**\n     * Returns true if the stream is at the end of the stream.\n     *\n     * @return bool\n     *\/","19600":"\/**\n     * Returns whether or not the stream is seekable.\n     *\n     * @return bool\n     *\/","19601":"\/**\n     * Seek to a position in the stream.\n     *\n     * @link http:\/\/www.php.net\/manual\/en\/function.fseek.php\n     * @param int $offset Stream offset\n     * @param int $whence Specifies how the cursor position will be calculated\n     *     based on the seek offset. Valid values are identical to the built-in\n     *     PHP $whence values for `fseek()`.  SEEK_SET: Set position equal to\n     *     offset bytes SEEK_CUR: Set position to current location plus offset\n     *     SEEK_END: Set position to end-of-stream plus offset.\n     * @throws \\RuntimeException on failure.\n     *\/","19602":"\/**\n     * Seek to the beginning of the stream.\n     *\n     * If the stream is not seekable, this method will raise an exception;\n     * otherwise, it will perform a seek(0).\n     *\n     * @see seek()\n     * @link http:\/\/www.php.net\/manual\/en\/function.fseek.php\n     * @throws \\RuntimeException on failure.\n     *\/","19603":"\/**\n     * Returns whether or not the stream is writable.\n     *\n     * @return bool\n     *\/","19604":"\/**\n     * Write data to the stream.\n     *\n     * @param string $string The string that is to be written.\n     * @return int Returns the number of bytes written to the stream.\n     * @throws \\RuntimeException on failure.\n     *\/","19605":"\/**\n     * Returns whether or not the stream is readable.\n     *\n     * @return bool\n     *\/","19606":"\/**\n     * Read data from the stream.\n     *\n     * @param int $length Read up to $length bytes from the object and return\n     *     them. Fewer than $length bytes may be returned if underlying stream\n     *     call returns fewer bytes.\n     * @return string Returns the data read from the stream, or an empty string\n     *     if no bytes are available.\n     * @throws \\RuntimeException if an error occurs.\n     *\/","19607":"\/**\n     * Returns the remaining contents in a string\n     *\n     * @return string\n     * @throws \\RuntimeException if unable to read or an error occurs while\n     *     reading.\n     *\/","19608":"\/**\n     * Get stream metadata as an associative array or retrieve a specific key.\n     *\n     * The keys returned are identical to the keys returned from PHP's\n     * stream_get_meta_data() function.\n     *\n     * @link http:\/\/php.net\/manual\/en\/function.stream-get-meta-data.php\n     * @param string|null $key Specific metadata to retrieve.\n     * @return array|mixed|null Returns an associative array if no key is\n     *     provided. Returns a specific key value if a key is provided and the\n     *     value is found, or null if the key is not found.\n     *\/","19609":"\/**\n     * Create a new uploaded file.\n     *\n     * If a size is not provided it will be determined by checking the size of\n     * the file.\n     *\n     * @see http:\/\/php.net\/manual\/features.file-upload.post-method.php\n     * @see http:\/\/php.net\/manual\/features.file-upload.errors.php\n     *\n     * @param StreamInterface $stream Underlying stream representing the\n     *     uploaded file content.\n     * @param int|null $size in bytes\n     * @param int $error PHP file upload error\n     * @param string|null $clientFilename Filename as provided by the client, if any.\n     * @param string|null $clientMediaType Media type as provided by the client, if any.\n     *\n     * @return UploadedFileInterface\n     *\n     * @throws \\InvalidArgumentException If the file resource is not readable.\n     *\/","19610":"\/**\n * Value object representing a file uploaded through an HTTP request.\n *\n * Instances of this interface are considered immutable; all methods that\n * might change state MUST be implemented such that they retain the internal\n * state of the current instance and return an instance that contains the\n * changed state.\n *\/","19611":"\/**\n     * Retrieve a stream representing the uploaded file.\n     *\n     * This method MUST return a StreamInterface instance, representing the\n     * uploaded file. The purpose of this method is to allow utilizing native PHP\n     * stream functionality to manipulate the file upload, such as\n     * stream_copy_to_stream() (though the result will need to be decorated in a\n     * native PHP stream wrapper to work with such functions).\n     *\n     * If the moveTo() method has been called previously, this method MUST raise\n     * an exception.\n     *\n     * @return StreamInterface Stream representation of the uploaded file.\n     * @throws \\RuntimeException in cases when no stream is available or can be\n     *     created.\n     *\/","19612":"\/**\n     * Move the uploaded file to a new location.\n     *\n     * Use this method as an alternative to move_uploaded_file(). This method is\n     * guaranteed to work in both SAPI and non-SAPI environments.\n     * Implementations must determine which environment they are in, and use the\n     * appropriate method (move_uploaded_file(), rename(), or a stream\n     * operation) to perform the operation.\n     *\n     * $targetPath may be an absolute path, or a relative path. If it is a\n     * relative path, resolution should be the same as used by PHP's rename()\n     * function.\n     *\n     * The original file or stream MUST be removed on completion.\n     *\n     * If this method is called more than once, any subsequent calls MUST raise\n     * an exception.\n     *\n     * When used in an SAPI environment where $_FILES is populated, when writing\n     * files via moveTo(), is_uploaded_file() and move_uploaded_file() SHOULD be\n     * used to ensure permissions and upload status are verified correctly.\n     *\n     * If you wish to move to a stream, use getStream(), as SAPI operations\n     * cannot guarantee writing to stream destinations.\n     *\n     * @see http:\/\/php.net\/is_uploaded_file\n     * @see http:\/\/php.net\/move_uploaded_file\n     * @param string $targetPath Path to which to move the uploaded file.\n     * @throws \\InvalidArgumentException if the $targetPath specified is invalid.\n     * @throws \\RuntimeException on any error during the move operation, or on\n     *     the second or subsequent call to the method.\n     *\/","19613":"\/**\n     * Retrieve the file size.\n     *\n     * Implementations SHOULD return the value stored in the \"size\" key of\n     * the file in the $_FILES array if available, as PHP calculates this based\n     * on the actual size transmitted.\n     *\n     * @return int|null The file size in bytes or null if unknown.\n     *\/","19614":"\/**\n     * Retrieve the error associated with the uploaded file.\n     *\n     * The return value MUST be one of PHP's UPLOAD_ERR_XXX constants.\n     *\n     * If the file was uploaded successfully, this method MUST return\n     * UPLOAD_ERR_OK.\n     *\n     * Implementations SHOULD return the value stored in the \"error\" key of\n     * the file in the $_FILES array.\n     *\n     * @see http:\/\/php.net\/manual\/en\/features.file-upload.errors.php\n     * @return int One of PHP's UPLOAD_ERR_XXX constants.\n     *\/","19615":"\/**\n     * Retrieve the filename sent by the client.\n     *\n     * Do not trust the value returned by this method. A client could send\n     * a malicious filename with the intention to corrupt or hack your\n     * application.\n     *\n     * Implementations SHOULD return the value stored in the \"name\" key of\n     * the file in the $_FILES array.\n     *\n     * @return string|null The filename sent by the client or null if none\n     *     was provided.\n     *\/","19616":"\/**\n     * Retrieve the media type sent by the client.\n     *\n     * Do not trust the value returned by this method. A client could send\n     * a malicious media type with the intention to corrupt or hack your\n     * application.\n     *\n     * Implementations SHOULD return the value stored in the \"type\" key of\n     * the file in the $_FILES array.\n     *\n     * @return string|null The media type sent by the client or null if none\n     *     was provided.\n     *\/","19617":"\/**\n     * Create a new URI.\n     *\n     * @param string $uri\n     *\n     * @return UriInterface\n     *\n     * @throws \\InvalidArgumentException If the given URI cannot be parsed.\n     *\/","19618":"\/**\n * Value object representing a URI.\n *\n * This interface is meant to represent URIs according to RFC 3986 and to\n * provide methods for most common operations. Additional functionality for\n * working with URIs can be provided on top of the interface or externally.\n * Its primary use is for HTTP requests, but may also be used in other\n * contexts.\n *\n * Instances of this interface are considered immutable; all methods that\n * might change state MUST be implemented such that they retain the internal\n * state of the current instance and return an instance that contains the\n * changed state.\n *\n * Typically the Host header will be also be present in the request message.\n * For server-side requests, the scheme will typically be discoverable in the\n * server parameters.\n *\n * @link http:\/\/tools.ietf.org\/html\/rfc3986 (the URI specification)\n *\/","19619":"\/**\n     * Retrieve the scheme component of the URI.\n     *\n     * If no scheme is present, this method MUST return an empty string.\n     *\n     * The value returned MUST be normalized to lowercase, per RFC 3986\n     * Section 3.1.\n     *\n     * The trailing \":\" character is not part of the scheme and MUST NOT be\n     * added.\n     *\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-3.1\n     * @return string The URI scheme.\n     *\/","19620":"\/**\n     * Retrieve the authority component of the URI.\n     *\n     * If no authority information is present, this method MUST return an empty\n     * string.\n     *\n     * The authority syntax of the URI is:\n     *\n     * <pre>\n     * [user-info@]host[:port]\n     * <\/pre>\n     *\n     * If the port component is not set or is the standard port for the current\n     * scheme, it SHOULD NOT be included.\n     *\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-3.2\n     * @return string The URI authority, in \"[user-info@]host[:port]\" format.\n     *\/","19621":"\/**\n     * Retrieve the user information component of the URI.\n     *\n     * If no user information is present, this method MUST return an empty\n     * string.\n     *\n     * If a user is present in the URI, this will return that value;\n     * additionally, if the password is also present, it will be appended to the\n     * user value, with a colon (\":\") separating the values.\n     *\n     * The trailing \"@\" character is not part of the user information and MUST\n     * NOT be added.\n     *\n     * @return string The URI user information, in \"username[:password]\" format.\n     *\/","19622":"\/**\n     * Retrieve the host component of the URI.\n     *\n     * If no host is present, this method MUST return an empty string.\n     *\n     * The value returned MUST be normalized to lowercase, per RFC 3986\n     * Section 3.2.2.\n     *\n     * @see http:\/\/tools.ietf.org\/html\/rfc3986#section-3.2.2\n     * @return string The URI host.\n     *\/","19623":"\/**\n     * Retrieve the port component of the URI.\n     *\n     * If a port is present, and it is non-standard for the current scheme,\n     * this method MUST return it as an integer. If the port is the standard port\n     * used with the current scheme, this method SHOULD return null.\n     *\n     * If no port is present, and no scheme is present, this method MUST return\n     * a null value.\n     *\n     * If no port is present, but a scheme is present, this method MAY return\n     * the standard port for that scheme, but SHOULD return null.\n     *\n     * @return null|int The URI port.\n     *\/","19624":"\/**\n     * Retrieve the path component of the URI.\n     *\n     * The path can either be empty or absolute (starting with a slash) or\n     * rootless (not starting with a slash). Implementations MUST support all\n     * three syntaxes.\n     *\n     * Normally, the empty path \"\" and absolute path \"\/\" are considered equal as\n     * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically\n     * do this normalization because in contexts with a trimmed base path, e.g.\n     * the front controller, this difference becomes significant. It's the task\n     * of the user to handle both \"\" and \"\/\".\n     *\n     * The value returned MUST be percent-encoded, but MUST NOT double-encode\n     * any characters. To determine what characters to encode, please refer to\n     * RFC 3986, Sections 2 and 3.3.\n     *\n     * As an example, if the value should include a slash (\"\/\") not intended as\n     * delimiter between path segments, that value MUST be passed in encoded\n     * form (e.g., \"%2F\") to the instance.\n     *\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-2\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-3.3\n     * @return string The URI path.\n     *\/","19625":"\/**\n     * Retrieve the query string of the URI.\n     *\n     * If no query string is present, this method MUST return an empty string.\n     *\n     * The leading \"?\" character is not part of the query and MUST NOT be\n     * added.\n     *\n     * The value returned MUST be percent-encoded, but MUST NOT double-encode\n     * any characters. To determine what characters to encode, please refer to\n     * RFC 3986, Sections 2 and 3.4.\n     *\n     * As an example, if a value in a key\/value pair of the query string should\n     * include an ampersand (\"&\") not intended as a delimiter between values,\n     * that value MUST be passed in encoded form (e.g., \"%26\") to the instance.\n     *\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-2\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-3.4\n     * @return string The URI query string.\n     *\/","19626":"\/**\n     * Retrieve the fragment component of the URI.\n     *\n     * If no fragment is present, this method MUST return an empty string.\n     *\n     * The leading \"#\" character is not part of the fragment and MUST NOT be\n     * added.\n     *\n     * The value returned MUST be percent-encoded, but MUST NOT double-encode\n     * any characters. To determine what characters to encode, please refer to\n     * RFC 3986, Sections 2 and 3.5.\n     *\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-2\n     * @see https:\/\/tools.ietf.org\/html\/rfc3986#section-3.5\n     * @return string The URI fragment.\n     *\/","19627":"\/**\n     * Return an instance with the specified scheme.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified scheme.\n     *\n     * Implementations MUST support the schemes \"http\" and \"https\" case\n     * insensitively, and MAY accommodate other schemes if required.\n     *\n     * An empty scheme is equivalent to removing the scheme.\n     *\n     * @param string $scheme The scheme to use with the new instance.\n     * @return static A new instance with the specified scheme.\n     * @throws \\InvalidArgumentException for invalid or unsupported schemes.\n     *\/","19628":"\/**\n     * Return an instance with the specified user information.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified user information.\n     *\n     * Password is optional, but the user information MUST include the\n     * user; an empty string for the user is equivalent to removing user\n     * information.\n     *\n     * @param string $user The user name to use for authority.\n     * @param null|string $password The password associated with $user.\n     * @return static A new instance with the specified user information.\n     *\/","19629":"\/**\n     * Return an instance with the specified host.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified host.\n     *\n     * An empty host value is equivalent to removing the host.\n     *\n     * @param string $host The hostname to use with the new instance.\n     * @return static A new instance with the specified host.\n     * @throws \\InvalidArgumentException for invalid hostnames.\n     *\/","19630":"\/**\n     * Return an instance with the specified port.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified port.\n     *\n     * Implementations MUST raise an exception for ports outside the\n     * established TCP and UDP port ranges.\n     *\n     * A null value provided for the port is equivalent to removing the port\n     * information.\n     *\n     * @param null|int $port The port to use with the new instance; a null value\n     *     removes the port information.\n     * @return static A new instance with the specified port.\n     * @throws \\InvalidArgumentException for invalid ports.\n     *\/","19631":"\/**\n     * Return an instance with the specified path.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified path.\n     *\n     * The path can either be empty or absolute (starting with a slash) or\n     * rootless (not starting with a slash). Implementations MUST support all\n     * three syntaxes.\n     *\n     * If the path is intended to be domain-relative rather than path relative then\n     * it must begin with a slash (\"\/\"). Paths not starting with a slash (\"\/\")\n     * are assumed to be relative to some base path known to the application or\n     * consumer.\n     *\n     * Users can provide both encoded and decoded path characters.\n     * Implementations ensure the correct encoding as outlined in getPath().\n     *\n     * @param string $path The path to use with the new instance.\n     * @return static A new instance with the specified path.\n     * @throws \\InvalidArgumentException for invalid paths.\n     *\/","19632":"\/**\n     * Return an instance with the specified query string.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified query string.\n     *\n     * Users can provide both encoded and decoded query characters.\n     * Implementations ensure the correct encoding as outlined in getQuery().\n     *\n     * An empty query string value is equivalent to removing the query string.\n     *\n     * @param string $query The query string to use with the new instance.\n     * @return static A new instance with the specified query string.\n     * @throws \\InvalidArgumentException for invalid query strings.\n     *\/","19633":"\/**\n     * Return an instance with the specified URI fragment.\n     *\n     * This method MUST retain the state of the current instance, and return\n     * an instance that contains the specified URI fragment.\n     *\n     * Users can provide both encoded and decoded fragment characters.\n     * Implementations ensure the correct encoding as outlined in getFragment().\n     *\n     * An empty fragment value is equivalent to removing the fragment.\n     *\n     * @param string $fragment The fragment to use with the new instance.\n     * @return static A new instance with the specified fragment.\n     *\/","19634":"\/**\n     * Return the string representation as a URI reference.\n     *\n     * Depending on which components of the URI are present, the resulting\n     * string is either a full URI or relative reference according to RFC 3986,\n     * Section 4.1. The method concatenates the various components of the URI,\n     * using the appropriate delimiters:\n     *\n     * - If a scheme is present, it MUST be suffixed by \":\".\n     * - If an authority is present, it MUST be prefixed by \"\/\/\".\n     * - The path can be concatenated without delimiters. But there are two\n     *   cases where the path has to be adjusted to make the URI reference\n     *   valid as PHP does not allow to throw an exception in __toString():\n     *     - If the path is rootless and an authority is present, the path MUST\n     *       be prefixed by \"\/\".\n     *     - If the path is starting with more than one \"\/\" and no authority is\n     *       present, the starting slashes MUST be reduced to one.\n     * - If a query is present, it MUST be prefixed by \"?\".\n     * - If a fragment is present, it MUST be prefixed by \"#\".\n     *\n     * @see http:\/\/tools.ietf.org\/html\/rfc3986#section-4.1\n     * @return string\n     *\/","19635":"\/**\n * This is a simple Logger implementation that other Loggers can inherit from.\n *\n * It simply delegates all log-level-specific methods to the `log` method to\n * reduce boilerplate code that a simple Logger that does the same thing with\n * messages regardless of the error level has to implement.\n *\/","19644":"\/**\n     * Logs with an arbitrary level.\n     *\n     * @param mixed $level\n     *\n     * @throws \\Psr\\Log\\InvalidArgumentException\n     *\/","19645":"\/**\n * Describes log levels.\n *\/","19646":"\/**\n * Describes a logger-aware instance.\n *\/","19647":"\/**\n     * Sets a logger instance on the object.\n     *\/","19648":"\/**\n * Basic Implementation of LoggerAwareInterface.\n *\/","19649":"\/**\n     * The logger instance.\n     *\/","19650":"\/**\n     * Sets a logger.\n     *\/","19651":"\/**\n * Describes a logger instance.\n *\n * The message MUST be a string or object implementing __toString().\n *\n * The message MAY contain placeholders in the form: {foo} where foo\n * will be replaced by the context data in key \"foo\".\n *\n * The context array can contain arbitrary data. The only assumption that\n * can be made by implementors is that if an Exception instance is given\n * to produce a stack trace, it MUST be in a key named \"exception\".\n *\n * See https:\/\/github.com\/php-fig\/fig-standards\/blob\/master\/accepted\/PSR-3-logger-interface.md\n * for the full interface specification.\n *\/","19652":"\/**\n     * System is unusable.\n     *\n     * @param mixed[] $context\n     *\/","19653":"\/**\n     * Action must be taken immediately.\n     *\n     * Example: Entire website down, database unavailable, etc. This should\n     * trigger the SMS alerts and wake you up.\n     *\n     * @param mixed[] $context\n     *\/","19654":"\/**\n     * Critical conditions.\n     *\n     * Example: Application component unavailable, unexpected exception.\n     *\n     * @param mixed[] $context\n     *\/","19655":"\/**\n     * Runtime errors that do not require immediate action but should typically\n     * be logged and monitored.\n     *\n     * @param mixed[] $context\n     *\/","19656":"\/**\n     * Exceptional occurrences that are not errors.\n     *\n     * Example: Use of deprecated APIs, poor use of an API, undesirable things\n     * that are not necessarily wrong.\n     *\n     * @param mixed[] $context\n     *\/","19657":"\/**\n     * Normal but significant events.\n     *\n     * @param mixed[] $context\n     *\/","19658":"\/**\n     * Interesting events.\n     *\n     * Example: User logs in, SQL logs.\n     *\n     * @param mixed[] $context\n     *\/","19659":"\/**\n     * Detailed debug information.\n     *\n     * @param mixed[] $context\n     *\/","19660":"\/**\n     * Logs with an arbitrary level.\n     *\n     * @param mixed $level\n     * @param mixed[] $context\n     *\n     * @throws \\Psr\\Log\\InvalidArgumentException\n     *\/","19661":"\/**\n * This is a simple Logger trait that classes unable to extend AbstractLogger\n * (because they extend another class, etc) can include.\n *\n * It simply delegates all log-level-specific methods to the `log` method to\n * reduce boilerplate code that a simple Logger that does the same thing with\n * messages regardless of the error level has to implement.\n *\/","19671":"\/**\n * This Logger can be used to avoid conditional log calls.\n *\n * Logging should always be optional, and if no logger is provided to your\n * library creating a NullLogger instance to have something to throw logs at\n * is a good way to avoid littering your code with `if ($this->logger) { }`\n * blocks.\n *\/","19672":"\/**\n     * Logs with an arbitrary level.\n     *\n     * @param mixed[] $context\n     *\n     * @throws \\Psr\\Log\\InvalidArgumentException\n     *\/","19681":"\/**\n     * The `ArrayCache` provides an in-memory implementation of the [`CacheInterface`](#cacheinterface).\n     *\n     * ```php\n     * $cache = new ArrayCache();\n     *\n     * $cache->set('foo', 'bar');\n     * ```\n     *\n     * Its constructor accepts an optional `?int $limit` parameter to limit the\n     * maximum number of entries to store in the LRU cache. If you add more\n     * entries to this instance, it will automatically take care of removing\n     * the one that was least recently used (LRU).\n     *\n     * For example, this snippet will overwrite the first value and only store\n     * the last two entries:\n     *\n     * ```php\n     * $cache = new ArrayCache(2);\n     *\n     * $cache->set('foo', '1');\n     * $cache->set('bar', '2');\n     * $cache->set('baz', '3');\n     * ```\n     *\n     * This cache implementation is known to rely on wall-clock time to schedule\n     * future cache expiration times when using any version before PHP 7.3,\n     * because a monotonic time source is only available as of PHP 7.3 (`hrtime()`).\n     * While this does not affect many common use cases, this is an important\n     * distinction for programs that rely on a high time precision or on systems\n     * that are subject to discontinuous time adjustments (time jumps).\n     * This means that if you store a cache item with a TTL of 30s on PHP < 7.3\n     * and then adjust your system time forward by 20s, the cache item may\n     * expire in 10s. See also [`set()`](#set) for more details.\n     *\n     * @param int|null $limit maximum number of entries to store in the LRU cache\n     *\/","19682":"\/**\n     * @return float\n     *\/","19683":"\/**\n     * Retrieves an item from the cache.\n     *\n     * This method will resolve with the cached value on success or with the\n     * given `$default` value when no item can be found or when an error occurs.\n     * Similarly, an expired cache item (once the time-to-live is expired) is\n     * considered a cache miss.\n     *\n     * ```php\n     * $cache\n     *     ->get('foo')\n     *     ->then('var_dump');\n     * ```\n     *\n     * This example fetches the value of the key `foo` and passes it to the\n     * `var_dump` function. You can use any of the composition provided by\n     * [promises](https:\/\/github.com\/reactphp\/promise).\n     *\n     * @param string $key\n     * @param mixed  $default Default value to return for cache miss or null if not given.\n     * @return PromiseInterface<mixed>\n     *\/","19684":"\/**\n     * Stores an item in the cache.\n     *\n     * This method will resolve with `true` on success or `false` when an error\n     * occurs. If the cache implementation has to go over the network to store\n     * it, it may take a while.\n     *\n     * The optional `$ttl` parameter sets the maximum time-to-live in seconds\n     * for this cache item. If this parameter is omitted (or `null`), the item\n     * will stay in the cache for as long as the underlying implementation\n     * supports. Trying to access an expired cache item results in a cache miss,\n     * see also [`get()`](#get).\n     *\n     * ```php\n     * $cache->set('foo', 'bar', 60);\n     * ```\n     *\n     * This example eventually sets the value of the key `foo` to `bar`. If it\n     * already exists, it is overridden.\n     *\n     * This interface does not enforce any particular TTL resolution, so special\n     * care may have to be taken if you rely on very high precision with\n     * millisecond accuracy or below. Cache implementations SHOULD work on a\n     * best effort basis and SHOULD provide at least second accuracy unless\n     * otherwise noted. Many existing cache implementations are known to provide\n     * microsecond or millisecond accuracy, but it's generally not recommended\n     * to rely on this high precision.\n     *\n     * This interface suggests that cache implementations SHOULD use a monotonic\n     * time source if available. Given that a monotonic time source is only\n     * available as of PHP 7.3 by default, cache implementations MAY fall back\n     * to using wall-clock time.\n     * While this does not affect many common use cases, this is an important\n     * distinction for programs that rely on a high time precision or on systems\n     * that are subject to discontinuous time adjustments (time jumps).\n     * This means that if you store a cache item with a TTL of 30s and then\n     * adjust your system time forward by 20s, the cache item SHOULD still\n     * expire in 30s.\n     *\n     * @param string $key\n     * @param mixed  $value\n     * @param ?float $ttl\n     * @return PromiseInterface<bool> Returns a promise which resolves to `true` on success or `false` on error\n     *\/","19685":"\/**\n     * Deletes an item from the cache.\n     *\n     * This method will resolve with `true` on success or `false` when an error\n     * occurs. When no item for `$key` is found in the cache, it also resolves\n     * to `true`. If the cache implementation has to go over the network to\n     * delete it, it may take a while.\n     *\n     * ```php\n     * $cache->delete('foo');\n     * ```\n     *\n     * This example eventually deletes the key `foo` from the cache. As with\n     * `set()`, this may not happen instantly and a promise is returned to\n     * provide guarantees whether or not the item has been removed from cache.\n     *\n     * @param string $key\n     * @return PromiseInterface<bool> Returns a promise which resolves to `true` on success or `false` on error\n     *\/","19686":"\/**\n     * Retrieves multiple cache items by their unique keys.\n     *\n     * This method will resolve with an array of cached values on success or with the\n     * given `$default` value when an item can not be found or when an error occurs.\n     * Similarly, an expired cache item (once the time-to-live is expired) is\n     * considered a cache miss.\n     *\n     * ```php\n     * $cache->getMultiple(array('name', 'age'))->then(function (array $values) {\n     *     $name = $values['name'] ?? 'User';\n     *     $age = $values['age'] ?? 'n\/a';\n     *\n     *     echo $name . ' is ' . $age . PHP_EOL;\n     * });\n     * ```\n     *\n     * This example fetches the cache items for the `name` and `age` keys and\n     * prints some example output. You can use any of the composition provided\n     * by [promises](https:\/\/github.com\/reactphp\/promise).\n     *\n     * @param string[] $keys A list of keys that can obtained in a single operation.\n     * @param mixed $default Default value to return for keys that do not exist.\n     * @return PromiseInterface<array> Returns a promise which resolves to an `array` of cached values\n     *\/","19687":"\/**\n     * Persists a set of key => value pairs in the cache, with an optional TTL.\n     *\n     * This method will resolve with `true` on success or `false` when an error\n     * occurs. If the cache implementation has to go over the network to store\n     * it, it may take a while.\n     *\n     * The optional `$ttl` parameter sets the maximum time-to-live in seconds\n     * for these cache items. If this parameter is omitted (or `null`), these items\n     * will stay in the cache for as long as the underlying implementation\n     * supports. Trying to access an expired cache items results in a cache miss,\n     * see also [`get()`](#get).\n     *\n     * ```php\n     * $cache->setMultiple(array('foo' => 1, 'bar' => 2), 60);\n     * ```\n     *\n     * This example eventually sets the list of values - the key `foo` to 1 value\n     * and the key `bar` to 2. If some of the keys already exist, they are overridden.\n     *\n     * @param array  $values A list of key => value pairs for a multiple-set operation.\n     * @param ?float $ttl    Optional. The TTL value of this item.\n     * @return PromiseInterface<bool> Returns a promise which resolves to `true` on success or `false` on error\n     *\/","19688":"\/**\n     * Deletes multiple cache items in a single operation.\n     *\n     * @param string[] $keys A list of string-based keys to be deleted.\n     * @return PromiseInterface<bool> Returns a promise which resolves to `true` on success or `false` on error\n     *\/","19689":"\/**\n     * Wipes clean the entire cache.\n     *\n     * @return PromiseInterface<bool> Returns a promise which resolves to `true` on success or `false` on error\n     *\/","19690":"\/**\n     * Determines whether an item is present in the cache.\n     *\n     * This method will resolve with `true` on success or `false` when no item can be found\n     * or when an error occurs. Similarly, an expired cache item (once the time-to-live\n     * is expired) is considered a cache miss.\n     *\n     * ```php\n     * $cache\n     *     ->has('foo')\n     *     ->then('var_dump');\n     * ```\n     *\n     * This example checks if the value of the key `foo` is set in the cache and passes\n     * the result to the `var_dump` function. You can use any of the composition provided by\n     * [promises](https:\/\/github.com\/reactphp\/promise).\n     *\n     * NOTE: It is recommended that has() is only to be used for cache warming type purposes\n     * and not to be used within your live applications operations for get\/set, as this method\n     * is subject to a race condition where your has() will return true and immediately after,\n     * another script can remove it making the state of your app out of date.\n     *\n     * @param string $key The cache item key.\n     * @return PromiseInterface<bool> Returns a promise which resolves to `true` on success or `false` on error\n     *\/","19691":"\/**\n * Process component.\n *\n * This class borrows logic from Symfony's Process component for ensuring\n * compatibility when PHP is compiled with the --enable-sigchild option.\n *\n * This class also implements the `EventEmitterInterface`\n * which allows you to react to certain events:\n *\n * exit event:\n *     The `exit` event will be emitted whenever the process is no longer running.\n *     Event listeners will receive the exit code and termination signal as two\n *     arguments:\n *\n *     ```php\n *     $process = new Process('sleep 10');\n *     $process->start();\n *\n *     $process->on('exit', function ($code, $term) {\n *         if ($term === null) {\n *             echo 'exit with code ' . $code . PHP_EOL;\n *         } else {\n *             echo 'terminated with signal ' . $term . PHP_EOL;\n *         }\n *     });\n *     ```\n *\n *     Note that `$code` is `null` if the process has terminated, but the exit\n *     code could not be determined (for example\n *     [sigchild compatibility](#sigchild-compatibility) was disabled).\n *     Similarly, `$term` is `null` unless the process has terminated in response to\n *     an uncaught signal sent to it.\n *     This is not a limitation of this project, but actual how exit codes and signals\n *     are exposed on POSIX systems, for more details see also\n *     [here](https:\/\/unix.stackexchange.com\/questions\/99112\/default-exit-code-when-process-is-terminated).\n *\n *     It's also worth noting that process termination depends on all file descriptors\n *     being closed beforehand.\n *     This means that all [process pipes](#stream-properties) will emit a `close`\n *     event before the `exit` event and that no more `data` events will arrive after\n *     the `exit` event.\n *     Accordingly, if either of these pipes is in a paused state (`pause()` method\n *     or internally due to a `pipe()` call), this detection may not trigger.\n *\/","19692":"\/**\n     * @var WritableStreamInterface|null|DuplexStreamInterface|ReadableStreamInterface\n     *\/","19693":"\/**\n     * @var ReadableStreamInterface|null|DuplexStreamInterface|WritableStreamInterface\n     *\/","19695":"\/**\n     * Array with all process pipes (once started)\n     *\n     * Unless explicitly configured otherwise during construction, the following\n     * standard I\/O pipes will be assigned by default:\n     * - 0: STDIN (`WritableStreamInterface`)\n     * - 1: STDOUT (`ReadableStreamInterface`)\n     * - 2: STDERR (`ReadableStreamInterface`)\n     *\n     * @var array<ReadableStreamInterface|WritableStreamInterface|DuplexStreamInterface>\n     *\/","19696":"\/**\n    * Constructor.\n    *\n    * @param string $cmd      Command line to run\n    * @param null|string $cwd Current working directory or null to inherit\n    * @param null|array  $env Environment variables or null to inherit\n    * @param null|array  $fds File descriptors to allocate for this process (or null = default STDIO streams)\n    * @throws \\LogicException On windows or when proc_open() is not installed\n    *\/","19697":"\/**\n     * Start the process.\n     *\n     * After the process is started, the standard I\/O streams will be constructed\n     * and available via public properties.\n     *\n     * This method takes an optional `LoopInterface|null $loop` parameter that can be used to\n     * pass the event loop instance to use for this process. You can use a `null` value\n     * here in order to use the [default loop](https:\/\/github.com\/reactphp\/event-loop#loop).\n     * This value SHOULD NOT be given unless you're sure you want to explicitly use a\n     * given event loop instance.\n     *\n     * @param ?LoopInterface $loop        Loop interface for stream construction\n     * @param float          $interval    Interval to periodically monitor process state (seconds)\n     * @throws \\RuntimeException If the process is already running or fails to start\n     *\/","19698":"\/**\n     * Close the process.\n     *\n     * This method should only be invoked via the periodic timer that monitors\n     * the process state.\n     *\/","19699":"\/**\n     * Terminate the process with an optional signal.\n     *\n     * @param int $signal Optional signal (default: SIGTERM)\n     * @return bool Whether the signal was sent successfully\n     *\/","19700":"\/**\n     * Get the command string used to launch the process.\n     *\n     * @return string\n     *\/","19701":"\/**\n     * Get the exit code returned by the process.\n     *\n     * This value is only meaningful if isRunning() has returned false. Null\n     * will be returned if the process is still running.\n     *\n     * Null may also be returned if the process has terminated, but the exit\n     * code could not be determined (e.g. sigchild compatibility was disabled).\n     *\n     * @return int|null\n     *\/","19702":"\/**\n     * Get the process ID.\n     *\n     * @return int|null\n     *\/","19703":"\/**\n     * Get the signal that caused the process to stop its execution.\n     *\n     * This value is only meaningful if isStopped() has returned true. Null will\n     * be returned if the process was never stopped.\n     *\n     * @return int|null\n     *\/","19704":"\/**\n     * Get the signal that caused the process to terminate its execution.\n     *\n     * This value is only meaningful if isTerminated() has returned true. Null\n     * will be returned if the process was never terminated.\n     *\n     * @return int|null\n     *\/","19705":"\/**\n     * Return whether the process is still running.\n     *\n     * @return bool\n     *\/","19706":"\/**\n     * Return whether the process has been stopped by a signal.\n     *\n     * @return bool\n     *\/","19707":"\/**\n     * Return whether the process has been terminated by an uncaught signal.\n     *\n     * @return bool\n     *\/","19708":"\/**\n     * Return whether PHP has been compiled with the '--enable-sigchild' option.\n     *\n     * @see \\Symfony\\Component\\Process\\Process::isSigchildEnabled()\n     * @return bool\n     *\/","19709":"\/**\n     * Enable or disable sigchild compatibility mode.\n     *\n     * Sigchild compatibility mode is required to get the exit code and\n     * determine the success of a process when PHP has been compiled with\n     * the --enable-sigchild option.\n     *\n     * @param bool $sigchild\n     * @return void\n     *\/","19710":"\/**\n     * Check the fourth pipe for an exit code.\n     *\n     * This should only be used if --enable-sigchild compatibility was enabled.\n     *\/","19711":"\/**\n     * Close the fourth pipe used to relay an exit code.\n     *\n     * This should only be used if --enable-sigchild compatibility was enabled.\n     *\/","19712":"\/**\n     * Return the cached process status.\n     *\n     * @return array\n     *\/","19713":"\/**\n     * Return the updated process status.\n     *\n     * @return array\n     *\/","19714":"\/**\n     * Update the process status, stop\/term signals, and exit code.\n     *\n     * Stop\/term signals are only updated if the process is currently stopped or\n     * signaled, respectively. Otherwise, signal values will remain as-is so the\n     * corresponding getter methods may be used at a later point in time.\n     *\/","19715":"\/**\n     * Loads the system DNS configuration\n     *\n     * Note that this method may block while loading its internal files and\/or\n     * commands and should thus be used with care! While this should be\n     * relatively fast for most systems, it remains unknown if this may block\n     * under certain circumstances. In particular, this method should only be\n     * executed before the loop starts, not while it is running.\n     *\n     * Note that this method will try to access its files and\/or commands and\n     * try to parse its output. Currently, this will only parse valid nameserver\n     * entries from its output and will ignore all other output without\n     * complaining.\n     *\n     * Note that the previous section implies that this may return an empty\n     * `Config` object if no valid nameserver entries can be found.\n     *\n     * @return self\n     * @codeCoverageIgnore\n     *\/","19716":"\/**\n     * Loads a resolv.conf file (from the given path or default location)\n     *\n     * Note that this method blocks while loading the given path and should\n     * thus be used with care! While this should be relatively fast for normal\n     * resolv.conf files, this may be an issue if this file is located on a slow\n     * device or contains an excessive number of entries. In particular, this\n     * method should only be executed before the loop starts, not while it is\n     * running.\n     *\n     * Note that this method will throw if the given file can not be loaded,\n     * such as if it is not readable or does not exist. In particular, this file\n     * is not available on Windows.\n     *\n     * Currently, this will only parse valid \"nameserver X\" lines from the\n     * given file contents. Lines can be commented out with \"#\" and \";\" and\n     * invalid lines will be ignored without complaining. See also\n     * `man resolv.conf` for more details.\n     *\n     * Note that the previous section implies that this may return an empty\n     * `Config` object if no valid \"nameserver X\" lines can be found. See also\n     * `man resolv.conf` which suggests that the DNS server on the localhost\n     * should be used in this case. This is left up to higher level consumers\n     * of this API.\n     *\n     * @param ?string $path (optional) path to resolv.conf file or null=load default location\n     * @return self\n     * @throws RuntimeException if the path can not be loaded (does not exist)\n     *\/","19717":"\/**\n     * Loads the DNS configurations from Windows's WMIC (from the given command or default command)\n     *\n     * Note that this method blocks while loading the given command and should\n     * thus be used with care! While this should be relatively fast for normal\n     * WMIC commands, it remains unknown if this may block under certain\n     * circumstances. In particular, this method should only be executed before\n     * the loop starts, not while it is running.\n     *\n     * Note that this method will only try to execute the given command try to\n     * parse its output, irrespective of whether this command exists. In\n     * particular, this command is only available on Windows. Currently, this\n     * will only parse valid nameserver entries from the command output and will\n     * ignore all other output without complaining.\n     *\n     * Note that the previous section implies that this may return an empty\n     * `Config` object if no valid nameserver entries can be found.\n     *\n     * @param ?string $command (advanced) should not be given (NULL) unless you know what you're doing\n     * @return self\n     * @link https:\/\/ss64.com\/nt\/wmic.html\n     *\/","19718":"\/**\n * Represents a static hosts file which maps hostnames to IPs\n *\n * Hosts files are used on most systems to avoid actually hitting the DNS for\n * certain common hostnames.\n *\n * Most notably, this file usually contains an entry to map \"localhost\" to the\n * local IP. Windows is a notable exception here, as Windows does not actually\n * include \"localhost\" in this file by default. To compensate for this, this\n * class may explicitly be wrapped in another HostsFile instance which\n * hard-codes these entries for Windows (see also Factory).\n *\n * This class mostly exists to abstract the parsing\/extraction process so this\n * can be replaced with a faster alternative in the future.\n *\/","19719":"\/**\n     * Returns the default path for the hosts file on this system\n     *\n     * @return string\n     * @codeCoverageIgnore\n     *\/","19720":"\/**\n     * Loads a hosts file (from the given path or default location)\n     *\n     * Note that this method blocks while loading the given path and should\n     * thus be used with care! While this should be relatively fast for normal\n     * hosts file, this may be an issue if this file is located on a slow device\n     * or contains an excessive number of entries. In particular, this method\n     * should only be executed before the loop starts, not while it is running.\n     *\n     * @param ?string $path (optional) path to hosts file or null=load default location\n     * @return self\n     * @throws RuntimeException if the path can not be loaded (does not exist)\n     *\/","19721":"\/**\n     * Instantiate new hosts file with the given hosts file contents\n     *\n     * @param string $contents\n     *\/","19722":"\/**\n     * Returns all IPs for the given hostname\n     *\n     * @param string $name\n     * @return string[]\n     *\/","19723":"\/**\n     * Returns all hostnames for the given IPv4 or IPv6 address\n     *\n     * @param string $ip\n     * @return string[]\n     *\/","19724":"\/**\n * This class represents an outgoing query message or an incoming response message\n *\n * @link https:\/\/tools.ietf.org\/html\/rfc1035#section-4.1.1\n *\/","19725":"\/**\n     * pseudo-type for EDNS0\n     *\n     * These are included in the additional section and usually not in answer section.\n     * Defined in [RFC 6891](https:\/\/tools.ietf.org\/html\/rfc6891) (or older\n     * [RFC 2671](https:\/\/tools.ietf.org\/html\/rfc2671)).\n     *\n     * The OPT record uses the \"class\" field to store the maximum size.\n     *\n     * The OPT record uses the \"ttl\" field to store additional flags.\n     *\/","19726":"\/**\n     * Sender Policy Framework (SPF) had a dedicated SPF type which has been\n     * deprecated in favor of reusing the existing TXT type.\n     *\n     * @deprecated https:\/\/datatracker.ietf.org\/doc\/html\/rfc7208#section-3.1\n     * @see self::TYPE_TXT\n     *\/","19727":"\/**\n     * The edns-tcp-keepalive EDNS0 Option\n     *\n     * Option value contains a `?float` with timeout in seconds (in 0.1s steps)\n     * for DNS response or `null` for DNS query.\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc7828\n     *\/","19728":"\/**\n     * The EDNS(0) Padding Option\n     *\n     * Option value contains a `string` with binary data (usually variable\n     * number of null bytes)\n     *\n     * @link https:\/\/tools.ietf.org\/html\/rfc7830\n     *\/","19729":"\/**\n     * The 16 bit message ID\n     *\n     * The response message ID has to match the request message ID. This allows\n     * the receiver to verify this is the correct response message. An outside\n     * attacker may try to inject fake responses by \"guessing\" the message ID,\n     * so this should use a proper CSPRNG to avoid possible cache poisoning.\n     *\n     * @var int 16 bit message ID\n     * @see self::generateId()\n     *\/","19730":"\/**\n     * @var bool Query\/Response flag, query=false or response=true\n     *\/","19731":"\/**\n     * @var int specifies the kind of query (4 bit), see self::OPCODE_* constants\n     * @see self::OPCODE_QUERY\n     *\/","19732":"\/**\n     *\n     * @var bool Authoritative Answer\n     *\/","19733":"\/**\n     * @var bool TrunCation\n     *\/","19734":"\/**\n     * @var bool Recursion Desired\n     *\/","19735":"\/**\n     * @var bool Recursion Available\n     *\/","19736":"\/**\n     * @var int response code (4 bit), see self::RCODE_* constants\n     * @see self::RCODE_OK\n     *\/","19737":"\/**\n     * An array of Query objects\n     *\n     * ```php\n     * $questions = array(\n     *     new Query(\n     *         'reactphp.org',\n     *         Message::TYPE_A,\n     *         Message::CLASS_IN\n     *     )\n     * );\n     * ```\n     *\n     * @var Query[]\n     *\/","19738":"\/**\n     * @var Record[]\n     *\/","19741":"\/**\n     * Creates a new request message for the given query\n     *\n     * @param Query $query\n     * @return self\n     *\/","19742":"\/**\n     * Creates a new response message for the given query with the given answer records\n     *\n     * @param Query    $query\n     * @param Record[] $answers\n     * @return self\n     *\/","19743":"\/**\n     * generates a random 16 bit message ID\n     *\n     * This uses a CSPRNG so that an outside attacker that is sending spoofed\n     * DNS response messages can not guess the message ID to avoid possible\n     * cache poisoning attacks.\n     *\n     * The `random_int()` function is only available on PHP 7+ or when\n     * https:\/\/github.com\/paragonie\/random_compat is installed. As such, using\n     * the latest supported PHP version is highly recommended. This currently\n     * falls back to a less secure random number generator on older PHP versions\n     * in the hope that this system is properly protected against outside\n     * attackers, for example by using one of the common local DNS proxy stubs.\n     *\n     * @return int\n     * @see self::getId()\n     * @codeCoverageIgnore\n     *\/","19744":"\/**\n * This class represents a single resulting record in a response message\n *\n * It uses a structure similar to `\\React\\Dns\\Query\\Query`, but does include\n * fields for resulting TTL and resulting record data (IPs etc.).\n *\n * @link https:\/\/tools.ietf.org\/html\/rfc1035#section-4.1.3\n * @see \\React\\Dns\\Query\\Query\n *\/","19745":"\/**\n     * @var string hostname without trailing dot, for example \"reactphp.org\"\n     *\/","19746":"\/**\n     * @var int see Message::TYPE_* constants (UINT16)\n     *\/","19747":"\/**\n     * Defines the network class, usually `Message::CLASS_IN`.\n     *\n     * For `OPT` records (EDNS0), this defines the maximum message size instead.\n     *\n     * @var int see Message::CLASS_IN constant (UINT16)\n     * @see Message::CLASS_IN\n     *\/","19748":"\/**\n     * Defines the maximum time-to-live (TTL) in seconds\n     *\n     * For `OPT` records (EDNS0), this defines additional flags instead.\n     *\n     * @var int maximum TTL in seconds (UINT32, most significant bit always unset)\n     * @link https:\/\/tools.ietf.org\/html\/rfc2181#section-8\n     * @link https:\/\/tools.ietf.org\/html\/rfc6891#section-6.1.3 for `OPT` records (EDNS0)\n     *\/","19749":"\/**\n     * The payload data for this record\n     *\n     * The payload data format depends on the record type. As a rule of thumb,\n     * this library will try to express this in a way that can be consumed\n     * easily without having to worry about DNS internals and its binary transport:\n     *\n     * - A:\n     *   IPv4 address string, for example \"192.168.1.1\".\n     *\n     * - AAAA:\n     *   IPv6 address string, for example \"::1\".\n     *\n     * - CNAME \/ PTR \/ NS:\n     *   The hostname without trailing dot, for example \"reactphp.org\".\n     *\n     * - TXT:\n     *   List of string values, for example `[\"v=spf1 include:example.com\"]`.\n     *   This is commonly a list with only a single string value, but this\n     *   technically allows multiple strings (0-255 bytes each) in a single\n     *   record. This is rarely used and depending on application you may want\n     *   to join these together or handle them separately. Each string can\n     *   transport any binary data, its character encoding is not defined (often\n     *   ASCII\/UTF-8 in practice). [RFC 1464](https:\/\/tools.ietf.org\/html\/rfc1464)\n     *   suggests using key-value pairs such as `[\"name=test\",\"version=1\"]`, but\n     *   interpretation of this is not enforced and left up to consumers of this\n     *   library (used for DNS-SD\/Zeroconf and others).\n     *\n     * - MX:\n     *   Mail server priority (UINT16) and target hostname without trailing dot,\n     *   for example `{\"priority\":10,\"target\":\"mx.example.com\"}`.\n     *   The payload data uses an associative array with fixed keys \"priority\"\n     *   (also commonly referred to as weight or preference) and \"target\" (also\n     *   referred to as exchange). If a response message contains multiple\n     *   records of this type, targets should be sorted by priority (lowest\n     *   first) - this is left up to consumers of this library (used for SMTP).\n     *\n     * - SRV:\n     *   Service priority (UINT16), service weight (UINT16), service port (UINT16)\n     *   and target hostname without trailing dot, for example\n     *   `{\"priority\":10,\"weight\":50,\"port\":8080,\"target\":\"example.com\"}`.\n     *   The payload data uses an associative array with fixed keys \"priority\",\n     *   \"weight\", \"port\" and \"target\" (also referred to as name).\n     *   The target may be an empty host name string if the service is decidedly\n     *   not available. If a response message contains multiple records of this\n     *   type, targets should be sorted by priority (lowest first) and selected\n     *   randomly according to their weight - this is left up to consumers of\n     *   this library, see also [RFC 2782](https:\/\/tools.ietf.org\/html\/rfc2782)\n     *   for more details.\n     *\n     * - SSHFP:\n     *   Includes algorithm (UNIT8), fingerprint type (UNIT8) and fingerprint\n     *   value as lower case hex string, for example:\n     *   `{\"algorithm\":1,\"type\":1,\"fingerprint\":\"0123456789abcdef...\"}`\n     *   See also https:\/\/www.iana.org\/assignments\/dns-sshfp-rr-parameters\/dns-sshfp-rr-parameters.xhtml\n     *   for algorithm and fingerprint type assignments.\n     *\n     * - SOA:\n     *   Includes master hostname without trailing dot, responsible person email\n     *   as hostname without trailing dot and serial, refresh, retry, expire and\n     *   minimum times in seconds (UINT32 each), for example:\n     *   `{\"mname\":\"ns.example.com\",\"rname\":\"hostmaster.example.com\",\"serial\":\n     *   2018082601,\"refresh\":3600,\"retry\":1800,\"expire\":60000,\"minimum\":3600}`.\n     *\n     * - CAA:\n     *   Includes flag (UNIT8), tag string and value string, for example:\n     *   `{\"flag\":128,\"tag\":\"issue\",\"value\":\"letsencrypt.org\"}`\n     *\n     * - OPT:\n     *   Special pseudo-type for EDNS0. Includes an array of additional opt codes\n     *   with a value according to the respective OPT code. See `Message::OPT_*`\n     *   for list of supported OPT codes. Any other OPT code not currently\n     *   supported will be an opaque binary string containing the raw data\n     *   as transported in the DNS record. For forwards compatibility, you should\n     *   not rely on this format for unknown types. Future versions may add\n     *   support for new types and this may then parse the payload data\n     *   appropriately - this will not be considered a BC break. See also\n     *   [RFC 6891](https:\/\/tools.ietf.org\/html\/rfc6891) for more details.\n     *\n     * - Any other unknown type:\n     *   An opaque binary string containing the RDATA as transported in the DNS\n     *   record. For forwards compatibility, you should not rely on this format\n     *   for unknown types. Future versions may add support for new types and\n     *   this may then parse the payload data appropriately - this will not be\n     *   considered a BC break. See the format definition of known types above\n     *   for more details.\n     *\n     * @var string|string[]|array\n     *\/","19750":"\/**\n     * @param string                $name\n     * @param int                   $type\n     * @param int                   $class\n     * @param int                   $ttl\n     * @param string|string[]|array $data\n     *\/","19751":"\/**\n     * @param Message $message\n     * @return string\n     *\/","19753":"\/**\n     * @param Query[] $questions\n     * @return string\n     *\/","19754":"\/**\n     * @param Record[] $records\n     * @return string\n     *\/","19755":"\/**\n     * @param string[] $texts\n     * @return string\n     *\/","19756":"\/**\n     * @param string $host\n     * @return string\n     *\/","19757":"\/**\n * DNS protocol parser\n *\n * Obsolete and uncommon types and classes are not implemented.\n *\/","19758":"\/**\n     * Parses the given raw binary message into a Message object\n     *\n     * @param string $data\n     * @throws InvalidArgumentException\n     * @return Message\n     *\/","19759":"\/**\n     * @param string $data\n     * @param int    $consumed\n     * @return ?Message\n     *\/","19760":"\/**\n     * @param string $data\n     * @param int $consumed\n     * @return array\n     *\/","19761":"\/**\n     * @param string $data\n     * @param int $consumed\n     * @return array An array with a parsed Record on success or array with null if data is invalid\/incomplete\n     *\/","19762":"\/**\n     * @param string $data\n     * @param int    $consumed\n     * @param int    $compressionDepth maximum depth for compressed labels to avoid unreasonable recursion\n     * @return array\n     *\/","19763":"\/**\n     * Default TTL for negative responses (NXDOMAIN etc.).\n     *\n     * @internal\n     *\/","19764":"\/**\n     * @param Message $message\n     * @return int\n     * @internal\n     *\/","19765":"\/**\n * Cooperatively resolves hosts via the given base executor to ensure same query is not run concurrently\n *\n * Wraps an existing `ExecutorInterface` to keep tracking of pending queries\n * and only starts a new query when the same query is not already pending. Once\n * the underlying query is fulfilled\/rejected, it will forward its value to all\n * promises awaiting the same query.\n *\n * This means it will not limit concurrency for queries that differ, for example\n * when sending many queries for different host names or types.\n *\n * This is useful because all executors are entirely async and as such allow you\n * to execute any number of queries concurrently. You should probably limit the\n * number of concurrent queries in your application or you're very likely going\n * to face rate limitations and bans on the resolver end. For many common\n * applications, you may want to avoid sending the same query multiple times\n * when the first one is still pending, so you will likely want to use this in\n * combination with some other executor like this:\n *\n * ```php\n * $executor = new CoopExecutor(\n *     new RetryExecutor(\n *         new TimeoutExecutor(\n *             new UdpTransportExecutor($nameserver),\n *             3.0\n *         )\n *     )\n * );\n * ```\n *\/","19766":"\/**\n     * Executes a query and will return a response message\n     *\n     * It returns a Promise which either fulfills with a response\n     * `React\\Dns\\Model\\Message` on success or rejects with an `Exception` if\n     * the query is not successful. A response message may indicate an error\n     * condition in its `rcode`, but this is considered a valid response message.\n     *\n     * ```php\n     * $executor->query($query)->then(\n     *     function (React\\Dns\\Model\\Message $response) {\n     *         \/\/ response message successfully received\n     *         var_dump($response->rcode, $response->answers);\n     *     },\n     *     function (Exception $error) {\n     *         \/\/ failed to query due to $error\n     *     }\n     * );\n     * ```\n     *\n     * The returned Promise MUST be implemented in such a way that it can be\n     * cancelled when it is still pending. Cancelling a pending promise MUST\n     * reject its value with an Exception. It SHOULD clean up any underlying\n     * resources and references as applicable.\n     *\n     * ```php\n     * $promise = $executor->query($query);\n     *\n     * $promise->cancel();\n     * ```\n     *\n     * @param Query $query\n     * @return \\React\\Promise\\PromiseInterface<\\React\\Dns\\Model\\Message>\n     *     resolves with response message on success or rejects with an Exception on error\n     *\/","19767":"\/**\n * Resolves hosts from the given HostsFile or falls back to another executor\n *\n * If the host is found in the hosts file, it will not be passed to the actual\n * DNS executor. If the host is not found in the hosts file, it will be passed\n * to the DNS executor as a fallback.\n *\/","19768":"\/**\n * This class represents a single question in a query\/response message\n *\n * It uses a structure similar to `\\React\\Dns\\Message\\Record`, but does not\n * contain fields for resulting TTL and resulting record data (IPs etc.).\n *\n * @link https:\/\/tools.ietf.org\/html\/rfc1035#section-4.1.2\n * @see \\React\\Dns\\Message\\Record\n *\/","19769":"\/**\n     * @var string query name, i.e. hostname to look up\n     *\/","19770":"\/**\n     * @var int query type (aka QTYPE), see Message::TYPE_* constants\n     *\/","19771":"\/**\n     * @var int query class (aka QCLASS), see Message::CLASS_IN constant\n     *\/","19772":"\/**\n     * @param string $name  query name, i.e. hostname to look up\n     * @param int    $type  query type, see Message::TYPE_* constants\n     * @param int    $class query class, see Message::CLASS_IN constant\n     *\/","19773":"\/**\n     * Describes the hostname and query type\/class for this query\n     *\n     * The output format is supposed to be human readable and is subject to change.\n     * The format is inspired by RFC 3597 when handling unkown types\/classes.\n     *\n     * @return string \"example.com (A)\" or \"example.com (CLASS0 TYPE1234)\"\n     * @link https:\/\/tools.ietf.org\/html\/rfc3597\n     *\/","19774":"\/**\n * Send DNS queries over a UDP or TCP\/IP stream transport.\n *\n * This class will automatically choose the correct transport protocol to send\n * a DNS query to your DNS server. It will always try to send it over the more\n * efficient UDP transport first. If this query yields a size related issue\n * (truncated messages), it will retry over a streaming TCP\/IP transport.\n *\n * For more advanced usages one can utilize this class directly.\n * The following example looks up the `IPv6` address for `reactphp.org`.\n *\n * ```php\n * $executor = new SelectiveTransportExecutor($udpExecutor, $tcpExecutor);\n *\n * $executor->query(\n *     new Query($name, Message::TYPE_AAAA, Message::CLASS_IN)\n * )->then(function (Message $message) {\n *     foreach ($message->answers as $answer) {\n *         echo 'IPv6: ' . $answer->data . PHP_EOL;\n *     }\n * }, 'printf');\n * ```\n *\n * Note that this executor only implements the logic to select the correct\n * transport for the given DNS query. Implementing the correct transport logic,\n * implementing timeouts and any retry logic is left up to the given executors,\n * see also [`UdpTransportExecutor`](#udptransportexecutor) and\n * [`TcpTransportExecutor`](#tcptransportexecutor) for more details.\n *\n * Note that this executor is entirely async and as such allows you to execute\n * any number of queries concurrently. You should probably limit the number of\n * concurrent queries in your application or you're very likely going to face\n * rate limitations and bans on the resolver end. For many common applications,\n * you may want to avoid sending the same query multiple times when the first\n * one is still pending, so you will likely want to use this in combination with\n * a `CoopExecutor` like this:\n *\n * ```php\n * $executor = new CoopExecutor(\n *     new SelectiveTransportExecutor(\n *         $datagramExecutor,\n *         $streamExecutor\n *     )\n * );\n * ```\n *\/","19775":"\/**\n * Send DNS queries over a TCP\/IP stream transport.\n *\n * This is one of the main classes that send a DNS query to your DNS server.\n *\n * For more advanced usages one can utilize this class directly.\n * The following example looks up the `IPv6` address for `reactphp.org`.\n *\n * ```php\n * $executor = new TcpTransportExecutor('8.8.8.8:53');\n *\n * $executor->query(\n *     new Query($name, Message::TYPE_AAAA, Message::CLASS_IN)\n * )->then(function (Message $message) {\n *     foreach ($message->answers as $answer) {\n *         echo 'IPv6: ' . $answer->data . PHP_EOL;\n *     }\n * }, 'printf');\n * ```\n *\n * See also [example #92](examples).\n *\n * Note that this executor does not implement a timeout, so you will very likely\n * want to use this in combination with a `TimeoutExecutor` like this:\n *\n * ```php\n * $executor = new TimeoutExecutor(\n *     new TcpTransportExecutor($nameserver),\n *     3.0\n * );\n * ```\n *\n * Unlike the `UdpTransportExecutor`, this class uses a reliable TCP\/IP\n * transport, so you do not necessarily have to implement any retry logic.\n *\n * Note that this executor is entirely async and as such allows you to execute\n * queries concurrently. The first query will establish a TCP\/IP socket\n * connection to the DNS server which will be kept open for a short period.\n * Additional queries will automatically reuse this existing socket connection\n * to the DNS server, will pipeline multiple requests over this single\n * connection and will keep an idle connection open for a short period. The\n * initial TCP\/IP connection overhead may incur a slight delay if you only send\n * occasional queries \u2013 when sending a larger number of concurrent queries over\n * an existing connection, it becomes increasingly more efficient and avoids\n * creating many concurrent sockets like the UDP-based executor. You may still\n * want to limit the number of (concurrent) queries in your application or you\n * may be facing rate limitations and bans on the resolver end. For many common\n * applications, you may want to avoid sending the same query multiple times\n * when the first one is still pending, so you will likely want to use this in\n * combination with a `CoopExecutor` like this:\n *\n * ```php\n * $executor = new CoopExecutor(\n *     new TimeoutExecutor(\n *         new TcpTransportExecutor($nameserver),\n *         3.0\n *     )\n * );\n * ```\n *\n * > Internally, this class uses PHP's TCP\/IP sockets and does not take advantage\n *   of [react\/socket](https:\/\/github.com\/reactphp\/socket) purely for\n *   organizational reasons to avoid a cyclic dependency between the two\n *   packages. Higher-level components should take advantage of the Socket\n *   component instead of reimplementing this socket logic from scratch.\n *\/","19776":"\/**\n     * @var ?resource\n     *\/","19777":"\/**\n     * @var Deferred[]\n     *\/","19779":"\/**\n     * Maximum idle time when socket is current unused (i.e. no pending queries outstanding)\n     *\n     * If a new query is to be sent during the idle period, we can reuse the\n     * existing socket without having to wait for a new socket connection.\n     * This uses a rather small, hard-coded value to not keep any unneeded\n     * sockets open and to not keep the loop busy longer than needed.\n     *\n     * A future implementation may take advantage of `edns-tcp-keepalive` to keep\n     * the socket open for longer periods. This will likely require explicit\n     * configuration because this may consume additional resources and also keep\n     * the loop busy for longer than expected in some applications.\n     *\n     * @var float\n     * @link https:\/\/tools.ietf.org\/html\/rfc7766#section-6.2.1\n     * @link https:\/\/tools.ietf.org\/html\/rfc7828\n     *\/","19780":"\/**\n     * @var ?\\React\\EventLoop\\TimerInterface\n     *\/","19782":"\/**\n     * @param string         $nameserver\n     * @param ?LoopInterface $loop\n     *\/","19785":"\/**\n     * @internal\n     * @param string $reason\n     * @param int    $code\n     *\/","19787":"\/**\n     * @param ExecutorInterface $executor\n     * @param float $timeout\n     * @param ?LoopInterface $loop\n     *\/","19788":"\/**\n * Send DNS queries over a UDP transport.\n *\n * This is the main class that sends a DNS query to your DNS server and is used\n * internally by the `Resolver` for the actual message transport.\n *\n * For more advanced usages one can utilize this class directly.\n * The following example looks up the `IPv6` address for `igor.io`.\n *\n * ```php\n * $executor = new UdpTransportExecutor('8.8.8.8:53');\n *\n * $executor->query(\n *     new Query($name, Message::TYPE_AAAA, Message::CLASS_IN)\n * )->then(function (Message $message) {\n *     foreach ($message->answers as $answer) {\n *         echo 'IPv6: ' . $answer->data . PHP_EOL;\n *     }\n * }, 'printf');\n * ```\n *\n * See also the [fourth example](examples).\n *\n * Note that this executor does not implement a timeout, so you will very likely\n * want to use this in combination with a `TimeoutExecutor` like this:\n *\n * ```php\n * $executor = new TimeoutExecutor(\n *     new UdpTransportExecutor($nameserver),\n *     3.0\n * );\n * ```\n *\n * Also note that this executor uses an unreliable UDP transport and that it\n * does not implement any retry logic, so you will likely want to use this in\n * combination with a `RetryExecutor` like this:\n *\n * ```php\n * $executor = new RetryExecutor(\n *     new TimeoutExecutor(\n *         new UdpTransportExecutor($nameserver),\n *         3.0\n *     )\n * );\n * ```\n *\n * Note that this executor is entirely async and as such allows you to execute\n * any number of queries concurrently. You should probably limit the number of\n * concurrent queries in your application or you're very likely going to face\n * rate limitations and bans on the resolver end. For many common applications,\n * you may want to avoid sending the same query multiple times when the first\n * one is still pending, so you will likely want to use this in combination with\n * a `CoopExecutor` like this:\n *\n * ```php\n * $executor = new CoopExecutor(\n *     new RetryExecutor(\n *         new TimeoutExecutor(\n *             new UdpTransportExecutor($nameserver),\n *             3.0\n *         )\n *     )\n * );\n * ```\n *\n * > Internally, this class uses PHP's UDP sockets and does not take advantage\n *   of [react\/datagram](https:\/\/github.com\/reactphp\/datagram) purely for\n *   organizational reasons to avoid a cyclic dependency between the two\n *   packages. Higher-level components should take advantage of the Datagram\n *   component instead of reimplementing this socket logic from scratch.\n *\/","19789":"\/**\n     * maximum UDP packet size to send and receive\n     *\n     * @var int\n     *\/","19791":"\/**\n     * Creates a DNS resolver instance for the given DNS config\n     *\n     * As of v1.7.0 it's recommended to pass a `Config` object instead of a\n     * single nameserver address. If the given config contains more than one DNS\n     * nameserver, all DNS nameservers will be used in order. The primary DNS\n     * server will always be used first before falling back to the secondary or\n     * tertiary DNS server.\n     *\n     * @param Config|string  $config DNS Config object (recommended) or single nameserver address\n     * @param ?LoopInterface $loop\n     * @return \\React\\Dns\\Resolver\\ResolverInterface\n     * @throws \\InvalidArgumentException for invalid DNS server address\n     * @throws \\UnderflowException when given DNS Config object has an empty list of nameservers\n     *\/","19792":"\/**\n     * Creates a cached DNS resolver instance for the given DNS config and cache\n     *\n     * As of v1.7.0 it's recommended to pass a `Config` object instead of a\n     * single nameserver address. If the given config contains more than one DNS\n     * nameserver, all DNS nameservers will be used in order. The primary DNS\n     * server will always be used first before falling back to the secondary or\n     * tertiary DNS server.\n     *\n     * @param Config|string   $config DNS Config object (recommended) or single nameserver address\n     * @param ?LoopInterface  $loop\n     * @param ?CacheInterface $cache\n     * @return \\React\\Dns\\Resolver\\ResolverInterface\n     * @throws \\InvalidArgumentException for invalid DNS server address\n     * @throws \\UnderflowException when given DNS Config object has an empty list of nameservers\n     *\/","19793":"\/**\n     * Tries to load the hosts file and decorates the given executor on success\n     *\n     * @param ExecutorInterface $executor\n     * @return ExecutorInterface\n     * @codeCoverageIgnore\n     *\/","19794":"\/**\n     * @param Config|string $nameserver\n     * @param LoopInterface $loop\n     * @return CoopExecutor\n     * @throws \\InvalidArgumentException for invalid DNS server address\n     * @throws \\UnderflowException when given DNS Config object has an empty list of nameservers\n     *\/","19795":"\/**\n     * @param string $nameserver\n     * @param LoopInterface $loop\n     * @return ExecutorInterface\n     * @throws \\InvalidArgumentException for invalid DNS server address\n     *\/","19796":"\/**\n     * @param string $nameserver\n     * @param LoopInterface $loop\n     * @return TimeoutExecutor\n     * @throws \\InvalidArgumentException for invalid DNS server address\n     *\/","19798":"\/**\n * @see ResolverInterface for the base interface\n *\/","19799":"\/**\n     * [Internal] extract all resource record values from response for this query\n     *\n     * @param Query   $query\n     * @param Message $response\n     * @return array\n     * @throws RecordNotFoundException when response indicates an error or contains no data\n     * @internal\n     *\/","19800":"\/**\n     * @param \\React\\Dns\\Model\\Record[] $answers\n     * @param string                    $name\n     * @param int                       $type\n     * @return array\n     *\/","19801":"\/**\n     * Resolves the given $domain name to a single IPv4 address (type `A` query).\n     *\n     * ```php\n     * $resolver->resolve('reactphp.org')->then(function ($ip) {\n     *     echo 'IP for reactphp.org is ' . $ip . PHP_EOL;\n     * });\n     * ```\n     *\n     * This is one of the main methods in this package. It sends a DNS query\n     * for the given $domain name to your DNS server and returns a single IP\n     * address on success.\n     *\n     * If the DNS server sends a DNS response message that contains more than\n     * one IP address for this query, it will randomly pick one of the IP\n     * addresses from the response. If you want the full list of IP addresses\n     * or want to send a different type of query, you should use the\n     * [`resolveAll()`](#resolveall) method instead.\n     *\n     * If the DNS server sends a DNS response message that indicates an error\n     * code, this method will reject with a `RecordNotFoundException`. Its\n     * message and code can be used to check for the response code.\n     *\n     * If the DNS communication fails and the server does not respond with a\n     * valid response message, this message will reject with an `Exception`.\n     *\n     * Pending DNS queries can be cancelled by cancelling its pending promise like so:\n     *\n     * ```php\n     * $promise = $resolver->resolve('reactphp.org');\n     *\n     * $promise->cancel();\n     * ```\n     *\n     * @param string $domain\n     * @return \\React\\Promise\\PromiseInterface<string>\n     *     resolves with a single IP address on success or rejects with an Exception on error.\n     *\/","19802":"\/**\n     * Resolves all record values for the given $domain name and query $type.\n     *\n     * ```php\n     * $resolver->resolveAll('reactphp.org', Message::TYPE_A)->then(function ($ips) {\n     *     echo 'IPv4 addresses for reactphp.org ' . implode(', ', $ips) . PHP_EOL;\n     * });\n     *\n     * $resolver->resolveAll('reactphp.org', Message::TYPE_AAAA)->then(function ($ips) {\n     *     echo 'IPv6 addresses for reactphp.org ' . implode(', ', $ips) . PHP_EOL;\n     * });\n     * ```\n     *\n     * This is one of the main methods in this package. It sends a DNS query\n     * for the given $domain name to your DNS server and returns a list with all\n     * record values on success.\n     *\n     * If the DNS server sends a DNS response message that contains one or more\n     * records for this query, it will return a list with all record values\n     * from the response. You can use the `Message::TYPE_*` constants to control\n     * which type of query will be sent. Note that this method always returns a\n     * list of record values, but each record value type depends on the query\n     * type. For example, it returns the IPv4 addresses for type `A` queries,\n     * the IPv6 addresses for type `AAAA` queries, the hostname for type `NS`,\n     * `CNAME` and `PTR` queries and structured data for other queries. See also\n     * the `Record` documentation for more details.\n     *\n     * If the DNS server sends a DNS response message that indicates an error\n     * code, this method will reject with a `RecordNotFoundException`. Its\n     * message and code can be used to check for the response code.\n     *\n     * If the DNS communication fails and the server does not respond with a\n     * valid response message, this message will reject with an `Exception`.\n     *\n     * Pending DNS queries can be cancelled by cancelling its pending promise like so:\n     *\n     * ```php\n     * $promise = $resolver->resolveAll('reactphp.org', Message::TYPE_AAAA);\n     *\n     * $promise->cancel();\n     * ```\n     *\n     * @param string $domain\n     * @return \\React\\Promise\\PromiseInterface<array>\n     *     Resolves with all record values on success or rejects with an Exception on error.\n     *\/","19803":"\/**\n * An `ext-ev` based event loop.\n *\n * This loop uses the [`ev` PECL extension](https:\/\/pecl.php.net\/package\/ev),\n * that provides an interface to `libev` library.\n * `libev` itself supports a number of system-specific backends (epoll, kqueue).\n *\n * This loop is known to work with PHP 5.4 through PHP 8+.\n *\n * @see http:\/\/php.net\/manual\/en\/book.ev.php\n * @see https:\/\/bitbucket.org\/osmanov\/pecl-ev\/overview\n *\/","19804":"\/**\n     * @var EvLoop\n     *\/","19805":"\/**\n     * @var FutureTickQueue\n     *\/","19806":"\/**\n     * @var SplObjectStorage\n     *\/","19807":"\/**\n     * @var EvIo[]\n     *\/","19810":"\/**\n     * @var SignalsHandler\n     *\/","19811":"\/**\n     * @var \\EvSignal[]\n     *\/","19812":"\/**\n     * @param resource $stream\n     * @param callable $listener\n     *\n     * @return \\Closure\n     *\/","19813":"\/**\n * An `ext-event` based event loop.\n *\n * This uses the [`event` PECL extension](https:\/\/pecl.php.net\/package\/event),\n * that provides an interface to `libevent` library.\n * `libevent` itself supports a number of system-specific backends (epoll, kqueue).\n *\n * This loop is known to work with PHP 5.4 through PHP 8+.\n *\n * @link https:\/\/pecl.php.net\/package\/event\n *\/","19814":"\/**\n     * Schedule a timer for execution.\n     *\n     * @param TimerInterface $timer\n     *\/","19815":"\/**\n     * Create a callback used as the target of timer events.\n     *\n     * A reference is kept to the callback for the lifetime of the loop\n     * to prevent \"Cannot destroy active lambda function\" fatal error from\n     * the event extension.\n     *\/","19816":"\/**\n     * Create a callback used as the target of stream events.\n     *\n     * A reference is kept to the callback for the lifetime of the loop\n     * to prevent \"Cannot destroy active lambda function\" fatal error from\n     * the event extension.\n     *\/","19817":"\/**\n * [Deprecated] An `ext-libev` based event loop.\n *\n * This uses an [unofficial `libev` extension](https:\/\/github.com\/m4rw3r\/php-libev),\n * that provides an interface to `libev` library.\n * `libev` itself supports a number of system-specific backends (epoll, kqueue).\n *\n * This loop does only work with PHP 5.\n * An update for PHP 7 is [unlikely](https:\/\/github.com\/m4rw3r\/php-libev\/issues\/8)\n * to happen any time soon.\n *\n * @see https:\/\/github.com\/m4rw3r\/php-libev\n * @see https:\/\/gist.github.com\/1688204\n * @deprecated 1.2.0, use [`ExtEvLoop`](#extevloop) instead.\n *\/","19818":"\/**\n * [Deprecated] An `ext-libevent` based event loop.\n *\n * This uses the [`libevent` PECL extension](https:\/\/pecl.php.net\/package\/libevent),\n * that provides an interface to `libevent` library.\n * `libevent` itself supports a number of system-specific backends (epoll, kqueue).\n *\n * This event loop does only work with PHP 5.\n * An [unofficial update](https:\/\/github.com\/php\/pecl-event-libevent\/pull\/2) for\n * PHP 7 does exist, but it is known to cause regular crashes due to `SEGFAULT`s.\n * To reiterate: Using this event loop on PHP 7 is not recommended.\n * Accordingly, neither the [`Loop` class](#loop) nor the deprecated\n * [`Factory` class](#factory) will try to use this event loop on PHP 7.\n *\n * This event loop is known to trigger a readable listener only if\n * the stream *becomes* readable (edge-triggered) and may not trigger if the\n * stream has already been readable from the beginning.\n * This also implies that a stream may not be recognized as readable when data\n * is still left in PHP's internal stream buffers.\n * As such, it's recommended to use `stream_set_read_buffer($stream, 0);`\n * to disable PHP's internal read buffer in this case.\n * See also [`addReadStream()`](#addreadstream) for more details.\n *\n * @link https:\/\/pecl.php.net\/package\/libevent\n * @deprecated 1.2.0, use [`ExtEventLoop`](#exteventloop) instead.\n *\/","19823":"\/**\n * An `ext-uv` based event loop.\n *\n * This loop uses the [`uv` PECL extension](https:\/\/pecl.php.net\/package\/uv),\n * that provides an interface to `libuv` library.\n * `libuv` itself supports a number of system-specific backends (epoll, kqueue).\n *\n * This loop is known to work with PHP 7+.\n *\n * @see https:\/\/github.com\/bwoebi\/php-uv\n *\/","19824":"\/**\n     * Returns the underlying ext-uv event loop. (Internal ReactPHP use only.)\n     *\n     * @internal\n     *\n     * @return resource\n     *\/","19835":"\/**\n     * Create a stream listener\n     *\n     * @return callable Returns a callback\n     *\/","19836":"\/**\n     * @param float $interval\n     * @return int\n     *\/","19837":"\/**\n * [Deprecated] The `Factory` class exists as a convenient way to pick the best available event loop implementation.\n *\n * @deprecated 1.2.0 See Loop instead.\n * @see Loop\n *\/","19838":"\/**\n     * [Deprecated] Creates a new event loop instance\n     *\n     * ```php\n     * \/\/ deprecated\n     * $loop = React\\EventLoop\\Factory::create();\n     *\n     * \/\/ new\n     * $loop = React\\EventLoop\\Loop::get();\n     * ```\n     *\n     * This method always returns an instance implementing `LoopInterface`,\n     * the actual event loop implementation is an implementation detail.\n     *\n     * This method should usually only be called once at the beginning of the program.\n     *\n     * @deprecated 1.2.0 See Loop::get() instead.\n     * @see Loop::get()\n     *\n     * @return LoopInterface\n     *\/","19839":"\/**\n     * @internal\n     * @return LoopInterface\n     *\/","19840":"\/**\n * The `Loop` class exists as a convenient way to get the currently relevant loop\n *\/","19841":"\/**\n     * @var ?LoopInterface\n     *\/","19843":"\/**\n     * Returns the event loop.\n     * When no loop is set, it will call the factory to create one.\n     *\n     * This method always returns an instance implementing `LoopInterface`,\n     * the actual event loop implementation is an implementation detail.\n     *\n     * This method is the preferred way to get the event loop and using\n     * Factory::create has been deprecated.\n     *\n     * @return LoopInterface\n     *\/","19844":"\/**\n     * Internal undocumented method, behavior might change or throw in the\n     * future. Use with caution and at your own risk.\n     *\n     * @internal\n     * @return void\n     *\/","19845":"\/**\n     * [Advanced] Register a listener to be notified when a stream is ready to read.\n     *\n     * @param resource $stream\n     * @param callable $listener\n     * @return void\n     * @throws \\Exception\n     * @see LoopInterface::addReadStream()\n     *\/","19846":"\/**\n     * [Advanced] Register a listener to be notified when a stream is ready to write.\n     *\n     * @param resource $stream\n     * @param callable $listener\n     * @return void\n     * @throws \\Exception\n     * @see LoopInterface::addWriteStream()\n     *\/","19847":"\/**\n     * Remove the read event listener for the given stream.\n     *\n     * @param resource $stream\n     * @return void\n     * @see LoopInterface::removeReadStream()\n     *\/","19848":"\/**\n     * Remove the write event listener for the given stream.\n     *\n     * @param resource $stream\n     * @return void\n     * @see LoopInterface::removeWriteStream()\n     *\/","19849":"\/**\n     * Enqueue a callback to be invoked once after the given interval.\n     *\n     * @param float $interval\n     * @param callable $callback\n     * @return TimerInterface\n     * @see LoopInterface::addTimer()\n     *\/","19850":"\/**\n     * Enqueue a callback to be invoked repeatedly after the given interval.\n     *\n     * @param float $interval\n     * @param callable $callback\n     * @return TimerInterface\n     * @see LoopInterface::addPeriodicTimer()\n     *\/","19851":"\/**\n     * Cancel a pending timer.\n     *\n     * @param TimerInterface $timer\n     * @return void\n     * @see LoopInterface::cancelTimer()\n     *\/","19852":"\/**\n     * Schedule a callback to be invoked on a future tick of the event loop.\n     *\n     * @param callable $listener\n     * @return void\n     * @see LoopInterface::futureTick()\n     *\/","19853":"\/**\n     * Register a listener to be notified when a signal has been caught by this process.\n     *\n     * @param int $signal\n     * @param callable $listener\n     * @return void\n     * @see LoopInterface::addSignal()\n     *\/","19854":"\/**\n     * Removes a previously added signal listener.\n     *\n     * @param int $signal\n     * @param callable $listener\n     * @return void\n     * @see LoopInterface::removeSignal()\n     *\/","19855":"\/**\n     * Run the event loop until there are no more tasks to perform.\n     *\n     * @return void\n     * @see LoopInterface::run()\n     *\/","19856":"\/**\n     * Instruct a running event loop to stop.\n     *\n     * @return void\n     * @see LoopInterface::stop()\n     *\/","19857":"\/**\n     * [Advanced] Register a listener to be notified when a stream is ready to read.\n     *\n     * Note that this low-level API is considered advanced usage.\n     * Most use cases should probably use the higher-level\n     * [readable Stream API](https:\/\/github.com\/reactphp\/stream#readablestreaminterface)\n     * instead.\n     *\n     * The first parameter MUST be a valid stream resource that supports\n     * checking whether it is ready to read by this loop implementation.\n     * A single stream resource MUST NOT be added more than once.\n     * Instead, either call [`removeReadStream()`](#removereadstream) first or\n     * react to this event with a single listener and then dispatch from this\n     * listener. This method MAY throw an `Exception` if the given resource type\n     * is not supported by this loop implementation.\n     *\n     * The second parameter MUST be a listener callback function that accepts\n     * the stream resource as its only parameter.\n     * If you don't use the stream resource inside your listener callback function\n     * you MAY use a function which has no parameters at all.\n     *\n     * The listener callback function MUST NOT throw an `Exception`.\n     * The return value of the listener callback function will be ignored and has\n     * no effect, so for performance reasons you're recommended to not return\n     * any excessive data structures.\n     *\n     * If you want to access any variables within your callback function, you\n     * can bind arbitrary data to a callback closure like this:\n     *\n     * ```php\n     * $loop->addReadStream($stream, function ($stream) use ($name) {\n     *     echo $name . ' said: ' . fread($stream);\n     * });\n     * ```\n     *\n     * See also [example #11](examples).\n     *\n     * You can invoke [`removeReadStream()`](#removereadstream) to remove the\n     * read event listener for this stream.\n     *\n     * The execution order of listeners when multiple streams become ready at\n     * the same time is not guaranteed.\n     *\n     * @param resource $stream   The PHP stream resource to check.\n     * @param callable $listener Invoked when the stream is ready.\n     * @throws \\Exception if the given resource type is not supported by this loop implementation\n     * @see self::removeReadStream()\n     *\/","19858":"\/**\n     * [Advanced] Register a listener to be notified when a stream is ready to write.\n     *\n     * Note that this low-level API is considered advanced usage.\n     * Most use cases should probably use the higher-level\n     * [writable Stream API](https:\/\/github.com\/reactphp\/stream#writablestreaminterface)\n     * instead.\n     *\n     * The first parameter MUST be a valid stream resource that supports\n     * checking whether it is ready to write by this loop implementation.\n     * A single stream resource MUST NOT be added more than once.\n     * Instead, either call [`removeWriteStream()`](#removewritestream) first or\n     * react to this event with a single listener and then dispatch from this\n     * listener. This method MAY throw an `Exception` if the given resource type\n     * is not supported by this loop implementation.\n     *\n     * The second parameter MUST be a listener callback function that accepts\n     * the stream resource as its only parameter.\n     * If you don't use the stream resource inside your listener callback function\n     * you MAY use a function which has no parameters at all.\n     *\n     * The listener callback function MUST NOT throw an `Exception`.\n     * The return value of the listener callback function will be ignored and has\n     * no effect, so for performance reasons you're recommended to not return\n     * any excessive data structures.\n     *\n     * If you want to access any variables within your callback function, you\n     * can bind arbitrary data to a callback closure like this:\n     *\n     * ```php\n     * $loop->addWriteStream($stream, function ($stream) use ($name) {\n     *     fwrite($stream, 'Hello ' . $name);\n     * });\n     * ```\n     *\n     * See also [example #12](examples).\n     *\n     * You can invoke [`removeWriteStream()`](#removewritestream) to remove the\n     * write event listener for this stream.\n     *\n     * The execution order of listeners when multiple streams become ready at\n     * the same time is not guaranteed.\n     *\n     * Some event loop implementations are known to only trigger the listener if\n     * the stream *becomes* readable (edge-triggered) and may not trigger if the\n     * stream has already been readable from the beginning.\n     * This also implies that a stream may not be recognized as readable when data\n     * is still left in PHP's internal stream buffers.\n     * As such, it's recommended to use `stream_set_read_buffer($stream, 0);`\n     * to disable PHP's internal read buffer in this case.\n     *\n     * @param resource $stream   The PHP stream resource to check.\n     * @param callable $listener Invoked when the stream is ready.\n     * @throws \\Exception if the given resource type is not supported by this loop implementation\n     * @see self::removeWriteStream()\n     *\/","19859":"\/**\n     * Remove the read event listener for the given stream.\n     *\n     * Removing a stream from the loop that has already been removed or trying\n     * to remove a stream that was never added or is invalid has no effect.\n     *\n     * @param resource $stream The PHP stream resource.\n     *\/"}
diff --git a/tests/Bench/FullQualified/FullQualifiedBenchCase.php b/tests/Bench/FullQualified/FullQualifiedBenchCase.php
new file mode 100644
index 0000000..5d65df4
--- /dev/null
+++ b/tests/Bench/FullQualified/FullQualifiedBenchCase.php
@@ -0,0 +1,26 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Bench\FullQualified;
+
+abstract class FullQualifiedBenchCase
+{
+    public const PARSING_SAMPLES = [
+        'number_of()                  Testing',
+        'number_of()',
+        'Path\To\Function\number_of() Description',
+        'MyClass::$items              Property',
+        'Path\To\MyClass::$items      For the property whose items are counted.',
+        'MyClass::setItems()          To set the items for this collection.',
+        'Example\MyClass::setItems()',
+        'https://example.com/my/bar link',
+        'Some::ANY_* test',
+        'non-empty-string\ololo::ANY_* test',
+        'Some::ANY_*_OLOLO test42',
+        'PSR\Documentation\API',
+        'doc://getting-started/index Getting started document.',
+    ];
+
+    abstract public function benchIdentifierReading(): void;
+}
diff --git a/tests/Bench/FullQualified/FullTokenizerBench.php b/tests/Bench/FullQualified/FullTokenizerBench.php
new file mode 100644
index 0000000..1880c9f
--- /dev/null
+++ b/tests/Bench/FullQualified/FullTokenizerBench.php
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Bench\FullQualified;
+
+use PhpBench\Attributes\Iterations;
+use PhpBench\Attributes\Revs;
+use PhpBench\Attributes\Warmup;
+
+#[Revs(10), Warmup(5), Iterations(100)]
+final class FullTokenizerBench extends FullQualifiedBenchCase
+{
+    private const T_FQN = '(?:[\\]?+[a-zA-Z\x80-\xFF_][0-9a-zA-Z\x80-\xFF_-]*+)++';
+    private const T_IDENTIFIER = '[a-zA-Z_\\x80-\\xff][a-zA-Z0-9\\-_\\x80-\\xff]*+';
+
+    private const SIMPLE_TOKENIZER_PCRE = '/\\G(?'
+        . '|(?:(?:'. self::T_FQN . '::\\$' . self::T_IDENTIFIER . ')(*MARK:T_PROPERTY))'
+        . '|(?:(?:'. self::T_FQN . '::' . self::T_IDENTIFIER . '\(\))(*MARK:T_METHOD))'
+        . '|(?:(?:'. self::T_FQN . '::' . self::T_IDENTIFIER . ')(*MARK:T_CONSTANT))'
+        . '|(?:(?:\\$'. self::T_IDENTIFIER . ')(*MARK:T_VARIABLE))'
+        . '|(?:(?:'. self::T_FQN . '\(\))(*MARK:T_FUNCTION))'
+        . '|(?:(?:'. self::T_FQN . ')(*MARK:T_IDENTIFIER))'
+    . ')/Ssum';
+
+    public function benchIdentifierReading(): void
+    {
+        foreach (self::PARSING_SAMPLES as $sample) {
+            \preg_match_all(self::SIMPLE_TOKENIZER_PCRE, $sample, $matches);
+
+            if ($matches[0] !== []) {
+                $__result = $matches[0][0];
+            }
+        }
+    }
+}
diff --git a/tests/Bench/FullQualified/InArrayBench.php b/tests/Bench/FullQualified/InArrayBench.php
new file mode 100644
index 0000000..798f3c0
--- /dev/null
+++ b/tests/Bench/FullQualified/InArrayBench.php
@@ -0,0 +1,94 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Bench\FullQualified;
+
+use PhpBench\Attributes\Iterations;
+use PhpBench\Attributes\Revs;
+use PhpBench\Attributes\Warmup;
+
+#[Revs(10), Warmup(5), Iterations(100)]
+final class InArrayBench extends FullQualifiedBenchCase
+{
+    public const CHARSET = [
+        '_',
+        '-',
+        '\\',
+        'A',
+        'B',
+        'C',
+        'D',
+        'E',
+        'F',
+        'G',
+        'H',
+        'I',
+        'J',
+        'K',
+        'L',
+        'M',
+        'N',
+        'O',
+        'P',
+        'Q',
+        'R',
+        'S',
+        'T',
+        'U',
+        'V',
+        'W',
+        'X',
+        'Y',
+        'Z',
+        'a',
+        'b',
+        'c',
+        'd',
+        'e',
+        'f',
+        'g',
+        'h',
+        'i',
+        'j',
+        'k',
+        'l',
+        'm',
+        'n',
+        'o',
+        'p',
+        'q',
+        'r',
+        's',
+        't',
+        'u',
+        'v',
+        'w',
+        'x',
+        'y',
+        'z',
+        '0',
+        '1',
+        '2',
+        '3',
+        '4',
+        '5',
+        '6',
+        '7',
+        '8',
+        '9',
+    ];
+
+    public function benchIdentifierReading(): void
+    {
+        foreach (self::PARSING_SAMPLES as $sample) {
+            for ($offset = 0, $length = \strlen($sample); $offset < $length; $offset++) {
+                if (!\in_array($sample[$offset], self::CHARSET, true)) {
+                    break;
+                }
+            }
+
+            $__result = \substr($sample, 0, $offset);
+        }
+    }
+}
diff --git a/tests/Bench/FullQualified/IssetBench.php b/tests/Bench/FullQualified/IssetBench.php
new file mode 100644
index 0000000..dc771eb
--- /dev/null
+++ b/tests/Bench/FullQualified/IssetBench.php
@@ -0,0 +1,94 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Bench\FullQualified;
+
+use PhpBench\Attributes\Iterations;
+use PhpBench\Attributes\Revs;
+use PhpBench\Attributes\Warmup;
+
+#[Revs(10), Warmup(5), Iterations(100)]
+final class IssetBench extends FullQualifiedBenchCase
+{
+    public const CHARSET = [
+        '_' => true,
+        '-' => true,
+        '\\' => true,
+        'A' => true,
+        'B' => true,
+        'C' => true,
+        'D' => true,
+        'E' => true,
+        'F' => true,
+        'G' => true,
+        'H' => true,
+        'I' => true,
+        'J' => true,
+        'K' => true,
+        'L' => true,
+        'M' => true,
+        'N' => true,
+        'O' => true,
+        'P' => true,
+        'Q' => true,
+        'R' => true,
+        'S' => true,
+        'T' => true,
+        'U' => true,
+        'V' => true,
+        'W' => true,
+        'X' => true,
+        'Y' => true,
+        'Z' => true,
+        'a' => true,
+        'b' => true,
+        'c' => true,
+        'd' => true,
+        'e' => true,
+        'f' => true,
+        'g' => true,
+        'h' => true,
+        'i' => true,
+        'j' => true,
+        'k' => true,
+        'l' => true,
+        'm' => true,
+        'n' => true,
+        'o' => true,
+        'p' => true,
+        'q' => true,
+        'r' => true,
+        's' => true,
+        't' => true,
+        'u' => true,
+        'v' => true,
+        'w' => true,
+        'x' => true,
+        'y' => true,
+        'z' => true,
+        '0' => true,
+        '1' => true,
+        '2' => true,
+        '3' => true,
+        '4' => true,
+        '5' => true,
+        '6' => true,
+        '7' => true,
+        '8' => true,
+        '9' => true,
+    ];
+
+    public function benchIdentifierReading(): void
+    {
+        foreach (self::PARSING_SAMPLES as $sample) {
+            for ($offset = 0, $length = \strlen($sample); $offset < $length; $offset++) {
+                if (!isset(self::CHARSET[$sample[$offset]])) {
+                    break;
+                }
+            }
+
+            $__result = \substr($sample, 0, $offset);
+        }
+    }
+}
diff --git a/tests/Bench/FullQualified/LTrimBench.php b/tests/Bench/FullQualified/LTrimBench.php
new file mode 100644
index 0000000..2499ce0
--- /dev/null
+++ b/tests/Bench/FullQualified/LTrimBench.php
@@ -0,0 +1,27 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Bench\FullQualified;
+
+use PhpBench\Attributes\Iterations;
+use PhpBench\Attributes\Revs;
+use PhpBench\Attributes\Warmup;
+
+#[Revs(10), Warmup(5), Iterations(100)]
+final class LTrimBench extends FullQualifiedBenchCase
+{
+    public const CHARSET = '_-\\'
+        . 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+        . 'abcdefghijklmnopqrstuvwxyz'
+        . '0123456789';
+
+    public function benchIdentifierReading(): void
+    {
+        foreach (self::PARSING_SAMPLES as $sample) {
+            $length = \strlen($sample);
+            $after = \strlen(\ltrim($sample, self::CHARSET));
+            $__result = \substr($sample, $length, $after);
+        }
+    }
+}
diff --git a/tests/Bench/FullQualified/PhpTokenizerBench.php b/tests/Bench/FullQualified/PhpTokenizerBench.php
new file mode 100644
index 0000000..4c553e5
--- /dev/null
+++ b/tests/Bench/FullQualified/PhpTokenizerBench.php
@@ -0,0 +1,32 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Bench\FullQualified;
+
+use PhpBench\Attributes\Iterations;
+use PhpBench\Attributes\Revs;
+use PhpBench\Attributes\Warmup;
+
+#[Revs(10), Warmup(5), Iterations(100)]
+final class PhpTokenizerBench extends FullQualifiedBenchCase
+{
+    public function benchIdentifierReading(): void
+    {
+        foreach (self::PARSING_SAMPLES as $sample) {
+            foreach (\PhpToken::tokenize('<?php ' . $sample) as $token) {
+                if ($token->id === \T_OPEN_TAG) {
+                    continue;
+                }
+
+                if ($token->id === \T_NAME_QUALIFIED) {
+                    $__result = $token->text;
+                    break;
+                }
+
+                break;
+            }
+
+        }
+    }
+}
diff --git a/tests/Bench/FullQualified/RegexBench.php b/tests/Bench/FullQualified/RegexBench.php
new file mode 100644
index 0000000..ca2be77
--- /dev/null
+++ b/tests/Bench/FullQualified/RegexBench.php
@@ -0,0 +1,25 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Bench\FullQualified;
+
+use PhpBench\Attributes\Iterations;
+use PhpBench\Attributes\Revs;
+use PhpBench\Attributes\Warmup;
+
+#[Revs(10), Warmup(5), Iterations(100)]
+final class RegexBench extends FullQualifiedBenchCase
+{
+    private const PCRE = '/^'
+        . '\\\\?[a-zA-Z\\x80-\\xFF_][a-zA-Z0-9\\x80-\\xFF\\-_]'
+        .'*(?:\\\\[a-zA-Z\\x80-\\xFF_][a-zA-Z0-9\\x80-\\xFF\\-_]*)*'
+        . '/u';
+
+    public function benchIdentifierReading(): void
+    {
+        foreach (self::PARSING_SAMPLES as $sample) {
+            \preg_match(self::PCRE, $sample, $__result);
+        }
+    }
+}
diff --git a/tests/Bench/FullQualified/RegexPHPStanLikeBench.php b/tests/Bench/FullQualified/RegexPHPStanLikeBench.php
new file mode 100644
index 0000000..2eddb80
--- /dev/null
+++ b/tests/Bench/FullQualified/RegexPHPStanLikeBench.php
@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Bench\FullQualified;
+
+use PhpBench\Attributes\Iterations;
+use PhpBench\Attributes\Revs;
+use PhpBench\Attributes\Warmup;
+
+#[Revs(10), Warmup(5), Iterations(100)]
+final class RegexPHPStanLikeBench extends FullQualifiedBenchCase
+{
+    private const PCRE = '/^(?:[\\]?+[a-zA-Z\x80-\xFF_][0-9a-zA-Z\x80-\xFF_-]*+)++/u';
+
+    public function benchIdentifierReading(): void
+    {
+        foreach (self::PARSING_SAMPLES as $sample) {
+            \preg_match(self::PCRE, $sample, $__result);
+        }
+    }
+}
diff --git a/tests/Bench/FullQualified/RegexTokenizerBench.php b/tests/Bench/FullQualified/RegexTokenizerBench.php
new file mode 100644
index 0000000..4eadd87
--- /dev/null
+++ b/tests/Bench/FullQualified/RegexTokenizerBench.php
@@ -0,0 +1,45 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Bench\FullQualified;
+
+use PhpBench\Attributes\Iterations;
+use PhpBench\Attributes\Revs;
+use PhpBench\Attributes\Warmup;
+
+#[Revs(10), Warmup(5), Iterations(100)]
+final class RegexTokenizerBench extends FullQualifiedBenchCase
+{
+    private const SIMPLE_TOKENIZER_PCRE = '/\\G(?'
+        . '|(?:(?:\\$[a-zA-Z_\\x80-\\xff][a-zA-Z0-9\\-_\\x80-\\xff]*)(*MARK:T_VARIABLE))'
+        . '|(?:(?:[a-zA-Z_\\x80-\\xff][a-zA-Z0-9\\-_\\x80-\\xff]*)(*MARK:T_NAME))'
+        . '|(?:(?:\\()(*MARK:T_PARENTHESIS_OPEN))'
+        . '|(?:(?:\\))(*MARK:T_PARENTHESIS_CLOSE))'
+        . '|(?:(?:::)(*MARK:T_DOUBLE_COLON))'
+        . '|(?:(?:\\\\)(*MARK:T_NS_DELIMITER))'
+        . '|(?:(?:\\|)(*MARK:T_OR))'
+        . '|(?:(?:(\\/\\/|#).+?$)(*MARK:T_COMMENT))'
+        . '|(?:(?:\\/\\*.*?\\*\\/)(*MARK:T_DOC_COMMENT))'
+        . '|(?:(?:(\\xfe\\xff|\\x20|\\x09|\\x0a|\\x0d)+)(*MARK:T_WHITESPACE))'
+        . '|(?:(?:.+?)(*MARK:T_OTHER))'
+    . ')/Ssum';
+
+    public function benchIdentifierReading(): void
+    {
+        foreach (self::PARSING_SAMPLES as $sample) {
+            \preg_match_all(self::SIMPLE_TOKENIZER_PCRE, $sample, $matches, \PREG_SET_ORDER);
+            $__result = '';
+
+            foreach ($matches as ['MARK' => $name, 0 => $value]) {
+                if ($name === 'T_NAME' || $name === 'T_NS_DELIMITER') {
+                    continue;
+                }
+
+                $__result .= $value;
+
+                break;
+            }
+        }
+    }
+}
diff --git a/tests/Bench/FullQualified/TypeLangLexerBench.php b/tests/Bench/FullQualified/TypeLangLexerBench.php
new file mode 100644
index 0000000..ff114fa
--- /dev/null
+++ b/tests/Bench/FullQualified/TypeLangLexerBench.php
@@ -0,0 +1,41 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Bench\FullQualified;
+
+use PhpBench\Attributes\Iterations;
+use PhpBench\Attributes\Revs;
+use PhpBench\Attributes\Warmup;
+use Phplrt\Lexer\Lexer;
+use TypeLang\Parser\Parser;
+
+#[Revs(10), Warmup(5), Iterations(100)]
+final class TypeLangLexerBench extends FullQualifiedBenchCase
+{
+    private readonly Lexer $lexer;
+
+    public function __construct()
+    {
+        $parser = new Parser();
+
+        $this->lexer = (new \ReflectionClass(Parser::class))
+            ->getProperty('lexer')
+            ->getValue($parser);
+    }
+
+    public function benchIdentifierReading(): void
+    {
+        foreach (self::PARSING_SAMPLES as $sample) {
+            foreach ($this->lexer->lex($sample) as $token) {
+                $isValidToken = $token->getName() === 'T_NAME'
+                    || $token->getName() === 'T_NAME_WITH_SPACE'
+                    || $token->getName() === 'T_NS_DELIMITER';
+
+                if (!$isValidToken) {
+                    break;
+                }
+            }
+        }
+    }
+}
diff --git a/tests/Bench/FullQualified/TypeLangParserBench.php b/tests/Bench/FullQualified/TypeLangParserBench.php
new file mode 100644
index 0000000..2c539d0
--- /dev/null
+++ b/tests/Bench/FullQualified/TypeLangParserBench.php
@@ -0,0 +1,28 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Bench\FullQualified;
+
+use PhpBench\Attributes\Iterations;
+use PhpBench\Attributes\Revs;
+use PhpBench\Attributes\Warmup;
+use TypeLang\Parser\Parser;
+
+#[Revs(10), Warmup(5), Iterations(100)]
+final class TypeLangParserBench extends FullQualifiedBenchCase
+{
+    private readonly Parser $parser;
+
+    public function __construct()
+    {
+        $this->parser = new Parser(tolerant: true);
+    }
+
+    public function benchIdentifierReading(): void
+    {
+        foreach (self::PARSING_SAMPLES as $sample) {
+            $__result = $this->parser->parse($sample);
+        }
+    }
+}
diff --git a/tests/Concerns/InteractWithParser.php b/tests/Concerns/InteractWithParser.php
new file mode 100644
index 0000000..b1af2f0
--- /dev/null
+++ b/tests/Concerns/InteractWithParser.php
@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Concerns;
+
+use PHPUnit\Framework\Assert;
+use PHPUnit\Framework\TestCase;
+use TypeLang\Parser\Node\Stmt\TypeStatement;
+use TypeLang\Parser\Traverser;
+
+/**
+ * @mixin TestCase
+ */
+trait InteractWithParser
+{
+    protected static function getTypeStatementAsString(TypeStatement $type): ?string
+    {
+        Traverser::new([$visitor = new Traverser\StringDumperVisitor()])
+            ->traverse([$type]);
+
+        return \trim($visitor->getOutput());
+    }
+
+    protected static function assertTypeStatementSame(TypeStatement $type, string $expected, string $message = ''): void
+    {
+        $actual = \trim(static::getTypeStatementAsString($type));
+
+        Assert::assertSame(\trim($expected), $actual, $message);
+    }
+
+    protected static function assertTypeStatementNotSame(TypeStatement $type, string $expected, string $message = ''): void
+    {
+        $actual = \trim(static::getTypeStatementAsString($type));
+
+        Assert::assertNotSame(\trim($expected), $actual, $message);
+    }
+}
diff --git a/tests/Functional/Tag/MethodTagTest.php b/tests/Functional/Tag/MethodTagTest.php
new file mode 100644
index 0000000..374bc9b
--- /dev/null
+++ b/tests/Functional/Tag/MethodTagTest.php
@@ -0,0 +1,241 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Functional\Tag;
+
+use TypeLang\Parser\Node\Literal\VariableLiteralNode;
+use TypeLang\Parser\Node\Stmt\Callable\CallableParameterNode;
+use TypeLang\PHPDoc\DocBlock\Description\Description;
+use TypeLang\PHPDoc\DocBlock\Tag\InvalidTag;
+use TypeLang\PHPDoc\DocBlock\Tag\MethodTag\MethodTag;
+
+final class MethodTagTest extends TagTestCase
+{
+    public function testEmptyTag(): void
+    {
+        $tag = $this->parseTag('@method');
+
+        self::assertInstanceOf(InvalidTag::class, $tag);
+        self::assertSame('Tag @method expects the type to be defined', $tag->reason->getMessage());
+        self::assertNull($tag->description);
+    }
+
+    public function testTagWithModifier(): void
+    {
+        $tag = $this->parseTag('@method static');
+
+        self::assertInstanceOf(InvalidTag::class, $tag);
+        self::assertSame('Tag @method must contain the method signature', $tag->reason->getMessage());
+        self::assertEquals(new Description('static'), $tag->description);
+    }
+
+    public function testTagWithDescription(): void
+    {
+        $tag = $this->parseTag('@method description');
+
+        self::assertInstanceOf(InvalidTag::class, $tag);
+        self::assertSame('Tag @method must contain the method signature', $tag->reason->getMessage());
+        self::assertEquals(new Description('description'), $tag->description);
+    }
+
+    public function testTagWithModifierAndDescription(): void
+    {
+        $tag = $this->parseTag('@method static description');
+
+        self::assertInstanceOf(InvalidTag::class, $tag);
+        self::assertSame('Tag @method must contain the method signature', $tag->reason->getMessage());
+        self::assertEquals(new Description('static description'), $tag->description);
+    }
+
+    public function testTagWithInvalidCallableName(): void
+    {
+        $tag = $this->parseTag('@method Foo\Some\foo()');
+
+        self::assertInstanceOf(InvalidTag::class, $tag);
+        self::assertSame('Tag @method must contain the method name, but FQN "Foo\Some\foo" given', $tag->reason->getMessage());
+        self::assertEquals(new Description('Foo\Some\foo()'), $tag->description);
+    }
+
+    public function testTagWithCallable(): void
+    {
+        $tag = $this->parseTag('@method foo()');
+
+        self::assertInstanceOf(MethodTag::class, $tag);
+        self::assertSame('foo', $tag->method);
+        self::assertNull($tag->type);
+        self::assertSame([], $tag->parameters);
+        self::assertFalse($tag->isStatic);
+        self::assertNull($tag->description);
+    }
+
+    public function testTagWithCallableAndDescription(): void
+    {
+        $tag = $this->parseTag('@method foo() description');
+
+        self::assertInstanceOf(MethodTag::class, $tag);
+        self::assertSame('foo', $tag->method);
+        self::assertNull($tag->type);
+        self::assertSame([], $tag->parameters);
+        self::assertFalse($tag->isStatic);
+        self::assertEquals(new Description('description'), $tag->description);
+    }
+
+    public function testTagWithModifierAndCallable(): void
+    {
+        $tag = $this->parseTag('@method static foo()');
+
+        self::assertInstanceOf(MethodTag::class, $tag);
+        self::assertSame('foo', $tag->method);
+        self::assertNull($tag->type);
+        self::assertSame([], $tag->parameters);
+        self::assertTrue($tag->isStatic);
+        self::assertNull($tag->description);
+    }
+
+    public function testTagWithModifierAndCallableAndDescription(): void
+    {
+        $tag = $this->parseTag('@method static foo() description');
+
+        self::assertInstanceOf(MethodTag::class, $tag);
+        self::assertSame('foo', $tag->method);
+        self::assertNull($tag->type);
+        self::assertSame([], $tag->parameters);
+        self::assertTrue($tag->isStatic);
+        self::assertEquals(new Description('description'), $tag->description);
+    }
+
+    public function testTagWithTypeAndCallable(): void
+    {
+        $tag = $this->parseTag('@method Type foo()');
+
+        self::assertInstanceOf(MethodTag::class, $tag);
+        self::assertSame('foo', $tag->method);
+        self::assertNotNull($tag->type);
+        self::assertTypeStatementSame($tag->type, <<<'TYPE'
+            Stmt\NamedTypeNode
+              Name(Type)
+                Identifier(Type)
+            TYPE);
+        self::assertSame([], $tag->parameters);
+        self::assertFalse($tag->isStatic);
+        self::assertNull($tag->description);
+    }
+
+    public function testTagWithDefaultTypeAndModifierAndCallable(): void
+    {
+        $tag = $this->parseTag('@method static static foo()');
+
+        self::assertInstanceOf(MethodTag::class, $tag);
+        self::assertSame('foo', $tag->method);
+        self::assertNotNull($tag->type);
+        self::assertTypeStatementSame($tag->type, <<<'TYPE'
+            Stmt\NamedTypeNode
+              Name(static)
+                Identifier(static)
+            TYPE);
+        self::assertSame([], $tag->parameters);
+        self::assertTrue($tag->isStatic);
+        self::assertNull($tag->description);
+    }
+
+    public function testTagWithAlternativeTypeAndModifierAndCallable(): void
+    {
+        $tag = $this->parseTag('@method static foo(): static');
+
+        self::assertInstanceOf(MethodTag::class, $tag);
+        self::assertSame('foo', $tag->method);
+        self::assertNotNull($tag->type);
+        self::assertTypeStatementSame($tag->type, <<<'TYPE'
+            Stmt\NamedTypeNode
+              Name(static)
+                Identifier(static)
+            TYPE);
+        self::assertSame([], $tag->parameters);
+        self::assertTrue($tag->isStatic);
+        self::assertNull($tag->description);
+    }
+
+    public function testTagWithDefaultAndAlternativeTypeAndModifierAndCallable(): void
+    {
+        $tag = $this->parseTag('@method static static foo(): static');
+
+        self::assertInstanceOf(InvalidTag::class, $tag);
+        self::assertSame('You can specify the return type of the '
+            . '@method tag before or after the method`s signature, but not both', $tag->reason->getMessage());
+        self::assertEquals(new Description('static static foo(): static'), $tag->description);
+    }
+
+    public function testTagWithCallableAndNamedParameter(): void
+    {
+        $tag = $this->parseTag('@method foo($param)');
+
+        self::assertInstanceOf(MethodTag::class, $tag);
+        self::assertSame('foo', $tag->method);
+        self::assertNull($tag->type);
+        self::assertTypeStatementSame($tag->parameters, <<<'TYPE'
+            Stmt\Callable\CallableParameterNode(simple)
+              Literal\VariableLiteralNode($param)
+            TYPE);
+        self::assertFalse($tag->isStatic);
+        self::assertNull($tag->description);
+    }
+
+    public function testTagWithCallableAndTypedNamedParameter(): void
+    {
+        $tag = $this->parseTag('@method foo(Type $param)');
+
+        self::assertInstanceOf(MethodTag::class, $tag);
+        self::assertSame('foo', $tag->method);
+        self::assertNull($tag->type);
+        self::assertTypeStatementSame($tag->parameters, <<<'TYPE'
+            Stmt\Callable\CallableParameterNode(simple)
+              Stmt\NamedTypeNode
+                Name(Type)
+                  Identifier(Type)
+              Literal\VariableLiteralNode($param)
+            TYPE);
+        self::assertFalse($tag->isStatic);
+        self::assertNull($tag->description);
+    }
+
+    public function testTagWithCallableAndTypedParameter(): void
+    {
+        $tag = $this->parseTag('@method foo(Type)');
+
+        self::assertInstanceOf(MethodTag::class, $tag);
+        self::assertSame('foo', $tag->method);
+        self::assertNull($tag->type);
+        self::assertTypeStatementSame($tag->parameters, <<<'TYPE'
+            Stmt\Callable\CallableParameterNode(simple)
+              Stmt\NamedTypeNode
+                Name(Type)
+                  Identifier(Type)
+            TYPE);
+        self::assertFalse($tag->isStatic);
+        self::assertNull($tag->description);
+    }
+
+    public function testTagWithFullDefinition(): void
+    {
+        $tag = $this->parseTag('@method static ReturnType foo(Type $param) Example');
+
+        self::assertInstanceOf(MethodTag::class, $tag);
+        self::assertSame('foo', $tag->method);
+        self::assertNotNull($tag->type);
+        self::assertTypeStatementSame($tag->type, <<<'TYPE'
+            Stmt\NamedTypeNode
+              Name(ReturnType)
+                Identifier(ReturnType)
+            TYPE);
+        self::assertTypeStatementSame($tag->parameters, <<<'TYPE'
+            Stmt\Callable\CallableParameterNode(simple)
+              Stmt\NamedTypeNode
+                Name(Type)
+                  Identifier(Type)
+              Literal\VariableLiteralNode($param)
+            TYPE);
+        self::assertTrue($tag->isStatic);
+        self::assertEquals(new Description('Example'), $tag->description);
+    }
+}
diff --git a/tests/Functional/Tag/ParamTagTest.php b/tests/Functional/Tag/ParamTagTest.php
new file mode 100644
index 0000000..74594bd
--- /dev/null
+++ b/tests/Functional/Tag/ParamTagTest.php
@@ -0,0 +1,280 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Functional\Tag;
+
+use TypeLang\PHPDoc\DocBlock\Description\Description;
+use TypeLang\PHPDoc\DocBlock\Tag\InvalidTag;
+use TypeLang\PHPDoc\DocBlock\Tag\ParamTag\ParamTag;
+
+final class ParamTagTest extends TagTestCase
+{
+    public function testEmptyTag(): void
+    {
+        $tag = $this->parseTag('@param');
+
+        self::assertInstanceOf(InvalidTag::class, $tag);
+        self::assertSame('Tag @param expects the type to be defined', $tag->reason->getMessage());
+        self::assertNull($tag->description);
+    }
+
+    public function testTagWithInvalidType(): void
+    {
+        $tag = $this->parseTag('@param <example>');
+
+        self::assertInstanceOf(InvalidTag::class, $tag);
+        self::assertSame('Tag @param contains an incorrect type "<example>"', $tag->reason->getMessage());
+        self::assertEquals(new Description('<example>'), $tag->description);
+    }
+
+    public function testWithType(): void
+    {
+        $tag = $this->parseTag('@param Link\To\Type');
+
+        self::assertInstanceOf(InvalidTag::class, $tag);
+        self::assertSame('Tag @param contains an incorrect variable name', $tag->reason->getMessage());
+        self::assertEquals(new Description('Link\To\Type'), $tag->description);
+    }
+
+    public function testWithTypeAndDescription(): void
+    {
+        $tag = $this->parseTag('@param type description');
+
+        self::assertInstanceOf(InvalidTag::class, $tag);
+        self::assertSame('Tag @param contains an incorrect variable name', $tag->reason->getMessage());
+        self::assertEquals(new Description('type description'), $tag->description);
+    }
+
+    public function testWithVariable(): void
+    {
+        $tag = $this->parseTag('@param $var');
+
+        self::assertInstanceOf(ParamTag::class, $tag);
+        self::assertNull($tag->type);
+        self::assertSame('var', $tag->variable);
+        self::assertFalse($tag->isOutput);
+        self::assertFalse($tag->isVariadic);
+        self::assertNull($tag->description);
+    }
+
+    public function testWithTypeAndVariable(): void
+    {
+        $tag = $this->parseTag('@param type $var');
+
+        self::assertInstanceOf(ParamTag::class, $tag);
+        self::assertNotNull($tag->type);
+        self::assertTypeStatementSame($tag->type, <<<'TYPE'
+            Stmt\NamedTypeNode
+              Name(type)
+                Identifier(type)
+            TYPE);
+        self::assertSame('var', $tag->variable);
+        self::assertFalse($tag->isOutput);
+        self::assertFalse($tag->isVariadic);
+        self::assertNull($tag->description);
+    }
+
+    public function testWithVariableAndDescription(): void
+    {
+        $tag = $this->parseTag('@param $var description');
+
+        self::assertInstanceOf(ParamTag::class, $tag);
+        self::assertNull($tag->type);
+        self::assertSame('var', $tag->variable);
+        self::assertFalse($tag->isOutput);
+        self::assertFalse($tag->isVariadic);
+        self::assertEquals(new Description('description'), $tag->description);
+    }
+
+    public function testWithTypeAndVariableAndDescription(): void
+    {
+        $tag = $this->parseTag('@param type $var description');
+
+        self::assertInstanceOf(ParamTag::class, $tag);
+        self::assertNotNull($tag->type);
+        self::assertTypeStatementSame($tag->type, <<<'TYPE'
+            Stmt\NamedTypeNode
+              Name(type)
+                Identifier(type)
+            TYPE);
+        self::assertSame('var', $tag->variable);
+        self::assertFalse($tag->isOutput);
+        self::assertFalse($tag->isVariadic);
+        self::assertEquals(new Description('description'), $tag->description);
+    }
+
+    public function testWithVariadicVariable(): void
+    {
+        $tag = $this->parseTag('@param ...$var');
+
+        self::assertInstanceOf(ParamTag::class, $tag);
+        self::assertNull($tag->type);
+        self::assertSame('var', $tag->variable);
+        self::assertFalse($tag->isOutput);
+        self::assertTrue($tag->isVariadic);
+        self::assertNull($tag->description);
+    }
+
+    public function testWithTypeAndVariadicVariable(): void
+    {
+        $tag = $this->parseTag('@param type ...$var');
+
+        self::assertInstanceOf(ParamTag::class, $tag);
+        self::assertNotNull($tag->type);
+        self::assertTypeStatementSame($tag->type, <<<'TYPE'
+            Stmt\NamedTypeNode
+              Name(type)
+                Identifier(type)
+            TYPE);
+        self::assertSame('var', $tag->variable);
+        self::assertFalse($tag->isOutput);
+        self::assertTrue($tag->isVariadic);
+        self::assertNull($tag->description);
+    }
+
+    public function testWithVariadicVariableAndDescription(): void
+    {
+        $tag = $this->parseTag('@param ...$var description');
+
+        self::assertInstanceOf(ParamTag::class, $tag);
+        self::assertNull($tag->type);
+        self::assertSame('var', $tag->variable);
+        self::assertFalse($tag->isOutput);
+        self::assertTrue($tag->isVariadic);
+        self::assertEquals(new Description('description'), $tag->description);
+    }
+
+    public function testWithTypeAndVariadicVariableAndDescription(): void
+    {
+        $tag = $this->parseTag('@param type ...$var description');
+
+        self::assertInstanceOf(ParamTag::class, $tag);
+        self::assertNotNull($tag->type);
+        self::assertTypeStatementSame($tag->type, <<<'TYPE'
+            Stmt\NamedTypeNode
+              Name(type)
+                Identifier(type)
+            TYPE);
+        self::assertSame('var', $tag->variable);
+        self::assertFalse($tag->isOutput);
+        self::assertTrue($tag->isVariadic);
+        self::assertEquals(new Description('description'), $tag->description);
+    }
+
+    public function testWithOutputVariable(): void
+    {
+        $tag = $this->parseTag('@param &$var');
+
+        self::assertInstanceOf(ParamTag::class, $tag);
+        self::assertNull($tag->type);
+        self::assertSame('var', $tag->variable);
+        self::assertTrue($tag->isOutput);
+        self::assertFalse($tag->isVariadic);
+        self::assertNull($tag->description);
+    }
+
+    public function testWithTypeAndOutputVariable(): void
+    {
+        $tag = $this->parseTag('@param type &$var');
+
+        self::assertInstanceOf(ParamTag::class, $tag);
+        self::assertNotNull($tag->type);
+        self::assertTypeStatementSame($tag->type, <<<'TYPE'
+            Stmt\NamedTypeNode
+              Name(type)
+                Identifier(type)
+            TYPE);
+        self::assertSame('var', $tag->variable);
+        self::assertTrue($tag->isOutput);
+        self::assertFalse($tag->isVariadic);
+        self::assertNull($tag->description);
+    }
+
+    public function testWithOutputVariableAndDescription(): void
+    {
+        $tag = $this->parseTag('@param &$var description');
+
+        self::assertInstanceOf(ParamTag::class, $tag);
+        self::assertNull($tag->type);
+        self::assertSame('var', $tag->variable);
+        self::assertTrue($tag->isOutput);
+        self::assertFalse($tag->isVariadic);
+        self::assertEquals(new Description('description'), $tag->description);
+    }
+
+    public function testWithTypeAndOutputVariableAndDescription(): void
+    {
+        $tag = $this->parseTag('@param type &$var description');
+
+        self::assertInstanceOf(ParamTag::class, $tag);
+        self::assertNotNull($tag->type);
+        self::assertTypeStatementSame($tag->type, <<<'TYPE'
+            Stmt\NamedTypeNode
+              Name(type)
+                Identifier(type)
+            TYPE);
+        self::assertSame('var', $tag->variable);
+        self::assertTrue($tag->isOutput);
+        self::assertFalse($tag->isVariadic);
+        self::assertEquals(new Description('description'), $tag->description);
+    }
+
+    public function testWithOutputVariadicVariable(): void
+    {
+        $tag = $this->parseTag('@param &...$var');
+
+        self::assertInstanceOf(ParamTag::class, $tag);
+        self::assertNull($tag->type);
+        self::assertSame('var', $tag->variable);
+        self::assertTrue($tag->isOutput);
+        self::assertTrue($tag->isVariadic);
+        self::assertNull($tag->description);
+    }
+
+    public function testWithTypeAndOutputVariadicVariable(): void
+    {
+        $tag = $this->parseTag('@param type &...$var');
+
+        self::assertInstanceOf(ParamTag::class, $tag);
+        self::assertNotNull($tag->type);
+        self::assertTypeStatementSame($tag->type, <<<'TYPE'
+            Stmt\NamedTypeNode
+              Name(type)
+                Identifier(type)
+            TYPE);
+        self::assertSame('var', $tag->variable);
+        self::assertTrue($tag->isOutput);
+        self::assertTrue($tag->isVariadic);
+        self::assertNull($tag->description);
+    }
+
+    public function testWithOutputVariadicVariableAndDescription(): void
+    {
+        $tag = $this->parseTag('@param &...$var description');
+
+        self::assertInstanceOf(ParamTag::class, $tag);
+        self::assertNull($tag->type);
+        self::assertSame('var', $tag->variable);
+        self::assertTrue($tag->isOutput);
+        self::assertTrue($tag->isVariadic);
+        self::assertEquals(new Description('description'), $tag->description);
+    }
+
+    public function testWithTypeAndOutputVariadicVariableAndDescription(): void
+    {
+        $tag = $this->parseTag('@param type &...$var description');
+
+        self::assertInstanceOf(ParamTag::class, $tag);
+        self::assertNotNull($tag->type);
+        self::assertTypeStatementSame($tag->type, <<<'TYPE'
+            Stmt\NamedTypeNode
+              Name(type)
+                Identifier(type)
+            TYPE);
+        self::assertSame('var', $tag->variable);
+        self::assertTrue($tag->isOutput);
+        self::assertTrue($tag->isVariadic);
+        self::assertEquals(new Description('description'), $tag->description);
+    }
+}
diff --git a/tests/Functional/Tag/TagTestCase.php b/tests/Functional/Tag/TagTestCase.php
new file mode 100644
index 0000000..862adf1
--- /dev/null
+++ b/tests/Functional/Tag/TagTestCase.php
@@ -0,0 +1,23 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Functional\Tag;
+
+use TypeLang\PHPDoc\DocBlock\Tag\TagInterface;
+use TypeLang\PHPDoc\Parser;
+use TypeLang\PHPDoc\Tests\Unit\TestCase;
+
+abstract class TagTestCase extends TestCase
+{
+    protected function parseTag(string $docblock): TagInterface
+    {
+        $parser = new Parser();
+
+        foreach ($parser->parse($docblock) as $tag) {
+            return $tag;
+        }
+
+        self::fail(\sprintf('The "%s" docblock does not contain any tags', $docblock));
+    }
+}
diff --git a/tests/Functional/Tag/VarTagTest.php b/tests/Functional/Tag/VarTagTest.php
new file mode 100644
index 0000000..4c65c71
--- /dev/null
+++ b/tests/Functional/Tag/VarTagTest.php
@@ -0,0 +1,88 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Functional\Tag;
+
+use TypeLang\PHPDoc\DocBlock\Description\Description;
+use TypeLang\PHPDoc\DocBlock\Tag\InvalidTag;
+use TypeLang\PHPDoc\DocBlock\Tag\VarTag\VarTag;
+
+final class VarTagTest extends TagTestCase
+{
+    public function testEmptyTag(): void
+    {
+        $tag = $this->parseTag('@var');
+
+        self::assertInstanceOf(InvalidTag::class, $tag);
+        self::assertSame('Tag @var expects the type to be defined', $tag->reason->getMessage());
+        self::assertNull($tag->description);
+    }
+
+    public function testTagWithInvalidType(): void
+    {
+        $tag = $this->parseTag('@var <example>');
+
+        self::assertInstanceOf(InvalidTag::class, $tag);
+        self::assertSame('Tag @var contains an incorrect type "<example>"', $tag->reason->getMessage());
+        self::assertEquals(new Description('<example>'), $tag->description);
+    }
+
+    public function testWithType(): void
+    {
+        $tag = $this->parseTag('@var Link\To\Type');
+
+        self::assertInstanceOf(VarTag::class, $tag);
+        self::assertNull($tag->variable);
+        self::assertNull($tag->description);
+        self::assertTypeStatementSame($tag->type, <<<'TYPE'
+            Stmt\NamedTypeNode
+              Name(Link\To\Type)
+                Identifier(Link)
+                Identifier(To)
+                Identifier(Type)
+            TYPE);
+    }
+
+    public function testWithTypeAndDescription(): void
+    {
+        $tag = $this->parseTag('@var type description');
+
+        self::assertInstanceOf(VarTag::class, $tag);
+        self::assertNull($tag->variable);
+        self::assertEquals(new Description('description'), $tag->description);
+        self::assertTypeStatementSame($tag->type, <<<'TYPE'
+            Stmt\NamedTypeNode
+              Name(type)
+                Identifier(type)
+            TYPE);
+    }
+
+    public function testWithTypeAndVariable(): void
+    {
+        $tag = $this->parseTag('@var type $var');
+
+        self::assertInstanceOf(VarTag::class, $tag);
+        self::assertSame('var', $tag->variable);
+        self::assertNull($tag->description);
+        self::assertTypeStatementSame($tag->type, <<<'TYPE'
+            Stmt\NamedTypeNode
+              Name(type)
+                Identifier(type)
+            TYPE);
+    }
+
+    public function testWithTypeAndVariableAndDescription(): void
+    {
+        $tag = $this->parseTag('@var type $var description');
+
+        self::assertInstanceOf(VarTag::class, $tag);
+        self::assertSame('var', $tag->variable);
+        self::assertEquals(new Description('description'), $tag->description);
+        self::assertTypeStatementSame($tag->type, <<<'TYPE'
+            Stmt\NamedTypeNode
+              Name(type)
+                Identifier(type)
+            TYPE);
+    }
+}
diff --git a/tests/Functional/TestCase.php b/tests/Functional/TestCase.php
index 35484b6..58deb93 100644
--- a/tests/Functional/TestCase.php
+++ b/tests/Functional/TestCase.php
@@ -4,8 +4,6 @@
 
 namespace TypeLang\PHPDoc\Tests\Functional;
 
-use PHPUnit\Framework\Attributes\Group;
-use TypeLang\PHPDoc\Tests\TestCase as BaseTestCase;
+use PHPUnit\Framework\TestCase as BaseTestCase;
 
-#[Group('functional'), Group('type-lang/phpdoc')]
 abstract class TestCase extends BaseTestCase {}
diff --git a/tests/TestCase.php b/tests/TestCase.php
deleted file mode 100644
index 85db4bc..0000000
--- a/tests/TestCase.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tests;
-
-use PHPUnit\Framework\Attributes\Group;
-use PHPUnit\Framework\TestCase as BaseTestCase;
-
-#[Group('type-lang/phpdoc')]
-abstract class TestCase extends BaseTestCase {}
diff --git a/tests/Unit/CommentParserTest.php b/tests/Unit/CommentParserTest.php
deleted file mode 100644
index d7576eb..0000000
--- a/tests/Unit/CommentParserTest.php
+++ /dev/null
@@ -1,168 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tests\Unit;
-
-use PHPUnit\Framework\Attributes\DataProvider;
-use PHPUnit\Framework\Attributes\Group;
-use TypeLang\PHPDoc\Parser\Comment\CommentParserInterface;
-use TypeLang\PHPDoc\Parser\Comment\RegexCommentParser;
-
-#[Group('unit'), Group('type-lang/phpdoc')]
-final class CommentParserTest extends TestCase
-{
-    public static function parserDataProvider(): iterable
-    {
-        yield RegexCommentParser::class => [new RegexCommentParser()];
-    }
-
-    public static function delimiterDataProvider(): array
-    {
-        return [
-            'LF' => ["\n"],
-            'CRLF' => ["\r\n"],
-        ];
-    }
-
-    public static function parserWithVariantDelimitersDataProvider(): iterable
-    {
-        foreach (self::parserDataProvider() as $parserName => [$provider]) {
-            $parserName = (new \ReflectionClass($provider))
-                ->getShortName();
-
-            foreach (self::delimiterDataProvider() as $delimiterName => [$delimiter]) {
-                yield \basename($parserName) . ' + ' . $delimiterName => [$provider, $delimiter];
-            }
-        }
-    }
-
-    private function convertLineDelimiter(string $docblock, string $delimiter = "\r\n"): string
-    {
-        return \implode($delimiter, \explode("\n", $docblock));
-    }
-
-    private function parseAsArray(CommentParserInterface $parser, string $docblock, string $delimiter = "\n"): array
-    {
-        if ($delimiter !== "\n") {
-            $docblock = $this->convertLineDelimiter($docblock, $delimiter);
-        }
-
-        $result = [];
-
-        foreach ($parser->parse($docblock) as $segment) {
-            $result[$segment->offset] = $segment->text;
-        }
-
-        return $result;
-    }
-
-    #[DataProvider('parserWithVariantDelimitersDataProvider')]
-    public function testWrappedComment(CommentParserInterface $parser, string $delimiter): void
-    {
-        $docBlock = <<<'PHP'
-            /**
-             * Line 1
-             * Line 2
-             */
-            PHP;
-
-        self::assertSame(match($delimiter) {
-            "\n" => [7 => "Line 1$delimiter", 17 => "Line 2$delimiter"],
-            "\r\n" => [8 => "Line 1$delimiter", 19 => "Line 2$delimiter"],
-        }, $this->parseAsArray($parser, $docBlock, $delimiter));
-    }
-
-    #[DataProvider('parserWithVariantDelimitersDataProvider')]
-    public function testIncompleteEndingWrappedComment(CommentParserInterface $parser, string $delimiter): void
-    {
-        $docBlock = <<<'PHP'
-            /**
-             * Line 1
-             *
-             * Line 3
-            PHP;
-
-        self::assertSame(match($delimiter) {
-            "\n" => [7 => "Line 1$delimiter", 20 => "Line 3"],
-            "\r\n" => [8 => "Line 1$delimiter", 23 => "Line 3"],
-        }, $this->parseAsArray($parser, $docBlock, $delimiter));
-    }
-
-    #[DataProvider('parserWithVariantDelimitersDataProvider')]
-    public function testIncompleteStartingWrappedComment(CommentParserInterface $parser, string $delimiter): void
-    {
-        $docBlock = <<<'PHP'
-             * Line 1
-             *
-             * Line 3
-             */
-            PHP;
-
-        self::assertSame(
-            expected: [0 => $this->convertLineDelimiter($docBlock, $delimiter)],
-            actual: $this->parseAsArray($parser, $docBlock, $delimiter),
-        );
-    }
-
-    #[DataProvider('parserWithVariantDelimitersDataProvider')]
-    public function testExtraNonWhitespaceCharsBeforeWrappedComment(CommentParserInterface $parser, string $delimiter): void
-    {
-        $docBlock = <<<'PHP'
-            Some unrecognized chars
-            /**
-             * Line 1
-             *
-             * Line 3
-             */
-            PHP;
-
-        self::assertSame(
-            expected: [0 => $this->convertLineDelimiter($docBlock, $delimiter)],
-            actual: $this->parseAsArray($parser, $docBlock, $delimiter),
-        );
-    }
-
-    #[DataProvider('parserWithVariantDelimitersDataProvider')]
-    public function testExtraWhitespaceCharsBeforeWrappedComment(CommentParserInterface $parser, string $delimiter): void
-    {
-        $docBlock = <<<PHP
-            \u{0020}\u{000A}
-            /**
-             * Line 1
-             * Line 2
-             */
-            PHP;
-
-        self::assertSame(match($delimiter) {
-            "\n" => [10 => "Line 1$delimiter", 20 => "Line 2$delimiter"],
-            "\r\n" => [13 => "Line 1$delimiter", 24 => "Line 2$delimiter"],
-        }, $this->parseAsArray($parser, $docBlock, $delimiter));
-    }
-
-    #[DataProvider('parserWithVariantDelimitersDataProvider')]
-    public function testNonWrappedComment(CommentParserInterface $parser, string $delimiter): void
-    {
-        $docBlock = <<<'PHP'
-            Example some
-            @phpdoc test
-            any test
-            @return void Description
-            PHP;
-
-        self::assertSame(
-            expected: [0 => $this->convertLineDelimiter($docBlock, $delimiter)],
-            actual: $this->parseAsArray($parser, $docBlock, $delimiter),
-        );
-    }
-
-    #[DataProvider('parserWithVariantDelimitersDataProvider')]
-    public function testEmptyComment(CommentParserInterface $parser, string $delimiter): void
-    {
-        self::assertSame([0 => ''], $this->parseAsArray(
-            parser: $parser,
-            docblock: '',
-            delimiter: $delimiter,
-        ));
-    }
-}
diff --git a/tests/Unit/DescriptionParserTest.php b/tests/Unit/DescriptionParserTest.php
deleted file mode 100644
index dcda3a9..0000000
--- a/tests/Unit/DescriptionParserTest.php
+++ /dev/null
@@ -1,151 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace TypeLang\PHPDoc\Tests\Unit;
-
-use PHPUnit\Framework\Attributes\DataProvider;
-use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
-use TypeLang\PHPDoc\Parser\Description\RegexDescriptionParser;
-use TypeLang\PHPDoc\Parser\Tag\RegexTagParser;
-use TypeLang\PHPDoc\Tag\Content;
-use TypeLang\PHPDoc\Tag\Description\Description;
-use TypeLang\PHPDoc\Tag\Description\TaggedDescription;
-use TypeLang\PHPDoc\Tag\Description\TaggedDescriptionInterface;
-use TypeLang\PHPDoc\Tag\Factory\FactoryInterface;
-use TypeLang\PHPDoc\Tag\Factory\TagFactory;
-use TypeLang\PHPDoc\Tag\InvalidTag;
-use TypeLang\PHPDoc\Tag\Tag;
-use TypeLang\PHPDoc\Tag\TagInterface;
-
-final class DescriptionParserTest extends TestCase
-{
-    public static function parserDataProvider(): iterable
-    {
-        $tags = new TagFactory([
-            'error' => new class implements FactoryInterface {
-                public function create(string $name, Content $content, DescriptionParserInterface $descriptions): TagInterface
-                {
-                    throw new \LogicException('Error tag ' . $name);
-                }
-            },
-        ]);
-
-        yield RegexDescriptionParser::class => [new RegexDescriptionParser(
-            tags: new RegexTagParser($tags),
-        )];
-    }
-
-    #[DataProvider('parserDataProvider')]
-    public function testSimpleDescription(DescriptionParserInterface $parser): void
-    {
-        self::assertEquals(
-            expected: new Description('Hello World!'),
-            actual: $parser->parse('Hello World!'),
-        );
-    }
-
-    #[DataProvider('parserDataProvider')]
-    public function testDescriptionWithInlineTag(DescriptionParserInterface $parser): void
-    {
-        self::assertEquals(
-            expected: new TaggedDescription([
-                new Description('Hello '),
-                new Tag('tag'),
-                new Description(' World!'),
-            ]),
-            actual: $parser->parse('Hello {@tag} World!'),
-        );
-    }
-
-    #[DataProvider('parserDataProvider')]
-    public function testDescriptionWithDescribedInlineTag(DescriptionParserInterface $parser): void
-    {
-        self::assertEquals(
-            expected: new TaggedDescription([
-                new Description('Hello '),
-                new Tag('tag', 'description'),
-                new Description(' World!'),
-            ]),
-            actual: $parser->parse('Hello {@tag description} World!'),
-        );
-    }
-
-    #[DataProvider('parserDataProvider')]
-    public function testDescriptionWithMultipleInlineTags(DescriptionParserInterface $parser): void
-    {
-        self::assertEquals(
-            expected: new TaggedDescription([
-                new Description('Hello '),
-                new Tag('tag1'),
-                new Description(' '),
-                new Tag('tag2', '#desc'),
-                new Description(' World!'),
-            ]),
-            actual: $parser->parse('Hello {@tag1} {@tag2#desc} World!'),
-        );
-    }
-
-    #[DataProvider('parserDataProvider')]
-    public function testDescriptionWithSprintfSyntax(DescriptionParserInterface $parser): void
-    {
-        self::assertEquals(
-            expected: new Description('Hello %s World!'),
-            actual: $parser->parse('Hello %s World!'),
-        );
-    }
-
-    #[DataProvider('parserDataProvider')]
-    public function testDescriptionWithSprintfSyntaxInsideInlineTag(DescriptionParserInterface $parser): void
-    {
-        self::assertEquals(
-            expected: new TaggedDescription([
-                new Description('Hello '),
-                new Tag('test-some', 'Desc %s 42'),
-                new Description(' World!'),
-            ]),
-            actual: $parser->parse('Hello {@test-some Desc %s 42} World!'),
-        );
-    }
-
-    #[DataProvider('parserDataProvider')]
-    public function testDescriptionWithNonNamedTag(DescriptionParserInterface $parser): void
-    {
-        self::assertEquals(
-            expected: new Description('Hello {@} World!'),
-            actual: $parser->parse('Hello {@} World!'),
-        );
-    }
-
-    #[DataProvider('parserDataProvider')]
-    public function testDescriptionWithBadTagName(DescriptionParserInterface $parser): void
-    {
-        $description = $parser->parse('Hello {@@} World!');
-
-        self::assertInstanceOf(TaggedDescriptionInterface::class, $description);
-        self::assertCount(3, $description);
-        self::assertInstanceOf(InvalidTag::class, $description[1]);
-
-        $reason = $description[1]->getReason();
-
-        self::assertSame('Tag name cannot be empty', $reason->getMessage());
-        self::assertSame(InvalidTag::DEFAULT_UNKNOWN_TAG_NAME, $description[1]->getName());
-        self::assertEquals(new Description('{@}'), $description[1]->getDescription());
-    }
-
-    #[DataProvider('parserDataProvider')]
-    public function testErrorWhileParsingInline(DescriptionParserInterface $parser): void
-    {
-        $description = $parser->parse('Hello {@error description} World!');
-
-        self::assertInstanceOf(TaggedDescriptionInterface::class, $description);
-        self::assertCount(3, $description);
-        self::assertInstanceOf(InvalidTag::class, $description[1]);
-
-        $reason = $description[1]->getReason();
-
-        self::assertSame('Error while parsing tag @error', $reason->getMessage());
-        self::assertSame('error', $description[1]->getName());
-        self::assertEquals(new Description('description'), $description[1]->getDescription());
-    }
-}
diff --git a/tests/Unit/Parser/Comment/CommentParserTestCase.php b/tests/Unit/Parser/Comment/CommentParserTestCase.php
new file mode 100644
index 0000000..23c7716
--- /dev/null
+++ b/tests/Unit/Parser/Comment/CommentParserTestCase.php
@@ -0,0 +1,161 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Unit\Parser\Comment;
+
+use PHPUnit\Framework\Attributes\DataProvider;
+use TypeLang\PHPDoc\Parser\Comment\CommentParserInterface;
+use TypeLang\PHPDoc\Tests\Unit\Parser\ParserTestCase;
+
+abstract class CommentParserTestCase extends ParserTestCase
+{
+    abstract public static function getCommentParser(): CommentParserInterface;
+
+    public static function delimiterDataProvider(): array
+    {
+        return [
+            'LF' => ["\n"],
+            'CRLF' => ["\r\n"],
+        ];
+    }
+
+    private function convertLineDelimiter(string $docblock, string $delimiter = "\r\n"): string
+    {
+        return \implode($delimiter, \explode("\n", $docblock));
+    }
+
+    private function parseAsArray(string $docblock, string $delimiter = "\n"): array
+    {
+        if ($delimiter !== "\n") {
+            $docblock = $this->convertLineDelimiter($docblock, $delimiter);
+        }
+
+        $result = [];
+
+        $parser = static::getCommentParser();
+
+        foreach ($parser->parse($docblock) as $segment) {
+            $result[$segment->offset] = $segment->text;
+        }
+
+        return $result;
+    }
+
+    #[DataProvider('delimiterDataProvider')]
+    public function testWrappedComment(string $delimiter): void
+    {
+        $docBlock = <<<'PHP'
+            /**
+             * Line 1
+             * Line 2
+             */
+            PHP;
+
+        self::assertSame(
+            match ($delimiter) {
+                "\n" => [7 => "Line 1$delimiter", 17 => "Line 2$delimiter"],
+                "\r\n" => [8 => "Line 1$delimiter", 19 => "Line 2$delimiter"],
+            },
+            $this->parseAsArray($docBlock, $delimiter)
+        );
+    }
+
+    #[DataProvider('delimiterDataProvider')]
+    public function testIncompleteEndingWrappedComment(string $delimiter): void
+    {
+        $docBlock = <<<'PHP'
+            /**
+             * Line 1
+             *
+             * Line 3
+            PHP;
+
+        self::assertSame(
+            match ($delimiter) {
+                "\n" => [7 => "Line 1$delimiter", 20 => 'Line 3'],
+                "\r\n" => [8 => "Line 1$delimiter", 23 => 'Line 3'],
+            },
+            $this->parseAsArray($docBlock, $delimiter)
+        );
+    }
+
+    #[DataProvider('delimiterDataProvider')]
+    public function testIncompleteStartingWrappedComment(string $delimiter): void
+    {
+        $docBlock = <<<'PHP'
+             * Line 1
+             *
+             * Line 3
+             */
+            PHP;
+
+        self::assertSame(
+            expected: [0 => $this->convertLineDelimiter($docBlock, $delimiter)],
+            actual: $this->parseAsArray($docBlock, $delimiter),
+        );
+    }
+
+    #[DataProvider('delimiterDataProvider')]
+    public function testExtraNonWhitespaceCharsBeforeWrappedComment(string $delimiter): void
+    {
+        $docBlock = <<<'PHP'
+            Some unrecognized chars
+            /**
+             * Line 1
+             *
+             * Line 3
+             */
+            PHP;
+
+        self::assertSame(
+            expected: [0 => $this->convertLineDelimiter($docBlock, $delimiter)],
+            actual: $this->parseAsArray($docBlock, $delimiter),
+        );
+    }
+
+    #[DataProvider('delimiterDataProvider')]
+    public function testExtraWhitespaceCharsBeforeWrappedComment(string $delimiter): void
+    {
+        $docBlock = <<<PHP
+            \u{0020}\u{000A}
+            /**
+             * Line 1
+             * Line 2
+             */
+            PHP;
+
+        self::assertSame(
+            match ($delimiter) {
+                "\n" => [10 => "Line 1$delimiter", 20 => "Line 2$delimiter"],
+                "\r\n" => [13 => "Line 1$delimiter", 24 => "Line 2$delimiter"],
+            },
+            $this->parseAsArray($docBlock, $delimiter)
+        );
+    }
+
+    #[DataProvider('delimiterDataProvider')]
+    public function testNonWrappedComment(string $delimiter): void
+    {
+        $docBlock = <<<'PHP'
+            Example some
+            @phpdoc test
+            any test
+            @return void Description
+            PHP;
+
+        self::assertSame(
+            expected: [0 => $this->convertLineDelimiter($docBlock, $delimiter)],
+            actual: $this->parseAsArray($docBlock, $delimiter),
+        );
+    }
+
+    #[DataProvider('delimiterDataProvider')]
+    public function testEmptyComment(string $delimiter): void
+    {
+        self::assertSame([0 => ''], $this->parseAsArray(
+            docblock: '',
+            delimiter: $delimiter,
+        ));
+    }
+}
diff --git a/tests/Unit/Parser/Comment/RegexCommentParserTest.php b/tests/Unit/Parser/Comment/RegexCommentParserTest.php
new file mode 100644
index 0000000..8a19800
--- /dev/null
+++ b/tests/Unit/Parser/Comment/RegexCommentParserTest.php
@@ -0,0 +1,16 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Unit\Parser\Comment;
+
+use TypeLang\PHPDoc\Parser\Comment\CommentParserInterface;
+use TypeLang\PHPDoc\Parser\Comment\RegexCommentParser;
+
+final class RegexCommentParserTest extends CommentParserTestCase
+{
+    public static function getCommentParser(): CommentParserInterface
+    {
+        return new RegexCommentParser();
+    }
+}
diff --git a/tests/Unit/Parser/Description/DescriptionParserTest.php b/tests/Unit/Parser/Description/DescriptionParserTest.php
new file mode 100644
index 0000000..a57e4b3
--- /dev/null
+++ b/tests/Unit/Parser/Description/DescriptionParserTest.php
@@ -0,0 +1,17 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Unit\Parser\Description;
+
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+use TypeLang\PHPDoc\Parser\Description\RegexDescriptionParser;
+use TypeLang\PHPDoc\Parser\Tag\TagParserInterface;
+
+final class DescriptionParserTest extends DescriptionParserTestCase
+{
+    public static function getDescriptionParser(TagParserInterface $tags): DescriptionParserInterface
+    {
+        return new RegexDescriptionParser($tags);
+    }
+}
diff --git a/tests/Unit/Parser/Description/DescriptionParserTestCase.php b/tests/Unit/Parser/Description/DescriptionParserTestCase.php
new file mode 100644
index 0000000..480106c
--- /dev/null
+++ b/tests/Unit/Parser/Description/DescriptionParserTestCase.php
@@ -0,0 +1,168 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Unit\Parser\Description;
+
+use PHPUnit\Framework\Attributes\DataProvider;
+use TypeLang\PHPDoc\DocBlock\Description\Description;
+use TypeLang\PHPDoc\DocBlock\Description\TaggedDescription;
+use TypeLang\PHPDoc\DocBlock\Description\TaggedDescriptionInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactory;
+use TypeLang\PHPDoc\DocBlock\Tag\Factory\TagFactoryInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\InvalidTag;
+use TypeLang\PHPDoc\DocBlock\Tag\InvalidTagInterface;
+use TypeLang\PHPDoc\DocBlock\Tag\Tag;
+use TypeLang\PHPDoc\DocBlock\Tag\TagInterface;
+use TypeLang\PHPDoc\Parser\Description\DescriptionParserInterface;
+use TypeLang\PHPDoc\Parser\Tag\RegexTagParser;
+use TypeLang\PHPDoc\Parser\Tag\TagParserInterface;
+use TypeLang\PHPDoc\Tests\Unit\Parser\ParserTestCase;
+
+abstract class DescriptionParserTestCase extends ParserTestCase
+{
+    abstract public static function getDescriptionParser(TagParserInterface $tags): DescriptionParserInterface;
+
+    protected static function getParser(): DescriptionParserInterface
+    {
+        $tags = new TagFactory([
+            'error' => new class implements TagFactoryInterface {
+                public function create(
+                    string $tag,
+                    string $content,
+                    DescriptionParserInterface $descriptions,
+                ): TagInterface {
+                    throw new \LogicException('Error tag ' . $tag);
+                }
+            },
+        ]);
+
+        return static::getDescriptionParser(
+            tags: new RegexTagParser($tags),
+        );
+    }
+
+    public function testSimpleDescription(): void
+    {
+        $parser = static::getParser();
+
+        self::assertEquals(
+            expected: new Description('Hello World!'),
+            actual: $parser->parse('Hello World!'),
+        );
+    }
+
+    public function testDescriptionWithInlineTag(): void
+    {
+        $parser = static::getParser();
+
+        self::assertEquals(
+            expected: new TaggedDescription([
+                new Description('Hello '),
+                new Tag('tag'),
+                new Description(' World!'),
+            ]),
+            actual: $parser->parse('Hello {@tag} World!'),
+        );
+    }
+
+    public function testDescriptionWithDescribedInlineTag(): void
+    {
+        $parser = static::getParser();
+
+        self::assertEquals(
+            expected: new TaggedDescription([
+                new Description('Hello '),
+                new Tag('tag', 'description'),
+                new Description(' World!'),
+            ]),
+            actual: $parser->parse('Hello {@tag description} World!'),
+        );
+    }
+
+    public function testDescriptionWithMultipleInlineTags(): void
+    {
+        $parser = static::getParser();
+
+        self::assertEquals(
+            expected: new TaggedDescription([
+                new Description('Hello '),
+                new Tag('tag1'),
+                new Description(' '),
+                new Tag('tag2', '#desc'),
+                new Description(' World!'),
+            ]),
+            actual: $parser->parse('Hello {@tag1} {@tag2#desc} World!'),
+        );
+    }
+
+    public function testDescriptionWithSprintfSyntax(): void
+    {
+        $parser = static::getParser();
+
+        self::assertEquals(
+            expected: new Description('Hello %s World!'),
+            actual: $parser->parse('Hello %s World!'),
+        );
+    }
+
+    public function testDescriptionWithSprintfSyntaxInsideInlineTag(): void
+    {
+        $parser = static::getParser();
+
+        self::assertEquals(
+            expected: new TaggedDescription([
+                new Description('Hello '),
+                new Tag('test-some', 'Desc %s 42'),
+                new Description(' World!'),
+            ]),
+            actual: $parser->parse('Hello {@test-some Desc %s 42} World!'),
+        );
+    }
+
+    public function testDescriptionWithNonNamedTag(): void
+    {
+        $parser = static::getParser();
+
+        self::assertEquals(
+            expected: new Description('Hello {@} World!'),
+            actual: $parser->parse('Hello {@} World!'),
+        );
+    }
+
+    public function testDescriptionWithBadTagName(): void
+    {
+        $parser = static::getParser();
+
+        $description = $parser->parse('Hello {@@} World!');
+
+        self::assertInstanceOf(TaggedDescriptionInterface::class, $description);
+        self::assertCount(3, $description->components);
+        self::assertCount(1, $description);
+        self::assertInstanceOf(InvalidTagInterface::class, $description[0]);
+
+        $reason = $description[0]->reason;
+
+        self::assertSame('Tag name cannot be empty', $reason->getMessage());
+        self::assertSame('unknown', $description[0]->name);
+        self::assertEquals(new Description('@@'), $description[0]->description);
+    }
+
+    public function testErrorWhileParsingInline(): void
+    {
+        $parser = static::getParser();
+
+        $description = $parser->parse('Hello {@error description} World!');
+
+        self::assertInstanceOf(TaggedDescriptionInterface::class, $description);
+        self::assertCount(3, $description->components);
+        self::assertCount(1, $description);
+        self::assertInstanceOf(InvalidTag::class, $description[0]);
+
+        $reason = $description[0]->reason;
+
+        self::assertSame('Error while parsing tag @error', $reason->getMessage());
+        self::assertSame('error', $description[0]->name);
+        self::assertEquals(new Description('description'), $description[0]->description);
+    }
+}
diff --git a/tests/Unit/Parser/ParserTestCase.php b/tests/Unit/Parser/ParserTestCase.php
new file mode 100644
index 0000000..0108958
--- /dev/null
+++ b/tests/Unit/Parser/ParserTestCase.php
@@ -0,0 +1,9 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TypeLang\PHPDoc\Tests\Unit\Parser;
+
+use TypeLang\PHPDoc\Tests\Unit\TestCase;
+
+abstract class ParserTestCase extends TestCase {}
diff --git a/tests/Unit/TestCase.php b/tests/Unit/TestCase.php
index be858d0..23ccf2b 100644
--- a/tests/Unit/TestCase.php
+++ b/tests/Unit/TestCase.php
@@ -4,8 +4,57 @@
 
 namespace TypeLang\PHPDoc\Tests\Unit;
 
-use PHPUnit\Framework\Attributes\Group;
-use TypeLang\PHPDoc\Tests\TestCase as BaseTestCase;
+use PHPUnit\Framework\Assert;
+use PHPUnit\Framework\TestCase as BaseTestCase;
+use TypeLang\Parser\Node\Node;
+use TypeLang\Parser\Node\Stmt\TypeStatement;
+use TypeLang\Parser\Traverser;
 
-#[Group('unit'), Group('type-lang/phpdoc')]
-abstract class TestCase extends BaseTestCase {}
+abstract class TestCase extends BaseTestCase
+{
+    /**
+     * @api
+     * @param Node|list<Node> $node
+     * @throws \JsonException
+     */
+    protected static function getTypeStatementAsArray(Node|array $node): array
+    {
+        $json = \json_encode($node);
+
+        return \json_decode($json, true, flags: \JSON_THROW_ON_ERROR);
+    }
+
+    /**
+     * @api
+     * @param Node|list<Node> $node
+     */
+    protected static function getTypeStatementAsString(Node|array $node): ?string
+    {
+        Traverser::new([$visitor = new Traverser\StringDumperVisitor()])
+            ->traverse(\is_array($node) ? $node : [$node]);
+
+        return \trim($visitor->getOutput());
+    }
+
+    /**
+     * @api
+     * @param Node|list<Node> $node
+     */
+    protected static function assertTypeStatementSame(Node|array $node, string $expected, string $message = ''): void
+    {
+        $actual = \trim(static::getTypeStatementAsString($node));
+
+        Assert::assertSame(\trim($expected), $actual, $message);
+    }
+
+    /**
+     * @api
+     * @param Node|list<Node> $node
+     */
+    protected static function assertTypeStatementNotSame(Node|array $node, string $expected, string $message = ''): void
+    {
+        $actual = \trim(static::getTypeStatementAsString($node));
+
+        Assert::assertNotSame(\trim($expected), $actual, $message);
+    }
+}
